From 084a8161d4ded1056ab71ba50b412030a4732e80 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 28 Apr 2020 18:24:52 +0200 Subject: [PATCH 001/632] coverity fix: 279106 --- client/src/cmdhfmfdes.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index 65b02b5f8..11f93ec95 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -3081,13 +3081,25 @@ static void DecodeAccessRights(uint16_t accrights) { if (car == NULL) return; char *rwa = DecodeAccessValue(read_write_access); - if (rwa == NULL) return; + if (rwa == NULL) { + free(car); + return; + } char *wa = DecodeAccessValue(write_access); - if (wa == NULL) return; + if (wa == NULL) { + free(car); + free(rwa); + return; + } char *ra = DecodeAccessValue(read_access); - if (ra == NULL) return; + if (ra == NULL) { + free(car); + free(rwa); + free(wa); + return; + } PrintAndLogEx(INFO, " Access Rights: 0x%04X - Change %s - RW %s - W %s - R %s", accrights, car, rwa, wa, ra); free(car); From 12f87938ea80f7d478ea46dd69b903f0ffb7ac9c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 28 Apr 2020 18:51:24 +0200 Subject: [PATCH 002/632] coverity fix 279110 --- client/src/cmdhfmfdes.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index 11f93ec95..90d5df814 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -1824,15 +1824,15 @@ static int CmdHF14ADesCreateApp(const char *Cmd) { uint8_t aid[3] = {0}; uint8_t fid[2] = {0}; uint8_t name[16] = {0}; - uint8_t keysetting1 = 0; - uint8_t keysetting2 = 0; + uint8_t keysetting1[1] = {0}; + uint8_t keysetting2[1] = {0}; int keylen1 = 1; int keylen2 = 1; int namelen = 16; CLIGetHexWithReturn(1, aid, &aidlength); CLIGetHexWithReturn(2, fid, &fidlength); - CLIGetHexWithReturn(3, &keysetting1, &keylen1); - CLIGetHexWithReturn(4, &keysetting2, &keylen2); + CLIGetHexWithReturn(3, keysetting1, &keylen1); + CLIGetHexWithReturn(4, keysetting2, &keylen2); CLIGetStrWithReturn(5, name, &namelen); CLIParserFree(); @@ -1882,8 +1882,8 @@ static int CmdHF14ADesCreateApp(const char *Cmd) { aidhdr_t aidhdr; memcpy(aidhdr.aid, aid, sizeof(aid)); - aidhdr.keysetting1 = keysetting1; - aidhdr.keysetting2 = keysetting2; + aidhdr.keysetting1 = keysetting1[0]; + aidhdr.keysetting2 = keysetting2[0]; if (usefid) memcpy(aidhdr.fid, fid, sizeof(fid)); From 857526a945a50040815543ef010fdc33dfa6448a Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 28 Apr 2020 19:08:07 +0200 Subject: [PATCH 003/632] coverity fix 286651 --- client/src/cmdhfmfdes.c | 85 +++++++++++++++++++++++++++++------------ 1 file changed, 60 insertions(+), 25 deletions(-) diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index 90d5df814..5ec08a1c3 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -3584,16 +3584,22 @@ void DesFill2bPattern(uint8_t deskeyList[MAX_KEYS_LIST_LEN][8], size_t *deskeyLi } *startPattern = pt; - if ((*deskeyListLen == MAX_KEYS_LIST_LEN) && (*aeskeyListLen == MAX_KEYS_LIST_LEN) && (*k3kkeyListLen == MAX_KEYS_LIST_LEN)) + if ( (*deskeyListLen == MAX_KEYS_LIST_LEN) && + (*aeskeyListLen == MAX_KEYS_LIST_LEN) && + (*k3kkeyListLen == MAX_KEYS_LIST_LEN)) { break; + } } (*startPattern)++; } static int AuthCheckDesfire(uint8_t *aid, uint8_t deskeyList[MAX_KEYS_LIST_LEN][8], size_t deskeyListLen, uint8_t aeskeyList[MAX_KEYS_LIST_LEN][16], size_t aeskeyListLen, uint8_t k3kkeyList[MAX_KEYS_LIST_LEN][24], size_t k3kkeyListLen, uint8_t foundKeys[4][0xE][24 + 1], bool *result) { + + uint32_t curaid = (aid[0] & 0xFF) + ((aid[1] & 0xFF) << 8) + ((aid[2] & 0xFF) << 16); + int res = handler_desfire_select_application(aid); if (res != PM3_SUCCESS) { - PrintAndLogEx(ERR, "AID %X does not exist."); + PrintAndLogEx(ERR, "AID 0x%06X does not exist.", curaid); return res; } @@ -3608,24 +3614,31 @@ static int AuthCheckDesfire(uint8_t *aid, uint8_t deskeyList[MAX_KEYS_LIST_LEN][ uint8_t file_ids_len = 0; // Get File IDs if (handler_desfire_fileids(file_ids, &file_ids_len) == PM3_SUCCESS) { + for (int j = file_ids_len - 1; j >= 0; j--) { + uint8_t filesettings[20] = {0}; int fileset_len = 0; + res = handler_desfire_filesettings(file_ids[j], filesettings, &fileset_len); if (res == PM3_SUCCESS) { + uint16_t accrights = (filesettings[3] << 8) + filesettings[2]; int change_access_rights = accrights & 0xF; int read_write_access = (accrights >> 4) & 0xF; int write_access = (accrights >> 8) & 0xF; int read_access = (accrights >> 12) & 0xF; + if (change_access_rights == 0xE) change_access_rights = 0x0; if (read_write_access == 0xE) read_write_access = 0x0; if (write_access == 0xE) write_access = 0x0; if (read_access == 0xE) read_access = 0x0; + usedkeys[change_access_rights] = 1; usedkeys[read_write_access] = 1; usedkeys[write_access] = 1; usedkeys[read_access] = 1; + if (res == PM3_SUCCESS) { switch (fileset_len >> 6) { case 0: @@ -3644,6 +3657,7 @@ static int AuthCheckDesfire(uint8_t *aid, uint8_t deskeyList[MAX_KEYS_LIST_LEN][ } } } + if (file_ids_len == 0) { for (int z = 0; z < 0xE; z++) { usedkeys[z] = 1; @@ -3654,24 +3668,33 @@ static int AuthCheckDesfire(uint8_t *aid, uint8_t deskeyList[MAX_KEYS_LIST_LEN][ } } } - } else des = true; + } else { + des = true; + } + int error = PM3_SUCCESS; bool badlen = false; + mfdes_authinput_t payload; - uint32_t curaid = (aid[0] & 0xFF) + ((aid[1] & 0xFF) << 8) + ((aid[2] & 0xFF) << 16); + mfdes_auth_res_t payload_res; + if (des) { - for (int keyno = 0; keyno < 0xE; keyno++) + + for (uint8_t keyno = 0; keyno < 0xE; keyno++) { + if (usedkeys[keyno] == 1 && foundKeys[0][keyno][0] == 0) { + for (int curkey = 0; curkey < deskeyListLen; curkey++) { + payload.keylen = 8; memcpy(payload.key, deskeyList[curkey], 8); payload.mode = MFDES_AUTH_DES; payload.algo = MFDES_ALGO_DES; payload.keyno = keyno; - mfdes_auth_res_t rpayload; - error = handler_desfire_auth(&payload, &rpayload, false); + + error = handler_desfire_auth(&payload, &payload_res, false); if (error == PM3_SUCCESS) { - PrintAndLogEx(SUCCESS, "AID 0x%06X, Found DES Key %d : " _GREEN_("%s"), curaid, keyno, sprint_hex(deskeyList[curkey], 8)); + PrintAndLogEx(SUCCESS, "AID 0x%06X, Found DES Key %u : " _GREEN_("%s"), curaid, keyno, sprint_hex(deskeyList[curkey], 8)); foundKeys[0][keyno][0] = 0x01; *result = true; memcpy(&foundKeys[0][keyno][1], deskeyList[curkey], 8); @@ -3681,7 +3704,6 @@ static int AuthCheckDesfire(uint8_t *aid, uint8_t deskeyList[MAX_KEYS_LIST_LEN][ DropField(); res = handler_desfire_select_application(aid); if (res != PM3_SUCCESS) { - PrintAndLogEx(ERR, "AID 0x%06X does not exist", curaid); return res; } break; @@ -3692,20 +3714,26 @@ static int AuthCheckDesfire(uint8_t *aid, uint8_t deskeyList[MAX_KEYS_LIST_LEN][ break; } } + } } + if (tdes) { - for (int keyno = 0; keyno < 0xE; keyno++) + + for (uint8_t keyno = 0; keyno < 0xE; keyno++) { + if (usedkeys[keyno] == 1 && foundKeys[1][keyno][0] == 0) { + for (int curkey = 0; curkey < aeskeyListLen; curkey++) { + payload.keylen = 16; memcpy(payload.key, aeskeyList[curkey], 16); payload.mode = MFDES_AUTH_DES; payload.algo = MFDES_ALGO_3DES; payload.keyno = keyno; - mfdes_auth_res_t rpayload; - error = handler_desfire_auth(&payload, &rpayload, false); + + error = handler_desfire_auth(&payload, &payload_res, false); if (error == PM3_SUCCESS) { - PrintAndLogEx(SUCCESS, "AID 0x%06X, Found 3DES Key %d : " _GREEN_("%s"), curaid, keyno, sprint_hex(aeskeyList[curkey], 16)); + PrintAndLogEx(SUCCESS, "AID 0x%06X, Found 3DES Key %u : " _GREEN_("%s"), curaid, keyno, sprint_hex(aeskeyList[curkey], 16)); foundKeys[1][keyno][0] = 0x01; *result = true; memcpy(&foundKeys[1][keyno][1], aeskeyList[curkey], 16); @@ -3715,7 +3743,6 @@ static int AuthCheckDesfire(uint8_t *aid, uint8_t deskeyList[MAX_KEYS_LIST_LEN][ DropField(); res = handler_desfire_select_application(aid); if (res != PM3_SUCCESS) { - PrintAndLogEx(ERR, "AID %X does not exist."); return res; } break; @@ -3726,21 +3753,26 @@ static int AuthCheckDesfire(uint8_t *aid, uint8_t deskeyList[MAX_KEYS_LIST_LEN][ break; } } + } } if (aes) { - for (int keyno = 0; keyno < 0xE; keyno++) + + for (uint8_t keyno = 0; keyno < 0xE; keyno++) { + if (usedkeys[keyno] == 1 && foundKeys[2][keyno][0] == 0) { + for (int curkey = 0; curkey < aeskeyListLen; curkey++) { + payload.keylen = 16; memcpy(payload.key, aeskeyList[curkey], 16); payload.mode = MFDES_AUTH_AES; payload.algo = MFDES_ALGO_AES; payload.keyno = keyno; - mfdes_auth_res_t rpayload; - error = handler_desfire_auth(&payload, &rpayload, false); + + error = handler_desfire_auth(&payload, &payload_res, false); if (error == PM3_SUCCESS) { - PrintAndLogEx(SUCCESS, "AID 0x%06X, Found AES Key %d : " _GREEN_("%s"), curaid, keyno, sprint_hex(aeskeyList[curkey], 16)); + PrintAndLogEx(SUCCESS, "AID 0x%06X, Found AES Key %u : " _GREEN_("%s"), curaid, keyno, sprint_hex(aeskeyList[curkey], 16)); foundKeys[2][keyno][0] = 0x01; *result = true; memcpy(&foundKeys[2][keyno][1], aeskeyList[curkey], 16); @@ -3750,7 +3782,6 @@ static int AuthCheckDesfire(uint8_t *aid, uint8_t deskeyList[MAX_KEYS_LIST_LEN][ DropField(); res = handler_desfire_select_application(aid); if (res != PM3_SUCCESS) { - PrintAndLogEx(ERR, "AID %X does not exist."); return res; } break; @@ -3761,21 +3792,25 @@ static int AuthCheckDesfire(uint8_t *aid, uint8_t deskeyList[MAX_KEYS_LIST_LEN][ break; } } + } } if (k3kdes) { - for (int keyno = 0; keyno < 0xE; keyno++) + + for (uint8_t keyno = 0; keyno < 0xE; keyno++) { + if (usedkeys[keyno] == 1 && foundKeys[3][keyno][0] == 0) { + for (int curkey = 0; curkey < k3kkeyListLen; curkey++) { payload.keylen = 24; memcpy(payload.key, k3kkeyList[curkey], 24); payload.mode = MFDES_AUTH_ISO; payload.algo = MFDES_ALGO_3K3DES; payload.keyno = keyno; - mfdes_auth_res_t rpayload; - error = handler_desfire_auth(&payload, &rpayload, false); + + error = handler_desfire_auth(&payload, &payload_res, false); if (error == PM3_SUCCESS) { - PrintAndLogEx(SUCCESS, "AID 0x%06X, Found 3K3 Key %d : " _GREEN_("%s"), curaid, keyno, sprint_hex(k3kkeyList[curkey], 24)); + PrintAndLogEx(SUCCESS, "AID 0x%06X, Found 3K3 Key %u : " _GREEN_("%s"), curaid, keyno, sprint_hex(k3kkeyList[curkey], 24)); foundKeys[3][keyno][0] = 0x01; *result = true; memcpy(&foundKeys[3][keyno][1], k3kkeyList[curkey], 16); @@ -3785,17 +3820,17 @@ static int AuthCheckDesfire(uint8_t *aid, uint8_t deskeyList[MAX_KEYS_LIST_LEN][ DropField(); res = handler_desfire_select_application(aid); if (res != PM3_SUCCESS) { - PrintAndLogEx(ERR, "AID %X does not exist."); return res; } break; } } + if (badlen == true) { - badlen = false; break; } } + } } DropField(); return PM3_SUCCESS; From fbd0a7e28444f3958507b4e42ea2dd99f7d5c71f Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 28 Apr 2020 19:58:07 +0200 Subject: [PATCH 004/632] typo --- client/src/cmdhf15.c | 28 ++++++++++++++-------------- client/src/cmdhficlass.c | 4 ++-- client/src/cmdhflto.c | 14 +++++++------- client/src/cmdhfmfdes.c | 2 +- client/src/cmdhftopaz.c | 4 ++-- client/src/cmdlft55xx.c | 6 +++--- include/pm3_cmd.h | 2 +- 7 files changed, 30 insertions(+), 30 deletions(-) diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index 620a75bd7..67e47c0d4 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -746,14 +746,14 @@ static int NxpSysInfo(uint8_t *uid) { if (status < 2) { PrintAndLogEx(WARNING, "iso15693 card doesn't answer to NXP systeminfo command"); - return PM3_EWRONGANSVER; + return PM3_EWRONGANSWER; } recv = resp.data.asBytes; if (recv[0] & ISO15_RES_ERROR) { PrintAndLogEx(ERR, "iso15693 card returned error %i: %s", recv[0], TagErrorStr(recv[0])); - return PM3_EWRONGANSVER; + return PM3_EWRONGANSWER; } bool support_signature = (recv[5] & 0x01); @@ -855,14 +855,14 @@ static int NxpSysInfo(uint8_t *uid) { if (status < 2) { PrintAndLogEx(WARNING, "iso15693 card doesn't answer to READ SIGNATURE command"); - return PM3_EWRONGANSVER; + return PM3_EWRONGANSWER; } recv = resp.data.asBytes; if (recv[0] & ISO15_RES_ERROR) { PrintAndLogEx(ERR, "iso15693 card returned error %i: %s", recv[0], TagErrorStr(recv[0])); - return PM3_EWRONGANSVER; + return PM3_EWRONGANSWER; } uint8_t signature[32] = {0x00}; @@ -916,14 +916,14 @@ static int CmdHF15Info(const char *Cmd) { if (status < 2) { PrintAndLogEx(WARNING, "iso15693 card doesn't answer to systeminfo command"); - return PM3_EWRONGANSVER; + return PM3_EWRONGANSWER; } recv = resp.data.asBytes; if (recv[0] & ISO15_RES_ERROR) { PrintAndLogEx(ERR, "iso15693 card returned error %i: %s", recv[0], TagErrorStr(recv[0])); - return PM3_EWRONGANSVER; + return PM3_EWRONGANSWER; } memcpy(uid, recv + 2, sizeof(uid)); @@ -1090,7 +1090,7 @@ static int CmdHF15WriteAfi(const char *Cmd) { if (recv[0] & ISO15_RES_ERROR) { PrintAndLogEx(ERR, "iso15693 card returned error %i: %s", recv[0], TagErrorStr(recv[0])); - return PM3_EWRONGANSVER; + return PM3_EWRONGANSWER; } PrintAndLogEx(NORMAL, ""); @@ -1149,7 +1149,7 @@ static int CmdHF15WriteDsfid(const char *Cmd) { if (recv[0] & ISO15_RES_ERROR) { PrintAndLogEx(ERR, "iso15693 card returned error %i: %s", recv[0], TagErrorStr(recv[0])); - return PM3_EWRONGANSVER; + return PM3_EWRONGANSWER; } PrintAndLogEx(NORMAL, ""); @@ -1430,7 +1430,7 @@ static int CmdHF15Readmulti(const char *Cmd) { uint32_t status = resp.oldarg[0]; if (status < 2) { PrintAndLogEx(FAILED, "iso15693 card select failed"); - return PM3_EWRONGANSVER; + return PM3_EWRONGANSWER; } recv = resp.data.asBytes; @@ -1442,7 +1442,7 @@ static int CmdHF15Readmulti(const char *Cmd) { if (recv[0] & ISO15_RES_ERROR) { PrintAndLogEx(FAILED, "iso15693 card returned error %i: %s", recv[0], TagErrorStr(recv[0])); - return PM3_EWRONGANSVER; + return PM3_EWRONGANSWER; } // skip status byte @@ -1512,7 +1512,7 @@ static int CmdHF15Read(const char *Cmd) { uint32_t status = resp.oldarg[0]; if (status < 2) { PrintAndLogEx(ERR, "iso15693 card select failed"); - return PM3_EWRONGANSVER; + return PM3_EWRONGANSWER; } recv = resp.data.asBytes; @@ -1524,7 +1524,7 @@ static int CmdHF15Read(const char *Cmd) { if (recv[0] & ISO15_RES_ERROR) { PrintAndLogEx(ERR, "iso15693 card returned error %i: %s", recv[0], TagErrorStr(recv[0])); - return PM3_EWRONGANSVER; + return PM3_EWRONGANSWER; } // print response @@ -1598,7 +1598,7 @@ static int CmdHF15Write(const char *Cmd) { uint32_t status = resp.oldarg[0]; if (status < 2) { PrintAndLogEx(FAILED, "iso15693 card select failed"); - return PM3_EWRONGANSVER; + return PM3_EWRONGANSWER; } recv = resp.data.asBytes; @@ -1610,7 +1610,7 @@ static int CmdHF15Write(const char *Cmd) { if (recv[0] & ISO15_RES_ERROR) { PrintAndLogEx(ERR, "iso15693 card returned error %i: %s", recv[0], TagErrorStr(recv[0])); - return PM3_EWRONGANSVER; + return PM3_EWRONGANSWER; } PrintAndLogEx(NORMAL, "OK"); diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index c687e316d..321b02133 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -1469,7 +1469,7 @@ static int WriteBlock(uint8_t blockno, uint8_t *bldata, uint8_t *KEY, bool use_c if (resp.status != PM3_SUCCESS) { if (verbose) PrintAndLogEx(ERR, "failed to communicate with card"); DropField(); - return PM3_EWRONGANSVER; + return PM3_EWRONGANSWER; } if (resp.data.asBytes[0] == 1) @@ -1811,7 +1811,7 @@ static int ReadBlock(uint8_t *KEY, uint8_t blockno, uint8_t keyType, bool elite, if (resp.status != PM3_SUCCESS) { if (verbose) PrintAndLogEx(ERR, "failed to communicate with card"); DropField(); - return PM3_EWRONGANSVER; + return PM3_EWRONGANSWER; } result = (struct p *)resp.data.asBytes; diff --git a/client/src/cmdhflto.c b/client/src/cmdhflto.c index 6434a9e88..947e2bacf 100644 --- a/client/src/cmdhflto.c +++ b/client/src/cmdhflto.c @@ -149,14 +149,14 @@ static int lto_select(uint8_t *id_response, uint8_t id_len, uint8_t *type_respon resp_len = id_len; status = lto_send_cmd_raw(select_sn_cmd, sizeof(select_sn_cmd), id_response, &resp_len, false, false, verbose); if (status == PM3_ETIMEOUT || status == PM3_ESOFT) { - return PM3_EWRONGANSVER; // REQUEST SERIAL NUMBER failed + return PM3_EWRONGANSWER; // REQUEST SERIAL NUMBER failed } memcpy(select_cmd + 2, id_response, sizeof(select_cmd) - 2); resp_len = 1; status = lto_send_cmd_raw(select_cmd, sizeof(select_cmd), resp, &resp_len, true, false, verbose); if (status == PM3_ETIMEOUT || status == PM3_ESOFT || resp[0] != 0x0A) { - return PM3_EWRONGANSVER; // SELECT failed + return PM3_EWRONGANSWER; // SELECT failed } // tag is now INIT and SELECTED. @@ -222,12 +222,12 @@ static int lto_rdbl(uint8_t blk, uint8_t *block_responce, uint8_t *block_cnt_res int status = lto_send_cmd_raw(rdbl_cmd, sizeof(rdbl_cmd), block_responce, &resp_len, true, false, verbose); if (status == PM3_ETIMEOUT || status == PM3_ESOFT) { - return PM3_EWRONGANSVER; // READ BLOCK failed + return PM3_EWRONGANSWER; // READ BLOCK failed } status = lto_send_cmd_raw(rdbl_cnt_cmd, sizeof(rdbl_cnt_cmd), block_cnt_responce, &resp_len, false, false, verbose); if (status == PM3_ETIMEOUT || status == PM3_ESOFT) { - return PM3_EWRONGANSVER; // READ BLOCK CONTINUE failed + return PM3_EWRONGANSWER; // READ BLOCK CONTINUE failed } return PM3_SUCCESS; @@ -334,17 +334,17 @@ static int lto_wrbl(uint8_t blk, uint8_t *data, bool verbose) { int status = lto_send_cmd_raw(wrbl_cmd, sizeof(wrbl_cmd), resp, &resp_len, true, false, verbose); if (status == PM3_ETIMEOUT || status == PM3_ESOFT || resp[0] != 0x0A) { - return PM3_EWRONGANSVER; // WRITE BLOCK failed + return PM3_EWRONGANSWER; // WRITE BLOCK failed } status = lto_send_cmd_raw(wrbl_d00_d15, sizeof(wrbl_d00_d15), resp, &resp_len, true, false, verbose); if (status == PM3_ETIMEOUT || status == PM3_ESOFT || resp[0] != 0x0A) { - return PM3_EWRONGANSVER; // WRITE BLOCK failed + return PM3_EWRONGANSWER; // WRITE BLOCK failed } status = lto_send_cmd_raw(wrbl_d16_d31, sizeof(wrbl_d16_d31), resp, &resp_len, true, false, verbose); if (status == PM3_ETIMEOUT || status == PM3_ESOFT || resp[0] != 0x0A) { - return PM3_EWRONGANSVER; // WRITE BLOCK failed + return PM3_EWRONGANSWER; // WRITE BLOCK failed } return PM3_SUCCESS; diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index 5ec08a1c3..2968a5ef7 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -534,7 +534,7 @@ static char *GetErrorString(int res, uint16_t *sw) { return "Generic TTY error"; case PM3_EINIT: return "Initialization error"; - case PM3_EWRONGANSVER: + case PM3_EWRONGANSWER: return "Expected a different answer error"; case PM3_EOUTOFBOUND: return "Memory out-of-bounds error"; diff --git a/client/src/cmdhftopaz.c b/client/src/cmdhftopaz.c index 1408a6e46..6410d67bc 100644 --- a/client/src/cmdhftopaz.c +++ b/client/src/cmdhftopaz.c @@ -109,7 +109,7 @@ static int topaz_select(uint8_t *atqa, uint8_t atqa_len, uint8_t *rid_response, status = topaz_send_cmd(rid_cmd, sizeof(rid_cmd), rid_response, &resp_len, verbose); if (status == PM3_ETIMEOUT || status == PM3_ESOFT) { topaz_switch_off_field(); - return PM3_EWRONGANSVER; // RID failed + return PM3_EWRONGANSWER; // RID failed } return PM3_SUCCESS; @@ -529,7 +529,7 @@ int readTopazUid(bool verbose) { return PM3_ESOFT; } - if (status == PM3_EWRONGANSVER) { + if (status == PM3_EWRONGANSWER) { if (verbose) PrintAndLogEx(ERR, "Error: tag didn't answer to RID"); topaz_switch_off_field(); return PM3_ESOFT; diff --git a/client/src/cmdlft55xx.c b/client/src/cmdlft55xx.c index 6d384c33d..5994e2232 100644 --- a/client/src/cmdlft55xx.c +++ b/client/src/cmdlft55xx.c @@ -611,7 +611,7 @@ bool t55xxVerifyWrite(uint8_t block, bool page1, bool usepwd, uint8_t override, if (GetT55xxBlockData(&read_data) == false) return false; - } else if (res == PM3_EWRONGANSVER) { + } else if (res == PM3_EWRONGANSWER) { // could't decode. Lets see if this was a block 0 write and try read/detect it auto. // this messes up with ppls config.. @@ -852,7 +852,7 @@ int T55xxReadBlockEx(uint8_t block, bool page1, bool usepwd, uint8_t override, u if (tryDetectModulation(downlink_mode, false) == false) { PrintAndLogEx(WARNING, "Safety check: Could not detect if PWD bit is set in config block. Exits."); - return PM3_EWRONGANSVER; + return PM3_EWRONGANSWER; } else { PrintAndLogEx(WARNING, "Safety check: PWD bit is NOT set in config block. Reading without password..."); usepwd = false; @@ -867,7 +867,7 @@ int T55xxReadBlockEx(uint8_t block, bool page1, bool usepwd, uint8_t override, u return PM3_ERFTRANS; if (DecodeT55xxBlock() == false) - return PM3_EWRONGANSVER; + return PM3_EWRONGANSWER; if (verbose) printT55xxBlock(block, page1); diff --git a/include/pm3_cmd.h b/include/pm3_cmd.h index 6ce271aab..c9125b1aa 100644 --- a/include/pm3_cmd.h +++ b/include/pm3_cmd.h @@ -613,7 +613,7 @@ typedef struct { // Initialization error pm3: error related to trying to initalize the pm3 / fpga for different operations #define PM3_EINIT -15 // Expected a different answer error client/pm3: error when expecting one answer and got another one -#define PM3_EWRONGANSVER -16 +#define PM3_EWRONGANSWER -16 // Memory out-of-bounds error client/pm3: error when a read/write is outside the expected array #define PM3_EOUTOFBOUND -17 // exchange with card error client/pm3: error when cant get answer from card or got an incorrect answer From d2e85b00405b4b0adde6a2f36ff03ba0734d5794 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 28 Apr 2020 19:58:15 +0200 Subject: [PATCH 005/632] coverity fix: shawdowfunction (stdio)\n. unsupported command shouldn't break execution (dfnames) --- client/src/cmdhfmfdes.c | 107 ++++++++++++++++++++++------------------ 1 file changed, 59 insertions(+), 48 deletions(-) diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index 5ec08a1c3..eefa8b698 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -1272,15 +1272,21 @@ static int handler_desfire_dfnames(dfname_t *dest, uint8_t *dfname_count) { if (dest == NULL) PrintAndLogEx(ERR, "DEST=NULL"); if (dfname_count == NULL) PrintAndLogEx(ERR, "DFNAME_COUNT=NULL"); } + if (dest == NULL || dfname_count == NULL) return PM3_EINVARG; + + *dfname_count = 0; + sAPDU apdu = {0x90, MFDES_GET_DF_NAMES, 0x00, 0x00, 0x00, NULL}; //0x6d int recv_len = 0; uint16_t sw = 0; int res = send_desfire_cmd(&apdu, true, (uint8_t *)dest, &recv_len, &sw, sizeof(dfname_t), true); if (res != PM3_SUCCESS) return res; + if (sw != status(MFDES_S_OPERATION_OK)) return PM3_ESOFT; + *dfname_count = recv_len; return res; } @@ -1957,8 +1963,8 @@ static int CmdHF14ADesClearRecordFile(const char *Cmd) { CLIGetHexWithReturn(1, aid, &aidlength); int filenolen = 0; - uint8_t fileno[1] = {0}; - CLIGetHexWithReturn(2, fileno, &filenolen); + uint8_t _fileno[1] = {0}; + CLIGetHexWithReturn(2, _fileno, &filenolen); int fidlength = 0; uint8_t fid[2] = {0}; @@ -1970,7 +1976,7 @@ static int CmdHF14ADesClearRecordFile(const char *Cmd) { return PM3_EINVARG; } - if (fileno[0] > 0x1F) { + if (_fileno[0] > 0x1F) { PrintAndLogEx(ERR, "Fileno must be lower 0x1F."); return PM3_EINVARG; } @@ -1988,7 +1994,7 @@ static int CmdHF14ADesClearRecordFile(const char *Cmd) { return res; } - res = handler_desfire_clearrecordfile(fileno[0]); + res = handler_desfire_clearrecordfile(_fileno[0]); if (res == PM3_SUCCESS) { PrintAndLogEx(SUCCESS, "Successfully cleared record file."); } else { @@ -2017,8 +2023,8 @@ static int CmdHF14ADesDeleteFile(const char *Cmd) { CLIGetHexWithReturn(1, aid, &aidlength); int filenolen = 0; - uint8_t fileno[1] = {0}; - CLIGetHexWithReturn(2, fileno, &filenolen); + uint8_t _fileno[1] = {0}; + CLIGetHexWithReturn(2, _fileno, &filenolen); int fidlength = 0; uint8_t fid[2] = {0}; @@ -2030,7 +2036,7 @@ static int CmdHF14ADesDeleteFile(const char *Cmd) { return PM3_EINVARG; } - if (fileno[0] > 0x1F) { + if (_fileno[0] > 0x1F) { PrintAndLogEx(ERR, "Fileno must be lower 0x1F."); return PM3_EINVARG; } @@ -2048,7 +2054,7 @@ static int CmdHF14ADesDeleteFile(const char *Cmd) { return res; } - res = handler_desfire_deletefile(fileno[0]); + res = handler_desfire_deletefile(_fileno[0]); if (res == PM3_SUCCESS) { PrintAndLogEx(SUCCESS, "Successfully deleted file.."); } else { @@ -2082,8 +2088,8 @@ static int CmdHF14ADesCreateFile(const char *Cmd) { CLIGetHexWithReturn(1, aid, &aidlength); int filenolen = 0; - uint8_t fileno[1] = {0}; - CLIGetHexWithReturn(2, fileno, &filenolen); + uint8_t _fileno[1] = {0}; + CLIGetHexWithReturn(2, _fileno, &filenolen); int fidlength = 0; uint8_t fid[2] = {0}; @@ -2110,7 +2116,7 @@ static int CmdHF14ADesCreateFile(const char *Cmd) { return PM3_EINVARG; } - if (fileno[0] > 0x1F) { + if (_fileno[0] > 0x1F) { PrintAndLogEx(ERR, "File number range is invalid (0x00-0x1F)."); return PM3_EINVARG; } @@ -2150,18 +2156,20 @@ static int CmdHF14ADesCreateFile(const char *Cmd) { mfdes_file_t ft; memcpy(ft.fid, fid, 2); memcpy(ft.filesize, filesize, 3); - ft.fileno = fileno[0]; + ft.fileno = _fileno[0]; ft.comset = comset; memcpy(ft.access_rights, ar, 2); - if (isbackup) res = handler_desfire_create_backup_file(&ft); - else res = handler_desfire_create_std_file(&ft); + if (isbackup) + res = handler_desfire_create_backup_file(&ft); + else + res = handler_desfire_create_std_file(&ft); - if (res == PM3_SUCCESS) { + if (res == PM3_SUCCESS) PrintAndLogEx(SUCCESS, "Successfully created standard/backup file."); - } else { + else PrintAndLogEx(ERR, "Couldn't create standard/backup file. Error %d", res); - } + DropField(); return res; } @@ -2186,8 +2194,8 @@ static int CmdHF14ADesGetValueData(const char *Cmd) { CLIGetHexWithReturn(1, aid, &aidlength); int filenolen = 0; - uint8_t fileno[1] = {0}; - CLIGetHexWithReturn(2, fileno, &filenolen); + uint8_t _fileno[1] = {0}; + CLIGetHexWithReturn(2, _fileno, &filenolen); CLIParserFree(); if (filenolen != 1) { @@ -2195,7 +2203,7 @@ static int CmdHF14ADesGetValueData(const char *Cmd) { return PM3_EINVARG; } - if (fileno[0] > 0x1F) { + if (_fileno[0] > 0x1F) { PrintAndLogEx(ERR, "File number range is invalid (0x00-0x1F)"); return PM3_EINVARG; } @@ -2215,12 +2223,12 @@ static int CmdHF14ADesGetValueData(const char *Cmd) { return res; } mfdes_value_t value; - value.fileno = fileno[0]; + value.fileno = _fileno[0]; int len = 0; res = handler_desfire_getvalue(&value, &len); if (res == PM3_SUCCESS) { - PrintAndLogEx(SUCCESS, "Successfully read value from File %u:", fileno[0]); + PrintAndLogEx(SUCCESS, "Successfully read value from File %u:", _fileno[0]); PrintAndLogEx(NORMAL, "\nOffset | Data | Ascii"); PrintAndLogEx(NORMAL, "----------------------------------------------------------------------------"); for (int i = 0; i < len; i += 16) { @@ -2256,8 +2264,8 @@ static int CmdHF14ADesReadData(const char *Cmd) { CLIGetHexWithReturn(1, aid, &aidlength); int filenolen = 0; - uint8_t fileno[1] = {0}; - CLIGetHexWithReturn(2, fileno, &filenolen); + uint8_t _fileno[1] = {0}; + CLIGetHexWithReturn(2, _fileno, &filenolen); int offsetlength = 0; uint8_t offset[3] = {0}; @@ -2285,7 +2293,7 @@ static int CmdHF14ADesReadData(const char *Cmd) { return PM3_EINVARG; } - if (fileno[0] > 0x1F) { + if (_fileno[0] > 0x1F) { PrintAndLogEx(ERR, "File number range is invalid (0x00-0x1F)"); return PM3_EINVARG; } @@ -2310,11 +2318,12 @@ static int CmdHF14ADesReadData(const char *Cmd) { mfdes_data_t ft; memcpy(ft.offset, offset, 3); memcpy(ft.length, filesize, 3); - ft.fileno = fileno[0]; + ft.fileno = _fileno[0]; int bytestoread = le24toh(filesize); - if (bytestoread == 0) bytestoread = 0xFFFFFF; + if (bytestoread == 0) + bytestoread = 0xFFFFFF; uint8_t *data = (uint8_t *)calloc(bytestoread, sizeof(uint8_t)); if (data != NULL) { @@ -2361,9 +2370,9 @@ static int CmdHF14ADesChangeValue(const char *Cmd) { CLIGetHexWithReturn(1, aid, &aidlength); int filenolen = 0; - uint8_t fileno[1] = {0}; - CLIGetHexWithReturn(2, fileno, &filenolen); - value.fileno = fileno[0]; + uint8_t _fileno[1] = {0}; + CLIGetHexWithReturn(2, _fileno, &filenolen); + value.fileno = _fileno[0]; int vlength = 0x0; CLIParamHexToBuf(arg_get_str(3), value.value, 4, &vlength); @@ -2453,8 +2462,8 @@ static int CmdHF14ADesWriteData(const char *Cmd) { CLIGetHexWithReturn(1, aid, &aidlength); int filenolen = 0; - uint8_t fileno[1] = {0}; - CLIGetHexWithReturn(2, fileno, &filenolen); + uint8_t _fileno[1] = {0}; + CLIGetHexWithReturn(2, _fileno, &filenolen); int offsetlength = 0; uint8_t offset[3] = {0}; @@ -2499,7 +2508,7 @@ static int CmdHF14ADesWriteData(const char *Cmd) { return PM3_EINVARG; } - if (fileno[0] > 0x1F) { + if (_fileno[0] > 0x1F) { PrintAndLogEx(ERR, "File number range is invalid (0x00-0x1F)"); if (data) free(data); return PM3_EINVARG; @@ -2524,7 +2533,7 @@ static int CmdHF14ADesWriteData(const char *Cmd) { memcpy(ft.offset, offset, 3); htole24(dlength, ft.length); - ft.fileno = fileno[0]; + ft.fileno = _fileno[0]; if (data != NULL) { ft.data = data; @@ -2566,8 +2575,8 @@ static int CmdHF14ADesCreateRecordFile(const char *Cmd) { CLIGetHexWithReturn(1, aid, &aidlength); int filenolen = 0; - uint8_t fileno[1] = {0}; - CLIGetHexWithReturn(2, fileno, &filenolen); + uint8_t _fileno[1] = {0}; + CLIGetHexWithReturn(2, _fileno, &filenolen); int fidlength = 0; uint8_t fid[2] = {0}; @@ -2609,7 +2618,7 @@ static int CmdHF14ADesCreateRecordFile(const char *Cmd) { return PM3_EINVARG; } - if (fileno[0] > 0x1F) { + if (_fileno[0] > 0x1F) { PrintAndLogEx(ERR, "File number range is invalid (0x00-0x1F)."); return PM3_EINVARG; } @@ -2648,15 +2657,20 @@ static int CmdHF14ADesCreateRecordFile(const char *Cmd) { } mfdes_linear_t ft; - ft.fileno = fileno[0]; + + ft.fileno = _fileno[0]; memcpy(ft.fid, fid, 2); ft.comset = comset; memcpy(ft.access_rights, ar, 2); memcpy(ft.recordsize, recordsize, 3); memcpy(ft.maxnumrecords, maxnumrecords, 3); - if (cyclic) res = handler_desfire_create_cyclicrecordfile(&ft); - else res = handler_desfire_create_linearrecordfile(&ft); + if (cyclic) { + res = handler_desfire_create_cyclicrecordfile(&ft); + } else { + res = handler_desfire_create_linearrecordfile(&ft); + } + if (res == PM3_SUCCESS) { PrintAndLogEx(SUCCESS, "Successfully created linear/cyclic record file."); } else { @@ -2691,8 +2705,8 @@ static int CmdHF14ADesCreateValueFile(const char *Cmd) { CLIGetHexWithReturn(1, aid, &aidlength); int filenolen = 0; - uint8_t fileno[1] = {0}; - CLIGetHexWithReturn(2, fileno, &filenolen); + uint8_t _fileno[1] = {0}; + CLIGetHexWithReturn(2, _fileno, &filenolen); uint8_t comset = arg_get_int(3); int arlength = 0; @@ -2727,7 +2741,7 @@ static int CmdHF14ADesCreateValueFile(const char *Cmd) { return PM3_EINVARG; } - if (fileno[0] > 0x1F) { + if (_fileno[0] > 0x1F) { PrintAndLogEx(ERR, "File number range is invalid (0x00-0x1F)"); return PM3_EINVARG; } @@ -2775,7 +2789,8 @@ static int CmdHF14ADesCreateValueFile(const char *Cmd) { } mfdes_value_file_t ft; - ft.fileno = fileno[0]; + + ft.fileno = _fileno[0]; ft.comset = comset; memcpy(ft.access_rights, ar, 2); memcpy(ft.lowerlimit, lowerlimit, 4); @@ -3166,8 +3181,6 @@ static int CmdHF14ADesDump(const char *Cmd) { if (handler_desfire_dfnames(dfnames, &dfname_count) != PM3_SUCCESS) { PrintAndLogEx(WARNING, _RED_("Can't get DF Names")); - DropField(); - return PM3_ESOFT; } PrintAndLogEx(NORMAL, ""); @@ -3312,8 +3325,6 @@ static int CmdHF14ADesEnumApplications(const char *Cmd) { if (handler_desfire_dfnames(dfnames, &dfname_count) != PM3_SUCCESS) { PrintAndLogEx(WARNING, _RED_("Can't get DF Names")); - DropField(); - return PM3_ESOFT; } PrintAndLogEx(NORMAL, ""); From cd19bf81a8fc1d8d88e938f87f799cbb0a0d829e Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 28 Apr 2020 21:51:13 +0200 Subject: [PATCH 006/632] cppcheck fix --- client/src/cmdhfmfu.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index f70c3887e..3d90a36de 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -934,7 +934,6 @@ static int ulev1_print_signature(TagTypeUL_t tagtype, uint8_t *uid, uint8_t *sig }; */ uint8_t i; - int res; bool is_valid = false; for (i = 0; i < ARRAYLEN(nxp_mfu_public_keys); i++) { @@ -942,7 +941,7 @@ static int ulev1_print_signature(TagTypeUL_t tagtype, uint8_t *uid, uint8_t *sig uint8_t key[PUBLIC_ECDA_KEYLEN]; param_gethex_to_eol(nxp_mfu_public_keys[i].value, 0, key, PUBLIC_ECDA_KEYLEN, &dl); - res = ecdsa_signature_r_s_verify(MBEDTLS_ECP_DP_SECP128R1, key, uid, 7, signature, signature_len, false); + int res = ecdsa_signature_r_s_verify(MBEDTLS_ECP_DP_SECP128R1, key, uid, 7, signature, signature_len, false); is_valid = (res == 0); if (is_valid) From 78cc7e10a586d38bce09c0ac01d434381582c03f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 28 Apr 2020 21:53:01 +0200 Subject: [PATCH 007/632] cppcheck fix - duplicate condition --- client/src/cmdhfmfu.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index 3d90a36de..88e44285e 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -1293,10 +1293,8 @@ static int CmdHF14AMfUInfo(const char *Cmd) { // re-select if (ul_auth_select(&card, tagtype, hasAuthKey, authkeyptr, pack, sizeof(pack)) == PM3_ESOFT) return PM3_ESOFT; } - } - // Get Version - if ((tagtype & (UL_EV1_48 | UL_EV1_128 | UL_EV1 | UL_NANO_40 | NTAG_213 | NTAG_213_F | NTAG_215 | NTAG_216 | NTAG_216_F | NTAG_I2C_1K | NTAG_I2C_2K | NTAG_I2C_1K_PLUS | NTAG_I2C_2K_PLUS))) { + // Get Version uint8_t version[10] = {0x00}; status = ulev1_getVersion(version, sizeof(version)); if (status == -1) { From a7ececcb5dfe631fb159c17bcddf574aeb4123ca Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 28 Apr 2020 22:26:16 +0200 Subject: [PATCH 008/632] cppcheck fix - duplicate condition --- client/src/loclass/ikeys.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/src/loclass/ikeys.c b/client/src/loclass/ikeys.c index 9d9926547..11a082867 100644 --- a/client/src/loclass/ikeys.c +++ b/client/src/loclass/ikeys.c @@ -578,8 +578,10 @@ static void print64bits(const char *name, uint64_t val) { static uint64_t testCryptedCSN(uint64_t crypted_csn, uint64_t expected) { int retval = 0; uint8_t result[8] = {0}; - if (debug_print) PrintAndLogEx(DEBUG, "debug_print %d", debug_print); - if (debug_print) print64bits(" {csn} ", crypted_csn); + if (debug_print) { + PrintAndLogEx(DEBUG, "debug_print %d", debug_print); + print64bits(" {csn} ", crypted_csn); + } uint64_t crypted_csn_swapped = swapZvalues(crypted_csn); From 31125b9d342f0143ada6428e011334ef2da64728 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 28 Apr 2020 22:27:50 +0200 Subject: [PATCH 009/632] cppchecker fix - conditionknown --- common/lfdemod.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/lfdemod.c b/common/lfdemod.c index bc753f45d..c73734a75 100644 --- a/common/lfdemod.c +++ b/common/lfdemod.c @@ -1582,9 +1582,10 @@ static uint16_t cleanAskRawDemod(uint8_t *bits, size_t *size, int clk, int inver if (waveHigh) { bits[bitCnt++] = invert; - } else if (!waveHigh) { + } else { bits[bitCnt++] = invert ^ 1; } + if (*startIdx == 0) { *startIdx = i - cl_2; if (g_debugMode == 2) prnt("DEBUG ASK: cleanAskRawDemod minus half clock [%d]", *startIdx); From 39fd06f947a5b949f8e8f1d151965e2e0714d298 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 28 Apr 2020 22:29:22 +0200 Subject: [PATCH 010/632] cppchecker fix - conditionknown --- common/lfdemod.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/lfdemod.c b/common/lfdemod.c index c73734a75..8b10b2fb3 100644 --- a/common/lfdemod.c +++ b/common/lfdemod.c @@ -1560,7 +1560,7 @@ static uint16_t cleanAskRawDemod(uint8_t *bits, size_t *size, int clk, int inver } else if (waveHigh) { bits[bitCnt++] = invert; bits[bitCnt++] = invert; - } else if (!waveHigh) { + } else { bits[bitCnt++] = invert ^ 1; bits[bitCnt++] = invert ^ 1; } From 4896390dde5b194cfe4a343ca144493c6dd006bd Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 28 Apr 2020 22:31:45 +0200 Subject: [PATCH 011/632] cppchecker fix --- client/src/cmdlfindala.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/src/cmdlfindala.c b/client/src/cmdlfindala.c index 69c1e5a55..6cf5ed28f 100644 --- a/client/src/cmdlfindala.c +++ b/client/src/cmdlfindala.c @@ -838,11 +838,12 @@ int detectIndala(uint8_t *dest, size_t *size, uint8_t *invert) { goto inv; } -inv: if (res == 0) { return -4; } +inv: + *invert ^= 1; if (*invert && idx > 0) { From b86d9f2b969fe44121f7f58929120b1dfa2a84b2 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 28 Apr 2020 22:36:57 +0200 Subject: [PATCH 012/632] cppcheck fix --- common/crapto1/crypto1.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/common/crapto1/crypto1.c b/common/crapto1/crypto1.c index dd5541b29..82203ef5e 100644 --- a/common/crapto1/crypto1.c +++ b/common/crapto1/crypto1.c @@ -18,7 +18,6 @@ Copyright (C) 2008-2008 bla */ #include - #include "crapto1.h" #include "parity.h" @@ -34,7 +33,6 @@ void crypto1_init(struct Crypto1State *state, uint64_t key) { state->odd = state->odd << 1 | BIT(key, (i - 1) ^ 7); state->even = state->even << 1 | BIT(key, i ^ 7); } - return; } void crypto1_deinit(struct Crypto1State *state) { @@ -42,9 +40,9 @@ void crypto1_deinit(struct Crypto1State *state) { state->even = 0; } -#if !defined(__arm__) || defined(__linux__) || defined(_WIN32) || defined(__APPLE__) // bare metal ARM Proxmark lacks malloc()/free() +#if !defined(__arm__) || defined(__linux__) || defined(_WIN32) || defined(__APPLE__) // bare metal ARM Proxmark lacks calloc()/free() struct Crypto1State *crypto1_create(uint64_t key) { - struct Crypto1State *state = malloc(sizeof(*state)); + struct Crypto1State *state = calloc(sizeof(*state), sizeof(uint8_t)); if (!state) return NULL; crypto1_init(state, key); return state; From 1b16b955653139cfad1e5a97e32d5d2af68da78c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 28 Apr 2020 22:39:04 +0200 Subject: [PATCH 013/632] cppchecker fix --- tools/hitag2crack/crack2/ht2crack2gentest.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tools/hitag2crack/crack2/ht2crack2gentest.c b/tools/hitag2crack/crack2/ht2crack2gentest.c index fb9ff484b..0f255a5b6 100644 --- a/tools/hitag2crack/crack2/ht2crack2gentest.c +++ b/tools/hitag2crack/crack2/ht2crack2gentest.c @@ -41,7 +41,6 @@ int main(int argc, char *argv[]) { int i, j; int numtests; int urandomfd; - FILE *fp; if (argc < 2) { printf("ht2crack2gentest number\n"); @@ -68,7 +67,7 @@ int main(int argc, char *argv[]) { makerandom(nR, 4, urandomfd); sprintf(filename, "keystream.key-%s.uid-%s.nR-%s", key, uid, nR); - fp = fopen(filename, "w"); + FILE *fp = fopen(filename, "w"); if (!fp) { printf("cannot open file '%s' for writing\n", filename); exit(1); @@ -87,9 +86,7 @@ int main(int argc, char *argv[]) { fclose(fp); } - return 0; - } From cdb99fe65096ef874da44c00c8f9112148ab9168 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 28 Apr 2020 22:58:05 +0200 Subject: [PATCH 014/632] cppchecker fix - duplicate --- client/src/cmdhficlass.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 321b02133..d05afdae2 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -2983,13 +2983,11 @@ int readIclass(bool loop, bool verbose) { if (isHidRange) { if (legacy) - PrintAndLogEx(SUCCESS, " : Possible iClass - legacy credential tag"); + PrintAndLogEx(SUCCESS, " : Possible iClass - "_YELLOW_("legacy")" credential tag"); if (se_enabled) - PrintAndLogEx(SUCCESS, " : Possible iClass - SE credential tag"); - } + PrintAndLogEx(SUCCESS, " : Possible iClass - "_YELLOW_("SE")" credential tag"); - if (isHidRange) { PrintAndLogEx(SUCCESS, " : Tag is "_YELLOW_("iClass")", CSN is in HID range"); } else { PrintAndLogEx(SUCCESS, " : Tag is "_YELLOW_("PicoPass")", CSN is not in HID range"); From 305736b16a8f83c717610e9f16ac76b88425de78 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 29 Apr 2020 09:38:32 +0200 Subject: [PATCH 015/632] travis: remove libsndfile --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index d136892a4..0b052044a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,11 +27,9 @@ addons: packages: - gcc-arm-none-eabi - libnewlib-dev - - libsndfile1-dev homebrew: packages: - readline - - libsndfile - qt5 - RfidResearchGroup/proxmark3/arm-none-eabi-gcc taps: RfidResearchGroup/proxmark3 From f80f123061eb8d36f3eaf3ed93e32f1f53495889 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 29 Apr 2020 12:00:49 +0200 Subject: [PATCH 016/632] Chg: Bt dongle, bt direct listing of serial ports on WSL and PS3.x, now using powershell.exe since wmic is deprecated --- pm3 | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 2 deletions(-) diff --git a/pm3 b/pm3 index 52b434e13..b3bee7ea5 100755 --- a/pm3 +++ b/pm3 @@ -79,18 +79,43 @@ function get_pm3_list_macOS { function get_pm3_list_Windows { N=$1 PM3LIST=() - for DEV in $(wmic path Win32_SerialPort where "PNPDeviceID like '%VID_9AC4&PID_4B8F%'" get DeviceID,PNPDeviceID 2>/dev/null|awk '/^COM/{print $1}'); do + # Normal SERIAL PORTS (COM) + for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_serialport | Where-Object PNPDeviceID -like '*VID_9AC4&PID_4B8F*' | Select DeviceID" 2>/dev/null|awk '/^COM/{print $1}'); do DEV=${DEV/ */} PM3LIST+=("$DEV") if [ ${#PM3LIST[*]} -ge $N ]; then return fi done + + #white BT dongle SERIAL PORTS (COM) + if $FINDBTDONGLE; then + for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_serialport | Where-Object PNPDeviceID -like '*VID_10C4&PID_EA60*' | Select DeviceID" 2>/dev/null|awk '/^COM/{print $1}'); do + DEV=${DEV/ */} + PM3LIST+=("$DEV") + if [ ${#PM3LIST[*]} -ge $N ]; then + return + fi + done + fi + + #BT direct SERIAL PORTS (COM) + if $FINDBTDIRECT; then + for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_PnPEntity | Where-Object Caption -like 'Standard Serial over Bluetooth link (COM*' | Select Name" 2> /dev/null | awk '$0 ~ /COM/{print substr($6,2,4)}'); do + DEV=${DEV/ */} + PM3LIST+=("$DEV") + if [ ${#PM3LIST[*]} -ge $N ]; then + return + fi + done + fi } function get_pm3_list_WSL { + N=$1 PM3LIST=() - for DEV in $(wmic.exe path Win32_SerialPort where "PNPDeviceID like '%VID_9AC4&PID_4B8F%'" get DeviceID,PNPDeviceID 2>/dev/null|awk '/^COM/{print $1}'); do + # Normal SERIAL PORTS (COM) + for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_serialport | Where-Object PNPDeviceID -like '*VID_9AC4&PID_4B8F*' | Select DeviceID" 2>/dev/null|awk '/^COM/{print $1}'); do DEV=${DEV/ */} DEV="/dev/ttyS${DEV#COM}" # ttyS counterpart takes some more time to appear @@ -105,6 +130,47 @@ function get_pm3_list_WSL { fi fi done + + #white BT dongle SERIAL PORTS (COM) + if $FINDBTDONGLE; then + for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_serialport | Where-Object PNPDeviceID -like '*VID_10C4&PID_EA60*' | Select DeviceID" 2>/dev/null|awk '/^COM/{print $1}'); do + DEV=${DEV/ */} + DEV="/dev/ttyS${DEV#COM}" + # ttyS counterpart takes some more time to appear + if [ -e "$DEV" ]; then + PM3LIST+=("$DEV") + if [ ! -w "$DEV" ]; then + echo "[!!] Let's give users read/write access to $DEV" + sudo chmod 666 "$DEV" + fi + if [ ${#PM3LIST[*]} -ge $N ]; then + return + fi + fi + + done + fi + + #BT direct SERIAL PORTS (COM) + if $FINDBTDIRECT; then + for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_PnPEntity | Where-Object Caption -like 'Standard Serial over Bluetooth link (COM*' | Select Name" 2> /dev/null | awk '$0 ~ /COM/{print substr($6,2,4)}'); do + + DEV=${DEV/ */} + DEV="/dev/ttyS${DEV#COM}" + # ttyS counterpart takes some more time to appear + if [ -e "$DEV" ]; then + PM3LIST+=("$DEV") + if [ ! -w "$DEV" ]; then + echo "[!!] Let's give users read/write access to $DEV" + sudo chmod 666 "$DEV" + fi + if [ ${#PM3LIST[*]} -ge $N ]; then + return + fi + fi + + done + fi } SCRIPT=$(basename -- "$0") From 73e6f0d07ea52f202da486bb4bd52af048d47e7e Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 29 Apr 2020 14:07:26 +0200 Subject: [PATCH 017/632] chg: moved WSL/PS3.x bt native to be tested first. Since call to Win32_serialport crashes it. --- pm3 | 91 +++++++++++++++++++++++++++++++------------------------------ 1 file changed, 47 insertions(+), 44 deletions(-) diff --git a/pm3 b/pm3 index b3bee7ea5..2b2258b50 100755 --- a/pm3 +++ b/pm3 @@ -29,7 +29,7 @@ function get_pm3_list_Linux { N=$1 PM3LIST=() for DEV in $(find /dev/ttyACM* 2>/dev/null); do - if udevadm info -q property -n "$DEV" |grep -q "ID_VENDOR=proxmark.org"; then + if udevadm info -q property -n "$DEV" | grep -q "ID_VENDOR=proxmark.org"; then PM3LIST+=("$DEV") if [ ${#PM3LIST[*]} -ge $N ]; then return @@ -39,7 +39,7 @@ function get_pm3_list_Linux { if $FINDBTDONGLE; then # check if the HC-06-USB white dongle is present (still, that doesn't tell us if it's paired with a Proxmark3...) for DEV in $(find /dev/ttyUSB* 2>/dev/null); do - if udevadm info -q property -n "$DEV" |grep -q "ID_MODEL=CP2104_USB_to_UART_Bridge_Controller"; then + if udevadm info -q property -n "$DEV" | grep -q "ID_MODEL=CP2104_USB_to_UART_Bridge_Controller"; then PM3LIST+=("$DEV") if [ ${#PM3LIST[*]} -ge $N ]; then return @@ -49,7 +49,7 @@ function get_pm3_list_Linux { fi if $FINDBTDIRECT; then # check if the MAC of a Proxmark3 was bound to a local rfcomm interface - for DEVMAC in $(rfcomm -a|grep " 20:19:0[45]"|sed 's/^\(.*\): \([0-9:]*\) .*/\1@\2/'); do + for DEVMAC in $(rfcomm -a 2>/dev/null | grep " 20:19:0[45]" | sed 's/^\(.*\): \([0-9:]*\) .*/\1@\2/'); do DEV=${DEVMAC/@*/} MAC=${DEVMAC/*@/} # check if Proxmark3 is actually present @@ -66,7 +66,7 @@ function get_pm3_list_Linux { function get_pm3_list_macOS { N=$1 PM3LIST=() - for DEV in $(ioreg -r -c "IOUSBHostDevice" -l|awk -F '"' ' + for DEV in $(ioreg -r -c "IOUSBHostDevice" -l | awk -F '"' ' $2=="USB Vendor Name"{b=($4=="proxmark.org")} b==1 && $2=="IODialinDevice"{print $4}'); do PM3LIST+=("$DEV") @@ -79,18 +79,10 @@ function get_pm3_list_macOS { function get_pm3_list_Windows { N=$1 PM3LIST=() - # Normal SERIAL PORTS (COM) - for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_serialport | Where-Object PNPDeviceID -like '*VID_9AC4&PID_4B8F*' | Select DeviceID" 2>/dev/null|awk '/^COM/{print $1}'); do - DEV=${DEV/ */} - PM3LIST+=("$DEV") - if [ ${#PM3LIST[*]} -ge $N ]; then - return - fi - done - - #white BT dongle SERIAL PORTS (COM) - if $FINDBTDONGLE; then - for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_serialport | Where-Object PNPDeviceID -like '*VID_10C4&PID_EA60*' | Select DeviceID" 2>/dev/null|awk '/^COM/{print $1}'); do + # Need to look for this first, the call to Win32_serialport "crashes" then native bt serial port. Don't ask why. + #BT direct SERIAL PORTS (COM) + if $FINDBTDIRECT; then + for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_PnPEntity | Where-Object Caption -like 'Standard Serial over Bluetooth link (COM*' | Select Name" 2> /dev/null | awk '$0 ~ /COM/{print substr($6,2,4)}'); do DEV=${DEV/ */} PM3LIST+=("$DEV") if [ ${#PM3LIST[*]} -ge $N ]; then @@ -99,43 +91,38 @@ function get_pm3_list_Windows { done fi - #BT direct SERIAL PORTS (COM) - if $FINDBTDIRECT; then - for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_PnPEntity | Where-Object Caption -like 'Standard Serial over Bluetooth link (COM*' | Select Name" 2> /dev/null | awk '$0 ~ /COM/{print substr($6,2,4)}'); do + # Normal SERIAL PORTS (COM) + for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_serialport | Where-Object PNPDeviceID -like '*VID_9AC4&PID_4B8F*' | Select DeviceID" 2>/dev/null | awk '/^COM/{print $1}'); do + DEV=${DEV/ */} + PM3LIST+=("$DEV") + if [ ${#PM3LIST[*]} -ge $N ]; then + return + fi + done + + #white BT dongle SERIAL PORTS (COM) + if $FINDBTDONGLE; then + for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_serialport | Where-Object PNPDeviceID -like '*VID_10C4&PID_EA60*' | Select DeviceID" 2>/dev/null | awk '/^COM/{print $1}'); do DEV=${DEV/ */} PM3LIST+=("$DEV") if [ ${#PM3LIST[*]} -ge $N ]; then return fi - done + done fi } function get_pm3_list_WSL { N=$1 PM3LIST=() - # Normal SERIAL PORTS (COM) - for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_serialport | Where-Object PNPDeviceID -like '*VID_9AC4&PID_4B8F*' | Select DeviceID" 2>/dev/null|awk '/^COM/{print $1}'); do - DEV=${DEV/ */} - DEV="/dev/ttyS${DEV#COM}" - # ttyS counterpart takes some more time to appear - if [ -e "$DEV" ]; then - PM3LIST+=("$DEV") - if [ ! -w "$DEV" ]; then - echo "[!!] Let's give users read/write access to $DEV" - sudo chmod 666 "$DEV" - fi - if [ ${#PM3LIST[*]} -ge $N ]; then - return - fi - fi - done - #white BT dongle SERIAL PORTS (COM) - if $FINDBTDONGLE; then - for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_serialport | Where-Object PNPDeviceID -like '*VID_10C4&PID_EA60*' | Select DeviceID" 2>/dev/null|awk '/^COM/{print $1}'); do + # Need to look for this first, the call to Win32_serialport "crashes" then native bt serial port. Don't ask why. + #BT direct SERIAL PORTS (COM) + if $FINDBTDIRECT; then + for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_PnPEntity | Where-Object Caption -like 'Standard Serial over Bluetooth link (COM*' | Select Name" 2> /dev/null | awk '$0 ~ /COM/{print substr($6,2,4)}'); do + DEV=${DEV/ */} - DEV="/dev/ttyS${DEV#COM}" + DEV="/dev/ttyS${DEV#COM}" # ttyS counterpart takes some more time to appear if [ -e "$DEV" ]; then PM3LIST+=("$DEV") @@ -151,12 +138,28 @@ function get_pm3_list_WSL { done fi - #BT direct SERIAL PORTS (COM) - if $FINDBTDIRECT; then - for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_PnPEntity | Where-Object Caption -like 'Standard Serial over Bluetooth link (COM*' | Select Name" 2> /dev/null | awk '$0 ~ /COM/{print substr($6,2,4)}'); do + # Normal SERIAL PORTS (COM) + for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_serialport | Where-Object PNPDeviceID -like '*VID_9AC4&PID_4B8F*' | Select DeviceID" 2>/dev/null | awk '/^COM/{print $1}'); do + DEV=${DEV/ */} + DEV="/dev/ttyS${DEV#COM}" + # ttyS counterpart takes some more time to appear + if [ -e "$DEV" ]; then + PM3LIST+=("$DEV") + if [ ! -w "$DEV" ]; then + echo "[!!] Let's give users read/write access to $DEV" + sudo chmod 666 "$DEV" + fi + if [ ${#PM3LIST[*]} -ge $N ]; then + return + fi + fi + done + #white BT dongle SERIAL PORTS (COM) + if $FINDBTDONGLE; then + for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_serialport | Where-Object PNPDeviceID -like '*VID_10C4&PID_EA60*' | Select DeviceID" 2>/dev/null | awk '/^COM/{print $1}'); do DEV=${DEV/ */} - DEV="/dev/ttyS${DEV#COM}" + DEV="/dev/ttyS${DEV#COM}" # ttyS counterpart takes some more time to appear if [ -e "$DEV" ]; then PM3LIST+=("$DEV") From 7ca7677568e209d5462bd441c8e4869dd2f0b3ad Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 29 Apr 2020 01:41:22 +0200 Subject: [PATCH 018/632] Linux: add native support for Bluetooth in client --- .travis.yml | 1 + client/CMakeLists.txt | 9 +++ client/Makefile | 28 +++++++++- client/src/comms.c | 5 +- client/src/uart/uart_posix.c | 56 ++++++++++++++++++- doc/bt_manual_v10.md | 53 +++++++++++++----- .../Linux-Installation-Instructions.md | 14 ++++- .../4_Advanced-compilation-parameters.md | 8 +++ 8 files changed, 151 insertions(+), 23 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0b052044a..f8cf8228f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,6 +27,7 @@ addons: packages: - gcc-arm-none-eabi - libnewlib-dev + - libbluetooth-dev homebrew: packages: - readline diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 0bbf1067c..921e0d04b 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -35,6 +35,9 @@ foreach(_qt_package IN LISTS QT_PACKAGELIST) endif(NOT ${_qt_package}_FOUND) endforeach() +find_package(PkgConfig) +pkg_search_module(BLUEZ QUIET bluez) + SET (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake") add_subdirectory(deps) @@ -208,6 +211,12 @@ else (Qt5_FOUND) ${TARGET_SOURCES}) endif (Qt5_FOUND) +if (BLUEZ_FOUND) + message("Bluez library found, building native Bluetooth support :)") + add_definitions("-DHAVE_BLUEZ") + set(ADDITIONAL_LNK bluetooth ${ADDITIONAL_LNK}) +endif (BLUEZ_FOUND) + add_executable( proxmark3 ${TARGET_SOURCES} diff --git a/client/Makefile b/client/Makefile index d3461a302..d7709f656 100644 --- a/client/Makefile +++ b/client/Makefile @@ -90,6 +90,14 @@ else endif endif +ifneq ($(SKIPBT),1) + BTLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs bluez 2>/dev/null) +endif + +ifneq ($(BTLDLIBS),) + PM3CFLAGS += -DHAVE_BLUEZ +endif + ifneq ($(SKIPQT),1) # Check for correctly configured Qt5 QTINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags Qt5Core Qt5Widgets 2>/dev/null) @@ -132,6 +140,24 @@ else QTGUIOBJS = $(OBJDIR)/guidummy.o endif +$(info ===================================================================) +$(info Client platform: $(platform)) +ifeq ($(SKIPQT),1) +$(info GUI support: skipped) +else ifneq ($(QTLDLIBS),) +$(info GUI support: QT found, enabled) +else +$(info GUI support: QT not found, disabled) +endif +ifeq ($(SKIPBT),1) +$(info native BT support: skipped) +else ifneq ($(BTLDLIBS),) +$(info native BT support: Bluez found, enabled) +else +$(info native BT support: Bluez not found, disabled) +endif +$(info ===================================================================) + # Flags to generate temporary dependency files DEPFLAGS = -MT $@ -MMD -MP -MF $(OBJDIR)/$*.Td # make temporary to final dependency files after successful compilation @@ -286,7 +312,7 @@ all: $(BINS) all-static: LDLIBS:=-static $(LDLIBS) all-static: $(BINS) -proxmark3: LDLIBS+=$(LUALIB) $(JANSSONLIB) $(MBEDTLSLIB) $(CBORLIB) $(ZLIB) $(REVENGLIB) $(AMIIBOLIB) $(HARDNESTEDLIB) $(CLIPARSERLIB) $(QTLDLIBS) +proxmark3: LDLIBS+=$(LUALIB) $(JANSSONLIB) $(MBEDTLSLIB) $(CBORLIB) $(ZLIB) $(REVENGLIB) $(AMIIBOLIB) $(HARDNESTEDLIB) $(CLIPARSERLIB) $(BTLDLIBS) $(QTLDLIBS) proxmark3: $(OBJDIR)/proxmark3.o $(COREOBJS) $(CMDOBJS) $(OBJCOBJS) $(QTGUIOBJS) $(LUALIB) $(JANSSONLIB) $(CBORLIB) $(REVENGLIB) $(MBEDTLSLIB) $(ZLIB) $(AMIIBOLIB) $(HARDNESTEDLIB) $(CLIPARSERLIB) lualibs/pm3_cmd.lua lualibs/mfc_default_keys.lua $(info [=] LD $@) $(Q)$(LD) $(LDFLAGS) $(OBJDIR)/proxmark3.o $(COREOBJS) $(CMDOBJS) $(OBJCOBJS) $(QTGUIOBJS) $(LDLIBS) -o $@ diff --git a/client/src/comms.c b/client/src/comms.c index 88ffde16c..36f035bdd 100644 --- a/client/src/comms.c +++ b/client/src/comms.c @@ -639,9 +639,10 @@ int TestProxmark(void) { conn.send_via_fpc_usart = pm3_capabilities.via_fpc; conn.uart_speed = pm3_capabilities.baudrate; - PrintAndLogEx(INFO, "Communicating with PM3 over %s%s", + PrintAndLogEx(INFO, "Communicating with PM3 over %s%s%s", conn.send_via_fpc_usart ? _YELLOW_("FPC UART") : _YELLOW_("USB-CDC"), - memcmp(conn.serial_port_name, "tcp:", 4) == 0 ? " over " _YELLOW_("TCP") : ""); + memcmp(conn.serial_port_name, "tcp:", 4) == 0 ? " over " _YELLOW_("TCP") : "", + memcmp(conn.serial_port_name, "bt:", 3) == 0 ? " over " _YELLOW_("BT") : ""); if (conn.send_via_fpc_usart) { PrintAndLogEx(INFO, "PM3 UART serial baudrate: " _YELLOW_("%u") "\n", conn.uart_speed); diff --git a/client/src/uart/uart_posix.c b/client/src/uart/uart_posix.c index a2b324b49..cf0837845 100644 --- a/client/src/uart/uart_posix.c +++ b/client/src/uart/uart_posix.c @@ -48,10 +48,16 @@ #include #include #include -#include "sys/socket.h" -#include "sys/un.h" +#include +#include + +#ifdef HAVE_BLUEZ +#include +#include +#endif #include "comms.h" +#include "ui.h" // Taken from https://github.com/unbit/uwsgi/commit/b608eb1772641d525bfde268fe9d6d8d0d5efde7 #ifndef SOL_TCP @@ -158,6 +164,52 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { return sp; } + if (memcmp(pcPortName, "bt:", 3) == 0) { +#ifdef HAVE_BLUEZ + if (strlen(pcPortName) != 20) { + free(sp); + return INVALID_SERIAL_PORT; + } + char *addrstr = strndup(pcPortName + 3, 17); + + if (addrstr == NULL) { + printf("Error: malloc\n"); + free(sp); + return INVALID_SERIAL_PORT; + } + + struct sockaddr_rc addr = { 0 }; + addr.rc_family = AF_BLUETOOTH; + addr.rc_channel = (uint8_t) 1; + if (str2ba(addrstr, &addr.rc_bdaddr) != 0) { + PrintAndLogEx(ERR, "Invalid Bluetooth MAC address " _RED_("%s"), addrstr); + free(addrstr); + free(sp); + return INVALID_SERIAL_PORT; + } + int sfd = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); + if (sfd == -1) { + PrintAndLogEx(ERR, "Error opening Bluetooth socket"); + free(addrstr); + free(sp); + return INVALID_SERIAL_PORT; + } + if (connect(sfd, (struct sockaddr *)&addr, sizeof(addr)) == -1) { + PrintAndLogEx(ERR, "Error: cannot connect device " _YELLOW_("%s") " over Bluetooth", addrstr); + close(sfd); + free(addrstr); + free(sp); + return INVALID_SERIAL_PORT; + } + + sp->fd = sfd; + return sp; +#else // HAVE_BLUEZ + PrintAndLogEx(ERR, "Sorry, this client doesn't support native Bluetooth addresses"); + free(sp); + return INVALID_SERIAL_PORT; +#endif // HAVE_BLUEZ + } // The socket for abstract namespace implement. // Is local socket buffer, not a TCP or any net connection! // so, you can't connect with address like: 127.0.0.1, or any IP diff --git a/doc/bt_manual_v10.md b/doc/bt_manual_v10.md index 38f5f0d3b..c009ba025 100644 --- a/doc/bt_manual_v10.md +++ b/doc/bt_manual_v10.md @@ -102,7 +102,9 @@ http://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp #### Linux -#### (1) Connecting rdv4.0 with Bluetooth on Linux computer +#### (1) Connecting rdv4.0 with Bluetooth on Linux computer via native Bluetooth support in the client + +This requires to have compiled the client with Bluetooth support. 1. Find the MAC address of the Bluetooth add-on, named PM3_RDV4.0. @@ -114,21 +116,9 @@ Scanning ... Instead of `aa:bb:cc:dd:ee:ff`, you'll see your MAC address. -2. Bind your BT add-on MAC address to a serial port +2. Use Proxmark client with Bluetooth MAC address as bt: ```sh -sudo rfcomm bind rfcomm0 aa:bb:cc:dd:ee:ff -``` - -Replace `aa:bb:cc:dd:ee:ff` by your MAC address. - -3. The blue state LED on the add-on will keep blinking after the -connection is established. Only when the Proxmark3 client opens the -`/dev/rfcomm0` port, the blue LED turns on solid, indicating that the -connection is successful. - -4. Use Proxmark client on BT-serial port -```sh -./proxmark3 /dev/rfcomm0 +./proxmark3 bt:aa:bb:cc:dd:ee:ff ``` The first time, your OS will ask you for pairing. The default PIN is 1234. If PIN is not typed in quickly, the client might timeout. Simply @@ -172,6 +162,39 @@ turn on solid. ./proxmark3 /dev/ttyUSB0 ``` +#### (1b, deprecated) Connecting rdv4.0 with Bluetooth on Linux computer via rfcomm + +rfcomm is a deprecated tool which might be unavailable in your Linux distribution. + +1. Find the MAC address of the Bluetooth add-on, named PM3_RDV4.0. + +```sh +sudo hcitool scan +Scanning ... + aa:bb:cc:dd:ee:ff PM3_RDV4.0 +``` + +Instead of `aa:bb:cc:dd:ee:ff`, you'll see your MAC address. + +2. Bind your BT add-on MAC address to a serial port +```sh +sudo rfcomm bind rfcomm0 aa:bb:cc:dd:ee:ff +``` + +Replace `aa:bb:cc:dd:ee:ff` by your MAC address. + +3. The blue state LED on the add-on will keep blinking after the +connection is established. Only when the Proxmark3 client opens the +`/dev/rfcomm0` port, the blue LED turns on solid, indicating that the +connection is successful. + +4. Use Proxmark client on BT-serial port +```sh +./proxmark3 /dev/rfcomm0 +``` + +See instructions above (method 1) for initial pairing. + #### MacOS #### (1) Connecting rdv4.0 with Bluetooth on MacOS diff --git a/doc/md/Installation_Instructions/Linux-Installation-Instructions.md b/doc/md/Installation_Instructions/Linux-Installation-Instructions.md index b381eb7d9..8cb6b47ff 100644 --- a/doc/md/Installation_Instructions/Linux-Installation-Instructions.md +++ b/doc/md/Installation_Instructions/Linux-Installation-Instructions.md @@ -25,9 +25,11 @@ Install the requirements ```sh sudo apt-get install --no-install-recommends git ca-certificates build-essential pkg-config \ -libreadline-dev gcc-arm-none-eabi libnewlib-dev qtbase5-dev +libreadline-dev gcc-arm-none-eabi libnewlib-dev qtbase5-dev libbluetooth-dev ``` +If you don't need the native Bluetooth support in the client, you can skip the installation of `libbluetooth-dev`. + If you don't need the graphical components of the Proxmark3 client (such as in `hw tune`), you can skip the installation of `qtbase5-dev`. If you get some (non blocking) error at runtime such as _Gtk-Message: Failed to load module "canberra-gtk-module"_ you may have to install `libcanberra-gtk-module`. @@ -35,17 +37,21 @@ If you get some (non blocking) error at runtime such as _Gtk-Message: Failed to ## On ArchLinux ```sh -sudo pacman -Sy git base-devel readline arm-none-eabi-gcc arm-none-eabi-newlib qt5-base --needed +sudo pacman -Sy git base-devel readline arm-none-eabi-gcc arm-none-eabi-newlib qt5-base bluez --needed ``` +If you don't need the native Bluetooth support in the client, you can skip the installation of `bluez`. + If you don't need the graphical components of the Proxmark3 client (such as in `hw tune`), you can skip the installation of `qt5-base`. ## On Fedora ```sh -sudo dnf install git make gcc gcc-c++ arm-none-eabi-gcc-cs arm-none-eabi-newlib readline-devel qt5-qtbase-devel libatomic +sudo dnf install git make gcc gcc-c++ arm-none-eabi-gcc-cs arm-none-eabi-newlib readline-devel qt5-qtbase-devel bluez-libs-devel libatomic ``` +If you don't need the native Bluetooth support in the client, you can skip the installation of `bluez-libs-devel`. + If you don't need the graphical components of the Proxmark3 client (such as in `hw tune`), you can skip the installation of `qt5-qtbase-devel`. ## On openSUSE @@ -56,6 +62,8 @@ sudo zypper install git patterns-devel-base-devel_basis gcc-c++ readline-devel c If you don't need the graphical components of the Proxmark3 client (such as in `hw tune`), you can skip the installation of `libqt5-qtbase-devel`. +Note that Bluez is not available on openSUSE so the native Bluetooth support won't be available in the client. + # Clone the RRG/Iceman repository ```sh diff --git a/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md b/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md index 5e953883a..46e1c6504 100644 --- a/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md +++ b/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md @@ -19,6 +19,14 @@ make clean make SKIPQT=1 ``` +On Linux hosts, if the Bluez headers and library are present, the client will be compiled with native Bluetooth support. It's possible to explicitly skip Bluetooth support with: + +``` +make clean +make SKIPBT=1 +``` + + ## Firmware By default, the firmware is of course tuned for the Proxmark3 Rdv4.0 device, which has built-in support for 256kb onboard flash SPI memory, Sim module (smart card support), FPC connector. From 4c085245c5acfce7fb13ae07074ae44be887ebdc Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 29 Apr 2020 15:15:25 +0200 Subject: [PATCH 019/632] pm3 for direct bt devices --- pm3 | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/pm3 b/pm3 index 2b2258b50..a91fced11 100755 --- a/pm3 +++ b/pm3 @@ -2,10 +2,12 @@ # Usage: run option -h to get help -# BT auto detection: only working under Linux at the moment +# BT auto detection # Shall we look for white HC-06-USB dongle ? FINDBTDONGLE=true # Shall we look for rfcomm interface ? +FINDBTRFCOMM=true +# Shall we look for registered BT device ? (Linux only) FINDBTDIRECT=true PM3PATH=$(dirname "$0") @@ -47,12 +49,13 @@ function get_pm3_list_Linux { fi done fi - if $FINDBTDIRECT; then + if $FINDBTRFCOMM; then # check if the MAC of a Proxmark3 was bound to a local rfcomm interface + # (on OSes without deprecated rfcomm and hcitool, the loop will be simply skipped) for DEVMAC in $(rfcomm -a 2>/dev/null | grep " 20:19:0[45]" | sed 's/^\(.*\): \([0-9:]*\) .*/\1@\2/'); do DEV=${DEVMAC/@*/} MAC=${DEVMAC/*@/} - # check if Proxmark3 is actually present + # check which are Proxmark3 and, side-effect, if they're actually present if hcitool name "$MAC" | grep -q "PM3"; then PM3LIST+=("/dev/$DEV") if [ ${#PM3LIST[*]} -ge $N ]; then @@ -61,6 +64,15 @@ function get_pm3_list_Linux { fi done fi + if $FINDBTDIRECT; then + # check if the MAC of a Proxmark3 was registered in the known devices + MACS=() + for MAC in $(dbus-send --system --print-reply --type=method_call --dest='org.bluez' '/' org.freedesktop.DBus.ObjectManager.GetManagedObjects|\ + awk '/"Address"/{getline;gsub(/"/,"",$3);a=$3}/Name/{getline;if (/PM3_RDV4/) print a}'); do + PM3LIST+=("bt:$MAC") + done + # we don't probe the device so there is no guarantee the device is actually present + fi } function get_pm3_list_macOS { @@ -81,7 +93,7 @@ function get_pm3_list_Windows { PM3LIST=() # Need to look for this first, the call to Win32_serialport "crashes" then native bt serial port. Don't ask why. #BT direct SERIAL PORTS (COM) - if $FINDBTDIRECT; then + if $FINDBTRFCOMM; then for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_PnPEntity | Where-Object Caption -like 'Standard Serial over Bluetooth link (COM*' | Select Name" 2> /dev/null | awk '$0 ~ /COM/{print substr($6,2,4)}'); do DEV=${DEV/ */} PM3LIST+=("$DEV") @@ -118,7 +130,7 @@ function get_pm3_list_WSL { # Need to look for this first, the call to Win32_serialport "crashes" then native bt serial port. Don't ask why. #BT direct SERIAL PORTS (COM) - if $FINDBTDIRECT; then + if $FINDBTRFCOMM; then for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_PnPEntity | Where-Object Caption -like 'Standard Serial over Bluetooth link (COM*' | Select Name" 2> /dev/null | awk '$0 ~ /COM/{print substr($6,2,4)}'); do DEV=${DEV/ */} @@ -201,6 +213,7 @@ EOF } elif [ "$SCRIPT" = "pm3-flash" ]; then FINDBTDONGLE=false + FINDBTRFCOMM=false FINDBTDIRECT=false CMD() { ARGS=("--port" "$1" "--flash") @@ -238,6 +251,7 @@ EOF } elif [ "$SCRIPT" = "pm3-flash-all" ]; then FINDBTDONGLE=false + FINDBTRFCOMM=false FINDBTDIRECT=false CMD() { $CLIENT "--port" "$1" "--flash" "--unlock-bootloader" "--image" "$BOOTIMAGE" "--image" "$FULLIMAGE"; } HELP() { @@ -257,6 +271,7 @@ EOF } elif [ "$SCRIPT" = "pm3-flash-fullimage" ]; then FINDBTDONGLE=false + FINDBTRFCOMM=false FINDBTDIRECT=false CMD() { $CLIENT "--port" "$1" "--flash" "--image" "$FULLIMAGE"; } HELP() { @@ -276,6 +291,7 @@ EOF } elif [ "$SCRIPT" = "pm3-flash-bootrom" ]; then FINDBTDONGLE=false + FINDBTRFCOMM=false FINDBTDIRECT=false CMD() { $CLIENT "--port" "$1" "--flash" "--unlock-bootloader" "--image" "$BOOTIMAGE"; } HELP() { From ba08d5794c55d48efcfd0e03afc6fde3bf81c03e Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 29 Apr 2020 15:29:34 +0200 Subject: [PATCH 020/632] silent err if dbus absent --- pm3 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pm3 b/pm3 index a91fced11..4af441c40 100755 --- a/pm3 +++ b/pm3 @@ -67,7 +67,7 @@ function get_pm3_list_Linux { if $FINDBTDIRECT; then # check if the MAC of a Proxmark3 was registered in the known devices MACS=() - for MAC in $(dbus-send --system --print-reply --type=method_call --dest='org.bluez' '/' org.freedesktop.DBus.ObjectManager.GetManagedObjects|\ + for MAC in $(dbus-send --system --print-reply --type=method_call --dest='org.bluez' '/' org.freedesktop.DBus.ObjectManager.GetManagedObjects 2>/dev/null|\ awk '/"Address"/{getline;gsub(/"/,"",$3);a=$3}/Name/{getline;if (/PM3_RDV4/) print a}'); do PM3LIST+=("bt:$MAC") done From 536338584570dd35535f0fdd08806c4e0fa6c287 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 29 Apr 2020 16:35:08 +0200 Subject: [PATCH 021/632] coverity fix 286655 --- client/src/cmdhfmfdes.c | 233 +++++++++++++++++++--------------------- 1 file changed, 112 insertions(+), 121 deletions(-) diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index f70e91326..be5975049 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -925,7 +925,7 @@ void AuthToError(int error) { PrintAndLogEx(ERR, "Authentication failed. Invalid key number."); break; case 4: - PrintAndLogEx(ERR, "Authentication failed. Length of answer %d doesn't match algo length %d."); + PrintAndLogEx(ERR, "Authentication failed. Length of answer doesn't match algo length"); break; case 5: PrintAndLogEx(ERR, "mbedtls_aes_setkey_dec failed"); @@ -3161,6 +3161,7 @@ static int DecodeFileSettings(uint8_t *src, int src_len, int maclen) { static int CmdHF14ADesDump(const char *Cmd) { (void)Cmd; // Cmd is not used so far DropField(); + uint8_t aid[3] = {0}; uint8_t app_ids[78] = {0}; uint8_t app_ids_len = 0; @@ -3205,106 +3206,120 @@ static int CmdHF14ADesDump(const char *Cmd) { uint8_t num_keys = 0; uint8_t key_setting = 0; res = handler_desfire_keysettings(&key_setting, &num_keys); - if (res != PM3_SUCCESS) return res; + if (res != PM3_SUCCESS) continue; res = handler_desfire_select_application(aid); + if (res != PM3_SUCCESS) continue; - if (handler_desfire_fileids(file_ids, &file_ids_len) == PM3_SUCCESS) { - for (int j = file_ids_len - 1; j >= 0; j--) { - PrintAndLogEx(SUCCESS, "\n\n Fileid %d (0x%02x)", file_ids[j], file_ids[j]); + res = handler_desfire_fileids(file_ids, &file_ids_len); + if (res != PM3_SUCCESS) continue; - uint8_t filesettings[20] = {0}; - int fileset_len = 0; + for (int j = file_ids_len - 1; j >= 0; j--) { + PrintAndLogEx(SUCCESS, "\n\n Fileid %d (0x%02x)", file_ids[j], file_ids[j]); - res = handler_desfire_filesettings(file_ids[j], filesettings, &fileset_len); - int maclen = 0; // To be implemented + uint8_t filesettings[20] = {0}; + int fileset_len = 0; + res = handler_desfire_filesettings(file_ids[j], filesettings, &fileset_len); + if (res != PM3_SUCCESS) continue; + + int maclen = 0; // To be implemented + + if (fileset_len == 1 + 1 + 2 + 3 + maclen) { + int filesize = (filesettings[6] << 16) + (filesettings[5] << 8) + filesettings[4]; + mfdes_data_t fdata; + fdata.fileno = file_ids[j]; + memset(fdata.offset, 0, 3); + memset(fdata.length, 0, 3); + + uint8_t *data = (uint8_t *)calloc(filesize, sizeof(uint8_t)); + if (data == NULL) { + DropField(); + return PM3_EMALLOC; + } + + fdata.data = data; + res = handler_desfire_readdata(&fdata, MFDES_DATA_FILE); if (res == PM3_SUCCESS) { - //if (DecodeFileSettings(filesettings, fileset_len, maclen) != PM3_SUCCESS) { - if (fileset_len == 1 + 1 + 2 + 3 + maclen) { - int filesize = (filesettings[6] << 16) + (filesettings[5] << 8) + filesettings[4]; - mfdes_data_t fdata; - fdata.fileno = file_ids[j]; - memset(fdata.offset, 0, 3); - //memcpy(fdata.length,&filesettings[4],3); - memset(fdata.length, 0, 3); - uint8_t *data = (uint8_t *)malloc(filesize); - fdata.data = data; - if (data) { - res = handler_desfire_readdata(&fdata, MFDES_DATA_FILE); - if (res == PM3_SUCCESS) { - PrintAndLogEx(NORMAL, "\nOffset | Data | Ascii"); - PrintAndLogEx(NORMAL, "----------------------------------------------------------------------------"); - int len = le24toh(fdata.length); - for (int n = 0; n < len; n += 16) { - PrintAndLogEx(NORMAL, "%02d/0x%02X | %s| %s", n, n, sprint_hex(&fdata.data[n], len > 16 ? 16 : len), sprint_ascii(&fdata.data[n], len > 16 ? 16 : len)); - } - free(data); - } else { - PrintAndLogEx(ERR, "Couldn't read value. Error %d", res); - res = handler_desfire_select_application(aid); - } - } - } else if (fileset_len == 1 + 1 + 2 + 4 + 4 + 4 + 1 + maclen) { - PrintAndLogEx(NORMAL, "\n\nValue file: 0x%0x", file_ids[j]); - mfdes_value_t value; - value.fileno = file_ids[j]; - int len = 0; - res = handler_desfire_getvalue(&value, &len); - if (res == PM3_SUCCESS) { - PrintAndLogEx(NORMAL, "\nOffset | Value | Ascii"); - PrintAndLogEx(NORMAL, "----------------------------------------------------------------------------"); - for (int n = 0; n < len; n += 16) { - PrintAndLogEx(NORMAL, "%02d/0x%02X | %s| %s", n, n, sprint_hex(&value.value[n], len > 16 ? 16 : len), sprint_ascii(&value.value[n], len > 16 ? 16 : len)); - } - } else { - PrintAndLogEx(ERR, "Couldn't read value. Error %d", res); - res = handler_desfire_select_application(aid); - } - } else if (fileset_len == 1 + 1 + 2 + 3 + 3 + 3 + maclen) { - int maxrecords = (filesettings[9] << 16) + (filesettings[8] << 8) + filesettings[7]; - int filesize = (filesettings[6] << 16) + (filesettings[5] << 8) + filesettings[4]; - mfdes_data_t fdata; - fdata.fileno = file_ids[j]; - memset(fdata.length, 0, 3); - //memcpy(fdata.length,&filesettings[4],3); - uint8_t *data = (uint8_t *)malloc(filesize); - fdata.data = data; - if (data) { - for (int offset = 0; offset < maxrecords; offset++) { - PrintAndLogEx(NORMAL, "\n\nRecord offset: %024x", offset); - memset(data, 0, filesize); - fdata.offset[0] = offset & 0xFF; - fdata.offset[1] = (offset >> 8) & 0xFF; - fdata.offset[2] = (offset >> 16) & 0xFF; - res = handler_desfire_readdata(&fdata, MFDES_RECORD_FILE); - if (res == PM3_SUCCESS) { - PrintAndLogEx(NORMAL, "\nOffset | Data | Ascii"); - PrintAndLogEx(NORMAL, "----------------------------------------------------------------------------"); - int len = le24toh(fdata.length); - for (int n = 0; n < len; n += 16) { - PrintAndLogEx(NORMAL, "%02d/0x%02X | %s| %s", n, n, sprint_hex(&fdata.data[n], len > 16 ? 16 : len), sprint_ascii(&fdata.data[n], len > 16 ? 16 : len)); - } - } else { - res = handler_desfire_select_application(aid); - } - } - free(data); - } + PrintAndLogEx(NORMAL, "\nOffset | Data | Ascii"); + PrintAndLogEx(NORMAL, "----------------------------------------------------------------------------"); + int len = le24toh(fdata.length); + for (int n = 0; n < len; n += 16) { + PrintAndLogEx(NORMAL, "%02d/0x%02X | %s| %s", n, n, sprint_hex(&fdata.data[n], len > 16 ? 16 : len), sprint_ascii(&fdata.data[n], len > 16 ? 16 : len)); + } + } else { + PrintAndLogEx(ERR, "Couldn't read value. Error %d", res); + res = handler_desfire_select_application(aid); + if (res != PM3_SUCCESS) continue; + } + + free(data); + + } else if (fileset_len == 1 + 1 + 2 + 4 + 4 + 4 + 1 + maclen) { + PrintAndLogEx(NORMAL, "\n\nValue file: 0x%0x", file_ids[j]); + mfdes_value_t value; + value.fileno = file_ids[j]; + int len = 0; + res = handler_desfire_getvalue(&value, &len); + if (res == PM3_SUCCESS) { + PrintAndLogEx(NORMAL, "\nOffset | Value | Ascii"); + PrintAndLogEx(NORMAL, "----------------------------------------------------------------------------"); + for (int n = 0; n < len; n += 16) { + PrintAndLogEx(NORMAL, "%02d/0x%02X | %s| %s", n, n, sprint_hex(&value.value[n], len > 16 ? 16 : len), sprint_ascii(&value.value[n], len > 16 ? 16 : len)); + } + } else { + PrintAndLogEx(ERR, "Couldn't read value. Error %d", res); + res = handler_desfire_select_application(aid); + if (res != PM3_SUCCESS) continue; + } + + } else if (fileset_len == 1 + 1 + 2 + 3 + 3 + 3 + maclen) { + int maxrecords = (filesettings[9] << 16) + (filesettings[8] << 8) + filesettings[7]; + int filesize = (filesettings[6] << 16) + (filesettings[5] << 8) + filesettings[4]; + mfdes_data_t fdata; + fdata.fileno = file_ids[j]; + memset(fdata.length, 0, 3); + uint8_t *data = (uint8_t *)calloc(filesize, sizeof(uint8_t)); + if (data == NULL) { + DropField(); + return PM3_EMALLOC; + } + + fdata.data = data; + for (int offset = 0; offset < maxrecords; offset++) { + PrintAndLogEx(NORMAL, "\n\nRecord offset: %024x", offset); + memset(data, 0, filesize); + fdata.offset[0] = offset & 0xFF; + fdata.offset[1] = (offset >> 8) & 0xFF; + fdata.offset[2] = (offset >> 16) & 0xFF; + res = handler_desfire_readdata(&fdata, MFDES_RECORD_FILE); + if (res == PM3_SUCCESS) { + PrintAndLogEx(NORMAL, "\nOffset | Data | Ascii"); + PrintAndLogEx(NORMAL, "----------------------------------------------------------------------------"); + int len = le24toh(fdata.length); + for (int n = 0; n < len; n += 16) { + PrintAndLogEx(NORMAL, "%02d/0x%02X | %s| %s", n, n, sprint_hex(&fdata.data[n], len > 16 ? 16 : len), sprint_ascii(&fdata.data[n], len > 16 ? 16 : len)); + } + } else { + res = handler_desfire_select_application(aid); + if (res != PM3_SUCCESS) continue; } } + free(data); } } } + PrintAndLogEx(INFO, "-------------------------------------------------------------"); DropField(); return PM3_SUCCESS; } static int CmdHF14ADesEnumApplications(const char *Cmd) { + (void)Cmd; // Cmd is not used so far DropField(); -// uint8_t isOK = 0x00; + uint8_t aid[3] = {0}; uint8_t app_ids[78] = {0}; uint8_t app_ids_len = 0; @@ -3315,8 +3330,6 @@ static int CmdHF14ADesEnumApplications(const char *Cmd) { dfname_t dfnames[255]; uint8_t dfname_count = 0; - int res = 0; - if (handler_desfire_appids(app_ids, &app_ids_len) != PM3_SUCCESS) { PrintAndLogEx(ERR, "Can't get list of applications on tag"); DropField(); @@ -3356,53 +3369,31 @@ static int CmdHF14ADesEnumApplications(const char *Cmd) { } } - res = getKeySettings(aid); - if (res != PM3_SUCCESS) return res; + int res = getKeySettings(aid); + if (res != PM3_SUCCESS) continue; res = handler_desfire_select_application(aid); + if (res != PM3_SUCCESS) continue; + res = handler_desfire_fileids(file_ids, &file_ids_len); + if (res != PM3_SUCCESS) continue; - // Get File IDs - if (handler_desfire_fileids(file_ids, &file_ids_len) == PM3_SUCCESS) { - PrintAndLogEx(SUCCESS, " Tag report " _GREEN_("%d") " file%c", file_ids_len, (file_ids_len == 1) ? ' ' : 's'); - for (int j = file_ids_len - 1; j >= 0; j--) { - PrintAndLogEx(SUCCESS, " Fileid %d (0x%02x)", file_ids[j], file_ids[j]); + PrintAndLogEx(SUCCESS, " Tag report " _GREEN_("%d") " file%c", file_ids_len, (file_ids_len == 1) ? ' ' : 's'); + for (int j = file_ids_len - 1; j >= 0; j--) { + PrintAndLogEx(SUCCESS, " Fileid %d (0x%02x)", file_ids[j], file_ids[j]); - uint8_t filesettings[20] = {0}; - int fileset_len = 0; - int maclen = 0; // To be implemented + uint8_t filesettings[20] = {0}; + int fileset_len = 0; + int maclen = 0; // To be implemented - res = handler_desfire_filesettings(file_ids[j], filesettings, &fileset_len); - if (res == PM3_SUCCESS) { - if (DecodeFileSettings(filesettings, fileset_len, maclen) != PM3_SUCCESS) { - PrintAndLogEx(INFO, " Settings [%u] %s", fileset_len, sprint_hex(filesettings, fileset_len)); - } - } + res = handler_desfire_filesettings(file_ids[j], filesettings, &fileset_len); + if (res != PM3_SUCCESS) continue; + + if (DecodeFileSettings(filesettings, fileset_len, maclen) != PM3_SUCCESS) { + PrintAndLogEx(INFO, " Settings [%u] %s", fileset_len, sprint_hex(filesettings, fileset_len)); } } - /* - // Get ISO File IDs - { - uint8_t data[] = {GET_ISOFILE_IDS, 0x00, 0x00, 0x00}; // 0x61 - SendCommandMIX(CMD_HF_DESFIRE_COMMAND, DISCONNECT, sizeof(data), 0, data, sizeof(data)); - } - - if (!WaitForResponseTimeout(CMD_ACK, &respFiles, 1500)) { - PrintAndLogEx(WARNING, _RED_(" Timed-out")); - continue; - } else { - isOK = respFiles.data.asBytes[2] & 0xff; - if (!isOK) { - PrintAndLogEx(WARNING, _RED_(" Can't get ISO file ids")); - } else { - int respfileLen = resp.oldarg[1] - 3 - 2; - for (int j = 0; j < respfileLen; ++j) { - PrintAndLogEx(SUCCESS, " ISO Fileid %d :", resp.data.asBytes[j + 3]); - } - } - } - */ } PrintAndLogEx(INFO, "-------------------------------------------------------------"); DropField(); From 4c640805b6be011724950674363e1fd67af4cb52 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 29 Apr 2020 16:57:52 +0200 Subject: [PATCH 022/632] coverity fix: 267208 --- armsrc/hitag2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/armsrc/hitag2.c b/armsrc/hitag2.c index 7e4c7ca14..1c045c5e8 100644 --- a/armsrc/hitag2.c +++ b/armsrc/hitag2.c @@ -1062,7 +1062,7 @@ void SimulateHitag2(bool tag_mem_supplied, uint8_t *data) { lf_init(false, true); int response = 0; - uint8_t rx[HITAG_FRAME_LEN]; + uint8_t rx[HITAG_FRAME_LEN] = {0}; size_t rxlen = 0; uint8_t tx[HITAG_FRAME_LEN]; size_t txlen = 0; From 85f223316151284916bbcb02b667ed6fb21c51d4 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 29 Apr 2020 17:27:17 +0200 Subject: [PATCH 023/632] coverity fix 226496 226492 226490 --- client/deps/hardnested/hardnested_bf_core.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/deps/hardnested/hardnested_bf_core.c b/client/deps/hardnested/hardnested_bf_core.c index 4e30dd894..45a996879 100644 --- a/client/deps/hardnested/hardnested_bf_core.c +++ b/client/deps/hardnested/hardnested_bf_core.c @@ -324,7 +324,7 @@ uint64_t CRACK_STATES_BITSLICED(uint32_t cuid, uint8_t *best_first_bytes, statel crypto1_bs_f20b_2[0] = f20b(state_p[47 - 25].value, state_p[47 - 27].value, state_p[47 - 29].value, state_p[47 - 31].value); crypto1_bs_f20b_3[0] = f20b(state_p[47 - 41].value, state_p[47 - 43].value, state_p[47 - 45].value, state_p[47 - 47].value); - bitslice_value_t ksb[8]; + bitslice_value_t ksb[9]; ksb[0] = f20c(f20a(state_p[47 - 9].value, state_p[47 - 11].value, state_p[47 - 13].value, state_p[47 - 15].value), f20b(state_p[47 - 17].value, state_p[47 - 19].value, state_p[47 - 21].value, state_p[47 - 23].value), crypto1_bs_f20b_2[0], @@ -347,14 +347,14 @@ uint64_t CRACK_STATES_BITSLICED(uint32_t cuid, uint8_t *best_first_bytes, statel } // pre-compute first feedback bit vector. This is the same for all nonces - bitslice_value_t fbb[8]; + bitslice_value_t fbb[9]; fbb[0] = odd_feedback ^ bitsliced_even_feedback[block_idx]; // vector to contain test results (1 = passed, 0 = failed) bitslice_t results = bs_ones; // parity_bits - bitslice_value_t par[8]; + bitslice_value_t par[9]; par[0] = bs_zeroes.value; uint32_t next_common_bits = 0; From 250418f64bd1ab02086748c01895f5915b6b08f5 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 29 Apr 2020 19:18:01 +0200 Subject: [PATCH 024/632] client Makefile: make sure to rebuild deps when needed --- client/Makefile | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/client/Makefile b/client/Makefile index d7709f656..f62d7ab49 100644 --- a/client/Makefile +++ b/client/Makefile @@ -313,7 +313,7 @@ all-static: LDLIBS:=-static $(LDLIBS) all-static: $(BINS) proxmark3: LDLIBS+=$(LUALIB) $(JANSSONLIB) $(MBEDTLSLIB) $(CBORLIB) $(ZLIB) $(REVENGLIB) $(AMIIBOLIB) $(HARDNESTEDLIB) $(CLIPARSERLIB) $(BTLDLIBS) $(QTLDLIBS) -proxmark3: $(OBJDIR)/proxmark3.o $(COREOBJS) $(CMDOBJS) $(OBJCOBJS) $(QTGUIOBJS) $(LUALIB) $(JANSSONLIB) $(CBORLIB) $(REVENGLIB) $(MBEDTLSLIB) $(ZLIB) $(AMIIBOLIB) $(HARDNESTEDLIB) $(CLIPARSERLIB) lualibs/pm3_cmd.lua lualibs/mfc_default_keys.lua +proxmark3: $(OBJDIR)/proxmark3.o $(COREOBJS) $(CMDOBJS) $(OBJCOBJS) $(QTGUIOBJS) liblua jansson tinycbor reveng mbedtls zlib amiibo hardnested cliparser lualibs/pm3_cmd.lua lualibs/mfc_default_keys.lua $(info [=] LD $@) $(Q)$(LD) $(LDFLAGS) $(OBJDIR)/proxmark3.o $(COREOBJS) $(CMDOBJS) $(OBJCOBJS) $(QTGUIOBJS) $(LDLIBS) -o $@ @@ -373,44 +373,44 @@ tarbin: $(BINS) $(Q)$(TAR) $(TARFLAGS) ../proxmark3-$(platform)-bin.tar $(BINS:%=client/%) $(WINBINS:%=client/%) # local libraries: -$(LUALIB): - $(info [*] MAKE liblua for $(LUAPLATFORM)) +liblua: + $(info [*] MAKE $@ for $(LUAPLATFORM)) $(Q)$(MAKE) --no-print-directory -C $(LUALIBPATH) $(LUAPLATFORM) -$(JANSSONLIB): - $(info [*] MAKE jansson) +jansson: + $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C $(JANSSONLIBPATH) all -$(CBORLIB): - $(info [*] MAKE tinycbor) +tinycbor: + $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C $(CBORLIBPATH) all -$(REVENGLIB): - $(info [*] MAKE reveng) +reveng: + $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C $(REVENGPATH) all -$(HARDNESTEDLIB): - $(info [*] MAKE hardnested) +hardnested: + $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C $(HARDNESTEDPATH) all -$(AMIIBOLIB): - $(info [*] MAKE amiibo) +amiibo: + $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C $(AMIIBOLIBPATH) all -$(CLIPARSERLIB): - $(info [*] MAKE cliparser) +cliparser: + $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C $(CLIPARSERPATH) all # common libraries: -$(MBEDTLSLIB): - $(info [*] MAKE mbedtls) +mbedtls: + $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C $(MBEDTLSLIBPATH) OBJDIR=$(ROOT_DIR)$(OBJDIR) BINDIR=$(ROOT_DIR)$(OBJDIR) all -$(ZLIB): - $(info [*] MAKE zlib) +zlib: + $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C $(ZLIBPATH) OBJDIR=$(ROOT_DIR)$(OBJDIR) BINDIR=$(ROOT_DIR)$(OBJDIR) all -.PHONY: all clean install uninstall +.PHONY: all clean install uninstall tarbin liblua jansson tinycbor reveng hardnested amiibo cliparser mbedtls zlib # easy printing of MAKE VARIABLES print-%: ; @echo $* = $($*) From 155d30ce49502f2caa4d0dee267774add6f90e39 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 29 Apr 2020 19:19:26 +0200 Subject: [PATCH 025/632] coverity fix 226278 and offset computation as side effect --- armsrc/appmain.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index b05a143f0..e14319df9 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -1642,7 +1642,7 @@ static void PacketReceived(PacketCommandNG *packet) { struct p { uint8_t flag; uint16_t offset; - uint8_t *data; + uint8_t data[PM3_CMD_DATA_SIZE - sizeof(uint8_t) - sizeof(uint16_t)]; } PACKED; struct p *payload = (struct p *)packet->data.asBytes; @@ -1654,11 +1654,11 @@ static void PacketReceived(PacketCommandNG *packet) { } // 40 000 - (512-3) 509 = 39491 - uint16_t offset = MIN(BIGBUF_SIZE - PM3_CMD_DATA_SIZE - 3, payload->offset); + uint16_t offset = MIN(BIGBUF_SIZE - sizeof(payload->data), payload->offset); // need to copy len bytes of data, not PM3_CMD_DATA_SIZE - 3 - offset // ensure len bytes copied wont go past end of bigbuf - uint16_t len = MIN(BIGBUF_SIZE - offset, PM3_CMD_DATA_SIZE - 3); + uint16_t len = MIN(BIGBUF_SIZE - offset, sizeof(payload->data)); uint8_t *mem = BigBuf_get_addr(); From a626725477ae58e0e4745a771c504acb2c1b34c3 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 29 Apr 2020 19:41:10 +0200 Subject: [PATCH 026/632] lf sim: fix offset of last packet --- armsrc/appmain.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index e14319df9..2a185b394 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -1653,18 +1653,15 @@ static void PacketReceived(PacketCommandNG *packet) { BigBuf_free(); } - // 40 000 - (512-3) 509 = 39491 - uint16_t offset = MIN(BIGBUF_SIZE - sizeof(payload->data), payload->offset); + // offset should not be over buffer + uint16_t offset = MIN(BIGBUF_SIZE - 1, payload->offset); - // need to copy len bytes of data, not PM3_CMD_DATA_SIZE - 3 - offset // ensure len bytes copied wont go past end of bigbuf uint16_t len = MIN(BIGBUF_SIZE - offset, sizeof(payload->data)); uint8_t *mem = BigBuf_get_addr(); - // x + 394 memcpy(mem + offset, &payload->data, len); - // memcpy(mem + offset, &payload->data, PM3_CMD_DATA_SIZE - 3 - offset); reply_ng(CMD_LF_UPLOAD_SIM_SAMPLES, PM3_SUCCESS, NULL, 0); break; } From b3f84bf7b3459152e3bfef8e9c9928ff7ccc2236 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 29 Apr 2020 19:41:45 +0200 Subject: [PATCH 027/632] make style --- armsrc/frozen.c | 2 +- client/src/cmdhfmfdes.c | 42 +++++------ client/src/loclass/cipher.c | 98 ++++++++++++------------- client/src/mifare/desfire_crypto.c | 2 +- client/src/preferences.c | 8 +- tools/hitag2crack/crack5/ht2crack5.c | 6 +- tools/hitag2crack/crack5gpu/ht2crack5.c | 2 +- 7 files changed, 80 insertions(+), 80 deletions(-) diff --git a/armsrc/frozen.c b/armsrc/frozen.c index 6477e0602..4abd21ebf 100644 --- a/armsrc/frozen.c +++ b/armsrc/frozen.c @@ -863,7 +863,7 @@ struct json_scanf_info { int json_unescape(const char *src, int slen, char *dst, int dlen) WEAK; int json_unescape(const char *src, int slen, char *dst, int dlen) { if (dst == NULL || dlen == 0) - return JSON_STRING_INVALID; + return JSON_STRING_INVALID; char *send = (char *) src + slen; char *dend = dst + dlen; diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index be5975049..b8c2271e1 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -1900,7 +1900,7 @@ static int CmdHF14ADesCreateApp(const char *Cmd) { if (res != PM3_SUCCESS) { DropField(); return res; - } + } res = handler_desfire_createapp(&aidhdr, usename, usefid); DropField(); @@ -3245,7 +3245,7 @@ static int CmdHF14ADesDump(const char *Cmd) { PrintAndLogEx(NORMAL, "----------------------------------------------------------------------------"); int len = le24toh(fdata.length); for (int n = 0; n < len; n += 16) { - PrintAndLogEx(NORMAL, "%02d/0x%02X | %s| %s", n, n, sprint_hex(&fdata.data[n], len > 16 ? 16 : len), sprint_ascii(&fdata.data[n], len > 16 ? 16 : len)); + PrintAndLogEx(NORMAL, "%02d/0x%02X | %s| %s", n, n, sprint_hex(&fdata.data[n], len > 16 ? 16 : len), sprint_ascii(&fdata.data[n], len > 16 ? 16 : len)); } } else { PrintAndLogEx(ERR, "Couldn't read value. Error %d", res); @@ -3262,15 +3262,15 @@ static int CmdHF14ADesDump(const char *Cmd) { int len = 0; res = handler_desfire_getvalue(&value, &len); if (res == PM3_SUCCESS) { - PrintAndLogEx(NORMAL, "\nOffset | Value | Ascii"); - PrintAndLogEx(NORMAL, "----------------------------------------------------------------------------"); - for (int n = 0; n < len; n += 16) { - PrintAndLogEx(NORMAL, "%02d/0x%02X | %s| %s", n, n, sprint_hex(&value.value[n], len > 16 ? 16 : len), sprint_ascii(&value.value[n], len > 16 ? 16 : len)); - } + PrintAndLogEx(NORMAL, "\nOffset | Value | Ascii"); + PrintAndLogEx(NORMAL, "----------------------------------------------------------------------------"); + for (int n = 0; n < len; n += 16) { + PrintAndLogEx(NORMAL, "%02d/0x%02X | %s| %s", n, n, sprint_hex(&value.value[n], len > 16 ? 16 : len), sprint_ascii(&value.value[n], len > 16 ? 16 : len)); + } } else { - PrintAndLogEx(ERR, "Couldn't read value. Error %d", res); - res = handler_desfire_select_application(aid); - if (res != PM3_SUCCESS) continue; + PrintAndLogEx(ERR, "Couldn't read value. Error %d", res); + res = handler_desfire_select_application(aid); + if (res != PM3_SUCCESS) continue; } } else if (fileset_len == 1 + 1 + 2 + 3 + 3 + 3 + maclen) { @@ -3294,15 +3294,15 @@ static int CmdHF14ADesDump(const char *Cmd) { fdata.offset[2] = (offset >> 16) & 0xFF; res = handler_desfire_readdata(&fdata, MFDES_RECORD_FILE); if (res == PM3_SUCCESS) { - PrintAndLogEx(NORMAL, "\nOffset | Data | Ascii"); - PrintAndLogEx(NORMAL, "----------------------------------------------------------------------------"); - int len = le24toh(fdata.length); - for (int n = 0; n < len; n += 16) { - PrintAndLogEx(NORMAL, "%02d/0x%02X | %s| %s", n, n, sprint_hex(&fdata.data[n], len > 16 ? 16 : len), sprint_ascii(&fdata.data[n], len > 16 ? 16 : len)); - } + PrintAndLogEx(NORMAL, "\nOffset | Data | Ascii"); + PrintAndLogEx(NORMAL, "----------------------------------------------------------------------------"); + int len = le24toh(fdata.length); + for (int n = 0; n < len; n += 16) { + PrintAndLogEx(NORMAL, "%02d/0x%02X | %s| %s", n, n, sprint_hex(&fdata.data[n], len > 16 ? 16 : len), sprint_ascii(&fdata.data[n], len > 16 ? 16 : len)); + } } else { - res = handler_desfire_select_application(aid); - if (res != PM3_SUCCESS) continue; + res = handler_desfire_select_application(aid); + if (res != PM3_SUCCESS) continue; } } free(data); @@ -3586,9 +3586,9 @@ void DesFill2bPattern(uint8_t deskeyList[MAX_KEYS_LIST_LEN][8], size_t *deskeyLi } *startPattern = pt; - if ( (*deskeyListLen == MAX_KEYS_LIST_LEN) && - (*aeskeyListLen == MAX_KEYS_LIST_LEN) && - (*k3kkeyListLen == MAX_KEYS_LIST_LEN)) { + if ((*deskeyListLen == MAX_KEYS_LIST_LEN) && + (*aeskeyListLen == MAX_KEYS_LIST_LEN) && + (*k3kkeyListLen == MAX_KEYS_LIST_LEN)) { break; } } diff --git a/client/src/loclass/cipher.c b/client/src/loclass/cipher.c index af5d4f3a3..080ff66f5 100644 --- a/client/src/loclass/cipher.c +++ b/client/src/loclass/cipher.c @@ -68,17 +68,17 @@ typedef struct { * T (x 0 x 1 . . . . . . x 15 ) = x 0 ⊕ x 1 ⊕ x 5 ⊕ x 7 ⊕ x 10 ⊕ x 11 ⊕ x 14 ⊕ x 15 . **/ static bool T(State state) { -/* - bool x0 = state.t & 0x8000; - bool x1 = state.t & 0x4000; - bool x5 = state.t & 0x0400; - bool x7 = state.t & 0x0100; - bool x10 = state.t & 0x0020; - bool x11 = state.t & 0x0010; - bool x14 = state.t & 0x0002; - bool x15 = state.t & 0x0001; - return x0 ^ x1 ^ x5 ^ x7 ^ x10 ^ x11 ^ x14 ^ x15; -*/ + /* + bool x0 = state.t & 0x8000; + bool x1 = state.t & 0x4000; + bool x5 = state.t & 0x0400; + bool x7 = state.t & 0x0100; + bool x10 = state.t & 0x0020; + bool x11 = state.t & 0x0010; + bool x14 = state.t & 0x0002; + bool x15 = state.t & 0x0001; + return x0 ^ x1 ^ x5 ^ x7 ^ x10 ^ x11 ^ x14 ^ x15; + */ #define _x0 ((state.t & 0x8000) >> 15 ) #define _x1 ((state.t & 0x4000) >> 14 ) #define _x5 ((state.t & 0x0400) >> 10 ) @@ -86,7 +86,7 @@ static bool T(State state) { #define _x10 ((state.t & 0x0020) >> 5 ) #define _x11 ((state.t & 0x0010) >> 4 ) #define _x14 ((state.t & 0x0002) >> 1 ) -#define _x15 (state.t & 0x0001) +#define _x15 (state.t & 0x0001) return (_x0) ^ (_x1) ^ (_x5) ^ (_x7) ^ (_x10) ^ (_x11) ^ (_x14) ^ (_x15); } /** @@ -114,49 +114,49 @@ static bool T(State state) { * z 2 = (r 3 ∧ r 5 ) ⊕ (r 4 ∧ r 6 ) ⊕ r 7 ⊕ x **/ static uint8_t _select(bool x, bool y, uint8_t r) { - #define _r0 ((r >> 7) & 0x01) - #define _r1 ((r >> 6) & 0x01) - #define _r2 ((r >> 5) & 0x01) - #define _r3 ((r >> 4) & 0x01) - #define _r4 ((r >> 3) & 0x01) - #define _r5 ((r >> 2) & 0x01) - #define _r6 ((r >> 1) & 0x01) - #define _r7 (r & 0x01) +#define _r0 ((r >> 7) & 0x01) +#define _r1 ((r >> 6) & 0x01) +#define _r2 ((r >> 5) & 0x01) +#define _r3 ((r >> 4) & 0x01) +#define _r4 ((r >> 3) & 0x01) +#define _r5 ((r >> 2) & 0x01) +#define _r6 ((r >> 1) & 0x01) +#define _r7 (r & 0x01) - #define _z0 ( (_r0 & _r2) ^ ( _r1 & (!_r3)) ^ (_r2 | _r4) ) - #define _z1 ( (_r0 | _r2) ^ ( _r5 | _r7) ^_r1 ^ _r6 ^ x ^ y ) - #define _z2 ( (_r3 & (!_r5)) ^ (_r4 & _r6) ^ _r7 ^ x ) +#define _z0 ( (_r0 & _r2) ^ ( _r1 & (!_r3)) ^ (_r2 | _r4) ) +#define _z1 ( (_r0 | _r2) ^ ( _r5 | _r7) ^_r1 ^ _r6 ^ x ^ y ) +#define _z2 ( (_r3 & (!_r5)) ^ (_r4 & _r6) ^ _r7 ^ x ) -/* - uint8_t r0 = r >> 7 & 0x1; - uint8_t r1 = r >> 6 & 0x1; - uint8_t r2 = r >> 5 & 0x1; - uint8_t r3 = r >> 4 & 0x1; - uint8_t r4 = r >> 3 & 0x1; - uint8_t r5 = r >> 2 & 0x1; - uint8_t r6 = r >> 1 & 0x1; - uint8_t r7 = r & 0x1; + /* + uint8_t r0 = r >> 7 & 0x1; + uint8_t r1 = r >> 6 & 0x1; + uint8_t r2 = r >> 5 & 0x1; + uint8_t r3 = r >> 4 & 0x1; + uint8_t r4 = r >> 3 & 0x1; + uint8_t r5 = r >> 2 & 0x1; + uint8_t r6 = r >> 1 & 0x1; + uint8_t r7 = r & 0x1; - bool z0 = (r0 & r2) ^ (r1 & (!r3)) ^ (r2 | r4); - bool z1 = (r0 | r2) ^ (r5 | r7) ^ r1 ^ r6 ^ x ^ y; - bool z2 = (r3 & (!r5)) ^ (r4 & r6) ^ r7 ^ x; + bool z0 = (r0 & r2) ^ (r1 & (!r3)) ^ (r2 | r4); + bool z1 = (r0 | r2) ^ (r5 | r7) ^ r1 ^ r6 ^ x ^ y; + bool z2 = (r3 & (!r5)) ^ (r4 & r6) ^ r7 ^ x; - // The three bitz z0.. z1 are packed into a uint8_t: - // 00000ZZZ - //Return value is a uint8_t - return ((z0 << 2) & 4) | ((z1 << 1) & 2) | (z2 & 1); -*/ - return ((_z0 << 2) & 4) | ((_z1 << 1) & 2) | (_z2 & 1); + // The three bitz z0.. z1 are packed into a uint8_t: + // 00000ZZZ + //Return value is a uint8_t + return ((z0 << 2) & 4) | ((z1 << 1) & 2) | (z2 & 1); + */ + return ((_z0 << 2) & 4) | ((_z1 << 1) & 2) | (_z2 & 1); -/* - uint8_t retval = 0; - retval |= (z0 << 2) & 4; - retval |= (z1 << 1) & 2; - retval |= (z2) & 1; + /* + uint8_t retval = 0; + retval |= (z0 << 2) & 4; + retval |= (z1 << 1) & 2; + retval |= (z2) & 1; - // Return value 0 <= retval <= 7 - return retval; -*/ + // Return value 0 <= retval <= 7 + return retval; + */ } /** diff --git a/client/src/mifare/desfire_crypto.c b/client/src/mifare/desfire_crypto.c index a0e066b44..2cb9d7c3a 100644 --- a/client/src/mifare/desfire_crypto.c +++ b/client/src/mifare/desfire_crypto.c @@ -282,7 +282,7 @@ void cmac_generate_subkeys(desfirekey_t key) { void cmac(const desfirekey_t key, uint8_t *ivect, const uint8_t *data, size_t len, uint8_t *cmac) { int kbs = key_block_size(key); if (kbs == 0) { - return; + return; } uint8_t *buffer = malloc(padded_data_length(len, kbs)); diff --git a/client/src/preferences.c b/client/src/preferences.c index b0534a671..4f92eb06e 100644 --- a/client/src/preferences.c +++ b/client/src/preferences.c @@ -95,7 +95,7 @@ int preferences_load(void) { size_t dummyDL = 0x00; // to better control json cant find file error msg. - char* fn = prefGetFilename(); + char *fn = prefGetFilename(); if (fileExists(fn)) { PrintAndLogEx(INFO, "Loading Preferences..."); if (loadFileJSON(fn, &dummyData, sizeof(dummyData), &dummyDL) == PM3_SUCCESS) { @@ -115,11 +115,11 @@ int preferences_save(void) { PrintAndLogEx(INFO, "Saving Preferences..."); - char* fn = prefGetFilename(); + char *fn = prefGetFilename(); int fnLen = strlen(fn) + 5; // .bak\0 // [FILENAME_MAX+sizeof(preferencesFilename)+10] - char* backupFilename = (char *)calloc(fnLen, sizeof(uint8_t)); + char *backupFilename = (char *)calloc(fnLen, sizeof(uint8_t)); if (backupFilename == NULL) { PrintAndLogEx(ERR, "failed to allocate memory"); free(fn); @@ -916,7 +916,7 @@ int CmdPrefSet(const char *Cmd) { static int CmdPrefShow(const char *Cmd) { - char* fn = prefGetFilename(); + char *fn = prefGetFilename(); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, _CYAN_("Preferences loaded from %s"), fn); diff --git a/tools/hitag2crack/crack5/ht2crack5.c b/tools/hitag2crack/crack5/ht2crack5.c index 79557bbfd..7f10ccd6b 100644 --- a/tools/hitag2crack/crack5/ht2crack5.c +++ b/tools/hitag2crack/crack5/ht2crack5.c @@ -117,9 +117,9 @@ int main(int argc, char *argv[]) { uint32_t target = 0; #ifndef __WIN32 - thread_count = sysconf(_SC_NPROCESSORS_CONF); - if ( thread_count < 2) - thread_count = 2; + thread_count = sysconf(_SC_NPROCESSORS_CONF); + if (thread_count < 2) + thread_count = 2; #endif /* _WIN32 */ diff --git a/tools/hitag2crack/crack5gpu/ht2crack5.c b/tools/hitag2crack/crack5gpu/ht2crack5.c index adaf1ae82..cfacecc98 100644 --- a/tools/hitag2crack/crack5gpu/ht2crack5.c +++ b/tools/hitag2crack/crack5gpu/ht2crack5.c @@ -236,7 +236,7 @@ int main(int argc, char *argv[]) { for (size_t i0 = 0; i0 < 1 << 20; i0++) { uint64_t state0 = expand(0x5806b4a2d16c, i0); - if (f(state0) == target >> 31 ) { + if (f(state0) == target >> 31) { // cf kernel, state is now split in 3 shorts >> 2 candidates[(layer_0_found * 3) + 0] = (uint16_t)((state0 >> (32 + 2)) & 0xffff); candidates[(layer_0_found * 3) + 1] = (uint16_t)((state0 >> (16 + 2)) & 0xffff); From 1410d4d9b5cd63f3b4a116d82220a3c767c4048b Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 29 Apr 2020 20:07:04 +0200 Subject: [PATCH 028/632] lf sim: better to return err on faulty offset, thanks @iceman --- armsrc/appmain.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 2a185b394..abfe6a86e 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -1654,14 +1654,16 @@ static void PacketReceived(PacketCommandNG *packet) { } // offset should not be over buffer - uint16_t offset = MIN(BIGBUF_SIZE - 1, payload->offset); - + if (payload->offset >= BIGBUF_SIZE) { + reply_ng(CMD_LF_UPLOAD_SIM_SAMPLES, PM3_EOVFLOW, NULL, 0); + break; + } // ensure len bytes copied wont go past end of bigbuf - uint16_t len = MIN(BIGBUF_SIZE - offset, sizeof(payload->data)); + uint16_t len = MIN(BIGBUF_SIZE - payload->offset, sizeof(payload->data)); uint8_t *mem = BigBuf_get_addr(); - memcpy(mem + offset, &payload->data, len); + memcpy(mem + payload->offset, &payload->data, len); reply_ng(CMD_LF_UPLOAD_SIM_SAMPLES, PM3_SUCCESS, NULL, 0); break; } From f1f3742333dad729b342aee2dca164a6e8d0298f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 29 Apr 2020 20:09:23 +0200 Subject: [PATCH 029/632] coverity fix 279922 --- armsrc/desfire_crypto.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/armsrc/desfire_crypto.c b/armsrc/desfire_crypto.c index 99bb54743..db543bbe6 100644 --- a/armsrc/desfire_crypto.c +++ b/armsrc/desfire_crypto.c @@ -36,6 +36,7 @@ #include "printf.h" #include "iso14443a.h" #include "dbprint.h" +#include "BigBuf.h" #ifndef AddCrc14A # define AddCrc14A(data, len) compute_crc(CRC_14443_A, (data), (len), (data)+(len), (data)+(len)+1) @@ -282,7 +283,10 @@ void cmac_generate_subkeys(desfirekey_t key) { void cmac(const desfirekey_t key, uint8_t *ivect, const uint8_t *data, size_t len, uint8_t *cmac) { int kbs = key_block_size(key); - uint8_t *buffer = malloc(padded_data_length(len, kbs)); + if (kbs == 0) + return; + + uint8_t *buffer = BigBuf_malloc(padded_data_length(len, kbs)); memcpy(buffer, data, len); @@ -299,7 +303,7 @@ void cmac(const desfirekey_t key, uint8_t *ivect, const uint8_t *data, size_t le mifare_cypher_blocks_chained(NULL, key, ivect, buffer, len, MCD_SEND, MCO_ENCYPHER); memcpy(cmac, ivect, kbs); - free(buffer); + //free(buffer); } size_t key_block_size(const desfirekey_t key) { @@ -538,7 +542,7 @@ void *mifare_cryto_postprocess_data(desfiretag_t tag, void *data, size_t *nbytes } size_t edl = enciphered_data_length(tag, *nbytes - 1, communication_settings); - edata = malloc(edl); + edata = BigBuf_malloc(edl); memcpy(edata, data, *nbytes - 1); memset((uint8_t *)edata + *nbytes - 1, 0, edl - *nbytes + 1); From 07f41da74d12f1bf8a58b3b7dad89d00c9651d2b Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 29 Apr 2020 20:11:32 +0200 Subject: [PATCH 030/632] fix coverity 226490 even if in practice next_common_bits is never > 7 --- client/deps/hardnested/hardnested_bf_core.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/deps/hardnested/hardnested_bf_core.c b/client/deps/hardnested/hardnested_bf_core.c index 45a996879..9402d9684 100644 --- a/client/deps/hardnested/hardnested_bf_core.c +++ b/client/deps/hardnested/hardnested_bf_core.c @@ -324,7 +324,7 @@ uint64_t CRACK_STATES_BITSLICED(uint32_t cuid, uint8_t *best_first_bytes, statel crypto1_bs_f20b_2[0] = f20b(state_p[47 - 25].value, state_p[47 - 27].value, state_p[47 - 29].value, state_p[47 - 31].value); crypto1_bs_f20b_3[0] = f20b(state_p[47 - 41].value, state_p[47 - 43].value, state_p[47 - 45].value, state_p[47 - 47].value); - bitslice_value_t ksb[9]; + bitslice_value_t ksb[8]; ksb[0] = f20c(f20a(state_p[47 - 9].value, state_p[47 - 11].value, state_p[47 - 13].value, state_p[47 - 15].value), f20b(state_p[47 - 17].value, state_p[47 - 19].value, state_p[47 - 21].value, state_p[47 - 23].value), crypto1_bs_f20b_2[0], @@ -347,14 +347,14 @@ uint64_t CRACK_STATES_BITSLICED(uint32_t cuid, uint8_t *best_first_bytes, statel } // pre-compute first feedback bit vector. This is the same for all nonces - bitslice_value_t fbb[9]; + bitslice_value_t fbb[8]; fbb[0] = odd_feedback ^ bitsliced_even_feedback[block_idx]; // vector to contain test results (1 = passed, 0 = failed) bitslice_t results = bs_ones; // parity_bits - bitslice_value_t par[9]; + bitslice_value_t par[8]; par[0] = bs_zeroes.value; uint32_t next_common_bits = 0; @@ -468,7 +468,7 @@ uint64_t CRACK_STATES_BITSLICED(uint32_t cuid, uint8_t *best_first_bytes, statel } // remember feedback and keystream vectors for later use uint8_t bit = KEYSTREAM_SIZE - ks_idx; - if (bit <= next_common_bits) { // if needed and not yet stored + if (bit <= MIN(next_common_bits, 7)) { // if needed and not yet stored fbb[bit] = fb_bits; ksb[bit] = ks_bits; par[bit] = parity_bit_vector; From 31ccc7d7ca14f9df885bda5d0d150ef5e6e8a0af Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 29 Apr 2020 20:20:06 +0200 Subject: [PATCH 031/632] hardnested: don't drop field when in test mode --- client/src/cmdhfmf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 8c6247614..95e821781 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -1866,7 +1866,7 @@ static int CmdHF14AMfNestedHard(const char *Cmd) { uint64_t foundkey = 0; int16_t isOK = mfnestedhard(blockNo, keyType, key, trgBlockNo, trgKeyType, know_target_key ? trgkey : NULL, nonce_file_read, nonce_file_write, slow, tests, &foundkey, filename); - DropField(); + if (tests == 0) DropField(); if (isOK) { switch (isOK) { case 1 : From fa44eee82c0368508fbbcdc9df1dadd930aff852 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 29 Apr 2020 20:33:29 +0200 Subject: [PATCH 032/632] chg: "lf sim" - now only fills until bigbuffer is full --- client/src/cmdlf.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/client/src/cmdlf.c b/client/src/cmdlf.c index 1443a5d6a..9324062a1 100644 --- a/client/src/cmdlf.c +++ b/client/src/cmdlf.c @@ -702,6 +702,8 @@ int CmdLFSim(const char *Cmd) { PrintAndLogEx(DEBUG, "DEBUG: Uploading %zu bytes", GraphTraceLen); + PacketResponseNG resp; + struct pupload { uint8_t flag; uint16_t offset; @@ -726,9 +728,12 @@ int CmdLFSim(const char *Cmd) { for (uint16_t j = 0; j < len; j++) payload_up.data[j] = GraphBuffer[i + j]; - SendCommandNG(CMD_LF_UPLOAD_SIM_SAMPLES, (uint8_t *)&payload_up, sizeof(struct pupload)); - WaitForResponse(CMD_LF_UPLOAD_SIM_SAMPLES, NULL); + WaitForResponse(CMD_LF_UPLOAD_SIM_SAMPLES, &resp); + if (resp.status != PM3_SUCCESS) { + PrintAndLogEx(INFO, "Bigbuf is full."); + break; + } printf("."); fflush(stdout); payload_up.flag = 0; @@ -750,7 +755,6 @@ int CmdLFSim(const char *Cmd) { clearCommandBuffer(); SendCommandNG(CMD_LF_SIMULATE, (uint8_t *)&payload, sizeof(payload)); - PacketResponseNG resp; WaitForResponse(CMD_LF_SIMULATE, &resp); PrintAndLogEx(INFO, "Done"); From 00fb88ee4c85ed2268eb9705bb8ec519e125cb5b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 29 Apr 2020 20:34:47 +0200 Subject: [PATCH 033/632] cppcheck fix, make var conditional --- armsrc/cmd.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/armsrc/cmd.c b/armsrc/cmd.c index c7f76960b..17534cbf1 100644 --- a/armsrc/cmd.c +++ b/armsrc/cmd.c @@ -62,7 +62,9 @@ int reply_old(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *d } } +#ifdef WITH_FPC_USART_HOST int resultfpc = PM3_EUNDEF; +#endif int resultusb = PM3_EUNDEF; // Send frame and make sure all bytes are transmitted @@ -79,7 +81,9 @@ int reply_old(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *d } // we got two results, let's prioritize the faulty one and USB over FPC. if (reply_via_usb && (resultusb != PM3_SUCCESS)) return resultusb; +#ifdef WITH_FPC_USART_HOST if (reply_via_fpc && (resultfpc != PM3_SUCCESS)) return resultfpc; +#endif return PM3_SUCCESS; } @@ -117,7 +121,9 @@ static int reply_ng_internal(uint16_t cmd, int16_t status, uint8_t *data, size_t } txBufferNGLen = sizeof(PacketResponseNGPreamble) + len + sizeof(PacketResponseNGPostamble); +#ifdef WITH_FPC_USART_HOST int resultfpc = PM3_EUNDEF; +#endif int resultusb = PM3_EUNDEF; // Send frame and make sure all bytes are transmitted @@ -133,7 +139,9 @@ static int reply_ng_internal(uint16_t cmd, int16_t status, uint8_t *data, size_t } // we got two results, let's prioritize the faulty one and USB over FPC. if (reply_via_usb && (resultusb != PM3_SUCCESS)) return resultusb; +#ifdef WITH_FPC_USART_HOST if (reply_via_fpc && (resultfpc != PM3_SUCCESS)) return resultfpc; +#endif return PM3_SUCCESS; } From f9eb1d3d77cf6ada8e36556fda8616ca3e477e2b Mon Sep 17 00:00:00 2001 From: Uli Heilmeier Date: Wed, 29 Apr 2020 22:52:41 +0200 Subject: [PATCH 034/632] Makefile: fix PKG_CONFIG_ENV renaming PKG_CONFIG_PATH to PKG_CONFIG_ENV was too greedy --- client/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/Makefile b/client/Makefile index f62d7ab49..63860874d 100644 --- a/client/Makefile +++ b/client/Makefile @@ -83,7 +83,7 @@ else LDLIBS := -L/usr/local/opt/readline/lib $(LDLIBS) LIBS := -I/usr/local/opt/readline/include $(LIBS) # cf brew info qt: qt not symlinked anymore - PKG_CONFIG_ENV := PKG_CONFIG_ENV=/usr/local/opt/qt/lib/pkgconfig + PKG_CONFIG_ENV := PKG_CONFIG_PATH=/usr/local/opt/qt/lib/pkgconfig else LUALIB += -ldl LUAPLATFORM = linux From 40c596e8af7a52bc30069eae11ed78423ce204a8 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 1 May 2020 00:08:07 +0200 Subject: [PATCH 035/632] client Makefile: allow to add includes (e.g. for termux) --- client/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/Makefile b/client/Makefile index 63860874d..e8358757e 100644 --- a/client/Makefile +++ b/client/Makefile @@ -54,7 +54,7 @@ ZLIBPATH = ../common/zlib ZLIB = $(OBJDIR)/libz.a LIBS = -I$(LUALIBPATH) -I$(MBEDTLSLIBPATH) -I$(JANSSONLIBPATH) -I$(CBORLIBPATH) -I$(ZLIBPATH) -I$(REVENGPATH) -I$(AMIIBOLIBPATH) -I$(HARDNESTEDPATH) -I$(CLIPARSERPATH) -INCLUDES_CLIENT = -I./src -I../include -I../common -I../common_fpga $(LIBS) +INCLUDES_CLIENT += -I./src -I../include -I../common -I../common_fpga $(LIBS) CFLAGS ?= -Wall -Werror -O3 # We cannot just use CFLAGS+=... because it has impact on sub-makes if CFLAGS is defined in env: PM3CFLAGS = $(CFLAGS) $(INCLUDES_CLIENT) From f158f347e5b211f3a2a7b723b9509bd62950a095 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 1 May 2020 00:13:56 +0200 Subject: [PATCH 036/632] reveng Makefile: allow to skip test (e.g. for cross-compilation) --- client/deps/reveng/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/deps/reveng/Makefile b/client/deps/reveng/Makefile index 1794b0bdb..0dbfa6007 100644 --- a/client/deps/reveng/Makefile +++ b/client/deps/reveng/Makefile @@ -22,6 +22,7 @@ MYCLEANOLDPATH = ../../reveng include ../../../Makefile.host +ifneq ($(SKIPREVENGTEST),1) CLEAN += bmptst $(BINDIR)/$(LIB_A): $(BINDIR)/bmptst @@ -31,5 +32,6 @@ $(BINDIR)/bmptst: bmpbit.c config.h reveng.h $(Q)$(CC) $(CFLAGS) -DBMPTST -o $@ $< $(info [=] TEST $@) $(Q)( ./$@ && $(TOUCH) $@ ) || ( $(RM) $@ && $(FALSE) ) +endif .PHONY: all clean From 43b69bd4e46dd8f08889275f5cce4377b8bfa44c Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 1 May 2020 00:25:04 +0200 Subject: [PATCH 037/632] client Makefile: link with pthread only if needed --- client/Makefile | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/client/Makefile b/client/Makefile index e8358757e..10cf51749 100644 --- a/client/Makefile +++ b/client/Makefile @@ -22,13 +22,17 @@ vpath %.dic dictionaries OBJDIR = obj LDLIBS ?= -L/usr/local/lib -LDLIBS += -lreadline -lpthread -lm +LDLIBS += -lreadline -lm -# RPi Zero gcc requires -latomic -# but MacOSX /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld +# MacOSX /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld # doesn't recognize option --as-needed ifneq ($(platform),Darwin) +# RPi Zero gcc requires -latomic LDLIBS += -Wl,--as-needed -latomic -Wl,--no-as-needed +# Android Termux doesn't have pthread + LDLIBS += -Wl,--as-needed -lpthread -Wl,--no-as-needed +else + LDLIBS += -lpthread endif # local libraries From 6d0afbdbf3e271e248e2c76aa60e00740e5c7ee6 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 1 May 2020 00:28:28 +0200 Subject: [PATCH 038/632] Revert "client Makefile: link with pthread only if needed" This reverts commit 43b69bd4e46dd8f08889275f5cce4377b8bfa44c. --- client/Makefile | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/client/Makefile b/client/Makefile index 10cf51749..e8358757e 100644 --- a/client/Makefile +++ b/client/Makefile @@ -22,17 +22,13 @@ vpath %.dic dictionaries OBJDIR = obj LDLIBS ?= -L/usr/local/lib -LDLIBS += -lreadline -lm +LDLIBS += -lreadline -lpthread -lm -# MacOSX /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld +# RPi Zero gcc requires -latomic +# but MacOSX /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld # doesn't recognize option --as-needed ifneq ($(platform),Darwin) -# RPi Zero gcc requires -latomic LDLIBS += -Wl,--as-needed -latomic -Wl,--no-as-needed -# Android Termux doesn't have pthread - LDLIBS += -Wl,--as-needed -lpthread -Wl,--no-as-needed -else - LDLIBS += -lpthread endif # local libraries From 475ec09b609d5a7ea681bdcd3c59f331cca3b9a6 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 1 May 2020 00:49:13 +0200 Subject: [PATCH 039/632] more tips for maintainers --- doc/md/Development/Maintainers.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/doc/md/Development/Maintainers.md b/doc/md/Development/Maintainers.md index ff3525784..705d97707 100644 --- a/doc/md/Development/Maintainers.md +++ b/doc/md/Development/Maintainers.md @@ -53,6 +53,18 @@ For verbose usage and see the actual commands being executed, add `V=1`. Default compiler is gcc but you can use clang for the non-ARM parts with e.g. `make client CC=clang CXX=clang++ LD=clang++`. +If your platform needs specific lib/include paths for the client, you can use `LDLIBS` and `INCLUDES_CLIENT` *as envvars*, e.g. `LDLIBS="-L/some/more/lib" INCLUDES_CLIENT="-I/some/more/include" make client ...` + +It's also possible to skip parts even if libraries are present in the compilation environment: + +* `make client SKIPQT=1` to skip GUI even if Qt is present +* `make client SKIPBT=1` to skip native Bluetooth support even if libbluetooth is present + +If you're cross-compiling, these ones might be useful: + +* `make client SKIPREVENGTEST=1` to skip compilation and execution of a consistency test for reveng, which can be problematic in case of cross-compilation +* `make client cpu_arch=generic` to skip Intel specialized hardnested components, which is required e.g. if cross-compilation host is Intel but not the target + `make install` is actually triggering the following individual targets which can be accessed individually: * `make client/install` From a17ad052610cd7ac1c85e72de37a9a7e09701a1b Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 1 May 2020 00:58:54 +0200 Subject: [PATCH 040/632] doc --- doc/bt_manual_v10.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/bt_manual_v10.md b/doc/bt_manual_v10.md index c009ba025..1ae8bef29 100644 --- a/doc/bt_manual_v10.md +++ b/doc/bt_manual_v10.md @@ -116,6 +116,8 @@ Scanning ... Instead of `aa:bb:cc:dd:ee:ff`, you'll see your MAC address. +If you don't have `hcitool`, you can use `bluetoothctl` and `scan on` as shown in next section. + 2. Use Proxmark client with Bluetooth MAC address as bt: ```sh ./proxmark3 bt:aa:bb:cc:dd:ee:ff From 8710e9c3a09ac4ac757af3c9222e161cb6e588a4 Mon Sep 17 00:00:00 2001 From: Iceman Date: Sat, 2 May 2020 17:21:33 +0200 Subject: [PATCH 041/632] Update bt_manual_v10.md --- doc/bt_manual_v10.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/doc/bt_manual_v10.md b/doc/bt_manual_v10.md index 1ae8bef29..42f8c04b9 100644 --- a/doc/bt_manual_v10.md +++ b/doc/bt_manual_v10.md @@ -1,6 +1,6 @@ # MANUAL ### Bluetooth / Battery add-on 'Blue Shark' -_rev. v1.0 (draft)_ +_rev. v1.0_ ### 1. FEATURES @@ -55,10 +55,12 @@ https://github.com/RfidResearchGroup/proxmark3 To compile the client and firmware with FPC support, the easiest way is to 1. Copy the sample file: `Makefile.platform.sample` ⇒ `Makefile.platform` + * `mv Makefile.platform.sample Makefile.platform` 2. Edit `Makefile.platform`, uncomment the line `#PLATFORM_EXTRAS=BTADDON` by removing the `#` 3. Recompile the project: - * `make clean; make -j8` + * `make clean; make -j` 4. Flash the firmware + * `./pm3-flash-fullimage` You are now ready to run the client with the serial port you got from your BT device on your laptop etc. See instructions below. @@ -87,6 +89,11 @@ You can also switch serial port from inside the proxmark3 client using the new c * Enter the paired password 1234 and establish the connection. * The blue state LED on the add-on will keep blinking after the connection is established. Only when the mobile phone or computer opens the correct COM port, the blue LED turns on solid, indicating that the connection is successful. + + + +* First time you do this you might need to go into Bluetooth more settings and add a outgoing com port. + #### (2) Fast connection using dedicated USB Bluetooth adapter under Windows

@@ -129,7 +136,7 @@ restart it again after pairing. If your OS doesn't prompt you for pairing, you can do it in command line, e.g. (again, replace with your addon MAC address): ```sh -bluetoothctl +sudo bluetoothctl [bluetooth]# pairable on [bluetooth]# scan on Discovery started From 96b53c4e2ae4d443e98ef2a0ed43ac7ea246b930 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 2 May 2020 17:23:27 +0200 Subject: [PATCH 042/632] chg: add bluetooth group to "make accessrights" --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index 5c7947fc5..efb7b9a7a 100644 --- a/Makefile +++ b/Makefile @@ -186,8 +186,10 @@ udev: accessrights: ifneq ($(wildcard /etc/arch-release),) #If user is running ArchLinux sudo usermod -aG uucp $(USER) #Use specific command and group + sudo usermod -aG bluetooth ${USER} else sudo adduser $(USER) dialout + sudo adduser ${USER} bluetooth endif # easy printing of MAKE VARIABLES From c05e1d8beb5bc8a7ec36be16d62df9e88e0f4dfa Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 2 May 2020 17:27:07 +0200 Subject: [PATCH 043/632] chg: missing tabs --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index efb7b9a7a..1da96fa2e 100644 --- a/Makefile +++ b/Makefile @@ -186,10 +186,10 @@ udev: accessrights: ifneq ($(wildcard /etc/arch-release),) #If user is running ArchLinux sudo usermod -aG uucp $(USER) #Use specific command and group - sudo usermod -aG bluetooth ${USER} + sudo usermod -aG bluetooth $(USER) #Use specific command and group else sudo adduser $(USER) dialout - sudo adduser ${USER} bluetooth + sudo adduser $(USER) bluetooth endif # easy printing of MAKE VARIABLES From 96f03b4933e887ba6878b344bd701db8ab3db5c0 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 2 May 2020 17:52:22 +0100 Subject: [PATCH 044/632] chg: leanient parsing of tcp:/bt:/socket: vars --- client/src/uart/uart_posix.c | 43 +++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/client/src/uart/uart_posix.c b/client/src/uart/uart_posix.c index cf0837845..8a624934d 100644 --- a/client/src/uart/uart_posix.c +++ b/client/src/uart/uart_posix.c @@ -93,12 +93,27 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { // init timeouts timeout.tv_usec = UART_FPC_CLIENT_RX_TIMEOUT_MS * 1000; - if (memcmp(pcPortName, "tcp:", 4) == 0) { - struct addrinfo *addr = NULL, *rp; - char *addrstr = strdup(pcPortName + 4); + char *prefix = strdup(pcPortName); + if (prefix == NULL) { + PrintAndLogEx(ERR, "error: malloc"); + free(sp); + return INVALID_SERIAL_PORT; + } + str_lower(prefix); + if (memcmp(prefix, "tcp:", 4) == 0) { + free(prefix); + + if (strlen(pcPortName) <= 4) { + free(sp); + return INVALID_SERIAL_PORT; + } + + struct addrinfo *addr = NULL, *rp; + + char *addrstr = strdup(pcPortName + 4); if (addrstr == NULL) { - printf("Error: strdup\n"); + PrintAndLogEx(ERR, "error: malloc"); free(sp); return INVALID_SERIAL_PORT; } @@ -122,7 +137,7 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { int s = getaddrinfo(addrstr, portstr, &info, &addr); if (s != 0) { - printf("Error: getaddrinfo: %s\n", gai_strerror(s)); + PrintAndLogEx(ERR, "error: getaddrinfo: %s", gai_strerror(s)); freeaddrinfo(addr); free(addrstr); free(sp); @@ -143,7 +158,7 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { } if (rp == NULL) { /* No address succeeded */ - printf("Error: Could not connect\n"); + PrintAndLogEx(ERR, "error: Could not connect"); freeaddrinfo(addr); free(addrstr); free(sp); @@ -164,16 +179,18 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { return sp; } - if (memcmp(pcPortName, "bt:", 3) == 0) { + if (memcmp(prefix, "bt:", 3) == 0) { + free(prefix); + #ifdef HAVE_BLUEZ if (strlen(pcPortName) != 20) { free(sp); return INVALID_SERIAL_PORT; } - char *addrstr = strndup(pcPortName + 3, 17); + char *addrstr = strndup(pcPortName + 3, 17); if (addrstr == NULL) { - printf("Error: malloc\n"); + PrintAndLogEx(ERR, "error: malloc"); free(sp); return INVALID_SERIAL_PORT; } @@ -214,7 +231,9 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { // Is local socket buffer, not a TCP or any net connection! // so, you can't connect with address like: 127.0.0.1, or any IP // see http://man7.org/linux/man-pages/man7/unix.7.html - if (memcmp(pcPortName, "socket:", 7) == 0) { + if (memcmp(prefix, "socket:", 7) == 0) { + free(prefix); + if (strlen(pcPortName) <= 7) { free(sp); return INVALID_SERIAL_PORT; @@ -255,6 +274,8 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { return sp; } + free(prefix); + sp->fd = open(pcPortName, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK); if (sp->fd == -1) { uart_close(sp); @@ -311,7 +332,7 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { speed = 115200; if (!uart_set_speed(sp, speed)) { uart_close(sp); - printf("[!] UART error while setting baudrate\n"); + PrintAndLogEx(ERR, "UART error while setting baudrate"); return INVALID_SERIAL_PORT; } } From 796cd36f85bfaf794df6ceaebbea9b3b4c55ece1 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 2 May 2020 19:24:52 +0200 Subject: [PATCH 045/632] chg: better error message when serial port allocation fails --- client/src/uart/uart_posix.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/client/src/uart/uart_posix.c b/client/src/uart/uart_posix.c index 8a624934d..076c02ddf 100644 --- a/client/src/uart/uart_posix.c +++ b/client/src/uart/uart_posix.c @@ -88,7 +88,11 @@ int uart_reconfigure_timeouts(uint32_t value) { serial_port uart_open(const char *pcPortName, uint32_t speed) { serial_port_unix *sp = calloc(sizeof(serial_port_unix), sizeof(uint8_t)); - if (sp == 0) return INVALID_SERIAL_PORT; + + if (sp == 0) { + PrintAndLogEx(ERR, "UART failed to allocate memory"); + return INVALID_SERIAL_PORT; + } // init timeouts timeout.tv_usec = UART_FPC_CLIENT_RX_TIMEOUT_MS * 1000; From 0cb21c89c36fee89dbbe2d9a64e9510fe1624deb Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 2 May 2020 23:11:49 +0200 Subject: [PATCH 046/632] doc --- armsrc/Standalone/readme.md | 2 +- doc/bt_manual_v10.md | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/armsrc/Standalone/readme.md b/armsrc/Standalone/readme.md index d46943778..3775d848c 100644 --- a/armsrc/Standalone/readme.md +++ b/armsrc/Standalone/readme.md @@ -131,7 +131,7 @@ Remember only one can be selected at a time for now. The final steps is to - force recompilation of all code. ```make clean``` -- compile ```make -j8``` +- compile ```make -j``` - flash your device - connect to your device - press button long time to trigger ledshow and enter your new standalone mode diff --git a/doc/bt_manual_v10.md b/doc/bt_manual_v10.md index 42f8c04b9..8a08fcdcd 100644 --- a/doc/bt_manual_v10.md +++ b/doc/bt_manual_v10.md @@ -55,7 +55,7 @@ https://github.com/RfidResearchGroup/proxmark3 To compile the client and firmware with FPC support, the easiest way is to 1. Copy the sample file: `Makefile.platform.sample` ⇒ `Makefile.platform` - * `mv Makefile.platform.sample Makefile.platform` + * `cp Makefile.platform.sample Makefile.platform` 2. Edit `Makefile.platform`, uncomment the line `#PLATFORM_EXTRAS=BTADDON` by removing the `#` 3. Recompile the project: * `make clean; make -j` @@ -113,10 +113,15 @@ http://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp This requires to have compiled the client with Bluetooth support. +Be sure your user has permissions to use Bluetooth + + * On most distributions, you've to be part of group `bluetooth`: `sudo adduser $USER bluetooth` then log out and log in + * else, run the following commands as root : `sudo ...` + 1. Find the MAC address of the Bluetooth add-on, named PM3_RDV4.0. ```sh -sudo hcitool scan +hcitool scan Scanning ... aa:bb:cc:dd:ee:ff PM3_RDV4.0 ``` @@ -136,7 +141,7 @@ restart it again after pairing. If your OS doesn't prompt you for pairing, you can do it in command line, e.g. (again, replace with your addon MAC address): ```sh -sudo bluetoothctl +bluetoothctl [bluetooth]# pairable on [bluetooth]# scan on Discovery started @@ -178,7 +183,7 @@ rfcomm is a deprecated tool which might be unavailable in your Linux distributio 1. Find the MAC address of the Bluetooth add-on, named PM3_RDV4.0. ```sh -sudo hcitool scan +hcitool scan Scanning ... aa:bb:cc:dd:ee:ff PM3_RDV4.0 ``` From 0e39cb8e34a2266971d849f7b5f73c0bb176e09f Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 2 May 2020 23:54:27 +0200 Subject: [PATCH 047/632] stricter warnings, wip --- Makefile.host | 3 ++- client/deps/amiitool/amiibo.c | 10 +++++----- client/deps/amiitool/keygen.c | 2 +- client/deps/hardnested/hardnested_bf_core.c | 4 ++-- client/deps/hardnested/hardnested_bruteforce.c | 2 +- client/deps/jansson/hashtable.c | 4 ++-- client/deps/jansson/hashtable_seed.c | 2 +- client/deps/liblua/llex.c | 2 +- client/src/cmdhfmfu.h | 2 +- common/crapto1/crapto1.c | 2 +- common/zlib/deflate.c | 3 +++ 11 files changed, 20 insertions(+), 16 deletions(-) diff --git a/Makefile.host b/Makefile.host index 9f5688939..7ed942401 100644 --- a/Makefile.host +++ b/Makefile.host @@ -15,7 +15,8 @@ ifeq ($(DEFSBEENHERE),) $(error Can't find Makefile.defs) endif -CFLAGS ?= -Wall -Werror -O3 +CFLAGS ?= -Wall -Werror -O3 -Wchar-subscripts -Wundef -Wshadow -Wcast-align -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Wredundant-decls -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs -Wmissing-declarations +# -Wbad-function-cast -Wextra -Wswitch-enum -Wold-style-definition CFLAGS += $(MYDEFS) $(MYCFLAGS) $(MYINCLUDES) vpath %.c $(MYSRCPATHS) diff --git a/client/deps/amiitool/amiibo.c b/client/deps/amiitool/amiibo.c index 809f611d3..ad41220bb 100644 --- a/client/deps/amiitool/amiibo.c +++ b/client/deps/amiitool/amiibo.c @@ -13,7 +13,7 @@ #define HMAC_POS_DATA 0x008 #define HMAC_POS_TAG 0x1B4 -void nfc3d_amiibo_calc_seed(const uint8_t *dump, uint8_t *key) { +static void nfc3d_amiibo_calc_seed(const uint8_t *dump, uint8_t *key) { memcpy(key + 0x00, dump + 0x029, 0x02); memset(key + 0x02, 0x00, 0x0E); memcpy(key + 0x10, dump + 0x1D4, 0x08); @@ -21,14 +21,14 @@ void nfc3d_amiibo_calc_seed(const uint8_t *dump, uint8_t *key) { memcpy(key + 0x20, dump + 0x1E8, 0x20); } -void nfc3d_amiibo_keygen(const nfc3d_keygen_masterkeys *masterKeys, const uint8_t *dump, nfc3d_keygen_derivedkeys *derivedKeys) { +static void nfc3d_amiibo_keygen(const nfc3d_keygen_masterkeys *masterKeys, const uint8_t *dump, nfc3d_keygen_derivedkeys *derivedKeys) { uint8_t seed[NFC3D_KEYGEN_SEED_SIZE]; nfc3d_amiibo_calc_seed(dump, seed); nfc3d_keygen(masterKeys, seed, derivedKeys); } -void nfc3d_amiibo_cipher(const nfc3d_keygen_derivedkeys *keys, const uint8_t *in, uint8_t *out) { +static void nfc3d_amiibo_cipher(const nfc3d_keygen_derivedkeys *keys, const uint8_t *in, uint8_t *out) { mbedtls_aes_context aes; size_t nc_off = 0; unsigned char nonce_counter[16]; @@ -47,7 +47,7 @@ void nfc3d_amiibo_cipher(const nfc3d_keygen_derivedkeys *keys, const uint8_t *in memcpy(out + 0x1D4, in + 0x1D4, 0x034); } -void nfc3d_amiibo_tag_to_internal(const uint8_t *tag, uint8_t *intl) { +static void nfc3d_amiibo_tag_to_internal(const uint8_t *tag, uint8_t *intl) { memcpy(intl + 0x000, tag + 0x008, 0x008); memcpy(intl + 0x008, tag + 0x080, 0x020); memcpy(intl + 0x028, tag + 0x010, 0x024); @@ -57,7 +57,7 @@ void nfc3d_amiibo_tag_to_internal(const uint8_t *tag, uint8_t *intl) { memcpy(intl + 0x1DC, tag + 0x054, 0x02C); } -void nfc3d_amiibo_internal_to_tag(const uint8_t *intl, uint8_t *tag) { +static void nfc3d_amiibo_internal_to_tag(const uint8_t *intl, uint8_t *tag) { memcpy(tag + 0x008, intl + 0x000, 0x008); memcpy(tag + 0x080, intl + 0x008, 0x020); memcpy(tag + 0x010, intl + 0x028, 0x024); diff --git a/client/deps/amiitool/keygen.c b/client/deps/amiitool/keygen.c index f148c0dc8..6322a0fe9 100644 --- a/client/deps/amiitool/keygen.c +++ b/client/deps/amiitool/keygen.c @@ -10,7 +10,7 @@ #include #include -void nfc3d_keygen_prepare_seed(const nfc3d_keygen_masterkeys *baseKeys, const uint8_t *baseSeed, uint8_t *output, size_t *outputSize) { +static void nfc3d_keygen_prepare_seed(const nfc3d_keygen_masterkeys *baseKeys, const uint8_t *baseSeed, uint8_t *output, size_t *outputSize) { assert(baseKeys != NULL); assert(baseSeed != NULL); assert(output != NULL); diff --git a/client/deps/hardnested/hardnested_bf_core.c b/client/deps/hardnested/hardnested_bf_core.c index 9402d9684..0f2d57f16 100644 --- a/client/deps/hardnested/hardnested_bf_core.c +++ b/client/deps/hardnested/hardnested_bf_core.c @@ -556,7 +556,7 @@ void SetSIMDInstr(SIMDExecInstr instr) { bitslice_test_nonces_function_p = &bitslice_test_nonces_dispatch; } -static SIMDExecInstr GetSIMDInstr() { +static SIMDExecInstr GetSIMDInstr(void) { SIMDExecInstr instr = SIMD_NONE; #if defined (__i386__) || defined (__x86_64__) @@ -578,7 +578,7 @@ static SIMDExecInstr GetSIMDInstr() { return instr; } -SIMDExecInstr GetSIMDInstrAuto() { +SIMDExecInstr GetSIMDInstrAuto(void) { SIMDExecInstr instr = intSIMDInstr; if (instr == SIMD_AUTO) return GetSIMDInstr(); diff --git a/client/deps/hardnested/hardnested_bruteforce.c b/client/deps/hardnested/hardnested_bruteforce.c index 159454110..82f8c6c04 100644 --- a/client/deps/hardnested/hardnested_bruteforce.c +++ b/client/deps/hardnested/hardnested_bruteforce.c @@ -433,7 +433,7 @@ static bool read_bench_data(statelist_t *test_candidates) { } -float brute_force_benchmark() { +float brute_force_benchmark(void) { statelist_t test_candidates[NUM_BRUTE_FORCE_THREADS]; test_candidates[0].states[ODD_STATE] = malloc((TEST_BENCH_SIZE + 1) * sizeof(uint32_t)); diff --git a/client/deps/jansson/hashtable.c b/client/deps/jansson/hashtable.c index 38c10a0c7..23fbc867b 100644 --- a/client/deps/jansson/hashtable.c +++ b/client/deps/jansson/hashtable.c @@ -5,14 +5,14 @@ * it under the terms of the MIT license. See LICENSE for details. */ -#if HAVE_CONFIG_H +#ifdef HAVE_CONFIG_H #include #endif #include #include -#if HAVE_STDINT_H +#ifdef HAVE_STDINT_H #include #endif diff --git a/client/deps/jansson/hashtable_seed.c b/client/deps/jansson/hashtable_seed.c index 3856691d3..715279879 100644 --- a/client/deps/jansson/hashtable_seed.c +++ b/client/deps/jansson/hashtable_seed.c @@ -162,7 +162,7 @@ static int seed_from_timestamp_and_pid(uint32_t *seed) { return 0; } -static uint32_t generate_seed() { +static uint32_t generate_seed(void) { uint32_t seed = 0; int done = 0; diff --git a/client/deps/liblua/llex.c b/client/deps/liblua/llex.c index 3f0a1601b..bde26fa4f 100644 --- a/client/deps/liblua/llex.c +++ b/client/deps/liblua/llex.c @@ -197,7 +197,7 @@ static void buffreplace(LexState *ls, char from, char to) { } -#if ANDROID +#if defined(ANDROID) #define getlocaldecpoint() '.' #elif !defined(getlocaledecpoint) #define getlocaledecpoint() (localeconv()->decimal_point[0]) diff --git a/client/src/cmdhfmfu.h b/client/src/cmdhfmfu.h index 85f6a8475..be52b1ed8 100644 --- a/client/src/cmdhfmfu.h +++ b/client/src/cmdhfmfu.h @@ -30,7 +30,7 @@ void printMFUdumpEx(mfu_dump_t *card, uint16_t pages, uint8_t startpage); int CmdHFMFUltra(const char *Cmd); uint32_t ul_ev1_pwdgenA(uint8_t *uid); -uint32_t ul_ev1_pwdgenA(uint8_t *uid); +uint32_t ul_ev1_pwdgenB(uint8_t *uid); uint32_t ul_ev1_pwdgenC(uint8_t *uid); uint32_t ul_ev1_pwdgenD(uint8_t *uid); diff --git a/common/crapto1/crapto1.c b/common/crapto1/crapto1.c index e697b68f0..0d7aaa49e 100644 --- a/common/crapto1/crapto1.c +++ b/common/crapto1/crapto1.c @@ -26,7 +26,7 @@ #if !defined LOWMEM && defined __GNUC__ static uint8_t filterlut[1 << 20]; -static void __attribute__((constructor)) fill_lut() { +static void __attribute__((constructor)) fill_lut(void) { uint32_t i; for (i = 0; i < 1 << 20; ++i) filterlut[i] = filter(i); diff --git a/common/zlib/deflate.c b/common/zlib/deflate.c index a44bdb3ab..f06654f95 100644 --- a/common/zlib/deflate.c +++ b/common/zlib/deflate.c @@ -82,6 +82,9 @@ local void slide_hash OF((deflate_state *s)); local void fill_window OF((deflate_state *s)); local block_state deflate_stored OF((deflate_state *s, int flush)); local block_state deflate_fast OF((deflate_state *s, int flush)); +#ifdef ZLIB_PM3_TUNED +local uInt try_harder OF((deflate_state *s, uInt strstart, uInt lookahead, IPos hash_head)); +#endif #ifndef FASTEST local block_state deflate_slow OF((deflate_state *s, int flush)); #endif From 93585548844770b86a6482c936154413651f846f Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 3 May 2020 00:33:28 +0200 Subject: [PATCH 048/632] stricter warnings, wip --- client/Makefile | 3 +++ client/src/cmddata.c | 3 ++- client/src/cmdhf.c | 1 + client/src/cmdhf14a.c | 4 ++-- client/src/cmdhfmfdes.c | 26 +++++++++++++------------- client/src/cmdlf.c | 1 + client/src/cmdlfem4x.c | 1 + client/src/cmdlfindala.c | 1 + client/src/cmdlft55xx.c | 1 + client/src/cmdlfti.c | 1 + client/src/fileutils.c | 4 ++-- client/src/graph.c | 1 + client/src/loclass/cipherutils.h | 1 - client/src/ui.h | 10 ---------- client/src/util.h | 1 - common/generator.c | 4 ++-- common/generator.h | 5 +---- 17 files changed, 32 insertions(+), 36 deletions(-) diff --git a/client/Makefile b/client/Makefile index e8358757e..ed4e550ff 100644 --- a/client/Makefile +++ b/client/Makefile @@ -56,6 +56,9 @@ ZLIB = $(OBJDIR)/libz.a LIBS = -I$(LUALIBPATH) -I$(MBEDTLSLIBPATH) -I$(JANSSONLIBPATH) -I$(CBORLIBPATH) -I$(ZLIBPATH) -I$(REVENGPATH) -I$(AMIIBOLIBPATH) -I$(HARDNESTEDPATH) -I$(CLIPARSERPATH) INCLUDES_CLIENT += -I./src -I../include -I../common -I../common_fpga $(LIBS) CFLAGS ?= -Wall -Werror -O3 +#CFLAGS ?= -Wall -Werror -O3 -Wchar-subscripts -Wundef -Wshadow -Wcast-align -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Wredundant-decls -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs -Wmissing-declarations +# -Wbad-function-cast -Wextra -Wswitch-enum -Wold-style-definition + # We cannot just use CFLAGS+=... because it has impact on sub-makes if CFLAGS is defined in env: PM3CFLAGS = $(CFLAGS) $(INCLUDES_CLIENT) # WIP Testing diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 9a809f603..cf2256acb 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -18,6 +18,7 @@ #include "commonutil.h" // ARRAYLEN #include "cmdparser.h" // for command_t #include "ui.h" // for show graph controls +#include "proxgui.h" #include "graph.h" // for graph data #include "comms.h" #include "lfdemod.h" // for demod code @@ -287,7 +288,7 @@ static int usage_data_buffclear(void) { PrintAndLogEx(NORMAL, " h This help"); return PM3_SUCCESS; } -static int usage_data_fsktonrz() { +static int usage_data_fsktonrz(void) { PrintAndLogEx(NORMAL, "Usage: data fsktonrz c l f "); PrintAndLogEx(NORMAL, "Options:"); PrintAndLogEx(NORMAL, " h This help"); diff --git a/client/src/cmdhf.c b/client/src/cmdhf.c index fbc99dbd5..ea5472c9d 100644 --- a/client/src/cmdhf.c +++ b/client/src/cmdhf.c @@ -37,6 +37,7 @@ #include "cmdhfcryptorf.h" // CryptoRF #include "cmdtrace.h" // trace list #include "ui.h" +#include "proxgui.h" #include "cmddata.h" #include "graph.h" #include "fpga.h" diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index 262e879f4..7d2178c89 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -1245,7 +1245,7 @@ int CmdHF14A(const char *Cmd) { return CmdsParse(CommandTable, Cmd); } -static void printTag(char *tag) { +static void printTag(const char *tag) { PrintAndLogEx(SUCCESS, "POSSIBLE TYPE:" _YELLOW_(" %s"), tag); } @@ -1340,7 +1340,7 @@ int detect_nxp_card(uint8_t sak, uint16_t atqa) { typedef struct { uint8_t uid0; uint8_t uid1; - char *desc; + const char *desc; } uidname; const uidname uidmap[] = { diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index b8c2271e1..c44bb4a3a 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -170,7 +170,7 @@ typedef enum { CL_AMISC7 = 0xFF, } aidcluster_h; -static char *cluster_to_text(uint8_t cluster) { +static const char *cluster_to_text(uint8_t cluster) { switch (cluster) { case CL_ADMIN: return "card administration"; @@ -375,7 +375,7 @@ static char *getVersionStr(uint8_t major, uint8_t minor) { } -int DESFIRESendApdu(bool activate_field, bool leavefield_on, sAPDU apdu, uint8_t *result, int max_result_len, int *result_len, uint16_t *sw) { +static int DESFIRESendApdu(bool activate_field, bool leavefield_on, sAPDU apdu, uint8_t *result, int max_result_len, int *result_len, uint16_t *sw) { *result_len = 0; if (sw) *sw = 0; @@ -433,7 +433,7 @@ int DESFIRESendApdu(bool activate_field, bool leavefield_on, sAPDU apdu, uint8_t return PM3_SUCCESS; } -static char *getstatus(uint16_t *sw) { +static const char *getstatus(uint16_t *sw) { if (sw == NULL) return "--> sw argument error. This should never happen !"; if (((*sw >> 8) & 0xFF) == 0x91) { switch (*sw & 0xFF) { @@ -500,7 +500,7 @@ static char *getstatus(uint16_t *sw) { return "Unknown error"; } -static char *GetErrorString(int res, uint16_t *sw) { +static const char *GetErrorString(int res, uint16_t *sw) { switch (res) { case PM3_EAPDU_FAIL: return getstatus(sw); @@ -642,7 +642,7 @@ static nxp_cardtype_t getCardType(uint8_t major, uint8_t minor) { return DESFIRE_UNKNOWN; } -int handler_desfire_auth(mfdes_authinput_t *payload, mfdes_auth_res_t *rpayload, bool defaultkey) { +static int handler_desfire_auth(mfdes_authinput_t *payload, mfdes_auth_res_t *rpayload, bool defaultkey) { // 3 different way to authenticate AUTH (CRC16) , AUTH_ISO (CRC32) , AUTH_AES (CRC32) // 4 different crypto arg1 DES, 3DES, 3K3DES, AES // 3 different communication modes, PLAIN,MAC,CRYPTO @@ -913,7 +913,7 @@ int handler_desfire_auth(mfdes_authinput_t *payload, mfdes_auth_res_t *rpayload, return PM3_SUCCESS; } -void AuthToError(int error) { +static void AuthToError(int error) { switch (error) { case 1: PrintAndLogEx(SUCCESS, "Sending auth command failed"); @@ -953,7 +953,7 @@ void AuthToError(int error) { } } // -- test if card supports 0x0A -static int test_desfire_authenticate() { +static int test_desfire_authenticate(void) { uint8_t data[] = {0x00}; sAPDU apdu = {0x90, MFDES_AUTHENTICATE, 0x00, 0x00, 0x01, data}; // 0x0A, KEY 0 int recv_len = 0; @@ -968,7 +968,7 @@ static int test_desfire_authenticate() { } // -- test if card supports 0x1A -static int test_desfire_authenticate_iso() { +static int test_desfire_authenticate_iso(void) { uint8_t data[] = {0x00}; sAPDU apdu = {0x90, MFDES_AUTHENTICATE_ISO, 0x00, 0x00, 0x01, data}; // 0x1A, KEY 0 int recv_len = 0; @@ -983,7 +983,7 @@ static int test_desfire_authenticate_iso() { } // -- test if card supports 0xAA -static int test_desfire_authenticate_aes() { +static int test_desfire_authenticate_aes(void) { uint8_t data[] = {0x00}; sAPDU apdu = {0x90, MFDES_AUTHENTICATE_AES, 0x00, 0x00, 0x01, data}; // 0xAA, KEY 0 int recv_len = 0; @@ -1210,7 +1210,7 @@ static int handler_desfire_keyversion(uint8_t curr_key, uint8_t *num_versions) { return res; } -static int handler_desfire_commit_transaction() { +static int handler_desfire_commit_transaction(void) { sAPDU apdu = {0x90, MFDES_COMMIT_TRANSACTION, 0x00, 0x00, 0x00, NULL}; //0xC7 int recv_len = 0; uint16_t sw = 0; @@ -1225,7 +1225,7 @@ static int handler_desfire_commit_transaction() { return res; } -/*static int handler_desfire_abort_transaction() { +/*static int handler_desfire_abort_transaction(void) { sAPDU apdu = {0x90, MFDES_ABORT_TRANSACTION, 0x00, 0x00, 0x00, NULL}; //0xA7 int recv_len = 0; uint16_t sw = 0; @@ -1647,7 +1647,7 @@ static int handler_desfire_create_backup_file(mfdes_file_t *file) { return res; } -int getKeySettings(uint8_t *aid) { +static int getKeySettings(uint8_t *aid) { if (aid == NULL) return PM3_EINVARG; int res = 0; @@ -3558,7 +3558,7 @@ static int CmdHF14ADesAuth(const char *Cmd) { return PM3_SUCCESS; } -void DesFill2bPattern(uint8_t deskeyList[MAX_KEYS_LIST_LEN][8], size_t *deskeyListLen, uint8_t aeskeyList[MAX_KEYS_LIST_LEN][16], size_t *aeskeyListLen, uint8_t k3kkeyList[MAX_KEYS_LIST_LEN][24], size_t *k3kkeyListLen, uint32_t *startPattern) { +static void DesFill2bPattern(uint8_t deskeyList[MAX_KEYS_LIST_LEN][8], size_t *deskeyListLen, uint8_t aeskeyList[MAX_KEYS_LIST_LEN][16], size_t *aeskeyListLen, uint8_t k3kkeyList[MAX_KEYS_LIST_LEN][24], size_t *k3kkeyListLen, uint32_t *startPattern) { for (uint32_t pt = *startPattern; pt < 0x10000; pt++) { if (*deskeyListLen != MAX_KEYS_LIST_LEN) { deskeyList[*deskeyListLen][0] = (pt >> 8) & 0xff; diff --git a/client/src/cmdlf.c b/client/src/cmdlf.c index 9324062a1..a08ec2b9e 100644 --- a/client/src/cmdlf.c +++ b/client/src/cmdlf.c @@ -25,6 +25,7 @@ #include "lfdemod.h" // device/client demods of LF signals #include "ui.h" // for show graph controls +#include "proxgui.h" #include "graph.h" // for graph data #include "cmddata.h" // for `lf search` #include "cmdlfawid.h" // for awid menu diff --git a/client/src/cmdlfem4x.c b/client/src/cmdlfem4x.c index 734626700..f0e51b900 100644 --- a/client/src/cmdlfem4x.c +++ b/client/src/cmdlfem4x.c @@ -24,6 +24,7 @@ #include "util_posix.h" #include "protocols.h" #include "ui.h" +#include "proxgui.h" #include "graph.h" #include "cmddata.h" #include "cmdlf.h" diff --git a/client/src/cmdlfindala.c b/client/src/cmdlfindala.c index 6cf5ed28f..7f3c4ee87 100644 --- a/client/src/cmdlfindala.c +++ b/client/src/cmdlfindala.c @@ -22,6 +22,7 @@ #include "cliparser.h" #include "commonutil.h" #include "ui.h" // PrintAndLog +#include "proxgui.h" #include "lfdemod.h" // parityTest, bitbytes_to_byte #include "cmddata.h" #include "cmdlf.h" // lf_read diff --git a/client/src/cmdlft55xx.c b/client/src/cmdlft55xx.c index 5994e2232..09f2009bd 100644 --- a/client/src/cmdlft55xx.c +++ b/client/src/cmdlft55xx.c @@ -21,6 +21,7 @@ #include "comms.h" #include "commonutil.h" #include "protocols.h" +#include "proxgui.h" #include "graph.h" #include "cmddata.h" #include "lfdemod.h" diff --git a/client/src/cmdlfti.c b/client/src/cmdlfti.c index ed3b6f510..1c0dcbe1e 100644 --- a/client/src/cmdlfti.c +++ b/client/src/cmdlfti.c @@ -17,6 +17,7 @@ #include "comms.h" #include "crc16.h" #include "ui.h" +#include "proxgui.h" #include "graph.h" #include "cmdlfti.h" diff --git a/client/src/fileutils.c b/client/src/fileutils.c index b0b8d9772..4ccd4fa8f 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -1151,7 +1151,7 @@ int loadFileDICTIONARY_safe(const char *preferredName, void **pdata, uint8_t key fclose(f); goto out; } else { - memset(*pdata + (mem_size - block_size), 0, block_size); + memset((uint8_t *)*pdata + (mem_size - block_size), 0, block_size); } } @@ -1171,7 +1171,7 @@ int loadFileDICTIONARY_safe(const char *preferredName, void **pdata, uint8_t key uint64_t key = strtoull(line, NULL, 16); - num_to_bytes(key, keylen >> 1, *pdata + (*keycnt * (keylen >> 1))); + num_to_bytes(key, keylen >> 1, (uint8_t *)*pdata + (*keycnt * (keylen >> 1))); (*keycnt)++; diff --git a/client/src/graph.c b/client/src/graph.c index f9e610414..d5f62a6b7 100644 --- a/client/src/graph.c +++ b/client/src/graph.c @@ -11,6 +11,7 @@ #include #include #include "ui.h" +#include "proxgui.h" #include "util.h" //param_get32ex #include "lfdemod.h" #include "cmddata.h" //for g_debugmode diff --git a/client/src/loclass/cipherutils.h b/client/src/loclass/cipherutils.h index 6c90326a6..2e6e3dab9 100644 --- a/client/src/loclass/cipherutils.h +++ b/client/src/loclass/cipherutils.h @@ -61,7 +61,6 @@ void pushBit(BitstreamOut *stream, bool bit); int bitsLeft(BitstreamIn *stream); #ifndef ON_DEVICE int testCipherUtils(void); -int testMAC(void); #endif void push6bits(BitstreamOut *stream, uint8_t bits); void EncryptDES(bool key[56], bool outBlk[64], bool inBlk[64], int verbose) ; diff --git a/client/src/ui.h b/client/src/ui.h index e47031d70..ee101601e 100644 --- a/client/src/ui.h +++ b/client/src/ui.h @@ -48,22 +48,12 @@ extern session_arg_t session; #endif #define MAX_PRINT_BUFFER 2048 -void ShowGui(void); -void HideGraphWindow(void); -void ShowGraphWindow(void); -void RepaintGraphWindow(void); void PrintAndLogOptions(const char *str[][2], size_t size, size_t space); void PrintAndLogEx(logLevel_t level, const char *fmt, ...); void SetFlushAfterWrite(bool value); void memcpy_filter_ansi(void *dest, const void *src, size_t n, bool filter); void memcpy_filter_emoji(void *dest, const void *src, size_t n, emojiMode_t mode); -extern double CursorScaleFactor; -extern int PlotGridX, PlotGridY, PlotGridXdefault, PlotGridYdefault, GridOffset; -extern uint32_t CursorCPos, CursorDPos; -extern bool GridLocked; -extern bool showDemod; - int searchHomeFilePath(char **foundpath, const char *filename, bool create_home); extern pthread_mutex_t print_lock; diff --git a/client/src/util.h b/client/src/util.h index fb31e6013..59591ac24 100644 --- a/client/src/util.h +++ b/client/src/util.h @@ -87,7 +87,6 @@ void wiegand_add_parity(uint8_t *target, uint8_t *source, uint8_t length); void wiegand_add_parity_swapped(uint8_t *target, uint8_t *source, uint8_t length); //void xor(unsigned char *dst, unsigned char *src, size_t len); -int32_t le24toh(uint8_t data[3]); uint32_t PackBits(uint8_t start, uint8_t len, uint8_t *bits); uint64_t HornerScheme(uint64_t num, uint64_t divider, uint64_t factor); diff --git a/common/generator.c b/common/generator.c index a456c6b78..653d57061 100644 --- a/common/generator.c +++ b/common/generator.c @@ -34,7 +34,7 @@ // XYZ 3D printing // Vinglock //------------------------------------ -void transform_D(uint8_t *ru) { +static void transform_D(uint8_t *ru) { const uint32_t c_D[] = { 0x6D835AFC, 0x7D15CD97, 0x0942B409, 0x32F9C923, 0xA811FB02, 0x64F121E8, @@ -415,7 +415,7 @@ int mfc_algo_sky_all(uint8_t *uid, uint8_t *keys) { //------------------------------------ // Self tests //------------------------------------ -int generator_selftest() { +int generator_selftest(void) { #define NUM_OF_TEST 5 diff --git a/common/generator.h b/common/generator.h index d7ca2b8ee..c90fe483a 100644 --- a/common/generator.h +++ b/common/generator.h @@ -32,9 +32,6 @@ int mfc_algo_yale_all(uint8_t *uid, uint8_t *keys); int mfc_algo_saflok_one(uint8_t *uid, uint8_t sector, uint8_t keytype, uint64_t *key); int mfc_algo_saflok_all(uint8_t *uid, uint8_t *keys); -int mfc_algo_saflok_one(uint8_t *uid, uint8_t sector, uint8_t keytype, uint64_t *key); -int mfc_algo_saflok_all(uint8_t *uid, uint8_t *keys); - int mfc_algo_mizip_one(uint8_t *uid, uint8_t sector, uint8_t keytype, uint64_t *key); int mfc_algo_mizip_all(uint8_t *uid, uint8_t *keys); @@ -44,5 +41,5 @@ int mfc_algo_di_all(uint8_t *uid, uint8_t *keys); int mfc_algo_sky_one(uint8_t *uid, uint8_t sector, uint8_t keytype, uint64_t *key); int mfc_algo_sky_all(uint8_t *uid, uint8_t *keys); -int generator_selftest(); +int generator_selftest(void); #endif From 3529aea157fdb488fef2371b4fffbfcace000ed1 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 3 May 2020 01:13:28 +0200 Subject: [PATCH 049/632] stricter warnings, wip --- client/Makefile | 5 +-- client/deps/amiitool/amiitool.c | 2 +- client/deps/cliparser/cliparser.c | 2 +- client/src/aidsearch.c | 8 ++--- client/src/aidsearch.h | 2 +- client/src/cmdhf.c | 6 ++-- client/src/cmdhf14a.c | 4 +-- client/src/cmdhf14b.c | 2 +- client/src/cmdhffelica.c | 30 +++++++++--------- client/src/cmdhficlass.c | 2 +- client/src/cmdhflist.c | 2 +- client/src/cmdhfmf.c | 4 +-- client/src/cmdhfmfhard.c | 4 +-- client/src/cmdhfmfp.c | 4 +-- client/src/cmdhfmfu.c | 4 +-- client/src/cmdlf.c | 2 +- client/src/cmdlfem4x.c | 12 ++++---- client/src/cmdlfhitag.c | 2 +- client/src/cmdlfpcf7931.c | 10 +++--- client/src/cmdlft55xx.c | 46 ++++++++++++++-------------- client/src/cmdmain.c | 4 +-- client/src/cmdsmartcard.c | 2 +- client/src/cmdtrace.c | 6 ++-- client/src/cmdusart.c | 4 +-- client/src/cmdwiegand.c | 8 ++--- client/src/comms.c | 2 +- client/src/fileutils.c | 2 +- client/src/graph.c | 2 +- client/src/loclass/cipher.c | 2 +- client/src/loclass/cipherutils.c | 4 +-- client/src/loclass/elite_crack.c | 6 ++-- client/src/loclass/ikeys.c | 8 ++--- client/src/pm3_binlib.c | 1 + client/src/pm3_bitlib.c | 1 + client/src/preferences.c | 51 ++++++++++++++++--------------- client/src/proxgui.h | 1 - client/src/proxguiqt.cpp | 1 + client/src/proxmark3.c | 8 ++--- client/src/util.c | 6 ---- client/src/util.h | 4 +-- client/src/wiegand_formats.c | 2 +- client/src/wiegand_formats.h | 2 +- client/src/wiegand_formatutils.c | 2 +- 43 files changed, 140 insertions(+), 142 deletions(-) diff --git a/client/Makefile b/client/Makefile index ed4e550ff..1f857e584 100644 --- a/client/Makefile +++ b/client/Makefile @@ -55,8 +55,9 @@ ZLIB = $(OBJDIR)/libz.a LIBS = -I$(LUALIBPATH) -I$(MBEDTLSLIBPATH) -I$(JANSSONLIBPATH) -I$(CBORLIBPATH) -I$(ZLIBPATH) -I$(REVENGPATH) -I$(AMIIBOLIBPATH) -I$(HARDNESTEDPATH) -I$(CLIPARSERPATH) INCLUDES_CLIENT += -I./src -I../include -I../common -I../common_fpga $(LIBS) -CFLAGS ?= -Wall -Werror -O3 -#CFLAGS ?= -Wall -Werror -O3 -Wchar-subscripts -Wundef -Wshadow -Wcast-align -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Wredundant-decls -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs -Wmissing-declarations +#CFLAGS ?= -Wall -Werror -O3 +CFLAGS ?= -Wall -Werror -O3 -Wchar-subscripts -Wundef -Wcast-align -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wstrict-prototypes -Wnested-externs -Wmissing-declarations +# -Wshadow -Wmissing-prototypes -Wredundant-decls # -Wbad-function-cast -Wextra -Wswitch-enum -Wold-style-definition # We cannot just use CFLAGS+=... because it has impact on sub-makes if CFLAGS is defined in env: diff --git a/client/deps/amiitool/amiitool.c b/client/deps/amiitool/amiitool.c index b63222d50..d7cd08351 100644 --- a/client/deps/amiitool/amiitool.c +++ b/client/deps/amiitool/amiitool.c @@ -15,7 +15,7 @@ static char *self; -void amiitool_usage() { +void amiitool_usage(void) { fprintf(stderr, /*"amiitool build %i (commit %s-%08x)\n"*/ "by Marcos Del Sol Vives \n" diff --git a/client/deps/cliparser/cliparser.c b/client/deps/cliparser/cliparser.c index 1845aff29..27b0ed050 100644 --- a/client/deps/cliparser/cliparser.c +++ b/client/deps/cliparser/cliparser.c @@ -143,7 +143,7 @@ int CLIParserParseStringEx(const char *str, void *vargtable[], size_t vargtableL return CLIParserParseArg(argc, argv, vargtable, vargtableLen, allowEmptyExec); } -void CLIParserFree() { +void CLIParserFree(void) { arg_freetable(argtable, argtableLen); argtable = NULL; diff --git a/client/src/aidsearch.c b/client/src/aidsearch.c index 676db4cc7..291d2035c 100644 --- a/client/src/aidsearch.c +++ b/client/src/aidsearch.c @@ -13,7 +13,7 @@ #include "fileutils.h" #include "pm3_cmd.h" -int openAIDFile(json_t **root, bool verbose) { +static int openAIDFile(json_t **root, bool verbose) { json_error_t error; char *path; @@ -42,7 +42,7 @@ out: return retval; } -int closeAIDFile(json_t *root) { +static int closeAIDFile(json_t *root) { json_decref(root); return PM3_SUCCESS; @@ -71,7 +71,7 @@ int AIDSearchFree(json_t *root) { return closeAIDFile(root); } -const char *jsonStrGet(json_t *data, char *name) { +static const char *jsonStrGet(json_t *data, const char *name) { json_t *jstr; jstr = json_object_get(data, name); @@ -88,7 +88,7 @@ const char *jsonStrGet(json_t *data, char *name) { return cstr; } -bool aidCompare(const char *aidlarge, const char *aidsmall) { +static bool aidCompare(const char *aidlarge, const char *aidsmall) { if (strcmp(aidlarge, aidsmall) == 0) return true; diff --git a/client/src/aidsearch.h b/client/src/aidsearch.h index 00d2b134a..528146766 100644 --- a/client/src/aidsearch.h +++ b/client/src/aidsearch.h @@ -23,6 +23,6 @@ int PrintAIDDescriptionBuf(json_t *root, uint8_t *aid, size_t aidlen, bool verbo json_t *AIDSearchInit(bool verbose); json_t *AIDSearchGetElm(json_t *root, int elmindx); bool AIDGetFromElm(json_t *data, uint8_t *aid, size_t aidmaxlen, int *aidlen); -int AIDSearchFree(); +int AIDSearchFree(json_t *root); #endif diff --git a/client/src/cmdhf.c b/client/src/cmdhf.c index ea5472c9d..ff2a5e79f 100644 --- a/client/src/cmdhf.c +++ b/client/src/cmdhf.c @@ -44,7 +44,7 @@ static int CmdHelp(const char *Cmd); -static int usage_hf_search() { +static int usage_hf_search(void) { PrintAndLogEx(NORMAL, "Usage: hf search"); PrintAndLogEx(NORMAL, "Will try to find a HF read out of the unknown tag. Stops when found."); PrintAndLogEx(NORMAL, "Options:"); @@ -53,7 +53,7 @@ static int usage_hf_search() { return PM3_SUCCESS; } -static int usage_hf_sniff() { +static int usage_hf_sniff(void) { PrintAndLogEx(NORMAL, "The high frequence sniffer will assign all available memory on device for sniffed data"); PrintAndLogEx(NORMAL, "Use " _YELLOW_("'data samples'")" command to download from device, and " _YELLOW_("'data plot'")" to look at it"); PrintAndLogEx(NORMAL, "Press button to quit the sniffing.\n"); @@ -69,7 +69,7 @@ static int usage_hf_sniff() { return PM3_SUCCESS; } -static int usage_hf_tune() { +static int usage_hf_tune(void) { PrintAndLogEx(NORMAL, "Continuously measure HF antenna tuning."); PrintAndLogEx(NORMAL, "Press button or Enter to interrupt."); PrintAndLogEx(NORMAL, "Usage: hf tune [h] []"); diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index 7d2178c89..4e4e411e8 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -1261,7 +1261,7 @@ typedef enum { } nxp_mifare_type_t; // According to NXP AN10833 Rev 3.6 MIFARE Type Identification, Table 6 -int detect_nxp_card(uint8_t sak, uint16_t atqa) { +static int detect_nxp_card(uint8_t sak, uint16_t atqa) { int type = MTNONE; if (sak == 0x00) { @@ -1355,7 +1355,7 @@ const uidname uidmap[] = { {0x00, 0x00, "None"} }; -void getTagLabel(uint8_t uid0, uint8_t uid1) { +static void getTagLabel(uint8_t uid0, uint8_t uid1) { int i = 0; while (uidmap[i].uid0 != 0x00) { if ((uidmap[i].uid0 == uid0) && (uidmap[i].uid1 == uid1)) { diff --git a/client/src/cmdhf14b.c b/client/src/cmdhf14b.c index 859df4a23..7be829472 100644 --- a/client/src/cmdhf14b.c +++ b/client/src/cmdhf14b.c @@ -684,7 +684,7 @@ static bool HF14B_Std_Reader(bool verbose) { } // test for other 14b type tags (mimic another reader - don't have tags to identify) -static bool HF14B_Other_Reader() { +static bool HF14B_Other_Reader(void) { // uint8_t data[] = {0x00, 0x0b, 0x3f, 0x80}; // uint8_t datalen = 4; diff --git a/client/src/cmdhffelica.c b/client/src/cmdhffelica.c index dc3b07a1b..9757e54a3 100644 --- a/client/src/cmdhffelica.c +++ b/client/src/cmdhffelica.c @@ -123,7 +123,7 @@ static int usage_hf_felica_request_response(void) { return PM3_SUCCESS; } -static void print_status_flag1_interpretation() { +static void print_status_flag1_interpretation(void) { PrintAndLogEx(NORMAL, "\nStatus Flag1:"); PrintAndLogEx(NORMAL, " - 00h : Indicates the successful completion of a command."); PrintAndLogEx(NORMAL, " - FFh : If an error occurs during the processing of a command that includes no list in the command packet, or if " @@ -133,7 +133,7 @@ static void print_status_flag1_interpretation() { "indicating the location of the error."); } -static void print_status_flag2_interpration() { +static void print_status_flag2_interpration(void) { PrintAndLogEx(NORMAL, "\nStatus Flag2:"); PrintAndLogEx(NORMAL, " - 00h : Indicates the successful completion of a command."); PrintAndLogEx(NORMAL, " - 01h : The calculated result is either less than zero when the purse data is decremented, or exceeds 4" @@ -167,7 +167,7 @@ static void print_status_flag2_interpration() { PrintAndLogEx(NORMAL, " - C2h : Command is disabled already: This is the error that occurs in issuance commands."); } -static void print_block_list_element_constraints() { +static void print_block_list_element_constraints(void) { PrintAndLogEx(NORMAL, " - Each Block List Element shall satisfy the following conditions:"); PrintAndLogEx(NORMAL, " - The value of Service Code List Order shall not exceed Number of Service."); PrintAndLogEx(NORMAL, " - Access Mode shall be 000b."); @@ -177,22 +177,22 @@ static void print_block_list_element_constraints() { PrintAndLogEx(NORMAL, " - Block Number shall be in the range of the number of Blocks assigned to the specified Service."); } -static void print_number_of_service_constraints() { +static void print_number_of_service_constraints(void) { PrintAndLogEx(NORMAL, " - Number of Service: shall be a positive integer in the range of 1 to 16, inclusive."); } -static void print_number_of_block_constraints() { +static void print_number_of_block_constraints(void) { PrintAndLogEx(NORMAL, " - Number of Block: shall be less than or equal to the maximum number of Blocks that can be read simultaneously. " "The maximum number of Blocks that can be read simultaneously can differ, depending on the product being used. Use as default 01"); } -static void print_service_code_list_constraints() { +static void print_service_code_list_constraints(void) { PrintAndLogEx(NORMAL, " - Service Code List: For Service Code List, only Service Code existing in the product shall be specified:"); PrintAndLogEx(NORMAL, " - Even when Service Code exists in the product, Service Code not referenced from Block List shall not be specified to Service Code List."); PrintAndLogEx(NORMAL, " - For existence or nonexistence of Service in a product, please check using the Request Service (or Request Service v2) command."); } -static int usage_hf_felica_read_without_encryption() { +static int usage_hf_felica_read_without_encryption(void) { PrintAndLogEx(NORMAL, "\nInfo: Use this command to read Block Data from authentication-not-required Service."); PrintAndLogEx(NORMAL, " - Mode shall be Mode0."); print_number_of_service_constraints(); @@ -215,7 +215,7 @@ static int usage_hf_felica_read_without_encryption() { return PM3_SUCCESS; } -static int usage_hf_felica_write_without_encryption() { +static int usage_hf_felica_write_without_encryption(void) { PrintAndLogEx(NORMAL, "\nInfo: Use this command to write Block Data to authentication-not-required Service."); PrintAndLogEx(NORMAL, " - Mode shall be Mode0."); print_number_of_service_constraints(); @@ -234,7 +234,7 @@ static int usage_hf_felica_write_without_encryption() { return PM3_SUCCESS; } -static int usage_hf_felica_request_system_code() { +static int usage_hf_felica_request_system_code(void) { PrintAndLogEx(NORMAL, "\nInfo: Use this command to acquire System Code registered to the card."); PrintAndLogEx(NORMAL, " - If a card is divided into more than one System, this command acquires System Code of each System existing in the card."); PrintAndLogEx(NORMAL, "\nUsage: hf felica rqsyscode [-h] [-i]"); @@ -246,7 +246,7 @@ static int usage_hf_felica_request_system_code() { return PM3_SUCCESS; } -static int usage_hf_felica_reset_mode() { +static int usage_hf_felica_reset_mode(void) { PrintAndLogEx(NORMAL, "\nInfo: Use this command to reset Mode to Mode 0."); print_status_flag1_interpretation(); print_status_flag2_interpration(); @@ -261,7 +261,7 @@ static int usage_hf_felica_reset_mode() { return PM3_SUCCESS; } -static int usage_hf_felica_request_specification_version() { +static int usage_hf_felica_request_specification_version(void) { PrintAndLogEx(NORMAL, "\nInfo: Use this command to acquire the version of card OS."); PrintAndLogEx(NORMAL, " - Response:"); PrintAndLogEx(NORMAL, " - Format Version: Fixed value 00h. Provided only if Status Flag1 = 00h."); @@ -283,7 +283,7 @@ static int usage_hf_felica_request_specification_version() { return PM3_SUCCESS; } -static int usage_hf_felica_authentication1() { +static int usage_hf_felica_authentication1(void) { PrintAndLogEx(NORMAL, "\nInfo: Initiate mutual authentication. This command must always be executed before Authentication2 command" ", and mutual authentication is achieve only after Authentication2 command has succeeded."); PrintAndLogEx(NORMAL, " - Auth1 Parameters:"); @@ -311,7 +311,7 @@ static int usage_hf_felica_authentication1() { return PM3_SUCCESS; } -static int usage_hf_felica_authentication2() { +static int usage_hf_felica_authentication2(void) { PrintAndLogEx(NORMAL, "\nInfo: Complete mutual authentication. This command can only be executed subsquent to Authentication1" " command."); PrintAndLogEx(NORMAL, " - Auth2 Parameters:"); @@ -551,7 +551,7 @@ static bool check_last_idm(uint8_t *data, uint16_t datalen) { * @param wr_noCry_resp frame in which the response will be saved. * @return success if response was received. */ -int send_wr_unencrypted(uint8_t flags, uint16_t datalen, uint8_t *data, bool verbose, felica_status_response_t *wr_noCry_resp) { +static int send_wr_unencrypted(uint8_t flags, uint16_t datalen, uint8_t *data, bool verbose, felica_status_response_t *wr_noCry_resp) { clear_and_send_command(flags, datalen, data, verbose); PacketResponseNG resp; if (!waitCmdFelica(0, &resp, verbose)) { @@ -1464,7 +1464,7 @@ static int CmdHFFelicaSimLite(const char *Cmd) { return PM3_SUCCESS; } -static void printSep() { +static void printSep(void) { PrintAndLogEx(INFO, "------------------------------------------------------------------------------------"); } diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index d05afdae2..e46f045a3 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -191,7 +191,7 @@ static int usage_hf_iclass_readblock(void) { PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } -static int usage_hf_iclass_readtagfile() { +static int usage_hf_iclass_readtagfile(void) { PrintAndLogEx(NORMAL, "Print a iClass tag-dump file\n"); PrintAndLogEx(NORMAL, "Usage: hf iClass readtagfile [f ] [s ] [e ] [v]\n"); PrintAndLogEx(NORMAL, "Options:"); diff --git a/client/src/cmdhflist.c b/client/src/cmdhflist.c index 7aeac0bc7..16fdb309e 100644 --- a/client/src/cmdhflist.c +++ b/client/src/cmdhflist.c @@ -37,7 +37,7 @@ enum MifareAuthSeq { static enum MifareAuthSeq MifareAuthState; static TAuthData AuthData; -void ClearAuthData() { +void ClearAuthData(void) { AuthData.uid = 0; AuthData.nt = 0; AuthData.first_auth = true; diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 95e821781..ba017676c 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -3132,7 +3132,7 @@ out: sector_t *k_sector = NULL; uint8_t k_sectorsCount = 40; -void showSectorTable() { +void showSectorTable(void) { if (k_sector != NULL) { printKeyTable(k_sectorsCount, k_sector); free(k_sector); @@ -4806,7 +4806,7 @@ static int CmdHFMFNDEF(const char *Cmd) { return PM3_SUCCESS; } -int CmdHFMFPersonalize(const char *cmd) { +static int CmdHFMFPersonalize(const char *cmd) { CLIParserInit("hf mf personalize", "Personalize the UID of a Mifare Classic EV1 card. This is only possible if it is a 7Byte UID card and if it is not already personalized.", diff --git a/client/src/cmdhfmfhard.c b/client/src/cmdhfmfhard.c index 6fc146164..b8f3c0471 100644 --- a/client/src/cmdhfmfhard.c +++ b/client/src/cmdhfmfhard.c @@ -1302,7 +1302,7 @@ static void simulate_MFplus_RNG(uint32_t test_cuid, uint64_t test_key, uint32_t } -static void simulate_acquire_nonces() { +static void simulate_acquire_nonces(void) { time_t time1 = time(NULL); last_sample_clock = 0; sample_period = 1000; // for simulation @@ -2108,7 +2108,7 @@ static uint16_t SumProperty(struct Crypto1State *s) { return (sum_odd * (16 - sum_even) + (16 - sum_odd) * sum_even); } -static void Tests() { +static void Tests(void) { if (known_target_key == -1) return; diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index 728101ce7..f9d2e661a 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -949,7 +949,7 @@ static int CmdHFMFPWrbl(const char *Cmd) { #define AES_KEY_LEN 16 #define MAX_KEYS_LIST_LEN 1024 -int MFPKeyCheck(uint8_t startSector, uint8_t endSector, uint8_t startKeyAB, uint8_t endKeyAB, +static int MFPKeyCheck(uint8_t startSector, uint8_t endSector, uint8_t startKeyAB, uint8_t endKeyAB, uint8_t keyList[MAX_KEYS_LIST_LEN][AES_KEY_LEN], size_t keyListLen, uint8_t foundKeys[2][64][AES_KEY_LEN + 1], bool verbose) { int res; @@ -1027,7 +1027,7 @@ int MFPKeyCheck(uint8_t startSector, uint8_t endSector, uint8_t startKeyAB, uint return PM3_SUCCESS; } -void Fill2bPattern(uint8_t keyList[MAX_KEYS_LIST_LEN][AES_KEY_LEN], size_t *keyListLen, uint32_t *startPattern) { +static void Fill2bPattern(uint8_t keyList[MAX_KEYS_LIST_LEN][AES_KEY_LEN], size_t *keyListLen, uint32_t *startPattern) { for (uint32_t pt = *startPattern; pt < 0x10000; pt++) { keyList[*keyListLen][0] = (pt >> 8) & 0xff; keyList[*keyListLen][1] = pt & 0xff; diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index 88e44285e..c71cff645 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -855,7 +855,7 @@ static int ulev1_print_configuration(uint32_t tagtype, uint8_t *data, uint8_t st return PM3_SUCCESS; } -static int ulev1_print_counters() { +static int ulev1_print_counters(void) { PrintAndLogEx(INFO, "--- " _CYAN_("Tag Counters")); uint8_t tear[1] = {0}; uint8_t counter[3] = {0, 0, 0}; @@ -1004,7 +1004,7 @@ static int ulc_magic_test(){ return returnValue; } */ -static int ul_magic_test() { +static int ul_magic_test(void) { // Magic Ultralight tests // 1) take present UID, and try to write it back. OBSOLETE // 2) make a wrong length write to page0, and see if tag answers with ACK/NACK: diff --git a/client/src/cmdlf.c b/client/src/cmdlf.c index a08ec2b9e..520407847 100644 --- a/client/src/cmdlf.c +++ b/client/src/cmdlf.c @@ -670,7 +670,7 @@ int CmdLFSniff(const char *Cmd) { return PM3_SUCCESS; } -static void ChkBitstream() { +static void ChkBitstream(void) { // convert to bitstream if necessary for (int i = 0; i < (int)(GraphTraceLen / 2); i++) { if (GraphBuffer[i] > 1 || GraphBuffer[i] < 0) { diff --git a/client/src/cmdlfem4x.c b/client/src/cmdlfem4x.c index f0e51b900..f3986b19d 100644 --- a/client/src/cmdlfem4x.c +++ b/client/src/cmdlfem4x.c @@ -1055,7 +1055,7 @@ static int CmdEM4x50Dump(const char *Cmd) { #define EM_PREAMBLE_LEN 6 // download samples from device and copy to Graphbuffer -static bool downloadSamplesEM() { +static bool downloadSamplesEM(void) { // 8 bit preamble + 32 bit word response (max clock (128) * 40bits = 5120 samples) uint8_t got[6000]; @@ -1097,7 +1097,7 @@ static bool doPreambleSearch(size_t *startIdx) { return true; } -static bool detectFSK() { +static bool detectFSK(void) { // detect fsk clock if (GetFskClock("", false) == 0) { PrintAndLogEx(DEBUG, "DEBUG: Error - EM: FSK clock failed"); @@ -1112,7 +1112,7 @@ static bool detectFSK() { return true; } // PSK clocks should be easy to detect ( but difficult to demod a non-repeating pattern... ) -static bool detectPSK() { +static bool detectPSK(void) { int ans = GetPskClock("", false); if (ans <= 0) { PrintAndLogEx(DEBUG, "DEBUG: Error - EM: PSK clock failed"); @@ -1136,7 +1136,7 @@ static bool detectPSK() { return true; } // try manchester - NOTE: ST only applies to T55x7 tags. -static bool detectASK_MAN() { +static bool detectASK_MAN(void) { bool stcheck = false; if (ASKDemod_ext("0 0 0", false, false, 1, &stcheck) != PM3_SUCCESS) { PrintAndLogEx(DEBUG, "DEBUG: Error - EM: ASK/Manchester Demod failed"); @@ -1145,7 +1145,7 @@ static bool detectASK_MAN() { return true; } -static bool detectASK_BI() { +static bool detectASK_BI(void) { int ans = ASKbiphaseDemod("0 0 1", false); if (ans != PM3_SUCCESS) { PrintAndLogEx(DEBUG, "DEBUG: Error - EM: ASK/biphase normal demod failed"); @@ -1158,7 +1158,7 @@ static bool detectASK_BI() { } return true; } -static bool detectNRZ() { +static bool detectNRZ(void) { int ans = NRZrawDemod("0 0 1", false); if (ans != PM3_SUCCESS) { PrintAndLogEx(DEBUG, "DEBUG: Error - EM: NRZ normal demod failed"); diff --git a/client/src/cmdlfhitag.c b/client/src/cmdlfhitag.c index 47971c713..4c35fedf1 100644 --- a/client/src/cmdlfhitag.c +++ b/client/src/cmdlfhitag.c @@ -22,7 +22,7 @@ static int CmdHelp(const char *Cmd); -static char *getHitagTypeStr(uint32_t uid) { +static const char *getHitagTypeStr(uint32_t uid) { //uid s/n ******** uint8_t type = (uid >> 4) & 0xF; switch (type) { diff --git a/client/src/cmdlfpcf7931.c b/client/src/cmdlfpcf7931.c index 4c2c9848c..2062c8582 100644 --- a/client/src/cmdlfpcf7931.c +++ b/client/src/cmdlfpcf7931.c @@ -32,7 +32,7 @@ struct pcf7931_config configPcf = { }; // Resets the configuration settings to default values. -int pcf7931_resetConfig() { +int pcf7931_resetConfig(void) { memset(configPcf.Pwd, 0xFF, sizeof(configPcf.Pwd)); configPcf.InitDelay = PCF7931_DEFAULT_INITDELAY; configPcf.OffsetWidth = PCF7931_DEFAULT_OFFSET_WIDTH; @@ -40,7 +40,7 @@ int pcf7931_resetConfig() { return PM3_SUCCESS; } -int pcf7931_printConfig() { +int pcf7931_printConfig(void) { PrintAndLogEx(NORMAL, "Password (LSB first on bytes) : %s", sprint_hex(configPcf.Pwd, sizeof(configPcf.Pwd))); PrintAndLogEx(NORMAL, "Tag initialization delay : %d us", configPcf.InitDelay); PrintAndLogEx(NORMAL, "Offset low pulses width : %d us", configPcf.OffsetWidth); @@ -48,7 +48,7 @@ int pcf7931_printConfig() { return PM3_SUCCESS; } -static int usage_pcf7931_read() { +static int usage_pcf7931_read(void) { PrintAndLogEx(NORMAL, "Usage: lf pcf7931 read [h] "); PrintAndLogEx(NORMAL, "This command tries to read a PCF7931 tag."); PrintAndLogEx(NORMAL, "Options:"); @@ -58,7 +58,7 @@ static int usage_pcf7931_read() { return PM3_SUCCESS; } -static int usage_pcf7931_write() { +static int usage_pcf7931_write(void) { PrintAndLogEx(NORMAL, "Usage: lf pcf7931 write [h] "); PrintAndLogEx(NORMAL, "This command tries to write a PCF7931 tag."); PrintAndLogEx(NORMAL, "Options:"); @@ -71,7 +71,7 @@ static int usage_pcf7931_write() { return PM3_SUCCESS; } -static int usage_pcf7931_config() { +static int usage_pcf7931_config(void) { PrintAndLogEx(NORMAL, "Usage: lf pcf7931 config [h] [r] "); PrintAndLogEx(NORMAL, "This command tries to set the configuration used with PCF7931 commands"); PrintAndLogEx(NORMAL, "The time offsets could be useful to correct slew rate generated by the antenna"); diff --git a/client/src/cmdlft55xx.c b/client/src/cmdlft55xx.c index 09f2009bd..7f7eccb19 100644 --- a/client/src/cmdlft55xx.c +++ b/client/src/cmdlft55xx.c @@ -57,7 +57,7 @@ t55xx_conf_block_t config = { t55xx_memory_item_t cardmem[T55x7_BLOCK_COUNT] = {{0}}; -t55xx_conf_block_t Get_t55xx_Config() { +t55xx_conf_block_t Get_t55xx_Config(void) { return config; } @@ -78,7 +78,7 @@ static void print_usage_t55xx_downloadlink(uint8_t ShowAll, uint8_t dl_mode_defa PrintAndLogEx(NORMAL, " 4 - Try all downlink modes%s", (dl_mode_default == 4) ? " (default)" : ""); } -static int usage_t55xx_config() { +static int usage_t55xx_config(void) { PrintAndLogEx(NORMAL, "Usage: lf t55xx config [c ] [d ] [i [0/1]] [o ] [Q5 [0/1]] [ST [0/1]]"); PrintAndLogEx(NORMAL, "Options:"); PrintAndLogEx(NORMAL, " h - This help"); @@ -99,7 +99,7 @@ static int usage_t55xx_config() { PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } -static int usage_t55xx_read() { +static int usage_t55xx_read(void) { PrintAndLogEx(NORMAL, "Usage: lf t55xx read [r ] b [p ] [o] "); PrintAndLogEx(NORMAL, "Options:"); PrintAndLogEx(NORMAL, " b - block number to read. Between 0-7"); @@ -119,7 +119,7 @@ static int usage_t55xx_read() { PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } -static int usage_t55xx_resetread() { +static int usage_t55xx_resetread(void) { PrintAndLogEx(NORMAL, "Send Reset Cmd then lf read the stream to attempt to identify the start of it (needs a demod and/or plot after)"); PrintAndLogEx(NORMAL, "Usage: lf t55xx resetread [r ]"); PrintAndLogEx(NORMAL, "Options:"); @@ -130,7 +130,7 @@ static int usage_t55xx_resetread() { PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } -static int usage_t55xx_write() { +static int usage_t55xx_write(void) { PrintAndLogEx(NORMAL, "Usage: lf t55xx write [r ] b d [p ] [1] [t] [v]"); PrintAndLogEx(NORMAL, "Options:"); PrintAndLogEx(NORMAL, " b - block number to write. Between 0-7"); @@ -148,7 +148,7 @@ static int usage_t55xx_write() { PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } -static int usage_t55xx_trace() { +static int usage_t55xx_trace(void) { PrintAndLogEx(NORMAL, "Usage: lf t55xx trace [1] [r mode]"); PrintAndLogEx(NORMAL, "Options:"); print_usage_t55xx_downloadlink(T55XX_DLMODE_SINGLE, config.downlink_mode); @@ -160,7 +160,7 @@ static int usage_t55xx_trace() { PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } -static int usage_t55xx_info() { +static int usage_t55xx_info(void) { PrintAndLogEx(NORMAL, "Usage: lf t55xx info [1] [r ] [c [q]]"); PrintAndLogEx(NORMAL, "Options:"); PrintAndLogEx(NORMAL, " (default) - read data from tag."); @@ -180,7 +180,7 @@ static int usage_t55xx_info() { PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } -static int usage_t55xx_dump() { +static int usage_t55xx_dump(void) { PrintAndLogEx(NORMAL, "Usage: lf t55xx dump [r ] [p [o]]"); PrintAndLogEx(NORMAL, "Options:"); PrintAndLogEx(NORMAL, " p - OPTIONAL password 4bytes (8 hex symbols)"); @@ -194,7 +194,7 @@ static int usage_t55xx_dump() { PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } -static int usage_t55xx_restore() { +static int usage_t55xx_restore(void) { PrintAndLogEx(NORMAL, "Usage: lf t55xx restore f [p password]"); PrintAndLogEx(NORMAL, "Options:"); PrintAndLogEx(NORMAL, " f - filename of the dump file (.bin/.eml)"); @@ -208,7 +208,7 @@ static int usage_t55xx_restore() { return PM3_SUCCESS; } -static int usage_t55xx_detect() { +static int usage_t55xx_detect(void) { PrintAndLogEx(NORMAL, "Usage: lf t55xx detect [1] [r ] [p ]"); PrintAndLogEx(NORMAL, "Options:"); PrintAndLogEx(NORMAL, " 1 - if set, use Graphbuffer otherwise read data from tag."); @@ -222,7 +222,7 @@ static int usage_t55xx_detect() { PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } -static int usage_t55xx_detectP1() { +static int usage_t55xx_detectP1(void) { PrintAndLogEx(NORMAL, "Command: Detect Page 1 of a t55xx chip"); PrintAndLogEx(NORMAL, "Usage: lf t55xx p1detect [1] [r ] [p ]"); PrintAndLogEx(NORMAL, "Options:"); @@ -237,7 +237,7 @@ static int usage_t55xx_detectP1() { PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } -static int usage_t55xx_wakup() { +static int usage_t55xx_wakup(void) { PrintAndLogEx(NORMAL, "Usage: lf t55xx wakeup [h] [r ] p "); PrintAndLogEx(NORMAL, "This commands sends the Answer-On-Request command and leaves the readerfield ON afterwards."); PrintAndLogEx(NORMAL, "Options:"); @@ -249,7 +249,7 @@ static int usage_t55xx_wakup() { PrintAndLogEx(NORMAL, " lf t55xx wakeup p 11223344 - send wakeup password"); return PM3_SUCCESS; } -static int usage_t55xx_chk() { +static int usage_t55xx_chk(void) { PrintAndLogEx(NORMAL, "This command uses a dictionary attack"); PrintAndLogEx(NORMAL, "press " _YELLOW_("'enter'") " to cancel the command"); PrintAndLogEx(NORMAL, _RED_("WARNING:") " this may brick non-password protected chips!"); @@ -267,7 +267,7 @@ static int usage_t55xx_chk() { PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } -static int usage_t55xx_bruteforce() { +static int usage_t55xx_bruteforce(void) { PrintAndLogEx(NORMAL, "This command uses bruteforce to scan a number range"); PrintAndLogEx(NORMAL, "press " _YELLOW_("'enter'") " to cancel the command"); PrintAndLogEx(NORMAL, _RED_("WARNING:") " this may brick non-password protected chips!"); @@ -285,7 +285,7 @@ static int usage_t55xx_bruteforce() { PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } -static int usage_t55xx_recoverpw() { +static int usage_t55xx_recoverpw(void) { PrintAndLogEx(NORMAL, "This command uses a few tricks to try to recover mangled password"); PrintAndLogEx(NORMAL, "press " _YELLOW_("'enter'") " to cancel the command"); PrintAndLogEx(NORMAL, _RED_("WARNING:") " this may brick non-password protected chips!"); @@ -306,7 +306,7 @@ static int usage_t55xx_recoverpw() { PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } -static int usage_t55xx_wipe() { +static int usage_t55xx_wipe(void) { PrintAndLogEx(NORMAL, "Usage: lf t55xx wipe [h] [Q5] [p ] [c ]"); PrintAndLogEx(NORMAL, "This commands wipes a tag, fills blocks 1-7 with zeros and a default configuration block"); PrintAndLogEx(NORMAL, "Options:"); @@ -319,7 +319,7 @@ static int usage_t55xx_wipe() { PrintAndLogEx(NORMAL, " lf t55xx wipe q - wipes a T5555 ( Q5 ) tag, config block 0x6001F004"); return PM3_SUCCESS; } -static int usage_t55xx_deviceconfig() { +static int usage_t55xx_deviceconfig(void) { PrintAndLogEx(NORMAL, "Sets t55x7 timings for direct commands. The timings are set here in Field Clocks (FC), \nwhich is converted to (US) on device"); PrintAndLogEx(NORMAL, "Usage: lf t55xx deviceconfig [r ] a b c d e f g [p]"); PrintAndLogEx(NORMAL, "Options:"); @@ -340,7 +340,7 @@ static int usage_t55xx_deviceconfig() { PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } -static int usage_t55xx_protect() { +static int usage_t55xx_protect(void) { PrintAndLogEx(NORMAL, "This command sets the pwd bit on T5577."); PrintAndLogEx(NORMAL, _RED_("WARNING:") " this locks the tag!"); PrintAndLogEx(NORMAL, "Usage: lf t55xx protect [r ] [p ] [o] [n ]"); @@ -356,7 +356,7 @@ static int usage_t55xx_protect() { PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } -static int usage_t55xx_dangerraw() { +static int usage_t55xx_dangerraw(void) { PrintAndLogEx(NORMAL, "This command allows to emit arbitrary raw commands on T5577 and cut the field after arbitrary duration."); PrintAndLogEx(NORMAL, _RED_("WARNING:") " this may lock definitively the tag in an unusable state!"); PrintAndLogEx(NORMAL, "Uncontrolled usage can easily write an invalid configuration, activate lock bits,"); @@ -372,7 +372,7 @@ static int usage_t55xx_dangerraw() { return PM3_SUCCESS; } -static int usage_t55xx_clonehelp() { +static int usage_t55xx_clonehelp(void) { PrintAndLogEx(NORMAL, "For cloning specific techs on T55xx tags, see commands available in corresponding LF sub-menus, e.g.:"); PrintAndLogEx(NORMAL, _GREEN_("lf awid clone")); // todo: rename to clone @@ -408,13 +408,13 @@ static int CmdT55xxCloneHelp(const char *Cmd) { return usage_t55xx_clonehelp(); } -void T55x7_SaveBlockData(uint8_t idx, uint32_t data) { +static void T55x7_SaveBlockData(uint8_t idx, uint32_t data) { if (idx < T55x7_BLOCK_COUNT) { cardmem[idx].valid = true; cardmem[idx].blockdata = data; } } -void T55x7_ClearAllBlockData(void) { +static void T55x7_ClearAllBlockData(void) { for (uint8_t idx = 0; idx < T55x7_BLOCK_COUNT; idx++) { cardmem[idx].valid = false; cardmem[idx].blockdata = 0x00; @@ -1011,7 +1011,7 @@ static int SanityOfflineCheck(bool useGraphBuffer) { return PM3_SUCCESS; } -void T55xx_Print_DownlinkMode(uint8_t downlink_mode) { +static void T55xx_Print_DownlinkMode(uint8_t downlink_mode) { char msg[80]; sprintf(msg, "Downlink Mode used : "); diff --git a/client/src/cmdmain.c b/client/src/cmdmain.c index f9cfe310a..1e9c8d257 100644 --- a/client/src/cmdmain.c +++ b/client/src/cmdmain.c @@ -79,7 +79,7 @@ static int usage_auto(void) { return PM3_SUCCESS; } -static void AppendDate(char *s, size_t slen, char *fmt) { +static void AppendDate(char *s, size_t slen, const char *fmt) { struct tm *ct, tm_buf; time_t now = time(NULL); #if defined(_WIN32) @@ -287,7 +287,7 @@ int CommandReceived(char *Cmd) { return CmdsParse(CommandTable, Cmd); } -command_t *getTopLevelCommandTable() { +command_t *getTopLevelCommandTable(void) { return CommandTable; } diff --git a/client/src/cmdsmartcard.c b/client/src/cmdsmartcard.c index ba48fae96..f21ef5c4a 100644 --- a/client/src/cmdsmartcard.c +++ b/client/src/cmdsmartcard.c @@ -875,7 +875,7 @@ static int CmdSmartList(const char *Cmd) { return 0; } -static void smart_brute_prim() { +static void smart_brute_prim(void) { uint8_t *buf = calloc(PM3_CMD_DATA_SIZE, sizeof(uint8_t)); if (!buf) diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index 41c102aa1..85d2bea09 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -25,7 +25,7 @@ static int CmdHelp(const char *Cmd); static uint8_t *trace; long traceLen = 0; -static int usage_trace_list() { +static int usage_trace_list(void) { PrintAndLogEx(NORMAL, "List protocol data in trace buffer."); PrintAndLogEx(NORMAL, "Usage: trace list [f][c| <0|1>"); PrintAndLogEx(NORMAL, " f - show frame delay times as well"); @@ -56,14 +56,14 @@ static int usage_trace_list() { PrintAndLogEx(NORMAL, " trace list iclass"); return PM3_SUCCESS; } -static int usage_trace_load() { +static int usage_trace_load(void) { PrintAndLogEx(NORMAL, "Load protocol data from file to trace buffer."); PrintAndLogEx(NORMAL, "Usage: trace load "); PrintAndLogEx(NORMAL, "Examples:"); PrintAndLogEx(NORMAL, " trace load mytracefile.bin"); return PM3_SUCCESS; } -static int usage_trace_save() { +static int usage_trace_save(void) { PrintAndLogEx(NORMAL, "Save protocol data from trace buffer to file."); PrintAndLogEx(NORMAL, "Usage: trace save "); PrintAndLogEx(NORMAL, "Examples:"); diff --git a/client/src/cmdusart.c b/client/src/cmdusart.c index 3168d66b7..56d4b88bb 100644 --- a/client/src/cmdusart.c +++ b/client/src/cmdusart.c @@ -274,7 +274,7 @@ static int usart_bt_testcomm(uint32_t baudrate, uint8_t parity) { if (ret != PM3_SUCCESS) return ret; - char *string = "AT+VERSION"; + const char *string = "AT+VERSION"; uint8_t data[PM3_CMD_DATA_SIZE] = {0x00}; size_t len = 0; @@ -359,7 +359,7 @@ static int CmdUsartBtFactory(const char *Cmd) { } PrintAndLogEx(INFO, "Reconfiguring add-on to default settings."); - char *string; + const char *string; uint8_t data[PM3_CMD_DATA_SIZE]; size_t len = 0; memset(data, 0, sizeof(data)); diff --git a/client/src/cmdwiegand.c b/client/src/cmdwiegand.c index 3c939261f..19f166284 100644 --- a/client/src/cmdwiegand.c +++ b/client/src/cmdwiegand.c @@ -24,11 +24,11 @@ static int CmdHelp(const char *Cmd); -static int usage_wiegand_list() { +static int usage_wiegand_list(void) { PrintAndLogEx(NORMAL, "List available wiegand formats"); return PM3_SUCCESS; } -static int usage_wiegand_encode() { +static int usage_wiegand_encode(void) { PrintAndLogEx(NORMAL, "Encode wiegand formatted number to raw hex"); PrintAndLogEx(NORMAL, "Usage: wiegand encode [w ] [ ] {...}"); PrintAndLogEx(NORMAL, "Options:"); @@ -42,7 +42,7 @@ static int usage_wiegand_encode() { PrintAndLogEx(NORMAL, " wiegand encode w H10301 f 101 c 1337"); return PM3_SUCCESS; } -static int usage_wiegand_decode() { +static int usage_wiegand_decode(void) { PrintAndLogEx(NORMAL, "Decode raw hex to wiegand format"); PrintAndLogEx(NORMAL, "Usage: wiegand decode [id]

"); PrintAndLogEx(NORMAL, " p ignore invalid parity"); @@ -52,7 +52,7 @@ static int usage_wiegand_decode() { return PM3_SUCCESS; } -void PrintTagId(wiegand_message_t *packed) { +static void PrintTagId(wiegand_message_t *packed) { if (packed->Top != 0) { PrintAndLogEx(SUCCESS, "Card ID: %X%08X%08X", (uint32_t)packed->Top, diff --git a/client/src/comms.c b/client/src/comms.c index 36f035bdd..de5eafb24 100644 --- a/client/src/comms.c +++ b/client/src/comms.c @@ -202,7 +202,7 @@ void SendCommandMIX(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, v * A better method could have been to have explicit command-ACKS, so we can know which ACK goes to which * operation. Right now we'll just have to live with this. */ -void clearCommandBuffer() { +void clearCommandBuffer(void) { //This is a very simple operation pthread_mutex_lock(&rxBufferMutex); cmd_tail = cmd_head; diff --git a/client/src/fileutils.c b/client/src/fileutils.c index 4ccd4fa8f..ac9196e4c 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -1360,7 +1360,7 @@ static int searchFinalFile(char **foundpath, const char *pm3dir, const char *sea (strcmp(FIRMWARES_SUBDIR, pm3dir) == 0) || (strcmp(BOOTROM_SUBDIR, pm3dir) == 0) || (strcmp(FULLIMAGE_SUBDIR, pm3dir) == 0))) { - char *above = "../"; + const char *above = "../"; char *path = calloc(strlen(exec_path) + strlen(above) + strlen(pm3dir) + strlen(filename) + 1, sizeof(char)); if (path == NULL) goto out; diff --git a/client/src/graph.c b/client/src/graph.c index d5f62a6b7..2d75f3d30 100644 --- a/client/src/graph.c +++ b/client/src/graph.c @@ -116,7 +116,7 @@ bool isGraphBitstream(void) { return true; } -void convertGraphFromBitstream() { +void convertGraphFromBitstream(void) { convertGraphFromBitstreamEx(1, 0); } diff --git a/client/src/loclass/cipher.c b/client/src/loclass/cipher.c index 080ff66f5..9cc683300 100644 --- a/client/src/loclass/cipher.c +++ b/client/src/loclass/cipher.c @@ -283,7 +283,7 @@ void doMAC_N(uint8_t *address_data_p, uint8_t address_data_size, uint8_t *div_ke } #ifndef ON_DEVICE -int testMAC() { +int testMAC(void) { PrintAndLogEx(SUCCESS, "Testing MAC calculation..."); //From the "dismantling.IClass" paper: diff --git a/client/src/loclass/cipherutils.c b/client/src/loclass/cipherutils.c index 09f4bccd7..95628226d 100644 --- a/client/src/loclass/cipherutils.c +++ b/client/src/loclass/cipherutils.c @@ -190,7 +190,7 @@ void printarr_human_readable(const char *title, uint8_t *arr, int len) { //----------------------------- #ifndef ON_DEVICE -static int testBitStream() { +static int testBitStream(void) { uint8_t input [] = {0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF}; uint8_t output [] = {0, 0, 0, 0, 0, 0, 0, 0}; BitstreamIn in = { input, sizeof(input) * 8, 0}; @@ -215,7 +215,7 @@ static int testBitStream() { return PM3_SUCCESS; } -static int testReversedBitstream() { +static int testReversedBitstream(void) { uint8_t input [] = {0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF}; uint8_t reverse [] = {0, 0, 0, 0, 0, 0, 0, 0}; uint8_t output [] = {0, 0, 0, 0, 0, 0, 0, 0}; diff --git a/client/src/loclass/elite_crack.c b/client/src/loclass/elite_crack.c index 03a9a3080..5ef58f01e 100644 --- a/client/src/loclass/elite_crack.c +++ b/client/src/loclass/elite_crack.c @@ -568,7 +568,7 @@ int bruteforceFileNoKeys(const char *filename) { // ---------------------------------------------------------------------------- // TEST CODE BELOW // ---------------------------------------------------------------------------- -static int _testBruteforce() { +static int _testBruteforce(void) { PrintAndLogEx(INFO, "Testing crack from dumpfile..."); @@ -596,7 +596,7 @@ static int _testBruteforce() { return errors; } -static int _test_iclass_key_permutation() { +static int _test_iclass_key_permutation(void) { uint8_t testcase[8] = {0x6c, 0x8d, 0x44, 0xf9, 0x2a, 0x2d, 0x01, 0xbf}; uint8_t testcase_output[8] = {0}; uint8_t testcase_output_correct[8] = {0x8a, 0x0d, 0xb9, 0x88, 0xbb, 0xa7, 0x90, 0xea}; @@ -622,7 +622,7 @@ static int _test_iclass_key_permutation() { return 0; } -static int _testHash1() { +static int _testHash1(void) { uint8_t expected[8] = {0x7E, 0x72, 0x2F, 0x40, 0x2D, 0x02, 0x51, 0x42}; uint8_t csn[8] = {0x01, 0x02, 0x03, 0x04, 0xF7, 0xFF, 0x12, 0xE0}; uint8_t k[8] = {0}; diff --git a/client/src/loclass/ikeys.c b/client/src/loclass/ikeys.c index 11a082867..3bbe9fc2b 100644 --- a/client/src/loclass/ikeys.c +++ b/client/src/loclass/ikeys.c @@ -219,7 +219,7 @@ static void permute(BitstreamIn *p_in, uint64_t z, int l, int r, BitstreamOut *o } } -static void printbegin() { +static void printbegin(void) { if (debug_print < 2) return; @@ -369,7 +369,7 @@ void diversifyKey(uint8_t csn[8], uint8_t key[8], uint8_t div_key[8]) { hash0(crypt_csn, div_key); } /* -static void testPermute() { +static void testPermute(void) { uint64_t x = 0; pushbackSixBitByte(&x, 0x00, 0); pushbackSixBitByte(&x, 0x01, 1); @@ -555,7 +555,7 @@ Testcase testcases[] = { {{0}, {0}, {0}} }; -static int testKeyDiversificationWithMasterkeyTestcases() { +static int testKeyDiversificationWithMasterkeyTestcases(void) { int i, error = 0; uint8_t empty[8] = {0}; @@ -630,7 +630,7 @@ static int testDES2(uint64_t csn, uint64_t expected) { * @brief doTestsWithKnownInputs * @return */ -static int doTestsWithKnownInputs() { +static int doTestsWithKnownInputs(void) { // KSel from http://www.proxmark.org/forum/viewtopic.php?pid=10977#p10977 int errors = 0; PrintAndLogEx(SUCCESS, "Testing DES encryption"); diff --git a/client/src/pm3_binlib.c b/client/src/pm3_binlib.c index d694ee3b0..f4e49c137 100644 --- a/client/src/pm3_binlib.c +++ b/client/src/pm3_binlib.c @@ -318,6 +318,7 @@ static const luaL_Reg binlib[] = { {NULL, NULL} }; +LUALIB_API int luaopen_binlib(lua_State *L); LUALIB_API int luaopen_binlib(lua_State *L) { luaL_newlib(L, binlib); return 1; diff --git a/client/src/pm3_bitlib.c b/client/src/pm3_bitlib.c index 15fdbd5d0..b5ef6e0ae 100644 --- a/client/src/pm3_bitlib.c +++ b/client/src/pm3_bitlib.c @@ -126,6 +126,7 @@ static const struct luaL_Reg bitlib[] = { {NULL, NULL} }; +LUALIB_API int luaopen_bit(lua_State *L); LUALIB_API int luaopen_bit(lua_State *L) { luaL_newlib(L, bitlib); //luaL_register(L, "bit", bitlib); diff --git a/client/src/preferences.c b/client/src/preferences.c index 4f92eb06e..0ef715075 100644 --- a/client/src/preferences.c +++ b/client/src/preferences.c @@ -44,7 +44,7 @@ static char *prefGetFilename(void) { if (searchHomeFilePath(&path, preferencesFilename, false) == PM3_SUCCESS) return path; else - return preferencesFilename; + return strdup(preferencesFilename); } int preferences_load(void) { @@ -314,7 +314,7 @@ void preferences_load_callback(json_t *root) { // Help Functions -static int usage_set_emoji() { +static int usage_set_emoji(void) { PrintAndLogEx(NORMAL, "Usage: pref set emoji "); PrintAndLogEx(NORMAL, "Options:"); PrintAndLogEx(NORMAL, " "_GREEN_("help")" - This help"); @@ -325,7 +325,7 @@ static int usage_set_emoji() { return PM3_SUCCESS; } -static int usage_set_color() { +static int usage_set_color(void) { PrintAndLogEx(NORMAL, "Usage: pref set color "); PrintAndLogEx(NORMAL, "Options:"); PrintAndLogEx(NORMAL, " "_GREEN_("help")" - This help"); @@ -334,7 +334,7 @@ static int usage_set_color() { return PM3_SUCCESS; } -static int usage_set_debug() { +static int usage_set_debug(void) { PrintAndLogEx(NORMAL, "Usage: pref set clientdebug "); PrintAndLogEx(NORMAL, "Options:"); PrintAndLogEx(NORMAL, " "_GREEN_("help")" - This help"); @@ -344,7 +344,7 @@ static int usage_set_debug() { return PM3_SUCCESS; } /* -static int usage_set_devicedebug() { +static int usage_set_devicedebug(void) { PrintAndLogEx(NORMAL, "Usage: pref set devicedebug "); PrintAndLogEx(NORMAL, "Options:"); PrintAndLogEx(NORMAL, " "_GREEN_("help")" - This help"); @@ -357,7 +357,7 @@ static int usage_set_devicedebug() { return PM3_SUCCESS; } */ -static int usage_set_hints() { +static int usage_set_hints(void) { PrintAndLogEx(NORMAL, "Usage: pref set hints "); PrintAndLogEx(NORMAL, "Options:"); PrintAndLogEx(NORMAL, " "_GREEN_("help")" - This help"); @@ -366,7 +366,7 @@ static int usage_set_hints() { return PM3_SUCCESS; } /* -static int usage_set_savePaths() { +static int usage_set_savePaths(void) { PrintAndLogEx(NORMAL, "Usage: pref set savepaths [help] [create] [default ] [dump ] [trace ]"); PrintAndLogEx(NORMAL, "Options:"); PrintAndLogEx(NORMAL, " "_GREEN_("help")" - This help"); @@ -382,7 +382,7 @@ static int usage_set_savePaths() { // typedef enum preferenceId {prefNONE,prefHELP,prefEMOJI,prefCOLOR,prefPLOT,prefOVERLAY,prefHINTS,prefCLIENTDEBUG} preferenceId_t; typedef enum prefShowOpt {prefShowNone, prefShowOLD, prefShowNEW} prefShowOpt_t; -const char *prefShowMsg(prefShowOpt_t Opt) { +static const char *prefShowMsg(prefShowOpt_t Opt) { switch (Opt) { case prefShowOLD: return _YELLOW_("[old]"); @@ -395,7 +395,7 @@ const char *prefShowMsg(prefShowOpt_t Opt) { return ""; } -void showEmojiState(prefShowOpt_t Opt) { +static void showEmojiState(prefShowOpt_t Opt) { switch (session.emoji_mode) { case ALIAS: @@ -415,7 +415,7 @@ void showEmojiState(prefShowOpt_t Opt) { } } -void showColorState(prefShowOpt_t Opt) { +static void showColorState(prefShowOpt_t Opt) { if (session.supports_colors) PrintAndLogEx(NORMAL, " %s color.................. "_GREEN_("ansi"), prefShowMsg(Opt)); @@ -423,7 +423,7 @@ void showColorState(prefShowOpt_t Opt) { PrintAndLogEx(NORMAL, " %s color.................. "_WHITE_("off"), prefShowMsg(Opt)); } -void showClientDebugState(prefShowOpt_t Opt) { +static void showClientDebugState(prefShowOpt_t Opt) { switch (session.client_debug_level) { case cdbOFF: @@ -440,7 +440,7 @@ void showClientDebugState(prefShowOpt_t Opt) { } } /* -void showDeviceDebugState(prefShowOpt_t Opt) { +static void showDeviceDebugState(prefShowOpt_t Opt) { switch (session.device_debug_level) { case ddbOFF: PrintAndLogEx(NORMAL, " %s device debug........... "_WHITE_("off"), prefShowMsg(Opt)); @@ -463,7 +463,7 @@ void showDeviceDebugState(prefShowOpt_t Opt) { } */ /* -void showSavePathState(savePaths_t pathIndex, prefShowOpt_t Opt) { +static void showSavePathState(savePaths_t pathIndex, prefShowOpt_t Opt) { char tempStr[50]; @@ -485,18 +485,19 @@ void showSavePathState(savePaths_t pathIndex, prefShowOpt_t Opt) { else PrintAndLogEx(NORMAL, " %s %s "_GREEN_("%s"), prefShowMsg(Opt), tempStr, session.defaultPaths[pathIndex]); } -*/ -void showPlotPosState(void) { + +static void showPlotPosState(void) { PrintAndLogEx(NORMAL, " Plot window............ X "_GREEN_("%4d")" Y "_GREEN_("%4d")" H "_GREEN_("%4d")" W "_GREEN_("%4d"), session.plot.x, session.plot.y, session.plot.h, session.plot.w); } -void showOverlayPosState(void) { +static void showOverlayPosState(void) { PrintAndLogEx(NORMAL, " Slider/Overlay window.. X "_GREEN_("%4d")" Y "_GREEN_("%4d")" H "_GREEN_("%4d")" W "_GREEN_("%4d"), session.overlay.x, session.overlay.y, session.overlay.h, session.overlay.w); } +*/ -void showHintsState(prefShowOpt_t Opt) { +static void showHintsState(prefShowOpt_t Opt) { if (session.show_hints) PrintAndLogEx(NORMAL, " %s hints.................. "_GREEN_("on"), prefShowMsg(Opt)); else @@ -850,28 +851,28 @@ static int setCmdSavePaths (const char *Cmd) { return PM3_SUCCESS; } -*/ -int getCmdHelp(const char *Cmd) { +static int getCmdHelp(const char *Cmd) { return PM3_SUCCESS; } +*/ -int getCmdEmoji(const char *Cmd) { +static int getCmdEmoji(const char *Cmd) { showEmojiState(prefShowNone); return PM3_SUCCESS; } -int getCmdHint(const char *Cmd) { +static int getCmdHint(const char *Cmd) { showHintsState(prefShowNone); return PM3_SUCCESS; } -int getCmdColor(const char *Cmd) { +static int getCmdColor(const char *Cmd) { showColorState(prefShowNone); return PM3_SUCCESS; } -int getCmdDebug(const char *Cmd) { +static int getCmdDebug(const char *Cmd) { showClientDebugState(prefShowNone); return PM3_SUCCESS; } @@ -904,12 +905,12 @@ static int setCmdHelp(const char *Cmd) { return PM3_SUCCESS; } -int CmdPrefGet(const char *Cmd) { +static int CmdPrefGet(const char *Cmd) { clearCommandBuffer(); return CmdsParse(getCommandTable, Cmd); } -int CmdPrefSet(const char *Cmd) { +static int CmdPrefSet(const char *Cmd) { clearCommandBuffer(); return CmdsParse(setCommandTable, Cmd); } diff --git a/client/src/proxgui.h b/client/src/proxgui.h index c9cd0096d..bfcbc78e1 100644 --- a/client/src/proxgui.h +++ b/client/src/proxgui.h @@ -59,7 +59,6 @@ extern uint8_t g_debugMode; #ifndef FILE_PATH_SIZE #define FILE_PATH_SIZE 1000 #endif -extern uint8_t gui_serial_port_name[FILE_PATH_SIZE]; #ifdef __cplusplus } diff --git a/client/src/proxguiqt.cpp b/client/src/proxguiqt.cpp index 855b41c87..59bbddb69 100644 --- a/client/src/proxguiqt.cpp +++ b/client/src/proxguiqt.cpp @@ -27,6 +27,7 @@ #include "proxgui.h" #include #include "ui.h" +#include "comms.h" extern "C" int preferences_save(void); diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index 6010fb981..80fd958b1 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -116,8 +116,8 @@ static void showBanner(void) { static const char *prompt_dev = ""; static const char *prompt_ctx = ""; -static void prompt_compose(char *buf, size_t buflen, const char *prompt_ctx, const char *prompt_dev) { - snprintf(buf, buflen - 1, PROXPROMPT_COMPOSE, prompt_dev, prompt_ctx); +static void prompt_compose(char *buf, size_t buflen, const char *promptctx, const char *promptdev) { + snprintf(buf, buflen - 1, PROXPROMPT_COMPOSE, promptdev, promptctx); } static int check_comm(void) { @@ -155,11 +155,11 @@ int push_cmdscriptfile(char *path, bool stayafter) { return PM3_SUCCESS; } -static FILE *current_cmdscriptfile() { +static FILE *current_cmdscriptfile(void) { return cmdscriptfile[cmdscriptfile_idx]; } -static bool pop_cmdscriptfile() { +static bool pop_cmdscriptfile(void) { fclose(cmdscriptfile[cmdscriptfile_idx]); cmdscriptfile[cmdscriptfile_idx--] = NULL; if (cmdscriptfile_idx == 0) diff --git a/client/src/util.c b/client/src/util.c index 3d0c6bd87..fb131e987 100644 --- a/client/src/util.c +++ b/client/src/util.c @@ -823,12 +823,6 @@ void wiegand_add_parity_swapped(uint8_t *target, uint8_t *source, uint8_t length *(target) = GetParity(source + length / 2, EVEN, length / 2); } -// xor two arrays together for len items. The dst array contains the new xored values. -void xor(unsigned char *dst, unsigned char *src, size_t len) { - for (; len > 0; len--, dst++, src++) - *dst ^= *src; -} - // Pack a bitarray into a uint32_t. uint32_t PackBits(uint8_t start, uint8_t len, uint8_t *bits) { diff --git a/client/src/util.h b/client/src/util.h index 59591ac24..3f67c33f4 100644 --- a/client/src/util.h +++ b/client/src/util.h @@ -21,8 +21,8 @@ # define FILE_PATH_SIZE 1000 #endif -uint8_t g_debugMode; -uint8_t g_printAndLog; +extern uint8_t g_debugMode; +extern uint8_t g_printAndLog; #define PRINTANDLOG_PRINT 1 #define PRINTANDLOG_LOG 2 diff --git a/client/src/wiegand_formats.c b/client/src/wiegand_formats.c index 0c3c09fb6..13c08f143 100644 --- a/client/src/wiegand_formats.c +++ b/client/src/wiegand_formats.c @@ -602,7 +602,7 @@ static const cardformat_t FormatTable[] = { {NULL, NULL, NULL, NULL, {0, 0, 0, 0, 0}} // Must null terminate array }; -void HIDListFormats() { +void HIDListFormats(void) { if (FormatTable[0].Name == NULL) return; diff --git a/client/src/wiegand_formats.h b/client/src/wiegand_formats.h index 2b9b3df05..4ac36fdcf 100644 --- a/client/src/wiegand_formats.h +++ b/client/src/wiegand_formats.h @@ -39,7 +39,7 @@ typedef struct { cardformatdescriptor_t Fields; } cardformat_t; -void HIDListFormats(); +void HIDListFormats(void); int HIDFindCardFormat(const char *format); cardformat_t HIDGetCardFormat(int idx); bool HIDPack(int format_idx, wiegand_card_t *card, wiegand_message_t *packed); diff --git a/client/src/wiegand_formatutils.c b/client/src/wiegand_formatutils.c index 836da717d..cee0590ac 100644 --- a/client/src/wiegand_formatutils.c +++ b/client/src/wiegand_formatutils.c @@ -64,7 +64,7 @@ bool set_bit_by_position(wiegand_message_t *data, bool value, uint8_t pos) { * If the definition of the wiegand_message struct changes, this function must also * be updated to match. */ -void message_datacopy(wiegand_message_t *src, wiegand_message_t *dest) { +static void message_datacopy(wiegand_message_t *src, wiegand_message_t *dest) { dest->Bot = src->Bot; dest->Mid = src->Mid; dest->Top = src->Top; From 6221d28e4328649c87b3819b715303a06bd04d82 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 3 May 2020 12:19:42 +0200 Subject: [PATCH 050/632] cflags --- client/Makefile | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/client/Makefile b/client/Makefile index 1f857e584..1cdc18f73 100644 --- a/client/Makefile +++ b/client/Makefile @@ -56,8 +56,13 @@ ZLIB = $(OBJDIR)/libz.a LIBS = -I$(LUALIBPATH) -I$(MBEDTLSLIBPATH) -I$(JANSSONLIBPATH) -I$(CBORLIBPATH) -I$(ZLIBPATH) -I$(REVENGPATH) -I$(AMIIBOLIBPATH) -I$(HARDNESTEDPATH) -I$(CLIPARSERPATH) INCLUDES_CLIENT += -I./src -I../include -I../common -I../common_fpga $(LIBS) #CFLAGS ?= -Wall -Werror -O3 -CFLAGS ?= -Wall -Werror -O3 -Wchar-subscripts -Wundef -Wcast-align -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wstrict-prototypes -Wnested-externs -Wmissing-declarations -# -Wshadow -Wmissing-prototypes -Wredundant-decls +ifneq ($(platform),Darwin) +# readline has strict-prototype issues +CFLAGS ?= -Wall -Werror -O3 -Wmissing-prototypes -Wchar-subscripts -Wundef -Wcast-align -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations +else +CFLAGS ?= -Wall -Werror -O3 -Wmissing-prototypes -Wchar-subscripts -Wundef -Wcast-align -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wstrict-prototypes -Wnested-externs -Wmissing-declarations +endif +# -Wshadow -Wredundant-decls # -Wbad-function-cast -Wextra -Wswitch-enum -Wold-style-definition # We cannot just use CFLAGS+=... because it has impact on sub-makes if CFLAGS is defined in env: From 19be62f7e6a74a01dc9844d3fdc334c176b0b65d Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 3 May 2020 12:23:55 +0200 Subject: [PATCH 051/632] stricter warnings: Wredundant-decls --- client/Makefile | 6 +++--- client/src/cmddata.h | 1 - client/src/cmdhfmfu.h | 9 --------- client/src/graph.h | 5 +---- client/src/proxgui.h | 19 ------------------- client/src/proxguiqt.cpp | 6 ++++-- client/src/scripting.c | 1 + client/src/ui.h | 2 +- common/lfdemod.c | 1 + 9 files changed, 11 insertions(+), 39 deletions(-) diff --git a/client/Makefile b/client/Makefile index 1cdc18f73..cbbf07e15 100644 --- a/client/Makefile +++ b/client/Makefile @@ -58,11 +58,11 @@ INCLUDES_CLIENT += -I./src -I../include -I../common -I../common_fpga $(LIBS) #CFLAGS ?= -Wall -Werror -O3 ifneq ($(platform),Darwin) # readline has strict-prototype issues -CFLAGS ?= -Wall -Werror -O3 -Wmissing-prototypes -Wchar-subscripts -Wundef -Wcast-align -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations +CFLAGS ?= -Wall -Werror -O3 -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wundef -Wcast-align -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations else -CFLAGS ?= -Wall -Werror -O3 -Wmissing-prototypes -Wchar-subscripts -Wundef -Wcast-align -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wstrict-prototypes -Wnested-externs -Wmissing-declarations +CFLAGS ?= -Wall -Werror -O3 -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wundef -Wcast-align -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wstrict-prototypes -Wnested-externs -Wmissing-declarations endif -# -Wshadow -Wredundant-decls +# -Wshadow # -Wbad-function-cast -Wextra -Wswitch-enum -Wold-style-definition # We cannot just use CFLAGS+=... because it has impact on sub-makes if CFLAGS is defined in env: diff --git a/client/src/cmddata.h b/client/src/cmddata.h index a19bead27..4a740f8a2 100644 --- a/client/src/cmddata.h +++ b/client/src/cmddata.h @@ -81,6 +81,5 @@ extern size_t DemodBufferLen; extern int g_DemodClock; extern size_t g_DemodStartIdx; -extern uint8_t g_debugMode; #endif diff --git a/client/src/cmdhfmfu.h b/client/src/cmdhfmfu.h index be52b1ed8..0f87cb3f6 100644 --- a/client/src/cmdhfmfu.h +++ b/client/src/cmdhfmfu.h @@ -29,15 +29,6 @@ void printMFUdumpEx(mfu_dump_t *card, uint16_t pages, uint8_t startpage); int CmdHFMFUltra(const char *Cmd); -uint32_t ul_ev1_pwdgenA(uint8_t *uid); -uint32_t ul_ev1_pwdgenB(uint8_t *uid); -uint32_t ul_ev1_pwdgenC(uint8_t *uid); -uint32_t ul_ev1_pwdgenD(uint8_t *uid); - -uint16_t ul_ev1_packgenA(uint8_t *uid); -uint16_t ul_ev1_packgenB(uint8_t *uid); -uint16_t ul_ev1_packgenC(uint8_t *uid); -uint16_t ul_ev1_packgenD(uint8_t *uid); uint16_t ul_ev1_packgen_VCNEW(uint8_t *uid, uint32_t pwd); uint32_t ul_ev1_otpgenA(uint8_t *uid); diff --git a/client/src/graph.h b/client/src/graph.h index 01b20c7e2..b753f418d 100644 --- a/client/src/graph.h +++ b/client/src/graph.h @@ -30,10 +30,7 @@ int GetNrzClock(const char *str, bool printAns); int GetFskClock(const char *str, bool printAns); bool fskClocks(uint8_t *fc1, uint8_t *fc2, uint8_t *rf1, int *firstClockEdge); -// Max graph trace len: 40000 (bigbuf) * 8 (at 1 bit per sample) -#ifndef MAX_GRAPH_TRACE_LEN -#define MAX_GRAPH_TRACE_LEN (40000 * 8 ) -#endif +#define MAX_GRAPH_TRACE_LEN (40000 * 8) #define GRAPH_SAVE 1 #define GRAPH_RESTORE 0 diff --git a/client/src/proxgui.h b/client/src/proxgui.h index bfcbc78e1..4666cccc3 100644 --- a/client/src/proxgui.h +++ b/client/src/proxgui.h @@ -26,12 +26,6 @@ void RepaintGraphWindow(void); void MainGraphics(void); void InitGraphics(int argc, char **argv, char *script_cmds_file, char *script_cmd, bool stayInCommandLoop); void ExitGraphics(void); -#ifndef MAX_GRAPH_TRACE_LEN -#define MAX_GRAPH_TRACE_LEN (40000 * 8) -#endif -extern int GraphBuffer[MAX_GRAPH_TRACE_LEN]; -extern size_t GraphTraceLen; -extern int s_Buff[MAX_GRAPH_TRACE_LEN]; extern double CursorScaleFactor; extern int PlotGridX, PlotGridY, PlotGridXdefault, PlotGridYdefault, GridOffset; @@ -40,21 +34,8 @@ extern int CommandFinished; extern int offline; extern bool GridLocked; -//Operations defined in data_operations -//int autoCorr(const int* in, int *out, size_t len, int window); -int AskEdgeDetect(const int *in, int *out, int len, int threshold); -int AutoCorrelate(const int *in, int *out, size_t len, size_t window, bool SaveGrph, bool verbose); -int directionalThreshold(const int *in, int *out, size_t len, int8_t up, int8_t down); -void save_restoreGB(uint8_t saveOpt); - #define GRAPH_SAVE 1 #define GRAPH_RESTORE 0 -#define MAX_DEMOD_BUF_LEN (1024*128) -extern uint8_t DemodBuffer[MAX_DEMOD_BUF_LEN]; -extern size_t DemodBufferLen; -extern size_t g_DemodStartIdx; -extern bool showDemod; -extern uint8_t g_debugMode; #ifndef FILE_PATH_SIZE #define FILE_PATH_SIZE 1000 diff --git a/client/src/proxguiqt.cpp b/client/src/proxguiqt.cpp index 59bbddb69..7f0dcb8a8 100644 --- a/client/src/proxguiqt.cpp +++ b/client/src/proxguiqt.cpp @@ -26,12 +26,14 @@ #include #include "proxgui.h" #include -#include "ui.h" -#include "comms.h" extern "C" int preferences_save(void); extern "C" { +#include "ui.h" +#include "comms.h" +#include "graph.h" +#include "cmddata.h" #include "util_darwin.h" } diff --git a/client/src/scripting.c b/client/src/scripting.c index 756799626..25bda6322 100644 --- a/client/src/scripting.c +++ b/client/src/scripting.c @@ -33,6 +33,7 @@ #include "protocols.h" #include "fileutils.h" // searchfile #include "cmdlf.h" // lf_config +#include "generator.h" static int returnToLuaWithError(lua_State *L, const char *fmt, ...) { char buffer[200]; diff --git a/client/src/ui.h b/client/src/ui.h index ee101601e..8ba9c06a4 100644 --- a/client/src/ui.h +++ b/client/src/ui.h @@ -42,7 +42,7 @@ typedef struct { } session_arg_t; extern session_arg_t session; - +extern bool showDemod; #ifndef M_PI #define M_PI 3.14159265358979323846264338327 #endif diff --git a/common/lfdemod.c b/common/lfdemod.c index 8b10b2fb3..ee6d6afe0 100644 --- a/common/lfdemod.c +++ b/common/lfdemod.c @@ -51,6 +51,7 @@ #ifndef ON_DEVICE #include "ui.h" +#include "util.h" # include "cmddata.h" # define prnt(args...) PrintAndLogEx(DEBUG, ## args ); #else From ed1fb14f5f00fe65d76a8b1057b4a6eac9030bf9 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 3 May 2020 12:46:46 +0200 Subject: [PATCH 052/632] rework C includes in C++ --- client/src/cmddata.h | 7 +++++++ client/src/comms.h | 7 +++++++ client/src/graph.h | 7 +++++++ client/src/proxgui.h | 1 - client/src/proxguiqt.cpp | 9 +++------ client/src/ui.h | 9 ++++++++- client/src/util_darwin.h | 7 +++++++ 7 files changed, 39 insertions(+), 8 deletions(-) diff --git a/client/src/cmddata.h b/client/src/cmddata.h index 4a740f8a2..a7a69e430 100644 --- a/client/src/cmddata.h +++ b/client/src/cmddata.h @@ -13,6 +13,10 @@ #include "common.h" +#ifdef __cplusplus +extern "C" { +#endif + //#include //size_t int CmdData(const char *Cmd); @@ -82,4 +86,7 @@ extern size_t DemodBufferLen; extern int g_DemodClock; extern size_t g_DemodStartIdx; +#ifdef __cplusplus +} +#endif #endif diff --git a/client/src/comms.h b/client/src/comms.h index 288e8a326..42f5580a6 100644 --- a/client/src/comms.h +++ b/client/src/comms.h @@ -16,6 +16,10 @@ #include "pm3_cmd.h" // Packet structs #include "util.h" // FILE_PATH_SIZE +#ifdef __cplusplus +extern "C" { +#endif + #ifndef DropField #define DropField() { \ clearCommandBuffer(); SendCommandNG(CMD_HF_DROPFIELD, NULL, 0); \ @@ -83,6 +87,9 @@ bool WaitForResponse(uint32_t cmd, PacketResponseNG *response); //bool GetFromDevice(DeviceMemType_t memtype, uint8_t *dest, uint32_t bytes, uint32_t start_index, PacketResponseNG *response, size_t ms_timeout, bool show_warning); bool GetFromDevice(DeviceMemType_t memtype, uint8_t *dest, uint32_t bytes, uint32_t start_index, uint8_t *data, uint32_t datalen, PacketResponseNG *response, size_t ms_timeout, bool show_warning); +#ifdef __cplusplus +} +#endif #endif diff --git a/client/src/graph.h b/client/src/graph.h index b753f418d..a53d65c06 100644 --- a/client/src/graph.h +++ b/client/src/graph.h @@ -13,6 +13,10 @@ #include "common.h" +#ifdef __cplusplus +extern "C" { +#endif + void AppendGraph(bool redraw, uint16_t clock, int bit); size_t ClearGraph(bool redraw); bool HasGraphData(void); @@ -38,4 +42,7 @@ extern int GraphBuffer[MAX_GRAPH_TRACE_LEN]; extern size_t GraphTraceLen; extern int s_Buff[MAX_GRAPH_TRACE_LEN]; +#ifdef __cplusplus +} +#endif #endif diff --git a/client/src/proxgui.h b/client/src/proxgui.h index 4666cccc3..cc9c9e118 100644 --- a/client/src/proxgui.h +++ b/client/src/proxgui.h @@ -18,7 +18,6 @@ extern "C" { #include #include #include -//#include "comms.h" void ShowGraphWindow(void); void HideGraphWindow(void); diff --git a/client/src/proxguiqt.cpp b/client/src/proxguiqt.cpp index 7f0dcb8a8..f3f49b9a0 100644 --- a/client/src/proxguiqt.cpp +++ b/client/src/proxguiqt.cpp @@ -24,18 +24,15 @@ #include #include #include -#include "proxgui.h" #include - -extern "C" int preferences_save(void); - -extern "C" { +#include "proxgui.h" #include "ui.h" #include "comms.h" #include "graph.h" #include "cmddata.h" #include "util_darwin.h" -} + +extern "C" int preferences_save(void); bool g_useOverlays = false; int g_absVMax = 0; diff --git a/client/src/ui.h b/client/src/ui.h index 8ba9c06a4..7a2c90659 100644 --- a/client/src/ui.h +++ b/client/src/ui.h @@ -11,10 +11,14 @@ #ifndef UI_H__ #define UI_H__ -#include "common.h" #include +#include "common.h" #include "ansi.h" +#ifdef __cplusplus +extern "C" { +#endif + #define _USE_MATH_DEFINES typedef enum logLevel {NORMAL, SUCCESS, INFO, FAILED, WARNING, ERR, DEBUG, INPLACE, HINT} logLevel_t; @@ -60,4 +64,7 @@ extern pthread_mutex_t print_lock; void iceIIR_Butterworth(int *data, const size_t len); void iceSimple_Filter(int *data, const size_t len, uint8_t k); +#ifdef __cplusplus +} +#endif #endif diff --git a/client/src/util_darwin.h b/client/src/util_darwin.h index 709680cdc..001282578 100644 --- a/client/src/util_darwin.h +++ b/client/src/util_darwin.h @@ -11,9 +11,16 @@ #ifndef UTIL_DARWIN_H__ #define UTIL_DARWIN_H__ +#ifdef __cplusplus +extern "C" { +#endif + void disableAppNap(const char *reason); void enableAppNap(void); void makeUnfocusable(void); void makeFocusable(void); +#ifdef __cplusplus +} +#endif #endif From 82ad1b683a9a2ace84a53d228204d8387e102070 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 3 May 2020 12:50:33 +0200 Subject: [PATCH 053/632] bug ifneq <> ifeq --- client/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/Makefile b/client/Makefile index cbbf07e15..48a1a3591 100644 --- a/client/Makefile +++ b/client/Makefile @@ -56,7 +56,7 @@ ZLIB = $(OBJDIR)/libz.a LIBS = -I$(LUALIBPATH) -I$(MBEDTLSLIBPATH) -I$(JANSSONLIBPATH) -I$(CBORLIBPATH) -I$(ZLIBPATH) -I$(REVENGPATH) -I$(AMIIBOLIBPATH) -I$(HARDNESTEDPATH) -I$(CLIPARSERPATH) INCLUDES_CLIENT += -I./src -I../include -I../common -I../common_fpga $(LIBS) #CFLAGS ?= -Wall -Werror -O3 -ifneq ($(platform),Darwin) +ifeq ($(platform),Darwin) # readline has strict-prototype issues CFLAGS ?= -Wall -Werror -O3 -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wundef -Wcast-align -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations else From c94eae0046c90af02ba3f3c0b53d0f7a53de1183 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 3 May 2020 15:15:02 +0200 Subject: [PATCH 054/632] fix warning about cast realignment, WIP --- client/Makefile | 4 ++-- client/deps/cliparser/Makefile | 2 +- client/deps/jansson/Makefile | 2 +- client/deps/liblua/Makefile | 2 +- client/src/mifare/mfkey.c | 25 +++++++++++++------------ client/src/mifare/mifarehost.c | 11 +++++++---- common/crc32.c | 6 ++++-- common/mbedtls/Makefile | 2 +- 8 files changed, 30 insertions(+), 24 deletions(-) diff --git a/client/Makefile b/client/Makefile index 48a1a3591..9904e8b27 100644 --- a/client/Makefile +++ b/client/Makefile @@ -58,9 +58,9 @@ INCLUDES_CLIENT += -I./src -I../include -I../common -I../common_fpga $(LIBS) #CFLAGS ?= -Wall -Werror -O3 ifeq ($(platform),Darwin) # readline has strict-prototype issues -CFLAGS ?= -Wall -Werror -O3 -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wundef -Wcast-align -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations +CFLAGS ?= -Wall -Werror -O3 -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wundef -Wcast-align -Wno-error=cast-align -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations else -CFLAGS ?= -Wall -Werror -O3 -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wundef -Wcast-align -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wstrict-prototypes -Wnested-externs -Wmissing-declarations +CFLAGS ?= -Wall -Werror -O3 -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wundef -Wcast-align -Wno-error=cast-align -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wstrict-prototypes -Wnested-externs -Wmissing-declarations endif # -Wshadow # -Wbad-function-cast -Wextra -Wswitch-enum -Wold-style-definition diff --git a/client/deps/cliparser/Makefile b/client/deps/cliparser/Makefile index 7f4409de0..4873372c4 100644 --- a/client/deps/cliparser/Makefile +++ b/client/deps/cliparser/Makefile @@ -1,6 +1,6 @@ MYSRCPATHS = MYINCLUDES = -I../../../common -I../../../include -I../../src -MYCFLAGS = +MYCFLAGS = -Wno-cast-align MYDEFS = MYSRCS = \ argtable3.c \ diff --git a/client/deps/jansson/Makefile b/client/deps/jansson/Makefile index 152e8bcb9..c0d16d6a3 100644 --- a/client/deps/jansson/Makefile +++ b/client/deps/jansson/Makefile @@ -1,6 +1,6 @@ MYSRCPATHS = MYINCLUDES = -I. -MYCFLAGS = -Wno-unused-function +MYCFLAGS = -Wno-unused-function -Wno-cast-align MYDEFS = -DHAVE_STDINT_H MYSRCS = \ dump.c \ diff --git a/client/deps/liblua/Makefile b/client/deps/liblua/Makefile index 54e45185b..0b05279b7 100644 --- a/client/deps/liblua/Makefile +++ b/client/deps/liblua/Makefile @@ -1,7 +1,7 @@ MYSRCPATHS = MYINCLUDES = -I. # Lua lib requires GNU extensions (implicit declarations of functions): -std=gnu99 or -std=gnu11 -MYCFLAGS = +MYCFLAGS = -Wno-cast-align MYDEFS = -DLUA_COMPAT_ALL $(SYSCFLAGS) MYSRCS = lapi.c lcode.c lctype.c ldebug.c ldo.c ldump.c lfunc.c lgc.c llex.c \ lmem.c lobject.c lopcodes.c lparser.c lstate.c lstring.c ltable.c \ diff --git a/client/src/mifare/mfkey.c b/client/src/mifare/mfkey.c index 7d04762b8..710bba449 100644 --- a/client/src/mifare/mfkey.c +++ b/client/src/mifare/mfkey.c @@ -45,11 +45,14 @@ uint32_t intersection(uint64_t *listA, uint64_t *listB) { // Darkside attack (hf mf mifare) // if successful it will return a list of keys, not just one. uint32_t nonce2key(uint32_t uid, uint32_t nt, uint32_t nr, uint32_t ar, uint64_t par_info, uint64_t ks_info, uint64_t **keys) { - struct Crypto1State *states; + union { + struct Crypto1State *states; + uint64_t *keylist; + } unionstate; + uint32_t i, pos; uint8_t ks3x[8], par[8][8]; uint64_t key_recovered; - uint64_t *keylist; // Reset the last three significant bits of the reader nonce nr &= 0xFFFFFF1F; @@ -68,23 +71,21 @@ uint32_t nonce2key(uint32_t uid, uint32_t nt, uint32_t nr, uint32_t ar, uint64_t par[7 - pos][7] = (bt >> 7) & 1; } - states = lfsr_common_prefix(nr, ar, ks3x, par, (par_info == 0)); + unionstate.states = lfsr_common_prefix(nr, ar, ks3x, par, (par_info == 0)); - if (!states) { + if (!unionstate.states) { *keys = NULL; return 0; } - keylist = (uint64_t *)states; - - for (i = 0; keylist[i]; i++) { - lfsr_rollback_word(states + i, uid ^ nt, 0); - crypto1_get_lfsr(states + i, &key_recovered); - keylist[i] = key_recovered; + for (i = 0; unionstate.keylist[i]; i++) { + lfsr_rollback_word(unionstate.states + i, uid ^ nt, 0); + crypto1_get_lfsr(unionstate.states + i, &key_recovered); + unionstate.keylist[i] = key_recovered; } - keylist[i] = -1; + unionstate.keylist[i] = -1; - *keys = keylist; + *keys = unionstate.keylist; return i; } diff --git a/client/src/mifare/mifarehost.c b/client/src/mifare/mifarehost.c index 8b57604f9..c3ad1b0a0 100644 --- a/client/src/mifare/mifarehost.c +++ b/client/src/mifare/mifarehost.c @@ -378,7 +378,7 @@ __attribute__((force_align_arg_pointer)) StateList_t *statelist = arg; statelist->head.slhead = lfsr_recovery32(statelist->ks1, statelist->nt_enc ^ statelist->uid); - for (p1 = statelist->head.slhead; * (uint64_t *)p1 != 0; p1++) {}; + for (p1 = statelist->head.slhead; p1->odd | p1->even; p1++) {}; statelist->len = p1 - statelist->head.slhead; statelist->tail.sltail = --p1; @@ -492,8 +492,10 @@ int mfnested(uint8_t blockNo, uint8_t keyType, uint8_t *key, uint8_t trgBlockNo, } } - *(uint64_t *)p3 = -1; - *(uint64_t *)p4 = -1; + p3->odd = -1; + p3->even = -1; + p4->odd = -1; + p4->even = -1; statelists[0].len = p3 - statelists[0].head.slhead; statelists[1].len = p4 - statelists[1].head.slhead; statelists[0].tail.sltail = --p3; @@ -637,7 +639,8 @@ int mfStaticNested(uint8_t blockNo, uint8_t keyType, uint8_t *key, uint8_t trgBl } } - *(uint64_t *)p3 = -1; + p3->odd = -1; + p3->even = -1; statelists[0].len = p3 - statelists[0].head.slhead; statelists[0].tail.sltail = --p3; diff --git a/common/crc32.c b/common/crc32.c index 440bed910..b539baa05 100644 --- a/common/crc32.c +++ b/common/crc32.c @@ -23,8 +23,10 @@ void crc32_ex(const uint8_t *data, const size_t len, uint8_t *crc) { for (size_t i = 0; i < len; i++) { crc32_byte(&desfire_crc, data[i]); } - - *((uint32_t *)(crc)) = htole32(desfire_crc); + uint32_t crctmp = htole32(desfire_crc); + for (size_t i=0; i < sizeof(uint32_t); i++) { + crc[i] = ((uint8_t *) &crctmp)[i]; + } } void crc32_append(uint8_t *data, const size_t len) { diff --git a/common/mbedtls/Makefile b/common/mbedtls/Makefile index be5f08a0a..880f6bcc8 100644 --- a/common/mbedtls/Makefile +++ b/common/mbedtls/Makefile @@ -1,6 +1,6 @@ MYSRCPATHS = MYINCLUDES = -I. -I.. -MYCFLAGS = +MYCFLAGS = -Wno-cast-align MYDEFS = MYSRCS = \ aes.c \ From 4d4984657eba9dfb58ce3a87877a137ac6438cf5 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 3 May 2020 19:25:14 +0200 Subject: [PATCH 055/632] activate more warnings and ease their mgmt --- Makefile.defs | 15 +++++++++++++++ Makefile.host | 3 +-- client/Makefile | 10 +--------- client/deps/jansson/Makefile | 2 +- client/deps/liblua/Makefile | 2 +- 5 files changed, 19 insertions(+), 13 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index 4068d7516..1fc794def 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -44,3 +44,18 @@ else AR= ar rcs RANLIB= ranlib endif + +DEFCFLAGS = -Wall -Werror -O3 +# Some more warnings we want as errors: +DEFCFLAGS += -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations +# Some more warnings we need first to eliminate, so temporarely tolerated: +DEFCFLAGS += -Wbad-function-cast -Wno-error=bad-function-cast -Wshadow -Wno-error=shadow -Wcast-align -Wno-error=cast-align +# TODO?: +#DEFCFLAGS += -Wextra -Wswitch-enum -Wold-style-definition + +ifeq ($(platform),Darwin) +# their readline has strict-prototype issues +DEFCFLAGS += -Wstrict-prototypes -Wno-error=strict-prototypes +else +DEFCFLAGS += -Wstrict-prototypes +endif diff --git a/Makefile.host b/Makefile.host index 7ed942401..c95f4bb4f 100644 --- a/Makefile.host +++ b/Makefile.host @@ -15,8 +15,7 @@ ifeq ($(DEFSBEENHERE),) $(error Can't find Makefile.defs) endif -CFLAGS ?= -Wall -Werror -O3 -Wchar-subscripts -Wundef -Wshadow -Wcast-align -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Wredundant-decls -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs -Wmissing-declarations -# -Wbad-function-cast -Wextra -Wswitch-enum -Wold-style-definition +CFLAGS ?= $(DEFCFLAGS) CFLAGS += $(MYDEFS) $(MYCFLAGS) $(MYINCLUDES) vpath %.c $(MYSRCPATHS) diff --git a/client/Makefile b/client/Makefile index 9904e8b27..a17f57c27 100644 --- a/client/Makefile +++ b/client/Makefile @@ -55,15 +55,7 @@ ZLIB = $(OBJDIR)/libz.a LIBS = -I$(LUALIBPATH) -I$(MBEDTLSLIBPATH) -I$(JANSSONLIBPATH) -I$(CBORLIBPATH) -I$(ZLIBPATH) -I$(REVENGPATH) -I$(AMIIBOLIBPATH) -I$(HARDNESTEDPATH) -I$(CLIPARSERPATH) INCLUDES_CLIENT += -I./src -I../include -I../common -I../common_fpga $(LIBS) -#CFLAGS ?= -Wall -Werror -O3 -ifeq ($(platform),Darwin) -# readline has strict-prototype issues -CFLAGS ?= -Wall -Werror -O3 -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wundef -Wcast-align -Wno-error=cast-align -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations -else -CFLAGS ?= -Wall -Werror -O3 -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wundef -Wcast-align -Wno-error=cast-align -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wstrict-prototypes -Wnested-externs -Wmissing-declarations -endif -# -Wshadow -# -Wbad-function-cast -Wextra -Wswitch-enum -Wold-style-definition +CFLAGS ?= $(DEFCFLAGS) # We cannot just use CFLAGS+=... because it has impact on sub-makes if CFLAGS is defined in env: PM3CFLAGS = $(CFLAGS) $(INCLUDES_CLIENT) diff --git a/client/deps/jansson/Makefile b/client/deps/jansson/Makefile index c0d16d6a3..487a85af8 100644 --- a/client/deps/jansson/Makefile +++ b/client/deps/jansson/Makefile @@ -1,6 +1,6 @@ MYSRCPATHS = MYINCLUDES = -I. -MYCFLAGS = -Wno-unused-function -Wno-cast-align +MYCFLAGS = -Wno-unused-function -Wno-cast-align -Wno-bad-function-cast MYDEFS = -DHAVE_STDINT_H MYSRCS = \ dump.c \ diff --git a/client/deps/liblua/Makefile b/client/deps/liblua/Makefile index 0b05279b7..296fd9e24 100644 --- a/client/deps/liblua/Makefile +++ b/client/deps/liblua/Makefile @@ -1,7 +1,7 @@ MYSRCPATHS = MYINCLUDES = -I. # Lua lib requires GNU extensions (implicit declarations of functions): -std=gnu99 or -std=gnu11 -MYCFLAGS = -Wno-cast-align +MYCFLAGS = -Wno-cast-align -Wno-bad-function-cast MYDEFS = -DLUA_COMPAT_ALL $(SYSCFLAGS) MYSRCS = lapi.c lcode.c lctype.c ldebug.c ldo.c ldump.c lfunc.c lgc.c llex.c \ lmem.c lobject.c lopcodes.c lparser.c lstate.c lstring.c ltable.c \ From 723503b74ee1fd47cc36be1716696690edb866f0 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 3 May 2020 21:43:03 +0200 Subject: [PATCH 056/632] unshadow vars --- Makefile.defs | 4 +- client/src/cmdhfmfdes.c | 4 +- client/src/cmdhfmfhard.c | 38 ++++++------- client/src/cmdtrace.c | 58 ++++++++++---------- client/src/mifare/mifare4.c | 104 ++++++++++++++++++------------------ 5 files changed, 104 insertions(+), 104 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index 1fc794def..a9d9328d3 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -47,9 +47,9 @@ endif DEFCFLAGS = -Wall -Werror -O3 # Some more warnings we want as errors: -DEFCFLAGS += -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations +DEFCFLAGS += -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wshadow -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations # Some more warnings we need first to eliminate, so temporarely tolerated: -DEFCFLAGS += -Wbad-function-cast -Wno-error=bad-function-cast -Wshadow -Wno-error=shadow -Wcast-align -Wno-error=cast-align +DEFCFLAGS += -Wbad-function-cast -Wno-error=bad-function-cast -Wcast-align -Wno-error=cast-align # TODO?: #DEFCFLAGS += -Wextra -Wswitch-enum -Wold-style-definition diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index c44bb4a3a..dad36ca3c 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -642,7 +642,7 @@ static nxp_cardtype_t getCardType(uint8_t major, uint8_t minor) { return DESFIRE_UNKNOWN; } -static int handler_desfire_auth(mfdes_authinput_t *payload, mfdes_auth_res_t *rpayload, bool defaultkey) { +static int handler_desfire_auth(mfdes_authinput_t *payload, mfdes_auth_res_t *rpayload, bool def_key) { // 3 different way to authenticate AUTH (CRC16) , AUTH_ISO (CRC32) , AUTH_AES (CRC32) // 4 different crypto arg1 DES, 3DES, 3K3DES, AES // 3 different communication modes, PLAIN,MAC,CRYPTO @@ -679,7 +679,7 @@ static int handler_desfire_auth(mfdes_authinput_t *payload, mfdes_auth_res_t *rp // Part 1 - if (defaultkey) { + if (def_key) { if (payload->algo == MFDES_AUTH_DES) { memcpy(keybytes, PICC_MASTER_KEY8, 8); } else if (payload->algo == MFDES_ALGO_AES || payload->algo == MFDES_ALGO_3DES) { diff --git a/client/src/cmdhfmfhard.c b/client/src/cmdhfmfhard.c index b8f3c0471..a32af3601 100644 --- a/client/src/cmdhfmfhard.c +++ b/client/src/cmdhfmfhard.c @@ -1739,24 +1739,24 @@ static void bitarray_to_list(uint8_t byte, uint32_t *bitarray, uint32_t *state_l } -static void add_cached_states(statelist_t *candidates, uint16_t part_sum_a0, uint16_t part_sum_a8, odd_even_t odd_even) { - candidates->states[odd_even] = sl_cache[part_sum_a0 / 2][part_sum_a8 / 2][odd_even].sl; - candidates->len[odd_even] = sl_cache[part_sum_a0 / 2][part_sum_a8 / 2][odd_even].len; +static void add_cached_states(statelist_t *cands, uint16_t part_sum_a0, uint16_t part_sum_a8, odd_even_t odd_even) { + cands->states[odd_even] = sl_cache[part_sum_a0 / 2][part_sum_a8 / 2][odd_even].sl; + cands->len[odd_even] = sl_cache[part_sum_a0 / 2][part_sum_a8 / 2][odd_even].len; return; } -static void add_matching_states(statelist_t *candidates, uint8_t part_sum_a0, uint8_t part_sum_a8, odd_even_t odd_even) { +static void add_matching_states(statelist_t *cands, uint8_t part_sum_a0, uint8_t part_sum_a8, odd_even_t odd_even) { const uint32_t worstcase_size = 1 << 20; - candidates->states[odd_even] = (uint32_t *)malloc(sizeof(uint32_t) * worstcase_size); - if (candidates->states[odd_even] == NULL) { + cands->states[odd_even] = (uint32_t *)malloc(sizeof(uint32_t) * worstcase_size); + if (cands->states[odd_even] == NULL) { PrintAndLogEx(ERR, "Out of memory error in add_matching_states() - statelist.\n"); exit(4); } - uint32_t *candidates_bitarray = (uint32_t *)malloc_bitarray(sizeof(uint32_t) * worstcase_size); - if (candidates_bitarray == NULL) { + uint32_t *cands_bitarray = (uint32_t *)malloc_bitarray(sizeof(uint32_t) * worstcase_size); + if (cands_bitarray == NULL) { PrintAndLogEx(ERR, "Out of memory error in add_matching_states() - bitarray.\n"); - free(candidates->states[odd_even]); + free(cands->states[odd_even]); exit(4); } @@ -1764,21 +1764,21 @@ static void add_matching_states(statelist_t *candidates, uint8_t part_sum_a0, ui uint32_t *bitarray_a8 = part_sum_a8_bitarrays[odd_even][part_sum_a8 / 2]; uint32_t *bitarray_bitflips = nonces[best_first_bytes[0]].states_bitarray[odd_even]; - bitarray_AND4(candidates_bitarray, bitarray_a0, bitarray_a8, bitarray_bitflips); + bitarray_AND4(cands_bitarray, bitarray_a0, bitarray_a8, bitarray_bitflips); - bitarray_to_list(best_first_bytes[0], candidates_bitarray, candidates->states[odd_even], &(candidates->len[odd_even]), odd_even); + bitarray_to_list(best_first_bytes[0], cands_bitarray, cands->states[odd_even], &(cands->len[odd_even]), odd_even); - if (candidates->len[odd_even] == 0) { - free(candidates->states[odd_even]); - candidates->states[odd_even] = NULL; - } else if (candidates->len[odd_even] + 1 < worstcase_size) { - candidates->states[odd_even] = realloc(candidates->states[odd_even], sizeof(uint32_t) * (candidates->len[odd_even] + 1)); + if (cands->len[odd_even] == 0) { + free(cands->states[odd_even]); + cands->states[odd_even] = NULL; + } else if (cands->len[odd_even] + 1 < worstcase_size) { + cands->states[odd_even] = realloc(cands->states[odd_even], sizeof(uint32_t) * (cands->len[odd_even] + 1)); } - free_bitarray(candidates_bitarray); + free_bitarray(cands_bitarray); pthread_mutex_lock(&statelist_cache_mutex); - sl_cache[part_sum_a0 / 2][part_sum_a8 / 2][odd_even].sl = candidates->states[odd_even]; - sl_cache[part_sum_a0 / 2][part_sum_a8 / 2][odd_even].len = candidates->len[odd_even]; + sl_cache[part_sum_a0 / 2][part_sum_a8 / 2][odd_even].sl = cands->states[odd_even]; + sl_cache[part_sum_a0 / 2][part_sum_a8 / 2][odd_even].len = cands->len[odd_even]; sl_cache[part_sum_a0 / 2][part_sum_a8 / 2][odd_even].cache_status = COMPLETED; pthread_mutex_unlock(&statelist_cache_mutex); return; diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index 85d2bea09..99e5e03f2 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -22,8 +22,8 @@ static int CmdHelp(const char *Cmd); // trace pointer -static uint8_t *trace; -long traceLen = 0; +static uint8_t *g_trace; +long g_traceLen = 0; static int usage_trace_list(void) { PrintAndLogEx(NORMAL, "List protocol data in trace buffer."); @@ -491,26 +491,26 @@ static int CmdTraceLoad(const char *Cmd) { return PM3_ESOFT; } - if (trace) - free(trace); + if (g_trace) + free(g_trace); - trace = calloc(fsize, sizeof(uint8_t)); - if (!trace) { + g_trace = calloc(fsize, sizeof(uint8_t)); + if (!g_trace) { PrintAndLogEx(FAILED, "Cannot allocate memory for trace"); fclose(f); return PM3_EMALLOC; } - size_t bytes_read = fread(trace, 1, fsize, f); - traceLen = bytes_read; + size_t bytes_read = fread(g_trace, 1, fsize, f); + g_traceLen = bytes_read; fclose(f); - PrintAndLogEx(SUCCESS, "Recorded Activity (TraceLen = %lu bytes) loaded from file %s", traceLen, filename); + PrintAndLogEx(SUCCESS, "Recorded Activity (TraceLen = %lu bytes) loaded from file %s", g_traceLen, filename); return PM3_SUCCESS; } static int CmdTraceSave(const char *Cmd) { - if (traceLen == 0) { + if (g_traceLen == 0) { PrintAndLogEx(WARNING, "trace is empty, nothing to save"); return PM3_SUCCESS; } @@ -520,7 +520,7 @@ static int CmdTraceSave(const char *Cmd) { if (strlen(Cmd) < 1 || cmdp == 'h') return usage_trace_save(); param_getstr(Cmd, 0, filename, sizeof(filename)); - saveFile(filename, ".bin", trace, traceLen); + saveFile(filename, ".bin", g_trace, g_traceLen); return PM3_SUCCESS; } @@ -628,10 +628,10 @@ int CmdTraceList(const char *Cmd) { uint16_t tracepos = 0; - // reserv some space. - if (!trace) { - trace = calloc(PM3_CMD_DATA_SIZE, sizeof(uint8_t)); - if (trace == NULL) { + // reserve some space. + if (!g_trace) { + g_trace = calloc(PM3_CMD_DATA_SIZE, sizeof(uint8_t)); + if (g_trace == NULL) { PrintAndLogEx(FAILED, "Cannot allocate memory for trace"); return PM3_EMALLOC; } @@ -640,38 +640,38 @@ int CmdTraceList(const char *Cmd) { if (isOnline) { // Query for the size of the trace, downloading PM3_CMD_DATA_SIZE PacketResponseNG response; - if (!GetFromDevice(BIG_BUF, trace, PM3_CMD_DATA_SIZE, 0, NULL, 0, &response, 4000, true)) { + if (!GetFromDevice(BIG_BUF, g_trace, PM3_CMD_DATA_SIZE, 0, NULL, 0, &response, 4000, true)) { PrintAndLogEx(WARNING, "timeout while waiting for reply."); return PM3_ETIMEOUT; } - traceLen = response.oldarg[2]; - if (traceLen > PM3_CMD_DATA_SIZE) { - uint8_t *p = realloc(trace, traceLen); + g_traceLen = response.oldarg[2]; + if (g_traceLen > PM3_CMD_DATA_SIZE) { + uint8_t *p = realloc(g_trace, g_traceLen); if (p == NULL) { PrintAndLogEx(FAILED, "Cannot allocate memory for trace"); - free(trace); + free(g_trace); return PM3_EMALLOC; } - trace = p; - if (!GetFromDevice(BIG_BUF, trace, traceLen, 0, NULL, 0, NULL, 2500, false)) { + g_trace = p; + if (!GetFromDevice(BIG_BUF, g_trace, g_traceLen, 0, NULL, 0, NULL, 2500, false)) { PrintAndLogEx(WARNING, "command execution time out"); - free(trace); + free(g_trace); return PM3_ETIMEOUT; } } } - PrintAndLogEx(SUCCESS, "Recorded activity (trace len = " _YELLOW_("%lu") " bytes)", traceLen); + PrintAndLogEx(SUCCESS, "Recorded activity (trace len = " _YELLOW_("%lu") " bytes)", g_traceLen); /* if (protocol == FELICA) { - printFelica(traceLen, trace); + printFelica(g_traceLen, g_trace); } */ if (showHex) { - while (tracepos < traceLen) { - tracepos = printHexLine(tracepos, traceLen, trace, protocol); + while (tracepos < g_traceLen) { + tracepos = printHexLine(tracepos, g_traceLen, g_trace, protocol); } } else { PrintAndLogEx(INFO, _YELLOW_("Start") " = Start of Start Bit, " _YELLOW_("End") " = End of last modulation. " _YELLOW_("Src") " = Source of Transfer"); @@ -700,8 +700,8 @@ int CmdTraceList(const char *Cmd) { PrintAndLogEx(NORMAL, "------------+------------+-----+-------------------------------------------------------------------------+-----+--------------------"); ClearAuthData(); - while (tracepos < traceLen) { - tracepos = printTraceLine(tracepos, traceLen, trace, protocol, showWaitCycles, markCRCBytes); + while (tracepos < g_traceLen) { + tracepos = printTraceLine(tracepos, g_traceLen, g_trace, protocol, showWaitCycles, markCRCBytes); if (kbd_enter_pressed()) break; diff --git a/client/src/mifare/mifare4.c b/client/src/mifare/mifare4.c index 09f10d321..55961b15b 100644 --- a/client/src/mifare/mifare4.c +++ b/client/src/mifare/mifare4.c @@ -90,42 +90,42 @@ const char *mfGetAccessConditionsDesc(uint8_t blockn, uint8_t *data) { return StaticNone; } /* -static int CalculateEncIVCommand(mf4Session_t *session, uint8_t *iv, bool verbose) { - memcpy(&iv[0], &session->TI, 4); - memcpy(&iv[4], &session->R_Ctr, 2); - memcpy(&iv[6], &session->W_Ctr, 2); - memcpy(&iv[8], &session->R_Ctr, 2); - memcpy(&iv[10], &session->W_Ctr, 2); - memcpy(&iv[12], &session->R_Ctr, 2); - memcpy(&iv[14], &session->W_Ctr, 2); +static int CalculateEncIVCommand(mf4Session_t *mf4session, uint8_t *iv, bool verbose) { + memcpy(&iv[0], &mf4session->TI, 4); + memcpy(&iv[4], &mf4session->R_Ctr, 2); + memcpy(&iv[6], &mf4session->W_Ctr, 2); + memcpy(&iv[8], &mf4session->R_Ctr, 2); + memcpy(&iv[10], &mf4session->W_Ctr, 2); + memcpy(&iv[12], &mf4session->R_Ctr, 2); + memcpy(&iv[14], &mf4session->W_Ctr, 2); return 0; } -static int CalculateEncIVResponse(mf4Session *session, uint8_t *iv, bool verbose) { - memcpy(&iv[0], &session->R_Ctr, 2); - memcpy(&iv[2], &session->W_Ctr, 2); - memcpy(&iv[4], &session->R_Ctr, 2); - memcpy(&iv[6], &session->W_Ctr, 2); - memcpy(&iv[8], &session->R_Ctr, 2); - memcpy(&iv[10], &session->W_Ctr, 2); - memcpy(&iv[12], &session->TI, 4); +static int CalculateEncIVResponse(mf4Session *mf4session, uint8_t *iv, bool verbose) { + memcpy(&iv[0], &mf4session->R_Ctr, 2); + memcpy(&iv[2], &mf4session->W_Ctr, 2); + memcpy(&iv[4], &mf4session->R_Ctr, 2); + memcpy(&iv[6], &mf4session->W_Ctr, 2); + memcpy(&iv[8], &mf4session->R_Ctr, 2); + memcpy(&iv[10], &mf4session->W_Ctr, 2); + memcpy(&iv[12], &mf4session->TI, 4); return 0; } */ -int CalculateMAC(mf4Session_t *session, MACType_t mtype, uint8_t blockNum, uint8_t blockCount, uint8_t *data, int datalen, uint8_t *mac, bool verbose) { - if (!session || !session->Authenticated || !mac || !data || !datalen) +int CalculateMAC(mf4Session_t *mf4session, MACType_t mtype, uint8_t blockNum, uint8_t blockCount, uint8_t *data, int datalen, uint8_t *mac, bool verbose) { + if (!mf4session || !mf4session->Authenticated || !mac || !data || !datalen) return 1; memset(mac, 0x00, 8); - uint16_t ctr = session->R_Ctr; + uint16_t ctr = mf4session->R_Ctr; switch (mtype) { case mtypWriteCmd: case mtypWriteResp: - ctr = session->W_Ctr; + ctr = mf4session->W_Ctr; break; case mtypReadCmd: case mtypReadResp: @@ -134,7 +134,7 @@ int CalculateMAC(mf4Session_t *session, MACType_t mtype, uint8_t blockNum, uint8 uint8_t macdata[2049] = {data[0], (ctr & 0xFF), (ctr >> 8), 0}; int macdatalen = datalen; - memcpy(&macdata[3], session->TI, 4); + memcpy(&macdata[3], mf4session->TI, 4); switch (mtype) { case mtypReadCmd: @@ -160,10 +160,10 @@ int CalculateMAC(mf4Session_t *session, MACType_t mtype, uint8_t blockNum, uint8 if (verbose) PrintAndLogEx(NORMAL, "MAC data[%d]: %s", macdatalen, sprint_hex(macdata, macdatalen)); - return aes_cmac8(NULL, session->Kmac, macdata, mac, macdatalen); + return aes_cmac8(NULL, mf4session->Kmac, macdata, mac, macdatalen); } -int MifareAuth4(mf4Session_t *session, uint8_t *keyn, uint8_t *key, bool activateField, bool leaveSignalON, bool dropFieldIfError, bool verbose, bool silentMode) { +int MifareAuth4(mf4Session_t *mf4session, uint8_t *keyn, uint8_t *key, bool activateField, bool leaveSignalON, bool dropFieldIfError, bool verbose, bool silentMode) { uint8_t data[257] = {0}; int datalen = 0; @@ -173,8 +173,8 @@ int MifareAuth4(mf4Session_t *session, uint8_t *keyn, uint8_t *key, bool activat if (silentMode) verbose = false; - if (session) - session->Authenticated = false; + if (mf4session) + mf4session->Authenticated = false; uint8_t cmd1[] = {0x70, keyn[1], keyn[0], 0x00}; int res = ExchangeRAW14a(cmd1, sizeof(cmd1), activateField, true, data, sizeof(data), &datalen, silentMode); @@ -284,19 +284,19 @@ int MifareAuth4(mf4Session_t *session, uint8_t *keyn, uint8_t *key, bool activat if (verbose) PrintAndLogEx(NORMAL, ""); - if (session) { - session->Authenticated = true; - session->R_Ctr = 0; - session->W_Ctr = 0; - session->KeyNum = keyn[1] + (keyn[0] << 8); - memmove(session->RndA, RndA, 16); - memmove(session->RndB, RndB, 16); - memmove(session->Key, key, 16); - memmove(session->TI, raw, 4); - memmove(session->PICCap2, &raw[20], 6); - memmove(session->PCDCap2, &raw[26], 6); - memmove(session->Kenc, kenc, 16); - memmove(session->Kmac, kmac, 16); + if (mf4session) { + mf4session->Authenticated = true; + mf4session->R_Ctr = 0; + mf4session->W_Ctr = 0; + mf4session->KeyNum = keyn[1] + (keyn[0] << 8); + memmove(mf4session->RndA, RndA, 16); + memmove(mf4session->RndB, RndB, 16); + memmove(mf4session->Key, key, 16); + memmove(mf4session->TI, raw, 4); + memmove(mf4session->PICCap2, &raw[20], 6); + memmove(mf4session->PCDCap2, &raw[26], 6); + memmove(mf4session->Kenc, kenc, 16); + memmove(mf4session->Kmac, kmac, 16); } if (verbose) @@ -330,39 +330,39 @@ int MFPCommitPerso(bool activateField, bool leaveSignalON, uint8_t *dataout, int return intExchangeRAW14aPlus(rcmd, sizeof(rcmd), activateField, leaveSignalON, dataout, maxdataoutlen, dataoutlen); } -int MFPReadBlock(mf4Session_t *session, bool plain, uint8_t blockNum, uint8_t blockCount, bool activateField, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen, uint8_t *mac) { +int MFPReadBlock(mf4Session_t *mf4session, bool plain, uint8_t blockNum, uint8_t blockCount, bool activateField, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen, uint8_t *mac) { uint8_t rcmd[4 + 8] = {(plain ? (0x37) : (0x33)), blockNum, 0x00, blockCount}; - if (!plain && session) - CalculateMAC(session, mtypReadCmd, blockNum, blockCount, rcmd, 4, &rcmd[4], VerboseMode); + if (!plain && mf4session) + CalculateMAC(mf4session, mtypReadCmd, blockNum, blockCount, rcmd, 4, &rcmd[4], VerboseMode); int res = intExchangeRAW14aPlus(rcmd, plain ? 4 : sizeof(rcmd), activateField, leaveSignalON, dataout, maxdataoutlen, dataoutlen); if (res) return res; - if (session) - session->R_Ctr++; + if (mf4session) + mf4session->R_Ctr++; - if (session && mac && *dataoutlen > 11) - CalculateMAC(session, mtypReadResp, blockNum, blockCount, dataout, *dataoutlen - 8 - 2, mac, VerboseMode); + if (mf4session && mac && *dataoutlen > 11) + CalculateMAC(mf4session, mtypReadResp, blockNum, blockCount, dataout, *dataoutlen - 8 - 2, mac, VerboseMode); return 0; } -int MFPWriteBlock(mf4Session_t *session, uint8_t blockNum, uint8_t *data, bool activateField, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen, uint8_t *mac) { +int MFPWriteBlock(mf4Session_t *mf4session, uint8_t blockNum, uint8_t *data, bool activateField, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen, uint8_t *mac) { uint8_t rcmd[1 + 2 + 16 + 8] = {0xA3, blockNum, 0x00}; memmove(&rcmd[3], data, 16); - if (session) - CalculateMAC(session, mtypWriteCmd, blockNum, 1, rcmd, 19, &rcmd[19], VerboseMode); + if (mf4session) + CalculateMAC(mf4session, mtypWriteCmd, blockNum, 1, rcmd, 19, &rcmd[19], VerboseMode); int res = intExchangeRAW14aPlus(rcmd, sizeof(rcmd), activateField, leaveSignalON, dataout, maxdataoutlen, dataoutlen); if (res) return res; - if (session) - session->W_Ctr++; + if (mf4session) + mf4session->W_Ctr++; - if (session && mac && *dataoutlen > 3) - CalculateMAC(session, mtypWriteResp, blockNum, 1, dataout, *dataoutlen, mac, VerboseMode); + if (mf4session && mac && *dataoutlen > 3) + CalculateMAC(mf4session, mtypWriteResp, blockNum, 1, dataout, *dataoutlen, mac, VerboseMode); return 0; } From 58f71d97f5f55d081b269c088a6d6768312f49c0 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 4 May 2020 01:18:26 +0200 Subject: [PATCH 057/632] silent some bad-function-cast --- Makefile.defs | 4 ++-- client/src/cmdhfmfhard.c | 3 ++- client/src/cmdlfjablotron.c | 7 +++---- client/src/pm3_binlib.c | 3 ++- client/src/pm3_bitlib.c | 6 ++++-- client/src/whereami.c | 3 ++- 6 files changed, 15 insertions(+), 11 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index a9d9328d3..2de8f88a3 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -47,9 +47,9 @@ endif DEFCFLAGS = -Wall -Werror -O3 # Some more warnings we want as errors: -DEFCFLAGS += -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wshadow -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations +DEFCFLAGS += -Wcast-align -Wbad-function-cast -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wshadow -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations # Some more warnings we need first to eliminate, so temporarely tolerated: -DEFCFLAGS += -Wbad-function-cast -Wno-error=bad-function-cast -Wcast-align -Wno-error=cast-align +DEFCFLAGS += -Wno-error=cast-align # TODO?: #DEFCFLAGS += -Wextra -Wswitch-enum -Wold-style-definition diff --git a/client/src/cmdhfmfhard.c b/client/src/cmdhfmfhard.c index a32af3601..2a245df37 100644 --- a/client/src/cmdhfmfhard.c +++ b/client/src/cmdhfmfhard.c @@ -793,7 +793,8 @@ static void update_p_K(void) { } for (uint8_t sum_a8_idx = 0; sum_a8_idx < NUM_SUMS; sum_a8_idx++) { uint16_t sum_a8 = sums[sum_a8_idx]; - my_p_K[sum_a8_idx] = (float)estimated_num_states_coarse(sum_a0, sum_a8) / total_count; + float f = estimated_num_states_coarse(sum_a0, sum_a8); + my_p_K[sum_a8_idx] = f / total_count; } // PrintAndLogEx(NORMAL, "my_p_K = ["); // for (uint8_t sum_a8_idx = 0; sum_a8_idx < NUM_SUMS; sum_a8_idx++) { diff --git a/client/src/cmdlfjablotron.c b/client/src/cmdlfjablotron.c index 285ddca7d..3d586215e 100644 --- a/client/src/cmdlfjablotron.c +++ b/client/src/cmdlfjablotron.c @@ -12,7 +12,6 @@ #include #include -#include #include #include @@ -70,9 +69,9 @@ static uint64_t getJablontronCardId(uint64_t rawcode) { uint64_t id = 0; uint8_t bytes[] = {0, 0, 0, 0, 0}; num_to_bytes(rawcode, 5, bytes); - for (int i = 4, j = 0; i > -1; --i, j += 2) { - id += NIBBLE_LOW(bytes[i]) * (int)pow(10, j); - id += NIBBLE_HIGH(bytes[i]) * (int)pow(10, j + 1); + for (int i = 0; i < 5; i++) { + id *= 100; + id += NIBBLE_HIGH(bytes[i]) * 10 + NIBBLE_LOW(bytes[i]); } return id; } diff --git a/client/src/pm3_binlib.c b/client/src/pm3_binlib.c index f4e49c137..56d281636 100644 --- a/client/src/pm3_binlib.c +++ b/client/src/pm3_binlib.c @@ -203,7 +203,8 @@ static int l_unpack(lua_State *L) { /** unpack(f,s, [init]) */ #define PACKNUMBER(OP,T) \ case OP: \ { \ - T a=(T)luaL_checknumber(L,i++); \ + lua_Number n = luaL_checknumber(L,i++); \ + T a=(T)n; \ doswap(swap,&a,sizeof(a)); \ luaL_addlstring(&b,(char*)&a,sizeof(a)); \ break; \ diff --git a/client/src/pm3_bitlib.c b/client/src/pm3_bitlib.c index b5ef6e0ae..064c0f3c9 100644 --- a/client/src/pm3_bitlib.c +++ b/client/src/pm3_bitlib.c @@ -92,16 +92,18 @@ typedef size_t lua_UInteger; #define LOGICAL_SHIFT(name, op) \ static int bit_ ## name(lua_State *L) { \ lua_Number f; \ + lua_Number n = luaL_checknumber(L, 2); \ lua_pushinteger(L, BIT_TRUNCATE(BIT_TRUNCATE((lua_UInteger)TOBIT(L, 1, f)) op \ - (unsigned)luaL_checknumber(L, 2))); \ + (unsigned)n)); \ return 1; \ } #define ARITHMETIC_SHIFT(name, op) \ static int bit_ ## name(lua_State *L) { \ lua_Number f; \ + lua_Number n = luaL_checknumber(L, 2); \ lua_pushinteger(L, BIT_TRUNCATE((lua_Integer)TOBIT(L, 1, f) op \ - (unsigned)luaL_checknumber(L, 2))); \ + (unsigned)n)); \ return 1; \ } diff --git a/client/src/whereami.c b/client/src/whereami.c index 30d70c4d9..b725c4946 100644 --- a/client/src/whereami.c +++ b/client/src/whereami.c @@ -253,7 +253,8 @@ int WAI_PREFIX(getModulePath)(char *out, int capacity, int *dirname_length) { break; if (sscanf(buffer, "%" SCNx64 "-%" SCNx64 " %s %" SCNx64 " %x:%x %u %s\n", &low, &high, perms, &offset, &major, &minor, &inode, path) == 8) { - uint64_t addr = (uint64_t)(uintptr_t)WAI_RETURN_ADDRESS(); + void *addr_tmp = WAI_RETURN_ADDRESS(); + uint64_t addr = (uint64_t)addr_tmp; if (low <= addr && addr <= high) { char *resolved; From c59791d21cdc6bd1c358c54d33ee423406cef855 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 4 May 2020 01:42:59 +0200 Subject: [PATCH 058/632] more warnings --- Makefile.defs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index 2de8f88a3..8d090a0a6 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -47,11 +47,14 @@ endif DEFCFLAGS = -Wall -Werror -O3 # Some more warnings we want as errors: -DEFCFLAGS += -Wcast-align -Wbad-function-cast -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wshadow -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations +DEFCFLAGS += -Wcast-align -Wbad-function-cast -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wshadow -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations -Wempty-body -Wignored-qualifiers -Woverride-init -Wshift-negative-value # Some more warnings we need first to eliminate, so temporarely tolerated: DEFCFLAGS += -Wno-error=cast-align # TODO?: -#DEFCFLAGS += -Wextra -Wswitch-enum -Wold-style-definition +#DEFCFLAGS += -Wunused-parameter -Wold-style-declaration -Wsign-compare -Wimplicit-fallthrough=3 -Wtype-limits -Wmissing-field-initializers -Wunused-but-set-parameter -Wswitch-enum -Wold-style-definition +#DEFCFLAGS += -Wno-error=unused-parameter -Wno-error=old-style-declaration -Wno-error=sign-compare -Wno-error=implicit-fallthrough -Wno-error=type-limits -Wno-error=missing-field-initializers -Wno-error=unused-but-set-parameter -Wno-error=switch-enum -Wno-error=old-style-definition +# unknown to clang: +# -Wclobbered -Wmissing-parameter-type -Wcast-function-type ifeq ($(platform),Darwin) # their readline has strict-prototype issues From 99381b43861a72b68566e88ca48947574051c940 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 4 May 2020 01:48:07 +0200 Subject: [PATCH 059/632] fix defined --- client/src/proxmark3.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index 80fd958b1..1ed8bb65a 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -90,7 +90,7 @@ static void showBanner(void) { g_printAndLog = PRINTANDLOG_PRINT; PrintAndLogEx(NORMAL, "\n"); -#if defined(__linux__) || (__APPLE__) || (_WIN32) +#if defined(__linux__) || defined(__APPLE__) || defined(_WIN32) PrintAndLogEx(NORMAL, " " _BLUE_("██████╗ ███╗ ███╗ ████╗ ")); PrintAndLogEx(NORMAL, " " _BLUE_("██╔══██╗████╗ ████║ ══█║")); PrintAndLogEx(NORMAL, " " _BLUE_("██████╔╝██╔████╔██║ ████╔╝")); @@ -893,7 +893,7 @@ int main(int argc, char *argv[]) { session.stdinOnTTY = isatty(STDIN_FILENO); session.stdoutOnTTY = isatty(STDOUT_FILENO); -#if defined(__linux__) || (__APPLE__) +#if defined(__linux__) || defined(__APPLE__) // it's okay to use color if: // * Linux or OSX // * Not redirected to a file but printed to term From 00de69e57e54fa69f3eb6ee8aeb7d0c327a6215c Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 4 May 2020 02:13:11 +0200 Subject: [PATCH 060/632] adjust warning flags --- Makefile.defs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile.defs b/Makefile.defs index 8d090a0a6..3c111f400 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -47,7 +47,7 @@ endif DEFCFLAGS = -Wall -Werror -O3 # Some more warnings we want as errors: -DEFCFLAGS += -Wcast-align -Wbad-function-cast -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wshadow -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations -Wempty-body -Wignored-qualifiers -Woverride-init -Wshift-negative-value +DEFCFLAGS += -Wcast-align -Wbad-function-cast -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wshadow -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations -Wempty-body -Wignored-qualifiers -Woverride-init # Some more warnings we need first to eliminate, so temporarely tolerated: DEFCFLAGS += -Wno-error=cast-align # TODO?: @@ -55,6 +55,8 @@ DEFCFLAGS += -Wno-error=cast-align #DEFCFLAGS += -Wno-error=unused-parameter -Wno-error=old-style-declaration -Wno-error=sign-compare -Wno-error=implicit-fallthrough -Wno-error=type-limits -Wno-error=missing-field-initializers -Wno-error=unused-but-set-parameter -Wno-error=switch-enum -Wno-error=old-style-definition # unknown to clang: # -Wclobbered -Wmissing-parameter-type -Wcast-function-type +# requires GCC 6: +# -Wshift-negative-value ifeq ($(platform),Darwin) # their readline has strict-prototype issues From f0811de70d1a6a1f6bfb163291901e01e6bd75bc Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 4 May 2020 02:17:47 +0200 Subject: [PATCH 061/632] silent zlib warning under AppVeyor --- common/zlib/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/zlib/Makefile b/common/zlib/Makefile index acc35bf42..9444aee9f 100644 --- a/common/zlib/Makefile +++ b/common/zlib/Makefile @@ -1,7 +1,7 @@ MYSRCPATHS = ../../common/zlib MYSRCS = deflate.c adler32.c trees.c zutil.c inflate.c inffast.c inftrees.c MYINCLUDES = -I../../common/zlib -MYCFLAGS = +MYCFLAGS = -Wno-error=strict-prototypes MYDEFS = -DZ_SOLO -DNO_GZIP -DZLIB_PM3_TUNED #-DDEBUG -Dverbose=1 From d00714d43ad7c0c5feedd458b8ce242f3f78237a Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 4 May 2020 10:38:21 +0200 Subject: [PATCH 062/632] unknown to clang < 8: -Woverride-init --- Makefile.defs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index 3c111f400..0cfdf85a7 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -47,16 +47,15 @@ endif DEFCFLAGS = -Wall -Werror -O3 # Some more warnings we want as errors: -DEFCFLAGS += -Wcast-align -Wbad-function-cast -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wshadow -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations -Wempty-body -Wignored-qualifiers -Woverride-init +DEFCFLAGS += -Wcast-align -Wbad-function-cast -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wshadow -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations -Wempty-body -Wignored-qualifiers # Some more warnings we need first to eliminate, so temporarely tolerated: DEFCFLAGS += -Wno-error=cast-align # TODO?: #DEFCFLAGS += -Wunused-parameter -Wold-style-declaration -Wsign-compare -Wimplicit-fallthrough=3 -Wtype-limits -Wmissing-field-initializers -Wunused-but-set-parameter -Wswitch-enum -Wold-style-definition #DEFCFLAGS += -Wno-error=unused-parameter -Wno-error=old-style-declaration -Wno-error=sign-compare -Wno-error=implicit-fallthrough -Wno-error=type-limits -Wno-error=missing-field-initializers -Wno-error=unused-but-set-parameter -Wno-error=switch-enum -Wno-error=old-style-definition -# unknown to clang: -# -Wclobbered -Wmissing-parameter-type -Wcast-function-type -# requires GCC 6: -# -Wshift-negative-value +# unknown to clang: -Wclobbered -Wmissing-parameter-type -Wcast-function-type +# unknown to clang < 8: -Woverride-init +# unknown to gcc < 6: -Wshift-negative-value ifeq ($(platform),Darwin) # their readline has strict-prototype issues From e68dd9e5cb8da1e1024512fb5d872326155cba7c Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 4 May 2020 23:18:00 +0200 Subject: [PATCH 063/632] update whereami and avoid compiling unnneded troublesome parts --- client/Makefile | 2 +- client/src/whereami.c | 93 +++++++++++++++++++++++++++---------------- 2 files changed, 60 insertions(+), 35 deletions(-) diff --git a/client/Makefile b/client/Makefile index a17f57c27..3a3aeedce 100644 --- a/client/Makefile +++ b/client/Makefile @@ -58,7 +58,7 @@ INCLUDES_CLIENT += -I./src -I../include -I../common -I../common_fpga $(LIBS) CFLAGS ?= $(DEFCFLAGS) # We cannot just use CFLAGS+=... because it has impact on sub-makes if CFLAGS is defined in env: -PM3CFLAGS = $(CFLAGS) $(INCLUDES_CLIENT) +PM3CFLAGS = $(CFLAGS) $(INCLUDES_CLIENT) -DWAI_PM3_TUNED # WIP Testing #PM3CFLAGS = $(CFLAGS) -std=c11 -pedantic $(INCLUDES_CLIENT) PREFIX ?= /usr/local diff --git a/client/src/whereami.c b/client/src/whereami.c index b725c4946..ca2220953 100644 --- a/client/src/whereami.c +++ b/client/src/whereami.c @@ -3,9 +3,7 @@ // by Gregory Pakosz (@gpakosz) // https://github.com/gpakosz/whereami -#ifdef __cplusplus -extern "C" { -#endif +#ifdef WAI_PM3_TUNED #include "whereami.h" @@ -14,6 +12,19 @@ extern "C" { #define _DEFAULT_SOURCE #endif +#else // WAI_PM3_TUNED + +// in case you want to #include "whereami.c" in a larger compilation unit +#if !defined(WHEREAMI_H) +#include +#endif + +#endif // WAI_PM3_TUNED + +#ifdef __cplusplus +extern "C" { +#endif + #if !defined(WAI_MALLOC) || !defined(WAI_FREE) || !defined(WAI_REALLOC) #include #endif @@ -50,11 +61,14 @@ extern "C" { #if defined(_WIN32) +#ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN +#endif #if defined(_MSC_VER) #pragma warning(push, 3) #endif #include +#include #if defined(_MSC_VER) #pragma warning(pop) #endif @@ -123,36 +137,36 @@ static int WAI_PREFIX(getModulePath_)(HMODULE module, char *out, int capacity, i return length; } -WAI_NOINLINE -WAI_FUNCSPEC +WAI_NOINLINE WAI_FUNCSPEC int WAI_PREFIX(getExecutablePath)(char *out, int capacity, int *dirname_length) { return WAI_PREFIX(getModulePath_)(NULL, out, capacity, dirname_length); } // GetModuleHandleEx() is not available on old mingw environments. We don't need getModulePath() yet. // Sacrifice it for the time being to improve backwards compatibility -/* WAI_NOINLINE -WAI_FUNCSPEC -int WAI_PREFIX(getModulePath)(char* out, int capacity, int* dirname_length) -{ - HMODULE module; - int length = -1; +#ifndef WAI_PM3_TUNED + +WAI_NOINLINE WAI_FUNCSPEC +int WAI_PREFIX(getModulePath)(char *out, int capacity, int *dirname_length) { + HMODULE module; + int length = -1; #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable: 4054) #endif - if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (LPCTSTR)WAI_RETURN_ADDRESS(), &module)) + if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (LPCTSTR)WAI_RETURN_ADDRESS(), &module)) #if defined(_MSC_VER) #pragma warning(pop) #endif - { - length = WAI_PREFIX(getModulePath_)(module, out, capacity, dirname_length); - } + { + length = WAI_PREFIX(getModulePath_)(module, out, capacity, dirname_length); + } - return length; + return length; } -*/ + +#endif // WAI_PM3_TUNED #elif defined(__linux__) || defined(__CYGWIN__) || defined(__sun) || defined(WAI_USE_PROC_SELF_EXE) @@ -228,14 +242,14 @@ int WAI_PREFIX(getExecutablePath)(char *out, int capacity, int *dirname_length) #include #endif -WAI_NOINLINE -WAI_FUNCSPEC +#ifndef WAI_PM3_TUNED + +WAI_NOINLINE WAI_FUNCSPEC int WAI_PREFIX(getModulePath)(char *out, int capacity, int *dirname_length) { int length = -1; FILE *maps = NULL; - int i; - for (i = 0; i < WAI_PROC_SELF_MAPS_RETRY; ++i) { + for (int r = 0; r < WAI_PROC_SELF_MAPS_RETRY; ++r) { maps = fopen(WAI_PROC_SELF_MAPS, "r"); if (!maps) break; @@ -252,9 +266,8 @@ int WAI_PREFIX(getModulePath)(char *out, int capacity, int *dirname_length) { if (!fgets(buffer, sizeof(buffer), maps)) break; - if (sscanf(buffer, "%" SCNx64 "-%" SCNx64 " %s %" SCNx64 " %x:%x %u %s\n", &low, &high, perms, &offset, &major, &minor, &inode, path) == 8) { - void *addr_tmp = WAI_RETURN_ADDRESS(); - uint64_t addr = (uint64_t)addr_tmp; + if (sscanf(buffer, "%" PRIx64 "-%" PRIx64 " %s %" PRIx64 " %x:%x %u %s\n", &low, &high, perms, &offset, &major, &minor, &inode, path) == 8) { + uint64_t addr = (uintptr_t)WAI_RETURN_ADDRESS(); if (low <= addr && addr <= high) { char *resolved; @@ -300,9 +313,11 @@ int WAI_PREFIX(getModulePath)(char *out, int capacity, int *dirname_length) { memcpy(out, resolved, length); if (dirname_length) { - for (int j = length - 1; j >= 0; --j) { - if (out[j] == '/') { - *dirname_length = j; + int i; + + for (i = length - 1; i >= 0; --i) { + if (out[i] == '/') { + *dirname_length = i; break; } } @@ -326,6 +341,7 @@ int WAI_PREFIX(getModulePath)(char *out, int capacity, int *dirname_length) { return length; } +#endif // WAI_PM3_TUNED #elif defined(__APPLE__) @@ -381,8 +397,9 @@ int WAI_PREFIX(getExecutablePath)(char *out, int capacity, int *dirname_length) return length; } -WAI_NOINLINE -WAI_FUNCSPEC +#ifndef WAI_PM3_TUNED + +WAI_NOINLINE WAI_FUNCSPEC int WAI_PREFIX(getModulePath)(char *out, int capacity, int *dirname_length) { char buffer[PATH_MAX]; char *resolved = NULL; @@ -419,6 +436,8 @@ int WAI_PREFIX(getModulePath)(char *out, int capacity, int *dirname_length) { return length; } +#endif // WAI_PM3_TUNED + #elif defined(__QNXNTO__) #include @@ -475,6 +494,8 @@ int WAI_PREFIX(getExecutablePath)(char *out, int capacity, int *dirname_length) return length; } +#ifndef WAI_PM3_TUNED + WAI_FUNCSPEC int WAI_PREFIX(getModulePath)(char *out, int capacity, int *dirname_length) { char buffer[PATH_MAX]; @@ -512,11 +533,12 @@ int WAI_PREFIX(getModulePath)(char *out, int capacity, int *dirname_length) { return length; } +#endif // WAI_PM3_TUNED + #elif defined(__DragonFly__) || defined(__FreeBSD__) || \ defined(__FreeBSD_kernel__) || defined(__NetBSD__) #include -#include #include #include #include @@ -532,8 +554,8 @@ int WAI_PREFIX(getExecutablePath)(char *out, int capacity, int *dirname_length) int length = -1; for (;;) { -#ifdef KERN_PROC_ARGV - int mib[4] = { CTL_KERN, KERN_PROC_ARGS, getpid(), KERN_PROC_ARGV }; +#if defined(__NetBSD__) + int mib[4] = { CTL_KERN, KERN_PROC_ARGS, -1, KERN_PROC_PATHNAME }; #else int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 }; #endif @@ -571,8 +593,9 @@ int WAI_PREFIX(getExecutablePath)(char *out, int capacity, int *dirname_length) return length; } -WAI_NOINLINE -WAI_FUNCSPEC +#ifndef WAI_PM3_TUNED + +WAI_NOINLINE WAI_FUNCSPEC int WAI_PREFIX(getModulePath)(char *out, int capacity, int *dirname_length) { char buffer[PATH_MAX]; char *resolved = NULL; @@ -609,6 +632,8 @@ int WAI_PREFIX(getModulePath)(char *out, int capacity, int *dirname_length) { return length; } +#endif // WAI_PM3_TUNED + #else #error unsupported platform From 9847b77c83055870130b7198bcb8908b18b785cd Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 4 May 2020 23:31:36 +0200 Subject: [PATCH 064/632] fix cast align warning --- common/generator.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/common/generator.c b/common/generator.c index 653d57061..b405fec1a 100644 --- a/common/generator.c +++ b/common/generator.c @@ -111,18 +111,17 @@ uint32_t ul_ev1_pwdgenB(uint8_t *uid) { // Lego Dimension pwd generation algo nickname C. uint32_t ul_ev1_pwdgenC(uint8_t *uid) { uint32_t pwd = 0; - uint8_t base[] = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x28, - 0x63, 0x29, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, - 0x69, 0x67, 0x68, 0x74, 0x20, 0x4c, 0x45, 0x47, - 0x4f, 0x20, 0x32, 0x30, 0x31, 0x34, 0xaa, 0xaa + uint32_t base[] = { + 0xffffffff, 0x28ffffff, + 0x43202963, 0x7279706f, + 0x74686769, 0x47454c20, + 0x3032204f, 0xaaaa3431 }; memcpy(base, uid, 7); - for (int i = 0; i < 32; i += 4) { - uint32_t b = *(uint32_t *)(base + i); - pwd = b + ROTR(pwd, 25) + ROTR(pwd, 10) - pwd; + for (int i = 0; i < 8; i++) { + pwd = base[i] + ROTR(pwd, 25) + ROTR(pwd, 10) - pwd; } return BSWAP_32(pwd); } From 2c250d5d1400e3cdb7ee5a81246fe318db175c1e Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 4 May 2020 23:58:58 +0200 Subject: [PATCH 065/632] hf epa: fix cast align warning --- client/src/cmdhfepa.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/cmdhfepa.c b/client/src/cmdhfepa.c index e83ee39bf..b7c49bd83 100644 --- a/client/src/cmdhfepa.c +++ b/client/src/cmdhfepa.c @@ -92,8 +92,8 @@ static int CmdHFEPAPACEReplay(const char *Cmd) { while (Cmd[skip] != ' ' && Cmd[skip] != '\0') { // convert scan_return = sscanf(Cmd + skip, - "%2X%n", - (unsigned int *)(apdus[i] + apdu_lengths[i]), + "%2" SCNx8 "%n", + apdus[i] + apdu_lengths[i], &skip_add ); From 30e96ece74d4dce57116a2a484f78574fba1a70c Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 5 May 2020 00:16:53 +0200 Subject: [PATCH 066/632] lf nedap: fix cast align warning --- client/src/cmdlfnedap.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/client/src/cmdlfnedap.c b/client/src/cmdlfnedap.c index cb0b11629..c748a262a 100644 --- a/client/src/cmdlfnedap.c +++ b/client/src/cmdlfnedap.c @@ -95,7 +95,9 @@ static inline uint32_t bitcount(uint32_t a) { } static uint8_t isEven_64_63(const uint8_t *data) { // 8 - return (bitcount(*(uint32_t *) data) + (bitcount((*(uint32_t *)(data + 4)) & 0xfeffffff))) & 1; + uint32_t tmp[2]; + memcpy(tmp, data, 8); + return (bitcount(tmp[0]) + (bitcount(tmp[1] & 0xfeffffff))) & 1; } //NEDAP demod - ASK/Biphase (or Diphase), RF/64 with preamble of 1111111110 (always a 128 bit data stream) @@ -163,14 +165,14 @@ static int CmdLFNedapDemod(const char *Cmd) { buffer[6] = (data[3] << 7) | ((data[4] & 0xe0) >> 1) | ((data[4] & 0x01) << 3) | ((data[5] & 0xe0) >> 5); buffer[5] = (data[5] << 7) | ((data[6] & 0xe0) >> 1) | ((data[6] & 0x01) << 3) | ((data[7] & 0xe0) >> 5); - - bool isValid = (checksum == *(uint16_t *)(buffer + 5)); + uint16_t checksum2 = (buffer[6] << 8) + buffer[5]; + bool isValid = (checksum == checksum2); subtype = (data[1] & 0x1e) >> 1; customerCode = ((data[1] & 0x01) << 11) | (data[2] << 3) | ((data[3] & 0xe0) >> 5); if (isValid == false) { - PrintAndLogEx(ERR, "Checksum : %s (calc 0x%04X != 0x%04X)", _RED_("failed"), checksum, *(uint16_t *)(buffer + 5)); + PrintAndLogEx(ERR, "Checksum : %s (calc 0x%04X != 0x%04X)", _RED_("failed"), checksum, checksum2); ret = PM3_ESOFT; } From 3fb34dd45bd38a41cb47d9c2add785d15f0aaf9a Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 5 May 2020 09:15:43 +0200 Subject: [PATCH 067/632] chg: more LF demodulation tests --- pm3test.sh | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/pm3test.sh b/pm3test.sh index be9331358..0739bd7a8 100755 --- a/pm3test.sh +++ b/pm3test.sh @@ -110,15 +110,19 @@ while true; do if ! CheckExecute "mfu pwdgen test" "$PM3BIN -c 'hf mfu pwdgen t'" "Selftest OK"; then break; fi printf "\n${C_BLUE}Testing LF:${C_NC}\n" - if ! CheckExecute "lf em4x05 test" "$PM3BIN -c 'data load traces/em4x05.pm3;lf search 1'" "FDX-B ID found"; then break; fi - if ! CheckExecute "lf em410x test" "$PM3BIN -c 'data load traces/EM4102-1.pm3;lf search 1'" "EM410x ID found"; then break; fi - if ! CheckExecute "lf visa2000 test" "$PM3BIN -c 'data load traces/visa2000.pm3;lf search 1'" "Visa2000 ID found"; then break; fi - if ! CheckExecute "lf awid test" "$PM3BIN -c 'data load traces/AWID-15-259.pm3;lf search 1'" "AWID ID found"; then break; fi - if ! CheckExecute "lf securakey test" "$PM3BIN -c 'data load traces/securakey-64169.pm3;lf search 1 '" "Securakey ID found"; then break; fi - if ! CheckExecute "lf keri test" "$PM3BIN -c 'data load traces/keri.pm3;lf search 1'" "Pyramid ID found"; then break; fi + if ! CheckExecute "lf EM4x05 test" "$PM3BIN -c 'data load traces/em4x05.pm3;lf search 1'" "FDX-B ID found"; then break; fi + if ! CheckExecute "lf EM410x test" "$PM3BIN -c 'data load traces/EM4102-1.pm3;lf search 1'" "EM410x ID found"; then break; fi + if ! CheckExecute "lf VISA2000 test" "$PM3BIN -c 'data load traces/visa2000.pm3;lf search 1'" "Visa2000 ID found"; then break; fi + if ! CheckExecute "lf AWID test" "$PM3BIN -c 'data load traces/AWID-15-259.pm3;lf search 1'" "AWID ID found"; then break; fi + if ! CheckExecute "lf SECURAKEY test" "$PM3BIN -c 'data load traces/securakey-64169.pm3;lf search 1 '" "Securakey ID found"; then break; fi + if ! CheckExecute "lf NEXWATCH test" "$PM3BIN -c 'data load traces/quadrakey-521512301.pm3;lf search 1 '" "NexWatch ID found"; then break; fi + if ! CheckExecute "lf KERI test" "$PM3BIN -c 'data load traces/keri.pm3;lf search 1'" "Pyramid ID found"; then break; fi if ! CheckExecute "lf HID Prox test" "$PM3BIN -c 'data load traces/hid-proxCardII-05512-11432784-1.pm3;lf search 1'" "HID Prox ID found"; then break; fi - if ! CheckExecute "lf Paradox test" "$PM3BIN -c 'data load traces/Paradox-96_40426-APJN08.pm3;lf search 1'" "Paradox ID found"; then break; fi - if ! CheckExecute "lf IO Prox test" "$PM3BIN -c 'data load traces/ioprox-XSF-01-3B-44725.pm3;lf search 1'" "IO Prox ID found"; then break; fi + if ! CheckExecute "lf PARADOX test" "$PM3BIN -c 'data load traces/Paradox-96_40426-APJN08.pm3;lf search 1'" "Paradox ID found"; then break; fi + if ! CheckExecute "lf PAC test" "$PM3BIN -c 'data load traces/pac-8E4C058E.pm3;lf search 1'" "PAC/Stanley ID found"; then break; fi + if ! CheckExecute "lf VIKING test" "$PM3BIN -c 'data load traces/Transit999-best.pm3;lf search 1'" "Viking ID found"; then break; fi + if ! CheckExecute "lf FDX-B test" "$PM3BIN -c 'data load traces/homeagain1600.pm3;lf search 1'" "FDX-B ID found"; then break; fi + if ! CheckExecute "lf INDALA test" "$PM3BIN -c 'data load traces/indala-504278295.pm3;lf search 1'" "Indala ID found"; then break; fi printf "\n${C_BLUE}Testing HF:${C_NC}\n" if ! CheckExecute "hf mf offline text" "$PM3BIN -c 'hf mf'" "at_enc"; then break; fi From 6dadbb042390f7dcf2df4390351bf40ed81ec29e Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 5 May 2020 08:19:26 +0100 Subject: [PATCH 068/632] chg: rpi aling warning --- client/src/cmdhflegic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhflegic.c b/client/src/cmdhflegic.c index 7507e326b..b7defe904 100644 --- a/client/src/cmdhflegic.c +++ b/client/src/cmdhflegic.c @@ -880,7 +880,7 @@ int legic_get_type(legic_card_select_t *card) { if (!isOK) return PM3_ESOFT; - memcpy(card, (legic_card_select_t *)resp.data.asBytes, sizeof(legic_card_select_t)); + memcpy(card, resp.data.asBytes, sizeof(legic_card_select_t)); return PM3_SUCCESS; } void legic_chk_iv(uint32_t *iv) { From dcb02b853c8bb269bb589510b2c0159d10dc8fa2 Mon Sep 17 00:00:00 2001 From: Iceman Date: Tue, 5 May 2020 09:48:14 +0200 Subject: [PATCH 069/632] Update bt_manual_v10.md updated the instructions for native bluetooth on Windows 10. --- doc/bt_manual_v10.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/doc/bt_manual_v10.md b/doc/bt_manual_v10.md index 8a08fcdcd..805b6ec23 100644 --- a/doc/bt_manual_v10.md +++ b/doc/bt_manual_v10.md @@ -65,6 +65,24 @@ To compile the client and firmware with FPC support, the easiest way is to You are now ready to run the client with the serial port you got from your BT device on your laptop etc. See instructions below. +First open your bluetooth settings, click on "more options". +

+Image of bluetooth more options popup +

+Go to second tab and view the list of current bluetooth comports. If you don't have an outgoing com port setup, click 'add' +

+Image of current bluetooth comports +

+Select `outgoing comport` and select the Proxmark3 RDV4.0 device. Click `OK` when done. +

+Image of adding outgoing comport +

+Verify that you now have a outgoing comport. Remember this com port when you want to use your Proxmark3. +

+Image of ok bluetooth outgoing comport +

+All done! + #### Homebrew (macOS) From the [homebrew-proxmark3 readme](https://github.com/RfidResearchGroup/homebrew-proxmark3) From 9703f6412b2095800eb04dc675e05403cce5d21f Mon Sep 17 00:00:00 2001 From: Iceman Date: Tue, 5 May 2020 09:48:27 +0200 Subject: [PATCH 070/632] Update bt_manual_v10.md --- doc/bt_manual_v10.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/bt_manual_v10.md b/doc/bt_manual_v10.md index 805b6ec23..3290aa97a 100644 --- a/doc/bt_manual_v10.md +++ b/doc/bt_manual_v10.md @@ -1,6 +1,6 @@ # MANUAL ### Bluetooth / Battery add-on 'Blue Shark' -_rev. v1.0_ +_rev. v1.1_ ### 1. FEATURES From 10abd0f2233a0680118ae8769c4d65a92d4429b0 Mon Sep 17 00:00:00 2001 From: Iceman Date: Tue, 5 May 2020 11:45:19 +0200 Subject: [PATCH 071/632] Update bt_manual_v10.md --- doc/bt_manual_v10.md | 89 +++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 47 deletions(-) diff --git a/doc/bt_manual_v10.md b/doc/bt_manual_v10.md index 3290aa97a..3f3fd4116 100644 --- a/doc/bt_manual_v10.md +++ b/doc/bt_manual_v10.md @@ -1,8 +1,8 @@ # MANUAL -### Bluetooth / Battery add-on 'Blue Shark' +## Bluetooth / Battery add-on 'Blue Shark' _rev. v1.1_ -### 1. FEATURES +## 1. FEATURES * Built-in Bluetooth 2.0 with EDR Bluetooth module, default baud rate 115200. * Built-in 400 mAh polymer lithium-ion battery, typical standby time up to 3.5 hours. @@ -17,7 +17,7 @@ It can easily connect to Bluetooth mobile phone, portable computer, etc. Without Built-in battery can support standalone mode, off-line sniffing, off-line reading & simulation, etc. The temperature of the device is stable. -### 2. PARAMETERS +## 2. PARAMETERS * Battery capacity: 400 mAh * Standby time: 3.5h @ StandBy; 2.9h @ LF-On; 50min @ HF-On; @@ -29,7 +29,7 @@ Built-in battery can support standalone mode, off-line sniffing, off-line readin * Size and weight: 54.4mm * 29.4mm * 13.5mm 24g -### 3. ASSEMBLY STEPS +## 3. ASSEMBLY STEPS * Unplug your Proxmark3 RDV4.0 device from any usb cable. * Remove the plastic upper case of Proxmark3 RDV4.0 with opener. @@ -45,10 +45,9 @@ Built-in battery can support standalone mode, off-line sniffing, off-line readin Image of blue shark add-on open fitImage of blue shark add-on fitted

-### 4. COMPILATION / FLASHING +## 4. COMPILATION / FLASHING #### From Source - Please download the latest source code from Rfid Research Group's Github repo: https://github.com/RfidResearchGroup/proxmark3 @@ -65,31 +64,14 @@ To compile the client and firmware with FPC support, the easiest way is to You are now ready to run the client with the serial port you got from your BT device on your laptop etc. See instructions below. -First open your bluetooth settings, click on "more options". -

-Image of bluetooth more options popup -

-Go to second tab and view the list of current bluetooth comports. If you don't have an outgoing com port setup, click 'add' -

-Image of current bluetooth comports -

-Select `outgoing comport` and select the Proxmark3 RDV4.0 device. Click `OK` when done. -

-Image of adding outgoing comport -

-Verify that you now have a outgoing comport. Remember this com port when you want to use your Proxmark3. -

-Image of ok bluetooth outgoing comport -

-All done! - #### Homebrew (macOS) From the [homebrew-proxmark3 readme](https://github.com/RfidResearchGroup/homebrew-proxmark3) 1. `brew tap rfidresearchgroup/proxmark3` 2. `brew install --with-blueshark proxmark3` -### 5. CONNECT WITH BLUETOOTH + +## 5. CONNECT WITH BLUETOOTH You can have both USB cable connect and BT active at the same time and connect to either serial port. You can also switch serial port from inside the proxmark3 client using the new command `hw connect`. @@ -100,19 +82,33 @@ You can also switch serial port from inside the proxmark3 client using the new c 2. Name: `PM3_RDV4.0` 3. Pin: `1234` -#### Windows - -#### (1) Connecting your RDV4.0 with Bluetooth on mobile phone or computer +### Windows +#### (5.1) (win) Connecting your RDV4.0 with Bluetooth on mobile phone or computer * Open Bluetooth and search for a device named PM3_RDV4.0. * Enter the paired password 1234 and establish the connection. * The blue state LED on the add-on will keep blinking after the connection is established. Only when the mobile phone or computer opens the correct COM port, the blue LED turns on solid, indicating that the connection is successful. - - - * First time you do this you might need to go into Bluetooth more settings and add a outgoing com port. -#### (2) Fast connection using dedicated USB Bluetooth adapter under Windows +* First open your bluetooth settings, click on "more options". +

+Image of bluetooth more options popup +

+* Go to second tab and view the list of current bluetooth comports. If you don't have an outgoing com port setup, click 'add' +

+Image of current bluetooth comports +

+* Select `outgoing comport` and select the Proxmark3 RDV4.0 device. Click `OK` when done. +

+Image of adding outgoing comport +

+* Verify that you now have a outgoing comport. Remember this com port when you want to use your Proxmark3. +

+Image of ok bluetooth outgoing comport +

+* done! + +#### (5.2) (win) Fast connection using dedicated USB Bluetooth adapter under Windows

Image of blue shark add-on HC-06 white dongle

@@ -125,9 +121,8 @@ http://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp * After the connection is established, the blue state LED on add-on will turn on solid. * look for _CP2104 USB tp UART bridge controller_ under devices in order to get the assigned serial port -#### Linux - -#### (1) Connecting rdv4.0 with Bluetooth on Linux computer via native Bluetooth support in the client +### Linux +#### (5.1) (linux) Connecting rdv4.0 with Bluetooth on Linux computer via native Bluetooth support in the client This requires to have compiled the client with Bluetooth support. @@ -171,7 +166,7 @@ Discovery started [bluetooth]# quit ``` -#### (2) Fast connection using dedicated USB Bluetooth adapter under Linux +#### (5.2) (linux) Fast connection using dedicated USB Bluetooth adapter under Linux

Image of blue shark add-on HC-06 white dongle

@@ -194,7 +189,7 @@ turn on solid. ./proxmark3 /dev/ttyUSB0 ``` -#### (1b, deprecated) Connecting rdv4.0 with Bluetooth on Linux computer via rfcomm +#### (5.1b) (linux, deprecated) Connecting rdv4.0 with Bluetooth on Linux computer via rfcomm rfcomm is a deprecated tool which might be unavailable in your Linux distribution. @@ -227,9 +222,9 @@ connection is successful. See instructions above (method 1) for initial pairing. -#### MacOS +### MacOS -#### (1) Connecting rdv4.0 with Bluetooth on MacOS +#### (5.1) (osx) Connecting rdv4.0 with Bluetooth on MacOS With MacOS Mojave 10.14.5 you could experience some continuosly disconnecting and difficult to recconnect the device at the system wakeup, to avoid this problem do a PRAM reset before to add your Proxmark3 RDV4 Blue Shark: @@ -248,34 +243,34 @@ After reboot you can go ahead to pairing your Proxmark3 RDV4 Blue Shark: ```sh ./proxmark3 /dev/tty.PM3_RDV40-DevB ``` -#### Android +### Android -#### (2) Fast connection using dedicated Bluetooth (HC-06 Master + CP2102) adapter under Android with Termux +#### (5.1) (android) Fast connection using dedicated Bluetooth (HC-06 Master + CP2102) adapter under Android with Termux 1. Make sure you already followed this tutorial https://github.com/RfidResearchGroup/proxmark3/blob/master/doc/termux_notes.md#setup and have Termux with an running Proxmark3 client ready. You need additional the `cp210x` serial usb driver enabled and working, like the `USB_ACM` driver to communicate wireless. 2. Insert the Bluetooth adapter with an fitting USB-C/Micro-USB converter into your Android USB port and a serial port `/dev/ttyUSB0` will be created. To see if it's working, run `tsudo ls /dev/ttyU*` and it should list `/dev/ttyUSB0`. 3. The adapter will search automatically and establish the connection to BlueShark. The adapter will remember the device that was first connected and after that the same device will be connected. After the connection is established, the blue state LED on add-on will turn on solid. 4. If you see this, congratulations, you can run your Proxmark3 client in Termux with `tsudo proxmark3/client/proxmark3 /dev/ttyUSB0` -##### Notes +#### Notes If you bought your Bluetooth adapter somewhere else, make sure to set the baud rate to 115200 `AT+BAUD8` and PIN `AT+PIN1234` correctly -### 6. OTHER NOTES +## 6. OTHER NOTES -#### (1) UART and LED behavior +### (6.1) UART and LED behavior Bluetooth is connected to Proxmark3 RDV4.0 via UART. The USB and UART interfaces of RDV4.0 can coexist without conflict, and no special switching is required. The following link has helpful notes on UART usage and baud rates: https://github.com/RfidResearchGroup/proxmark3/blob/master/doc/uart_notes.md -#### (2) Disassembly +### (6.2) Disassembly There is a heat conductive double-sided tape inside the add-on, which has strong adhesive force. Therefore, if add-on needs to be removed, it needs to be pulled out from the heat sink end with greater efforts. Each disassembly will reduce the viscidity of double-sided tape. When double-sided tape is well protected, it will not affect the second use. Thermal conductivity will be slightly worse and will therefore have a direct impact on the thermal performance of the heat sink. -#### (3) Battery charging +### (6.3) Battery charging The battery charging circuit is turned on by default. Any time a USB cable is inserted, the battery will be automatically charged. The red LED will remain bright when charging. The red LED will be extinguished when charging is completed. -#### (4) Get better signals +### (6.4) Get better signals For the better heat dissipation, we have used a cast metal enclosure for the add-on. As a result Bluetooth wireless signals are sacrificed. For example, if the back of add-on is facing the Bluetooth host, the signal is very bad and the distance will be reduced. The best signal strength can be obtained when the front glass faces the Bluetooth host. If the Proxmark3 is not responding, it may be due to a poor Bluetooth connection. To improve performance, try repositioning the Proxmark3 so the glass face is directed toward the host. From b330b48258fd0f4b1e4c21678d23d076b2c8212b Mon Sep 17 00:00:00 2001 From: Iceman Date: Tue, 5 May 2020 12:07:22 +0200 Subject: [PATCH 072/632] Update bt_manual_v10.md --- doc/bt_manual_v10.md | 55 +++++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/doc/bt_manual_v10.md b/doc/bt_manual_v10.md index 3f3fd4116..b92dfe23b 100644 --- a/doc/bt_manual_v10.md +++ b/doc/bt_manual_v10.md @@ -2,6 +2,30 @@ ## Bluetooth / Battery add-on 'Blue Shark' _rev. v1.1_ +1. FEATURES +2. PARAMETERS +3. ASSEMBLY STEPS +4. COMPILATION / FLASHING + * 4.1 From source + * 4.2 Homebrew (macOS) +5. CONNECT WITH BLUETOOTH + * 5.1 WINDOWS + * 5.1.1 Connecting your RDV4.0 with Bluetooth on mobile phone or computer + * 5.1.2 Fast connection using dedicated USB Bluetooth adapter under Windows + * 5.2 LINUX + * 5.2.1 Connecting rdv4.0 with Bluetooth on Linux computer via native Bluetooth support in the client + * 5.2.2 Fast connection using dedicated USB Bluetooth adapter under Linux + * 5.2.1b *(deprecated)* Connecting rdv4.0 with Bluetooth on Linux computer via rfcomm + * 5.3 OS X + * 5.3.1 Connecting rdv4.0 with Bluetooth on MacOS + * 5.4 ANDROID + * 5.4.1 Fast connection using dedicated Bluetooth (HC-06 Master + CP2102) adapter under Android with Termux +6. OTHER NOTES + * 6.1. UART and LED behavior + * 6.2. Disassembly + * 6.3. Battery charging + * 6.4. Get better signals + ## 1. FEATURES * Built-in Bluetooth 2.0 with EDR Bluetooth module, default baud rate 115200. @@ -47,7 +71,7 @@ Built-in battery can support standalone mode, off-line sniffing, off-line readin ## 4. COMPILATION / FLASHING -#### From Source +#### (4.1) From Source Please download the latest source code from Rfid Research Group's Github repo: https://github.com/RfidResearchGroup/proxmark3 @@ -64,7 +88,7 @@ To compile the client and firmware with FPC support, the easiest way is to You are now ready to run the client with the serial port you got from your BT device on your laptop etc. See instructions below. -#### Homebrew (macOS) +#### (4.2) Homebrew (macOS) From the [homebrew-proxmark3 readme](https://github.com/RfidResearchGroup/homebrew-proxmark3) 1. `brew tap rfidresearchgroup/proxmark3` @@ -82,8 +106,9 @@ You can also switch serial port from inside the proxmark3 client using the new c 2. Name: `PM3_RDV4.0` 3. Pin: `1234` -### Windows -#### (5.1) (win) Connecting your RDV4.0 with Bluetooth on mobile phone or computer +### (5.1) Windows + +#### (5.1.1) Connecting your RDV4.0 with Bluetooth on mobile phone or computer * Open Bluetooth and search for a device named PM3_RDV4.0. * Enter the paired password 1234 and establish the connection. * The blue state LED on the add-on will keep blinking after the connection is established. Only when the mobile phone or computer opens the correct COM port, the blue LED turns on solid, indicating that the connection is successful. @@ -91,6 +116,9 @@ You can also switch serial port from inside the proxmark3 client using the new c * First time you do this you might need to go into Bluetooth more settings and add a outgoing com port. * First open your bluetooth settings, click on "more options". +![Image](http://www.icedev.se/proxmark3/blueshark/bt_more_options.png) +![Image](http://www.icedev.se/proxmark3/blueshark/bt_com_ports.png) +

Image of bluetooth more options popup

@@ -108,7 +136,7 @@ You can also switch serial port from inside the proxmark3 client using the new c

* done! -#### (5.2) (win) Fast connection using dedicated USB Bluetooth adapter under Windows +#### (5.1.2) Fast connection using dedicated USB Bluetooth adapter under Windows

Image of blue shark add-on HC-06 white dongle

@@ -121,8 +149,9 @@ http://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp * After the connection is established, the blue state LED on add-on will turn on solid. * look for _CP2104 USB tp UART bridge controller_ under devices in order to get the assigned serial port -### Linux -#### (5.1) (linux) Connecting rdv4.0 with Bluetooth on Linux computer via native Bluetooth support in the client +### (5.2) Linux + +#### (5.2.1) Connecting rdv4.0 with Bluetooth on Linux computer via native Bluetooth support in the client This requires to have compiled the client with Bluetooth support. @@ -166,7 +195,7 @@ Discovery started [bluetooth]# quit ``` -#### (5.2) (linux) Fast connection using dedicated USB Bluetooth adapter under Linux +#### (5.2.2) Fast connection using dedicated USB Bluetooth adapter under Linux

Image of blue shark add-on HC-06 white dongle

@@ -189,7 +218,7 @@ turn on solid. ./proxmark3 /dev/ttyUSB0 ``` -#### (5.1b) (linux, deprecated) Connecting rdv4.0 with Bluetooth on Linux computer via rfcomm +#### (5.2.1b) (deprecated) Connecting rdv4.0 with Bluetooth on Linux computer via rfcomm rfcomm is a deprecated tool which might be unavailable in your Linux distribution. @@ -222,9 +251,9 @@ connection is successful. See instructions above (method 1) for initial pairing. -### MacOS +### (5.3) MacOS -#### (5.1) (osx) Connecting rdv4.0 with Bluetooth on MacOS +#### (5.3.1) Connecting rdv4.0 with Bluetooth on MacOS With MacOS Mojave 10.14.5 you could experience some continuosly disconnecting and difficult to recconnect the device at the system wakeup, to avoid this problem do a PRAM reset before to add your Proxmark3 RDV4 Blue Shark: @@ -243,9 +272,9 @@ After reboot you can go ahead to pairing your Proxmark3 RDV4 Blue Shark: ```sh ./proxmark3 /dev/tty.PM3_RDV40-DevB ``` -### Android +### (5.4) Android -#### (5.1) (android) Fast connection using dedicated Bluetooth (HC-06 Master + CP2102) adapter under Android with Termux +#### (5.4.1) Fast connection using dedicated Bluetooth (HC-06 Master + CP2102) adapter under Android with Termux 1. Make sure you already followed this tutorial https://github.com/RfidResearchGroup/proxmark3/blob/master/doc/termux_notes.md#setup and have Termux with an running Proxmark3 client ready. You need additional the `cp210x` serial usb driver enabled and working, like the `USB_ACM` driver to communicate wireless. 2. Insert the Bluetooth adapter with an fitting USB-C/Micro-USB converter into your Android USB port and a serial port `/dev/ttyUSB0` will be created. To see if it's working, run `tsudo ls /dev/ttyU*` and it should list `/dev/ttyUSB0`. From ddfcf71d406e84195edbda70e711cf0adc8efd5c Mon Sep 17 00:00:00 2001 From: Iceman Date: Tue, 5 May 2020 12:08:44 +0200 Subject: [PATCH 073/632] Update bt_manual_v10.md --- doc/bt_manual_v10.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/doc/bt_manual_v10.md b/doc/bt_manual_v10.md index b92dfe23b..037f64ef8 100644 --- a/doc/bt_manual_v10.md +++ b/doc/bt_manual_v10.md @@ -113,12 +113,9 @@ You can also switch serial port from inside the proxmark3 client using the new c * Enter the paired password 1234 and establish the connection. * The blue state LED on the add-on will keep blinking after the connection is established. Only when the mobile phone or computer opens the correct COM port, the blue LED turns on solid, indicating that the connection is successful. -* First time you do this you might need to go into Bluetooth more settings and add a outgoing com port. +* First time you do this you might need to go into Bluetooth more settings and add a outgoing com port. If so, follow these steps below. * First open your bluetooth settings, click on "more options". -![Image](http://www.icedev.se/proxmark3/blueshark/bt_more_options.png) -![Image](http://www.icedev.se/proxmark3/blueshark/bt_com_ports.png) -

Image of bluetooth more options popup

From 2e52c476def1bea51dd42e719866d94d4888057e Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 5 May 2020 12:32:46 +0200 Subject: [PATCH 074/632] check for sim module fw file --- pm3test.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pm3test.sh b/pm3test.sh index 0739bd7a8..99fe168dc 100755 --- a/pm3test.sh +++ b/pm3test.sh @@ -95,6 +95,8 @@ while true; do printf "\n${C_BLUE}Testing files:${C_NC}\n" if ! CheckFileExist "proxmark3 exists" "$PM3BIN"; then break; fi if ! CheckFileExist "hardnested tables exists" "./client/resources/hardnested_tables/*.z"; then break; fi + if ! CheckFileExist "simmodule fw file exists" "./tools/simmodule/sim011.bin"; then break; fi + if $TESTDEVICE; then if ! CheckFileExist "arm image exists" "./armsrc/obj/fullimage.elf"; then break; fi if ! CheckFileExist "bootrom exists" "./bootrom/obj/bootrom.elf"; then break; fi From c49bfa0849c4d9cc702080a8412ea10644fb1d0b Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 5 May 2020 13:45:03 +0200 Subject: [PATCH 075/632] bt manual --- doc/bt_manual_v10.md | 107 ++++++++++++++++++++++--------------------- 1 file changed, 55 insertions(+), 52 deletions(-) diff --git a/doc/bt_manual_v10.md b/doc/bt_manual_v10.md index 037f64ef8..d54d458c2 100644 --- a/doc/bt_manual_v10.md +++ b/doc/bt_manual_v10.md @@ -1,31 +1,33 @@ -# MANUAL -## Bluetooth / Battery add-on 'Blue Shark' +# MANUAL Bluetooth / Battery add-on 'Blue Shark' _rev. v1.1_ -1. FEATURES -2. PARAMETERS -3. ASSEMBLY STEPS -4. COMPILATION / FLASHING - * 4.1 From source - * 4.2 Homebrew (macOS) -5. CONNECT WITH BLUETOOTH - * 5.1 WINDOWS - * 5.1.1 Connecting your RDV4.0 with Bluetooth on mobile phone or computer - * 5.1.2 Fast connection using dedicated USB Bluetooth adapter under Windows - * 5.2 LINUX - * 5.2.1 Connecting rdv4.0 with Bluetooth on Linux computer via native Bluetooth support in the client - * 5.2.2 Fast connection using dedicated USB Bluetooth adapter under Linux - * 5.2.1b *(deprecated)* Connecting rdv4.0 with Bluetooth on Linux computer via rfcomm - * 5.3 OS X - * 5.3.1 Connecting rdv4.0 with Bluetooth on MacOS - * 5.4 ANDROID - * 5.4.1 Fast connection using dedicated Bluetooth (HC-06 Master + CP2102) adapter under Android with Termux -6. OTHER NOTES - * 6.1. UART and LED behavior - * 6.2. Disassembly - * 6.3. Battery charging - * 6.4. Get better signals - +## Table of Contents + + * [1. FEATURES](#1-features) + * [2. PARAMETERS](#2-parameters) + * [3. ASSEMBLY STEPS](#3-assembly-steps) + * [4. COMPILATION / FLASHING](#4-compilation--flashing) + * [4.1 From Source](#41-from-source) + * [4.2 Homebrew (macOS)](#42-homebrew-macos) + * [5. CONNECT WITH BLUETOOTH](#5-connect-with-bluetooth) + * [5.1 Windows](#51-windows) + * [5.1.1 Connecting your RDV4.0 with Bluetooth on mobile phone or computer](#511-connecting-your-rdv40-with-bluetooth-on-mobile-phone-or-computer) + * [5.1.2 Fast connection using dedicated USB Bluetooth adapter under Windows](#512-fast-connection-using-dedicated-usb-bluetooth-adapter-under-windows) + * [5.2 Linux](#52-linux) + * [5.2.1 Connecting rdv4.0 with Bluetooth on Linux computer via native Bluetooth support in the client](#521-connecting-rdv40-with-bluetooth-on-linux-computer-via-native-bluetooth-support-in-the-client) + * [5.2.2 Fast connection using dedicated USB Bluetooth adapter under Linux](#522-fast-connection-using-dedicated-usb-bluetooth-adapter-under-linux) + * [5.2.3 (deprecated) Connecting rdv4.0 with Bluetooth on Linux computer via rfcomm](#523-deprecated-connecting-rdv40-with-bluetooth-on-linux-computer-via-rfcomm) + * [5.3 MacOS](#53-macos) + * [5.3.1 Connecting rdv4.0 with Bluetooth on MacOS](#531-connecting-rdv40-with-bluetooth-on-macos) + * [5.4 Android](#54-android) + * [5.4.1 Fast connection using dedicated Bluetooth (HC-06 Master CP2102) adapter under Android with Termux](#541-fast-connection-using-dedicated-bluetooth-hc-06-master--cp2102-adapter-under-android-with-termux) + * [6. OTHER NOTES](#6-other-notes) + * [6.1 Default settings](#61-default-settings) + * [6.2 UART and LED behavior](#62-uart-and-led-behavior) + * [6.3 Disassembly](#63-disassembly) + * [6.4 Battery charging](#64-battery-charging) + * [6.5 Get better signals](#65-get-better-signals) + ## 1. FEATURES * Built-in Bluetooth 2.0 with EDR Bluetooth module, default baud rate 115200. @@ -71,7 +73,7 @@ Built-in battery can support standalone mode, off-line sniffing, off-line readin ## 4. COMPILATION / FLASHING -#### (4.1) From Source +#### 4.1 From Source Please download the latest source code from Rfid Research Group's Github repo: https://github.com/RfidResearchGroup/proxmark3 @@ -88,7 +90,7 @@ To compile the client and firmware with FPC support, the easiest way is to You are now ready to run the client with the serial port you got from your BT device on your laptop etc. See instructions below. -#### (4.2) Homebrew (macOS) +#### 4.2 Homebrew (macOS) From the [homebrew-proxmark3 readme](https://github.com/RfidResearchGroup/homebrew-proxmark3) 1. `brew tap rfidresearchgroup/proxmark3` @@ -100,15 +102,9 @@ From the [homebrew-proxmark3 readme](https://github.com/RfidResearchGroup/homebr You can have both USB cable connect and BT active at the same time and connect to either serial port. You can also switch serial port from inside the proxmark3 client using the new command `hw connect`. -### Default settings +### 5.1 Windows -1. Serial: `115200 8N1` -2. Name: `PM3_RDV4.0` -3. Pin: `1234` - -### (5.1) Windows - -#### (5.1.1) Connecting your RDV4.0 with Bluetooth on mobile phone or computer +#### 5.1.1 Connecting your RDV4.0 with Bluetooth on mobile phone or computer * Open Bluetooth and search for a device named PM3_RDV4.0. * Enter the paired password 1234 and establish the connection. * The blue state LED on the add-on will keep blinking after the connection is established. Only when the mobile phone or computer opens the correct COM port, the blue LED turns on solid, indicating that the connection is successful. @@ -133,7 +129,7 @@ You can also switch serial port from inside the proxmark3 client using the new c

* done! -#### (5.1.2) Fast connection using dedicated USB Bluetooth adapter under Windows +#### 5.1.2 Fast connection using dedicated USB Bluetooth adapter under Windows

Image of blue shark add-on HC-06 white dongle

@@ -146,9 +142,9 @@ http://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp * After the connection is established, the blue state LED on add-on will turn on solid. * look for _CP2104 USB tp UART bridge controller_ under devices in order to get the assigned serial port -### (5.2) Linux +### 5.2 Linux -#### (5.2.1) Connecting rdv4.0 with Bluetooth on Linux computer via native Bluetooth support in the client +#### 5.2.1 Connecting rdv4.0 with Bluetooth on Linux computer via native Bluetooth support in the client This requires to have compiled the client with Bluetooth support. @@ -192,7 +188,7 @@ Discovery started [bluetooth]# quit ``` -#### (5.2.2) Fast connection using dedicated USB Bluetooth adapter under Linux +#### 5.2.2 Fast connection using dedicated USB Bluetooth adapter under Linux

Image of blue shark add-on HC-06 white dongle

@@ -215,7 +211,7 @@ turn on solid. ./proxmark3 /dev/ttyUSB0 ``` -#### (5.2.1b) (deprecated) Connecting rdv4.0 with Bluetooth on Linux computer via rfcomm +#### 5.2.3 (deprecated) Connecting rdv4.0 with Bluetooth on Linux computer via rfcomm rfcomm is a deprecated tool which might be unavailable in your Linux distribution. @@ -248,9 +244,9 @@ connection is successful. See instructions above (method 1) for initial pairing. -### (5.3) MacOS +### 5.3 MacOS -#### (5.3.1) Connecting rdv4.0 with Bluetooth on MacOS +#### 5.3.1 Connecting rdv4.0 with Bluetooth on MacOS With MacOS Mojave 10.14.5 you could experience some continuosly disconnecting and difficult to recconnect the device at the system wakeup, to avoid this problem do a PRAM reset before to add your Proxmark3 RDV4 Blue Shark: @@ -269,34 +265,41 @@ After reboot you can go ahead to pairing your Proxmark3 RDV4 Blue Shark: ```sh ./proxmark3 /dev/tty.PM3_RDV40-DevB ``` -### (5.4) Android +### 5.4 Android -#### (5.4.1) Fast connection using dedicated Bluetooth (HC-06 Master + CP2102) adapter under Android with Termux +#### 5.4.1 Fast connection using dedicated Bluetooth (HC-06 Master + CP2102) adapter under Android with Termux 1. Make sure you already followed this tutorial https://github.com/RfidResearchGroup/proxmark3/blob/master/doc/termux_notes.md#setup and have Termux with an running Proxmark3 client ready. You need additional the `cp210x` serial usb driver enabled and working, like the `USB_ACM` driver to communicate wireless. 2. Insert the Bluetooth adapter with an fitting USB-C/Micro-USB converter into your Android USB port and a serial port `/dev/ttyUSB0` will be created. To see if it's working, run `tsudo ls /dev/ttyU*` and it should list `/dev/ttyUSB0`. 3. The adapter will search automatically and establish the connection to BlueShark. The adapter will remember the device that was first connected and after that the same device will be connected. After the connection is established, the blue state LED on add-on will turn on solid. 4. If you see this, congratulations, you can run your Proxmark3 client in Termux with `tsudo proxmark3/client/proxmark3 /dev/ttyUSB0` -#### Notes -If you bought your Bluetooth adapter somewhere else, make sure to set the baud rate to 115200 `AT+BAUD8` and PIN `AT+PIN1234` correctly - ## 6. OTHER NOTES -### (6.1) UART and LED behavior +### 6.1 Default settings + +Settings of the Blue Shark add-on and of the white dongle: + +1. Serial: `115200 8N1` +2. Name: `PM3_RDV4.0` +3. Pin: `1234` + +If you bought your Bluetooth adapter dongle somewhere else, make sure to set the baud rate to 115200 `AT+BAUD8`, the name `AT+NAMEPM3_RDV4.0` and PIN `AT+PIN1234` correctly. + +### 6.1 UART and LED behavior Bluetooth is connected to Proxmark3 RDV4.0 via UART. The USB and UART interfaces of RDV4.0 can coexist without conflict, and no special switching is required. The following link has helpful notes on UART usage and baud rates: https://github.com/RfidResearchGroup/proxmark3/blob/master/doc/uart_notes.md -### (6.2) Disassembly +### 6.2 Disassembly There is a heat conductive double-sided tape inside the add-on, which has strong adhesive force. Therefore, if add-on needs to be removed, it needs to be pulled out from the heat sink end with greater efforts. Each disassembly will reduce the viscidity of double-sided tape. When double-sided tape is well protected, it will not affect the second use. Thermal conductivity will be slightly worse and will therefore have a direct impact on the thermal performance of the heat sink. -### (6.3) Battery charging +### 6.3 Battery charging The battery charging circuit is turned on by default. Any time a USB cable is inserted, the battery will be automatically charged. The red LED will remain bright when charging. The red LED will be extinguished when charging is completed. -### (6.4) Get better signals +### 6.4 Get better signals For the better heat dissipation, we have used a cast metal enclosure for the add-on. As a result Bluetooth wireless signals are sacrificed. For example, if the back of add-on is facing the Bluetooth host, the signal is very bad and the distance will be reduced. The best signal strength can be obtained when the front glass faces the Bluetooth host. If the Proxmark3 is not responding, it may be due to a poor Bluetooth connection. To improve performance, try repositioning the Proxmark3 so the glass face is directed toward the host. From 70add3fabe8afe9e2c83e2c3eceec7435c9a910a Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 6 May 2020 12:14:05 +0200 Subject: [PATCH 076/632] fix: "trace list" too short array for explanation --- client/src/cmdtrace.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index 99e5e03f2..2da9ce675 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -211,7 +211,7 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr uint16_t data_len, parity_len; uint32_t duration, timestamp, first_timestamp, EndOfTransmissionTimestamp; uint8_t topaz_reader_command[9]; - char explanation[30] = {0}; + char explanation[40] = {0}; uint8_t mfData[32] = {0}; size_t mfDataLen = 0; @@ -296,7 +296,7 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr //2 Not crc-command //--- Draw the data column - char line[18][110] = {{0}}; + char line[18][120] = {{0}}; for (int j = 0; j < data_len && j / 18 < 18; j++) { @@ -315,20 +315,20 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr && (isResponse || protocol == ISO_14443A) && (oddparity8(frame[j]) != ((parityBits >> (7 - (j & 0x0007))) & 0x01))) { - snprintf(line[j / 18] + ((j % 18) * 4), 110, "%02x! ", frame[j]); + snprintf(line[j / 18] + ((j % 18) * 4), 120, "%02x! ", frame[j]); } else if (protocol == ICLASS && isResponse == false) { uint8_t parity = 0; for (int i = 0; i < 6; i++) { parity ^= ((frame[0] >> i) & 1); } if (parity == ((frame[0] >> 7) & 1)) { - snprintf(line[j / 18] + ((j % 18) * 4), 110, "%02x ", frame[j]); + snprintf(line[j / 18] + ((j % 18) * 4), 120, "%02x ", frame[j]); } else { - snprintf(line[j / 18] + ((j % 18) * 4), 110, "%02x! ", frame[j]); + snprintf(line[j / 18] + ((j % 18) * 4), 120, "%02x! ", frame[j]); } } else { - snprintf(line[j / 18] + ((j % 18) * 4), 110, "%02x ", frame[j]); + snprintf(line[j / 18] + ((j % 18) * 4), 120, "%02x ", frame[j]); } } From 021ee95e07599c0fe80d7a03cc1bb4053d7c4afe Mon Sep 17 00:00:00 2001 From: dxl <64101226@qq.com> Date: Wed, 6 May 2020 12:05:14 +0200 Subject: [PATCH 077/632] don't mix ifdef and defined --- client/deps/tinycbor/open_memstream.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/deps/tinycbor/open_memstream.c b/client/deps/tinycbor/open_memstream.c index 098bf90fe..7a134286f 100644 --- a/client/deps/tinycbor/open_memstream.c +++ b/client/deps/tinycbor/open_memstream.c @@ -36,7 +36,7 @@ # include #endif -#ifdef __APPLE__ || defined(__ANDROID__) || defined(ANDROID) +#if defined(__APPLE__) || defined(__ANDROID__) || defined(ANDROID) typedef int RetType; typedef int LenType; #elif __GLIBC__ @@ -102,7 +102,7 @@ FILE *open_memstream(char **bufptr, size_t *lenptr) { *bufptr = NULL; *lenptr = 0; -#ifdef __APPLE__ || defined(__ANDROID__) || defined(ANDROID) +#if defined(__APPLE__) || defined(__ANDROID__) || defined(ANDROID) return funopen(b, NULL, write_to_buffer, NULL, close_buffer); #elif __GLIBC__ static const cookie_io_functions_t vtable = { From fcf0265704d3c5004d14f5e1fadff5dfc36460cc Mon Sep 17 00:00:00 2001 From: dxl <64101226@qq.com> Date: Wed, 6 May 2020 12:44:34 +0200 Subject: [PATCH 078/632] missing include --- client/src/cmdhflegic.c | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/cmdhflegic.c b/client/src/cmdhflegic.c index b7defe904..fabe926fa 100644 --- a/client/src/cmdhflegic.c +++ b/client/src/cmdhflegic.c @@ -10,6 +10,7 @@ #include "cmdhflegic.h" #include // for Mingw readline +#include // tolower #include #include "cmdparser.h" // command_t From d118ba9e0685f4d7dff55ab462b195ac0ff1af8a Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 6 May 2020 13:01:07 +0200 Subject: [PATCH 079/632] comment out unused iceIIR_Butterworth --- client/src/ui.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/src/ui.c b/client/src/ui.c index 5d0e28aec..0b0ffdb56 100644 --- a/client/src/ui.c +++ b/client/src/ui.c @@ -485,6 +485,8 @@ void memcpy_filter_emoji(void *dest, const void *src, size_t n, emojiMode_t mode } } +/* +// If reactivated, beware it doesn't compile on Android (DXL) void iceIIR_Butterworth(int *data, const size_t len) { int *output = (int *) calloc(sizeof(int) * len, sizeof(uint8_t)); @@ -533,6 +535,7 @@ void iceIIR_Butterworth(int *data, const size_t len) { free(output); } +*/ void iceSimple_Filter(int *data, const size_t len, uint8_t k) { // ref: http://www.edn.com/design/systems-design/4320010/A-simple-software-lowpass-filter-suits-embedded-system-applications From 78ee43c9c4f91e22c40e06b58e3e6d6c8909c01d Mon Sep 17 00:00:00 2001 From: dxl <64101226@qq.com> Date: Wed, 6 May 2020 12:03:37 +0200 Subject: [PATCH 080/632] Android platform adaptation(dxl) --- client/android/CMakeLists.txt | 403 ++++++++++++++++++++++++++++++++++ client/android/jni_tools.c | 97 ++++++++ client/android/jni_tools.h | 40 ++++ client/android/pm3_main.c | 175 +++++++++++++++ 4 files changed, 715 insertions(+) create mode 100644 client/android/CMakeLists.txt create mode 100644 client/android/jni_tools.c create mode 100644 client/android/jni_tools.h create mode 100644 client/android/pm3_main.c diff --git a/client/android/CMakeLists.txt b/client/android/CMakeLists.txt new file mode 100644 index 000000000..a4e04b8ca --- /dev/null +++ b/client/android/CMakeLists.txt @@ -0,0 +1,403 @@ +#需要的最cmake版本 +cmake_minimum_required(VERSION 3.4.1) + +#添加预编译宏定义参数,此次的作用是开启配置文件的引入! +add_definitions(-DANDROID -D"getlocaledecpoint()='.'" -DZ_SOLO) + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -O3 -fvisibility=hidden -w") + +#缩短路径定义 +set(PM3_ROOT ../../) + +#添加动态库定义 +add_library(pm3rrg_rdv4 SHARED + ${PM3_ROOT}/common/util_posix.c + ${PM3_ROOT}/common/crapto1/crapto1.c + ${PM3_ROOT}/common/crapto1/crypto1.c + ${PM3_ROOT}/common/crc.c + ${PM3_ROOT}/common/crc16.c + ${PM3_ROOT}/common/crc32.c + ${PM3_ROOT}/common/crc64.c + ${PM3_ROOT}/common/cardhelper.c + ${PM3_ROOT}/common/parity.c + ${PM3_ROOT}/common/commonutil.c + ${PM3_ROOT}/common/generator.c + ${PM3_ROOT}/common/lfdemod.c + ${PM3_ROOT}/common/iso15693tools.c + ${PM3_ROOT}/common/bucketsort.c + ${PM3_ROOT}/common/legic_prng.c + ${PM3_ROOT}/common/mbedtls/aes.c + ${PM3_ROOT}/common/mbedtls/base64.c + ${PM3_ROOT}/common/mbedtls/rsa.c + ${PM3_ROOT}/common/mbedtls/rsa_internal.c + ${PM3_ROOT}/common/mbedtls/arc4.c + ${PM3_ROOT}/common/mbedtls/bignum.c + ${PM3_ROOT}/common/mbedtls/asn1parse.c + ${PM3_ROOT}/common/mbedtls/asn1write.c + ${PM3_ROOT}/common/mbedtls/blowfish.c + ${PM3_ROOT}/common/mbedtls/camellia.c + ${PM3_ROOT}/common/mbedtls/certs.c + ${PM3_ROOT}/common/mbedtls/des.c + ${PM3_ROOT}/common/mbedtls/ecdsa.c + ${PM3_ROOT}/common/mbedtls/ecp.c + ${PM3_ROOT}/common/mbedtls/ecp_curves.c + ${PM3_ROOT}/common/mbedtls/entropy.c + ${PM3_ROOT}/common/mbedtls/entropy_poll.c + ${PM3_ROOT}/common/mbedtls/error.c + ${PM3_ROOT}/common/mbedtls/md.c + ${PM3_ROOT}/common/mbedtls/md5.c + ${PM3_ROOT}/common/mbedtls/md_wrap.c + ${PM3_ROOT}/common/mbedtls/sha1.c + ${PM3_ROOT}/common/mbedtls/sha256.c + ${PM3_ROOT}/common/mbedtls/sha512.c + ${PM3_ROOT}/common/mbedtls/timing.c + ${PM3_ROOT}/common/mbedtls/cmac.c + ${PM3_ROOT}/common/mbedtls/oid.c + ${PM3_ROOT}/common/mbedtls/pem.c + ${PM3_ROOT}/common/mbedtls/pk.c + ${PM3_ROOT}/common/mbedtls/pk_wrap.c + ${PM3_ROOT}/common/mbedtls/pkcs5.c + ${PM3_ROOT}/common/mbedtls/pkcs12.c + ${PM3_ROOT}/common/mbedtls/pkparse.c + ${PM3_ROOT}/common/mbedtls/pkwrite.c + ${PM3_ROOT}/common/mbedtls/x509.c + ${PM3_ROOT}/common/mbedtls/x509_crl.c + ${PM3_ROOT}/common/mbedtls/x509_crt.c + ${PM3_ROOT}/common/mbedtls/ctr_drbg.c + ${PM3_ROOT}/common/mbedtls/cipher_wrap.c + ${PM3_ROOT}/common/mbedtls/cipher.c + ${PM3_ROOT}/common/mbedtls/platform_util.c + ${PM3_ROOT}/common//zlib/inflate.c + ${PM3_ROOT}/common/zlib/inffast.c + ${PM3_ROOT}/common/zlib/zutil.c + ${PM3_ROOT}/common/zlib/inftrees.c + ${PM3_ROOT}/common//zlib/adler32.c + # client inside + ${PM3_ROOT}/client/src/fileutils.c + ${PM3_ROOT}/client/src/uart/uart_posix.c + ${PM3_ROOT}/client/src/loclass/cipherutils.c + ${PM3_ROOT}/client/src/loclass/cipher.c + ${PM3_ROOT}/client/src/loclass/ikeys.c + ${PM3_ROOT}/client/src/loclass/elite_crack.c + ${PM3_ROOT}/client/src/emv/emvcore.c + ${PM3_ROOT}/client/src/emv/cmdemv.c + ${PM3_ROOT}/client/src/emv/tlv.c + ${PM3_ROOT}/client/src/emv/dol.c + ${PM3_ROOT}/client/src/emv/emv_tags.c + ${PM3_ROOT}/client/src/emv/emv_roca.c + ${PM3_ROOT}/client/src/emv/dump.c + ${PM3_ROOT}/client/src/emv/crypto_polarssl.c + ${PM3_ROOT}/client/src/emv/crypto.c + ${PM3_ROOT}/client/src/emv/emv_pk.c + ${PM3_ROOT}/client/src/emv/emv_pki.c + ${PM3_ROOT}/client/src/emv/emvjson.c + ${PM3_ROOT}/client/src/emv/apduinfo.c + ${PM3_ROOT}/client/src/emv/test/cryptotest.c + ${PM3_ROOT}/client/src/emv/test/sda_test.c + ${PM3_ROOT}/client/src/emv/test/dda_test.c + ${PM3_ROOT}/client/src/emv/test/cda_test.c + ${PM3_ROOT}/client/src/emv/test/crypto_test.c + ${PM3_ROOT}/client/src/emv/test/cryptotest.c + ${PM3_ROOT}/client/src/emv/test/sda_test.c + ${PM3_ROOT}/client/src/emv/test/dda_test.c + ${PM3_ROOT}/client/src/emv/test/cda_test.c + ${PM3_ROOT}/client/src/emv/test/crypto_test.c + ${PM3_ROOT}/client/src/crypto/libpcrypto.c + ${PM3_ROOT}/client/src/crypto/asn1utils.c + ${PM3_ROOT}/client/src/crypto/asn1dump.c + ${PM3_ROOT}/client/src/mifare/mad.c + ${PM3_ROOT}/client/src/mifare/mfkey.c + ${PM3_ROOT}/client/src/mifare/mifare4.c + ${PM3_ROOT}/client/src/mifare/mifarehost.c + ${PM3_ROOT}/client/src/mifare/ndef.c + ${PM3_ROOT}/client/src/mifare/desfire_crypto.c + ${PM3_ROOT}/client/src/mifare/mifaredefault.c + ${PM3_ROOT}/client/src/fido/cose.c + ${PM3_ROOT}/client/src/fido/fidocore.c + ${PM3_ROOT}/client/src/fido/cbortools.c + ${PM3_ROOT}/client/src/fido/additional_ca.c + ${PM3_ROOT}/client/src/preferences.c + ${PM3_ROOT}/client/src/graph.c + ${PM3_ROOT}/client/src/ui.c + ${PM3_ROOT}/client/src/tea.c + ${PM3_ROOT}/client/src/util.c + ${PM3_ROOT}/client/src/comms.c + ${PM3_ROOT}/client/src/cmdcrc.c + ${PM3_ROOT}/client/src/cmdanalyse.c + ${PM3_ROOT}/client/src/cmddata.c + ${PM3_ROOT}/client/src/cmdtrace.c + ${PM3_ROOT}/client/src/cmdhf.c + ${PM3_ROOT}/client/src/cmdhflto.c + ${PM3_ROOT}/client/src/aidsearch.c + ${PM3_ROOT}/client/src/cmdhf14a.c + ${PM3_ROOT}/client/src/cmdhf14b.c + ${PM3_ROOT}/client/src/cmdwiegand.c + ${PM3_ROOT}/client/src/wiegand_formatutils.c + ${PM3_ROOT}/client/src/wiegand_formats.c + ${PM3_ROOT}/client/src/cmdlfmotorola.c + ${PM3_ROOT}/client/src/cmdlfgallagher.c + ${PM3_ROOT}/client/src/cmdhf15.c + ${PM3_ROOT}/client/src/cmdhfepa.c + ${PM3_ROOT}/client/src/cmdhflegic.c + ${PM3_ROOT}/client/src/cmdhfthinfilm.c + ${PM3_ROOT}/client/src/cmdflashmemspiffs.c + ${PM3_ROOT}/client/src/cmdhffelica.c + ${PM3_ROOT}/client/src/cmdhficlass.c + ${PM3_ROOT}/client/src/cmdhflist.c + ${PM3_ROOT}/client/src/cmdhfmf.c + ${PM3_ROOT}/client/src/cmdhfmfdes.c + ${PM3_ROOT}/client/src/cmdhfmfu.c + ${PM3_ROOT}/client/src/cmdhfmfp.c + ${PM3_ROOT}/client/src/cmdhffido.c + ${PM3_ROOT}/client/src/cmdhftopaz.c + ${PM3_ROOT}/client/src/cmdhw.c + ${PM3_ROOT}/client/src/cmdlf.c + ${PM3_ROOT}/client/src/cmdlfkeri.c + ${PM3_ROOT}/client/src/cmdlffdx.c + ${PM3_ROOT}/client/src/cmdlfio.c + ${PM3_ROOT}/client/src/cmdlfem4x.c + ${PM3_ROOT}/client/src/cmdlfhid.c + ${PM3_ROOT}/client/src/cmdlfnedap.c + ${PM3_ROOT}/client/src/cmdlfguard.c + ${PM3_ROOT}/client/src/cmdlfhitag.c + ${PM3_ROOT}/client/src/cmdlfjablotron.c + ${PM3_ROOT}/client/src/cmdsmartcard.c + ${PM3_ROOT}/client/src/cmdlfti.c + ${PM3_ROOT}/client/src/cmdlfpac.c + ${PM3_ROOT}/client/src/cmdlfnoralsy.c + ${PM3_ROOT}/client/src/cmdlfnexwatch.c + ${PM3_ROOT}/client/src/cmdlfpresco.c + ${PM3_ROOT}/client/src/cmdlfindala.c + ${PM3_ROOT}/client/src/cmdlfviking.c + ${PM3_ROOT}/client/src/cmdlfsecurakey.c + ${PM3_ROOT}/client/src/cmdlfpyramid.c + ${PM3_ROOT}/client/src/cmdlfparadox.c + ${PM3_ROOT}/client/src/cmdlfcotag.c + ${PM3_ROOT}/client/src/cmdlfawid.c + ${PM3_ROOT}/client/src/cmdparser.c + ${PM3_ROOT}/client/src/cmdscript.c + ${PM3_ROOT}/client/src/cmdlfvisa2000.c + ${PM3_ROOT}/client/src/whereami.c + ${PM3_ROOT}/client/src/cmdmain.c + ${PM3_ROOT}/client/src/cmdflashmem.c + ${PM3_ROOT}/client/src/scripting.c + ${PM3_ROOT}/client/src/pm3_binlib.c + ${PM3_ROOT}/client/src/pm3_bitlib.c + ${PM3_ROOT}/client/src/cmdlft55xx.c + ${PM3_ROOT}/client/src/cmdlfpcf7931.c + ${PM3_ROOT}/client/src/cmdhfmfhard.c + ${PM3_ROOT}/client/src/cmdusart.c + # deps ouside + ${PM3_ROOT}/client/deps/jansson/utf.c + ${PM3_ROOT}/client/deps/jansson/dump.c + ${PM3_ROOT}/client/deps/jansson/path.c + ${PM3_ROOT}/client/deps/jansson/load.c + ${PM3_ROOT}/client/deps/jansson/error.c + ${PM3_ROOT}/client/deps/jansson/value.c + ${PM3_ROOT}/client/deps/jansson/memory.c + ${PM3_ROOT}/client/deps/jansson/pack_unpack.c + ${PM3_ROOT}/client/deps/jansson/hashtable_seed.c + ${PM3_ROOT}/client/deps/jansson/strbuffer.c + ${PM3_ROOT}/client/deps/jansson/strconv.c + ${PM3_ROOT}/client/deps/jansson/hashtable.c + ${PM3_ROOT}/client/deps/jansson/hashtable.c + # cliparser + ${PM3_ROOT}/client/deps/cliparser/cliparser.c + ${PM3_ROOT}/client/deps/cliparser/argtable3.c + # tinycbor + ${PM3_ROOT}/client/deps/tinycbor/cborencoder.c + ${PM3_ROOT}/client/deps/tinycbor/cborencoder_close_container_checked.c + ${PM3_ROOT}/client/deps/tinycbor/cborerrorstrings.c + ${PM3_ROOT}/client/deps/tinycbor/cborparser.c + ${PM3_ROOT}/client/deps/tinycbor/cborparser_dup_string.c + ${PM3_ROOT}/client/deps/tinycbor/cborpretty.c + ${PM3_ROOT}/client/deps/tinycbor/cborpretty_stdio.c + ${PM3_ROOT}/client/deps/tinycbor/cbortojson.c + ${PM3_ROOT}/client/deps/tinycbor/cborvalidation.c + ${PM3_ROOT}/client/deps/tinycbor/open_memstream.c + # reveng + ${PM3_ROOT}/client/deps/reveng/cli.c + ${PM3_ROOT}/client/deps/reveng/bmpbit.c + ${PM3_ROOT}/client/deps/reveng/preset.c + ${PM3_ROOT}/client/deps/reveng/model.c + ${PM3_ROOT}/client/deps/reveng/poly.c + ${PM3_ROOT}/client/deps/reveng/reveng.c + # liblua + ${PM3_ROOT}/client/deps/liblua/lapi.c + ${PM3_ROOT}/client/deps/liblua/ldo.c + ${PM3_ROOT}/client/deps/liblua/lgc.c + ${PM3_ROOT}/client/deps/liblua/ltm.c + ${PM3_ROOT}/client/deps/liblua/lvm.c + ${PM3_ROOT}/client/deps/liblua/lzio.c + ${PM3_ROOT}/client/deps/liblua/lcode.c + ${PM3_ROOT}/client/deps/liblua/llex.c + ${PM3_ROOT}/client/deps/liblua/liolib.c + ${PM3_ROOT}/client/deps/liblua/loslib.c + ${PM3_ROOT}/client/deps/liblua/lopcodes.c + ${PM3_ROOT}/client/deps/liblua/lmem.c + ${PM3_ROOT}/client/deps/liblua/lmathlib.c + ${PM3_ROOT}/client/deps/liblua/ldump.c + ${PM3_ROOT}/client/deps/liblua/ldblib.c + ${PM3_ROOT}/client/deps/liblua/lundump.c + ${PM3_ROOT}/client/deps/liblua/lcorolib.c + ${PM3_ROOT}/client/deps/liblua/lauxlib.c + ${PM3_ROOT}/client/deps/liblua/ltablib.c + ${PM3_ROOT}/client/deps/liblua/linit.c + ${PM3_ROOT}/client/deps/liblua/lstring.c + ${PM3_ROOT}/client/deps/liblua/lctype.c + ${PM3_ROOT}/client/deps/liblua/ltable.c + ${PM3_ROOT}/client/deps/liblua/ldebug.c + ${PM3_ROOT}/client/deps/liblua/lstate.c + ${PM3_ROOT}/client/deps/liblua/lstrlib.c + ${PM3_ROOT}/client/deps/liblua/lfunc.c + ${PM3_ROOT}/client/deps/liblua/lparser.c + ${PM3_ROOT}/client/deps/liblua/lobject.c + ${PM3_ROOT}/client/deps/liblua/loadlib.c + ${PM3_ROOT}/client/deps/liblua/lbaselib.c + ${PM3_ROOT}/client/deps/liblua/lbitlib.c + ${PM3_ROOT}/client/deps/hardnested/hardnested_bruteforce.c + # android source + jni_tools.c + pm3_main.c + ) + +#添加头文件配置 +target_include_directories(pm3rrg_rdv4 PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${PM3_ROOT}/ + ${PM3_ROOT}/include/ + ${PM3_ROOT}/common + ${PM3_ROOT}/common/zlib + ${PM3_ROOT}/common_fpga + ${PM3_ROOT}/common/mbedtls + ${PM3_ROOT}/client/src + ${PM3_ROOT}/client/src/fido + ${PM3_ROOT}/client/src/uart + ${PM3_ROOT}/client/deps/liblua + ${PM3_ROOT}/client/deps/reveng + ${PM3_ROOT}/client/deps/jansson + ${PM3_ROOT}/client/deps/tinycbor + ${PM3_ROOT}/client/deps/cliparser + ${PM3_ROOT}/client/deps/hardnested) + +## CPU-specific code +## These are mostly for x86-based architectures, which is not useful for many Android devices. +add_library(pm3rrg_rdv4_hardnested_nosimd OBJECT + ${PM3_ROOT}/client/deps/hardnested/hardnested_bf_core.c + ${PM3_ROOT}/client/deps/hardnested/hardnested_bitarray_core.c) + +target_include_directories(pm3rrg_rdv4_hardnested_nosimd PRIVATE + ${PM3_ROOT}/common + ${PM3_ROOT}/client + ${PM3_ROOT}/include/ + ${PM3_ROOT}/client/deps/hardnested) + +set(X86_CPUS x86 x86_64 i686) + +message(STATUS "CMAKE_SYSTEM_PROCESSOR := ${CMAKE_SYSTEM_PROCESSOR}") + +if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) + message(STATUS "Building optimised x86/x86_64 binaries") + target_compile_options(pm3rrg_rdv4_hardnested_nosimd BEFORE PRIVATE + -mno-mmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f) + + set_property(TARGET pm3rrg_rdv4_hardnested_nosimd PROPERTY POSITION_INDEPENDENT_CODE ON) + + ## x86 / MMX + add_library(pm3rrg_rdv4_hardnested_mmx OBJECT + ${PM3_ROOT}/client/deps/hardnested/hardnested_bf_core.c + ${PM3_ROOT}/client/deps/hardnested/hardnested_bitarray_core.c) + + target_compile_options(pm3rrg_rdv4_hardnested_mmx BEFORE PRIVATE + -mmmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f) + + target_include_directories(pm3rrg_rdv4_hardnested_mmx PRIVATE + ${PM3_ROOT}/common + ${PM3_ROOT}/client + ${PM3_ROOT}/include/ + ${PM3_ROOT}/client/deps/hardnested) + + set_property(TARGET pm3rrg_rdv4_hardnested_mmx PROPERTY POSITION_INDEPENDENT_CODE ON) + + ## x86 / SSE2 + add_library(pm3rrg_rdv4_hardnested_sse2 OBJECT + ${PM3_ROOT}/client/deps/hardnested/hardnested_bf_core.c + ${PM3_ROOT}/client/deps/hardnested/hardnested_bitarray_core.c) + + target_compile_options(pm3rrg_rdv4_hardnested_sse2 BEFORE PRIVATE + -mmmx -msse2 -mno-avx -mno-avx2 -mno-avx512f) + + target_include_directories(pm3rrg_rdv4_hardnested_sse2 PRIVATE + ${PM3_ROOT}/common + ${PM3_ROOT}/client + ${PM3_ROOT}/include/ + ${PM3_ROOT}/client/deps/hardnested) + + set_property(TARGET pm3rrg_rdv4_hardnested_sse2 PROPERTY POSITION_INDEPENDENT_CODE ON) + + ## x86 / AVX + add_library(pm3rrg_rdv4_hardnested_avx OBJECT + ${PM3_ROOT}/client/deps/hardnested/hardnested_bf_core.c + ${PM3_ROOT}/client/deps/hardnested/hardnested_bitarray_core.c) + + target_compile_options(pm3rrg_rdv4_hardnested_avx BEFORE PRIVATE + -mmmx -msse2 -mavx -mno-avx2 -mno-avx512f) + + target_include_directories(pm3rrg_rdv4_hardnested_avx PRIVATE + ${PM3_ROOT}/common + ${PM3_ROOT}/client + ${PM3_ROOT}/include/ + ${PM3_ROOT}/client/deps/hardnested) + + set_property(TARGET pm3rrg_rdv4_hardnested_avx PROPERTY POSITION_INDEPENDENT_CODE ON) + + ## x86 / AVX2 + add_library(pm3rrg_rdv4_hardnested_avx2 OBJECT + ${PM3_ROOT}/client/deps/hardnested/hardnested_bf_core.c + ${PM3_ROOT}/client/deps/hardnested/hardnested_bitarray_core.c) + + target_compile_options(pm3rrg_rdv4_hardnested_avx2 BEFORE PRIVATE + -mmmx -msse2 -mavx -mavx2 -mno-avx512f) + + target_include_directories(pm3rrg_rdv4_hardnested_avx2 PRIVATE + ${PM3_ROOT}/common + ${PM3_ROOT}/client + ${PM3_ROOT}/include/ + ${PM3_ROOT}/client/deps/hardnested) + + set_property(TARGET pm3rrg_rdv4_hardnested_avx2 PROPERTY POSITION_INDEPENDENT_CODE ON) + + ## x86 / AVX512 + add_library(pm3rrg_rdv4_hardnested_avx512 OBJECT + ${PM3_ROOT}/client/deps/hardnested/hardnested_bf_core.c + ${PM3_ROOT}/client/deps/hardnested/hardnested_bitarray_core.c) + + target_compile_options(pm3rrg_rdv4_hardnested_avx512 BEFORE PRIVATE + -mmmx -msse2 -mavx -mavx2 -mavx512f) + + target_include_directories(pm3rrg_rdv4_hardnested_avx512 PRIVATE + ${PM3_ROOT}/common + ${PM3_ROOT}/client + ${PM3_ROOT}/include/ + ${PM3_ROOT}/client/deps/hardnested) + + set_property(TARGET pm3rrg_rdv4_hardnested_avx512 PROPERTY POSITION_INDEPENDENT_CODE ON) + + set(SIMD_TARGETS + $ + $ + $ + $ + $) +else () + message(STATUS "Not building optimised targets") + set(SIMD_TARGETS) +endif () + +#定义为静态库,被最终的pm3库依赖! +add_library(pm3rrg_rdv4_hardnested STATIC + $ + ${SIMD_TARGETS}) + +#添加动态库链接! +target_link_libraries(pm3rrg_rdv4 pm3rrg_rdv4_hardnested android log z) \ No newline at end of file diff --git a/client/android/jni_tools.c b/client/android/jni_tools.c new file mode 100644 index 000000000..74e05051c --- /dev/null +++ b/client/android/jni_tools.c @@ -0,0 +1,97 @@ +// +// Created by DXL on 2017/9/1. +// + +//including header +#include +#include +#include "stdbool.h" + +//当前线程是否添加的标志位 +static bool g_IsAttach; + +//TODO 环境变量获取函数 +JNIEnv *getJniEnv() { + JNIEnv *currentThreadEnv; + g_IsAttach = false; + if ((*g_JavaVM)->GetEnv(g_JavaVM, (void **) ¤tThreadEnv, JNI_VERSION_1_4) != JNI_OK) { + LOGE("Get Env Fail!"); + if ((*g_JavaVM)->AttachCurrentThread(g_JavaVM, ¤tThreadEnv, NULL) != JNI_OK) { + LOGE("Attach the current thread Fail!"); + g_IsAttach = false; + return NULL; + } else { + g_IsAttach = true; + LOGE("Attach the current thread Success!"); + return currentThreadEnv; + } + } else { + g_IsAttach = false; + //LOGE("Get Env Success!"); + return currentThreadEnv; + } +} + +//解绑线程env +void deatchThread() { + if (g_IsAttach) { + LOGD("线程解绑成功!"); + (*g_JavaVM)->DetachCurrentThread(g_JavaVM); + } +} + +//TODO 命令行解析 +CMD *parse_command_line(const char *commandStr) { + //一个指针,指向传进来的命令字符串(const修饰的,我们需要复刻一份!) + CMD *cmd = (CMD *) malloc(sizeof(CMD)); + if (!cmd) { + LOGD("申请空间失败!"); + return NULL; + } + //拷贝字符串到堆空间! + char *pTmp = strdup(commandStr); + LOGD("拷贝参数字符串到临时堆!"); + //返回的结果!先初始化为20个空间 + int size = 20; + cmd->cmd = (char **) malloc(size * sizeof(char **)); + if (cmd->cmd) { + LOGD("申请参数空间成功!"); + } else { + LOGD("申请空间失败!"); + } + //进行截取 + char *pStr = strtok(pTmp, " "); + LOGD("第0次截取完成: %s", pStr); + //给结果数组进行下标为0的第一次初始化 + cmd->cmd[0] = pStr; + //局部变量用于储存解析到的命令个数,下标移动为一 + int count = 1; + //需要截取命令参数,以空格为限定符 + for (; pStr != NULL; ++count) { + //如果容量不够,则扩容! + if (count == (size - 1)) { + size += 20; + cmd->cmd = (char **) realloc(cmd->cmd, size * sizeof(char **)); + LOGD("超过初始容量,自动扩容!"); + } + pStr = strtok(NULL, " "); + if (pStr) { + cmd->cmd[count] = pStr; + LOGD("第%d次截取完成: %s", count, pStr); + } + } + cmd->len = (count - 1); + LOGD("解析函数执行完成!"); + return cmd; +} + +//内存释放 +void free_command_line(CMD *cmd) { + //二级指针需要逐层释放! + LOGD("释放命令行字符串二级引用!"); + free(cmd->cmd[0]); + LOGD("释放命令行一级引用!"); + free(cmd->cmd); + LOGD("释放结构体内存"); + free(cmd); +} \ No newline at end of file diff --git a/client/android/jni_tools.h b/client/android/jni_tools.h new file mode 100644 index 000000000..121cf043f --- /dev/null +++ b/client/android/jni_tools.h @@ -0,0 +1,40 @@ +// +// Created by dell on 2017/9/1. +// + +#ifndef DXL_TOOLS_H +#define DXL_TOOLS_H + +#include +#include +#include + +//JNI LOG +#define TAG "DXL BlUESPP_PN532" +#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE,TAG,__VA_ARGS__) +#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__) +#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG,__VA_ARGS__) +#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,TAG,__VA_ARGS__) +#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG,__VA_ARGS__) + +//全局的环境变量定义 +JavaVM *g_JavaVM; + +//线程环境指针获取函数 +JNIEnv *getJniEnv(); + +//子线程释放函数,必须是native层创建的线程才可以调用 +void deatchThread(); + +typedef struct { + char **cmd; + int len; +} CMD; + +//命令行解析函数 +CMD *parse_command_line(const char *commandStr); + +//解析结果释放函数! +void free_command_line(CMD *); + +#endif //DXL_TOOLS_H \ No newline at end of file diff --git a/client/android/pm3_main.c b/client/android/pm3_main.c new file mode 100644 index 000000000..d9c2386c8 --- /dev/null +++ b/client/android/pm3_main.c @@ -0,0 +1,175 @@ +//----------------------------------------------------------------------------- +// Copyright (C) 2009 Michael Gernoth +// Copyright (C) 2010 iZsh +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// Main binary +//----------------------------------------------------------------------------- + +#include "proxmark3.h" + +#include +#include // for Mingw readline +#include +#include +#include +#include "usart_defs.h" +#include "util_posix.h" +#include "proxgui.h" +#include "cmdmain.h" +#include "ui.h" +#include "cmdhw.h" +#include "whereami.h" +#include "comms.h" +#include "fileutils.h" +#include "jni_tools.h" + +#define LOCAL_SOCKET_SERVER_NAME "DXL.COM.ASL" + +void ShowGraphWindow() { + +} + +void HideGraphWindow(void) { + +} + +void RepaintGraphWindow() { + +} + +int push_cmdscriptfile(char *path, bool stayafter) { + return PM3_SUCCESS; +} + +static char *my_executable_path = NULL; +static char *my_executable_directory = NULL; + +const char *get_my_executable_path(void) { + return my_executable_path; +} + +const char *get_my_executable_directory(void) { + return my_executable_directory; +} + +static void set_my_executable_path(void) { + +} + +static const char *my_user_directory = NULL; + +const char *get_my_user_directory(void) { + return my_user_directory; +} + +static void set_my_user_directory(void) { +} + +static bool open() { + if (conn.run) { + return true; + } + // Open with LocalSocket(Not a tcp connection!) + bool ret = OpenProxmark("socket:"LOCAL_SOCKET_SERVER_NAME, false, 1000, false, 115200); + return ret; +} + +/* + * 发送一条命令等待执行! + * */ +jint sendCMD(JNIEnv *env, jobject instance, jstring cmd_) { + //may be pm3 not running. + if (!conn.run) { + if (open() && TestProxmark() == PM3_SUCCESS) { + LOGD("Open Successfully!"); + PrintAndLogEx(NORMAL, "Open Successfully!"); + } else { + LOGD("Open failed!"); + PrintAndLogEx(NORMAL, "Open failed!"); + CloseProxmark(); + } + } + //无论如何,新的命令的输入了,就要换个行! + PrintAndLogEx(NORMAL, "\n"); + char *cmd = (char *) ((*env)->GetStringUTFChars(env, cmd_, 0)); + // Many parts of the PM3 client will assume that they can read any write from pwd. So we set + // pwd to whatever the PM3 "executable directory" is, to get consistent behaviour. + /*int ret = chdir(get_my_executable_directory()); + if (ret == -1) { + LOGW("Couldn't chdir(get_my_executable_directory()), errno=%s", strerror(errno)); + } + char pwd[1024]; + memset((void *) &pwd, 0, sizeof(pwd)); + getcwd((char *) &pwd, sizeof(pwd)); + LOGI("pwd = %s", pwd);*/ + int ret = CommandReceived(cmd); + if (ret == 99) { + // exit / quit + // TODO: implement this + PrintAndLogEx(NORMAL, "Asked to exit, can't really do that yet..."); + } + (*env)->ReleaseStringUTFChars(env, cmd_, cmd); + return ret; +} + +/* + * 是否在执行命令 + * */ +jboolean isExecuting(JNIEnv *env, jobject instance) { + return (jboolean) ((jboolean) conn.run); +} + +/* + * 进行设备链接验证! + * */ +jboolean testPm3(JNIEnv *env, jobject instance) { + bool ret1 = open(); + if (!ret1) { + CloseProxmark(); + return false; + } + bool ret2 = TestProxmark() == PM3_SUCCESS; + return (jboolean) (ret1 && ret2); +} + +void stopPm3(JNIEnv *env, jobject instance) { + CloseProxmark(); +} + +JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { + JNIEnv *jniEnv = NULL; + if ((*vm)->GetEnv(vm, (void **) &jniEnv, JNI_VERSION_1_4) != JNI_OK) { + return -1; + } + (*jniEnv)->GetJavaVM(jniEnv, &g_JavaVM); + jclass clazz = (*jniEnv)->FindClass(jniEnv, "cn/rrg/natives/Proxmark3RRGRdv4Tools"); + if (clazz == NULL) { + return -1; + } + jclass clz_test = (*jniEnv)->FindClass(jniEnv, "cn/rrg/devices/Proxmark3RRGRdv4"); + JNINativeMethod methods[] = { + {"startExecute", "(Ljava/lang/String;)I", (void *) sendCMD}, + {"stopExecute", "()V", (void *) stopPm3}, + {"isExecuting", "()Z", (void *) isExecuting} + }; + JNINativeMethod methods1[] = { + {"testPm3", "()Z", (void *) testPm3}, + {"closePm3", "()V", stopPm3} + }; + if ((*jniEnv)->RegisterNatives(jniEnv, clazz, methods, sizeof(methods) / sizeof(methods[0])) != + JNI_OK) { + return -1; + } + if ((*jniEnv)->RegisterNatives(jniEnv, clz_test, methods1, + sizeof(methods1) / sizeof(methods1[0])) != + JNI_OK) { + return -1; + } + (*jniEnv)->DeleteLocalRef(jniEnv, clazz); + (*jniEnv)->DeleteLocalRef(jniEnv, clz_test); + return JNI_VERSION_1_4; +} From 4b41e36d4951252149f67bbe6145163b7f8137c2 Mon Sep 17 00:00:00 2001 From: dxl <64101226@qq.com> Date: Wed, 6 May 2020 12:48:46 +0200 Subject: [PATCH 081/632] Android platform adaptation(dxl) --- client/src/cmdhflegic.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/client/src/cmdhflegic.c b/client/src/cmdhflegic.c index fabe926fa..28138f0ea 100644 --- a/client/src/cmdhflegic.c +++ b/client/src/cmdhflegic.c @@ -11,7 +11,10 @@ #include // for Mingw readline #include // tolower + +#ifndef ANDROID #include +#endif #include "cmdparser.h" // command_t #include "comms.h" // clearCommandBuffer @@ -694,12 +697,19 @@ static int CmdLegicWrbl(const char *Cmd) { PrintAndLogEx(NORMAL, "############# DANGER ################"); PrintAndLogEx(NORMAL, "# changing the DCF is irreversible #"); PrintAndLogEx(NORMAL, "#####################################"); + +#ifndef ANDROID char *answer = readline("do you really want to continue? y(es) n(o) : "); bool overwrite = (answer[0] == 'y' || answer[0] == 'Y'); if (!overwrite) { PrintAndLogEx(NORMAL, "command cancelled"); return PM3_EOPABORTED; } +#else + PrintAndLogEx(NORMAL, "\n No interactive support on Android. "); + PrintAndLogEx(NORMAL, " So no confirmation asked, beware! "); +#endif + } legic_chk_iv(&IV); From eafeb4712655182434a6b0e831f0a8c0b2489ed5 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 6 May 2020 13:38:51 +0200 Subject: [PATCH 082/632] make style --- client/android/jni_tools.c | 2 +- client/android/jni_tools.h | 2 +- client/android/pm3_main.c | 20 ++++++++++---------- client/src/cmdhfmfp.c | 4 ++-- client/src/uart/uart_posix.c | 2 +- common/crc32.c | 2 +- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/client/android/jni_tools.c b/client/android/jni_tools.c index 74e05051c..1a5fc9592 100644 --- a/client/android/jni_tools.c +++ b/client/android/jni_tools.c @@ -94,4 +94,4 @@ void free_command_line(CMD *cmd) { free(cmd->cmd); LOGD("释放结构体内存"); free(cmd); -} \ No newline at end of file +} diff --git a/client/android/jni_tools.h b/client/android/jni_tools.h index 121cf043f..3d76184b9 100644 --- a/client/android/jni_tools.h +++ b/client/android/jni_tools.h @@ -37,4 +37,4 @@ CMD *parse_command_line(const char *commandStr); //解析结果释放函数! void free_command_line(CMD *); -#endif //DXL_TOOLS_H \ No newline at end of file +#endif //DXL_TOOLS_H diff --git a/client/android/pm3_main.c b/client/android/pm3_main.c index d9c2386c8..87c6bbd44 100644 --- a/client/android/pm3_main.c +++ b/client/android/pm3_main.c @@ -95,7 +95,7 @@ jint sendCMD(JNIEnv *env, jobject instance, jstring cmd_) { } //无论如何,新的命令的输入了,就要换个行! PrintAndLogEx(NORMAL, "\n"); - char *cmd = (char *) ((*env)->GetStringUTFChars(env, cmd_, 0)); + char *cmd = (char *)((*env)->GetStringUTFChars(env, cmd_, 0)); // Many parts of the PM3 client will assume that they can read any write from pwd. So we set // pwd to whatever the PM3 "executable directory" is, to get consistent behaviour. /*int ret = chdir(get_my_executable_directory()); @@ -120,7 +120,7 @@ jint sendCMD(JNIEnv *env, jobject instance, jstring cmd_) { * 是否在执行命令 * */ jboolean isExecuting(JNIEnv *env, jobject instance) { - return (jboolean) ((jboolean) conn.run); + return (jboolean)((jboolean) conn.run); } /* @@ -133,7 +133,7 @@ jboolean testPm3(JNIEnv *env, jobject instance) { return false; } bool ret2 = TestProxmark() == PM3_SUCCESS; - return (jboolean) (ret1 && ret2); + return (jboolean)(ret1 && ret2); } void stopPm3(JNIEnv *env, jobject instance) { @@ -152,21 +152,21 @@ JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { } jclass clz_test = (*jniEnv)->FindClass(jniEnv, "cn/rrg/devices/Proxmark3RRGRdv4"); JNINativeMethod methods[] = { - {"startExecute", "(Ljava/lang/String;)I", (void *) sendCMD}, - {"stopExecute", "()V", (void *) stopPm3}, - {"isExecuting", "()Z", (void *) isExecuting} + {"startExecute", "(Ljava/lang/String;)I", (void *) sendCMD}, + {"stopExecute", "()V", (void *) stopPm3}, + {"isExecuting", "()Z", (void *) isExecuting} }; JNINativeMethod methods1[] = { - {"testPm3", "()Z", (void *) testPm3}, - {"closePm3", "()V", stopPm3} + {"testPm3", "()Z", (void *) testPm3}, + {"closePm3", "()V", stopPm3} }; if ((*jniEnv)->RegisterNatives(jniEnv, clazz, methods, sizeof(methods) / sizeof(methods[0])) != - JNI_OK) { + JNI_OK) { return -1; } if ((*jniEnv)->RegisterNatives(jniEnv, clz_test, methods1, sizeof(methods1) / sizeof(methods1[0])) != - JNI_OK) { + JNI_OK) { return -1; } (*jniEnv)->DeleteLocalRef(jniEnv, clazz); diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index f9d2e661a..bc6854b26 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -950,8 +950,8 @@ static int CmdHFMFPWrbl(const char *Cmd) { #define MAX_KEYS_LIST_LEN 1024 static int MFPKeyCheck(uint8_t startSector, uint8_t endSector, uint8_t startKeyAB, uint8_t endKeyAB, - uint8_t keyList[MAX_KEYS_LIST_LEN][AES_KEY_LEN], size_t keyListLen, uint8_t foundKeys[2][64][AES_KEY_LEN + 1], - bool verbose) { + uint8_t keyList[MAX_KEYS_LIST_LEN][AES_KEY_LEN], size_t keyListLen, uint8_t foundKeys[2][64][AES_KEY_LEN + 1], + bool verbose) { int res; bool selectCard = true; uint8_t keyn[2] = {0}; diff --git a/client/src/uart/uart_posix.c b/client/src/uart/uart_posix.c index 076c02ddf..a846b0d78 100644 --- a/client/src/uart/uart_posix.c +++ b/client/src/uart/uart_posix.c @@ -184,7 +184,7 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { } if (memcmp(prefix, "bt:", 3) == 0) { - free(prefix); + free(prefix); #ifdef HAVE_BLUEZ if (strlen(pcPortName) != 20) { diff --git a/common/crc32.c b/common/crc32.c index b539baa05..baf6ddd28 100644 --- a/common/crc32.c +++ b/common/crc32.c @@ -24,7 +24,7 @@ void crc32_ex(const uint8_t *data, const size_t len, uint8_t *crc) { crc32_byte(&desfire_crc, data[i]); } uint32_t crctmp = htole32(desfire_crc); - for (size_t i=0; i < sizeof(uint32_t); i++) { + for (size_t i = 0; i < sizeof(uint32_t); i++) { crc[i] = ((uint8_t *) &crctmp)[i]; } } From 9478dbc07160c47a8e51eb72d6a37d062114cd30 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 6 May 2020 14:39:08 +0200 Subject: [PATCH 083/632] cmake deps: add -fPIC so they can be integrated in a pm3 shared lib --- client/deps/amiibo.cmake | 1 + client/deps/cliparser.cmake | 1 + client/deps/hardnested.cmake | 7 +++++++ client/deps/jansson.cmake | 1 + client/deps/lua.cmake | 1 + client/deps/mbedtls.cmake | 1 + client/deps/reveng.cmake | 1 + client/deps/tinycbor.cmake | 1 + client/deps/zlib.cmake | 1 + 9 files changed, 15 insertions(+) diff --git a/client/deps/amiibo.cmake b/client/deps/amiibo.cmake index 857074f9e..33ca39f38 100644 --- a/client/deps/amiibo.cmake +++ b/client/deps/amiibo.cmake @@ -14,3 +14,4 @@ add_library(amiibo STATIC target_include_directories(amiibo PRIVATE ../../include ../../common) target_include_directories(amiibo INTERFACE amiitool) target_compile_options(amiibo PRIVATE -Wall -Werror -O3) +set_property(TARGET amiibo PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/cliparser.cmake b/client/deps/cliparser.cmake index 890fd39c5..ca3e0bf6d 100644 --- a/client/deps/cliparser.cmake +++ b/client/deps/cliparser.cmake @@ -9,3 +9,4 @@ target_include_directories(cliparser PRIVATE ../src) target_include_directories(cliparser INTERFACE cliparser) target_compile_options(cliparser PRIVATE -Wall -Werror -O3) +set_property(TARGET cliparser PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/hardnested.cmake b/client/deps/hardnested.cmake index 8945d68a8..5dbca2dbd 100644 --- a/client/deps/hardnested.cmake +++ b/client/deps/hardnested.cmake @@ -3,6 +3,7 @@ add_library(hardnested_nosimd OBJECT hardnested/hardnested_bitarray_core.c) target_compile_options(hardnested_nosimd PRIVATE -Wall -Werror -O3) +set_property(TARGET hardnested_nosimd PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(hardnested_nosimd PRIVATE ../../common @@ -29,6 +30,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) target_compile_options(hardnested_mmx PRIVATE -Wall -Werror -O3) target_compile_options(hardnested_mmx BEFORE PRIVATE -mmmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f) + set_property(TARGET hardnested_mmx PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(hardnested_mmx PRIVATE ../../common @@ -42,6 +44,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) target_compile_options(hardnested_sse2 PRIVATE -Wall -Werror -O3) target_compile_options(hardnested_sse2 BEFORE PRIVATE -mmmx -msse2 -mno-avx -mno-avx2 -mno-avx512f) + set_property(TARGET hardnested_sse2 PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(hardnested_sse2 PRIVATE ../../common @@ -55,6 +58,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) target_compile_options(hardnested_avx PRIVATE -Wall -Werror -O3) target_compile_options(hardnested_avx BEFORE PRIVATE -mmmx -msse2 -mavx -mno-avx2 -mno-avx512f) + set_property(TARGET hardnested_avx PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(hardnested_avx PRIVATE ../../common @@ -68,6 +72,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) target_compile_options(hardnested_avx2 PRIVATE -Wall -Werror -O3) target_compile_options(hardnested_avx2 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mno-avx512f) + set_property(TARGET hardnested_avx2 PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(hardnested_avx2 PRIVATE ../../common @@ -81,6 +86,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) target_compile_options(hardnested_avx512 PRIVATE -Wall -Werror -O3) target_compile_options(hardnested_avx512 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mavx512f) + set_property(TARGET hardnested_avx512 PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(hardnested_avx512 PRIVATE ../../common @@ -101,6 +107,7 @@ add_library(hardnested STATIC hardnested/hardnested_bruteforce.c $ ${SIMD_TARGETS}) +set_property(TARGET hardnested PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(hardnested PRIVATE ../../common ../../include diff --git a/client/deps/jansson.cmake b/client/deps/jansson.cmake index 216f7a830..d3054b158 100644 --- a/client/deps/jansson.cmake +++ b/client/deps/jansson.cmake @@ -16,3 +16,4 @@ add_library(jansson STATIC target_compile_definitions(jansson PRIVATE HAVE_STDINT_H) target_include_directories(jansson INTERFACE jansson) target_compile_options(jansson PRIVATE -Wall -Werror -Wno-unused-function -O3) +set_property(TARGET jansson PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/lua.cmake b/client/deps/lua.cmake index 3850863b5..b5267c561 100644 --- a/client/deps/lua.cmake +++ b/client/deps/lua.cmake @@ -46,3 +46,4 @@ endif (NOT MINGW) target_include_directories(lua INTERFACE liblua) target_compile_options(lua PRIVATE -Wall -Werror -O3) +set_property(TARGET lua PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/mbedtls.cmake b/client/deps/mbedtls.cmake index 932c1757c..5f6cff8b5 100644 --- a/client/deps/mbedtls.cmake +++ b/client/deps/mbedtls.cmake @@ -46,3 +46,4 @@ add_library(mbedtls STATIC target_include_directories(mbedtls PRIVATE ../../common) target_compile_options(mbedtls PRIVATE -Wall -Werror -O3) +set_property(TARGET mbedtls PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/reveng.cmake b/client/deps/reveng.cmake index 0d24c9d49..c32de008a 100644 --- a/client/deps/reveng.cmake +++ b/client/deps/reveng.cmake @@ -11,3 +11,4 @@ target_compile_definitions(reveng PRIVATE PRESETS) target_include_directories(reveng PRIVATE ../cliparser) target_include_directories(reveng INTERFACE reveng) target_compile_options(reveng PRIVATE -Wall -Werror -O3) +set_property(TARGET reveng PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/tinycbor.cmake b/client/deps/tinycbor.cmake index 14ebb5326..d7a51672d 100644 --- a/client/deps/tinycbor.cmake +++ b/client/deps/tinycbor.cmake @@ -12,3 +12,4 @@ add_library(tinycbor STATIC target_include_directories(tinycbor INTERFACE tinycbor) # Strange errors on Mingw when compiling with -O3 target_compile_options(tinycbor PRIVATE -Wall -Werror -O2) +set_property(TARGET tinycbor PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/zlib.cmake b/client/deps/zlib.cmake index dc6044f80..fabfc218a 100644 --- a/client/deps/zlib.cmake +++ b/client/deps/zlib.cmake @@ -10,3 +10,4 @@ add_library(z STATIC target_compile_definitions(z PRIVATE Z_SOLO NO_GZIP ZLIB_PM3_TUNED) target_compile_options(z PRIVATE -Wall -Werror -O3) +set_property(TARGET z PROPERTY POSITION_INDEPENDENT_CODE ON) From 53af4304c163fabfb770c8b5a1e00ff97ab66de7 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 6 May 2020 14:45:02 +0200 Subject: [PATCH 084/632] cmake deps: add prefix pm3rrg_rdv4_ --- client/CMakeLists.txt | 18 ++++---- client/deps/amiibo.cmake | 10 ++--- client/deps/cliparser.cmake | 10 ++--- client/deps/hardnested.cmake | 80 ++++++++++++++++++------------------ client/deps/jansson.cmake | 10 ++--- client/deps/lua.cmake | 16 ++++---- client/deps/mbedtls.cmake | 8 ++-- client/deps/reveng.cmake | 12 +++--- client/deps/tinycbor.cmake | 8 ++-- client/deps/zlib.cmake | 8 ++-- 10 files changed, 90 insertions(+), 90 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 921e0d04b..7b17c1e36 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -252,16 +252,16 @@ else (APPLE) endif (APPLE) -find_library(cliparser REQUIRED) -find_library(jansson REQUIRED) -find_library(tinycbor REQUIRED) -find_library(lua REQUIRED) -find_library(mbedtls REQUIRED) -find_library(reveng REQUIRED) -find_library(z REQUIRED) -find_library(hardnested REQUIRED) +find_library(pm3rrg_rdv4_cliparser REQUIRED) +find_library(pm3rrg_rdv4_jansson REQUIRED) +find_library(pm3rrg_rdv4_tinycbor REQUIRED) +find_library(pm3rrg_rdv4_lua REQUIRED) +find_library(pm3rrg_rdv4_mbedtls REQUIRED) +find_library(pm3rrg_rdv4_reveng REQUIRED) +find_library(pm3rrg_rdv4_z REQUIRED) +find_library(pm3rrg_rdv4_hardnested REQUIRED) -target_link_libraries(proxmark3 PRIVATE readline pthread m mbedtls cliparser jansson lua tinycbor amiibo reveng z hardnested ${ADDITIONAL_LNK}) +target_link_libraries(proxmark3 PRIVATE readline pthread m pm3rrg_rdv4_mbedtls pm3rrg_rdv4_cliparser pm3rrg_rdv4_jansson pm3rrg_rdv4_lua pm3rrg_rdv4_tinycbor pm3rrg_rdv4_amiibo pm3rrg_rdv4_reveng pm3rrg_rdv4_z pm3rrg_rdv4_hardnested ${ADDITIONAL_LNK}) install(TARGETS proxmark3 DESTINATION "bin") install(DIRECTORY cmdscripts lualibs luascripts resources dictionaries DESTINATION "share/proxmark3") diff --git a/client/deps/amiibo.cmake b/client/deps/amiibo.cmake index 33ca39f38..34780f597 100644 --- a/client/deps/amiibo.cmake +++ b/client/deps/amiibo.cmake @@ -5,13 +5,13 @@ #amiitool.c $(MYSRCS) ../../../../common/../../commonutil.c ../ui.c -lreadline -lm ../../../../common/mbedtls/libmbedtls.a \ #-o amiitool -add_library(amiibo STATIC +add_library(pm3rrg_rdv4_amiibo STATIC amiitool/amiibo.c amiitool/drbg.c amiitool/keygen.c ) -target_include_directories(amiibo PRIVATE ../../include ../../common) -target_include_directories(amiibo INTERFACE amiitool) -target_compile_options(amiibo PRIVATE -Wall -Werror -O3) -set_property(TARGET amiibo PROPERTY POSITION_INDEPENDENT_CODE ON) +target_include_directories(pm3rrg_rdv4_amiibo PRIVATE ../../include ../../common) +target_include_directories(pm3rrg_rdv4_amiibo INTERFACE amiitool) +target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -Werror -O3) +set_property(TARGET pm3rrg_rdv4_amiibo PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/cliparser.cmake b/client/deps/cliparser.cmake index ca3e0bf6d..b16451c07 100644 --- a/client/deps/cliparser.cmake +++ b/client/deps/cliparser.cmake @@ -1,12 +1,12 @@ -add_library(cliparser STATIC +add_library(pm3rrg_rdv4_cliparser STATIC cliparser/argtable3.c cliparser/cliparser.c ) -target_include_directories(cliparser PRIVATE +target_include_directories(pm3rrg_rdv4_cliparser PRIVATE ../../common ../../include ../src) -target_include_directories(cliparser INTERFACE cliparser) -target_compile_options(cliparser PRIVATE -Wall -Werror -O3) -set_property(TARGET cliparser PROPERTY POSITION_INDEPENDENT_CODE ON) +target_include_directories(pm3rrg_rdv4_cliparser INTERFACE cliparser) +target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -Werror -O3) +set_property(TARGET pm3rrg_rdv4_cliparser PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/hardnested.cmake b/client/deps/hardnested.cmake index 5dbca2dbd..9efff1445 100644 --- a/client/deps/hardnested.cmake +++ b/client/deps/hardnested.cmake @@ -1,11 +1,11 @@ -add_library(hardnested_nosimd OBJECT +add_library(pm3rrg_rdv4_hardnested_nosimd OBJECT hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) -target_compile_options(hardnested_nosimd PRIVATE -Wall -Werror -O3) -set_property(TARGET hardnested_nosimd PROPERTY POSITION_INDEPENDENT_CODE ON) +target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -Werror -O3) +set_property(TARGET pm3rrg_rdv4_hardnested_nosimd PROPERTY POSITION_INDEPENDENT_CODE ON) -target_include_directories(hardnested_nosimd PRIVATE +target_include_directories(pm3rrg_rdv4_hardnested_nosimd PRIVATE ../../common ../../include) @@ -19,98 +19,98 @@ message(STATUS "CMAKE_SYSTEM_PROCESSOR := ${CMAKE_SYSTEM_PROCESSOR}") if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) message(STATUS "Building optimised x86/x86_64 binaries") - target_compile_options(hardnested_nosimd BEFORE PRIVATE + target_compile_options(pm3rrg_rdv4_hardnested_nosimd BEFORE PRIVATE -mno-mmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f) ## x86 / MMX - add_library(hardnested_mmx OBJECT + add_library(pm3rrg_rdv4_hardnested_mmx OBJECT hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(hardnested_mmx PRIVATE -Wall -Werror -O3) - target_compile_options(hardnested_mmx BEFORE PRIVATE + target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_mmx BEFORE PRIVATE -mmmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f) - set_property(TARGET hardnested_mmx PROPERTY POSITION_INDEPENDENT_CODE ON) + set_property(TARGET pm3rrg_rdv4_hardnested_mmx PROPERTY POSITION_INDEPENDENT_CODE ON) - target_include_directories(hardnested_mmx PRIVATE + target_include_directories(pm3rrg_rdv4_hardnested_mmx PRIVATE ../../common ../../include) ## x86 / SSE2 - add_library(hardnested_sse2 OBJECT + add_library(pm3rrg_rdv4_hardnested_sse2 OBJECT hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(hardnested_sse2 PRIVATE -Wall -Werror -O3) - target_compile_options(hardnested_sse2 BEFORE PRIVATE + target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_sse2 BEFORE PRIVATE -mmmx -msse2 -mno-avx -mno-avx2 -mno-avx512f) - set_property(TARGET hardnested_sse2 PROPERTY POSITION_INDEPENDENT_CODE ON) + set_property(TARGET pm3rrg_rdv4_hardnested_sse2 PROPERTY POSITION_INDEPENDENT_CODE ON) - target_include_directories(hardnested_sse2 PRIVATE + target_include_directories(pm3rrg_rdv4_hardnested_sse2 PRIVATE ../../common ../../include) ## x86 / AVX - add_library(hardnested_avx OBJECT + add_library(pm3rrg_rdv4_hardnested_avx OBJECT hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(hardnested_avx PRIVATE -Wall -Werror -O3) - target_compile_options(hardnested_avx BEFORE PRIVATE + target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx BEFORE PRIVATE -mmmx -msse2 -mavx -mno-avx2 -mno-avx512f) - set_property(TARGET hardnested_avx PROPERTY POSITION_INDEPENDENT_CODE ON) + set_property(TARGET pm3rrg_rdv4_hardnested_avx PROPERTY POSITION_INDEPENDENT_CODE ON) - target_include_directories(hardnested_avx PRIVATE + target_include_directories(pm3rrg_rdv4_hardnested_avx PRIVATE ../../common ../../include) ## x86 / AVX2 - add_library(hardnested_avx2 OBJECT + add_library(pm3rrg_rdv4_hardnested_avx2 OBJECT hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(hardnested_avx2 PRIVATE -Wall -Werror -O3) - target_compile_options(hardnested_avx2 BEFORE PRIVATE + target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx2 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mno-avx512f) - set_property(TARGET hardnested_avx2 PROPERTY POSITION_INDEPENDENT_CODE ON) + set_property(TARGET pm3rrg_rdv4_hardnested_avx2 PROPERTY POSITION_INDEPENDENT_CODE ON) - target_include_directories(hardnested_avx2 PRIVATE + target_include_directories(pm3rrg_rdv4_hardnested_avx2 PRIVATE ../../common ../../include) ## x86 / AVX512 - add_library(hardnested_avx512 OBJECT + add_library(pm3rrg_rdv4_hardnested_avx512 OBJECT hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(hardnested_avx512 PRIVATE -Wall -Werror -O3) - target_compile_options(hardnested_avx512 BEFORE PRIVATE + target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx512 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mavx512f) - set_property(TARGET hardnested_avx512 PROPERTY POSITION_INDEPENDENT_CODE ON) + set_property(TARGET pm3rrg_rdv4_hardnested_avx512 PROPERTY POSITION_INDEPENDENT_CODE ON) - target_include_directories(hardnested_avx512 PRIVATE + target_include_directories(pm3rrg_rdv4_hardnested_avx512 PRIVATE ../../common ../../include) set(SIMD_TARGETS - $ - $ - $ - $ - $) + $ + $ + $ + $ + $) else () message(STATUS "Not building optimised targets") set(SIMD_TARGETS) endif () -add_library(hardnested STATIC +add_library(pm3rrg_rdv4_hardnested STATIC hardnested/hardnested_bruteforce.c - $ + $ ${SIMD_TARGETS}) -set_property(TARGET hardnested PROPERTY POSITION_INDEPENDENT_CODE ON) -target_include_directories(hardnested PRIVATE +set_property(TARGET pm3rrg_rdv4_hardnested PROPERTY POSITION_INDEPENDENT_CODE ON) +target_include_directories(pm3rrg_rdv4_hardnested PRIVATE ../../common ../../include ../src jansson) -target_include_directories(hardnested INTERFACE hardnested) +target_include_directories(pm3rrg_rdv4_hardnested INTERFACE hardnested) diff --git a/client/deps/jansson.cmake b/client/deps/jansson.cmake index d3054b158..a95ff0baf 100644 --- a/client/deps/jansson.cmake +++ b/client/deps/jansson.cmake @@ -1,4 +1,4 @@ -add_library(jansson STATIC +add_library(pm3rrg_rdv4_jansson STATIC jansson/dump.c jansson/error.c jansson/hashtable.c @@ -13,7 +13,7 @@ add_library(jansson STATIC jansson/value.c ) -target_compile_definitions(jansson PRIVATE HAVE_STDINT_H) -target_include_directories(jansson INTERFACE jansson) -target_compile_options(jansson PRIVATE -Wall -Werror -Wno-unused-function -O3) -set_property(TARGET jansson PROPERTY POSITION_INDEPENDENT_CODE ON) +target_compile_definitions(pm3rrg_rdv4_jansson PRIVATE HAVE_STDINT_H) +target_include_directories(pm3rrg_rdv4_jansson INTERFACE jansson) +target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Werror -Wno-unused-function -O3) +set_property(TARGET pm3rrg_rdv4_jansson PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/lua.cmake b/client/deps/lua.cmake index b5267c561..679147124 100644 --- a/client/deps/lua.cmake +++ b/client/deps/lua.cmake @@ -1,4 +1,4 @@ -add_library(lua STATIC +add_library(pm3rrg_rdv4_lua STATIC liblua/lapi.c liblua/lcode.c liblua/lctype.c @@ -33,17 +33,17 @@ add_library(lua STATIC liblua/linit.c ) -target_compile_definitions(lua PRIVATE LUA_COMPAT_ALL) +target_compile_definitions(pm3rrg_rdv4_lua PRIVATE LUA_COMPAT_ALL) if (NOT MINGW) if (APPLE) - target_compile_definitions(lua PRIVATE LUA_USE_MACOSX) + target_compile_definitions(pm3rrg_rdv4_lua PRIVATE LUA_USE_MACOSX) else (APPLE) - target_compile_definitions(lua PRIVATE LUA_USE_LINUX) - target_link_libraries(lua INTERFACE dl) + target_compile_definitions(pm3rrg_rdv4_lua PRIVATE LUA_USE_LINUX) + target_link_libraries(pm3rrg_rdv4_lua INTERFACE dl) endif (APPLE) endif (NOT MINGW) -target_include_directories(lua INTERFACE liblua) -target_compile_options(lua PRIVATE -Wall -Werror -O3) -set_property(TARGET lua PROPERTY POSITION_INDEPENDENT_CODE ON) +target_include_directories(pm3rrg_rdv4_lua INTERFACE liblua) +target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -Werror -O3) +set_property(TARGET pm3rrg_rdv4_lua PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/mbedtls.cmake b/client/deps/mbedtls.cmake index 5f6cff8b5..63e706889 100644 --- a/client/deps/mbedtls.cmake +++ b/client/deps/mbedtls.cmake @@ -1,4 +1,4 @@ -add_library(mbedtls STATIC +add_library(pm3rrg_rdv4_mbedtls STATIC ../../common/mbedtls/aes.c ../../common/mbedtls/asn1parse.c ../../common/mbedtls/asn1write.c @@ -44,6 +44,6 @@ add_library(mbedtls STATIC ../../common/mbedtls/x509_crt.c ) -target_include_directories(mbedtls PRIVATE ../../common) -target_compile_options(mbedtls PRIVATE -Wall -Werror -O3) -set_property(TARGET mbedtls PROPERTY POSITION_INDEPENDENT_CODE ON) +target_include_directories(pm3rrg_rdv4_mbedtls PRIVATE ../../common) +target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -Werror -O3) +set_property(TARGET pm3rrg_rdv4_mbedtls PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/reveng.cmake b/client/deps/reveng.cmake index c32de008a..d5f3259ed 100644 --- a/client/deps/reveng.cmake +++ b/client/deps/reveng.cmake @@ -1,4 +1,4 @@ -add_library(reveng STATIC +add_library(pm3rrg_rdv4_reveng STATIC reveng/bmpbit.c reveng/cli.c reveng/model.c @@ -7,8 +7,8 @@ add_library(reveng STATIC reveng/reveng.c ) -target_compile_definitions(reveng PRIVATE PRESETS) -target_include_directories(reveng PRIVATE ../cliparser) -target_include_directories(reveng INTERFACE reveng) -target_compile_options(reveng PRIVATE -Wall -Werror -O3) -set_property(TARGET reveng PROPERTY POSITION_INDEPENDENT_CODE ON) +target_compile_definitions(pm3rrg_rdv4_reveng PRIVATE PRESETS) +target_include_directories(pm3rrg_rdv4_reveng PRIVATE ../cliparser) +target_include_directories(pm3rrg_rdv4_reveng INTERFACE reveng) +target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -Werror -O3) +set_property(TARGET pm3rrg_rdv4_reveng PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/tinycbor.cmake b/client/deps/tinycbor.cmake index d7a51672d..5a6abda25 100644 --- a/client/deps/tinycbor.cmake +++ b/client/deps/tinycbor.cmake @@ -1,4 +1,4 @@ -add_library(tinycbor STATIC +add_library(pm3rrg_rdv4_tinycbor STATIC tinycbor/cborencoder.c tinycbor/cborencoder_close_container_checked.c tinycbor/cborerrorstrings.c @@ -9,7 +9,7 @@ add_library(tinycbor STATIC tinycbor/cborvalidation.c ) -target_include_directories(tinycbor INTERFACE tinycbor) +target_include_directories(pm3rrg_rdv4_tinycbor INTERFACE tinycbor) # Strange errors on Mingw when compiling with -O3 -target_compile_options(tinycbor PRIVATE -Wall -Werror -O2) -set_property(TARGET tinycbor PROPERTY POSITION_INDEPENDENT_CODE ON) +target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -Werror -O2) +set_property(TARGET pm3rrg_rdv4_tinycbor PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/zlib.cmake b/client/deps/zlib.cmake index fabfc218a..645cbc88d 100644 --- a/client/deps/zlib.cmake +++ b/client/deps/zlib.cmake @@ -1,4 +1,4 @@ -add_library(z STATIC +add_library(pm3rrg_rdv4_z STATIC ../../common/zlib/deflate.c ../../common/zlib/adler32.c ../../common/zlib/trees.c @@ -8,6 +8,6 @@ add_library(z STATIC ../../common/zlib/inftrees.c ) -target_compile_definitions(z PRIVATE Z_SOLO NO_GZIP ZLIB_PM3_TUNED) -target_compile_options(z PRIVATE -Wall -Werror -O3) -set_property(TARGET z PROPERTY POSITION_INDEPENDENT_CODE ON) +target_compile_definitions(pm3rrg_rdv4_z PRIVATE Z_SOLO NO_GZIP ZLIB_PM3_TUNED) +target_compile_options(pm3rrg_rdv4_z PRIVATE -Wall -Werror -O3) +set_property(TARGET pm3rrg_rdv4_z PROPERTY POSITION_INDEPENDENT_CODE ON) From 59453aea8b9f135cea8a0d39d1f5934dfdceb629 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 6 May 2020 14:34:07 +0200 Subject: [PATCH 085/632] Android cmake: use common cmake files for deps --- client/android/CMakeLists.txt | 259 ++-------------------------------- 1 file changed, 13 insertions(+), 246 deletions(-) diff --git a/client/android/CMakeLists.txt b/client/android/CMakeLists.txt index a4e04b8ca..d320db6a1 100644 --- a/client/android/CMakeLists.txt +++ b/client/android/CMakeLists.txt @@ -9,6 +9,8 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -O3 -fvisibility=hidden -w") #缩短路径定义 set(PM3_ROOT ../../) +add_subdirectory(../deps deps) + #添加动态库定义 add_library(pm3rrg_rdv4 SHARED ${PM3_ROOT}/common/util_posix.c @@ -26,52 +28,6 @@ add_library(pm3rrg_rdv4 SHARED ${PM3_ROOT}/common/iso15693tools.c ${PM3_ROOT}/common/bucketsort.c ${PM3_ROOT}/common/legic_prng.c - ${PM3_ROOT}/common/mbedtls/aes.c - ${PM3_ROOT}/common/mbedtls/base64.c - ${PM3_ROOT}/common/mbedtls/rsa.c - ${PM3_ROOT}/common/mbedtls/rsa_internal.c - ${PM3_ROOT}/common/mbedtls/arc4.c - ${PM3_ROOT}/common/mbedtls/bignum.c - ${PM3_ROOT}/common/mbedtls/asn1parse.c - ${PM3_ROOT}/common/mbedtls/asn1write.c - ${PM3_ROOT}/common/mbedtls/blowfish.c - ${PM3_ROOT}/common/mbedtls/camellia.c - ${PM3_ROOT}/common/mbedtls/certs.c - ${PM3_ROOT}/common/mbedtls/des.c - ${PM3_ROOT}/common/mbedtls/ecdsa.c - ${PM3_ROOT}/common/mbedtls/ecp.c - ${PM3_ROOT}/common/mbedtls/ecp_curves.c - ${PM3_ROOT}/common/mbedtls/entropy.c - ${PM3_ROOT}/common/mbedtls/entropy_poll.c - ${PM3_ROOT}/common/mbedtls/error.c - ${PM3_ROOT}/common/mbedtls/md.c - ${PM3_ROOT}/common/mbedtls/md5.c - ${PM3_ROOT}/common/mbedtls/md_wrap.c - ${PM3_ROOT}/common/mbedtls/sha1.c - ${PM3_ROOT}/common/mbedtls/sha256.c - ${PM3_ROOT}/common/mbedtls/sha512.c - ${PM3_ROOT}/common/mbedtls/timing.c - ${PM3_ROOT}/common/mbedtls/cmac.c - ${PM3_ROOT}/common/mbedtls/oid.c - ${PM3_ROOT}/common/mbedtls/pem.c - ${PM3_ROOT}/common/mbedtls/pk.c - ${PM3_ROOT}/common/mbedtls/pk_wrap.c - ${PM3_ROOT}/common/mbedtls/pkcs5.c - ${PM3_ROOT}/common/mbedtls/pkcs12.c - ${PM3_ROOT}/common/mbedtls/pkparse.c - ${PM3_ROOT}/common/mbedtls/pkwrite.c - ${PM3_ROOT}/common/mbedtls/x509.c - ${PM3_ROOT}/common/mbedtls/x509_crl.c - ${PM3_ROOT}/common/mbedtls/x509_crt.c - ${PM3_ROOT}/common/mbedtls/ctr_drbg.c - ${PM3_ROOT}/common/mbedtls/cipher_wrap.c - ${PM3_ROOT}/common/mbedtls/cipher.c - ${PM3_ROOT}/common/mbedtls/platform_util.c - ${PM3_ROOT}/common//zlib/inflate.c - ${PM3_ROOT}/common/zlib/inffast.c - ${PM3_ROOT}/common/zlib/zutil.c - ${PM3_ROOT}/common/zlib/inftrees.c - ${PM3_ROOT}/common//zlib/adler32.c # client inside ${PM3_ROOT}/client/src/fileutils.c ${PM3_ROOT}/client/src/uart/uart_posix.c @@ -187,75 +143,7 @@ add_library(pm3rrg_rdv4 SHARED ${PM3_ROOT}/client/src/cmdlfpcf7931.c ${PM3_ROOT}/client/src/cmdhfmfhard.c ${PM3_ROOT}/client/src/cmdusart.c - # deps ouside - ${PM3_ROOT}/client/deps/jansson/utf.c - ${PM3_ROOT}/client/deps/jansson/dump.c - ${PM3_ROOT}/client/deps/jansson/path.c - ${PM3_ROOT}/client/deps/jansson/load.c - ${PM3_ROOT}/client/deps/jansson/error.c - ${PM3_ROOT}/client/deps/jansson/value.c - ${PM3_ROOT}/client/deps/jansson/memory.c - ${PM3_ROOT}/client/deps/jansson/pack_unpack.c - ${PM3_ROOT}/client/deps/jansson/hashtable_seed.c - ${PM3_ROOT}/client/deps/jansson/strbuffer.c - ${PM3_ROOT}/client/deps/jansson/strconv.c - ${PM3_ROOT}/client/deps/jansson/hashtable.c - ${PM3_ROOT}/client/deps/jansson/hashtable.c - # cliparser - ${PM3_ROOT}/client/deps/cliparser/cliparser.c - ${PM3_ROOT}/client/deps/cliparser/argtable3.c - # tinycbor - ${PM3_ROOT}/client/deps/tinycbor/cborencoder.c - ${PM3_ROOT}/client/deps/tinycbor/cborencoder_close_container_checked.c - ${PM3_ROOT}/client/deps/tinycbor/cborerrorstrings.c - ${PM3_ROOT}/client/deps/tinycbor/cborparser.c - ${PM3_ROOT}/client/deps/tinycbor/cborparser_dup_string.c - ${PM3_ROOT}/client/deps/tinycbor/cborpretty.c - ${PM3_ROOT}/client/deps/tinycbor/cborpretty_stdio.c - ${PM3_ROOT}/client/deps/tinycbor/cbortojson.c - ${PM3_ROOT}/client/deps/tinycbor/cborvalidation.c - ${PM3_ROOT}/client/deps/tinycbor/open_memstream.c - # reveng - ${PM3_ROOT}/client/deps/reveng/cli.c - ${PM3_ROOT}/client/deps/reveng/bmpbit.c - ${PM3_ROOT}/client/deps/reveng/preset.c - ${PM3_ROOT}/client/deps/reveng/model.c - ${PM3_ROOT}/client/deps/reveng/poly.c - ${PM3_ROOT}/client/deps/reveng/reveng.c - # liblua - ${PM3_ROOT}/client/deps/liblua/lapi.c - ${PM3_ROOT}/client/deps/liblua/ldo.c - ${PM3_ROOT}/client/deps/liblua/lgc.c - ${PM3_ROOT}/client/deps/liblua/ltm.c - ${PM3_ROOT}/client/deps/liblua/lvm.c - ${PM3_ROOT}/client/deps/liblua/lzio.c - ${PM3_ROOT}/client/deps/liblua/lcode.c - ${PM3_ROOT}/client/deps/liblua/llex.c - ${PM3_ROOT}/client/deps/liblua/liolib.c - ${PM3_ROOT}/client/deps/liblua/loslib.c - ${PM3_ROOT}/client/deps/liblua/lopcodes.c - ${PM3_ROOT}/client/deps/liblua/lmem.c - ${PM3_ROOT}/client/deps/liblua/lmathlib.c - ${PM3_ROOT}/client/deps/liblua/ldump.c - ${PM3_ROOT}/client/deps/liblua/ldblib.c - ${PM3_ROOT}/client/deps/liblua/lundump.c - ${PM3_ROOT}/client/deps/liblua/lcorolib.c - ${PM3_ROOT}/client/deps/liblua/lauxlib.c - ${PM3_ROOT}/client/deps/liblua/ltablib.c - ${PM3_ROOT}/client/deps/liblua/linit.c - ${PM3_ROOT}/client/deps/liblua/lstring.c - ${PM3_ROOT}/client/deps/liblua/lctype.c - ${PM3_ROOT}/client/deps/liblua/ltable.c - ${PM3_ROOT}/client/deps/liblua/ldebug.c - ${PM3_ROOT}/client/deps/liblua/lstate.c - ${PM3_ROOT}/client/deps/liblua/lstrlib.c - ${PM3_ROOT}/client/deps/liblua/lfunc.c - ${PM3_ROOT}/client/deps/liblua/lparser.c - ${PM3_ROOT}/client/deps/liblua/lobject.c - ${PM3_ROOT}/client/deps/liblua/loadlib.c - ${PM3_ROOT}/client/deps/liblua/lbaselib.c - ${PM3_ROOT}/client/deps/liblua/lbitlib.c - ${PM3_ROOT}/client/deps/hardnested/hardnested_bruteforce.c + # android source jni_tools.c pm3_main.c @@ -264,140 +152,19 @@ add_library(pm3rrg_rdv4 SHARED #添加头文件配置 target_include_directories(pm3rrg_rdv4 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} - ${PM3_ROOT}/ ${PM3_ROOT}/include/ ${PM3_ROOT}/common - ${PM3_ROOT}/common/zlib ${PM3_ROOT}/common_fpga - ${PM3_ROOT}/common/mbedtls - ${PM3_ROOT}/client/src - ${PM3_ROOT}/client/src/fido - ${PM3_ROOT}/client/src/uart - ${PM3_ROOT}/client/deps/liblua - ${PM3_ROOT}/client/deps/reveng - ${PM3_ROOT}/client/deps/jansson - ${PM3_ROOT}/client/deps/tinycbor - ${PM3_ROOT}/client/deps/cliparser - ${PM3_ROOT}/client/deps/hardnested) + ${PM3_ROOT}/client/src) -## CPU-specific code -## These are mostly for x86-based architectures, which is not useful for many Android devices. -add_library(pm3rrg_rdv4_hardnested_nosimd OBJECT - ${PM3_ROOT}/client/deps/hardnested/hardnested_bf_core.c - ${PM3_ROOT}/client/deps/hardnested/hardnested_bitarray_core.c) - -target_include_directories(pm3rrg_rdv4_hardnested_nosimd PRIVATE - ${PM3_ROOT}/common - ${PM3_ROOT}/client - ${PM3_ROOT}/include/ - ${PM3_ROOT}/client/deps/hardnested) - -set(X86_CPUS x86 x86_64 i686) - -message(STATUS "CMAKE_SYSTEM_PROCESSOR := ${CMAKE_SYSTEM_PROCESSOR}") - -if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) - message(STATUS "Building optimised x86/x86_64 binaries") - target_compile_options(pm3rrg_rdv4_hardnested_nosimd BEFORE PRIVATE - -mno-mmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f) - - set_property(TARGET pm3rrg_rdv4_hardnested_nosimd PROPERTY POSITION_INDEPENDENT_CODE ON) - - ## x86 / MMX - add_library(pm3rrg_rdv4_hardnested_mmx OBJECT - ${PM3_ROOT}/client/deps/hardnested/hardnested_bf_core.c - ${PM3_ROOT}/client/deps/hardnested/hardnested_bitarray_core.c) - - target_compile_options(pm3rrg_rdv4_hardnested_mmx BEFORE PRIVATE - -mmmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f) - - target_include_directories(pm3rrg_rdv4_hardnested_mmx PRIVATE - ${PM3_ROOT}/common - ${PM3_ROOT}/client - ${PM3_ROOT}/include/ - ${PM3_ROOT}/client/deps/hardnested) - - set_property(TARGET pm3rrg_rdv4_hardnested_mmx PROPERTY POSITION_INDEPENDENT_CODE ON) - - ## x86 / SSE2 - add_library(pm3rrg_rdv4_hardnested_sse2 OBJECT - ${PM3_ROOT}/client/deps/hardnested/hardnested_bf_core.c - ${PM3_ROOT}/client/deps/hardnested/hardnested_bitarray_core.c) - - target_compile_options(pm3rrg_rdv4_hardnested_sse2 BEFORE PRIVATE - -mmmx -msse2 -mno-avx -mno-avx2 -mno-avx512f) - - target_include_directories(pm3rrg_rdv4_hardnested_sse2 PRIVATE - ${PM3_ROOT}/common - ${PM3_ROOT}/client - ${PM3_ROOT}/include/ - ${PM3_ROOT}/client/deps/hardnested) - - set_property(TARGET pm3rrg_rdv4_hardnested_sse2 PROPERTY POSITION_INDEPENDENT_CODE ON) - - ## x86 / AVX - add_library(pm3rrg_rdv4_hardnested_avx OBJECT - ${PM3_ROOT}/client/deps/hardnested/hardnested_bf_core.c - ${PM3_ROOT}/client/deps/hardnested/hardnested_bitarray_core.c) - - target_compile_options(pm3rrg_rdv4_hardnested_avx BEFORE PRIVATE - -mmmx -msse2 -mavx -mno-avx2 -mno-avx512f) - - target_include_directories(pm3rrg_rdv4_hardnested_avx PRIVATE - ${PM3_ROOT}/common - ${PM3_ROOT}/client - ${PM3_ROOT}/include/ - ${PM3_ROOT}/client/deps/hardnested) - - set_property(TARGET pm3rrg_rdv4_hardnested_avx PROPERTY POSITION_INDEPENDENT_CODE ON) - - ## x86 / AVX2 - add_library(pm3rrg_rdv4_hardnested_avx2 OBJECT - ${PM3_ROOT}/client/deps/hardnested/hardnested_bf_core.c - ${PM3_ROOT}/client/deps/hardnested/hardnested_bitarray_core.c) - - target_compile_options(pm3rrg_rdv4_hardnested_avx2 BEFORE PRIVATE - -mmmx -msse2 -mavx -mavx2 -mno-avx512f) - - target_include_directories(pm3rrg_rdv4_hardnested_avx2 PRIVATE - ${PM3_ROOT}/common - ${PM3_ROOT}/client - ${PM3_ROOT}/include/ - ${PM3_ROOT}/client/deps/hardnested) - - set_property(TARGET pm3rrg_rdv4_hardnested_avx2 PROPERTY POSITION_INDEPENDENT_CODE ON) - - ## x86 / AVX512 - add_library(pm3rrg_rdv4_hardnested_avx512 OBJECT - ${PM3_ROOT}/client/deps/hardnested/hardnested_bf_core.c - ${PM3_ROOT}/client/deps/hardnested/hardnested_bitarray_core.c) - - target_compile_options(pm3rrg_rdv4_hardnested_avx512 BEFORE PRIVATE - -mmmx -msse2 -mavx -mavx2 -mavx512f) - - target_include_directories(pm3rrg_rdv4_hardnested_avx512 PRIVATE - ${PM3_ROOT}/common - ${PM3_ROOT}/client - ${PM3_ROOT}/include/ - ${PM3_ROOT}/client/deps/hardnested) - - set_property(TARGET pm3rrg_rdv4_hardnested_avx512 PROPERTY POSITION_INDEPENDENT_CODE ON) - - set(SIMD_TARGETS - $ - $ - $ - $ - $) -else () - message(STATUS "Not building optimised targets") - set(SIMD_TARGETS) -endif () - -#定义为静态库,被最终的pm3库依赖! -add_library(pm3rrg_rdv4_hardnested STATIC - $ - ${SIMD_TARGETS}) +find_library(pm3rrg_rdv4_cliparser REQUIRED) +find_library(pm3rrg_rdv4_jansson REQUIRED) +find_library(pm3rrg_rdv4_tinycbor REQUIRED) +find_library(pm3rrg_rdv4_lua REQUIRED) +find_library(pm3rrg_rdv4_mbedtls REQUIRED) +find_library(pm3rrg_rdv4_reveng REQUIRED) +find_library(pm3rrg_rdv4_z REQUIRED) +find_library(pm3rrg_rdv4_hardnested REQUIRED) +target_link_libraries(pm3rrg_rdv4 pm3rrg_rdv4_hardnested pm3rrg_rdv4_mbedtls pm3rrg_rdv4_cliparser pm3rrg_rdv4_jansson pm3rrg_rdv4_lua pm3rrg_rdv4_tinycbor pm3rrg_rdv4_amiibo pm3rrg_rdv4_reveng pm3rrg_rdv4_z android log) #添加动态库链接! -target_link_libraries(pm3rrg_rdv4 pm3rrg_rdv4_hardnested android log z) \ No newline at end of file From f3790a89a525ac8385132ba3eb17d2e05ade35dd Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 6 May 2020 20:32:08 +0200 Subject: [PATCH 086/632] update argtable3 --- client/deps/cliparser/Makefile | 2 +- client/deps/cliparser/argtable3.c | 4063 ++++++++++++++++++----------- client/deps/cliparser/argtable3.h | 359 ++- 3 files changed, 2772 insertions(+), 1652 deletions(-) diff --git a/client/deps/cliparser/Makefile b/client/deps/cliparser/Makefile index 4873372c4..6fa13408a 100644 --- a/client/deps/cliparser/Makefile +++ b/client/deps/cliparser/Makefile @@ -1,6 +1,6 @@ MYSRCPATHS = MYINCLUDES = -I../../../common -I../../../include -I../../src -MYCFLAGS = -Wno-cast-align +MYCFLAGS = -Wno-cast-align -Wno-discarded-qualifiers -Wno-bad-function-cast -Wno-redundant-decls MYDEFS = MYSRCS = \ argtable3.c \ diff --git a/client/deps/cliparser/argtable3.c b/client/deps/cliparser/argtable3.c index f66c22d6d..c3d1bb9f7 100644 --- a/client/deps/cliparser/argtable3.c +++ b/client/deps/cliparser/argtable3.c @@ -30,19 +30,14 @@ #include "argtable3.h" -// On Windows isspace crashes app in case of using Unicode character set and string to be above ASCII -// so you have to use _istspace instead of space -#ifdef UNICODE -#include -#define ISSPACE _istspace -#else -#define ISSPACE isspace -#endif +#define ARG_AMALGAMATION /******************************************************************************* + * argtable3_private: Declares private types, constants, and interfaces + * * This file is part of the argtable3 library. * - * Copyright (C) 2013 Tom G. Huang + * Copyright (C) 2013-2019 Tom G. Huang * * All rights reserved. * @@ -72,6 +67,8 @@ #ifndef ARG_UTILS_H #define ARG_UTILS_H +#include + #define ARG_ENABLE_TRACE 0 #define ARG_ENABLE_LOG 1 @@ -79,56 +76,199 @@ extern "C" { #endif -enum { - EMINCOUNT = 1, - EMAXCOUNT, - EBADINT, - -// The same name define EOVERFLOW in errno.h on windows platform or android -#if defined(__STDC_WANT_SECURE_LIB__) || defined(__ANDROID__) || defined(ANDROID) - EOVERFLOW_, -#else - EOVERFLOW, -#endif - EBADDOUBLE, - EBADDATE, - EREGNOMATCH -}; +enum { ARG_ERR_MINCOUNT = 1, ARG_ERR_MAXCOUNT, ARG_ERR_BADINT, ARG_ERR_OVERFLOW, ARG_ERR_BADDOUBLE, ARG_ERR_BADDATE, ARG_ERR_REGNOMATCH }; +typedef void(arg_panicfn)(const char* fmt, ...); #if defined(_MSC_VER) -#define ARG_TRACE(x) \ - __pragma(warning(push)) \ - __pragma(warning(disable:4127)) \ - do { if (ARG_ENABLE_TRACE) dbg_printf x; } while (0) \ - __pragma(warning(pop)) +#define ARG_TRACE(x) \ + __pragma(warning(push)) __pragma(warning(disable : 4127)) do { \ + if (ARG_ENABLE_TRACE) \ + dbg_printf x; \ + } \ + while (0) \ + __pragma(warning(pop)) -#define ARG_LOG(x) \ - __pragma(warning(push)) \ - __pragma(warning(disable:4127)) \ - do { if (ARG_ENABLE_LOG) dbg_printf x; } while (0) \ - __pragma(warning(pop)) +#define ARG_LOG(x) \ + __pragma(warning(push)) __pragma(warning(disable : 4127)) do { \ + if (ARG_ENABLE_LOG) \ + dbg_printf x; \ + } \ + while (0) \ + __pragma(warning(pop)) #else -#define ARG_TRACE(x) \ - do { if (ARG_ENABLE_TRACE) dbg_printf x; } while (0) +#define ARG_TRACE(x) \ + do { \ + if (ARG_ENABLE_TRACE) \ + dbg_printf x; \ + } while (0) -#define ARG_LOG(x) \ - do { if (ARG_ENABLE_LOG) dbg_printf x; } while (0) +#define ARG_LOG(x) \ + do { \ + if (ARG_ENABLE_LOG) \ + dbg_printf x; \ + } while (0) #endif -extern void dbg_printf(const char *fmt, ...); +extern void dbg_printf(const char* fmt, ...); +extern void arg_set_panic(arg_panicfn* proc); +extern void* xmalloc(size_t size); +extern void* xcalloc(size_t count, size_t size); +extern void* xrealloc(void* ptr, size_t size); +extern void xfree(void* ptr); + +struct arg_hashtable_entry { + void *k, *v; + unsigned int h; + struct arg_hashtable_entry* next; +}; + +typedef struct arg_hashtable { + unsigned int tablelength; + struct arg_hashtable_entry** table; + unsigned int entrycount; + unsigned int loadlimit; + unsigned int primeindex; + unsigned int (*hashfn)(const void* k); + int (*eqfn)(const void* k1, const void* k2); +} arg_hashtable_t; + +/** + * @brief Create a hash table. + * + * @param minsize minimum initial size of hash table + * @param hashfn function for hashing keys + * @param eqfn function for determining key equality + * @return newly created hash table or NULL on failure + */ +arg_hashtable_t* arg_hashtable_create(unsigned int minsize, unsigned int (*hashfn)(const void*), int (*eqfn)(const void*, const void*)); + +/** + * @brief This function will cause the table to expand if the insertion would take + * the ratio of entries to table size over the maximum load factor. + * + * This function does not check for repeated insertions with a duplicate key. + * The value returned when using a duplicate key is undefined -- when + * the hash table changes size, the order of retrieval of duplicate key + * entries is reversed. + * If in doubt, remove before insert. + * + * @param h the hash table to insert into + * @param k the key - hash table claims ownership and will free on removal + * @param v the value - does not claim ownership + * @return non-zero for successful insertion + */ +void arg_hashtable_insert(arg_hashtable_t* h, void* k, void* v); + +#define ARG_DEFINE_HASHTABLE_INSERT(fnname, keytype, valuetype) \ + int fnname(arg_hashtable_t* h, keytype* k, valuetype* v) { return arg_hashtable_insert(h, k, v); } + +/** + * @brief Search the specified key in the hash table. + * + * @param h the hash table to search + * @param k the key to search for - does not claim ownership + * @return the value associated with the key, or NULL if none found + */ +void* arg_hashtable_search(arg_hashtable_t* h, const void* k); + +#define ARG_DEFINE_HASHTABLE_SEARCH(fnname, keytype, valuetype) \ + valuetype* fnname(arg_hashtable_t* h, keytype* k) { return (valuetype*)(arg_hashtable_search(h, k)); } + +/** + * @brief Remove the specified key from the hash table. + * + * @param h the hash table to remove the item from + * @param k the key to search for - does not claim ownership + */ +void arg_hashtable_remove(arg_hashtable_t* h, const void* k); + +#define ARG_DEFINE_HASHTABLE_REMOVE(fnname, keytype, valuetype) \ + valuetype* fnname(arg_hashtable_t* h, keytype* k) { return (valuetype*)(arg_hashtable_remove(h, k)); } + +/** + * @brief Return the number of keys in the hash table. + * + * @param h the hash table + * @return the number of items stored in the hash table + */ +unsigned int arg_hashtable_count(arg_hashtable_t* h); + +/** + * @brief Change the value associated with the key. + * + * function to change the value associated with a key, where there already + * exists a value bound to the key in the hash table. + * Source due to Holger Schemel. + * + * @name hashtable_change + * @param h the hash table + * @param key + * @param value + */ +int arg_hashtable_change(arg_hashtable_t* h, void* k, void* v); + +/** + * @brief Free the hash table and the memory allocated for each key-value pair. + * + * @param h the hash table + * @param free_values whether to call 'free' on the remaining values + */ +void arg_hashtable_destroy(arg_hashtable_t* h, int free_values); + +typedef struct arg_hashtable_itr { + arg_hashtable_t* h; + struct arg_hashtable_entry* e; + struct arg_hashtable_entry* parent; + unsigned int index; +} arg_hashtable_itr_t; + +arg_hashtable_itr_t* arg_hashtable_itr_create(arg_hashtable_t* h); + +void arg_hashtable_itr_destroy(arg_hashtable_itr_t* itr); + +/** + * @brief Return the value of the (key,value) pair at the current position. + */ +extern void* arg_hashtable_itr_key(arg_hashtable_itr_t* i); + +/** + * @brief Return the value of the (key,value) pair at the current position. + */ +extern void* arg_hashtable_itr_value(arg_hashtable_itr_t* i); + +/** + * @brief Advance the iterator to the next element. Returns zero if advanced to end of table. + */ +int arg_hashtable_itr_advance(arg_hashtable_itr_t* itr); + +/** + * @brief Remove current element and advance the iterator to the next element. + */ +int arg_hashtable_itr_remove(arg_hashtable_itr_t* itr); + +/** + * @brief Search and overwrite the supplied iterator, to point to the entry matching the supplied key. + * + * @return Zero if not found. + */ +int arg_hashtable_itr_search(arg_hashtable_itr_t* itr, arg_hashtable_t* h, void* k); + +#define ARG_DEFINE_HASHTABLE_ITERATOR_SEARCH(fnname, keytype) \ + int fnname(arg_hashtable_itr_t* i, arg_hashtable_t* h, keytype* k) { return (arg_hashtable_iterator_search(i, h, k)); } #ifdef __cplusplus } #endif #endif - /******************************************************************************* + * arg_utils: Implements memory, panic, and other utility functions + * * This file is part of the argtable3 library. * - * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann - * + * Copyright (C) 2013-2019 Tom G. Huang + * * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -154,22 +294,1010 @@ extern void dbg_printf(const char *fmt, ...); * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ +#include "argtable3.h" + +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#endif + #include #include +#include +#include +static void panic(const char* fmt, ...); +static arg_panicfn* s_panic = panic; -void dbg_printf(const char *fmt, ...) { +void dbg_printf(const char* fmt, ...) { va_list args; va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); } -#include "getopt.h" +static void panic(const char* fmt, ...) { + va_list args; + char* s; -/* $Id: getopt_long.c,v 1.1 2009/10/16 19:50:28 rodney Exp rodney $ */ -/* $OpenBSD: getopt_long.c,v 1.23 2007/10/31 12:34:57 chl Exp $ */ -/* $NetBSD: getopt_long.c,v 1.15 2002/01/31 22:43:40 tv Exp $ */ + va_start(args, fmt); + vfprintf(stderr, fmt, args); + va_end(args); + +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable : 4996) +#endif + s = getenv("EF_DUMPCORE"); +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + + if (s != NULL && *s != '\0') { + abort(); + } else { + exit(EXIT_FAILURE); + } +} + +void arg_set_panic(arg_panicfn* proc) { + s_panic = proc; +} + +void* xmalloc(size_t size) { + void* ret = malloc(size); + if (!ret) { + s_panic("Out of memory!\n"); + } + return ret; +} + +void* xcalloc(size_t count, size_t size) { + size_t allocated_count = count && size ? count : 1; + size_t allocated_size = count && size ? size : 1; + void* ret = calloc(allocated_count, allocated_size); + if (!ret) { + s_panic("Out of memory!\n"); + } + return ret; +} + +void* xrealloc(void* ptr, size_t size) { + size_t allocated_size = size ? size : 1; + void* ret = realloc(ptr, allocated_size); + if (!ret) { + s_panic("Out of memory!\n"); + } + return ret; +} + +void xfree(void* ptr) { + free(ptr); +} + +static void merge(void* data, int esize, int i, int j, int k, arg_comparefn* comparefn) { + char* a = (char*)data; + char* m; + int ipos, jpos, mpos; + + /* Initialize the counters used in merging. */ + ipos = i; + jpos = j + 1; + mpos = 0; + + /* Allocate storage for the merged elements. */ + m = (char*)xmalloc(esize * ((k - i) + 1)); + + /* Continue while either division has elements to merge. */ + while (ipos <= j || jpos <= k) { + if (ipos > j) { + /* The left division has no more elements to merge. */ + while (jpos <= k) { + memcpy(&m[mpos * esize], &a[jpos * esize], esize); + jpos++; + mpos++; + } + + continue; + } else if (jpos > k) { + /* The right division has no more elements to merge. */ + while (ipos <= j) { + memcpy(&m[mpos * esize], &a[ipos * esize], esize); + ipos++; + mpos++; + } + + continue; + } + + /* Append the next ordered element to the merged elements. */ + if (comparefn(&a[ipos * esize], &a[jpos * esize]) < 0) { + memcpy(&m[mpos * esize], &a[ipos * esize], esize); + ipos++; + mpos++; + } else { + memcpy(&m[mpos * esize], &a[jpos * esize], esize); + jpos++; + mpos++; + } + } + + /* Prepare to pass back the merged data. */ + memcpy(&a[i * esize], m, esize * ((k - i) + 1)); + xfree(m); +} + +void arg_mgsort(void* data, int size, int esize, int i, int k, arg_comparefn* comparefn) { + int j; + + /* Stop the recursion when no more divisions can be made. */ + if (i < k) { + /* Determine where to divide the elements. */ + j = (int)(((i + k - 1)) / 2); + + /* Recursively sort the two divisions. */ + arg_mgsort(data, size, esize, i, j, comparefn); + arg_mgsort(data, size, esize, j + 1, k, comparefn); + merge(data, esize, i, j, k, comparefn); + } +} +/******************************************************************************* + * arg_hashtable: Implements the hash table utilities + * + * This file is part of the argtable3 library. + * + * Copyright (C) 2013-2019 Tom G. Huang + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of STEWART HEITMANN 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 COPYRIGHT HOLDERS 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 STEWART HEITMANN 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. + ******************************************************************************/ + +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#endif + +#include +#include +#include +#include + +/* + * This hash table module is adapted from the C hash table implementation by + * Christopher Clark. Here is the copyright notice from the library: + * + * Copyright (c) 2002, Christopher Clark + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * 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. + * + * * Neither the name of the original author; nor the names of any contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER + * 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. + */ + +/* + * Credit for primes table: Aaron Krowne + * http://br.endernet.org/~akrowne/ + * http://planetmath.org/encyclopedia/GoodHashTablePrimes.html + */ +static const unsigned int primes[] = {53, 97, 193, 389, 769, 1543, 3079, 6151, 12289, + 24593, 49157, 98317, 196613, 393241, 786433, 1572869, 3145739, 6291469, + 12582917, 25165843, 50331653, 100663319, 201326611, 402653189, 805306457, 1610612741}; +const unsigned int prime_table_length = sizeof(primes) / sizeof(primes[0]); +const float max_load_factor = (float)0.65; + +static unsigned int enhanced_hash(arg_hashtable_t* h, const void* k) { + /* + * Aim to protect against poor hash functions by adding logic here. + * The logic is taken from Java 1.4 hash table source. + */ + unsigned int i = h->hashfn(k); + i += ~(i << 9); + i ^= ((i >> 14) | (i << 18)); /* >>> */ + i += (i << 4); + i ^= ((i >> 10) | (i << 22)); /* >>> */ + return i; +} + +static unsigned int index_for(unsigned int tablelength, unsigned int hashvalue) { + return (hashvalue % tablelength); +} + +arg_hashtable_t* arg_hashtable_create(unsigned int minsize, unsigned int (*hashfn)(const void*), int (*eqfn)(const void*, const void*)) { + arg_hashtable_t* h; + unsigned int pindex; + unsigned int size = primes[0]; + + /* Check requested hash table isn't too large */ + if (minsize > (1u << 30)) + return NULL; + + /* + * Enforce size as prime. The reason is to avoid clustering of values + * into a small number of buckets (yes, distribution). A more even + * distributed hash table will perform more consistently. + */ + for (pindex = 0; pindex < prime_table_length; pindex++) { + if (primes[pindex] > minsize) { + size = primes[pindex]; + break; + } + } + + h = (arg_hashtable_t*)xmalloc(sizeof(arg_hashtable_t)); + h->table = (struct arg_hashtable_entry**)xmalloc(sizeof(struct arg_hashtable_entry*) * size); + memset(h->table, 0, size * sizeof(struct arg_hashtable_entry*)); + h->tablelength = size; + h->primeindex = pindex; + h->entrycount = 0; + h->hashfn = hashfn; + h->eqfn = eqfn; + h->loadlimit = (unsigned int)ceil(size * max_load_factor); + return h; +} + +static int arg_hashtable_expand(arg_hashtable_t* h) { + /* Double the size of the table to accommodate more entries */ + struct arg_hashtable_entry** newtable; + struct arg_hashtable_entry* e; + unsigned int newsize; + unsigned int i; + unsigned int index; + + /* Check we're not hitting max capacity */ + if (h->primeindex == (prime_table_length - 1)) + return 0; + newsize = primes[++(h->primeindex)]; + + newtable = (struct arg_hashtable_entry**)xmalloc(sizeof(struct arg_hashtable_entry*) * newsize); + memset(newtable, 0, newsize * sizeof(struct arg_hashtable_entry*)); + /* + * This algorithm is not 'stable': it reverses the list + * when it transfers entries between the tables + */ + for (i = 0; i < h->tablelength; i++) { + while (NULL != (e = h->table[i])) { + h->table[i] = e->next; + index = index_for(newsize, e->h); + e->next = newtable[index]; + newtable[index] = e; + } + } + + xfree(h->table); + h->table = newtable; + h->tablelength = newsize; + h->loadlimit = (unsigned int)ceil(newsize * max_load_factor); + return -1; +} + +unsigned int arg_hashtable_count(arg_hashtable_t* h) { + return h->entrycount; +} + +void arg_hashtable_insert(arg_hashtable_t* h, void* k, void* v) { + /* This method allows duplicate keys - but they shouldn't be used */ + unsigned int index; + struct arg_hashtable_entry* e; + if ((h->entrycount + 1) > h->loadlimit) { + /* + * Ignore the return value. If expand fails, we should + * still try cramming just this value into the existing table + * -- we may not have memory for a larger table, but one more + * element may be ok. Next time we insert, we'll try expanding again. + */ + arg_hashtable_expand(h); + } + e = (struct arg_hashtable_entry*)xmalloc(sizeof(struct arg_hashtable_entry)); + e->h = enhanced_hash(h, k); + index = index_for(h->tablelength, e->h); + e->k = k; + e->v = v; + e->next = h->table[index]; + h->table[index] = e; + h->entrycount++; +} + +void* arg_hashtable_search(arg_hashtable_t* h, const void* k) { + struct arg_hashtable_entry* e; + unsigned int hashvalue; + unsigned int index; + + hashvalue = enhanced_hash(h, k); + index = index_for(h->tablelength, hashvalue); + e = h->table[index]; + while (e != NULL) { + /* Check hash value to short circuit heavier comparison */ + if ((hashvalue == e->h) && (h->eqfn(k, e->k))) + return e->v; + e = e->next; + } + return NULL; +} + +void arg_hashtable_remove(arg_hashtable_t* h, const void* k) { + /* + * TODO: consider compacting the table when the load factor drops enough, + * or provide a 'compact' method. + */ + + struct arg_hashtable_entry* e; + struct arg_hashtable_entry** pE; + unsigned int hashvalue; + unsigned int index; + + hashvalue = enhanced_hash(h, k); + index = index_for(h->tablelength, hashvalue); + pE = &(h->table[index]); + e = *pE; + while (NULL != e) { + /* Check hash value to short circuit heavier comparison */ + if ((hashvalue == e->h) && (h->eqfn(k, e->k))) { + *pE = e->next; + h->entrycount--; + xfree(e->k); + xfree(e->v); + xfree(e); + return; + } + pE = &(e->next); + e = e->next; + } +} + +void arg_hashtable_destroy(arg_hashtable_t* h, int free_values) { + unsigned int i; + struct arg_hashtable_entry *e, *f; + struct arg_hashtable_entry** table = h->table; + if (free_values) { + for (i = 0; i < h->tablelength; i++) { + e = table[i]; + while (NULL != e) { + f = e; + e = e->next; + xfree(f->k); + xfree(f->v); + xfree(f); + } + } + } else { + for (i = 0; i < h->tablelength; i++) { + e = table[i]; + while (NULL != e) { + f = e; + e = e->next; + xfree(f->k); + xfree(f); + } + } + } + xfree(h->table); + xfree(h); +} + +arg_hashtable_itr_t* arg_hashtable_itr_create(arg_hashtable_t* h) { + unsigned int i; + unsigned int tablelength; + + arg_hashtable_itr_t* itr = (arg_hashtable_itr_t*)xmalloc(sizeof(arg_hashtable_itr_t)); + itr->h = h; + itr->e = NULL; + itr->parent = NULL; + tablelength = h->tablelength; + itr->index = tablelength; + if (0 == h->entrycount) + return itr; + + for (i = 0; i < tablelength; i++) { + if (h->table[i] != NULL) { + itr->e = h->table[i]; + itr->index = i; + break; + } + } + return itr; +} + +void arg_hashtable_itr_destroy(arg_hashtable_itr_t* itr) { + xfree(itr); +} + +void* arg_hashtable_itr_key(arg_hashtable_itr_t* i) { + return i->e->k; +} + +void* arg_hashtable_itr_value(arg_hashtable_itr_t* i) { + return i->e->v; +} + +int arg_hashtable_itr_advance(arg_hashtable_itr_t* itr) { + unsigned int j; + unsigned int tablelength; + struct arg_hashtable_entry** table; + struct arg_hashtable_entry* next; + + if (itr->e == NULL) + return 0; /* stupidity check */ + + next = itr->e->next; + if (NULL != next) { + itr->parent = itr->e; + itr->e = next; + return -1; + } + + tablelength = itr->h->tablelength; + itr->parent = NULL; + if (tablelength <= (j = ++(itr->index))) { + itr->e = NULL; + return 0; + } + + table = itr->h->table; + while (NULL == (next = table[j])) { + if (++j >= tablelength) { + itr->index = tablelength; + itr->e = NULL; + return 0; + } + } + + itr->index = j; + itr->e = next; + return -1; +} + +int arg_hashtable_itr_remove(arg_hashtable_itr_t* itr) { + struct arg_hashtable_entry* remember_e; + struct arg_hashtable_entry* remember_parent; + int ret; + + /* Do the removal */ + if ((itr->parent) == NULL) { + /* element is head of a chain */ + itr->h->table[itr->index] = itr->e->next; + } else { + /* element is mid-chain */ + itr->parent->next = itr->e->next; + } + /* itr->e is now outside the hashtable */ + remember_e = itr->e; + itr->h->entrycount--; + xfree(remember_e->k); + xfree(remember_e->v); + + /* Advance the iterator, correcting the parent */ + remember_parent = itr->parent; + ret = arg_hashtable_itr_advance(itr); + if (itr->parent == remember_e) { + itr->parent = remember_parent; + } + xfree(remember_e); + return ret; +} + +int arg_hashtable_itr_search(arg_hashtable_itr_t* itr, arg_hashtable_t* h, void* k) { + struct arg_hashtable_entry* e; + struct arg_hashtable_entry* parent; + unsigned int hashvalue; + unsigned int index; + + hashvalue = enhanced_hash(h, k); + index = index_for(h->tablelength, hashvalue); + + e = h->table[index]; + parent = NULL; + while (e != NULL) { + /* Check hash value to short circuit heavier comparison */ + if ((hashvalue == e->h) && (h->eqfn(k, e->k))) { + itr->index = index; + itr->e = e; + itr->parent = parent; + itr->h = h; + return -1; + } + parent = e; + e = e->next; + } + return 0; +} + +int arg_hashtable_change(arg_hashtable_t* h, void* k, void* v) { + struct arg_hashtable_entry* e; + unsigned int hashvalue; + unsigned int index; + + hashvalue = enhanced_hash(h, k); + index = index_for(h->tablelength, hashvalue); + e = h->table[index]; + while (e != NULL) { + /* Check hash value to short circuit heavier comparison */ + if ((hashvalue == e->h) && (h->eqfn(k, e->k))) { + xfree(e->v); + e->v = v; + return -1; + } + e = e->next; + } + return 0; +} +/******************************************************************************* + * arg_dstr: Implements the dynamic string utilities + * + * This file is part of the argtable3 library. + * + * Copyright (C) 2013-2019 Tom G. Huang + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of STEWART HEITMANN 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 COPYRIGHT HOLDERS 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 STEWART HEITMANN 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 "argtable3.h" + +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#endif + +#include +#include +#include + +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable : 4996) +#endif + +#define START_VSNBUFF 16 + +/* + * This dynamic string module is adapted from TclResult.c in the Tcl library. + * Here is the copyright notice from the library: + * + * This software is copyrighted by the Regents of the University of + * California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState + * Corporation and other parties. The following terms apply to all files + * associated with the software unless explicitly disclaimed in + * individual files. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + * + * IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY + * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY + * DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE + * IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE + * NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + * MODIFICATIONS. + * + * GOVERNMENT USE: If you are acquiring this software on behalf of the + * U.S. government, the Government shall have only "Restricted Rights" + * in the software and related documentation as defined in the Federal + * Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you + * are acquiring the software on behalf of the Department of Defense, the + * software shall be classified as "Commercial Computer Software" and the + * Government shall have only "Restricted Rights" as defined in Clause + * 252.227-7014 (b) (3) of DFARs. Notwithstanding the foregoing, the + * authors grant the U.S. Government and others acting in its behalf + * permission to use and distribute the software in accordance with the + * terms specified in this license. + */ + +typedef struct _internal_arg_dstr { + char* data; + arg_dstr_freefn* free_proc; + char sbuf[ARG_DSTR_SIZE + 1]; + char* append_data; + int append_data_size; + int append_used; +} _internal_arg_dstr_t; + +static void setup_append_buf(arg_dstr_t res, int newSpace); + +arg_dstr_t arg_dstr_create(void) { + _internal_arg_dstr_t* h = (_internal_arg_dstr_t*)xmalloc(sizeof(_internal_arg_dstr_t)); + memset(h, 0, sizeof(_internal_arg_dstr_t)); + h->sbuf[0] = 0; + h->data = h->sbuf; + h->free_proc = ARG_DSTR_STATIC; + return h; +} + +void arg_dstr_destroy(arg_dstr_t ds) { + if (ds == NULL) + return; + + arg_dstr_reset(ds); + xfree(ds); + return; +} + +void arg_dstr_set(arg_dstr_t ds, char* str, arg_dstr_freefn* free_proc) { + int length; + register arg_dstr_freefn* old_free_proc = ds->free_proc; + char* old_result = ds->data; + + if (str == NULL) { + ds->sbuf[0] = 0; + ds->data = ds->sbuf; + ds->free_proc = ARG_DSTR_STATIC; + } else if (free_proc == ARG_DSTR_VOLATILE) { + length = (int)strlen(str); + if (length > ARG_DSTR_SIZE) { + ds->data = (char*)xmalloc((unsigned)length + 1); + ds->free_proc = ARG_DSTR_DYNAMIC; + } else { + ds->data = ds->sbuf; + ds->free_proc = ARG_DSTR_STATIC; + } + strcpy(ds->data, str); + } else { + ds->data = str; + ds->free_proc = free_proc; + } + + /* + * If the old result was dynamically-allocated, free it up. Do it here, + * rather than at the beginning, in case the new result value was part of + * the old result value. + */ + + if ((old_free_proc != 0) && (old_result != ds->data)) { + if (old_free_proc == ARG_DSTR_DYNAMIC) { + xfree(old_result); + } else { + (*old_free_proc)(old_result); + } + } + + if ((ds->append_data != NULL) && (ds->append_data_size > 0)) { + xfree(ds->append_data); + ds->append_data = NULL; + ds->append_data_size = 0; + } +} + +char* arg_dstr_cstr(arg_dstr_t ds) /* Interpreter whose result to return. */ +{ + return ds->data; +} + +void arg_dstr_cat(arg_dstr_t ds, const char* str) { + setup_append_buf(ds, (int)strlen(str) + 1); + memcpy(ds->data + strlen(ds->data), str, strlen(str)); +} + +void arg_dstr_catc(arg_dstr_t ds, char c) { + setup_append_buf(ds, 2); + memcpy(ds->data + strlen(ds->data), &c, 1); +} + +/* + * The logic of the `arg_dstr_catf` function is adapted from the `bformat` + * function in The Better String Library by Paul Hsieh. Here is the copyright + * notice from the library: + * + * Copyright (c) 2014, Paul Hsieh + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * 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. + * + * * Neither the name of bstrlib 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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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. + */ +void arg_dstr_catf(arg_dstr_t ds, const char* fmt, ...) { + va_list arglist; + char* buff; + int n, r; + size_t slen; + + if (fmt == NULL) + return; + + /* Since the length is not determinable beforehand, a search is + performed using the truncating "vsnprintf" call (to avoid buffer + overflows) on increasing potential sizes for the output result. */ + + if ((n = (int)(2 * strlen(fmt))) < START_VSNBUFF) + n = START_VSNBUFF; + + buff = (char*)xmalloc(n + 2); + memset(buff, 0, n + 2); + + for (;;) { + va_start(arglist, fmt); + r = vsnprintf(buff, n + 1, fmt, arglist); + va_end(arglist); + + slen = strlen(buff); + if (slen < (size_t)n) + break; + + if (r > n) + n = r; + else + n += n; + + xfree(buff); + buff = (char*)xmalloc(n + 2); + memset(buff, 0, n + 2); + } + + arg_dstr_cat(ds, buff); + xfree(buff); +} + +static void setup_append_buf(arg_dstr_t ds, int new_space) { + int total_space; + + /* + * Make the append buffer larger, if that's necessary, then copy the + * data into the append buffer and make the append buffer the official + * data. + */ + if (ds->data != ds->append_data) { + /* + * If the buffer is too big, then free it up so we go back to a + * smaller buffer. This avoids tying up memory forever after a large + * operation. + */ + if (ds->append_data_size > 500) { + xfree(ds->append_data); + ds->append_data = NULL; + ds->append_data_size = 0; + } + ds->append_used = (int)strlen(ds->data); + } else if (ds->data[ds->append_used] != 0) { + /* + * Most likely someone has modified a result created by + * arg_dstr_cat et al. so that it has a different size. Just + * recompute the size. + */ + ds->append_used = (int)strlen(ds->data); + } + + total_space = new_space + ds->append_used; + if (total_space >= ds->append_data_size) { + char* newbuf; + + if (total_space < 100) { + total_space = 200; + } else { + total_space *= 2; + } + newbuf = (char*)xmalloc((unsigned)total_space); + memset(newbuf, 0, total_space); + strcpy(newbuf, ds->data); + if (ds->append_data != NULL) { + xfree(ds->append_data); + } + ds->append_data = newbuf; + ds->append_data_size = total_space; + } else if (ds->data != ds->append_data) { + strcpy(ds->append_data, ds->data); + } + + arg_dstr_free(ds); + ds->data = ds->append_data; +} + +void arg_dstr_free(arg_dstr_t ds) { + if (ds->free_proc != NULL) { + if (ds->free_proc == ARG_DSTR_DYNAMIC) { + xfree(ds->data); + } else { + (*ds->free_proc)(ds->data); + } + ds->free_proc = NULL; + } +} + +void arg_dstr_reset(arg_dstr_t ds) { + arg_dstr_free(ds); + if ((ds->append_data != NULL) && (ds->append_data_size > 0)) { + xfree(ds->append_data); + ds->append_data = NULL; + ds->append_data_size = 0; + } + + ds->data = ds->sbuf; + ds->sbuf[0] = 0; +} + +#if defined(_MSC_VER) +#pragma warning(pop) +#endif +/* $Id: getopt.h,v 1.1 2009/10/16 19:50:28 rodney Exp rodney $ */ +/* $OpenBSD: getopt.h,v 1.1 2002/12/03 20:24:29 millert Exp $ */ +/* $NetBSD: getopt.h,v 1.4 2000/07/07 10:43:54 ad Exp $ */ + +/* + * Copyright (c) 2000 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Dieter Baron and Thomas Klausner. + * + * 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgment: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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. + */ + +#if ARG_REPLACE_GETOPT == 1 + +#ifndef _GETOPT_H_ +#define _GETOPT_H_ + +/* + * GNU-like getopt_long() and 4.4BSD getsubopt()/optreset extensions + */ +#define no_argument 0 +#define required_argument 1 +#define optional_argument 2 + +struct option { + /* name of long option */ + const char* name; + /* + * one of no_argument, required_argument, and optional_argument: + * whether option takes an argument + */ + int has_arg; + /* if not NULL, set *flag to val when option found */ + int* flag; + /* if flag not NULL, value to set *flag to; else return value */ + int val; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +int getopt_long(int, char* const*, const char*, const struct option*, int*); +int getopt_long_only(int, char* const*, const char*, const struct option*, int*); +#ifndef _GETOPT_DEFINED +#define _GETOPT_DEFINED +int getopt(int, char* const*, const char*); +int getsubopt(char**, char* const*, char**); + +extern char* optarg; /* getopt(3) external variables */ +extern int opterr; +extern int optind; +extern int optopt; +extern int optreset; +extern char* suboptarg; /* getsubopt(3) external variable */ +#endif /* _GETOPT_DEFINED */ + +#ifdef __cplusplus +} +#endif +#endif /* !_GETOPT_H_ */ + +#else +#include +#endif /* ARG_REPLACE_GETOPT */ +/* $Id: getopt_long.c,v 1.1 2009/10/16 19:50:28 rodney Exp rodney $ */ +/* $OpenBSD: getopt_long.c,v 1.23 2007/10/31 12:34:57 chl Exp $ */ +/* $NetBSD: getopt_long.c,v 1.15 2002/01/31 22:43:40 tv Exp $ */ /* * Copyright (c) 2002 Todd C. Miller @@ -191,9 +1319,7 @@ void dbg_printf(const char *fmt, ...) { * Materiel Command, USAF, under agreement number F39502-99-1-0512. */ -// $Id: getopt_long.c,v 1.1 2009/10/16 19:50:28 rodney Exp rodney $" - -/*- +/* * Copyright (c) 2000 The NetBSD Foundation, Inc. * All rights reserved. * @@ -222,45 +1348,45 @@ void dbg_printf(const char *fmt, ...) { * POSSIBILITY OF SUCH DAMAGE. */ -#if 0 -#include +#include "argtable3.h" + +#ifndef ARG_AMALGAMATION +#include "getopt.h" #endif + #include #include #include +#if ARG_REPLACE_GETOPT == 1 +int opterr = 1; /* if error message should be printed */ +int optind = 1; /* index into parent argv vector */ +int optopt = '?'; /* character checked for validity */ +int optreset; /* reset getopt */ +char* optarg; /* argument associated with option */ +#endif /* ARG_REPLACE_GETOPT */ -#define REPLACE_GETOPT /* use this getopt as the system getopt(3) */ +#define PRINT_ERROR ((opterr) && (*options != ':')) -#ifdef REPLACE_GETOPT -int opterr = 1; /* if error message should be printed */ -int optind = 1; /* index into parent argv vector */ -int optopt = '?'; /* character checked for validity */ -int optreset; /* reset getopt */ -const char *optarg; /* argument associated with option */ -#endif - -#define PRINT_ERROR ((opterr) && (*options != ':')) - -#define FLAG_PERMUTE 0x01 /* permute non-options to the end of argv */ -#define FLAG_ALLARGS 0x02 /* treat non-options as args to option "-1" */ -#define FLAG_LONGONLY 0x04 /* operate as getopt_long_only */ +#define FLAG_PERMUTE 0x01 /* permute non-options to the end of argv */ +#define FLAG_ALLARGS 0x02 /* treat non-options as args to option "-1" */ +#define FLAG_LONGONLY 0x04 /* operate as getopt_long_only */ /* return values */ -#define BADCH (int)'?' -#define BADARG ((*options == ':') ? (int)':' : (int)'?') -#define INORDER (int)1 +#define BADCH (int)'?' +#define BADARG ((*options == ':') ? (int)':' : (int)'?') +#define INORDER (int)1 -#define EMSG "" +#define EMSG "" -static int getopt_internal(int, char *const *, const char *, - const struct option *, int *, int); -static int parse_long_options(char *const *, const char *, - const struct option *, int *, int); +#if ARG_REPLACE_GETOPT == 1 +static int getopt_internal(int, char* const*, const char*, const struct option*, int*, int); +#endif /* ARG_REPLACE_GETOPT */ +static int parse_long_options(char* const*, const char*, const struct option*, int*, int); static int gcd(int, int); -static void permute_args(int, int, int, char *const *); +static void permute_args(int, int, int, char* const*); -static const char *place = EMSG; /* option letter processing */ +static char* place = EMSG; /* option letter processing */ /* XXX: set optreset to 1 rather than these two */ static int nonopt_start = -1; /* first non option argument (for permute) */ @@ -274,41 +1400,45 @@ static const char noarg[] = "option doesn't take an argument -- %.*s"; static const char illoptchar[] = "unknown option -- %c"; static const char illoptstring[] = "unknown option -- %s"; - - #ifdef _WIN32 -/* Windows needs warnx(). We change the definition though: +/* + * Windows needs warnx(). We change the definition though: * 1. (another) global is defined, opterrmsg, which holds the error message * 2. errors are always printed out on stderr w/o the program name * Note that opterrmsg always gets set no matter what opterr is set to. The * error message will not be printed if opterr is 0 as usual. */ -#include #include +#include -#define MAX_OPTER_MSG_SIZE 128 +#define MAX_OPTERRMSG_SIZE 128 -extern char opterrmsg[MAX_OPTER_MSG_SIZE]; -char opterrmsg[MAX_OPTER_MSG_SIZE]; /* buffer for the last error message */ +extern char opterrmsg[MAX_OPTERRMSG_SIZE]; +char opterrmsg[MAX_OPTERRMSG_SIZE]; /* buffer for the last error message */ -static void warnx(const char *fmt, ...) { +static void warnx(const char* fmt, ...) { va_list ap; va_start(ap, fmt); - /* - Make sure opterrmsg is always zero-terminated despite the _vsnprintf() - implementation specifics and manually suppress the warning. - */ - memset(opterrmsg, 0, sizeof opterrmsg); + + /* + * Make sure opterrmsg is always zero-terminated despite the _vsnprintf() + * implementation specifics and manually suppress the warning. + */ + memset(opterrmsg, 0, sizeof(opterrmsg)); if (fmt != NULL) -#ifdef __STDC_WANT_SECURE_LIB__ - _vsnprintf_s(opterrmsg, MAX_OPTER_MSG_SIZE, sizeof(opterrmsg) - 1, fmt, ap); +#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || (defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__)) + _vsnprintf_s(opterrmsg, sizeof(opterrmsg), sizeof(opterrmsg) - 1, fmt, ap); #else _vsnprintf(opterrmsg, sizeof(opterrmsg) - 1, fmt, ap); #endif + va_end(ap); +#ifdef _MSC_VER +#pragma warning(suppress : 6053) +#endif fprintf(stderr, "%s\n", opterrmsg); } @@ -316,12 +1446,10 @@ static void warnx(const char *fmt, ...) { #include #endif /*_WIN32*/ - /* * Compute the greatest common divisor of a and b. */ -static int -gcd(int a, int b) { +static int gcd(int a, int b) { int c; c = a % b; @@ -339,44 +1467,42 @@ gcd(int a, int b) { * from nonopt_end to opt_end (keeping the same order of arguments * in each block). */ -static void -permute_args(int panonopt_start, int panonopt_end, int opt_end, - char *const *nargv) { +static void permute_args(int panonopt_start, int panonopt_end, int opt_end, char* const* nargv) { + int cstart, cyclelen, i, j, ncycle, nnonopts, nopts, pos; + char* swap; /* * compute lengths of blocks and number and size of cycles */ - int nnonopts = panonopt_end - panonopt_start; - int nopts = opt_end - panonopt_end; - int ncycle = gcd(nnonopts, nopts); - int cyclelen = (opt_end - panonopt_start) / ncycle; + nnonopts = panonopt_end - panonopt_start; + nopts = opt_end - panonopt_end; + ncycle = gcd(nnonopts, nopts); + cyclelen = (opt_end - panonopt_start) / ncycle; - for (int i = 0; i < ncycle; i++) { - int cstart = panonopt_end + i; - int pos = cstart; - for (int j = 0; j < cyclelen; j++) { + for (i = 0; i < ncycle; i++) { + cstart = panonopt_end + i; + pos = cstart; + for (j = 0; j < cyclelen; j++) { if (pos >= panonopt_end) pos -= nnonopts; else pos += nopts; - char *swap = nargv[pos]; + swap = nargv[pos]; /* LINTED const cast */ - ((char **) nargv)[pos] = nargv[cstart]; + ((char**)nargv)[pos] = nargv[cstart]; /* LINTED const cast */ - ((char **)nargv)[cstart] = swap; + ((char**)nargv)[cstart] = swap; } } } /* * parse_long_options -- - * Parse long options in argc/argv argument vector. + * Parse long options in argc/argv argument vector. * Returns -1 if short_too is set and the option does not match long_options. */ -static int -parse_long_options(char *const *nargv, const char *options, - const struct option *long_options, int *idx, int short_too) { - const char *current_argv, *has_equal; +static int parse_long_options(char* const* nargv, const char* options, const struct option* long_options, int* idx, int short_too) { + char *current_argv, *has_equal; size_t current_argv_len; int i, match; @@ -394,8 +1520,7 @@ parse_long_options(char *const *nargv, const char *options, for (i = 0; long_options[i].name; i++) { /* find matching long option */ - if (strncmp(current_argv, long_options[i].name, - current_argv_len)) + if (strncmp(current_argv, long_options[i].name, current_argv_len)) continue; if (strlen(long_options[i].name) == current_argv_len) { @@ -415,18 +1540,15 @@ parse_long_options(char *const *nargv, const char *options, else { /* ambiguous abbreviation */ if (PRINT_ERROR) - warnx(ambig, (int)current_argv_len, - current_argv); + warnx(ambig, (int)current_argv_len, current_argv); optopt = 0; return (BADCH); } } if (match != -1) { /* option found */ - if (long_options[match].has_arg == no_argument - && has_equal) { + if (long_options[match].has_arg == no_argument && has_equal) { if (PRINT_ERROR) - warnx(noarg, (int)current_argv_len, - current_argv); + warnx(noarg, (int)current_argv_len, current_argv); /* * XXX: GNU sets optopt to val regardless of flag */ @@ -436,27 +1558,23 @@ parse_long_options(char *const *nargv, const char *options, optopt = 0; return (BADARG); } - if (long_options[match].has_arg == required_argument || - long_options[match].has_arg == optional_argument) { + if (long_options[match].has_arg == required_argument || long_options[match].has_arg == optional_argument) { if (has_equal) optarg = has_equal; - else if (long_options[match].has_arg == - required_argument) { + else if (long_options[match].has_arg == required_argument) { /* * optional argument doesn't use next nargv */ optarg = nargv[optind++]; } } - if ((long_options[match].has_arg == required_argument) - && (optarg == NULL)) { + if ((long_options[match].has_arg == required_argument) && (optarg == NULL)) { /* * Missing argument; leading ':' indicates no error * should be generated. */ if (PRINT_ERROR) - warnx(recargstring, - current_argv); + warnx(recargstring, current_argv); /* * XXX: GNU sets optopt to val regardless of flag */ @@ -486,21 +1604,15 @@ parse_long_options(char *const *nargv, const char *options, return (long_options[match].val); } +#if ARG_REPLACE_GETOPT == 1 /* * getopt_internal -- - * Parse argc/argv argument vector. Called by user level routines. + * Parse argc/argv argument vector. Called by user level routines. */ -static int -getopt_internal(int nargc, char *const *nargv, const char *options, - const struct option *long_options, int *idx, int flags) { - char *oli; /* option letter list index */ +static int getopt_internal(int nargc, char* const* nargv, const char* options, const struct option* long_options, int* idx, int flags) { + char* oli; /* option letter list index */ int optchar, short_too; static int posixly_correct = -1; -#ifdef __STDC_WANT_SECURE_LIB__ - char *buffer = NULL; - size_t buffer_size = 0; - errno_t err = 0; -#endif if (options == NULL) return (-1); @@ -509,18 +1621,14 @@ getopt_internal(int nargc, char *const *nargv, const char *options, * Disable GNU extensions if POSIXLY_CORRECT is set or options * string begins with a '+'. */ - -#ifdef __STDC_WANT_SECURE_LIB__ - if (posixly_correct == -1) { - err = _dupenv_s(&buffer, &buffer_size, "POSIXLY_CORRECT") == 0; - posixly_correct = buffer != NULL; - if (buffer != NULL && err == 0) { - free(buffer); - } - } -#else if (posixly_correct == -1) +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable : 4996) +#endif posixly_correct = (getenv("POSIXLY_CORRECT") != NULL); +#if defined(_MSC_VER) +#pragma warning(pop) #endif if (posixly_correct || *options == '+') flags &= ~FLAG_PERMUTE; @@ -546,8 +1654,7 @@ start: place = EMSG; if (nonopt_end != -1) { /* do permutation, if we have to */ - permute_args(nonopt_start, nonopt_end, - optind, nargv); + permute_args(nonopt_start, nonopt_end, optind, nargv); optind -= nonopt_end - nonopt_start; } else if (nonopt_start != -1) { /* @@ -559,8 +1666,7 @@ start: nonopt_start = nonopt_end = -1; return (-1); } - if (*(place = nargv[optind]) != '-' || - (place[1] == '\0' && strchr(options, '-') == NULL)) { + if (*(place = nargv[optind]) != '-' || (place[1] == '\0' && strchr(options, '-') == NULL)) { place = EMSG; /* found non-option */ if (flags & FLAG_ALLARGS) { /* @@ -581,10 +1687,8 @@ start: if (nonopt_start == -1) nonopt_start = optind; else if (nonopt_end != -1) { - permute_args(nonopt_start, nonopt_end, - optind, nargv); - nonopt_start = optind - - (nonopt_end - nonopt_start); + permute_args(nonopt_start, nonopt_end, optind, nargv); + nonopt_start = optind - (nonopt_end - nonopt_start); nonopt_end = -1; } optind++; @@ -605,8 +1709,7 @@ start: * non-options, we have to permute. */ if (nonopt_end != -1) { - permute_args(nonopt_start, nonopt_end, - optind, nargv); + permute_args(nonopt_start, nonopt_end, optind, nargv); optind -= nonopt_end - nonopt_start; } nonopt_start = nonopt_end = -1; @@ -620,25 +1723,21 @@ start: * 2) the arg is not just "-" * 3) either the arg starts with -- we are getopt_long_only() */ - if (long_options != NULL && place != nargv[optind] && - (*place == '-' || (flags & FLAG_LONGONLY))) { + if (long_options != NULL && place != nargv[optind] && (*place == '-' || (flags & FLAG_LONGONLY))) { short_too = 0; if (*place == '-') place++; /* --foo long option */ else if (*place != ':' && strchr(options, *place) != NULL) short_too = 1; /* could be short option too */ - optchar = parse_long_options(nargv, options, long_options, - idx, short_too); + optchar = parse_long_options(nargv, options, long_options, idx, short_too); if (optchar != -1) { place = EMSG; return (optchar); } } - if ((optchar = (int) * place++) == (int)':' || - (optchar == (int)'-' && *place != '\0') || - (oli = strchr(options, optchar)) == NULL) { + if ((optchar = (int)*place++) == (int)':' || (optchar == (int)'-' && *place != '\0') || (oli = strchr(options, optchar)) == NULL) { /* * If the user specified "-" and '-' isn't listed in * options, return -1 (non-option) as per POSIX. @@ -655,7 +1754,7 @@ start: } if (long_options != NULL && optchar == 'W' && oli[1] == ';') { /* -W long-option */ - if (*place) /* no space */ + if (*place) /* no space */ /* NOTHING */; else if (++optind >= nargc) { /* no arg */ place = EMSG; @@ -663,22 +1762,21 @@ start: warnx(recargchar, optchar); optopt = optchar; return (BADARG); - } else /* white space */ + } else /* white space */ place = nargv[optind]; - optchar = parse_long_options(nargv, options, long_options, - idx, 0); + optchar = parse_long_options(nargv, options, long_options, idx, 0); place = EMSG; return (optchar); } - if (*++oli != ':') { /* doesn't take argument */ + if (*++oli != ':') { /* doesn't take argument */ if (!*place) ++optind; - } else { /* takes (optional) argument */ + } else { /* takes (optional) argument */ optarg = NULL; - if (*place) /* no white space */ + if (*place) /* no white space */ optarg = place; - else if (oli[1] != ':') { /* arg not optional */ - if (++optind >= nargc) { /* no arg */ + else if (oli[1] != ':') { /* arg not optional */ + if (++optind >= nargc) { /* no arg */ place = EMSG; if (PRINT_ERROR) warnx(recargchar, optchar); @@ -694,16 +1792,13 @@ start: return (optchar); } -#ifdef REPLACE_GETOPT /* * getopt -- - * Parse argc/argv argument vector. + * Parse argc/argv argument vector. * * [eventually this will replace the BSD getopt] */ -int -getopt(int nargc, char *const *nargv, const char *options) { - +int getopt(int nargc, char* const* nargv, const char* options) { /* * We don't pass FLAG_PERMUTE to getopt_internal() since * the BSD getopt(3) (unlike GNU) has never done this. @@ -714,32 +1809,26 @@ getopt(int nargc, char *const *nargv, const char *options) { */ return (getopt_internal(nargc, nargv, options, NULL, NULL, 0)); } -#endif /* REPLACE_GETOPT */ +#endif /* ARG_REPLACE_GETOPT */ /* * getopt_long -- - * Parse argc/argv argument vector. + * Parse argc/argv argument vector. */ -int -getopt_long(int nargc, char *const *nargv, const char *options, - const struct option *long_options, int *idx) { - - return (getopt_internal(nargc, nargv, options, long_options, idx, - FLAG_PERMUTE)); +int getopt_long(int nargc, char* const* nargv, const char* options, const struct option* long_options, int* idx) { + return (getopt_internal(nargc, nargv, options, long_options, idx, FLAG_PERMUTE)); } /* * getopt_long_only -- - * Parse argc/argv argument vector. + * Parse argc/argv argument vector. */ -int -getopt_long_only(int nargc, char *const *nargv, const char *options, - const struct option *long_options, int *idx) { - - return (getopt_internal(nargc, nargv, options, long_options, idx, - FLAG_PERMUTE | FLAG_LONGONLY)); +int getopt_long_only(int nargc, char* const* nargv, const char* options, const struct option* long_options, int* idx) { + return (getopt_internal(nargc, nargv, options, long_options, idx, FLAG_PERMUTE | FLAG_LONGONLY)); } /******************************************************************************* + * arg_date: Implements the date command-line option + * * This file is part of the argtable3 library. * * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann @@ -769,31 +1858,32 @@ getopt_long_only(int nargc, char *const *nargv, const char *options, * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ +#include "argtable3.h" + +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#endif + #include #include -#include "argtable3.h" +char* arg_strptime(const char* buf, const char* fmt, struct tm* tm); - -char *arg_strptime(const char *buf, const char *fmt, struct tm *tm); - - -static void arg_date_resetfn(struct arg_date *parent) { +static void arg_date_resetfn(struct arg_date* parent) { ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent)); parent->count = 0; } - -static int arg_date_scanfn(struct arg_date *parent, const char *argval) { +static int arg_date_scanfn(struct arg_date* parent, const char* argval) { int errorcode = 0; if (parent->count == parent->hdr.maxcount) { - errorcode = EMAXCOUNT; + errorcode = ARG_ERR_MAXCOUNT; } else if (!argval) { /* no argument value was given, leave parent->tmval[] unaltered but still count it */ parent->count++; } else { - const char *pend; + const char* pend; struct tm tm = parent->tmval[parent->count]; /* parse the given argument value, store result in parent->tmval[] */ @@ -801,92 +1891,66 @@ static int arg_date_scanfn(struct arg_date *parent, const char *argval) { if (pend && pend[0] == '\0') parent->tmval[parent->count++] = tm; else - errorcode = EBADDATE; + errorcode = ARG_ERR_BADDATE; } ARG_TRACE(("%s:scanfn(%p) returns %d\n", __FILE__, parent, errorcode)); return errorcode; } - -static int arg_date_checkfn(struct arg_date *parent) { - int errorcode = (parent->count < parent->hdr.mincount) ? EMINCOUNT : 0; +static int arg_date_checkfn(struct arg_date* parent) { + int errorcode = (parent->count < parent->hdr.mincount) ? ARG_ERR_MINCOUNT : 0; ARG_TRACE(("%s:checkfn(%p) returns %d\n", __FILE__, parent, errorcode)); return errorcode; } - -static void arg_date_errorfn( - struct arg_date *parent, - FILE *fp, - int errorcode, - const char *argval, - const char *progname) { - const char *shortopts = parent->hdr.shortopts; - const char *longopts = parent->hdr.longopts; - const char *datatype = parent->hdr.datatype; +static void arg_date_errorfn(struct arg_date* parent, arg_dstr_t ds, int errorcode, const char* argval, const char* progname) { + const char* shortopts = parent->hdr.shortopts; + const char* longopts = parent->hdr.longopts; + const char* datatype = parent->hdr.datatype; /* make argval NULL safe */ argval = argval ? argval : ""; - fprintf(fp, "%s: ", progname); + arg_dstr_catf(ds, "%s: ", progname); switch (errorcode) { - case EMINCOUNT: - fputs("missing option ", fp); - arg_print_option(fp, shortopts, longopts, datatype, "\n"); + case ARG_ERR_MINCOUNT: + arg_dstr_cat(ds, "missing option "); + arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); break; - case EMAXCOUNT: - fputs("excess option ", fp); - arg_print_option(fp, shortopts, longopts, argval, "\n"); + case ARG_ERR_MAXCOUNT: + arg_dstr_cat(ds, "excess option "); + arg_print_option_ds(ds, shortopts, longopts, argval, "\n"); break; - case EBADDATE: { + case ARG_ERR_BADDATE: { struct tm tm; char buff[200]; - fprintf(fp, "illegal timestamp format \"%s\"\n", argval); + arg_dstr_catf(ds, "illegal timestamp format \"%s\"\n", argval); memset(&tm, 0, sizeof(tm)); arg_strptime("1999-12-31 23:59:59", "%F %H:%M:%S", &tm); strftime(buff, sizeof(buff), parent->format, &tm); - printf("correct format is \"%s\"\n", buff); + arg_dstr_catf(ds, "correct format is \"%s\"\n", buff); break; } } } - -struct arg_date *arg_date0( - const char *shortopts, - const char *longopts, - const char *format, - const char *datatype, - const char *glossary) { +struct arg_date* arg_date0(const char* shortopts, const char* longopts, const char* format, const char* datatype, const char* glossary) { return arg_daten(shortopts, longopts, format, datatype, 0, 1, glossary); } - -struct arg_date *arg_date1( - const char *shortopts, - const char *longopts, - const char *format, - const char *datatype, - const char *glossary) { +struct arg_date* arg_date1(const char* shortopts, const char* longopts, const char* format, const char* datatype, const char* glossary) { return arg_daten(shortopts, longopts, format, datatype, 1, 1, glossary); } - -struct arg_date *arg_daten( - const char *shortopts, - const char *longopts, - const char *format, - const char *datatype, - int mincount, - int maxcount, - const char *glossary) { +struct arg_date* +arg_daten(const char* shortopts, const char* longopts, const char* format, const char* datatype, int mincount, int maxcount, const char* glossary) { size_t nbytes; - struct arg_date *result; + struct arg_date* result; /* foolproof things by ensuring maxcount is not less than mincount */ maxcount = (maxcount < mincount) ? mincount : maxcount; @@ -896,39 +1960,37 @@ struct arg_date *arg_daten( format = "%x"; nbytes = sizeof(struct arg_date) /* storage for struct arg_date */ - + maxcount * sizeof(struct tm); /* storage for tmval[maxcount] array */ + + maxcount * sizeof(struct tm); /* storage for tmval[maxcount] array */ /* allocate storage for the arg_date struct + tmval[] array. */ /* we use calloc because we want the tmval[] array zero filled. */ - result = (struct arg_date *)calloc(1, nbytes); - if (result) { - /* init the arg_hdr struct */ - result->hdr.flag = ARG_HASVALUE; - result->hdr.shortopts = shortopts; - result->hdr.longopts = longopts; - result->hdr.datatype = datatype ? datatype : format; - result->hdr.glossary = glossary; - result->hdr.mincount = mincount; - result->hdr.maxcount = maxcount; - result->hdr.parent = result; - result->hdr.resetfn = (arg_resetfn *)arg_date_resetfn; - result->hdr.scanfn = (arg_scanfn *)arg_date_scanfn; - result->hdr.checkfn = (arg_checkfn *)arg_date_checkfn; - result->hdr.errorfn = (arg_errorfn *)arg_date_errorfn; + result = (struct arg_date*)xcalloc(1, nbytes); - /* store the tmval[maxcount] array immediately after the arg_date struct */ - result->tmval = (struct tm *)(result + 1); + /* init the arg_hdr struct */ + result->hdr.flag = ARG_HASVALUE; + result->hdr.shortopts = shortopts; + result->hdr.longopts = longopts; + result->hdr.datatype = datatype ? datatype : format; + result->hdr.glossary = glossary; + result->hdr.mincount = mincount; + result->hdr.maxcount = maxcount; + result->hdr.parent = result; + result->hdr.resetfn = (arg_resetfn*)arg_date_resetfn; + result->hdr.scanfn = (arg_scanfn*)arg_date_scanfn; + result->hdr.checkfn = (arg_checkfn*)arg_date_checkfn; + result->hdr.errorfn = (arg_errorfn*)arg_date_errorfn; - /* init the remaining arg_date member variables */ - result->count = 0; - result->format = format; - } + /* store the tmval[maxcount] array immediately after the arg_date struct */ + result->tmval = (struct tm*)(result + 1); + + /* init the remaining arg_date member variables */ + result->count = 0; + result->format = format; ARG_TRACE(("arg_daten() returns %p\n", result)); return result; } - /*- * Copyright (c) 1997, 1998, 2005, 2008 The NetBSD Foundation, Inc. * All rights reserved. @@ -966,40 +2028,31 @@ struct arg_date *arg_daten( * We do not implement alternate representations. However, we always * check whether a given modifier is allowed for a certain conversion. */ -#define ALT_E 0x01 -#define ALT_O 0x02 -#define LEGAL_ALT(x) { if (alt_format & ~(x)) return (0); } -#define TM_YEAR_BASE (1900) +#define ALT_E 0x01 +#define ALT_O 0x02 +#define LEGAL_ALT(x) \ + { \ + if (alt_format & ~(x)) \ + return (0); \ + } +#define TM_YEAR_BASE (1900) -static int conv_num(const char * *, int *, int, int); +static int conv_num(const char**, int*, int, int); -static const char *day[7] = { - "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", - "Friday", "Saturday" -}; +static const char* day[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; -static const char *abday[7] = { - "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" -}; +static const char* abday[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; -static const char *mon[12] = { - "January", "February", "March", "April", "May", "June", "July", - "August", "September", "October", "November", "December" -}; +static const char* mon[12] = {"January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December"}; -static const char *abmon[12] = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" -}; +static const char* abmon[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; -static const char *am_pm[2] = { - "AM", "PM" -}; +static const char* am_pm[2] = {"AM", "PM"}; - -static int arg_strcasecmp(const char *s1, const char *s2) { - const unsigned char *us1 = (const unsigned char *)s1; - const unsigned char *us2 = (const unsigned char *)s2; +static int arg_strcasecmp(const char* s1, const char* s2) { + const unsigned char* us1 = (const unsigned char*)s1; + const unsigned char* us2 = (const unsigned char*)s2; while (tolower(*us1) == tolower(*us2++)) if (*us1++ == '\0') return 0; @@ -1007,11 +2060,10 @@ static int arg_strcasecmp(const char *s1, const char *s2) { return tolower(*us1) - tolower(*--us2); } - -static int arg_strncasecmp(const char *s1, const char *s2, size_t n) { +static int arg_strncasecmp(const char* s1, const char* s2, size_t n) { if (n != 0) { - const unsigned char *us1 = (const unsigned char *)s1; - const unsigned char *us2 = (const unsigned char *)s2; + const unsigned char* us1 = (const unsigned char*)s1; + const unsigned char* us2 = (const unsigned char*)s2; do { if (tolower(*us1) != tolower(*us2++)) return tolower(*us1) - tolower(*--us2); @@ -1024,10 +2076,9 @@ static int arg_strncasecmp(const char *s1, const char *s2, size_t n) { return 0; } - -char *arg_strptime(const char *buf, const char *fmt, struct tm *tm) { +char* arg_strptime(const char* buf, const char* fmt, struct tm* tm) { char c; - const char *bp; + const char* bp; size_t len = 0; int alt_format, i, split_year = 0; @@ -1038,8 +2089,8 @@ char *arg_strptime(const char *buf, const char *fmt, struct tm *tm) { alt_format = 0; /* Eat up white-space. */ - if (ISSPACE(c)) { - while (ISSPACE(*bp)) + if (isspace(c)) { + while (isspace(*bp)) bp++; fmt++; @@ -1049,11 +2100,10 @@ char *arg_strptime(const char *buf, const char *fmt, struct tm *tm) { if ((c = *fmt++) != '%') goto literal; - -again: + again: switch (c = *fmt++) { case '%': /* "%%" is converted to "%". */ -literal: + literal: if (c != *bp++) return (0); break; @@ -1312,24 +2362,20 @@ literal: case 'n': /* Any kind of white-space. */ case 't': LEGAL_ALT(0); - while (ISSPACE(*bp)) + while (isspace(*bp)) bp++; break; - default: /* Unknown/unsupported conversion. */ return (0); } - - } /* LINTED functional specification */ - return ((char *)bp); + return ((char*)bp); } - -static int conv_num(const char * *buf, int *dest, int llim, int ulim) { +static int conv_num(const char** buf, int* dest, int llim, int ulim) { int result = 0; /* The limit also determines the number of valid digits. */ @@ -1351,6 +2397,8 @@ static int conv_num(const char * *buf, int *dest, int llim, int ulim) { return (1); } /******************************************************************************* + * arg_dbl: Implements the double command-line option + * * This file is part of the argtable3 library. * * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann @@ -1380,23 +2428,25 @@ static int conv_num(const char * *buf, int *dest, int llim, int ulim) { * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ -#include - #include "argtable3.h" +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#endif -static void arg_dbl_resetfn(struct arg_dbl *parent) { +#include + +static void arg_dbl_resetfn(struct arg_dbl* parent) { ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent)); parent->count = 0; } - -static int arg_dbl_scanfn(struct arg_dbl *parent, const char *argval) { +static int arg_dbl_scanfn(struct arg_dbl* parent, const char* argval) { int errorcode = 0; if (parent->count == parent->hdr.maxcount) { /* maximum number of arguments exceeded */ - errorcode = EMAXCOUNT; + errorcode = ARG_ERR_MAXCOUNT; } else if (!argval) { /* a valid argument with no argument value was given. */ /* This happens when an optional argument value was invoked. */ @@ -1404,7 +2454,7 @@ static int arg_dbl_scanfn(struct arg_dbl *parent, const char *argval) { parent->count++; } else { double val; - char *end; + char* end; /* extract double from argval into val */ val = strtod(argval, &end); @@ -1413,125 +2463,101 @@ static int arg_dbl_scanfn(struct arg_dbl *parent, const char *argval) { if (*end == 0) parent->dval[parent->count++] = val; else - errorcode = EBADDOUBLE; + errorcode = ARG_ERR_BADDOUBLE; } ARG_TRACE(("%s:scanfn(%p) returns %d\n", __FILE__, parent, errorcode)); return errorcode; } - -static int arg_dbl_checkfn(struct arg_dbl *parent) { - int errorcode = (parent->count < parent->hdr.mincount) ? EMINCOUNT : 0; +static int arg_dbl_checkfn(struct arg_dbl* parent) { + int errorcode = (parent->count < parent->hdr.mincount) ? ARG_ERR_MINCOUNT : 0; ARG_TRACE(("%s:checkfn(%p) returns %d\n", __FILE__, parent, errorcode)); return errorcode; } - -static void arg_dbl_errorfn( - struct arg_dbl *parent, - FILE *fp, - int errorcode, - const char *argval, - const char *progname) { - const char *shortopts = parent->hdr.shortopts; - const char *longopts = parent->hdr.longopts; - const char *datatype = parent->hdr.datatype; +static void arg_dbl_errorfn(struct arg_dbl* parent, arg_dstr_t ds, int errorcode, const char* argval, const char* progname) { + const char* shortopts = parent->hdr.shortopts; + const char* longopts = parent->hdr.longopts; + const char* datatype = parent->hdr.datatype; /* make argval NULL safe */ argval = argval ? argval : ""; - fprintf(fp, "%s: ", progname); + arg_dstr_catf(ds, "%s: ", progname); switch (errorcode) { - case EMINCOUNT: - fputs("missing option ", fp); - arg_print_option(fp, shortopts, longopts, datatype, "\n"); + case ARG_ERR_MINCOUNT: + arg_dstr_cat(ds, "missing option "); + arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); break; - case EMAXCOUNT: - fputs("excess option ", fp); - arg_print_option(fp, shortopts, longopts, argval, "\n"); + case ARG_ERR_MAXCOUNT: + arg_dstr_cat(ds, "excess option "); + arg_print_option_ds(ds, shortopts, longopts, argval, "\n"); break; - case EBADDOUBLE: - fprintf(fp, "invalid argument \"%s\" to option ", argval); - arg_print_option(fp, shortopts, longopts, datatype, "\n"); + case ARG_ERR_BADDOUBLE: + arg_dstr_catf(ds, "invalid argument \"%s\" to option ", argval); + arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); break; } } - -struct arg_dbl *arg_dbl0( - const char *shortopts, - const char *longopts, - const char *datatype, - const char *glossary) { +struct arg_dbl* arg_dbl0(const char* shortopts, const char* longopts, const char* datatype, const char* glossary) { return arg_dbln(shortopts, longopts, datatype, 0, 1, glossary); } - -struct arg_dbl *arg_dbl1( - const char *shortopts, - const char *longopts, - const char *datatype, - const char *glossary) { +struct arg_dbl* arg_dbl1(const char* shortopts, const char* longopts, const char* datatype, const char* glossary) { return arg_dbln(shortopts, longopts, datatype, 1, 1, glossary); } - -struct arg_dbl *arg_dbln( - const char *shortopts, - const char *longopts, - const char *datatype, - int mincount, - int maxcount, - const char *glossary) { +struct arg_dbl* arg_dbln(const char* shortopts, const char* longopts, const char* datatype, int mincount, int maxcount, const char* glossary) { size_t nbytes; - struct arg_dbl *result; + struct arg_dbl* result; + size_t addr; + size_t rem; /* foolproof things by ensuring maxcount is not less than mincount */ maxcount = (maxcount < mincount) ? mincount : maxcount; - nbytes = sizeof(struct arg_dbl) /* storage for struct arg_dbl */ + nbytes = sizeof(struct arg_dbl) /* storage for struct arg_dbl */ + (maxcount + 1) * sizeof(double); /* storage for dval[maxcount] array plus one extra for padding to memory boundary */ - result = (struct arg_dbl *)malloc(nbytes); - if (result) { - size_t addr; - size_t rem; + result = (struct arg_dbl*)xmalloc(nbytes); - /* init the arg_hdr struct */ - result->hdr.flag = ARG_HASVALUE; - result->hdr.shortopts = shortopts; - result->hdr.longopts = longopts; - result->hdr.datatype = datatype ? datatype : ""; - result->hdr.glossary = glossary; - result->hdr.mincount = mincount; - result->hdr.maxcount = maxcount; - result->hdr.parent = result; - result->hdr.resetfn = (arg_resetfn *)arg_dbl_resetfn; - result->hdr.scanfn = (arg_scanfn *)arg_dbl_scanfn; - result->hdr.checkfn = (arg_checkfn *)arg_dbl_checkfn; - result->hdr.errorfn = (arg_errorfn *)arg_dbl_errorfn; + /* init the arg_hdr struct */ + result->hdr.flag = ARG_HASVALUE; + result->hdr.shortopts = shortopts; + result->hdr.longopts = longopts; + result->hdr.datatype = datatype ? datatype : ""; + result->hdr.glossary = glossary; + result->hdr.mincount = mincount; + result->hdr.maxcount = maxcount; + result->hdr.parent = result; + result->hdr.resetfn = (arg_resetfn*)arg_dbl_resetfn; + result->hdr.scanfn = (arg_scanfn*)arg_dbl_scanfn; + result->hdr.checkfn = (arg_checkfn*)arg_dbl_checkfn; + result->hdr.errorfn = (arg_errorfn*)arg_dbl_errorfn; - /* Store the dval[maxcount] array on the first double boundary that - * immediately follows the arg_dbl struct. We do the memory alignment - * purely for SPARC and Motorola systems. They require floats and - * doubles to be aligned on natural boundaries. - */ - addr = (size_t)(result + 1); - rem = addr % sizeof(double); - result->dval = (double *)(addr + sizeof(double) - rem); - ARG_TRACE(("addr=%zu, dval=%p, sizeof(double)=%d rem=%d\n", addr, result->dval, (int)sizeof(double), (int)rem)); + /* Store the dval[maxcount] array on the first double boundary that + * immediately follows the arg_dbl struct. We do the memory alignment + * purely for SPARC and Motorola systems. They require floats and + * doubles to be aligned on natural boundaries. + */ + addr = (size_t)(result + 1); + rem = addr % sizeof(double); + result->dval = (double*)(addr + sizeof(double) - rem); + ARG_TRACE(("addr=%p, dval=%p, sizeof(double)=%d rem=%d\n", addr, result->dval, (int)sizeof(double), (int)rem)); - result->count = 0; - } + result->count = 0; ARG_TRACE(("arg_dbln() returns %p\n", result)); return result; } /******************************************************************************* + * arg_end: Implements the error handling utilities + * * This file is part of the argtable3 library. * * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann @@ -1561,108 +2587,107 @@ struct arg_dbl *arg_dbln( * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ -#include - #include "argtable3.h" +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#endif -static void arg_end_resetfn(struct arg_end *parent) { +#include + +static void arg_end_resetfn(struct arg_end* parent) { ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent)); parent->count = 0; } -static void arg_end_errorfn( - void *parent, - FILE *fp, - int error, - const char *argval, - const char *progname) { +static void arg_end_errorfn(void* parent, arg_dstr_t ds, int error, const char* argval, const char* progname) { /* suppress unreferenced formal parameter warning */ (void)parent; progname = progname ? progname : ""; argval = argval ? argval : ""; - fprintf(fp, "%s: ", progname); + arg_dstr_catf(ds, "%s: ", progname); switch (error) { case ARG_ELIMIT: - fputs("too many errors to display", fp); + arg_dstr_cat(ds, "too many errors to display"); break; case ARG_EMALLOC: - fputs("insufficent memory", fp); + arg_dstr_cat(ds, "insufficient memory"); break; case ARG_ENOMATCH: - fprintf(fp, "unexpected argument \"%s\"", argval); + arg_dstr_catf(ds, "unexpected argument \"%s\"", argval); break; case ARG_EMISSARG: - fprintf(fp, "option \"%s\" requires an argument", argval); + arg_dstr_catf(ds, "option \"%s\" requires an argument", argval); break; case ARG_ELONGOPT: - fprintf(fp, "invalid option \"%s\"", argval); + arg_dstr_catf(ds, "invalid option \"%s\"", argval); break; default: - fprintf(fp, "invalid option \"-%c\"", error); + arg_dstr_catf(ds, "invalid option \"-%c\"", error); break; } - fputc('\n', fp); + arg_dstr_cat(ds, "\n"); } - -struct arg_end *arg_end(int maxcount) { +struct arg_end* arg_end(int maxcount) { size_t nbytes; - struct arg_end *result; + struct arg_end* result; - nbytes = sizeof(struct arg_end) - + maxcount * sizeof(int) /* storage for int error[maxcount] array*/ - + maxcount * sizeof(void *) /* storage for void* parent[maxcount] array */ - + maxcount * sizeof(char *); /* storage for char* argval[maxcount] array */ + nbytes = sizeof(struct arg_end) + maxcount * sizeof(int) /* storage for int error[maxcount] array*/ + + maxcount * sizeof(void*) /* storage for void* parent[maxcount] array */ + + maxcount * sizeof(char*); /* storage for char* argval[maxcount] array */ - result = (struct arg_end *)malloc(nbytes); - if (result) { - /* init the arg_hdr struct */ - result->hdr.flag = ARG_TERMINATOR; - result->hdr.shortopts = NULL; - result->hdr.longopts = NULL; - result->hdr.datatype = NULL; - result->hdr.glossary = NULL; - result->hdr.mincount = 1; - result->hdr.maxcount = maxcount; - result->hdr.parent = result; - result->hdr.resetfn = (arg_resetfn *)arg_end_resetfn; - result->hdr.scanfn = NULL; - result->hdr.checkfn = NULL; - result->hdr.errorfn = (arg_errorfn *)arg_end_errorfn; + result = (struct arg_end*)xmalloc(nbytes); - /* store error[maxcount] array immediately after struct arg_end */ - result->error = (int *)(result + 1); + /* init the arg_hdr struct */ + result->hdr.flag = ARG_TERMINATOR; + result->hdr.shortopts = NULL; + result->hdr.longopts = NULL; + result->hdr.datatype = NULL; + result->hdr.glossary = NULL; + result->hdr.mincount = 1; + result->hdr.maxcount = maxcount; + result->hdr.parent = result; + result->hdr.resetfn = (arg_resetfn*)arg_end_resetfn; + result->hdr.scanfn = NULL; + result->hdr.checkfn = NULL; + result->hdr.errorfn = (arg_errorfn*)arg_end_errorfn; - /* store parent[maxcount] array immediately after error[] array */ - result->parent = (void * *)(result->error + maxcount); + /* store error[maxcount] array immediately after struct arg_end */ + result->error = (int*)(result + 1); - /* store argval[maxcount] array immediately after parent[] array */ - result->argval = (const char * *)(result->parent + maxcount); - } + /* store parent[maxcount] array immediately after error[] array */ + result->parent = (void**)(result->error + maxcount); + + /* store argval[maxcount] array immediately after parent[] array */ + result->argval = (const char**)(result->parent + maxcount); ARG_TRACE(("arg_end(%d) returns %p\n", maxcount, result)); return result; } - -void arg_print_errors(FILE *fp, struct arg_end *end, const char *progname) { +void arg_print_errors_ds(arg_dstr_t ds, struct arg_end* end, const char* progname) { int i; ARG_TRACE(("arg_errors()\n")); for (i = 0; i < end->count; i++) { - struct arg_hdr *errorparent = (struct arg_hdr *)(end->parent[i]); + struct arg_hdr* errorparent = (struct arg_hdr*)(end->parent[i]); if (errorparent->errorfn) - errorparent->errorfn(end->parent[i], - fp, - end->error[i], - end->argval[i], - progname); + errorparent->errorfn(end->parent[i], ds, end->error[i], end->argval[i], progname); } } + +void arg_print_errors(FILE* fp, struct arg_end* end, const char* progname) { + arg_dstr_t ds = arg_dstr_create(); + arg_print_errors_ds(ds, end, progname); + fputs(arg_dstr_cstr(ds), fp); + arg_dstr_destroy(ds); +} /******************************************************************************* + * arg_file: Implements the file command-line option + * * This file is part of the argtable3 library. * * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann @@ -1692,28 +2717,30 @@ void arg_print_errors(FILE *fp, struct arg_end *end, const char *progname) { * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ -#include -#include - #include "argtable3.h" -#ifdef WIN32 -# define FILESEPARATOR1 '\\' -# define FILESEPARATOR2 '/' -#else -# define FILESEPARATOR1 '/' -# define FILESEPARATOR2 '/' +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" #endif +#include +#include -static void arg_file_resetfn(struct arg_file *parent) { +#ifdef WIN32 +#define FILESEPARATOR1 '\\' +#define FILESEPARATOR2 '/' +#else +#define FILESEPARATOR1 '/' +#define FILESEPARATOR2 '/' +#endif + +static void arg_file_resetfn(struct arg_file* parent) { ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent)); parent->count = 0; } - /* Returns ptr to the base filename within *filename */ -static const char *arg_basename(const char *filename) { +static const char* arg_basename(const char* filename) { const char *result = NULL, *result1, *result2; /* Find the last occurrence of eother file separator character. */ @@ -1723,13 +2750,13 @@ static const char *arg_basename(const char *filename) { result2 = (filename ? strrchr(filename, FILESEPARATOR2) : NULL); if (result2) - result = result2 + 1; /* using FILESEPARATOR2 (the alternative file separator) */ + result = result2 + 1; /* using FILESEPARATOR2 (the alternative file separator) */ if (result1) - result = result1 + 1; /* using FILESEPARATOR1 (the preferred file separator) */ + result = result1 + 1; /* using FILESEPARATOR1 (the preferred file separator) */ if (!result) - result = filename; /* neither file separator was found so basename is the whole filename */ + result = filename; /* neither file separator was found so basename is the whole filename */ /* special cases of "." and ".." are not considered basenames */ if (result && (strcmp(".", result) == 0 || strcmp("..", result) == 0)) @@ -1738,11 +2765,10 @@ static const char *arg_basename(const char *filename) { return result; } - /* Returns ptr to the file extension within *basename */ -static const char *arg_extension(const char *basename) { +static const char* arg_extension(const char* basename) { /* find the last occurrence of '.' in basename */ - const char *result = (basename ? strrchr(basename, '.') : NULL); + const char* result = (basename ? strrchr(basename, '.') : NULL); /* if no '.' was found then return pointer to end of basename */ if (basename && !result) @@ -1759,23 +2785,22 @@ static const char *arg_extension(const char *basename) { return result; } - -static int arg_file_scanfn(struct arg_file *parent, const char *argval) { +static int arg_file_scanfn(struct arg_file* parent, const char* argval) { int errorcode = 0; if (parent->count == parent->hdr.maxcount) { /* maximum number of arguments exceeded */ - errorcode = EMAXCOUNT; + errorcode = ARG_ERR_MAXCOUNT; } else if (!argval) { /* a valid argument with no argument value was given. */ /* This happens when an optional argument value was invoked. */ /* leave parent arguiment value unaltered but still count the argument. */ parent->count++; } else { - parent->filename[parent->count] = argval; - parent->basename[parent->count] = arg_basename(argval); + parent->filename[parent->count] = argval; + parent->basename[parent->count] = arg_basename(argval); parent->extension[parent->count] = - arg_extension(parent->basename[parent->count]); /* only seek extensions within the basename (not the file path)*/ + arg_extension(parent->basename[parent->count]); /* only seek extensions within the basename (not the file path)*/ parent->count++; } @@ -1783,118 +2808,94 @@ static int arg_file_scanfn(struct arg_file *parent, const char *argval) { return errorcode; } - -static int arg_file_checkfn(struct arg_file *parent) { - int errorcode = (parent->count < parent->hdr.mincount) ? EMINCOUNT : 0; +static int arg_file_checkfn(struct arg_file* parent) { + int errorcode = (parent->count < parent->hdr.mincount) ? ARG_ERR_MINCOUNT : 0; ARG_TRACE(("%s:checkfn(%p) returns %d\n", __FILE__, parent, errorcode)); return errorcode; } - -static void arg_file_errorfn( - struct arg_file *parent, - FILE *fp, - int errorcode, - const char *argval, - const char *progname) { - const char *shortopts = parent->hdr.shortopts; - const char *longopts = parent->hdr.longopts; - const char *datatype = parent->hdr.datatype; +static void arg_file_errorfn(struct arg_file* parent, arg_dstr_t ds, int errorcode, const char* argval, const char* progname) { + const char* shortopts = parent->hdr.shortopts; + const char* longopts = parent->hdr.longopts; + const char* datatype = parent->hdr.datatype; /* make argval NULL safe */ argval = argval ? argval : ""; - fprintf(fp, "%s: ", progname); + arg_dstr_catf(ds, "%s: ", progname); switch (errorcode) { - case EMINCOUNT: - fputs("missing option ", fp); - arg_print_option(fp, shortopts, longopts, datatype, "\n"); + case ARG_ERR_MINCOUNT: + arg_dstr_cat(ds, "missing option "); + arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); break; - case EMAXCOUNT: - fputs("excess option ", fp); - arg_print_option(fp, shortopts, longopts, argval, "\n"); + case ARG_ERR_MAXCOUNT: + arg_dstr_cat(ds, "excess option "); + arg_print_option_ds(ds, shortopts, longopts, argval, "\n"); break; default: - fprintf(fp, "unknown error at \"%s\"\n", argval); + arg_dstr_catf(ds, "unknown error at \"%s\"\n", argval); } } - -struct arg_file *arg_file0( - const char *shortopts, - const char *longopts, - const char *datatype, - const char *glossary) { +struct arg_file* arg_file0(const char* shortopts, const char* longopts, const char* datatype, const char* glossary) { return arg_filen(shortopts, longopts, datatype, 0, 1, glossary); } - -struct arg_file *arg_file1( - const char *shortopts, - const char *longopts, - const char *datatype, - const char *glossary) { +struct arg_file* arg_file1(const char* shortopts, const char* longopts, const char* datatype, const char* glossary) { return arg_filen(shortopts, longopts, datatype, 1, 1, glossary); } - -struct arg_file *arg_filen( - const char *shortopts, - const char *longopts, - const char *datatype, - int mincount, - int maxcount, - const char *glossary) { +struct arg_file* arg_filen(const char* shortopts, const char* longopts, const char* datatype, int mincount, int maxcount, const char* glossary) { size_t nbytes; - struct arg_file *result; + struct arg_file* result; + int i; /* foolproof things by ensuring maxcount is not less than mincount */ maxcount = (maxcount < mincount) ? mincount : maxcount; - nbytes = sizeof(struct arg_file) /* storage for struct arg_file */ - + sizeof(char *) * maxcount /* storage for filename[maxcount] array */ - + sizeof(char *) * maxcount /* storage for basename[maxcount] array */ - + sizeof(char *) * maxcount; /* storage for extension[maxcount] array */ + nbytes = sizeof(struct arg_file) /* storage for struct arg_file */ + + sizeof(char*) * maxcount /* storage for filename[maxcount] array */ + + sizeof(char*) * maxcount /* storage for basename[maxcount] array */ + + sizeof(char*) * maxcount; /* storage for extension[maxcount] array */ - result = (struct arg_file *)malloc(nbytes); - if (result) { - int i; + result = (struct arg_file*)xmalloc(nbytes); - /* init the arg_hdr struct */ - result->hdr.flag = ARG_HASVALUE; - result->hdr.shortopts = shortopts; - result->hdr.longopts = longopts; - result->hdr.glossary = glossary; - result->hdr.datatype = datatype ? datatype : ""; - result->hdr.mincount = mincount; - result->hdr.maxcount = maxcount; - result->hdr.parent = result; - result->hdr.resetfn = (arg_resetfn *)arg_file_resetfn; - result->hdr.scanfn = (arg_scanfn *)arg_file_scanfn; - result->hdr.checkfn = (arg_checkfn *)arg_file_checkfn; - result->hdr.errorfn = (arg_errorfn *)arg_file_errorfn; + /* init the arg_hdr struct */ + result->hdr.flag = ARG_HASVALUE; + result->hdr.shortopts = shortopts; + result->hdr.longopts = longopts; + result->hdr.glossary = glossary; + result->hdr.datatype = datatype ? datatype : ""; + result->hdr.mincount = mincount; + result->hdr.maxcount = maxcount; + result->hdr.parent = result; + result->hdr.resetfn = (arg_resetfn*)arg_file_resetfn; + result->hdr.scanfn = (arg_scanfn*)arg_file_scanfn; + result->hdr.checkfn = (arg_checkfn*)arg_file_checkfn; + result->hdr.errorfn = (arg_errorfn*)arg_file_errorfn; - /* store the filename,basename,extension arrays immediately after the arg_file struct */ - result->filename = (const char * *)(result + 1); - result->basename = result->filename + maxcount; - result->extension = result->basename + maxcount; - result->count = 0; + /* store the filename,basename,extension arrays immediately after the arg_file struct */ + result->filename = (const char**)(result + 1); + result->basename = result->filename + maxcount; + result->extension = result->basename + maxcount; + result->count = 0; - /* foolproof the string pointers by initialising them with empty strings */ - for (i = 0; i < maxcount; i++) { - result->filename[i] = ""; - result->basename[i] = ""; - result->extension[i] = ""; - } + /* foolproof the string pointers by initialising them with empty strings */ + for (i = 0; i < maxcount; i++) { + result->filename[i] = ""; + result->basename[i] = ""; + result->extension[i] = ""; } ARG_TRACE(("arg_filen() returns %p\n", result)); return result; } /******************************************************************************* + * arg_int: Implements the int command-line option + * * This file is part of the argtable3 library. * * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann @@ -1924,19 +2925,21 @@ struct arg_file *arg_filen( * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ -#include -#include -#include - #include "argtable3.h" +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#endif -static void arg_int_resetfn(struct arg_int *parent) { +#include +#include +#include + +static void arg_int_resetfn(struct arg_int* parent) { ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent)); parent->count = 0; } - /* strtol0x() is like strtol() except that the numeric string is */ /* expected to be prefixed by "0X" where X is a user supplied char. */ /* The string may optionally be prefixed by white space and + or - */ @@ -1947,16 +2950,13 @@ static void arg_int_resetfn(struct arg_int *parent) { /* eg: to parse oct str="+0o12324", specify X='O' and base=8. */ /* eg: to parse bin str="-0B01010", specify X='B' and base=2. */ /* Failure of conversion is indicated by result where *endptr==str. */ -static long int strtol0X(const char *str, - const char * *endptr, - char X, - int base) { - long int val; /* stores result */ - int s = 1; /* sign is +1 or -1 */ - const char *ptr = str; /* ptr to current position in str */ +static long int strtol0X(const char* str, const char** endptr, char X, int base) { + long int val; /* stores result */ + int s = 1; /* sign is +1 or -1 */ + const char* ptr = str; /* ptr to current position in str */ /* skip leading whitespace */ - while (ISSPACE(*ptr)) + while (isspace(*ptr)) ptr++; /* printf("1) %s\n",ptr); */ @@ -1991,7 +2991,7 @@ static long int strtol0X(const char *str, /* printf("4) %s\n",ptr); */ /* attempt conversion on remainder of string using strtol() */ - val = strtol(ptr, (char * *)endptr, base); + val = strtol(ptr, (char**)endptr, base); if (*endptr == ptr) { /* conversion failed */ *endptr = str; @@ -2002,10 +3002,9 @@ static long int strtol0X(const char *str, return s * val; } - /* Returns 1 if str matches suffix (case insensitive). */ /* Str may contain trailing whitespace, but nothing else. */ -static int detectsuffix(const char *str, const char *suffix) { +static int detectsuffix(const char* str, const char* suffix) { /* scan pairwise through strings until mismatch detected */ while (toupper(*str) == toupper(*suffix)) { /* printf("'%c' '%c'\n", *str, *suffix); */ @@ -2022,23 +3021,22 @@ static int detectsuffix(const char *str, const char *suffix) { /* return 0 (fail) if the matching did not consume the entire suffix */ if (*suffix != 0) - return 0; /* failed to consume entire suffix */ + return 0; /* failed to consume entire suffix */ /* skip any remaining whitespace in str */ - while (ISSPACE(*str)) + while (isspace(*str)) str++; /* return 1 (success) if we have reached end of str else return 0 (fail) */ return (*str == '\0') ? 1 : 0; } - -static int arg_int_scanfn(struct arg_int *parent, const char *argval) { +static int arg_int_scanfn(struct arg_int* parent, const char* argval) { int errorcode = 0; if (parent->count == parent->hdr.maxcount) { /* maximum number of arguments exceeded */ - errorcode = EMAXCOUNT; + errorcode = ARG_ERR_MAXCOUNT; } else if (!argval) { /* a valid argument with no argument value was given. */ /* This happens when an optional argument value was invoked. */ @@ -2046,7 +3044,7 @@ static int arg_int_scanfn(struct arg_int *parent, const char *argval) { parent->count++; } else { long int val; - const char *end; + const char* end; /* attempt to extract hex integer (eg: +0x123) from argval into val conversion */ val = strtol0X(argval, &end, 'X', 16); @@ -2058,10 +3056,10 @@ static int arg_int_scanfn(struct arg_int *parent, const char *argval) { val = strtol0X(argval, &end, 'B', 2); if (end == argval) { /* binary failed, attempt decimal conversion with no prefix (eg 1234) */ - val = strtol(argval, (char * *)&end, 10); + val = strtol(argval, (char**)&end, 10); if (end == argval) { /* all supported number formats failed */ - return EBADINT; + return ARG_ERR_BADINT; } } } @@ -2070,131 +3068,90 @@ static int arg_int_scanfn(struct arg_int *parent, const char *argval) { /* Safety check for integer overflow. WARNING: this check */ /* achieves nothing on machines where size(int)==size(long). */ if (val > INT_MAX || val < INT_MIN) -#ifdef __STDC_WANT_SECURE_LIB__ - errorcode = EOVERFLOW_; -#else - errorcode = EOVERFLOW; -#endif + errorcode = ARG_ERR_OVERFLOW; /* Detect any suffixes (KB,MB,GB) and multiply argument value appropriately. */ /* We need to be mindful of integer overflows when using such big numbers. */ - if (detectsuffix(end, "KB")) { /* kilobytes */ + if (detectsuffix(end, "KB")) /* kilobytes */ + { if (val > (INT_MAX / 1024) || val < (INT_MIN / 1024)) -#ifdef __STDC_WANT_SECURE_LIB__ - errorcode = EOVERFLOW_; /* Overflow would occur if we proceed */ -#else - errorcode = EOVERFLOW; /* Overflow would occur if we proceed */ -#endif + errorcode = ARG_ERR_OVERFLOW; /* Overflow would occur if we proceed */ else - val *= 1024; /* 1KB = 1024 */ - } else if (detectsuffix(end, "MB")) { /* megabytes */ + val *= 1024; /* 1KB = 1024 */ + } else if (detectsuffix(end, "MB")) /* megabytes */ + { if (val > (INT_MAX / 1048576) || val < (INT_MIN / 1048576)) -#ifdef __STDC_WANT_SECURE_LIB__ - errorcode = EOVERFLOW_; /* Overflow would occur if we proceed */ -#else - errorcode = EOVERFLOW; /* Overflow would occur if we proceed */ -#endif + errorcode = ARG_ERR_OVERFLOW; /* Overflow would occur if we proceed */ else - val *= 1048576; /* 1MB = 1024*1024 */ - } else if (detectsuffix(end, "GB")) { /* gigabytes */ + val *= 1048576; /* 1MB = 1024*1024 */ + } else if (detectsuffix(end, "GB")) /* gigabytes */ + { if (val > (INT_MAX / 1073741824) || val < (INT_MIN / 1073741824)) -#ifdef __STDC_WANT_SECURE_LIB__ - errorcode = EOVERFLOW_; /* Overflow would occur if we proceed */ -#else - errorcode = EOVERFLOW; /* Overflow would occur if we proceed */ -#endif + errorcode = ARG_ERR_OVERFLOW; /* Overflow would occur if we proceed */ else - val *= 1073741824; /* 1GB = 1024*1024*1024 */ + val *= 1073741824; /* 1GB = 1024*1024*1024 */ } else if (!detectsuffix(end, "")) - errorcode = EBADINT; /* invalid suffix detected */ + errorcode = ARG_ERR_BADINT; /* invalid suffix detected */ /* if success then store result in parent->ival[] array */ if (errorcode == 0) - parent->ival[parent->count++] = val; + parent->ival[parent->count++] = (int)val; } /* printf("%s:scanfn(%p,%p) returns %d\n",__FILE__,parent,argval,errorcode); */ return errorcode; } - -static int arg_int_checkfn(struct arg_int *parent) { - int errorcode = (parent->count < parent->hdr.mincount) ? EMINCOUNT : 0; +static int arg_int_checkfn(struct arg_int* parent) { + int errorcode = (parent->count < parent->hdr.mincount) ? ARG_ERR_MINCOUNT : 0; /*printf("%s:checkfn(%p) returns %d\n",__FILE__,parent,errorcode);*/ return errorcode; } - -static void arg_int_errorfn( - struct arg_int *parent, - FILE *fp, - int errorcode, - const char *argval, - const char *progname) { - const char *shortopts = parent->hdr.shortopts; - const char *longopts = parent->hdr.longopts; - const char *datatype = parent->hdr.datatype; +static void arg_int_errorfn(struct arg_int* parent, arg_dstr_t ds, int errorcode, const char* argval, const char* progname) { + const char* shortopts = parent->hdr.shortopts; + const char* longopts = parent->hdr.longopts; + const char* datatype = parent->hdr.datatype; /* make argval NULL safe */ argval = argval ? argval : ""; - fprintf(fp, "%s: ", progname); + arg_dstr_catf(ds, "%s: ", progname); switch (errorcode) { - case EMINCOUNT: - fputs("missing option ", fp); - arg_print_option(fp, shortopts, longopts, datatype, "\n"); + case ARG_ERR_MINCOUNT: + arg_dstr_cat(ds, "missing option "); + arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); break; - case EMAXCOUNT: - fputs("excess option ", fp); - arg_print_option(fp, shortopts, longopts, argval, "\n"); + case ARG_ERR_MAXCOUNT: + arg_dstr_cat(ds, "excess option "); + arg_print_option_ds(ds, shortopts, longopts, argval, "\n"); break; - case EBADINT: - fprintf(fp, "invalid argument \"%s\" to option ", argval); - arg_print_option(fp, shortopts, longopts, datatype, "\n"); + case ARG_ERR_BADINT: + arg_dstr_catf(ds, "invalid argument \"%s\" to option ", argval); + arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); break; -#ifdef __STDC_WANT_SECURE_LIB__ - case EOVERFLOW_: -#else - case EOVERFLOW: -#endif - fputs("integer overflow at option ", fp); - arg_print_option(fp, shortopts, longopts, datatype, " "); - fprintf(fp, "(%s is too large)\n", argval); + case ARG_ERR_OVERFLOW: + arg_dstr_cat(ds, "integer overflow at option "); + arg_print_option_ds(ds, shortopts, longopts, datatype, " "); + arg_dstr_catf(ds, "(%s is too large)\n", argval); break; } } - -struct arg_int *arg_int0( - const char *shortopts, - const char *longopts, - const char *datatype, - const char *glossary) { +struct arg_int* arg_int0(const char* shortopts, const char* longopts, const char* datatype, const char* glossary) { return arg_intn(shortopts, longopts, datatype, 0, 1, glossary); } - -struct arg_int *arg_int1( - const char *shortopts, - const char *longopts, - const char *datatype, - const char *glossary) { +struct arg_int* arg_int1(const char* shortopts, const char* longopts, const char* datatype, const char* glossary) { return arg_intn(shortopts, longopts, datatype, 1, 1, glossary); } - -struct arg_int *arg_intn( - const char *shortopts, - const char *longopts, - const char *datatype, - int mincount, - int maxcount, - const char *glossary) { +struct arg_int* arg_intn(const char* shortopts, const char* longopts, const char* datatype, int mincount, int maxcount, const char* glossary) { size_t nbytes; - struct arg_int *result; + struct arg_int* result; /* foolproof things by ensuring maxcount is not less than mincount */ maxcount = (maxcount < mincount) ? mincount : maxcount; @@ -2202,31 +3159,32 @@ struct arg_int *arg_intn( nbytes = sizeof(struct arg_int) /* storage for struct arg_int */ + maxcount * sizeof(int); /* storage for ival[maxcount] array */ - result = (struct arg_int *)malloc(nbytes); - if (result) { - /* init the arg_hdr struct */ - result->hdr.flag = ARG_HASVALUE; - result->hdr.shortopts = shortopts; - result->hdr.longopts = longopts; - result->hdr.datatype = datatype ? datatype : ""; - result->hdr.glossary = glossary; - result->hdr.mincount = mincount; - result->hdr.maxcount = maxcount; - result->hdr.parent = result; - result->hdr.resetfn = (arg_resetfn *)arg_int_resetfn; - result->hdr.scanfn = (arg_scanfn *)arg_int_scanfn; - result->hdr.checkfn = (arg_checkfn *)arg_int_checkfn; - result->hdr.errorfn = (arg_errorfn *)arg_int_errorfn; + result = (struct arg_int*)xmalloc(nbytes); - /* store the ival[maxcount] array immediately after the arg_int struct */ - result->ival = (int *)(result + 1); - result->count = 0; - } + /* init the arg_hdr struct */ + result->hdr.flag = ARG_HASVALUE; + result->hdr.shortopts = shortopts; + result->hdr.longopts = longopts; + result->hdr.datatype = datatype ? datatype : ""; + result->hdr.glossary = glossary; + result->hdr.mincount = mincount; + result->hdr.maxcount = maxcount; + result->hdr.parent = result; + result->hdr.resetfn = (arg_resetfn*)arg_int_resetfn; + result->hdr.scanfn = (arg_scanfn*)arg_int_scanfn; + result->hdr.checkfn = (arg_checkfn*)arg_int_checkfn; + result->hdr.errorfn = (arg_errorfn*)arg_int_errorfn; + + /* store the ival[maxcount] array immediately after the arg_int struct */ + result->ival = (int*)(result + 1); + result->count = 0; ARG_TRACE(("arg_intn() returns %p\n", result)); return result; } /******************************************************************************* + * arg_lit: Implements the literature command-line option + * * This file is part of the argtable3 library. * * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann @@ -2256,116 +3214,96 @@ struct arg_int *arg_intn( * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ -#include - #include "argtable3.h" +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#endif -static void arg_lit_resetfn(struct arg_lit *parent) { +#include + +static void arg_lit_resetfn(struct arg_lit* parent) { ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent)); parent->count = 0; } - -static int arg_lit_scanfn(struct arg_lit *parent, const char *argval) { +static int arg_lit_scanfn(struct arg_lit* parent, const char* argval) { int errorcode = 0; if (parent->count < parent->hdr.maxcount) parent->count++; else - errorcode = EMAXCOUNT; + errorcode = ARG_ERR_MAXCOUNT; - ARG_TRACE(("%s:scanfn(%p,%s) returns %d\n", __FILE__, parent, argval, - errorcode)); + ARG_TRACE(("%s:scanfn(%p,%s) returns %d\n", __FILE__, parent, argval, errorcode)); return errorcode; } - -static int arg_lit_checkfn(struct arg_lit *parent) { - int errorcode = (parent->count < parent->hdr.mincount) ? EMINCOUNT : 0; +static int arg_lit_checkfn(struct arg_lit* parent) { + int errorcode = (parent->count < parent->hdr.mincount) ? ARG_ERR_MINCOUNT : 0; ARG_TRACE(("%s:checkfn(%p) returns %d\n", __FILE__, parent, errorcode)); return errorcode; } - -static void arg_lit_errorfn( - struct arg_lit *parent, - FILE *fp, - int errorcode, - const char *argval, - const char *progname) { - const char *shortopts = parent->hdr.shortopts; - const char *longopts = parent->hdr.longopts; - const char *datatype = parent->hdr.datatype; +static void arg_lit_errorfn(struct arg_lit* parent, arg_dstr_t ds, int errorcode, const char* argval, const char* progname) { + const char* shortopts = parent->hdr.shortopts; + const char* longopts = parent->hdr.longopts; + const char* datatype = parent->hdr.datatype; switch (errorcode) { - case EMINCOUNT: - fprintf(fp, "%s: missing option ", progname); - arg_print_option(fp, shortopts, longopts, datatype, "\n"); - fprintf(fp, "\n"); + case ARG_ERR_MINCOUNT: + arg_dstr_catf(ds, "%s: missing option ", progname); + arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); + arg_dstr_cat(ds, "\n"); break; - case EMAXCOUNT: - fprintf(fp, "%s: extraneous option ", progname); - arg_print_option(fp, shortopts, longopts, datatype, "\n"); + case ARG_ERR_MAXCOUNT: + arg_dstr_catf(ds, "%s: extraneous option ", progname); + arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); break; } - ARG_TRACE(("%s:errorfn(%p, %p, %d, %s, %s)\n", __FILE__, parent, fp, - errorcode, argval, progname)); + ARG_TRACE(("%s:errorfn(%p, %p, %d, %s, %s)\n", __FILE__, parent, ds, errorcode, argval, progname)); } - -struct arg_lit *arg_lit0( - const char *shortopts, - const char *longopts, - const char *glossary) { +struct arg_lit* arg_lit0(const char* shortopts, const char* longopts, const char* glossary) { return arg_litn(shortopts, longopts, 0, 1, glossary); } - -struct arg_lit *arg_lit1( - const char *shortopts, - const char *longopts, - const char *glossary) { +struct arg_lit* arg_lit1(const char* shortopts, const char* longopts, const char* glossary) { return arg_litn(shortopts, longopts, 1, 1, glossary); } - -struct arg_lit *arg_litn( - const char *shortopts, - const char *longopts, - int mincount, - int maxcount, - const char *glossary) { - struct arg_lit *result; +struct arg_lit* arg_litn(const char* shortopts, const char* longopts, int mincount, int maxcount, const char* glossary) { + struct arg_lit* result; /* foolproof things by ensuring maxcount is not less than mincount */ maxcount = (maxcount < mincount) ? mincount : maxcount; - result = (struct arg_lit *)malloc(sizeof(struct arg_lit)); - if (result) { - /* init the arg_hdr struct */ - result->hdr.flag = 0; - result->hdr.shortopts = shortopts; - result->hdr.longopts = longopts; - result->hdr.datatype = NULL; - result->hdr.glossary = glossary; - result->hdr.mincount = mincount; - result->hdr.maxcount = maxcount; - result->hdr.parent = result; - result->hdr.resetfn = (arg_resetfn *)arg_lit_resetfn; - result->hdr.scanfn = (arg_scanfn *)arg_lit_scanfn; - result->hdr.checkfn = (arg_checkfn *)arg_lit_checkfn; - result->hdr.errorfn = (arg_errorfn *)arg_lit_errorfn; + result = (struct arg_lit*)xmalloc(sizeof(struct arg_lit)); - /* init local variables */ - result->count = 0; - } + /* init the arg_hdr struct */ + result->hdr.flag = 0; + result->hdr.shortopts = shortopts; + result->hdr.longopts = longopts; + result->hdr.datatype = NULL; + result->hdr.glossary = glossary; + result->hdr.mincount = mincount; + result->hdr.maxcount = maxcount; + result->hdr.parent = result; + result->hdr.resetfn = (arg_resetfn*)arg_lit_resetfn; + result->hdr.scanfn = (arg_scanfn*)arg_lit_scanfn; + result->hdr.checkfn = (arg_checkfn*)arg_lit_checkfn; + result->hdr.errorfn = (arg_errorfn*)arg_lit_errorfn; + + /* init local variables */ + result->count = 0; ARG_TRACE(("arg_litn() returns %p\n", result)); return result; } /******************************************************************************* + * arg_rem: Implements the rem command-line option + * * This file is part of the argtable3 library. * * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann @@ -2395,32 +3333,36 @@ struct arg_lit *arg_litn( * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ -#include - #include "argtable3.h" -struct arg_rem *arg_rem(const char *datatype, const char *glossary) { - struct arg_rem *result = (struct arg_rem *)malloc(sizeof(struct arg_rem)); - if (result) { - result->hdr.flag = 0; - result->hdr.shortopts = NULL; - result->hdr.longopts = NULL; - result->hdr.datatype = datatype; - result->hdr.glossary = glossary; - result->hdr.mincount = 1; - result->hdr.maxcount = 1; - result->hdr.parent = result; - result->hdr.resetfn = NULL; - result->hdr.scanfn = NULL; - result->hdr.checkfn = NULL; - result->hdr.errorfn = NULL; - } +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#endif + +#include + +struct arg_rem* arg_rem(const char* datatype, const char* glossary) { + struct arg_rem* result = (struct arg_rem*)xmalloc(sizeof(struct arg_rem)); + + result->hdr.flag = 0; + result->hdr.shortopts = NULL; + result->hdr.longopts = NULL; + result->hdr.datatype = datatype; + result->hdr.glossary = glossary; + result->hdr.mincount = 1; + result->hdr.maxcount = 1; + result->hdr.parent = result; + result->hdr.resetfn = NULL; + result->hdr.scanfn = NULL; + result->hdr.checkfn = NULL; + result->hdr.errorfn = NULL; ARG_TRACE(("arg_rem() returns %p\n", result)); return result; } - /******************************************************************************* + * arg_rex: Implements the regex command-line option + * * This file is part of the argtable3 library. * * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann @@ -2450,58 +3392,54 @@ struct arg_rem *arg_rem(const char *datatype, const char *glossary) { * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ +#include "argtable3.h" + +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#endif + #include #include -#include "argtable3.h" - - #ifndef _TREX_H_ #define _TREX_H_ -/*************************************************************** - T-Rex a tiny regular expression library - Copyright (C) 2003-2006 Alberto Demichelis - - This software is provided 'as-is', without any express - or implied warranty. In no event will the authors be held - liable for any damages arising from the use of this software. - - Permission is granted to anyone to use this software for - any purpose, including commercial applications, and to alter - it and redistribute it freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; - you must not claim that you wrote the original software. - If you use this software in a product, an acknowledgment - in the product documentation would be appreciated but - is not required. - - 2. Altered source versions must be plainly marked as such, - and must not be misrepresented as being the original software. - - 3. This notice may not be removed or altered from any - source distribution. - -****************************************************************/ +/* + * This module uses the T-Rex regular expression library to implement the regex + * logic. Here is the copyright notice of the library: + * + * Copyright (C) 2003-2006 Alberto Demichelis + * + * This software is provided 'as-is', without any express + * or implied warranty. In no event will the authors be held + * liable for any damages arising from the use of this software. + * + * Permission is granted to anyone to use this software for + * any purpose, including commercial applications, and to alter + * it and redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; + * you must not claim that you wrote the original software. + * If you use this software in a product, an acknowledgment + * in the product documentation would be appreciated but + * is not required. + * + * 2. Altered source versions must be plainly marked as such, + * and must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any + * source distribution. + */ #ifdef __cplusplus extern "C" { #endif -#ifdef _UNICODE -#define TRexChar unsigned short -#define MAX_CHAR 0xFFFF -#define _TREXC(c) L##c -#define trex_strlen wcslen -#define trex_printf wprintf -#else #define TRexChar char #define MAX_CHAR 0xFF #define _TREXC(c) (c) #define trex_strlen strlen #define trex_printf printf -#endif #ifndef TREX_API #define TREX_API extern @@ -2516,17 +3454,18 @@ typedef unsigned int TRexBool; typedef struct TRex TRex; typedef struct { - const TRexChar *begin; + const TRexChar* begin; int len; } TRexMatch; -TREX_API TRex *trex_compile(const TRexChar *pattern, const TRexChar **error, int flags); -TREX_API void trex_free(TRex *exp); -TREX_API TRexBool trex_match(TRex *exp, const TRexChar *text); -TREX_API TRexBool trex_search(TRex *exp, const TRexChar *text, const TRexChar **out_begin, const TRexChar **out_end); -TREX_API TRexBool trex_searchrange(TRex *exp, const TRexChar *text_begin, const TRexChar *text_end, const TRexChar **out_begin, const TRexChar **out_end); -TREX_API int trex_getsubexpcount(TRex *exp); -TREX_API TRexBool trex_getsubexp(TRex *exp, int n, TRexMatch *subexp); +TREX_API TRex* trex_compile(const TRexChar* pattern, const TRexChar** error, int flags); +TREX_API void trex_free(TRex* exp); +TREX_API TRexBool trex_match(TRex* exp, const TRexChar* text); +TREX_API TRexBool trex_search(TRex* exp, const TRexChar* text, const TRexChar** out_begin, const TRexChar** out_end); +TREX_API TRexBool +trex_searchrange(TRex* exp, const TRexChar* text_begin, const TRexChar* text_end, const TRexChar** out_begin, const TRexChar** out_end); +TREX_API int trex_getsubexpcount(TRex* exp); +TREX_API TRexBool trex_getsubexp(TRex* exp, int n, TRexMatch* subexp); #ifdef __cplusplus } @@ -2534,35 +3473,32 @@ TREX_API TRexBool trex_getsubexp(TRex *exp, int n, TRexMatch *subexp); #endif - - struct privhdr { - const char *pattern; + const char* pattern; int flags; }; - -static void arg_rex_resetfn(struct arg_rex *parent) { +static void arg_rex_resetfn(struct arg_rex* parent) { ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent)); parent->count = 0; } -static int arg_rex_scanfn(struct arg_rex *parent, const char *argval) { +static int arg_rex_scanfn(struct arg_rex* parent, const char* argval) { int errorcode = 0; - const TRexChar *error = NULL; - TRex *rex = NULL; - TRexBool is_match; + const TRexChar* error = NULL; + TRex* rex = NULL; + TRexBool is_match = TRex_False; if (parent->count == parent->hdr.maxcount) { /* maximum number of arguments exceeded */ - errorcode = EMAXCOUNT; + errorcode = ARG_ERR_MAXCOUNT; } else if (!argval) { /* a valid argument with no argument value was given. */ /* This happens when an optional argument value was invoked. */ /* leave parent argument value unaltered but still count the argument. */ parent->count++; } else { - struct privhdr *priv = (struct privhdr *)parent->hdr.priv; + struct privhdr* priv = (struct privhdr*)parent->hdr.priv; /* test the current argument value for a match with the regular expression */ /* if a match is detected, record the argument value in the arg_rex struct */ @@ -2570,7 +3506,7 @@ static int arg_rex_scanfn(struct arg_rex *parent, const char *argval) { rex = trex_compile(priv->pattern, &error, priv->flags); is_match = trex_match(rex, argval); if (!is_match) - errorcode = EREGNOMATCH; + errorcode = ARG_ERR_REGNOMATCH; else parent->sval[parent->count++] = argval; @@ -2581,107 +3517,79 @@ static int arg_rex_scanfn(struct arg_rex *parent, const char *argval) { return errorcode; } -static int arg_rex_checkfn(struct arg_rex *parent) { - int errorcode = (parent->count < parent->hdr.mincount) ? EMINCOUNT : 0; - //struct privhdr *priv = (struct privhdr*)parent->hdr.priv; +static int arg_rex_checkfn(struct arg_rex* parent) { + int errorcode = (parent->count < parent->hdr.mincount) ? ARG_ERR_MINCOUNT : 0; +#if 0 + struct privhdr *priv = (struct privhdr*)parent->hdr.priv; /* free the regex "program" we constructed in resetfn */ - //regfree(&(priv->regex)); + regfree(&(priv->regex)); /*printf("%s:checkfn(%p) returns %d\n",__FILE__,parent,errorcode);*/ +#endif return errorcode; } -static void arg_rex_errorfn(struct arg_rex *parent, - FILE *fp, - int errorcode, - const char *argval, - const char *progname) { - const char *shortopts = parent->hdr.shortopts; - const char *longopts = parent->hdr.longopts; - const char *datatype = parent->hdr.datatype; +static void arg_rex_errorfn(struct arg_rex* parent, arg_dstr_t ds, int errorcode, const char* argval, const char* progname) { + const char* shortopts = parent->hdr.shortopts; + const char* longopts = parent->hdr.longopts; + const char* datatype = parent->hdr.datatype; /* make argval NULL safe */ argval = argval ? argval : ""; - fprintf(fp, "%s: ", progname); + arg_dstr_catf(ds, "%s: ", progname); switch (errorcode) { - case EMINCOUNT: - fputs("missing option ", fp); - arg_print_option(fp, shortopts, longopts, datatype, "\n"); + case ARG_ERR_MINCOUNT: + arg_dstr_cat(ds, "missing option "); + arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); break; - case EMAXCOUNT: - fputs("excess option ", fp); - arg_print_option(fp, shortopts, longopts, argval, "\n"); + case ARG_ERR_MAXCOUNT: + arg_dstr_cat(ds, "excess option "); + arg_print_option_ds(ds, shortopts, longopts, argval, "\n"); break; - case EREGNOMATCH: - fputs("illegal value ", fp); - arg_print_option(fp, shortopts, longopts, argval, "\n"); + case ARG_ERR_REGNOMATCH: + arg_dstr_cat(ds, "illegal value "); + arg_print_option_ds(ds, shortopts, longopts, argval, "\n"); break; default: { - //char errbuff[256]; - //regerror(errorcode, NULL, errbuff, sizeof(errbuff)); - //printf("%s\n", errbuff); - } - break; + #if 0 + char errbuff[256]; + regerror(errorcode, NULL, errbuff, sizeof(errbuff)); + printf("%s\n", errbuff); + #endif + } break; } } - -struct arg_rex *arg_rex0(const char *shortopts, - const char *longopts, - const char *pattern, - const char *datatype, - int flags, - const char *glossary) { - return arg_rexn(shortopts, - longopts, - pattern, - datatype, - 0, - 1, - flags, - glossary); +struct arg_rex* arg_rex0(const char* shortopts, const char* longopts, const char* pattern, const char* datatype, int flags, const char* glossary) { + return arg_rexn(shortopts, longopts, pattern, datatype, 0, 1, flags, glossary); } -struct arg_rex *arg_rex1(const char *shortopts, - const char *longopts, - const char *pattern, - const char *datatype, - int flags, - const char *glossary) { - return arg_rexn(shortopts, - longopts, - pattern, - datatype, - 1, - 1, - flags, - glossary); +struct arg_rex* arg_rex1(const char* shortopts, const char* longopts, const char* pattern, const char* datatype, int flags, const char* glossary) { + return arg_rexn(shortopts, longopts, pattern, datatype, 1, 1, flags, glossary); } - -struct arg_rex *arg_rexn(const char *shortopts, - const char *longopts, - const char *pattern, - const char *datatype, +struct arg_rex* arg_rexn(const char* shortopts, + const char* longopts, + const char* pattern, + const char* datatype, int mincount, int maxcount, int flags, - const char *glossary) { + const char* glossary) { size_t nbytes; - struct arg_rex *result; - struct privhdr *priv; + struct arg_rex* result; + struct privhdr* priv; int i; - const TRexChar *error = NULL; - TRex *rex = NULL; + const TRexChar* error = NULL; + TRex* rex = NULL; if (!pattern) { - printf( - "argtable: ERROR - illegal regular expression pattern \"(NULL)\"\n"); + printf("argtable: ERROR - illegal regular expression pattern \"(NULL)\"\n"); printf("argtable: Bad argument table.\n"); return NULL; } @@ -2689,36 +3597,33 @@ struct arg_rex *arg_rexn(const char *shortopts, /* foolproof things by ensuring maxcount is not less than mincount */ maxcount = (maxcount < mincount) ? mincount : maxcount; - nbytes = sizeof(struct arg_rex) /* storage for struct arg_rex */ - + sizeof(struct privhdr) /* storage for private arg_rex data */ - + maxcount * sizeof(char *); /* storage for sval[maxcount] array */ - - result = (struct arg_rex *)malloc(nbytes); - if (result == NULL) - return result; + nbytes = sizeof(struct arg_rex) /* storage for struct arg_rex */ + + sizeof(struct privhdr) /* storage for private arg_rex data */ + + maxcount * sizeof(char*); /* storage for sval[maxcount] array */ /* init the arg_hdr struct */ - result->hdr.flag = ARG_HASVALUE; + result = (struct arg_rex*)xmalloc(nbytes); + result->hdr.flag = ARG_HASVALUE; result->hdr.shortopts = shortopts; - result->hdr.longopts = longopts; - result->hdr.datatype = datatype ? datatype : pattern; - result->hdr.glossary = glossary; - result->hdr.mincount = mincount; - result->hdr.maxcount = maxcount; - result->hdr.parent = result; - result->hdr.resetfn = (arg_resetfn *)arg_rex_resetfn; - result->hdr.scanfn = (arg_scanfn *)arg_rex_scanfn; - result->hdr.checkfn = (arg_checkfn *)arg_rex_checkfn; - result->hdr.errorfn = (arg_errorfn *)arg_rex_errorfn; + result->hdr.longopts = longopts; + result->hdr.datatype = datatype ? datatype : pattern; + result->hdr.glossary = glossary; + result->hdr.mincount = mincount; + result->hdr.maxcount = maxcount; + result->hdr.parent = result; + result->hdr.resetfn = (arg_resetfn*)arg_rex_resetfn; + result->hdr.scanfn = (arg_scanfn*)arg_rex_scanfn; + result->hdr.checkfn = (arg_checkfn*)arg_rex_checkfn; + result->hdr.errorfn = (arg_errorfn*)arg_rex_errorfn; /* store the arg_rex_priv struct immediately after the arg_rex struct */ - result->hdr.priv = result + 1; - priv = (struct privhdr *)(result->hdr.priv); + result->hdr.priv = result + 1; + priv = (struct privhdr*)(result->hdr.priv); priv->pattern = pattern; priv->flags = flags; /* store the sval[maxcount] array immediately after the arg_rex_priv struct */ - result->sval = (const char * *)(priv + 1); + result->sval = (const char**)(priv + 1); result->count = 0; /* foolproof the string pointers by initializing them to reference empty strings */ @@ -2743,13 +3648,11 @@ struct arg_rex *arg_rexn(const char *shortopts, return result; } - - /* see copyright notice in trex.h */ -#include -#include #include #include +#include +#include #ifdef _UINCODE #define scisprint iswprint @@ -2766,27 +3669,24 @@ struct arg_rex *arg_rexn(const char *shortopts, #ifdef _DEBUG #include -static const TRexChar *g_nnames[] = { - _SC("NONE"), _SC("OP_GREEDY"), _SC("OP_OR"), - _SC("OP_EXPR"), _SC("OP_NOCAPEXPR"), _SC("OP_DOT"), _SC("OP_CLASS"), - _SC("OP_CCLASS"), _SC("OP_NCLASS"), _SC("OP_RANGE"), _SC("OP_CHAR"), - _SC("OP_EOL"), _SC("OP_BOL"), _SC("OP_WB") -}; +static const TRexChar* g_nnames[] = {_SC("NONE"), _SC("OP_GREEDY"), _SC("OP_OR"), _SC("OP_EXPR"), _SC("OP_NOCAPEXPR"), + _SC("OP_DOT"), _SC("OP_CLASS"), _SC("OP_CCLASS"), _SC("OP_NCLASS"), _SC("OP_RANGE"), + _SC("OP_CHAR"), _SC("OP_EOL"), _SC("OP_BOL"), _SC("OP_WB")}; #endif -#define OP_GREEDY (MAX_CHAR+1) // * + ? {n} -#define OP_OR (MAX_CHAR+2) -#define OP_EXPR (MAX_CHAR+3) //parentesis () -#define OP_NOCAPEXPR (MAX_CHAR+4) //parentesis (?:) -#define OP_DOT (MAX_CHAR+5) -#define OP_CLASS (MAX_CHAR+6) -#define OP_CCLASS (MAX_CHAR+7) -#define OP_NCLASS (MAX_CHAR+8) //negates class the [^ -#define OP_RANGE (MAX_CHAR+9) -#define OP_CHAR (MAX_CHAR+10) -#define OP_EOL (MAX_CHAR+11) -#define OP_BOL (MAX_CHAR+12) -#define OP_WB (MAX_CHAR+13) +#define OP_GREEDY (MAX_CHAR + 1) /* * + ? {n} */ +#define OP_OR (MAX_CHAR + 2) +#define OP_EXPR (MAX_CHAR + 3) /* parentesis () */ +#define OP_NOCAPEXPR (MAX_CHAR + 4) /* parentesis (?:) */ +#define OP_DOT (MAX_CHAR + 5) +#define OP_CLASS (MAX_CHAR + 6) +#define OP_CCLASS (MAX_CHAR + 7) +#define OP_NCLASS (MAX_CHAR + 8) /* negates class the [^ */ +#define OP_RANGE (MAX_CHAR + 9) +#define OP_CHAR (MAX_CHAR + 10) +#define OP_EOL (MAX_CHAR + 11) +#define OP_BOL (MAX_CHAR + 12) +#define OP_WB (MAX_CHAR + 13) #define TREX_SYMBOL_ANY_CHAR ('.') #define TREX_SYMBOL_GREEDY_ONE_OR_MORE ('+') @@ -2797,7 +3697,6 @@ static const TRexChar *g_nnames[] = { #define TREX_SYMBOL_BEGINNING_OF_STRING ('^') #define TREX_SYMBOL_ESCAPE_CHAR ('\\') - typedef int TRexNodeType; typedef struct tagTRexNode { @@ -2808,25 +3707,25 @@ typedef struct tagTRexNode { } TRexNode; struct TRex { - const TRexChar *_eol; - const TRexChar *_bol; - const TRexChar *_p; + const TRexChar* _eol; + const TRexChar* _bol; + const TRexChar* _p; int _first; int _op; - TRexNode *_nodes; + TRexNode* _nodes; int _nallocated; int _nsize; int _nsubexpr; - TRexMatch *_matches; + TRexMatch* _matches; int _currsubexp; - void *_jmpbuf; - const TRexChar **_error; + void* _jmpbuf; + const TRexChar** _error; int _flags; }; -static int trex_list(TRex *exp); +static int trex_list(TRex* exp); -static int trex_newnode(TRex *exp, TRexNodeType type) { +static int trex_newnode(TRex* exp, TRexNodeType type) { TRexNode n; int newid; n.type = type; @@ -2835,25 +3734,26 @@ static int trex_newnode(TRex *exp, TRexNodeType type) { n.right = exp->_nsubexpr++; if (exp->_nallocated < (exp->_nsize + 1)) { exp->_nallocated *= 2; - exp->_nodes = (TRexNode *)realloc(exp->_nodes, exp->_nallocated * sizeof(TRexNode)); + exp->_nodes = (TRexNode*)xrealloc(exp->_nodes, exp->_nallocated * sizeof(TRexNode)); } exp->_nodes[exp->_nsize++] = n; newid = exp->_nsize - 1; return (int)newid; } -static void trex_error(TRex *exp, const TRexChar *error) { - if (exp->_error) *exp->_error = error; - longjmp(*((jmp_buf *)exp->_jmpbuf), -1); +static void trex_error(TRex* exp, const TRexChar* error) { + if (exp->_error) + *exp->_error = error; + longjmp(*((jmp_buf*)exp->_jmpbuf), -1); } -static void trex_expect(TRex *exp, int n) { +static void trex_expect(TRex* exp, int n) { if ((*exp->_p) != n) trex_error(exp, _SC("expected paren")); exp->_p++; } -static TRexChar trex_escapechar(TRex *exp) { +static TRexChar trex_escapechar(TRex* exp) { if (*exp->_p == TREX_SYMBOL_ESCAPE_CHAR) { exp->_p++; switch (*exp->_p) { @@ -2875,17 +3775,18 @@ static TRexChar trex_escapechar(TRex *exp) { default: return (*exp->_p++); } - } else if (!scisprint(*exp->_p)) trex_error(exp, _SC("letter expected")); + } else if (!scisprint(*exp->_p)) + trex_error(exp, _SC("letter expected")); return (*exp->_p++); } -static int trex_charclass(TRex *exp, int classid) { +static int trex_charclass(TRex* exp, int classid) { int n = trex_newnode(exp, OP_CCLASS); exp->_nodes[n].left = classid; return n; } -static int trex_charnode(TRex *exp, TRexBool isclass) { +static int trex_charnode(TRex* exp, TRexBool isclass) { TRexChar t; if (*exp->_p == TREX_SYMBOL_ESCAPE_CHAR) { exp->_p++; @@ -2932,46 +3833,42 @@ static int trex_charnode(TRex *exp, TRexBool isclass) { exp->_nodes[node].left = *exp->_p; exp->_p++; return node; - } //else default + } + /* fall through */ default: t = *exp->_p; exp->_p++; return trex_newnode(exp, t); } } else if (!scisprint(*exp->_p)) { - trex_error(exp, _SC("letter expected")); } t = *exp->_p; exp->_p++; return trex_newnode(exp, t); } -static int trex_class(TRex *exp) { +static int trex_class(TRex* exp) { int ret = -1; int first = -1, chain; if (*exp->_p == TREX_SYMBOL_BEGINNING_OF_STRING) { ret = trex_newnode(exp, OP_NCLASS); exp->_p++; - } else ret = trex_newnode(exp, OP_CLASS); + } else + ret = trex_newnode(exp, OP_CLASS); - if (*exp->_p == ']') trex_error(exp, _SC("empty class")); + if (*exp->_p == ']') + trex_error(exp, _SC("empty class")); chain = ret; while (*exp->_p != ']' && exp->_p != exp->_eol) { if (*exp->_p == '-' && first != -1) { int r, t; - if (*exp->_p++ == ']') { + if (*exp->_p++ == ']') trex_error(exp, _SC("unfinished range")); - } - r = trex_newnode(exp, OP_RANGE); - if (first > *exp->_p) { + if (first > *exp->_p) trex_error(exp, _SC("invalid range")); - } - - if (exp->_nodes[first].type == OP_CCLASS) { + if (exp->_nodes[first].type == OP_CCLASS) trex_error(exp, _SC("cannot use character classes in ranges")); - } - exp->_nodes[r].left = exp->_nodes[first].type; t = trex_escapechar(exp); exp->_nodes[r].right = t; @@ -2992,6 +3889,8 @@ static int trex_class(TRex *exp) { if (first != -1) { int c = first; exp->_nodes[chain].next = c; + chain = c; + first = -1; } /* hack? */ exp->_nodes[ret].left = exp->_nodes[ret].next; @@ -2999,26 +3898,26 @@ static int trex_class(TRex *exp) { return ret; } -static int trex_parsenumber(TRex *exp) { +static int trex_parsenumber(TRex* exp) { int ret = *exp->_p - '0'; int positions = 10; exp->_p++; while (isdigit(*exp->_p)) { - ret = ret * 10 + (*exp->_p++ -'0'); - if (positions == 1000000000) trex_error(exp, _SC("overflow in numeric constant")); + ret = ret * 10 + (*exp->_p++ - '0'); + if (positions == 1000000000) + trex_error(exp, _SC("overflow in numeric constant")); positions *= 10; }; return ret; } -static int trex_element(TRex *exp) { +static int trex_element(TRex* exp) { int ret = -1; switch (*exp->_p) { case '(': { int expr, newn; exp->_p++; - if (*exp->_p == '?') { exp->_p++; trex_expect(exp, ':'); @@ -3029,8 +3928,7 @@ static int trex_element(TRex *exp) { exp->_nodes[expr].left = newn; ret = expr; trex_expect(exp, ')'); - } - break; + } break; case '[': exp->_p++; ret = trex_class(exp); @@ -3073,7 +3971,8 @@ static int trex_element(TRex *exp) { break; case '{': exp->_p++; - if (!isdigit(*exp->_p)) trex_error(exp, _SC("number expected")); + if (!isdigit(*exp->_p)) + trex_error(exp, _SC("number expected")); p0 = (unsigned short)trex_parsenumber(exp); /*******************************/ switch (*exp->_p) { @@ -3095,7 +3994,6 @@ static int trex_element(TRex *exp) { /*******************************/ isgreedy = TRex_True; break; - } if (isgreedy) { int nnode = trex_newnode(exp, OP_GREEDY); @@ -3104,7 +4002,8 @@ static int trex_element(TRex *exp) { ret = nnode; } } - if ((*exp->_p != TREX_SYMBOL_BRANCH) && (*exp->_p != ')') && (*exp->_p != TREX_SYMBOL_GREEDY_ZERO_OR_MORE) && (*exp->_p != TREX_SYMBOL_GREEDY_ONE_OR_MORE) && (*exp->_p != '\0')) { + if ((*exp->_p != TREX_SYMBOL_BRANCH) && (*exp->_p != ')') && (*exp->_p != TREX_SYMBOL_GREEDY_ZERO_OR_MORE) && + (*exp->_p != TREX_SYMBOL_GREEDY_ONE_OR_MORE) && (*exp->_p != '\0')) { int nnode = trex_element(exp); exp->_nodes[ret].next = nnode; } @@ -3112,7 +4011,7 @@ static int trex_element(TRex *exp) { return ret; } -static int trex_list(TRex *exp) { +static int trex_list(TRex* exp) { int ret = -1, e; if (*exp->_p == TREX_SYMBOL_BEGINNING_OF_STRING) { exp->_p++; @@ -3121,7 +4020,8 @@ static int trex_list(TRex *exp) { e = trex_element(exp); if (ret != -1) { exp->_nodes[ret].next = e; - } else ret = e; + } else + ret = e; if (*exp->_p == TREX_SYMBOL_BRANCH) { int temp, tright; @@ -3146,9 +4046,9 @@ static TRexBool trex_matchcclass(int cclass, TRexChar c) { case 'W': return (!isalnum(c) && c != '_') ? TRex_True : TRex_False; case 's': - return ISSPACE(c) ? TRex_True : TRex_False; + return isspace(c) ? TRex_True : TRex_False; case 'S': - return !ISSPACE(c) ? TRex_True : TRex_False; + return !isspace(c) ? TRex_True : TRex_False; case 'd': return isdigit(c) ? TRex_True : TRex_False; case 'D': @@ -3173,39 +4073,43 @@ static TRexBool trex_matchcclass(int cclass, TRexChar c) { return TRex_False; /*cannot happen*/ } -static TRexBool trex_matchclass(TRex *exp, TRexNode *node, TRexChar c) { +static TRexBool trex_matchclass(TRex* exp, TRexNode* node, TRexChar c) { do { switch (node->type) { case OP_RANGE: if (exp->_flags & TREX_ICASE) { - if (c >= toupper(node->left) && c <= toupper(node->right)) return TRex_True; - if (c >= tolower(node->left) && c <= tolower(node->right)) return TRex_True; + if (c >= toupper(node->left) && c <= toupper(node->right)) + return TRex_True; + if (c >= tolower(node->left) && c <= tolower(node->right)) + return TRex_True; } else { - if (c >= node->left && c <= node->right) return TRex_True; + if (c >= node->left && c <= node->right) + return TRex_True; } break; case OP_CCLASS: - if (trex_matchcclass(node->left, c)) return TRex_True; + if (trex_matchcclass(node->left, c)) + return TRex_True; break; default: if (exp->_flags & TREX_ICASE) { - if (c == tolower(node->type) || c == toupper(node->type)) return TRex_True; + if (c == tolower(node->type) || c == toupper(node->type)) + return TRex_True; } else { - if (c == node->type)return TRex_True; + if (c == node->type) + return TRex_True; } - } - } while ((node->next != -1) && (node = &exp->_nodes[node->next])); + } while ((node->next != -1) && ((node = &exp->_nodes[node->next]) != NULL)); return TRex_False; } -static const TRexChar *trex_matchnode(TRex *exp, TRexNode *node, const TRexChar *str, TRexNode *next) { - +static const TRexChar* trex_matchnode(TRex* exp, TRexNode* node, const TRexChar* str, TRexNode* next) { TRexNodeType type = node->type; switch (type) { case OP_GREEDY: { - //TRexNode *greedystop = (node->next != -1) ? &exp->_nodes[node->next] : NULL; - TRexNode *greedystop = NULL; + /* TRexNode *greedystop = (node->next != -1) ? &exp->_nodes[node->next] : NULL; */ + TRexNode* greedystop = NULL; int p0 = (node->right >> 16) & 0x0000FFFF, p1 = node->right & 0x0000FFFF, nmaches = 0; const TRexChar *s = str, *good = str; @@ -3216,18 +4120,16 @@ static const TRexChar *trex_matchnode(TRex *exp, TRexNode *node, const TRexChar } while ((nmaches == 0xFFFF || nmaches < p1)) { - - const TRexChar *stop; - if (!(s = trex_matchnode(exp, &exp->_nodes[node->left], s, greedystop))) + const TRexChar* stop; + if ((s = trex_matchnode(exp, &exp->_nodes[node->left], s, greedystop)) == NULL) break; nmaches++; good = s; if (greedystop) { - //checks that 0 matches satisfy the expression(if so skips) - //if not would always stop(for instance if is a '?') - if (greedystop->type != OP_GREEDY || - (greedystop->type == OP_GREEDY && ((greedystop->right >> 16) & 0x0000FFFF) != 0)) { - TRexNode *gnext = NULL; + /* checks that 0 matches satisfy the expression(if so skips) */ + /* if not would always stop(for instance if is a '?') */ + if (greedystop->type != OP_GREEDY || (greedystop->type == OP_GREEDY && ((greedystop->right >> 16) & 0x0000FFFF) != 0)) { + TRexNode* gnext = NULL; if (greedystop->next != -1) { gnext = &exp->_nodes[greedystop->next]; } else if (next && next->next != -1) { @@ -3235,10 +4137,13 @@ static const TRexChar *trex_matchnode(TRex *exp, TRexNode *node, const TRexChar } stop = trex_matchnode(exp, greedystop, s, gnext); if (stop) { - //if satisfied stop it - if (p0 == p1 && p0 == nmaches) break; - else if (nmaches >= p0 && p1 == 0xFFFF) break; - else if (nmaches >= p0 && nmaches <= p1) break; + /* if satisfied stop it */ + if (p0 == p1 && p0 == nmaches) + break; + else if (nmaches >= p0 && p1 == 0xFFFF) + break; + else if (nmaches >= p0 && nmaches <= p1) + break; } } } @@ -3246,15 +4151,18 @@ static const TRexChar *trex_matchnode(TRex *exp, TRexNode *node, const TRexChar if (s >= exp->_eol) break; } - if (p0 == p1 && p0 == nmaches) return good; - else if (nmaches >= p0 && p1 == 0xFFFF) return good; - else if (nmaches >= p0 && nmaches <= p1) return good; + if (p0 == p1 && p0 == nmaches) + return good; + else if (nmaches >= p0 && p1 == 0xFFFF) + return good; + else if (nmaches >= p0 && nmaches <= p1) + return good; return NULL; } case OP_OR: { - const TRexChar *asd = str; - TRexNode *temp = &exp->_nodes[node->left]; - while ((asd = trex_matchnode(exp, temp, asd, NULL))) { + const TRexChar* asd = str; + TRexNode* temp = &exp->_nodes[node->left]; + while ((asd = trex_matchnode(exp, temp, asd, NULL)) != NULL) { if (temp->next != -1) temp = &exp->_nodes[temp->next]; else @@ -3262,18 +4170,19 @@ static const TRexChar *trex_matchnode(TRex *exp, TRexNode *node, const TRexChar } asd = str; temp = &exp->_nodes[node->right]; - while ((asd = trex_matchnode(exp, temp, asd, NULL))) { + while ((asd = trex_matchnode(exp, temp, asd, NULL)) != NULL) { if (temp->next != -1) temp = &exp->_nodes[temp->next]; else return asd; } return NULL; + break; } case OP_EXPR: case OP_NOCAPEXPR: { - TRexNode *n = &exp->_nodes[node->left]; - const TRexChar *cur = str; + TRexNode* n = &exp->_nodes[node->left]; + const TRexChar* cur = str; int capture = -1; if (node->type != OP_NOCAPEXPR && node->right == exp->_currsubexp) { capture = exp->_currsubexp; @@ -3282,45 +4191,47 @@ static const TRexChar *trex_matchnode(TRex *exp, TRexNode *node, const TRexChar } do { - TRexNode *subnext = NULL; + TRexNode* subnext = NULL; if (n->next != -1) { subnext = &exp->_nodes[n->next]; } else { subnext = next; } - if (!(cur = trex_matchnode(exp, n, cur, subnext))) { + if ((cur = trex_matchnode(exp, n, cur, subnext)) == NULL) { if (capture != -1) { exp->_matches[capture].begin = 0; exp->_matches[capture].len = 0; } return NULL; } - } while ((n->next != -1) && (n = &exp->_nodes[n->next])); + } while ((n->next != -1) && ((n = &exp->_nodes[n->next]) != NULL)); if (capture != -1) exp->_matches[capture].len = (int)(cur - exp->_matches[capture].begin); return cur; } case OP_WB: - if ((str == exp->_bol && !ISSPACE(*str)) - || ((str == exp->_eol && !ISSPACE(*(str - 1)))) - || ((!ISSPACE(*str) && ISSPACE(*(str + 1)))) - || ((ISSPACE(*str) && !ISSPACE(*(str + 1))))) { + if ((str == exp->_bol && !isspace(*str)) || (str == exp->_eol && !isspace(*(str - 1))) || (!isspace(*str) && isspace(*(str + 1))) || + (isspace(*str) && !isspace(*(str + 1)))) { return (node->left == 'b') ? str : NULL; } return (node->left == 'b') ? NULL : str; case OP_BOL: - if (str == exp->_bol) return str; + if (str == exp->_bol) + return str; return NULL; case OP_EOL: - if (str == exp->_eol) return str; + if (str == exp->_eol) + return str; return NULL; - case OP_DOT: + case OP_DOT: { str++; + } return str; case OP_NCLASS: case OP_CLASS: - if (trex_matchclass(exp, &exp->_nodes[node->left], *str) ? (type == OP_CLASS ? TRex_True : TRex_False) : (type == OP_NCLASS ? TRex_True : TRex_False)) { + if (trex_matchclass(exp, &exp->_nodes[node->left], *str) ? (type == OP_CLASS ? TRex_True : TRex_False) + : (type == OP_NCLASS ? TRex_True : TRex_False)) { str++; return str; } @@ -3333,31 +4244,32 @@ static const TRexChar *trex_matchnode(TRex *exp, TRexNode *node, const TRexChar return NULL; default: /* char */ if (exp->_flags & TREX_ICASE) { - if (*str != tolower(node->type) && *str != toupper(node->type)) return NULL; + if (*str != tolower(node->type) && *str != toupper(node->type)) + return NULL; } else { - if (*str != node->type) return NULL; + if (*str != node->type) + return NULL; } str++; return str; } - return NULL; } /* public api */ -TRex *trex_compile(const TRexChar *pattern, const TRexChar **error, int flags) { - TRex *exp = (TRex *)malloc(sizeof(TRex)); +TRex* trex_compile(const TRexChar* pattern, const TRexChar** error, int flags) { + TRex* exp = (TRex*)xmalloc(sizeof(TRex)); exp->_eol = exp->_bol = NULL; exp->_p = pattern; exp->_nallocated = (int)scstrlen(pattern) * sizeof(TRexChar); - exp->_nodes = (TRexNode *)malloc(exp->_nallocated * sizeof(TRexNode)); + exp->_nodes = (TRexNode*)xmalloc(exp->_nallocated * sizeof(TRexNode)); exp->_nsize = 0; exp->_matches = 0; exp->_nsubexpr = 0; exp->_first = trex_newnode(exp, OP_EXPR); exp->_error = error; - exp->_jmpbuf = malloc(sizeof(jmp_buf)); + exp->_jmpbuf = xmalloc(sizeof(jmp_buf)); exp->_flags = flags; - if (setjmp(*((jmp_buf *)exp->_jmpbuf)) == 0) { + if (setjmp(*((jmp_buf*)exp->_jmpbuf)) == 0) { int res = trex_list(exp); exp->_nodes[exp->_first].left = res; if (*exp->_p != '\0') @@ -3365,7 +4277,7 @@ TRex *trex_compile(const TRexChar *pattern, const TRexChar **error, int flags) { #ifdef _DEBUG { int nsize, i; - TRexNode *t; + TRexNode* t; nsize = exp->_nsize; t = &exp->_nodes[0]; scprintf(_SC("\n")); @@ -3379,7 +4291,7 @@ TRex *trex_compile(const TRexChar *pattern, const TRexChar **error, int flags) { scprintf(_SC("\n")); } #endif - exp->_matches = (TRexMatch *) malloc(exp->_nsubexpr * sizeof(TRexMatch)); + exp->_matches = (TRexMatch*)xmalloc(exp->_nsubexpr * sizeof(TRexMatch)); memset(exp->_matches, 0, exp->_nsubexpr * sizeof(TRexMatch)); } else { trex_free(exp); @@ -3388,17 +4300,17 @@ TRex *trex_compile(const TRexChar *pattern, const TRexChar **error, int flags) { return exp; } -void trex_free(TRex *exp) { +void trex_free(TRex* exp) { if (exp) { - if (exp->_nodes) free(exp->_nodes); - if (exp->_jmpbuf) free(exp->_jmpbuf); - if (exp->_matches) free(exp->_matches); - free(exp); + xfree(exp->_nodes); + xfree(exp->_jmpbuf); + xfree(exp->_matches); + xfree(exp); } } -TRexBool trex_match(TRex *exp, const TRexChar *text) { - const TRexChar *res = NULL; +TRexBool trex_match(TRex* exp, const TRexChar* text) { + const TRexChar* res = NULL; exp->_bol = text; exp->_eol = text + scstrlen(text); exp->_currsubexp = 0; @@ -3408,10 +4320,11 @@ TRexBool trex_match(TRex *exp, const TRexChar *text) { return TRex_True; } -TRexBool trex_searchrange(TRex *exp, const TRexChar *text_begin, const TRexChar *text_end, const TRexChar **out_begin, const TRexChar **out_end) { - const TRexChar *cur = NULL; +TRexBool trex_searchrange(TRex* exp, const TRexChar* text_begin, const TRexChar* text_end, const TRexChar** out_begin, const TRexChar** out_end) { + const TRexChar* cur = NULL; int node = exp->_first; - if (text_begin >= text_end) return TRex_False; + if (text_begin >= text_end) + return TRex_False; exp->_bol = text_begin; exp->_eol = text_end; do { @@ -3431,25 +4344,30 @@ TRexBool trex_searchrange(TRex *exp, const TRexChar *text_begin, const TRexChar --text_begin; - if (out_begin) *out_begin = text_begin; - if (out_end) *out_end = cur; + if (out_begin) + *out_begin = text_begin; + if (out_end) + *out_end = cur; return TRex_True; } -TRexBool trex_search(TRex *exp, const TRexChar *text, const TRexChar **out_begin, const TRexChar **out_end) { +TRexBool trex_search(TRex* exp, const TRexChar* text, const TRexChar** out_begin, const TRexChar** out_end) { return trex_searchrange(exp, text, text + scstrlen(text), out_begin, out_end); } -int trex_getsubexpcount(TRex *exp) { +int trex_getsubexpcount(TRex* exp) { return exp->_nsubexpr; } -TRexBool trex_getsubexp(TRex *exp, int n, TRexMatch *subexp) { - if (n < 0 || n >= exp->_nsubexpr) return TRex_False; +TRexBool trex_getsubexp(TRex* exp, int n, TRexMatch* subexp) { + if (n < 0 || n >= exp->_nsubexpr) + return TRex_False; *subexp = exp->_matches[n]; return TRex_True; } /******************************************************************************* + * arg_str: Implements the str command-line option + * * This file is part of the argtable3 library. * * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann @@ -3479,31 +4397,34 @@ TRexBool trex_getsubexp(TRex *exp, int n, TRexMatch *subexp) { * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ -#include - #include "argtable3.h" +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#endif -static void arg_str_resetfn(struct arg_str *parent) { +#include + +static void arg_str_resetfn(struct arg_str* parent) { int i; + ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent)); - parent->count = 0; for (i = 0; i < parent->count; i++) { parent->sval[i] = ""; } + parent->count = 0; } - -static int arg_str_scanfn(struct arg_str *parent, const char *argval) { +static int arg_str_scanfn(struct arg_str* parent, const char* argval) { int errorcode = 0; if (parent->count == parent->hdr.maxcount) { /* maximum number of arguments exceeded */ - errorcode = EMAXCOUNT; + errorcode = ARG_ERR_MAXCOUNT; } else if (!argval) { /* a valid argument with no argument value was given. */ /* This happens when an optional argument value was invoked. */ - /* leave parent arguiment value unaltered but still count the argument. */ + /* leave parent argument value unaltered but still count the argument. */ parent->count++; } else { parent->sval[parent->count++] = argval; @@ -3513,110 +4434,366 @@ static int arg_str_scanfn(struct arg_str *parent, const char *argval) { return errorcode; } - -static int arg_str_checkfn(struct arg_str *parent) { - int errorcode = (parent->count < parent->hdr.mincount) ? EMINCOUNT : 0; +static int arg_str_checkfn(struct arg_str* parent) { + int errorcode = (parent->count < parent->hdr.mincount) ? ARG_ERR_MINCOUNT : 0; ARG_TRACE(("%s:checkfn(%p) returns %d\n", __FILE__, parent, errorcode)); return errorcode; } - -static void arg_str_errorfn( - struct arg_str *parent, - FILE *fp, - int errorcode, - const char *argval, - const char *progname) { - const char *shortopts = parent->hdr.shortopts; - const char *longopts = parent->hdr.longopts; - const char *datatype = parent->hdr.datatype; +static void arg_str_errorfn(struct arg_str* parent, arg_dstr_t ds, int errorcode, const char* argval, const char* progname) { + const char* shortopts = parent->hdr.shortopts; + const char* longopts = parent->hdr.longopts; + const char* datatype = parent->hdr.datatype; /* make argval NULL safe */ argval = argval ? argval : ""; - fprintf(fp, "%s: ", progname); + arg_dstr_catf(ds, "%s: ", progname); switch (errorcode) { - case EMINCOUNT: - fputs("missing option ", fp); - arg_print_option(fp, shortopts, longopts, datatype, "\n"); + case ARG_ERR_MINCOUNT: + arg_dstr_cat(ds, "missing option "); + arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); break; - case EMAXCOUNT: - fputs("excess option ", fp); - arg_print_option(fp, shortopts, longopts, argval, "\n"); + case ARG_ERR_MAXCOUNT: + arg_dstr_cat(ds, "excess option "); + arg_print_option_ds(ds, shortopts, longopts, argval, "\n"); break; } } - -struct arg_str *arg_str0( - const char *shortopts, - const char *longopts, - const char *datatype, - const char *glossary) { +struct arg_str* arg_str0(const char* shortopts, const char* longopts, const char* datatype, const char* glossary) { return arg_strn(shortopts, longopts, datatype, 0, 1, glossary); } - -struct arg_str *arg_str1( - const char *shortopts, - const char *longopts, - const char *datatype, - const char *glossary) { +struct arg_str* arg_str1(const char* shortopts, const char* longopts, const char* datatype, const char* glossary) { return arg_strn(shortopts, longopts, datatype, 1, 1, glossary); } - -struct arg_str *arg_strn( - const char *shortopts, - const char *longopts, - const char *datatype, - int mincount, - int maxcount, - const char *glossary) { +struct arg_str* arg_strn(const char* shortopts, const char* longopts, const char* datatype, int mincount, int maxcount, const char* glossary) { size_t nbytes; - struct arg_str *result; + struct arg_str* result; + int i; /* should not allow this stupid error */ /* we should return an error code warning this logic error */ /* foolproof things by ensuring maxcount is not less than mincount */ maxcount = (maxcount < mincount) ? mincount : maxcount; - nbytes = sizeof(struct arg_str) /* storage for struct arg_str */ - + maxcount * sizeof(char *); /* storage for sval[maxcount] array */ + nbytes = sizeof(struct arg_str) /* storage for struct arg_str */ + + maxcount * sizeof(char*); /* storage for sval[maxcount] array */ - result = (struct arg_str *)malloc(nbytes); - if (result) { - int i; + result = (struct arg_str*)xmalloc(nbytes); - /* init the arg_hdr struct */ - result->hdr.flag = ARG_HASVALUE; - result->hdr.shortopts = shortopts; - result->hdr.longopts = longopts; - result->hdr.datatype = datatype ? datatype : ""; - result->hdr.glossary = glossary; - result->hdr.mincount = mincount; - result->hdr.maxcount = maxcount; - result->hdr.parent = result; - result->hdr.resetfn = (arg_resetfn *)arg_str_resetfn; - result->hdr.scanfn = (arg_scanfn *)arg_str_scanfn; - result->hdr.checkfn = (arg_checkfn *)arg_str_checkfn; - result->hdr.errorfn = (arg_errorfn *)arg_str_errorfn; + /* init the arg_hdr struct */ + result->hdr.flag = ARG_HASVALUE; + result->hdr.shortopts = shortopts; + result->hdr.longopts = longopts; + result->hdr.datatype = datatype ? datatype : ""; + result->hdr.glossary = glossary; + result->hdr.mincount = mincount; + result->hdr.maxcount = maxcount; + result->hdr.parent = result; + result->hdr.resetfn = (arg_resetfn*)arg_str_resetfn; + result->hdr.scanfn = (arg_scanfn*)arg_str_scanfn; + result->hdr.checkfn = (arg_checkfn*)arg_str_checkfn; + result->hdr.errorfn = (arg_errorfn*)arg_str_errorfn; - /* store the sval[maxcount] array immediately after the arg_str struct */ - result->sval = (const char * *)(result + 1); - result->count = 0; + /* store the sval[maxcount] array immediately after the arg_str struct */ + result->sval = (const char**)(result + 1); + result->count = 0; - /* foolproof the string pointers by initialising them to reference empty strings */ - for (i = 0; i < maxcount; i++) - result->sval[i] = ""; - } + /* foolproof the string pointers by initializing them to reference empty strings */ + for (i = 0; i < maxcount; i++) + result->sval[i] = ""; ARG_TRACE(("arg_strn() returns %p\n", result)); return result; } /******************************************************************************* + * arg_cmd: Provides the sub-command mechanism + * + * This file is part of the argtable3 library. + * + * Copyright (C) 2013-2019 Tom G. Huang + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of STEWART HEITMANN 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 COPYRIGHT HOLDERS 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 STEWART HEITMANN 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 "argtable3.h" + +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#endif + +#include +#include +#include + +#define MAX_MODULE_VERSION_SIZE 128 + +static arg_hashtable_t* s_hashtable = NULL; +static char* s_module_name = NULL; +static int s_mod_ver_major = 0; +static int s_mod_ver_minor = 0; +static int s_mod_ver_patch = 0; +static char* s_mod_ver_tag = NULL; +static char* s_mod_ver = NULL; + +void arg_set_module_name(const char* name) { + size_t slen; + + xfree(s_module_name); + slen = strlen(name); + s_module_name = (char*)xmalloc(slen + 1); + memset(s_module_name, 0, slen + 1); + +#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || (defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__)) + strncpy_s(s_module_name, slen + 1, name, slen); +#else + memcpy(s_module_name, name, slen); +#endif +} + +void arg_set_module_version(int major, int minor, int patch, const char* tag) { + size_t slen_tag, slen_ds; + arg_dstr_t ds; + + s_mod_ver_major = major; + s_mod_ver_minor = minor; + s_mod_ver_patch = patch; + + xfree(s_mod_ver_tag); + slen_tag = strlen(tag); + s_mod_ver_tag = (char*)xmalloc(slen_tag + 1); + memset(s_mod_ver_tag, 0, slen_tag + 1); + +#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || (defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__)) + strncpy_s(s_mod_ver_tag, slen_tag + 1, tag, slen_tag); +#else + memcpy(s_mod_ver_tag, tag, slen_tag); +#endif + + ds = arg_dstr_create(); + arg_dstr_catf(ds, "%d.", s_mod_ver_major); + arg_dstr_catf(ds, "%d.", s_mod_ver_minor); + arg_dstr_catf(ds, "%d.", s_mod_ver_patch); + arg_dstr_cat(ds, s_mod_ver_tag); + + xfree(s_mod_ver); + slen_ds = strlen(arg_dstr_cstr(ds)); + s_mod_ver = (char*)xmalloc(slen_ds + 1); + memset(s_mod_ver, 0, slen_ds + 1); + +#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || (defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__)) + strncpy_s(s_mod_ver, slen_ds + 1, arg_dstr_cstr(ds), slen_ds); +#else + memcpy(s_mod_ver, arg_dstr_cstr(ds), slen_ds); +#endif + + arg_dstr_destroy(ds); +} + +static unsigned int hash_key(const void* key) { + const char* str = (const char*)key; + int c; + unsigned int hash = 5381; + + while ((c = *str++) != 0) + hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ + + return hash; +} + +static int equal_keys(const void* key1, const void* key2) { + char* k1 = (char*)key1; + char* k2 = (char*)key2; + return (0 == strcmp(k1, k2)); +} + +void arg_cmd_init(void) { + s_hashtable = arg_hashtable_create(32, hash_key, equal_keys); +} + +void arg_cmd_uninit(void) { + arg_hashtable_destroy(s_hashtable, 1); +} + +void arg_cmd_register(const char* name, arg_cmdfn* proc, const char* description) { + arg_cmd_info_t* cmd_info; + size_t slen_name; + void* k; + + assert(strlen(name) < ARG_CMD_NAME_LEN); + assert(strlen(description) < ARG_CMD_DESCRIPTION_LEN); + + /* Check if the command already exists. */ + /* If the command exists, replace the existing command. */ + /* If the command doesn't exist, insert the command. */ + cmd_info = (arg_cmd_info_t*)arg_hashtable_search(s_hashtable, name); + if (cmd_info) { + arg_hashtable_remove(s_hashtable, name); + cmd_info = NULL; + } + + cmd_info = (arg_cmd_info_t*)xmalloc(sizeof(arg_cmd_info_t)); + memset(cmd_info, 0, sizeof(arg_cmd_info_t)); + +#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || (defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__)) + strncpy_s(cmd_info->name, ARG_CMD_NAME_LEN, name, strlen(name)); + strncpy_s(cmd_info->description, ARG_CMD_DESCRIPTION_LEN, description, strlen(description)); +#else + memcpy(cmd_info->name, name, strlen(name)); + memcpy(cmd_info->description, description, strlen(description)); +#endif + + cmd_info->proc = proc; + + slen_name = strlen(name); + k = xmalloc(slen_name + 1); + memset(k, 0, slen_name + 1); + +#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || (defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__)) + strncpy_s((char*)k, slen_name + 1, name, slen_name); +#else + memcpy((char*)k, name, slen_name); +#endif + + arg_hashtable_insert(s_hashtable, k, cmd_info); +} + +void arg_cmd_unregister(const char* name) { + arg_hashtable_remove(s_hashtable, name); +} + +int arg_cmd_dispatch(const char* name, int argc, char* argv[], arg_dstr_t res) { + arg_cmd_info_t* cmd_info = arg_cmd_info(name); + + assert(cmd_info != NULL); + assert(cmd_info->proc != NULL); + + return cmd_info->proc(argc, argv, res); +} + +arg_cmd_info_t* arg_cmd_info(const char* name) { + return (arg_cmd_info_t*)arg_hashtable_search(s_hashtable, name); +} + +unsigned int arg_cmd_count(void) { + return arg_hashtable_count(s_hashtable); +} + +arg_cmd_itr_t arg_cmd_itr_create(void) { + return (arg_cmd_itr_t)arg_hashtable_itr_create(s_hashtable); +} + +int arg_cmd_itr_advance(arg_cmd_itr_t itr) { + return arg_hashtable_itr_advance((arg_hashtable_itr_t*)itr); +} + +char* arg_cmd_itr_key(arg_cmd_itr_t itr) { + return (char*)arg_hashtable_itr_key((arg_hashtable_itr_t*)itr); +} + +arg_cmd_info_t* arg_cmd_itr_value(arg_cmd_itr_t itr) { + return (arg_cmd_info_t*)arg_hashtable_itr_value((arg_hashtable_itr_t*)itr); +} + +void arg_cmd_itr_destroy(arg_cmd_itr_t itr) { + arg_hashtable_itr_destroy((arg_hashtable_itr_t*)itr); +} + +int arg_cmd_itr_search(arg_cmd_itr_t itr, void* k) { + return arg_hashtable_itr_search((arg_hashtable_itr_t*)itr, s_hashtable, k); +} + +static const char* module_name(void) { + if (s_module_name == NULL || strlen(s_module_name) == 0) + return ""; + + return s_module_name; +} + +static const char* module_version(void) { + if (s_mod_ver == NULL || strlen(s_mod_ver) == 0) + return "0.0.0.0"; + + return s_mod_ver; +} + +void arg_make_get_help_msg(arg_dstr_t res) { + arg_dstr_catf(res, "%s v%s\n", module_name(), module_version()); + arg_dstr_catf(res, "Please type '%s help' to get more information.\n", module_name()); +} + +void arg_make_help_msg(arg_dstr_t ds, char* cmd_name, void** argtable) { + arg_cmd_info_t* cmd_info = (arg_cmd_info_t*)arg_hashtable_search(s_hashtable, cmd_name); + if (cmd_info) { + arg_dstr_catf(ds, "%s: %s\n", cmd_name, cmd_info->description); + } + + arg_dstr_cat(ds, "Usage:\n"); + arg_dstr_catf(ds, " %s", module_name()); + + arg_print_syntaxv_ds(ds, argtable, "\n \nAvailable options:\n"); + arg_print_glossary_ds(ds, argtable, " %-23s %s\n"); + + arg_dstr_cat(ds, "\n"); +} + +void arg_make_syntax_err_msg(arg_dstr_t ds, void** argtable, struct arg_end* end) { + arg_print_errors_ds(ds, end, module_name()); + arg_dstr_cat(ds, "Usage: \n"); + arg_dstr_catf(ds, " %s", module_name()); + arg_print_syntaxv_ds(ds, argtable, "\n"); + arg_dstr_cat(ds, "\n"); +} + +int arg_make_syntax_err_help_msg(arg_dstr_t ds, char* name, int help, int nerrors, void** argtable, struct arg_end* end, int* exitcode) { + /* help handling + * note: '-h|--help' takes precedence over error reporting + */ + if (help > 0) { + arg_make_help_msg(ds, name, argtable); + *exitcode = EXIT_SUCCESS; + return 1; + } + + /* syntax error handling */ + if (nerrors > 0) { + arg_make_syntax_err_msg(ds, argtable, end); + *exitcode = EXIT_FAILURE; + return 1; + } + + return 0; +} +/******************************************************************************* + * argtable3: Implements the main interfaces of the library + * * This file is part of the argtable3 library. * * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann @@ -3646,18 +4823,26 @@ struct arg_str *arg_strn( * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ -#include -#include -#include -#include - #include "argtable3.h" -static -void arg_register_error(struct arg_end *end, - void *parent, - int error, - const char *argval) { +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#include "getopt.h" +#endif + +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#include +#undef WIN32_LEAN_AND_MEAN +#endif + +#include +#include +#include +#include +#include + +static void arg_register_error(struct arg_end* end, void* parent, int error, const char* argval) { /* printf("arg_register_error(%p,%p,%d,%s)\n",end,parent,error,argval); */ if (end->count < end->hdr.maxcount) { end->error[end->count] = error; @@ -3665,22 +4850,20 @@ void arg_register_error(struct arg_end *end, end->argval[end->count] = argval; end->count++; } else { - end->error[end->hdr.maxcount - 1] = ARG_ELIMIT; + end->error[end->hdr.maxcount - 1] = ARG_ELIMIT; end->parent[end->hdr.maxcount - 1] = end; end->argval[end->hdr.maxcount - 1] = NULL; } } - /* * Return index of first table entry with a matching short option * or -1 if no match was found. */ -static int find_shortoption(struct arg_hdr **table, char shortopt) { +static int find_shortoption(struct arg_hdr** table, char shortopt) { int tabindex; for (tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { - if (table[tabindex]->shortopts && - strchr(table[tabindex]->shortopts, shortopt)) + if (table[tabindex]->shortopts && strchr(table[tabindex]->shortopts, shortopt)) return tabindex; } return -1; @@ -3689,16 +4872,18 @@ static int find_shortoption(struct arg_hdr **table, char shortopt) { struct longoptions { int getoptval; int noptions; - struct option *options; + struct option* options; }; #if 0 static -void dump_longoptions(struct longoptions *longoptions) { +void dump_longoptions(struct longoptions * longoptions) +{ int i; printf("getoptval = %d\n", longoptions->getoptval); printf("noptions = %d\n", longoptions->noptions); - for (i = 0; i < longoptions->noptions; i++) { + for (i = 0; i < longoptions->noptions; i++) + { printf("options[%d].name = \"%s\"\n", i, longoptions->options[i].name); @@ -3709,12 +4894,14 @@ void dump_longoptions(struct longoptions *longoptions) { } #endif -static struct longoptions *alloc_longoptions(struct arg_hdr **table) { - struct longoptions *result; +static struct longoptions* alloc_longoptions(struct arg_hdr** table) { + struct longoptions* result; size_t nbytes; int noptions = 1; size_t longoptlen = 0; int tabindex; + int option_index = 0; + char* store; /* * Determine the total number of option structs required @@ -3728,7 +4915,7 @@ static struct longoptions *alloc_longoptions(struct arg_hdr **table) { */ tabindex = 0; do { - const char *longopts = table[tabindex]->longopts; + const char* longopts = table[tabindex]->longopts; longoptlen += (longopts ? strlen(longopts) : 0) + 1; while (longopts) { noptions++; @@ -3737,130 +4924,110 @@ static struct longoptions *alloc_longoptions(struct arg_hdr **table) { } while (!(table[tabindex++]->flag & ARG_TERMINATOR)); /*printf("%d long options consuming %d chars in total\n",noptions,longoptlen);*/ - /* allocate storage for return data structure as: */ /* (struct longoptions) + (struct options)[noptions] + char[longoptlen] */ - nbytes = sizeof(struct longoptions) - + sizeof(struct option) * noptions - + longoptlen; - result = (struct longoptions *)malloc(nbytes); - if (result) { - int option_index = 0; - char *store; + nbytes = sizeof(struct longoptions) + sizeof(struct option) * noptions + longoptlen; + result = (struct longoptions*)xmalloc(nbytes); - result->getoptval = 0; - result->noptions = noptions; - result->options = (struct option *)(result + 1); - store = (char *)(result->options + noptions); + result->getoptval = 0; + result->noptions = noptions; + result->options = (struct option*)(result + 1); + store = (char*)(result->options + noptions); - for (tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { - const char *longopts = table[tabindex]->longopts; + for (tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { + const char* longopts = table[tabindex]->longopts; - while (longopts && *longopts) { - char *storestart = store; + while (longopts && *longopts) { + char* storestart = store; - /* copy progressive longopt strings into the store */ - while (*longopts != 0 && *longopts != ',') - *store++ = *longopts++; - *store++ = 0; - if (*longopts == ',') - longopts++; - /*fprintf(stderr,"storestart=\"%s\"\n",storestart);*/ + /* copy progressive longopt strings into the store */ + while (*longopts != 0 && *longopts != ',') + *store++ = *longopts++; + *store++ = 0; + if (*longopts == ',') + longopts++; + /*fprintf(stderr,"storestart=\"%s\"\n",storestart);*/ - result->options[option_index].name = storestart; - result->options[option_index].flag = &(result->getoptval); - result->options[option_index].val = tabindex; - if (table[tabindex]->flag & ARG_HASOPTVALUE) - result->options[option_index].has_arg = 2; - else if (table[tabindex]->flag & ARG_HASVALUE) - result->options[option_index].has_arg = 1; - else - result->options[option_index].has_arg = 0; + result->options[option_index].name = storestart; + result->options[option_index].flag = &(result->getoptval); + result->options[option_index].val = tabindex; + if (table[tabindex]->flag & ARG_HASOPTVALUE) + result->options[option_index].has_arg = 2; + else if (table[tabindex]->flag & ARG_HASVALUE) + result->options[option_index].has_arg = 1; + else + result->options[option_index].has_arg = 0; - option_index++; - } + option_index++; } - /* terminate the options array with a zero-filled entry */ - result->options[option_index].name = 0; - result->options[option_index].has_arg = 0; - result->options[option_index].flag = 0; - result->options[option_index].val = 0; } + /* terminate the options array with a zero-filled entry */ + result->options[option_index].name = 0; + result->options[option_index].has_arg = 0; + result->options[option_index].flag = 0; + result->options[option_index].val = 0; /*dump_longoptions(result);*/ return result; } -static char *alloc_shortoptions(struct arg_hdr **table) { - char *result; +static char* alloc_shortoptions(struct arg_hdr** table) { + char* result; size_t len = 2; int tabindex; + char* res; /* determine the total number of option chars required */ for (tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { - struct arg_hdr *hdr = table[tabindex]; + struct arg_hdr* hdr = table[tabindex]; len += 3 * (hdr->shortopts ? strlen(hdr->shortopts) : 0); } - result = malloc(len); - if (result) { - char *res = result; + result = xmalloc(len); - /* add a leading ':' so getopt return codes distinguish */ - /* unrecognised option and options missing argument values */ - *res++ = ':'; + res = result; - for (tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { - struct arg_hdr *hdr = table[tabindex]; - const char *shortopts = hdr->shortopts; - while (shortopts && *shortopts) { - *res++ = *shortopts++; - if (hdr->flag & ARG_HASVALUE) - *res++ = ':'; - if (hdr->flag & ARG_HASOPTVALUE) - *res++ = ':'; - } + /* add a leading ':' so getopt return codes distinguish */ + /* unrecognised option and options missing argument values */ + *res++ = ':'; + + for (tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { + struct arg_hdr* hdr = table[tabindex]; + const char* shortopts = hdr->shortopts; + while (shortopts && *shortopts) { + *res++ = *shortopts++; + if (hdr->flag & ARG_HASVALUE) + *res++ = ':'; + if (hdr->flag & ARG_HASOPTVALUE) + *res++ = ':'; } - /* null terminate the string */ - *res = 0; } + /* null terminate the string */ + *res = 0; /*printf("alloc_shortoptions() returns \"%s\"\n",(result?result:"NULL"));*/ return result; } - /* return index of the table terminator entry */ -static int arg_endindex(struct arg_hdr **table) { +static int arg_endindex(struct arg_hdr** table) { int tabindex = 0; while (!(table[tabindex]->flag & ARG_TERMINATOR)) tabindex++; return tabindex; } - -static void arg_parse_tagged(int argc, - char **argv, - struct arg_hdr **table, - struct arg_end *endtable) { - struct longoptions *longoptions; - char *shortoptions; +static void arg_parse_tagged(int argc, char** argv, struct arg_hdr** table, struct arg_end* endtable) { + struct longoptions* longoptions; + char* shortoptions; int copt; /*printf("arg_parse_tagged(%d,%p,%p,%p)\n",argc,argv,table,endtable);*/ /* allocate short and long option arrays for the given opttable[]. */ /* if the allocs fail then put an error msg in the last table entry. */ - longoptions = alloc_longoptions(table); + longoptions = alloc_longoptions(table); shortoptions = alloc_shortoptions(table); - if (!longoptions || !shortoptions) { - /* one or both memory allocs failed */ - arg_register_error(endtable, endtable, ARG_EMALLOC, NULL); - /* free anything that was allocated (this is null safe) */ - free(shortoptions); - free(longoptions); - return; - } /*dump_longoptions(longoptions);*/ @@ -3869,9 +5036,7 @@ static void arg_parse_tagged(int argc, opterr = 0; /* fetch and process args using getopt_long */ - while ((copt = - getopt_long(argc, argv, shortoptions, longoptions->options, - NULL)) != -1) { + while ((copt = getopt_long(argc, argv, shortoptions, longoptions->options, NULL)) != -1) { /* printf("optarg='%s'\n",optarg); printf("optind=%d\n",optind); @@ -3881,13 +5046,11 @@ static void arg_parse_tagged(int argc, switch (copt) { case 0: { int tabindex = longoptions->getoptval; - void *parent = table[tabindex]->parent; + void* parent = table[tabindex]->parent; /*printf("long option detected from argtable[%d]\n", tabindex);*/ - if (optarg && optarg[0] == 0 && - (table[tabindex]->flag & ARG_HASVALUE)) { + if (optarg && optarg[0] == 0 && (table[tabindex]->flag & ARG_HASVALUE)) { /* printf(": long option %s requires an argument\n",argv[optind-1]); */ - arg_register_error(endtable, endtable, ARG_EMISSARG, - argv[optind - 1]); + arg_register_error(endtable, endtable, ARG_EMISSARG, argv[optind - 1]); /* continue to scan the (empty) argument value to enforce argument count checking */ } if (table[tabindex]->scanfn) { @@ -3895,8 +5058,7 @@ static void arg_parse_tagged(int argc, if (errorcode != 0) arg_register_error(endtable, parent, errorcode, optarg); } - } - break; + } break; case '?': /* @@ -3907,8 +5069,7 @@ static void arg_parse_tagged(int argc, switch (optopt) { case 0: /*printf("?0 unrecognised long option %s\n",argv[optind-1]);*/ - arg_register_error(endtable, endtable, ARG_ELONGOPT, - argv[optind - 1]); + arg_register_error(endtable, endtable, ARG_ELONGOPT, argv[optind - 1]); break; default: /*printf("?* unrecognised short option '%c'\n",optopt);*/ @@ -3922,8 +5083,7 @@ static void arg_parse_tagged(int argc, * getopt_long() found an option with its argument missing. */ /*printf(": option %s requires an argument\n",argv[optind-1]); */ - arg_register_error(endtable, endtable, ARG_EMISSARG, - argv[optind - 1]); + arg_register_error(endtable, endtable, ARG_EMISSARG, argv[optind - 1]); break; default: { @@ -3936,7 +5096,7 @@ static void arg_parse_tagged(int argc, arg_register_error(endtable, endtable, copt, NULL); } else { if (table[tabindex]->scanfn) { - void *parent = table[tabindex]->parent; + void* parent = table[tabindex]->parent; int errorcode = table[tabindex]->scanfn(parent, optarg); if (errorcode != 0) arg_register_error(endtable, parent, errorcode, optarg); @@ -3947,23 +5107,19 @@ static void arg_parse_tagged(int argc, } } - free(shortoptions); - free(longoptions); + xfree(shortoptions); + xfree(longoptions); } - -static void arg_parse_untagged(int argc, - char **argv, - struct arg_hdr **table, - struct arg_end *endtable) { +static void arg_parse_untagged(int argc, char** argv, struct arg_hdr** table, struct arg_end* endtable) { int tabindex = 0; int errorlast = 0; - const char *optarglast = NULL; - void *parentlast = NULL; + const char* optarglast = NULL; + void* parentlast = NULL; /*printf("arg_parse_untagged(%d,%p,%p,%p)\n",argc,argv,table,endtable);*/ while (!(table[tabindex]->flag & ARG_TERMINATOR)) { - void *parent; + void* parent; int errorcode; /* if we have exhausted our argv[optind] entries then we have finished */ @@ -4026,13 +5182,12 @@ static void arg_parse_untagged(int argc, return; } - -static void arg_parse_check(struct arg_hdr **table, struct arg_end *endtable) { +static void arg_parse_check(struct arg_hdr** table, struct arg_end* endtable) { int tabindex = 0; /* printf("arg_parse_check()\n"); */ do { if (table[tabindex]->checkfn) { - void *parent = table[tabindex]->parent; + void* parent = table[tabindex]->parent; int errorcode = table[tabindex]->checkfn(parent); if (errorcode != 0) arg_register_error(endtable, parent, errorcode, NULL); @@ -4040,9 +5195,8 @@ static void arg_parse_check(struct arg_hdr **table, struct arg_end *endtable) { } while (!(table[tabindex++]->flag & ARG_TERMINATOR)); } - -static void arg_reset(void **argtable) { - struct arg_hdr * *table = (struct arg_hdr * *)argtable; +static void arg_reset(void** argtable) { + struct arg_hdr** table = (struct arg_hdr**)argtable; int tabindex = 0; /*printf("arg_reset(%p)\n",argtable);*/ do { @@ -4051,12 +5205,12 @@ static void arg_reset(void **argtable) { } while (!(table[tabindex++]->flag & ARG_TERMINATOR)); } - -int arg_parse(int argc, char * *argv, void * *argtable) { - struct arg_hdr * *table = (struct arg_hdr * *)argtable; - struct arg_end *endtable; +int arg_parse(int argc, char** argv, void** argtable) { + struct arg_hdr** table = (struct arg_hdr**)argtable; + struct arg_end* endtable; int endindex; - char * *argvcopy = NULL; + char** argvcopy = NULL; + int i; /*printf("arg_parse(%d,%p,%p)\n",argc,argv,argtable);*/ @@ -4065,7 +5219,7 @@ int arg_parse(int argc, char * *argv, void * *argtable) { /* locate the first end-of-table marker within the array */ endindex = arg_endindex(table); - endtable = (struct arg_end *)table[endindex]; + endtable = (struct arg_end*)table[endindex]; /* Special case of argc==0. This can occur on Texas Instruments DSP. */ /* Failure to trap this case results in an unwanted NULL result from */ @@ -4078,41 +5232,34 @@ int arg_parse(int argc, char * *argv, void * *argtable) { return endtable->count; } - argvcopy = (char **)malloc(sizeof(char *) * (argc + 1)); - if (argvcopy) { - int i; + argvcopy = (char**)xmalloc(sizeof(char*) * (argc + 1)); - /* - Fill in the local copy of argv[]. We need a local copy - because getopt rearranges argv[] which adversely affects - susbsequent parsing attempts. - */ - for (i = 0; i < argc; i++) - argvcopy[i] = argv[i]; + /* + Fill in the local copy of argv[]. We need a local copy + because getopt rearranges argv[] which adversely affects + susbsequent parsing attempts. + */ + for (i = 0; i < argc; i++) + argvcopy[i] = argv[i]; - argvcopy[argc] = NULL; + argvcopy[argc] = NULL; - /* parse the command line (local copy) for tagged options */ - arg_parse_tagged(argc, argvcopy, table, endtable); + /* parse the command line (local copy) for tagged options */ + arg_parse_tagged(argc, argvcopy, table, endtable); - /* parse the command line (local copy) for untagged options */ - arg_parse_untagged(argc, argvcopy, table, endtable); + /* parse the command line (local copy) for untagged options */ + arg_parse_untagged(argc, argvcopy, table, endtable); - /* if no errors so far then perform post-parse checks otherwise dont bother */ - if (endtable->count == 0) - arg_parse_check(table, endtable); + /* if no errors so far then perform post-parse checks otherwise dont bother */ + if (endtable->count == 0) + arg_parse_check(table, endtable); - /* release the local copt of argv[] */ - free(argvcopy); - } else { - /* memory alloc failed */ - arg_register_error(endtable, endtable, ARG_EMALLOC, NULL); - } + /* release the local copt of argv[] */ + xfree(argvcopy); return endtable->count; } - /* * Concatenate contents of src[] string onto *pdest[] string. * The *pdest pointer is altered to point to the end of the @@ -4133,9 +5280,9 @@ int arg_parse(int argc, char * *argv, void * *argtable) { * dest[] == "goodbye cruel world!" * ndest == 10 */ -static void arg_cat(char **pdest, const char *src, size_t *pndest) { - char *dest = *pdest; - char *end = dest + *pndest; +static void arg_cat(char** pdest, const char* src, size_t* pndest) { + char* dest = *pdest; + char* end = dest + *pndest; /*locate null terminator of dest string */ while (dest < end && *dest != 0) @@ -4150,16 +5297,10 @@ static void arg_cat(char **pdest, const char *src, size_t *pndest) { /* update *pdest and *pndest */ *pndest = end - dest; - *pdest = dest; + *pdest = dest; } - -static void arg_cat_option(char *dest, - size_t ndest, - const char *shortopts, - const char *longopts, - const char *datatype, - int optvalue) { +static void arg_cat_option(char* dest, size_t ndest, const char* shortopts, const char* longopts, const char* datatype, int optvalue) { if (shortopts) { char option[3]; @@ -4187,7 +5328,7 @@ static void arg_cat_option(char *dest, /* add comma separated option tag */ ncspn = strcspn(longopts, ","); -#ifdef __STDC_WANT_SECURE_LIB__ +#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || (defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__)) strncat_s(dest, ndest, longopts, (ncspn < ndest) ? ncspn : ndest); #else strncat(dest, longopts, (ncspn < ndest) ? ncspn : ndest); @@ -4212,17 +5353,12 @@ static void arg_cat_option(char *dest, } } -static void arg_cat_optionv(char *dest, - size_t ndest, - const char *shortopts, - const char *longopts, - const char *datatype, - int optvalue, - const char *separator) { +static void +arg_cat_optionv(char* dest, size_t ndest, const char* shortopts, const char* longopts, const char* datatype, int optvalue, const char* separator) { separator = separator ? separator : ""; if (shortopts) { - const char *c = shortopts; + const char* c = shortopts; while (*c) { /* "-a|-b|-c" */ char shortopt[3]; @@ -4244,7 +5380,7 @@ static void arg_cat_optionv(char *dest, arg_cat(&dest, separator, &ndest); if (longopts) { - const char *c = longopts; + const char* c = longopts; while (*c) { size_t ncspn; @@ -4253,7 +5389,7 @@ static void arg_cat_optionv(char *dest, /* add comma separated option tag */ ncspn = strcspn(c, ","); -#ifdef __STDC_WANT_SECURE_LIB__ +#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || (defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__)) strncat_s(dest, ndest, c, (ncspn < ndest) ? ncspn : ndest); #else strncat(dest, c, (ncspn < ndest) ? ncspn : ndest); @@ -4283,46 +5419,38 @@ static void arg_cat_optionv(char *dest, } } - -/* this function should be deprecated because it doesnt consider optional argument values (ARG_HASOPTVALUE) */ -void arg_print_option(FILE *fp, - const char *shortopts, - const char *longopts, - const char *datatype, - const char *suffix) { +void arg_print_option_ds(arg_dstr_t ds, const char* shortopts, const char* longopts, const char* datatype, const char* suffix) { char syntax[200] = ""; suffix = suffix ? suffix : ""; /* there is no way of passing the proper optvalue for optional argument values here, so we must ignore it */ - arg_cat_optionv(syntax, - sizeof(syntax), - shortopts, - longopts, - datatype, - 0, - "|"); + arg_cat_optionv(syntax, sizeof(syntax), shortopts, longopts, datatype, 0, "|"); - fputs(syntax, fp); - fputs(suffix, fp); + arg_dstr_cat(ds, syntax); + arg_dstr_cat(ds, (char*)suffix); } +/* this function should be deprecated because it doesn't consider optional argument values (ARG_HASOPTVALUE) */ +void arg_print_option(FILE* fp, const char* shortopts, const char* longopts, const char* datatype, const char* suffix) { + arg_dstr_t ds = arg_dstr_create(); + arg_print_option_ds(ds, shortopts, longopts, datatype, suffix); + fputs(arg_dstr_cstr(ds), fp); + arg_dstr_destroy(ds); +} /* * Print a GNU style [OPTION] string in which all short options that * do not take argument values are presented in abbreviated form, as * in: -xvfsd, or -xvf[sd], or [-xvsfd] */ -static -void arg_print_gnuswitch(FILE *fp, struct arg_hdr * *table) { +static void arg_print_gnuswitch_ds(arg_dstr_t ds, struct arg_hdr** table) { int tabindex; - const char *format1 = " -%c"; - const char *format2 = " [-%c"; - const char *suffix = ""; + char* format1 = " -%c"; + char* format2 = " [-%c"; + char* suffix = ""; /* print all mandatory switches that are without argument values */ - for (tabindex = 0; - table[tabindex] && !(table[tabindex]->flag & ARG_TERMINATOR); - tabindex++) { + for (tabindex = 0; table[tabindex] && !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { /* skip optional options */ if (table[tabindex]->mincount < 1) continue; @@ -4336,15 +5464,13 @@ void arg_print_gnuswitch(FILE *fp, struct arg_hdr * *table) { continue; /* print the short option (only the first short option char, ignore multiple choices)*/ - fprintf(fp, format1, table[tabindex]->shortopts[0]); + arg_dstr_catf(ds, format1, table[tabindex]->shortopts[0]); format1 = "%c"; format2 = "[%c"; } /* print all optional switches that are without argument values */ - for (tabindex = 0; - table[tabindex] && !(table[tabindex]->flag & ARG_TERMINATOR); - tabindex++) { + for (tabindex = 0; table[tabindex] && !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { /* skip mandatory args */ if (table[tabindex]->mincount > 0) continue; @@ -4358,142 +5484,161 @@ void arg_print_gnuswitch(FILE *fp, struct arg_hdr * *table) { continue; /* print first short option */ - fprintf(fp, format2, table[tabindex]->shortopts[0]); + arg_dstr_catf(ds, format2, table[tabindex]->shortopts[0]); format2 = "%c"; suffix = "]"; } - fprintf(fp, "%s", suffix); + arg_dstr_catf(ds, "%s", suffix); } - -void arg_print_syntax(FILE *fp, void * *argtable, const char *suffix) { - struct arg_hdr * *table = (struct arg_hdr * *)argtable; +void arg_print_syntax_ds(arg_dstr_t ds, void** argtable, const char* suffix) { + struct arg_hdr** table = (struct arg_hdr**)argtable; int i, tabindex; /* print GNU style [OPTION] string */ - arg_print_gnuswitch(fp, table); + arg_print_gnuswitch_ds(ds, table); /* print remaining options in abbreviated style */ - for (tabindex = 0; - table[tabindex] && !(table[tabindex]->flag & ARG_TERMINATOR); - tabindex++) { + for (tabindex = 0; table[tabindex] && !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { char syntax[200] = ""; const char *shortopts, *longopts, *datatype; /* skip short options without arg values (they were printed by arg_print_gnu_switch) */ - if (table[tabindex]->shortopts && - !(table[tabindex]->flag & ARG_HASVALUE)) + if (table[tabindex]->shortopts && !(table[tabindex]->flag & ARG_HASVALUE)) continue; shortopts = table[tabindex]->shortopts; - longopts = table[tabindex]->longopts; - datatype = table[tabindex]->datatype; - arg_cat_option(syntax, - sizeof(syntax), - shortopts, - longopts, - datatype, - table[tabindex]->flag & ARG_HASOPTVALUE); + longopts = table[tabindex]->longopts; + datatype = table[tabindex]->datatype; + arg_cat_option(syntax, sizeof(syntax), shortopts, longopts, datatype, table[tabindex]->flag & ARG_HASOPTVALUE); if (strlen(syntax) > 0) { /* print mandatory instances of this option */ - for (i = 0; i < table[tabindex]->mincount; i++) - fprintf(fp, " %s", syntax); + for (i = 0; i < table[tabindex]->mincount; i++) { + arg_dstr_cat(ds, " "); + arg_dstr_cat(ds, syntax); + } /* print optional instances enclosed in "[..]" */ switch (table[tabindex]->maxcount - table[tabindex]->mincount) { case 0: break; case 1: - fprintf(fp, " [%s]", syntax); + arg_dstr_cat(ds, " ["); + arg_dstr_cat(ds, syntax); + arg_dstr_cat(ds, "]"); break; case 2: - fprintf(fp, " [%s] [%s]", syntax, syntax); + arg_dstr_cat(ds, " ["); + arg_dstr_cat(ds, syntax); + arg_dstr_cat(ds, "]"); + arg_dstr_cat(ds, " ["); + arg_dstr_cat(ds, syntax); + arg_dstr_cat(ds, "]"); break; default: - fprintf(fp, " [%s]...", syntax); + arg_dstr_cat(ds, " ["); + arg_dstr_cat(ds, syntax); + arg_dstr_cat(ds, "]..."); break; } } } - if (suffix) - fprintf(fp, "%s", suffix); + if (suffix) { + arg_dstr_cat(ds, (char*)suffix); + } } +void arg_print_syntax(FILE* fp, void** argtable, const char* suffix) { + arg_dstr_t ds = arg_dstr_create(); + arg_print_syntax_ds(ds, argtable, suffix); + fputs(arg_dstr_cstr(ds), fp); + arg_dstr_destroy(ds); +} -void arg_print_syntaxv(FILE *fp, void * *argtable, const char *suffix) { - struct arg_hdr * *table = (struct arg_hdr * *)argtable; +void arg_print_syntaxv_ds(arg_dstr_t ds, void** argtable, const char* suffix) { + struct arg_hdr** table = (struct arg_hdr**)argtable; int i, tabindex; /* print remaining options in abbreviated style */ - for (tabindex = 0; - table[tabindex] && !(table[tabindex]->flag & ARG_TERMINATOR); - tabindex++) { + for (tabindex = 0; table[tabindex] && !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { char syntax[200] = ""; const char *shortopts, *longopts, *datatype; shortopts = table[tabindex]->shortopts; - longopts = table[tabindex]->longopts; - datatype = table[tabindex]->datatype; - arg_cat_optionv(syntax, - sizeof(syntax), - shortopts, - longopts, - datatype, - table[tabindex]->flag & ARG_HASOPTVALUE, - "|"); + longopts = table[tabindex]->longopts; + datatype = table[tabindex]->datatype; + arg_cat_optionv(syntax, sizeof(syntax), shortopts, longopts, datatype, table[tabindex]->flag & ARG_HASOPTVALUE, "|"); /* print mandatory options */ - for (i = 0; i < table[tabindex]->mincount; i++) - fprintf(fp, " %s", syntax); + for (i = 0; i < table[tabindex]->mincount; i++) { + arg_dstr_cat(ds, " "); + arg_dstr_cat(ds, syntax); + } /* print optional args enclosed in "[..]" */ switch (table[tabindex]->maxcount - table[tabindex]->mincount) { case 0: break; case 1: - fprintf(fp, " [%s]", syntax); + arg_dstr_cat(ds, " ["); + arg_dstr_cat(ds, syntax); + arg_dstr_cat(ds, "]"); break; case 2: - fprintf(fp, " [%s] [%s]", syntax, syntax); + arg_dstr_cat(ds, " ["); + arg_dstr_cat(ds, syntax); + arg_dstr_cat(ds, "]"); + arg_dstr_cat(ds, " ["); + arg_dstr_cat(ds, syntax); + arg_dstr_cat(ds, "]"); break; default: - fprintf(fp, " [%s]...", syntax); + arg_dstr_cat(ds, " ["); + arg_dstr_cat(ds, syntax); + arg_dstr_cat(ds, "]..."); break; } } - if (suffix) - fprintf(fp, "%s", suffix); + if (suffix) { + arg_dstr_cat(ds, (char*)suffix); + } } +void arg_print_syntaxv(FILE* fp, void** argtable, const char* suffix) { + arg_dstr_t ds = arg_dstr_create(); + arg_print_syntaxv_ds(ds, argtable, suffix); + fputs(arg_dstr_cstr(ds), fp); + arg_dstr_destroy(ds); +} -void arg_print_glossary(FILE *fp, void * *argtable, const char *format) { - struct arg_hdr * *table = (struct arg_hdr * *)argtable; +void arg_print_glossary_ds(arg_dstr_t ds, void** argtable, const char* format) { + struct arg_hdr** table = (struct arg_hdr**)argtable; int tabindex; format = format ? format : " %-20s %s\n"; for (tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { if (table[tabindex]->glossary) { char syntax[200] = ""; - const char *shortopts = table[tabindex]->shortopts; - const char *longopts = table[tabindex]->longopts; - const char *datatype = table[tabindex]->datatype; - const char *glossary = table[tabindex]->glossary; - arg_cat_optionv(syntax, - sizeof(syntax), - shortopts, - longopts, - datatype, - table[tabindex]->flag & ARG_HASOPTVALUE, - ", "); - fprintf(fp, format, syntax, glossary); + const char* shortopts = table[tabindex]->shortopts; + const char* longopts = table[tabindex]->longopts; + const char* datatype = table[tabindex]->datatype; + const char* glossary = table[tabindex]->glossary; + arg_cat_optionv(syntax, sizeof(syntax), shortopts, longopts, datatype, table[tabindex]->flag & ARG_HASOPTVALUE, ", "); + arg_dstr_catf(ds, format, syntax, glossary); } } } +void arg_print_glossary(FILE* fp, void** argtable, const char* format) { + arg_dstr_t ds = arg_dstr_create(); + arg_print_glossary_ds(ds, argtable, format); + fputs(arg_dstr_cstr(ds), fp); + arg_dstr_destroy(ds); +} /** * Print a piece of text formatted, which means in a column with a @@ -4527,62 +5672,62 @@ void arg_print_glossary(FILE *fp, void * *argtable, const char *format) { * * Author: Uli Fouquet */ -static -void arg_print_formatted(FILE *fp, - const unsigned lmargin, - const unsigned rmargin, - const char *text) { - const unsigned textlen = (unsigned)strlen(text); - unsigned line_start = 0; - unsigned line_end = textlen + 1; - const unsigned colwidth = (rmargin - lmargin) + 1; +static void arg_print_formatted_ds(arg_dstr_t ds, const unsigned lmargin, const unsigned rmargin, const char* text) { + const unsigned int textlen = (unsigned int)strlen(text); + unsigned int line_start = 0; + unsigned int line_end = textlen; + const unsigned int colwidth = (rmargin - lmargin) + 1; + + assert(strlen(text) < UINT_MAX); /* Someone doesn't like us... */ - if (line_end == line_start) { - fprintf(fp, "%s\n", text); + if (line_end < line_start) { + arg_dstr_catf(ds, "%s\n", text); } - while (line_end - 1 > line_start) { - /* Eat leading whitespaces. This is essential because while + while (line_end > line_start) { + /* Eat leading white spaces. This is essential because while wrapping lines, there will often be a whitespace at beginning of line */ - while (ISSPACE(*(text + line_start))) - { line_start++; } - - if ((line_end - line_start) > colwidth) - { line_end = line_start + colwidth; } + while (isspace(*(text + line_start))) { + line_start++; + } /* Find last whitespace, that fits into line */ - while ((line_end > line_start) - && (line_end - line_start > colwidth) - && !ISSPACE(*(text + line_end))) - { line_end--; } + if (line_end - line_start > colwidth) { + line_end = line_start + colwidth; - /* Do not print trailing whitespace. If this text - has got only one line, line_end now points to the - last char due to initialization. */ - line_end--; + while ((line_end > line_start) && !isspace(*(text + line_end))) { + line_end--; + } + + /* Consume trailing spaces */ + while ((line_end > line_start) && isspace(*(text + line_end))) { + line_end--; + } + + /* Restore the last non-space character */ + line_end++; + } /* Output line of text */ while (line_start < line_end) { - fputc(*(text + line_start), fp); + char c = *(text + line_start); + arg_dstr_catc(ds, c); line_start++; } - fputc('\n', fp); + arg_dstr_cat(ds, "\n"); /* Initialize another line */ - if (line_end + 1 < textlen) { + if (line_end < textlen) { unsigned i; - for (i = 0; i < lmargin; i++) - { fputc(' ', fp); } + for (i = 0; i < lmargin; i++) { + arg_dstr_cat(ds, " "); + } line_end = textlen; } - - /* If we have to print another line, get also the last char. */ - line_end++; - } /* lines of text */ } @@ -4595,17 +5740,17 @@ void arg_print_formatted(FILE *fp, * * Contributed by Uli Fouquet */ -void arg_print_glossary_gnu(FILE *fp, void * *argtable) { - struct arg_hdr * *table = (struct arg_hdr * *)argtable; +void arg_print_glossary_gnu_ds(arg_dstr_t ds, void** argtable) { + struct arg_hdr** table = (struct arg_hdr**)argtable; int tabindex; for (tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { if (table[tabindex]->glossary) { char syntax[200] = ""; - const char *shortopts = table[tabindex]->shortopts; - const char *longopts = table[tabindex]->longopts; - const char *datatype = table[tabindex]->datatype; - const char *glossary = table[tabindex]->glossary; + const char* shortopts = table[tabindex]->shortopts; + const char* longopts = table[tabindex]->longopts; + const char* datatype = table[tabindex]->datatype; + const char* glossary = table[tabindex]->glossary; if (!shortopts && longopts) { /* Indent trailing line by 4 spaces... */ @@ -4613,35 +5758,35 @@ void arg_print_glossary_gnu(FILE *fp, void * *argtable) { *(syntax + 4) = '\0'; } - arg_cat_optionv(syntax, - sizeof(syntax), - shortopts, - longopts, - datatype, - table[tabindex]->flag & ARG_HASOPTVALUE, - ", "); + arg_cat_optionv(syntax, sizeof(syntax), shortopts, longopts, datatype, table[tabindex]->flag & ARG_HASOPTVALUE, ", "); /* If syntax fits not into column, print glossary in new line... */ if (strlen(syntax) > 25) { - fprintf(fp, " %-25s %s\n", syntax, ""); + arg_dstr_catf(ds, " %-25s %s\n", syntax, ""); *syntax = '\0'; } - fprintf(fp, " %-25s ", syntax); - arg_print_formatted(fp, 28, 79, glossary); + arg_dstr_catf(ds, " %-25s ", syntax); + arg_print_formatted_ds(ds, 28, 79, glossary); } } /* for each table entry */ - fputc('\n', fp); + arg_dstr_cat(ds, "\n"); } +void arg_print_glossary_gnu(FILE* fp, void** argtable) { + arg_dstr_t ds = arg_dstr_create(); + arg_print_glossary_gnu_ds(ds, argtable); + fputs(arg_dstr_cstr(ds), fp); + arg_dstr_destroy(ds); +} /** * Checks the argtable[] array for NULL entries and returns 1 * if any are found, zero otherwise. */ -int arg_nullcheck(void * *argtable) { - struct arg_hdr * *table = (struct arg_hdr * *)argtable; +int arg_nullcheck(void** argtable) { + struct arg_hdr** table = (struct arg_hdr**)argtable; int tabindex; /*printf("arg_nullcheck(%p)\n",argtable);*/ @@ -4669,8 +5814,8 @@ int arg_nullcheck(void * *argtable) { * with the newer arg_freetable() function. * We still keep arg_free() for backwards compatibility. */ -void arg_free(void * *argtable) { - struct arg_hdr * *table = (struct arg_hdr * *)argtable; +void arg_free(void** argtable) { + struct arg_hdr** table = (struct arg_hdr**)argtable; int tabindex = 0; int flag; /*printf("arg_free(%p)\n",argtable);*/ @@ -4685,23 +5830,31 @@ void arg_free(void * *argtable) { break; flag = table[tabindex]->flag; - free(table[tabindex]); + xfree(table[tabindex]); table[tabindex++] = NULL; } while (!(flag & ARG_TERMINATOR)); } /* frees each non-NULL element of argtable[], where n is the size of the number of entries in the array */ -void arg_freetable(void * *argtable, size_t n) { - struct arg_hdr * *table = (struct arg_hdr * *)argtable; +void arg_freetable(void** argtable, size_t n) { + struct arg_hdr** table = (struct arg_hdr**)argtable; size_t tabindex = 0; /*printf("arg_freetable(%p)\n",argtable);*/ for (tabindex = 0; tabindex < n; tabindex++) { if (table[tabindex] == NULL) continue; - free(table[tabindex]); + xfree(table[tabindex]); table[tabindex] = NULL; }; } +#ifdef _WIN32 +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { + return TRUE; + UNREFERENCED_PARAMETER(hinstDLL); + UNREFERENCED_PARAMETER(fdwReason); + UNREFERENCED_PARAMETER(lpvReserved); +} +#endif diff --git a/client/deps/cliparser/argtable3.h b/client/deps/cliparser/argtable3.h index d8e3c53cc..204253876 100644 --- a/client/deps/cliparser/argtable3.h +++ b/client/deps/cliparser/argtable3.h @@ -33,8 +33,8 @@ #ifndef ARGTABLE3 #define ARGTABLE3 -#include /* FILE */ -#include /* struct tm */ +#include /* FILE */ +#include /* struct tm */ #ifdef __cplusplus extern "C" { @@ -50,259 +50,226 @@ extern "C" { #endif /* ARG_REPLACE_GETOPT */ /* bit masks for arg_hdr.flag */ -enum { - ARG_TERMINATOR = 0x1, - ARG_HASVALUE = 0x2, - ARG_HASOPTVALUE = 0x4 -}; +enum { ARG_TERMINATOR = 0x1, ARG_HASVALUE = 0x2, ARG_HASOPTVALUE = 0x4 }; -typedef void (arg_resetfn)(void *parent); -typedef int (arg_scanfn)(void *parent, const char *argval); -typedef int (arg_checkfn)(void *parent); -typedef void (arg_errorfn)(void *parent, FILE *fp, int error, const char *argval, const char *progname); +#if defined(_WIN32) + #if defined(argtable3_EXPORTS) + #define ARG_EXTERN __declspec(dllexport) + #elif defined(argtable3_IMPORTS) + #define ARG_EXTERN __declspec(dllimport) + #else + #define ARG_EXTERN + #endif +#else + #define ARG_EXTERN +#endif +typedef struct _internal_arg_dstr* arg_dstr_t; +typedef void* arg_cmd_itr_t; + +typedef void(arg_resetfn)(void* parent); +typedef int(arg_scanfn)(void* parent, const char* argval); +typedef int(arg_checkfn)(void* parent); +typedef void(arg_errorfn)(void* parent, arg_dstr_t ds, int error, const char* argval, const char* progname); +typedef void(arg_dstr_freefn)(char* buf); +typedef int(arg_cmdfn)(int argc, char* argv[], arg_dstr_t res); +typedef int(arg_comparefn)(const void* k1, const void* k2); /* -* The arg_hdr struct defines properties that are common to all arg_xxx structs. -* The argtable library requires each arg_xxx struct to have an arg_hdr -* struct as its first data member. -* The argtable library functions then use this data to identify the -* properties of the command line option, such as its option tags, -* datatype string, and glossary strings, and so on. -* Moreover, the arg_hdr struct contains pointers to custom functions that -* are provided by each arg_xxx struct which perform the tasks of parsing -* that particular arg_xxx arguments, performing post-parse checks, and -* reporting errors. -* These functions are private to the individual arg_xxx source code -* and are the pointer to them are initiliased by that arg_xxx struct's -* constructor function. The user could alter them after construction -* if desired, but the original intention is for them to be set by the -* constructor and left unaltered. -*/ + * The arg_hdr struct defines properties that are common to all arg_xxx structs. + * The argtable library requires each arg_xxx struct to have an arg_hdr + * struct as its first data member. + * The argtable library functions then use this data to identify the + * properties of the command line option, such as its option tags, + * datatype string, and glossary strings, and so on. + * Moreover, the arg_hdr struct contains pointers to custom functions that + * are provided by each arg_xxx struct which perform the tasks of parsing + * that particular arg_xxx arguments, performing post-parse checks, and + * reporting errors. + * These functions are private to the individual arg_xxx source code + * and are the pointer to them are initiliased by that arg_xxx struct's + * constructor function. The user could alter them after construction + * if desired, but the original intention is for them to be set by the + * constructor and left unaltered. + */ struct arg_hdr { - char flag; /* Modifier flags: ARG_TERMINATOR, ARG_HASVALUE. */ - const char *shortopts; /* String defining the short options */ - const char *longopts; /* String defiing the long options */ - const char *datatype; /* Description of the argument data type */ - const char *glossary; /* Description of the option as shown by arg_print_glossary function */ - int mincount; /* Minimum number of occurences of this option accepted */ - int maxcount; /* Maximum number of occurences if this option accepted */ - void *parent; /* Pointer to parent arg_xxx struct */ - arg_resetfn *resetfn; /* Pointer to parent arg_xxx reset function */ - arg_scanfn *scanfn; /* Pointer to parent arg_xxx scan function */ - arg_checkfn *checkfn; /* Pointer to parent arg_xxx check function */ - arg_errorfn *errorfn; /* Pointer to parent arg_xxx error function */ - void *priv; /* Pointer to private header data for use by arg_xxx functions */ + char flag; /* Modifier flags: ARG_TERMINATOR, ARG_HASVALUE. */ + const char* shortopts; /* String defining the short options */ + const char* longopts; /* String defiing the long options */ + const char* datatype; /* Description of the argument data type */ + const char* glossary; /* Description of the option as shown by arg_print_glossary function */ + int mincount; /* Minimum number of occurences of this option accepted */ + int maxcount; /* Maximum number of occurences if this option accepted */ + void* parent; /* Pointer to parent arg_xxx struct */ + arg_resetfn* resetfn; /* Pointer to parent arg_xxx reset function */ + arg_scanfn* scanfn; /* Pointer to parent arg_xxx scan function */ + arg_checkfn* checkfn; /* Pointer to parent arg_xxx check function */ + arg_errorfn* errorfn; /* Pointer to parent arg_xxx error function */ + void* priv; /* Pointer to private header data for use by arg_xxx functions */ }; struct arg_rem { - struct arg_hdr hdr; /* The mandatory argtable header struct */ + struct arg_hdr hdr; /* The mandatory argtable header struct */ }; struct arg_lit { - struct arg_hdr hdr; /* The mandatory argtable header struct */ - int count; /* Number of matching command line args */ + struct arg_hdr hdr; /* The mandatory argtable header struct */ + int count; /* Number of matching command line args */ }; struct arg_int { - struct arg_hdr hdr; /* The mandatory argtable header struct */ - int count; /* Number of matching command line args */ - int *ival; /* Array of parsed argument values */ + struct arg_hdr hdr; /* The mandatory argtable header struct */ + int count; /* Number of matching command line args */ + int* ival; /* Array of parsed argument values */ }; struct arg_dbl { - struct arg_hdr hdr; /* The mandatory argtable header struct */ - int count; /* Number of matching command line args */ - double *dval; /* Array of parsed argument values */ + struct arg_hdr hdr; /* The mandatory argtable header struct */ + int count; /* Number of matching command line args */ + double* dval; /* Array of parsed argument values */ }; struct arg_str { - struct arg_hdr hdr; /* The mandatory argtable header struct */ - int count; /* Number of matching command line args */ - const char **sval; /* Array of parsed argument values */ + struct arg_hdr hdr; /* The mandatory argtable header struct */ + int count; /* Number of matching command line args */ + const char** sval; /* Array of parsed argument values */ }; struct arg_rex { - struct arg_hdr hdr; /* The mandatory argtable header struct */ - int count; /* Number of matching command line args */ - const char **sval; /* Array of parsed argument values */ + struct arg_hdr hdr; /* The mandatory argtable header struct */ + int count; /* Number of matching command line args */ + const char** sval; /* Array of parsed argument values */ }; struct arg_file { - struct arg_hdr hdr; /* The mandatory argtable header struct */ - int count; /* Number of matching command line args*/ - const char **filename; /* Array of parsed filenames (eg: /home/foo.bar) */ - const char **basename; /* Array of parsed basenames (eg: foo.bar) */ - const char **extension; /* Array of parsed extensions (eg: .bar) */ + struct arg_hdr hdr; /* The mandatory argtable header struct */ + int count; /* Number of matching command line args*/ + const char** filename; /* Array of parsed filenames (eg: /home/foo.bar) */ + const char** basename; /* Array of parsed basenames (eg: foo.bar) */ + const char** extension; /* Array of parsed extensions (eg: .bar) */ }; struct arg_date { - struct arg_hdr hdr; /* The mandatory argtable header struct */ - const char *format; /* strptime format string used to parse the date */ - int count; /* Number of matching command line args */ - struct tm *tmval; /* Array of parsed time values */ + struct arg_hdr hdr; /* The mandatory argtable header struct */ + const char* format; /* strptime format string used to parse the date */ + int count; /* Number of matching command line args */ + struct tm* tmval; /* Array of parsed time values */ }; -enum {ARG_ELIMIT = 1, ARG_EMALLOC, ARG_ENOMATCH, ARG_ELONGOPT, ARG_EMISSARG}; +enum { ARG_ELIMIT = 1, ARG_EMALLOC, ARG_ENOMATCH, ARG_ELONGOPT, ARG_EMISSARG }; struct arg_end { - struct arg_hdr hdr; /* The mandatory argtable header struct */ - int count; /* Number of errors encountered */ - int *error; /* Array of error codes */ - void **parent; /* Array of pointers to offending arg_xxx struct */ - const char **argval; /* Array of pointers to offending argv[] string */ + struct arg_hdr hdr; /* The mandatory argtable header struct */ + int count; /* Number of errors encountered */ + int* error; /* Array of error codes */ + void** parent; /* Array of pointers to offending arg_xxx struct */ + const char** argval; /* Array of pointers to offending argv[] string */ }; -/* typedef struct arg_cmd_info { char name[ARG_CMD_NAME_LEN]; char description[ARG_CMD_DESCRIPTION_LEN]; arg_cmdfn* proc; } arg_cmd_info_t; -*/ /**** arg_xxx constructor functions *********************************/ -struct arg_rem *arg_rem(const char *datatype, const char *glossary); +ARG_EXTERN struct arg_rem* arg_rem(const char* datatype, const char* glossary); -struct arg_lit *arg_lit0(const char *shortopts, - const char *longopts, - const char *glossary); -struct arg_lit *arg_lit1(const char *shortopts, - const char *longopts, - const char *glossary); -struct arg_lit *arg_litn(const char *shortopts, - const char *longopts, - int mincount, - int maxcount, - const char *glossary); +ARG_EXTERN struct arg_lit* arg_lit0(const char* shortopts, const char* longopts, const char* glossary); +ARG_EXTERN struct arg_lit* arg_lit1(const char* shortopts, const char* longopts, const char* glossary); +ARG_EXTERN struct arg_lit* arg_litn(const char* shortopts, const char* longopts, int mincount, int maxcount, const char* glossary); -struct arg_key *arg_key0(const char *keyword, - int flags, - const char *glossary); -struct arg_key *arg_key1(const char *keyword, - int flags, - const char *glossary); -struct arg_key *arg_keyn(const char *keyword, - int flags, - int mincount, - int maxcount, - const char *glossary); +ARG_EXTERN struct arg_key* arg_key0(const char* keyword, int flags, const char* glossary); +ARG_EXTERN struct arg_key* arg_key1(const char* keyword, int flags, const char* glossary); +ARG_EXTERN struct arg_key* arg_keyn(const char* keyword, int flags, int mincount, int maxcount, const char* glossary); -struct arg_int *arg_int0(const char *shortopts, - const char *longopts, - const char *datatype, - const char *glossary); -struct arg_int *arg_int1(const char *shortopts, - const char *longopts, - const char *datatype, - const char *glossary); -struct arg_int *arg_intn(const char *shortopts, - const char *longopts, - const char *datatype, - int mincount, - int maxcount, - const char *glossary); +ARG_EXTERN struct arg_int* arg_int0(const char* shortopts, const char* longopts, const char* datatype, const char* glossary); +ARG_EXTERN struct arg_int* arg_int1(const char* shortopts, const char* longopts, const char* datatype, const char* glossary); +ARG_EXTERN struct arg_int* arg_intn(const char* shortopts, const char* longopts, const char* datatype, int mincount, int maxcount, const char* glossary); -struct arg_dbl *arg_dbl0(const char *shortopts, - const char *longopts, - const char *datatype, - const char *glossary); -struct arg_dbl *arg_dbl1(const char *shortopts, - const char *longopts, - const char *datatype, - const char *glossary); -struct arg_dbl *arg_dbln(const char *shortopts, - const char *longopts, - const char *datatype, - int mincount, - int maxcount, - const char *glossary); +ARG_EXTERN struct arg_dbl* arg_dbl0(const char* shortopts, const char* longopts, const char* datatype, const char* glossary); +ARG_EXTERN struct arg_dbl* arg_dbl1(const char* shortopts, const char* longopts, const char* datatype, const char* glossary); +ARG_EXTERN struct arg_dbl* arg_dbln(const char* shortopts, const char* longopts, const char* datatype, int mincount, int maxcount, const char* glossary); -struct arg_str *arg_str0(const char *shortopts, - const char *longopts, - const char *datatype, - const char *glossary); -struct arg_str *arg_str1(const char *shortopts, - const char *longopts, - const char *datatype, - const char *glossary); -struct arg_str *arg_strn(const char *shortopts, - const char *longopts, - const char *datatype, - int mincount, - int maxcount, - const char *glossary); +ARG_EXTERN struct arg_str* arg_str0(const char* shortopts, const char* longopts, const char* datatype, const char* glossary); +ARG_EXTERN struct arg_str* arg_str1(const char* shortopts, const char* longopts, const char* datatype, const char* glossary); +ARG_EXTERN struct arg_str* arg_strn(const char* shortopts, const char* longopts, const char* datatype, int mincount, int maxcount, const char* glossary); -struct arg_rex *arg_rex0(const char *shortopts, - const char *longopts, - const char *pattern, - const char *datatype, - int flags, - const char *glossary); -struct arg_rex *arg_rex1(const char *shortopts, - const char *longopts, - const char *pattern, - const char *datatype, - int flags, - const char *glossary); -struct arg_rex *arg_rexn(const char *shortopts, - const char *longopts, - const char *pattern, - const char *datatype, +ARG_EXTERN struct arg_rex* arg_rex0(const char* shortopts, const char* longopts, const char* pattern, const char* datatype, int flags, const char* glossary); +ARG_EXTERN struct arg_rex* arg_rex1(const char* shortopts, const char* longopts, const char* pattern, const char* datatype, int flags, const char* glossary); +ARG_EXTERN struct arg_rex* arg_rexn(const char* shortopts, + const char* longopts, + const char* pattern, + const char* datatype, int mincount, int maxcount, int flags, - const char *glossary); + const char* glossary); -struct arg_file *arg_file0(const char *shortopts, - const char *longopts, - const char *datatype, - const char *glossary); -struct arg_file *arg_file1(const char *shortopts, - const char *longopts, - const char *datatype, - const char *glossary); -struct arg_file *arg_filen(const char *shortopts, - const char *longopts, - const char *datatype, - int mincount, - int maxcount, - const char *glossary); +ARG_EXTERN struct arg_file* arg_file0(const char* shortopts, const char* longopts, const char* datatype, const char* glossary); +ARG_EXTERN struct arg_file* arg_file1(const char* shortopts, const char* longopts, const char* datatype, const char* glossary); +ARG_EXTERN struct arg_file* arg_filen(const char* shortopts, const char* longopts, const char* datatype, int mincount, int maxcount, const char* glossary); -struct arg_date *arg_date0(const char *shortopts, - const char *longopts, - const char *format, - const char *datatype, - const char *glossary); -struct arg_date *arg_date1(const char *shortopts, - const char *longopts, - const char *format, - const char *datatype, - const char *glossary); -struct arg_date *arg_daten(const char *shortopts, - const char *longopts, - const char *format, - const char *datatype, - int mincount, - int maxcount, - const char *glossary); +ARG_EXTERN struct arg_date* arg_date0(const char* shortopts, const char* longopts, const char* format, const char* datatype, const char* glossary); +ARG_EXTERN struct arg_date* arg_date1(const char* shortopts, const char* longopts, const char* format, const char* datatype, const char* glossary); +ARG_EXTERN struct arg_date* arg_daten(const char* shortopts, const char* longopts, const char* format, const char* datatype, int mincount, int maxcount, const char* glossary); -struct arg_end *arg_end(int maxcount); +ARG_EXTERN struct arg_end* arg_end(int maxerrors); +#define ARG_DSTR_STATIC ((arg_dstr_freefn*)0) +#define ARG_DSTR_VOLATILE ((arg_dstr_freefn*)1) +#define ARG_DSTR_DYNAMIC ((arg_dstr_freefn*)3) /**** other functions *******************************************/ -int arg_nullcheck(void **argtable); -int arg_parse(int argc, char **argv, void **argtable); -void arg_print_option(FILE *fp, const char *shortopts, const char *longopts, const char *datatype, const char *suffix); -void arg_print_syntax(FILE *fp, void **argtable, const char *suffix); -void arg_print_syntaxv(FILE *fp, void **argtable, const char *suffix); -void arg_print_glossary(FILE *fp, void **argtable, const char *format); -void arg_print_glossary_gnu(FILE *fp, void **argtable); -void arg_print_errors(FILE *fp, struct arg_end *end, const char *progname); -void arg_freetable(void **argtable, size_t n); +ARG_EXTERN int arg_nullcheck(void** argtable); +ARG_EXTERN int arg_parse(int argc, char** argv, void** argtable); +ARG_EXTERN void arg_print_option(FILE* fp, const char* shortopts, const char* longopts, const char* datatype, const char* suffix); +ARG_EXTERN void arg_print_syntax(FILE* fp, void** argtable, const char* suffix); +ARG_EXTERN void arg_print_syntaxv(FILE* fp, void** argtable, const char* suffix); +ARG_EXTERN void arg_print_glossary(FILE* fp, void** argtable, const char* format); +ARG_EXTERN void arg_print_glossary_gnu(FILE* fp, void** argtable); +ARG_EXTERN void arg_print_errors(FILE* fp, struct arg_end* end, const char* progname); +ARG_EXTERN void arg_print_option_ds(arg_dstr_t ds, const char* shortopts, const char* longopts, const char* datatype, const char* suffix); +ARG_EXTERN void arg_print_syntax_ds(arg_dstr_t ds, void** argtable, const char* suffix); +ARG_EXTERN void arg_print_syntaxv_ds(arg_dstr_t ds, void** argtable, const char* suffix); +ARG_EXTERN void arg_print_glossary_ds(arg_dstr_t ds, void** argtable, const char* format); +ARG_EXTERN void arg_print_glossary_gnu_ds(arg_dstr_t ds, void** argtable); +ARG_EXTERN void arg_print_errors_ds(arg_dstr_t ds, struct arg_end* end, const char* progname); +ARG_EXTERN void arg_freetable(void** argtable, size_t n); + +ARG_EXTERN arg_dstr_t arg_dstr_create(void); +ARG_EXTERN void arg_dstr_destroy(arg_dstr_t ds); +ARG_EXTERN void arg_dstr_reset(arg_dstr_t ds); +ARG_EXTERN void arg_dstr_free(arg_dstr_t ds); +ARG_EXTERN void arg_dstr_set(arg_dstr_t ds, char* str, arg_dstr_freefn* free_proc); +ARG_EXTERN void arg_dstr_cat(arg_dstr_t ds, const char* str); +ARG_EXTERN void arg_dstr_catc(arg_dstr_t ds, char c); +ARG_EXTERN void arg_dstr_catf(arg_dstr_t ds, const char* fmt, ...); +ARG_EXTERN char* arg_dstr_cstr(arg_dstr_t ds); + +ARG_EXTERN void arg_cmd_init(void); +ARG_EXTERN void arg_cmd_uninit(void); +ARG_EXTERN void arg_cmd_register(const char* name, arg_cmdfn* proc, const char* description); +ARG_EXTERN void arg_cmd_unregister(const char* name); +ARG_EXTERN int arg_cmd_dispatch(const char* name, int argc, char* argv[], arg_dstr_t res); +ARG_EXTERN unsigned int arg_cmd_count(void); +ARG_EXTERN arg_cmd_info_t* arg_cmd_info(const char* name); +ARG_EXTERN arg_cmd_itr_t arg_cmd_itr_create(void); +ARG_EXTERN void arg_cmd_itr_destroy(arg_cmd_itr_t itr); +ARG_EXTERN int arg_cmd_itr_advance(arg_cmd_itr_t itr); +ARG_EXTERN char* arg_cmd_itr_key(arg_cmd_itr_t itr); +ARG_EXTERN arg_cmd_info_t* arg_cmd_itr_value(arg_cmd_itr_t itr); +ARG_EXTERN int arg_cmd_itr_search(arg_cmd_itr_t itr, void* k); +ARG_EXTERN void arg_mgsort(void* data, int size, int esize, int i, int k, arg_comparefn* comparefn); +ARG_EXTERN void arg_make_get_help_msg(arg_dstr_t res); +ARG_EXTERN void arg_make_help_msg(arg_dstr_t ds, char* cmd_name, void** argtable); +ARG_EXTERN void arg_make_syntax_err_msg(arg_dstr_t ds, void** argtable, struct arg_end* end); +ARG_EXTERN int arg_make_syntax_err_help_msg(arg_dstr_t ds, char* name, int help, int nerrors, void** argtable, struct arg_end* end, int* exitcode); +ARG_EXTERN void arg_set_module_name(const char* name); +ARG_EXTERN void arg_set_module_version(int major, int minor, int patch, const char* tag); /**** deprecated functions, for back-compatibility only ********/ -void arg_free(void **argtable); +ARG_EXTERN void arg_free(void** argtable); #ifdef __cplusplus } From a2a5700a8530bf4a08b6c70c2e491b47533b4648 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 6 May 2020 23:33:55 +0200 Subject: [PATCH 087/632] fix reveng getopt bug --- client/deps/reveng/cli.c | 1 + 1 file changed, 1 insertion(+) diff --git a/client/deps/reveng/cli.c b/client/deps/reveng/cli.c index 9d849dfc3..34aee6fe7 100644 --- a/client/deps/reveng/cli.c +++ b/client/deps/reveng/cli.c @@ -98,6 +98,7 @@ int reveng_main(int argc, char *argv[]) { // pos=0; --- not in this ver of getopt optind = 1; + optreset = 1; do { c = getopt(argc, argv, "?A:BDFGLMP:SVXa:bcdefhi:k:lm:p:q:rstuvw:x:yz"); switch (c) { From 2fcad93efc3ccf4af6bd7599d9a3f4b571d436dc Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 7 May 2020 00:23:19 +0200 Subject: [PATCH 088/632] proper way to fix reveng getopt bug --- client/deps/reveng/cli.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/client/deps/reveng/cli.c b/client/deps/reveng/cli.c index 34aee6fe7..88e8d3722 100644 --- a/client/deps/reveng/cli.c +++ b/client/deps/reveng/cli.c @@ -97,8 +97,10 @@ int reveng_main(int argc, char *argv[]) { SETBMP(); // pos=0; --- not in this ver of getopt + int err = 0; optind = 1; - optreset = 1; + // Remember to consume always all the option string till getopt returns -1 ! + // else next invocations will be corrupted do { c = getopt(argc, argv, "?A:BDFGLMP:SVXa:bcdefhi:k:lm:p:q:rstuvw:x:yz"); switch (c) { @@ -106,8 +108,8 @@ int reveng_main(int argc, char *argv[]) { case 'a': /* a: bits per character */ if ((obperhx = atoi(optarg)) > BMP_BIT) { fprintf(stderr, "%s: argument to -%c must be between 1 and %d\n", myname, c, BMP_BIT); - return 0; - //exit(EXIT_FAILURE); + err = 1; + break; } if (c == 'a') ibperhx = obperhx; break; @@ -131,8 +133,8 @@ int reveng_main(int argc, char *argv[]) { case 'v': /* v calculate reversed CRC */ if (mode) { fprintf(stderr, "%s: more than one mode switch specified. Use %s -h for help.\n", myname, myname); - return 0; - //exit(EXIT_FAILURE); + err = 1; + break; } mode = c; break; @@ -152,8 +154,7 @@ int reveng_main(int argc, char *argv[]) { case '?': /* ? get help / usage */ default: usage(); - return 0; - //exit(EXIT_FAILURE); + err = 1; break; case 'i': /* i: Init value */ pptr = &model.init; @@ -185,12 +186,13 @@ int reveng_main(int argc, char *argv[]) { case 'm': /* m: select preset CRC model */ if (!(c = mbynam(&model, optarg))) { fprintf(stderr, "%s: preset model '%s' not found. Use %s -D to list presets.\n", myname, optarg, myname); - return 0; - //exit(EXIT_FAILURE); + err = 1; + break; } if (c < 0) { uerror("no preset models available"); - return 0; + err = 1; + break; } /* must set width so that parameter to -ipx is not zeroed */ width = plen(model.spoly); @@ -247,6 +249,9 @@ ipqx: } } while (c != -1); + if (err) + return 0; + /* canonicalise the model, so the one we dump is the one we * calculate with (not with -s, spoly may be blank which will * normalise to zero and clear init and xorout.) From 3c9a19d4c1e4251c412affee210f55c3eb649e37 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 7 May 2020 00:59:40 +0200 Subject: [PATCH 089/632] Revert "update argtable3" It was an attempt to solve the mysterious reveng getopt bug but it brings more troubles and throws away multi-platform pm3 tuning This reverts commit f3790a89a525ac8385132ba3eb17d2e05ade35dd. --- client/deps/cliparser/Makefile | 2 +- client/deps/cliparser/argtable3.c | 4977 +++++++++++------------------ client/deps/cliparser/argtable3.h | 359 ++- 3 files changed, 2109 insertions(+), 3229 deletions(-) diff --git a/client/deps/cliparser/Makefile b/client/deps/cliparser/Makefile index 6fa13408a..4873372c4 100644 --- a/client/deps/cliparser/Makefile +++ b/client/deps/cliparser/Makefile @@ -1,6 +1,6 @@ MYSRCPATHS = MYINCLUDES = -I../../../common -I../../../include -I../../src -MYCFLAGS = -Wno-cast-align -Wno-discarded-qualifiers -Wno-bad-function-cast -Wno-redundant-decls +MYCFLAGS = -Wno-cast-align MYDEFS = MYSRCS = \ argtable3.c \ diff --git a/client/deps/cliparser/argtable3.c b/client/deps/cliparser/argtable3.c index c3d1bb9f7..f66c22d6d 100644 --- a/client/deps/cliparser/argtable3.c +++ b/client/deps/cliparser/argtable3.c @@ -30,14 +30,19 @@ #include "argtable3.h" -#define ARG_AMALGAMATION +// On Windows isspace crashes app in case of using Unicode character set and string to be above ASCII +// so you have to use _istspace instead of space +#ifdef UNICODE +#include +#define ISSPACE _istspace +#else +#define ISSPACE isspace +#endif /******************************************************************************* - * argtable3_private: Declares private types, constants, and interfaces - * * This file is part of the argtable3 library. * - * Copyright (C) 2013-2019 Tom G. Huang + * Copyright (C) 2013 Tom G. Huang * * All rights reserved. * @@ -67,8 +72,6 @@ #ifndef ARG_UTILS_H #define ARG_UTILS_H -#include - #define ARG_ENABLE_TRACE 0 #define ARG_ENABLE_LOG 1 @@ -76,1759 +79,52 @@ extern "C" { #endif -enum { ARG_ERR_MINCOUNT = 1, ARG_ERR_MAXCOUNT, ARG_ERR_BADINT, ARG_ERR_OVERFLOW, ARG_ERR_BADDOUBLE, ARG_ERR_BADDATE, ARG_ERR_REGNOMATCH }; +enum { + EMINCOUNT = 1, + EMAXCOUNT, + EBADINT, -typedef void(arg_panicfn)(const char* fmt, ...); - -#if defined(_MSC_VER) -#define ARG_TRACE(x) \ - __pragma(warning(push)) __pragma(warning(disable : 4127)) do { \ - if (ARG_ENABLE_TRACE) \ - dbg_printf x; \ - } \ - while (0) \ - __pragma(warning(pop)) - -#define ARG_LOG(x) \ - __pragma(warning(push)) __pragma(warning(disable : 4127)) do { \ - if (ARG_ENABLE_LOG) \ - dbg_printf x; \ - } \ - while (0) \ - __pragma(warning(pop)) +// The same name define EOVERFLOW in errno.h on windows platform or android +#if defined(__STDC_WANT_SECURE_LIB__) || defined(__ANDROID__) || defined(ANDROID) + EOVERFLOW_, #else -#define ARG_TRACE(x) \ - do { \ - if (ARG_ENABLE_TRACE) \ - dbg_printf x; \ - } while (0) - -#define ARG_LOG(x) \ - do { \ - if (ARG_ENABLE_LOG) \ - dbg_printf x; \ - } while (0) + EOVERFLOW, #endif - -extern void dbg_printf(const char* fmt, ...); -extern void arg_set_panic(arg_panicfn* proc); -extern void* xmalloc(size_t size); -extern void* xcalloc(size_t count, size_t size); -extern void* xrealloc(void* ptr, size_t size); -extern void xfree(void* ptr); - -struct arg_hashtable_entry { - void *k, *v; - unsigned int h; - struct arg_hashtable_entry* next; + EBADDOUBLE, + EBADDATE, + EREGNOMATCH }; -typedef struct arg_hashtable { - unsigned int tablelength; - struct arg_hashtable_entry** table; - unsigned int entrycount; - unsigned int loadlimit; - unsigned int primeindex; - unsigned int (*hashfn)(const void* k); - int (*eqfn)(const void* k1, const void* k2); -} arg_hashtable_t; -/** - * @brief Create a hash table. - * - * @param minsize minimum initial size of hash table - * @param hashfn function for hashing keys - * @param eqfn function for determining key equality - * @return newly created hash table or NULL on failure - */ -arg_hashtable_t* arg_hashtable_create(unsigned int minsize, unsigned int (*hashfn)(const void*), int (*eqfn)(const void*, const void*)); +#if defined(_MSC_VER) +#define ARG_TRACE(x) \ + __pragma(warning(push)) \ + __pragma(warning(disable:4127)) \ + do { if (ARG_ENABLE_TRACE) dbg_printf x; } while (0) \ + __pragma(warning(pop)) -/** - * @brief This function will cause the table to expand if the insertion would take - * the ratio of entries to table size over the maximum load factor. - * - * This function does not check for repeated insertions with a duplicate key. - * The value returned when using a duplicate key is undefined -- when - * the hash table changes size, the order of retrieval of duplicate key - * entries is reversed. - * If in doubt, remove before insert. - * - * @param h the hash table to insert into - * @param k the key - hash table claims ownership and will free on removal - * @param v the value - does not claim ownership - * @return non-zero for successful insertion - */ -void arg_hashtable_insert(arg_hashtable_t* h, void* k, void* v); +#define ARG_LOG(x) \ + __pragma(warning(push)) \ + __pragma(warning(disable:4127)) \ + do { if (ARG_ENABLE_LOG) dbg_printf x; } while (0) \ + __pragma(warning(pop)) +#else +#define ARG_TRACE(x) \ + do { if (ARG_ENABLE_TRACE) dbg_printf x; } while (0) -#define ARG_DEFINE_HASHTABLE_INSERT(fnname, keytype, valuetype) \ - int fnname(arg_hashtable_t* h, keytype* k, valuetype* v) { return arg_hashtable_insert(h, k, v); } +#define ARG_LOG(x) \ + do { if (ARG_ENABLE_LOG) dbg_printf x; } while (0) +#endif -/** - * @brief Search the specified key in the hash table. - * - * @param h the hash table to search - * @param k the key to search for - does not claim ownership - * @return the value associated with the key, or NULL if none found - */ -void* arg_hashtable_search(arg_hashtable_t* h, const void* k); - -#define ARG_DEFINE_HASHTABLE_SEARCH(fnname, keytype, valuetype) \ - valuetype* fnname(arg_hashtable_t* h, keytype* k) { return (valuetype*)(arg_hashtable_search(h, k)); } - -/** - * @brief Remove the specified key from the hash table. - * - * @param h the hash table to remove the item from - * @param k the key to search for - does not claim ownership - */ -void arg_hashtable_remove(arg_hashtable_t* h, const void* k); - -#define ARG_DEFINE_HASHTABLE_REMOVE(fnname, keytype, valuetype) \ - valuetype* fnname(arg_hashtable_t* h, keytype* k) { return (valuetype*)(arg_hashtable_remove(h, k)); } - -/** - * @brief Return the number of keys in the hash table. - * - * @param h the hash table - * @return the number of items stored in the hash table - */ -unsigned int arg_hashtable_count(arg_hashtable_t* h); - -/** - * @brief Change the value associated with the key. - * - * function to change the value associated with a key, where there already - * exists a value bound to the key in the hash table. - * Source due to Holger Schemel. - * - * @name hashtable_change - * @param h the hash table - * @param key - * @param value - */ -int arg_hashtable_change(arg_hashtable_t* h, void* k, void* v); - -/** - * @brief Free the hash table and the memory allocated for each key-value pair. - * - * @param h the hash table - * @param free_values whether to call 'free' on the remaining values - */ -void arg_hashtable_destroy(arg_hashtable_t* h, int free_values); - -typedef struct arg_hashtable_itr { - arg_hashtable_t* h; - struct arg_hashtable_entry* e; - struct arg_hashtable_entry* parent; - unsigned int index; -} arg_hashtable_itr_t; - -arg_hashtable_itr_t* arg_hashtable_itr_create(arg_hashtable_t* h); - -void arg_hashtable_itr_destroy(arg_hashtable_itr_t* itr); - -/** - * @brief Return the value of the (key,value) pair at the current position. - */ -extern void* arg_hashtable_itr_key(arg_hashtable_itr_t* i); - -/** - * @brief Return the value of the (key,value) pair at the current position. - */ -extern void* arg_hashtable_itr_value(arg_hashtable_itr_t* i); - -/** - * @brief Advance the iterator to the next element. Returns zero if advanced to end of table. - */ -int arg_hashtable_itr_advance(arg_hashtable_itr_t* itr); - -/** - * @brief Remove current element and advance the iterator to the next element. - */ -int arg_hashtable_itr_remove(arg_hashtable_itr_t* itr); - -/** - * @brief Search and overwrite the supplied iterator, to point to the entry matching the supplied key. - * - * @return Zero if not found. - */ -int arg_hashtable_itr_search(arg_hashtable_itr_t* itr, arg_hashtable_t* h, void* k); - -#define ARG_DEFINE_HASHTABLE_ITERATOR_SEARCH(fnname, keytype) \ - int fnname(arg_hashtable_itr_t* i, arg_hashtable_t* h, keytype* k) { return (arg_hashtable_iterator_search(i, h, k)); } +extern void dbg_printf(const char *fmt, ...); #ifdef __cplusplus } #endif #endif + /******************************************************************************* - * arg_utils: Implements memory, panic, and other utility functions - * - * This file is part of the argtable3 library. - * - * Copyright (C) 2013-2019 Tom G. Huang - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of STEWART HEITMANN 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 COPYRIGHT HOLDERS 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 STEWART HEITMANN 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 "argtable3.h" - -#ifndef ARG_AMALGAMATION -#include "argtable3_private.h" -#endif - -#include -#include -#include -#include - -static void panic(const char* fmt, ...); -static arg_panicfn* s_panic = panic; - -void dbg_printf(const char* fmt, ...) { - va_list args; - va_start(args, fmt); - vfprintf(stderr, fmt, args); - va_end(args); -} - -static void panic(const char* fmt, ...) { - va_list args; - char* s; - - va_start(args, fmt); - vfprintf(stderr, fmt, args); - va_end(args); - -#if defined(_MSC_VER) -#pragma warning(push) -#pragma warning(disable : 4996) -#endif - s = getenv("EF_DUMPCORE"); -#if defined(_MSC_VER) -#pragma warning(pop) -#endif - - if (s != NULL && *s != '\0') { - abort(); - } else { - exit(EXIT_FAILURE); - } -} - -void arg_set_panic(arg_panicfn* proc) { - s_panic = proc; -} - -void* xmalloc(size_t size) { - void* ret = malloc(size); - if (!ret) { - s_panic("Out of memory!\n"); - } - return ret; -} - -void* xcalloc(size_t count, size_t size) { - size_t allocated_count = count && size ? count : 1; - size_t allocated_size = count && size ? size : 1; - void* ret = calloc(allocated_count, allocated_size); - if (!ret) { - s_panic("Out of memory!\n"); - } - return ret; -} - -void* xrealloc(void* ptr, size_t size) { - size_t allocated_size = size ? size : 1; - void* ret = realloc(ptr, allocated_size); - if (!ret) { - s_panic("Out of memory!\n"); - } - return ret; -} - -void xfree(void* ptr) { - free(ptr); -} - -static void merge(void* data, int esize, int i, int j, int k, arg_comparefn* comparefn) { - char* a = (char*)data; - char* m; - int ipos, jpos, mpos; - - /* Initialize the counters used in merging. */ - ipos = i; - jpos = j + 1; - mpos = 0; - - /* Allocate storage for the merged elements. */ - m = (char*)xmalloc(esize * ((k - i) + 1)); - - /* Continue while either division has elements to merge. */ - while (ipos <= j || jpos <= k) { - if (ipos > j) { - /* The left division has no more elements to merge. */ - while (jpos <= k) { - memcpy(&m[mpos * esize], &a[jpos * esize], esize); - jpos++; - mpos++; - } - - continue; - } else if (jpos > k) { - /* The right division has no more elements to merge. */ - while (ipos <= j) { - memcpy(&m[mpos * esize], &a[ipos * esize], esize); - ipos++; - mpos++; - } - - continue; - } - - /* Append the next ordered element to the merged elements. */ - if (comparefn(&a[ipos * esize], &a[jpos * esize]) < 0) { - memcpy(&m[mpos * esize], &a[ipos * esize], esize); - ipos++; - mpos++; - } else { - memcpy(&m[mpos * esize], &a[jpos * esize], esize); - jpos++; - mpos++; - } - } - - /* Prepare to pass back the merged data. */ - memcpy(&a[i * esize], m, esize * ((k - i) + 1)); - xfree(m); -} - -void arg_mgsort(void* data, int size, int esize, int i, int k, arg_comparefn* comparefn) { - int j; - - /* Stop the recursion when no more divisions can be made. */ - if (i < k) { - /* Determine where to divide the elements. */ - j = (int)(((i + k - 1)) / 2); - - /* Recursively sort the two divisions. */ - arg_mgsort(data, size, esize, i, j, comparefn); - arg_mgsort(data, size, esize, j + 1, k, comparefn); - merge(data, esize, i, j, k, comparefn); - } -} -/******************************************************************************* - * arg_hashtable: Implements the hash table utilities - * - * This file is part of the argtable3 library. - * - * Copyright (C) 2013-2019 Tom G. Huang - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of STEWART HEITMANN 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 COPYRIGHT HOLDERS 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 STEWART HEITMANN 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. - ******************************************************************************/ - -#ifndef ARG_AMALGAMATION -#include "argtable3_private.h" -#endif - -#include -#include -#include -#include - -/* - * This hash table module is adapted from the C hash table implementation by - * Christopher Clark. Here is the copyright notice from the library: - * - * Copyright (c) 2002, Christopher Clark - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * 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. - * - * * Neither the name of the original author; nor the names of any contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER - * 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. - */ - -/* - * Credit for primes table: Aaron Krowne - * http://br.endernet.org/~akrowne/ - * http://planetmath.org/encyclopedia/GoodHashTablePrimes.html - */ -static const unsigned int primes[] = {53, 97, 193, 389, 769, 1543, 3079, 6151, 12289, - 24593, 49157, 98317, 196613, 393241, 786433, 1572869, 3145739, 6291469, - 12582917, 25165843, 50331653, 100663319, 201326611, 402653189, 805306457, 1610612741}; -const unsigned int prime_table_length = sizeof(primes) / sizeof(primes[0]); -const float max_load_factor = (float)0.65; - -static unsigned int enhanced_hash(arg_hashtable_t* h, const void* k) { - /* - * Aim to protect against poor hash functions by adding logic here. - * The logic is taken from Java 1.4 hash table source. - */ - unsigned int i = h->hashfn(k); - i += ~(i << 9); - i ^= ((i >> 14) | (i << 18)); /* >>> */ - i += (i << 4); - i ^= ((i >> 10) | (i << 22)); /* >>> */ - return i; -} - -static unsigned int index_for(unsigned int tablelength, unsigned int hashvalue) { - return (hashvalue % tablelength); -} - -arg_hashtable_t* arg_hashtable_create(unsigned int minsize, unsigned int (*hashfn)(const void*), int (*eqfn)(const void*, const void*)) { - arg_hashtable_t* h; - unsigned int pindex; - unsigned int size = primes[0]; - - /* Check requested hash table isn't too large */ - if (minsize > (1u << 30)) - return NULL; - - /* - * Enforce size as prime. The reason is to avoid clustering of values - * into a small number of buckets (yes, distribution). A more even - * distributed hash table will perform more consistently. - */ - for (pindex = 0; pindex < prime_table_length; pindex++) { - if (primes[pindex] > minsize) { - size = primes[pindex]; - break; - } - } - - h = (arg_hashtable_t*)xmalloc(sizeof(arg_hashtable_t)); - h->table = (struct arg_hashtable_entry**)xmalloc(sizeof(struct arg_hashtable_entry*) * size); - memset(h->table, 0, size * sizeof(struct arg_hashtable_entry*)); - h->tablelength = size; - h->primeindex = pindex; - h->entrycount = 0; - h->hashfn = hashfn; - h->eqfn = eqfn; - h->loadlimit = (unsigned int)ceil(size * max_load_factor); - return h; -} - -static int arg_hashtable_expand(arg_hashtable_t* h) { - /* Double the size of the table to accommodate more entries */ - struct arg_hashtable_entry** newtable; - struct arg_hashtable_entry* e; - unsigned int newsize; - unsigned int i; - unsigned int index; - - /* Check we're not hitting max capacity */ - if (h->primeindex == (prime_table_length - 1)) - return 0; - newsize = primes[++(h->primeindex)]; - - newtable = (struct arg_hashtable_entry**)xmalloc(sizeof(struct arg_hashtable_entry*) * newsize); - memset(newtable, 0, newsize * sizeof(struct arg_hashtable_entry*)); - /* - * This algorithm is not 'stable': it reverses the list - * when it transfers entries between the tables - */ - for (i = 0; i < h->tablelength; i++) { - while (NULL != (e = h->table[i])) { - h->table[i] = e->next; - index = index_for(newsize, e->h); - e->next = newtable[index]; - newtable[index] = e; - } - } - - xfree(h->table); - h->table = newtable; - h->tablelength = newsize; - h->loadlimit = (unsigned int)ceil(newsize * max_load_factor); - return -1; -} - -unsigned int arg_hashtable_count(arg_hashtable_t* h) { - return h->entrycount; -} - -void arg_hashtable_insert(arg_hashtable_t* h, void* k, void* v) { - /* This method allows duplicate keys - but they shouldn't be used */ - unsigned int index; - struct arg_hashtable_entry* e; - if ((h->entrycount + 1) > h->loadlimit) { - /* - * Ignore the return value. If expand fails, we should - * still try cramming just this value into the existing table - * -- we may not have memory for a larger table, but one more - * element may be ok. Next time we insert, we'll try expanding again. - */ - arg_hashtable_expand(h); - } - e = (struct arg_hashtable_entry*)xmalloc(sizeof(struct arg_hashtable_entry)); - e->h = enhanced_hash(h, k); - index = index_for(h->tablelength, e->h); - e->k = k; - e->v = v; - e->next = h->table[index]; - h->table[index] = e; - h->entrycount++; -} - -void* arg_hashtable_search(arg_hashtable_t* h, const void* k) { - struct arg_hashtable_entry* e; - unsigned int hashvalue; - unsigned int index; - - hashvalue = enhanced_hash(h, k); - index = index_for(h->tablelength, hashvalue); - e = h->table[index]; - while (e != NULL) { - /* Check hash value to short circuit heavier comparison */ - if ((hashvalue == e->h) && (h->eqfn(k, e->k))) - return e->v; - e = e->next; - } - return NULL; -} - -void arg_hashtable_remove(arg_hashtable_t* h, const void* k) { - /* - * TODO: consider compacting the table when the load factor drops enough, - * or provide a 'compact' method. - */ - - struct arg_hashtable_entry* e; - struct arg_hashtable_entry** pE; - unsigned int hashvalue; - unsigned int index; - - hashvalue = enhanced_hash(h, k); - index = index_for(h->tablelength, hashvalue); - pE = &(h->table[index]); - e = *pE; - while (NULL != e) { - /* Check hash value to short circuit heavier comparison */ - if ((hashvalue == e->h) && (h->eqfn(k, e->k))) { - *pE = e->next; - h->entrycount--; - xfree(e->k); - xfree(e->v); - xfree(e); - return; - } - pE = &(e->next); - e = e->next; - } -} - -void arg_hashtable_destroy(arg_hashtable_t* h, int free_values) { - unsigned int i; - struct arg_hashtable_entry *e, *f; - struct arg_hashtable_entry** table = h->table; - if (free_values) { - for (i = 0; i < h->tablelength; i++) { - e = table[i]; - while (NULL != e) { - f = e; - e = e->next; - xfree(f->k); - xfree(f->v); - xfree(f); - } - } - } else { - for (i = 0; i < h->tablelength; i++) { - e = table[i]; - while (NULL != e) { - f = e; - e = e->next; - xfree(f->k); - xfree(f); - } - } - } - xfree(h->table); - xfree(h); -} - -arg_hashtable_itr_t* arg_hashtable_itr_create(arg_hashtable_t* h) { - unsigned int i; - unsigned int tablelength; - - arg_hashtable_itr_t* itr = (arg_hashtable_itr_t*)xmalloc(sizeof(arg_hashtable_itr_t)); - itr->h = h; - itr->e = NULL; - itr->parent = NULL; - tablelength = h->tablelength; - itr->index = tablelength; - if (0 == h->entrycount) - return itr; - - for (i = 0; i < tablelength; i++) { - if (h->table[i] != NULL) { - itr->e = h->table[i]; - itr->index = i; - break; - } - } - return itr; -} - -void arg_hashtable_itr_destroy(arg_hashtable_itr_t* itr) { - xfree(itr); -} - -void* arg_hashtable_itr_key(arg_hashtable_itr_t* i) { - return i->e->k; -} - -void* arg_hashtable_itr_value(arg_hashtable_itr_t* i) { - return i->e->v; -} - -int arg_hashtable_itr_advance(arg_hashtable_itr_t* itr) { - unsigned int j; - unsigned int tablelength; - struct arg_hashtable_entry** table; - struct arg_hashtable_entry* next; - - if (itr->e == NULL) - return 0; /* stupidity check */ - - next = itr->e->next; - if (NULL != next) { - itr->parent = itr->e; - itr->e = next; - return -1; - } - - tablelength = itr->h->tablelength; - itr->parent = NULL; - if (tablelength <= (j = ++(itr->index))) { - itr->e = NULL; - return 0; - } - - table = itr->h->table; - while (NULL == (next = table[j])) { - if (++j >= tablelength) { - itr->index = tablelength; - itr->e = NULL; - return 0; - } - } - - itr->index = j; - itr->e = next; - return -1; -} - -int arg_hashtable_itr_remove(arg_hashtable_itr_t* itr) { - struct arg_hashtable_entry* remember_e; - struct arg_hashtable_entry* remember_parent; - int ret; - - /* Do the removal */ - if ((itr->parent) == NULL) { - /* element is head of a chain */ - itr->h->table[itr->index] = itr->e->next; - } else { - /* element is mid-chain */ - itr->parent->next = itr->e->next; - } - /* itr->e is now outside the hashtable */ - remember_e = itr->e; - itr->h->entrycount--; - xfree(remember_e->k); - xfree(remember_e->v); - - /* Advance the iterator, correcting the parent */ - remember_parent = itr->parent; - ret = arg_hashtable_itr_advance(itr); - if (itr->parent == remember_e) { - itr->parent = remember_parent; - } - xfree(remember_e); - return ret; -} - -int arg_hashtable_itr_search(arg_hashtable_itr_t* itr, arg_hashtable_t* h, void* k) { - struct arg_hashtable_entry* e; - struct arg_hashtable_entry* parent; - unsigned int hashvalue; - unsigned int index; - - hashvalue = enhanced_hash(h, k); - index = index_for(h->tablelength, hashvalue); - - e = h->table[index]; - parent = NULL; - while (e != NULL) { - /* Check hash value to short circuit heavier comparison */ - if ((hashvalue == e->h) && (h->eqfn(k, e->k))) { - itr->index = index; - itr->e = e; - itr->parent = parent; - itr->h = h; - return -1; - } - parent = e; - e = e->next; - } - return 0; -} - -int arg_hashtable_change(arg_hashtable_t* h, void* k, void* v) { - struct arg_hashtable_entry* e; - unsigned int hashvalue; - unsigned int index; - - hashvalue = enhanced_hash(h, k); - index = index_for(h->tablelength, hashvalue); - e = h->table[index]; - while (e != NULL) { - /* Check hash value to short circuit heavier comparison */ - if ((hashvalue == e->h) && (h->eqfn(k, e->k))) { - xfree(e->v); - e->v = v; - return -1; - } - e = e->next; - } - return 0; -} -/******************************************************************************* - * arg_dstr: Implements the dynamic string utilities - * - * This file is part of the argtable3 library. - * - * Copyright (C) 2013-2019 Tom G. Huang - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of STEWART HEITMANN 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 COPYRIGHT HOLDERS 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 STEWART HEITMANN 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 "argtable3.h" - -#ifndef ARG_AMALGAMATION -#include "argtable3_private.h" -#endif - -#include -#include -#include - -#if defined(_MSC_VER) -#pragma warning(push) -#pragma warning(disable : 4996) -#endif - -#define START_VSNBUFF 16 - -/* - * This dynamic string module is adapted from TclResult.c in the Tcl library. - * Here is the copyright notice from the library: - * - * This software is copyrighted by the Regents of the University of - * California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState - * Corporation and other parties. The following terms apply to all files - * associated with the software unless explicitly disclaimed in - * individual files. - * - * The authors hereby grant permission to use, copy, modify, distribute, - * and license this software and its documentation for any purpose, provided - * that existing copyright notices are retained in all copies and that this - * notice is included verbatim in any distributions. No written agreement, - * license, or royalty fee is required for any of the authorized uses. - * Modifications to this software may be copyrighted by their authors - * and need not follow the licensing terms described here, provided that - * the new terms are clearly indicated on the first page of each file where - * they apply. - * - * IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY - * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY - * DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE - * IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE - * NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR - * MODIFICATIONS. - * - * GOVERNMENT USE: If you are acquiring this software on behalf of the - * U.S. government, the Government shall have only "Restricted Rights" - * in the software and related documentation as defined in the Federal - * Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you - * are acquiring the software on behalf of the Department of Defense, the - * software shall be classified as "Commercial Computer Software" and the - * Government shall have only "Restricted Rights" as defined in Clause - * 252.227-7014 (b) (3) of DFARs. Notwithstanding the foregoing, the - * authors grant the U.S. Government and others acting in its behalf - * permission to use and distribute the software in accordance with the - * terms specified in this license. - */ - -typedef struct _internal_arg_dstr { - char* data; - arg_dstr_freefn* free_proc; - char sbuf[ARG_DSTR_SIZE + 1]; - char* append_data; - int append_data_size; - int append_used; -} _internal_arg_dstr_t; - -static void setup_append_buf(arg_dstr_t res, int newSpace); - -arg_dstr_t arg_dstr_create(void) { - _internal_arg_dstr_t* h = (_internal_arg_dstr_t*)xmalloc(sizeof(_internal_arg_dstr_t)); - memset(h, 0, sizeof(_internal_arg_dstr_t)); - h->sbuf[0] = 0; - h->data = h->sbuf; - h->free_proc = ARG_DSTR_STATIC; - return h; -} - -void arg_dstr_destroy(arg_dstr_t ds) { - if (ds == NULL) - return; - - arg_dstr_reset(ds); - xfree(ds); - return; -} - -void arg_dstr_set(arg_dstr_t ds, char* str, arg_dstr_freefn* free_proc) { - int length; - register arg_dstr_freefn* old_free_proc = ds->free_proc; - char* old_result = ds->data; - - if (str == NULL) { - ds->sbuf[0] = 0; - ds->data = ds->sbuf; - ds->free_proc = ARG_DSTR_STATIC; - } else if (free_proc == ARG_DSTR_VOLATILE) { - length = (int)strlen(str); - if (length > ARG_DSTR_SIZE) { - ds->data = (char*)xmalloc((unsigned)length + 1); - ds->free_proc = ARG_DSTR_DYNAMIC; - } else { - ds->data = ds->sbuf; - ds->free_proc = ARG_DSTR_STATIC; - } - strcpy(ds->data, str); - } else { - ds->data = str; - ds->free_proc = free_proc; - } - - /* - * If the old result was dynamically-allocated, free it up. Do it here, - * rather than at the beginning, in case the new result value was part of - * the old result value. - */ - - if ((old_free_proc != 0) && (old_result != ds->data)) { - if (old_free_proc == ARG_DSTR_DYNAMIC) { - xfree(old_result); - } else { - (*old_free_proc)(old_result); - } - } - - if ((ds->append_data != NULL) && (ds->append_data_size > 0)) { - xfree(ds->append_data); - ds->append_data = NULL; - ds->append_data_size = 0; - } -} - -char* arg_dstr_cstr(arg_dstr_t ds) /* Interpreter whose result to return. */ -{ - return ds->data; -} - -void arg_dstr_cat(arg_dstr_t ds, const char* str) { - setup_append_buf(ds, (int)strlen(str) + 1); - memcpy(ds->data + strlen(ds->data), str, strlen(str)); -} - -void arg_dstr_catc(arg_dstr_t ds, char c) { - setup_append_buf(ds, 2); - memcpy(ds->data + strlen(ds->data), &c, 1); -} - -/* - * The logic of the `arg_dstr_catf` function is adapted from the `bformat` - * function in The Better String Library by Paul Hsieh. Here is the copyright - * notice from the library: - * - * Copyright (c) 2014, Paul Hsieh - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * * 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. - * - * * Neither the name of bstrlib 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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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. - */ -void arg_dstr_catf(arg_dstr_t ds, const char* fmt, ...) { - va_list arglist; - char* buff; - int n, r; - size_t slen; - - if (fmt == NULL) - return; - - /* Since the length is not determinable beforehand, a search is - performed using the truncating "vsnprintf" call (to avoid buffer - overflows) on increasing potential sizes for the output result. */ - - if ((n = (int)(2 * strlen(fmt))) < START_VSNBUFF) - n = START_VSNBUFF; - - buff = (char*)xmalloc(n + 2); - memset(buff, 0, n + 2); - - for (;;) { - va_start(arglist, fmt); - r = vsnprintf(buff, n + 1, fmt, arglist); - va_end(arglist); - - slen = strlen(buff); - if (slen < (size_t)n) - break; - - if (r > n) - n = r; - else - n += n; - - xfree(buff); - buff = (char*)xmalloc(n + 2); - memset(buff, 0, n + 2); - } - - arg_dstr_cat(ds, buff); - xfree(buff); -} - -static void setup_append_buf(arg_dstr_t ds, int new_space) { - int total_space; - - /* - * Make the append buffer larger, if that's necessary, then copy the - * data into the append buffer and make the append buffer the official - * data. - */ - if (ds->data != ds->append_data) { - /* - * If the buffer is too big, then free it up so we go back to a - * smaller buffer. This avoids tying up memory forever after a large - * operation. - */ - if (ds->append_data_size > 500) { - xfree(ds->append_data); - ds->append_data = NULL; - ds->append_data_size = 0; - } - ds->append_used = (int)strlen(ds->data); - } else if (ds->data[ds->append_used] != 0) { - /* - * Most likely someone has modified a result created by - * arg_dstr_cat et al. so that it has a different size. Just - * recompute the size. - */ - ds->append_used = (int)strlen(ds->data); - } - - total_space = new_space + ds->append_used; - if (total_space >= ds->append_data_size) { - char* newbuf; - - if (total_space < 100) { - total_space = 200; - } else { - total_space *= 2; - } - newbuf = (char*)xmalloc((unsigned)total_space); - memset(newbuf, 0, total_space); - strcpy(newbuf, ds->data); - if (ds->append_data != NULL) { - xfree(ds->append_data); - } - ds->append_data = newbuf; - ds->append_data_size = total_space; - } else if (ds->data != ds->append_data) { - strcpy(ds->append_data, ds->data); - } - - arg_dstr_free(ds); - ds->data = ds->append_data; -} - -void arg_dstr_free(arg_dstr_t ds) { - if (ds->free_proc != NULL) { - if (ds->free_proc == ARG_DSTR_DYNAMIC) { - xfree(ds->data); - } else { - (*ds->free_proc)(ds->data); - } - ds->free_proc = NULL; - } -} - -void arg_dstr_reset(arg_dstr_t ds) { - arg_dstr_free(ds); - if ((ds->append_data != NULL) && (ds->append_data_size > 0)) { - xfree(ds->append_data); - ds->append_data = NULL; - ds->append_data_size = 0; - } - - ds->data = ds->sbuf; - ds->sbuf[0] = 0; -} - -#if defined(_MSC_VER) -#pragma warning(pop) -#endif -/* $Id: getopt.h,v 1.1 2009/10/16 19:50:28 rodney Exp rodney $ */ -/* $OpenBSD: getopt.h,v 1.1 2002/12/03 20:24:29 millert Exp $ */ -/* $NetBSD: getopt.h,v 1.4 2000/07/07 10:43:54 ad Exp $ */ - -/* - * Copyright (c) 2000 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Dieter Baron and Thomas Klausner. - * - * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgment: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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. - */ - -#if ARG_REPLACE_GETOPT == 1 - -#ifndef _GETOPT_H_ -#define _GETOPT_H_ - -/* - * GNU-like getopt_long() and 4.4BSD getsubopt()/optreset extensions - */ -#define no_argument 0 -#define required_argument 1 -#define optional_argument 2 - -struct option { - /* name of long option */ - const char* name; - /* - * one of no_argument, required_argument, and optional_argument: - * whether option takes an argument - */ - int has_arg; - /* if not NULL, set *flag to val when option found */ - int* flag; - /* if flag not NULL, value to set *flag to; else return value */ - int val; -}; - -#ifdef __cplusplus -extern "C" { -#endif - -int getopt_long(int, char* const*, const char*, const struct option*, int*); -int getopt_long_only(int, char* const*, const char*, const struct option*, int*); -#ifndef _GETOPT_DEFINED -#define _GETOPT_DEFINED -int getopt(int, char* const*, const char*); -int getsubopt(char**, char* const*, char**); - -extern char* optarg; /* getopt(3) external variables */ -extern int opterr; -extern int optind; -extern int optopt; -extern int optreset; -extern char* suboptarg; /* getsubopt(3) external variable */ -#endif /* _GETOPT_DEFINED */ - -#ifdef __cplusplus -} -#endif -#endif /* !_GETOPT_H_ */ - -#else -#include -#endif /* ARG_REPLACE_GETOPT */ -/* $Id: getopt_long.c,v 1.1 2009/10/16 19:50:28 rodney Exp rodney $ */ -/* $OpenBSD: getopt_long.c,v 1.23 2007/10/31 12:34:57 chl Exp $ */ -/* $NetBSD: getopt_long.c,v 1.15 2002/01/31 22:43:40 tv Exp $ */ - -/* - * Copyright (c) 2002 Todd C. 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. - * - * Sponsored in part by the Defense Advanced Research Projects - * Agency (DARPA) and Air Force Research Laboratory, Air Force - * Materiel Command, USAF, under agreement number F39502-99-1-0512. - */ - -/* - * Copyright (c) 2000 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Dieter Baron and Thomas Klausner. - * - * 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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. - */ - -#include "argtable3.h" - -#ifndef ARG_AMALGAMATION -#include "getopt.h" -#endif - -#include -#include -#include - -#if ARG_REPLACE_GETOPT == 1 -int opterr = 1; /* if error message should be printed */ -int optind = 1; /* index into parent argv vector */ -int optopt = '?'; /* character checked for validity */ -int optreset; /* reset getopt */ -char* optarg; /* argument associated with option */ -#endif /* ARG_REPLACE_GETOPT */ - -#define PRINT_ERROR ((opterr) && (*options != ':')) - -#define FLAG_PERMUTE 0x01 /* permute non-options to the end of argv */ -#define FLAG_ALLARGS 0x02 /* treat non-options as args to option "-1" */ -#define FLAG_LONGONLY 0x04 /* operate as getopt_long_only */ - -/* return values */ -#define BADCH (int)'?' -#define BADARG ((*options == ':') ? (int)':' : (int)'?') -#define INORDER (int)1 - -#define EMSG "" - -#if ARG_REPLACE_GETOPT == 1 -static int getopt_internal(int, char* const*, const char*, const struct option*, int*, int); -#endif /* ARG_REPLACE_GETOPT */ -static int parse_long_options(char* const*, const char*, const struct option*, int*, int); -static int gcd(int, int); -static void permute_args(int, int, int, char* const*); - -static char* place = EMSG; /* option letter processing */ - -/* XXX: set optreset to 1 rather than these two */ -static int nonopt_start = -1; /* first non option argument (for permute) */ -static int nonopt_end = -1; /* first option after non options (for permute) */ - -/* Error messages */ -static const char recargchar[] = "option requires an argument -- %c"; -static const char recargstring[] = "option requires an argument -- %s"; -static const char ambig[] = "ambiguous option -- %.*s"; -static const char noarg[] = "option doesn't take an argument -- %.*s"; -static const char illoptchar[] = "unknown option -- %c"; -static const char illoptstring[] = "unknown option -- %s"; - -#ifdef _WIN32 - -/* - * Windows needs warnx(). We change the definition though: - * 1. (another) global is defined, opterrmsg, which holds the error message - * 2. errors are always printed out on stderr w/o the program name - * Note that opterrmsg always gets set no matter what opterr is set to. The - * error message will not be printed if opterr is 0 as usual. - */ - -#include -#include - -#define MAX_OPTERRMSG_SIZE 128 - -extern char opterrmsg[MAX_OPTERRMSG_SIZE]; -char opterrmsg[MAX_OPTERRMSG_SIZE]; /* buffer for the last error message */ - -static void warnx(const char* fmt, ...) { - va_list ap; - va_start(ap, fmt); - - /* - * Make sure opterrmsg is always zero-terminated despite the _vsnprintf() - * implementation specifics and manually suppress the warning. - */ - memset(opterrmsg, 0, sizeof(opterrmsg)); - if (fmt != NULL) -#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || (defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__)) - _vsnprintf_s(opterrmsg, sizeof(opterrmsg), sizeof(opterrmsg) - 1, fmt, ap); -#else - _vsnprintf(opterrmsg, sizeof(opterrmsg) - 1, fmt, ap); -#endif - - va_end(ap); - -#ifdef _MSC_VER -#pragma warning(suppress : 6053) -#endif - fprintf(stderr, "%s\n", opterrmsg); -} - -#else -#include -#endif /*_WIN32*/ - -/* - * Compute the greatest common divisor of a and b. - */ -static int gcd(int a, int b) { - int c; - - c = a % b; - while (c != 0) { - a = b; - b = c; - c = a % b; - } - - return (b); -} - -/* - * Exchange the block from nonopt_start to nonopt_end with the block - * from nonopt_end to opt_end (keeping the same order of arguments - * in each block). - */ -static void permute_args(int panonopt_start, int panonopt_end, int opt_end, char* const* nargv) { - int cstart, cyclelen, i, j, ncycle, nnonopts, nopts, pos; - char* swap; - - /* - * compute lengths of blocks and number and size of cycles - */ - nnonopts = panonopt_end - panonopt_start; - nopts = opt_end - panonopt_end; - ncycle = gcd(nnonopts, nopts); - cyclelen = (opt_end - panonopt_start) / ncycle; - - for (i = 0; i < ncycle; i++) { - cstart = panonopt_end + i; - pos = cstart; - for (j = 0; j < cyclelen; j++) { - if (pos >= panonopt_end) - pos -= nnonopts; - else - pos += nopts; - swap = nargv[pos]; - /* LINTED const cast */ - ((char**)nargv)[pos] = nargv[cstart]; - /* LINTED const cast */ - ((char**)nargv)[cstart] = swap; - } - } -} - -/* - * parse_long_options -- - * Parse long options in argc/argv argument vector. - * Returns -1 if short_too is set and the option does not match long_options. - */ -static int parse_long_options(char* const* nargv, const char* options, const struct option* long_options, int* idx, int short_too) { - char *current_argv, *has_equal; - size_t current_argv_len; - int i, match; - - current_argv = place; - match = -1; - - optind++; - - if ((has_equal = strchr(current_argv, '=')) != NULL) { - /* argument found (--option=arg) */ - current_argv_len = has_equal - current_argv; - has_equal++; - } else - current_argv_len = strlen(current_argv); - - for (i = 0; long_options[i].name; i++) { - /* find matching long option */ - if (strncmp(current_argv, long_options[i].name, current_argv_len)) - continue; - - if (strlen(long_options[i].name) == current_argv_len) { - /* exact match */ - match = i; - break; - } - /* - * If this is a known short option, don't allow - * a partial match of a single character. - */ - if (short_too && current_argv_len == 1) - continue; - - if (match == -1) /* partial match */ - match = i; - else { - /* ambiguous abbreviation */ - if (PRINT_ERROR) - warnx(ambig, (int)current_argv_len, current_argv); - optopt = 0; - return (BADCH); - } - } - if (match != -1) { /* option found */ - if (long_options[match].has_arg == no_argument && has_equal) { - if (PRINT_ERROR) - warnx(noarg, (int)current_argv_len, current_argv); - /* - * XXX: GNU sets optopt to val regardless of flag - */ - if (long_options[match].flag == NULL) - optopt = long_options[match].val; - else - optopt = 0; - return (BADARG); - } - if (long_options[match].has_arg == required_argument || long_options[match].has_arg == optional_argument) { - if (has_equal) - optarg = has_equal; - else if (long_options[match].has_arg == required_argument) { - /* - * optional argument doesn't use next nargv - */ - optarg = nargv[optind++]; - } - } - if ((long_options[match].has_arg == required_argument) && (optarg == NULL)) { - /* - * Missing argument; leading ':' indicates no error - * should be generated. - */ - if (PRINT_ERROR) - warnx(recargstring, current_argv); - /* - * XXX: GNU sets optopt to val regardless of flag - */ - if (long_options[match].flag == NULL) - optopt = long_options[match].val; - else - optopt = 0; - --optind; - return (BADARG); - } - } else { /* unknown option */ - if (short_too) { - --optind; - return (-1); - } - if (PRINT_ERROR) - warnx(illoptstring, current_argv); - optopt = 0; - return (BADCH); - } - if (idx) - *idx = match; - if (long_options[match].flag) { - *long_options[match].flag = long_options[match].val; - return (0); - } else - return (long_options[match].val); -} - -#if ARG_REPLACE_GETOPT == 1 -/* - * getopt_internal -- - * Parse argc/argv argument vector. Called by user level routines. - */ -static int getopt_internal(int nargc, char* const* nargv, const char* options, const struct option* long_options, int* idx, int flags) { - char* oli; /* option letter list index */ - int optchar, short_too; - static int posixly_correct = -1; - - if (options == NULL) - return (-1); - - /* - * Disable GNU extensions if POSIXLY_CORRECT is set or options - * string begins with a '+'. - */ - if (posixly_correct == -1) -#if defined(_MSC_VER) -#pragma warning(push) -#pragma warning(disable : 4996) -#endif - posixly_correct = (getenv("POSIXLY_CORRECT") != NULL); -#if defined(_MSC_VER) -#pragma warning(pop) -#endif - if (posixly_correct || *options == '+') - flags &= ~FLAG_PERMUTE; - else if (*options == '-') - flags |= FLAG_ALLARGS; - if (*options == '+' || *options == '-') - options++; - - /* - * XXX Some GNU programs (like cvs) set optind to 0 instead of - * XXX using optreset. Work around this braindamage. - */ - if (optind == 0) - optind = optreset = 1; - - optarg = NULL; - if (optreset) - nonopt_start = nonopt_end = -1; -start: - if (optreset || !*place) { /* update scanning pointer */ - optreset = 0; - if (optind >= nargc) { /* end of argument vector */ - place = EMSG; - if (nonopt_end != -1) { - /* do permutation, if we have to */ - permute_args(nonopt_start, nonopt_end, optind, nargv); - optind -= nonopt_end - nonopt_start; - } else if (nonopt_start != -1) { - /* - * If we skipped non-options, set optind - * to the first of them. - */ - optind = nonopt_start; - } - nonopt_start = nonopt_end = -1; - return (-1); - } - if (*(place = nargv[optind]) != '-' || (place[1] == '\0' && strchr(options, '-') == NULL)) { - place = EMSG; /* found non-option */ - if (flags & FLAG_ALLARGS) { - /* - * GNU extension: - * return non-option as argument to option 1 - */ - optarg = nargv[optind++]; - return (INORDER); - } - if (!(flags & FLAG_PERMUTE)) { - /* - * If no permutation wanted, stop parsing - * at first non-option. - */ - return (-1); - } - /* do permutation */ - if (nonopt_start == -1) - nonopt_start = optind; - else if (nonopt_end != -1) { - permute_args(nonopt_start, nonopt_end, optind, nargv); - nonopt_start = optind - (nonopt_end - nonopt_start); - nonopt_end = -1; - } - optind++; - /* process next argument */ - goto start; - } - if (nonopt_start != -1 && nonopt_end == -1) - nonopt_end = optind; - - /* - * If we have "-" do nothing, if "--" we are done. - */ - if (place[1] != '\0' && *++place == '-' && place[1] == '\0') { - optind++; - place = EMSG; - /* - * We found an option (--), so if we skipped - * non-options, we have to permute. - */ - if (nonopt_end != -1) { - permute_args(nonopt_start, nonopt_end, optind, nargv); - optind -= nonopt_end - nonopt_start; - } - nonopt_start = nonopt_end = -1; - return (-1); - } - } - - /* - * Check long options if: - * 1) we were passed some - * 2) the arg is not just "-" - * 3) either the arg starts with -- we are getopt_long_only() - */ - if (long_options != NULL && place != nargv[optind] && (*place == '-' || (flags & FLAG_LONGONLY))) { - short_too = 0; - if (*place == '-') - place++; /* --foo long option */ - else if (*place != ':' && strchr(options, *place) != NULL) - short_too = 1; /* could be short option too */ - - optchar = parse_long_options(nargv, options, long_options, idx, short_too); - if (optchar != -1) { - place = EMSG; - return (optchar); - } - } - - if ((optchar = (int)*place++) == (int)':' || (optchar == (int)'-' && *place != '\0') || (oli = strchr(options, optchar)) == NULL) { - /* - * If the user specified "-" and '-' isn't listed in - * options, return -1 (non-option) as per POSIX. - * Otherwise, it is an unknown option character (or ':'). - */ - if (optchar == (int)'-' && *place == '\0') - return (-1); - if (!*place) - ++optind; - if (PRINT_ERROR) - warnx(illoptchar, optchar); - optopt = optchar; - return (BADCH); - } - if (long_options != NULL && optchar == 'W' && oli[1] == ';') { - /* -W long-option */ - if (*place) /* no space */ - /* NOTHING */; - else if (++optind >= nargc) { /* no arg */ - place = EMSG; - if (PRINT_ERROR) - warnx(recargchar, optchar); - optopt = optchar; - return (BADARG); - } else /* white space */ - place = nargv[optind]; - optchar = parse_long_options(nargv, options, long_options, idx, 0); - place = EMSG; - return (optchar); - } - if (*++oli != ':') { /* doesn't take argument */ - if (!*place) - ++optind; - } else { /* takes (optional) argument */ - optarg = NULL; - if (*place) /* no white space */ - optarg = place; - else if (oli[1] != ':') { /* arg not optional */ - if (++optind >= nargc) { /* no arg */ - place = EMSG; - if (PRINT_ERROR) - warnx(recargchar, optchar); - optopt = optchar; - return (BADARG); - } else - optarg = nargv[optind]; - } - place = EMSG; - ++optind; - } - /* dump back option letter */ - return (optchar); -} - -/* - * getopt -- - * Parse argc/argv argument vector. - * - * [eventually this will replace the BSD getopt] - */ -int getopt(int nargc, char* const* nargv, const char* options) { - /* - * We don't pass FLAG_PERMUTE to getopt_internal() since - * the BSD getopt(3) (unlike GNU) has never done this. - * - * Furthermore, since many privileged programs call getopt() - * before dropping privileges it makes sense to keep things - * as simple (and bug-free) as possible. - */ - return (getopt_internal(nargc, nargv, options, NULL, NULL, 0)); -} -#endif /* ARG_REPLACE_GETOPT */ - -/* - * getopt_long -- - * Parse argc/argv argument vector. - */ -int getopt_long(int nargc, char* const* nargv, const char* options, const struct option* long_options, int* idx) { - return (getopt_internal(nargc, nargv, options, long_options, idx, FLAG_PERMUTE)); -} - -/* - * getopt_long_only -- - * Parse argc/argv argument vector. - */ -int getopt_long_only(int nargc, char* const* nargv, const char* options, const struct option* long_options, int* idx) { - return (getopt_internal(nargc, nargv, options, long_options, idx, FLAG_PERMUTE | FLAG_LONGONLY)); -} -/******************************************************************************* - * arg_date: Implements the date command-line option - * * This file is part of the argtable3 library. * * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann @@ -1858,32 +154,646 @@ int getopt_long_only(int nargc, char* const* nargv, const char* options, const s * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ -#include "argtable3.h" +#include +#include -#ifndef ARG_AMALGAMATION -#include "argtable3_private.h" + +void dbg_printf(const char *fmt, ...) { + va_list args; + va_start(args, fmt); + vfprintf(stderr, fmt, args); + va_end(args); +} + +#include "getopt.h" + +/* $Id: getopt_long.c,v 1.1 2009/10/16 19:50:28 rodney Exp rodney $ */ +/* $OpenBSD: getopt_long.c,v 1.23 2007/10/31 12:34:57 chl Exp $ */ +/* $NetBSD: getopt_long.c,v 1.15 2002/01/31 22:43:40 tv Exp $ */ + +/* + * Copyright (c) 2002 Todd C. 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. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +// $Id: getopt_long.c,v 1.1 2009/10/16 19:50:28 rodney Exp rodney $" + +/*- + * Copyright (c) 2000 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Dieter Baron and Thomas Klausner. + * + * 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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. + */ + +#if 0 +#include #endif +#include +#include +#include + + +#define REPLACE_GETOPT /* use this getopt as the system getopt(3) */ + +#ifdef REPLACE_GETOPT +int opterr = 1; /* if error message should be printed */ +int optind = 1; /* index into parent argv vector */ +int optopt = '?'; /* character checked for validity */ +int optreset; /* reset getopt */ +const char *optarg; /* argument associated with option */ +#endif + +#define PRINT_ERROR ((opterr) && (*options != ':')) + +#define FLAG_PERMUTE 0x01 /* permute non-options to the end of argv */ +#define FLAG_ALLARGS 0x02 /* treat non-options as args to option "-1" */ +#define FLAG_LONGONLY 0x04 /* operate as getopt_long_only */ + +/* return values */ +#define BADCH (int)'?' +#define BADARG ((*options == ':') ? (int)':' : (int)'?') +#define INORDER (int)1 + +#define EMSG "" + +static int getopt_internal(int, char *const *, const char *, + const struct option *, int *, int); +static int parse_long_options(char *const *, const char *, + const struct option *, int *, int); +static int gcd(int, int); +static void permute_args(int, int, int, char *const *); + +static const char *place = EMSG; /* option letter processing */ + +/* XXX: set optreset to 1 rather than these two */ +static int nonopt_start = -1; /* first non option argument (for permute) */ +static int nonopt_end = -1; /* first option after non options (for permute) */ + +/* Error messages */ +static const char recargchar[] = "option requires an argument -- %c"; +static const char recargstring[] = "option requires an argument -- %s"; +static const char ambig[] = "ambiguous option -- %.*s"; +static const char noarg[] = "option doesn't take an argument -- %.*s"; +static const char illoptchar[] = "unknown option -- %c"; +static const char illoptstring[] = "unknown option -- %s"; + + + +#ifdef _WIN32 + +/* Windows needs warnx(). We change the definition though: + * 1. (another) global is defined, opterrmsg, which holds the error message + * 2. errors are always printed out on stderr w/o the program name + * Note that opterrmsg always gets set no matter what opterr is set to. The + * error message will not be printed if opterr is 0 as usual. + */ + +#include +#include + +#define MAX_OPTER_MSG_SIZE 128 + +extern char opterrmsg[MAX_OPTER_MSG_SIZE]; +char opterrmsg[MAX_OPTER_MSG_SIZE]; /* buffer for the last error message */ + +static void warnx(const char *fmt, ...) { + va_list ap; + va_start(ap, fmt); + /* + Make sure opterrmsg is always zero-terminated despite the _vsnprintf() + implementation specifics and manually suppress the warning. + */ + memset(opterrmsg, 0, sizeof opterrmsg); + if (fmt != NULL) +#ifdef __STDC_WANT_SECURE_LIB__ + _vsnprintf_s(opterrmsg, MAX_OPTER_MSG_SIZE, sizeof(opterrmsg) - 1, fmt, ap); +#else + _vsnprintf(opterrmsg, sizeof(opterrmsg) - 1, fmt, ap); +#endif + va_end(ap); + + fprintf(stderr, "%s\n", opterrmsg); +} + +#else +#include +#endif /*_WIN32*/ + + +/* + * Compute the greatest common divisor of a and b. + */ +static int +gcd(int a, int b) { + int c; + + c = a % b; + while (c != 0) { + a = b; + b = c; + c = a % b; + } + + return (b); +} + +/* + * Exchange the block from nonopt_start to nonopt_end with the block + * from nonopt_end to opt_end (keeping the same order of arguments + * in each block). + */ +static void +permute_args(int panonopt_start, int panonopt_end, int opt_end, + char *const *nargv) { + + /* + * compute lengths of blocks and number and size of cycles + */ + int nnonopts = panonopt_end - panonopt_start; + int nopts = opt_end - panonopt_end; + int ncycle = gcd(nnonopts, nopts); + int cyclelen = (opt_end - panonopt_start) / ncycle; + + for (int i = 0; i < ncycle; i++) { + int cstart = panonopt_end + i; + int pos = cstart; + for (int j = 0; j < cyclelen; j++) { + if (pos >= panonopt_end) + pos -= nnonopts; + else + pos += nopts; + char *swap = nargv[pos]; + /* LINTED const cast */ + ((char **) nargv)[pos] = nargv[cstart]; + /* LINTED const cast */ + ((char **)nargv)[cstart] = swap; + } + } +} + +/* + * parse_long_options -- + * Parse long options in argc/argv argument vector. + * Returns -1 if short_too is set and the option does not match long_options. + */ +static int +parse_long_options(char *const *nargv, const char *options, + const struct option *long_options, int *idx, int short_too) { + const char *current_argv, *has_equal; + size_t current_argv_len; + int i, match; + + current_argv = place; + match = -1; + + optind++; + + if ((has_equal = strchr(current_argv, '=')) != NULL) { + /* argument found (--option=arg) */ + current_argv_len = has_equal - current_argv; + has_equal++; + } else + current_argv_len = strlen(current_argv); + + for (i = 0; long_options[i].name; i++) { + /* find matching long option */ + if (strncmp(current_argv, long_options[i].name, + current_argv_len)) + continue; + + if (strlen(long_options[i].name) == current_argv_len) { + /* exact match */ + match = i; + break; + } + /* + * If this is a known short option, don't allow + * a partial match of a single character. + */ + if (short_too && current_argv_len == 1) + continue; + + if (match == -1) /* partial match */ + match = i; + else { + /* ambiguous abbreviation */ + if (PRINT_ERROR) + warnx(ambig, (int)current_argv_len, + current_argv); + optopt = 0; + return (BADCH); + } + } + if (match != -1) { /* option found */ + if (long_options[match].has_arg == no_argument + && has_equal) { + if (PRINT_ERROR) + warnx(noarg, (int)current_argv_len, + current_argv); + /* + * XXX: GNU sets optopt to val regardless of flag + */ + if (long_options[match].flag == NULL) + optopt = long_options[match].val; + else + optopt = 0; + return (BADARG); + } + if (long_options[match].has_arg == required_argument || + long_options[match].has_arg == optional_argument) { + if (has_equal) + optarg = has_equal; + else if (long_options[match].has_arg == + required_argument) { + /* + * optional argument doesn't use next nargv + */ + optarg = nargv[optind++]; + } + } + if ((long_options[match].has_arg == required_argument) + && (optarg == NULL)) { + /* + * Missing argument; leading ':' indicates no error + * should be generated. + */ + if (PRINT_ERROR) + warnx(recargstring, + current_argv); + /* + * XXX: GNU sets optopt to val regardless of flag + */ + if (long_options[match].flag == NULL) + optopt = long_options[match].val; + else + optopt = 0; + --optind; + return (BADARG); + } + } else { /* unknown option */ + if (short_too) { + --optind; + return (-1); + } + if (PRINT_ERROR) + warnx(illoptstring, current_argv); + optopt = 0; + return (BADCH); + } + if (idx) + *idx = match; + if (long_options[match].flag) { + *long_options[match].flag = long_options[match].val; + return (0); + } else + return (long_options[match].val); +} + +/* + * getopt_internal -- + * Parse argc/argv argument vector. Called by user level routines. + */ +static int +getopt_internal(int nargc, char *const *nargv, const char *options, + const struct option *long_options, int *idx, int flags) { + char *oli; /* option letter list index */ + int optchar, short_too; + static int posixly_correct = -1; +#ifdef __STDC_WANT_SECURE_LIB__ + char *buffer = NULL; + size_t buffer_size = 0; + errno_t err = 0; +#endif + + if (options == NULL) + return (-1); + + /* + * Disable GNU extensions if POSIXLY_CORRECT is set or options + * string begins with a '+'. + */ + +#ifdef __STDC_WANT_SECURE_LIB__ + if (posixly_correct == -1) { + err = _dupenv_s(&buffer, &buffer_size, "POSIXLY_CORRECT") == 0; + posixly_correct = buffer != NULL; + if (buffer != NULL && err == 0) { + free(buffer); + } + } +#else + if (posixly_correct == -1) + posixly_correct = (getenv("POSIXLY_CORRECT") != NULL); +#endif + if (posixly_correct || *options == '+') + flags &= ~FLAG_PERMUTE; + else if (*options == '-') + flags |= FLAG_ALLARGS; + if (*options == '+' || *options == '-') + options++; + + /* + * XXX Some GNU programs (like cvs) set optind to 0 instead of + * XXX using optreset. Work around this braindamage. + */ + if (optind == 0) + optind = optreset = 1; + + optarg = NULL; + if (optreset) + nonopt_start = nonopt_end = -1; +start: + if (optreset || !*place) { /* update scanning pointer */ + optreset = 0; + if (optind >= nargc) { /* end of argument vector */ + place = EMSG; + if (nonopt_end != -1) { + /* do permutation, if we have to */ + permute_args(nonopt_start, nonopt_end, + optind, nargv); + optind -= nonopt_end - nonopt_start; + } else if (nonopt_start != -1) { + /* + * If we skipped non-options, set optind + * to the first of them. + */ + optind = nonopt_start; + } + nonopt_start = nonopt_end = -1; + return (-1); + } + if (*(place = nargv[optind]) != '-' || + (place[1] == '\0' && strchr(options, '-') == NULL)) { + place = EMSG; /* found non-option */ + if (flags & FLAG_ALLARGS) { + /* + * GNU extension: + * return non-option as argument to option 1 + */ + optarg = nargv[optind++]; + return (INORDER); + } + if (!(flags & FLAG_PERMUTE)) { + /* + * If no permutation wanted, stop parsing + * at first non-option. + */ + return (-1); + } + /* do permutation */ + if (nonopt_start == -1) + nonopt_start = optind; + else if (nonopt_end != -1) { + permute_args(nonopt_start, nonopt_end, + optind, nargv); + nonopt_start = optind - + (nonopt_end - nonopt_start); + nonopt_end = -1; + } + optind++; + /* process next argument */ + goto start; + } + if (nonopt_start != -1 && nonopt_end == -1) + nonopt_end = optind; + + /* + * If we have "-" do nothing, if "--" we are done. + */ + if (place[1] != '\0' && *++place == '-' && place[1] == '\0') { + optind++; + place = EMSG; + /* + * We found an option (--), so if we skipped + * non-options, we have to permute. + */ + if (nonopt_end != -1) { + permute_args(nonopt_start, nonopt_end, + optind, nargv); + optind -= nonopt_end - nonopt_start; + } + nonopt_start = nonopt_end = -1; + return (-1); + } + } + + /* + * Check long options if: + * 1) we were passed some + * 2) the arg is not just "-" + * 3) either the arg starts with -- we are getopt_long_only() + */ + if (long_options != NULL && place != nargv[optind] && + (*place == '-' || (flags & FLAG_LONGONLY))) { + short_too = 0; + if (*place == '-') + place++; /* --foo long option */ + else if (*place != ':' && strchr(options, *place) != NULL) + short_too = 1; /* could be short option too */ + + optchar = parse_long_options(nargv, options, long_options, + idx, short_too); + if (optchar != -1) { + place = EMSG; + return (optchar); + } + } + + if ((optchar = (int) * place++) == (int)':' || + (optchar == (int)'-' && *place != '\0') || + (oli = strchr(options, optchar)) == NULL) { + /* + * If the user specified "-" and '-' isn't listed in + * options, return -1 (non-option) as per POSIX. + * Otherwise, it is an unknown option character (or ':'). + */ + if (optchar == (int)'-' && *place == '\0') + return (-1); + if (!*place) + ++optind; + if (PRINT_ERROR) + warnx(illoptchar, optchar); + optopt = optchar; + return (BADCH); + } + if (long_options != NULL && optchar == 'W' && oli[1] == ';') { + /* -W long-option */ + if (*place) /* no space */ + /* NOTHING */; + else if (++optind >= nargc) { /* no arg */ + place = EMSG; + if (PRINT_ERROR) + warnx(recargchar, optchar); + optopt = optchar; + return (BADARG); + } else /* white space */ + place = nargv[optind]; + optchar = parse_long_options(nargv, options, long_options, + idx, 0); + place = EMSG; + return (optchar); + } + if (*++oli != ':') { /* doesn't take argument */ + if (!*place) + ++optind; + } else { /* takes (optional) argument */ + optarg = NULL; + if (*place) /* no white space */ + optarg = place; + else if (oli[1] != ':') { /* arg not optional */ + if (++optind >= nargc) { /* no arg */ + place = EMSG; + if (PRINT_ERROR) + warnx(recargchar, optchar); + optopt = optchar; + return (BADARG); + } else + optarg = nargv[optind]; + } + place = EMSG; + ++optind; + } + /* dump back option letter */ + return (optchar); +} + +#ifdef REPLACE_GETOPT +/* + * getopt -- + * Parse argc/argv argument vector. + * + * [eventually this will replace the BSD getopt] + */ +int +getopt(int nargc, char *const *nargv, const char *options) { + + /* + * We don't pass FLAG_PERMUTE to getopt_internal() since + * the BSD getopt(3) (unlike GNU) has never done this. + * + * Furthermore, since many privileged programs call getopt() + * before dropping privileges it makes sense to keep things + * as simple (and bug-free) as possible. + */ + return (getopt_internal(nargc, nargv, options, NULL, NULL, 0)); +} +#endif /* REPLACE_GETOPT */ + +/* + * getopt_long -- + * Parse argc/argv argument vector. + */ +int +getopt_long(int nargc, char *const *nargv, const char *options, + const struct option *long_options, int *idx) { + + return (getopt_internal(nargc, nargv, options, long_options, idx, + FLAG_PERMUTE)); +} + +/* + * getopt_long_only -- + * Parse argc/argv argument vector. + */ +int +getopt_long_only(int nargc, char *const *nargv, const char *options, + const struct option *long_options, int *idx) { + + return (getopt_internal(nargc, nargv, options, long_options, idx, + FLAG_PERMUTE | FLAG_LONGONLY)); +} +/******************************************************************************* + * This file is part of the argtable3 library. + * + * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of STEWART HEITMANN 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 COPYRIGHT HOLDERS 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 STEWART HEITMANN 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 #include -char* arg_strptime(const char* buf, const char* fmt, struct tm* tm); +#include "argtable3.h" -static void arg_date_resetfn(struct arg_date* parent) { + +char *arg_strptime(const char *buf, const char *fmt, struct tm *tm); + + +static void arg_date_resetfn(struct arg_date *parent) { ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent)); parent->count = 0; } -static int arg_date_scanfn(struct arg_date* parent, const char* argval) { + +static int arg_date_scanfn(struct arg_date *parent, const char *argval) { int errorcode = 0; if (parent->count == parent->hdr.maxcount) { - errorcode = ARG_ERR_MAXCOUNT; + errorcode = EMAXCOUNT; } else if (!argval) { /* no argument value was given, leave parent->tmval[] unaltered but still count it */ parent->count++; } else { - const char* pend; + const char *pend; struct tm tm = parent->tmval[parent->count]; /* parse the given argument value, store result in parent->tmval[] */ @@ -1891,66 +801,92 @@ static int arg_date_scanfn(struct arg_date* parent, const char* argval) { if (pend && pend[0] == '\0') parent->tmval[parent->count++] = tm; else - errorcode = ARG_ERR_BADDATE; + errorcode = EBADDATE; } ARG_TRACE(("%s:scanfn(%p) returns %d\n", __FILE__, parent, errorcode)); return errorcode; } -static int arg_date_checkfn(struct arg_date* parent) { - int errorcode = (parent->count < parent->hdr.mincount) ? ARG_ERR_MINCOUNT : 0; + +static int arg_date_checkfn(struct arg_date *parent) { + int errorcode = (parent->count < parent->hdr.mincount) ? EMINCOUNT : 0; ARG_TRACE(("%s:checkfn(%p) returns %d\n", __FILE__, parent, errorcode)); return errorcode; } -static void arg_date_errorfn(struct arg_date* parent, arg_dstr_t ds, int errorcode, const char* argval, const char* progname) { - const char* shortopts = parent->hdr.shortopts; - const char* longopts = parent->hdr.longopts; - const char* datatype = parent->hdr.datatype; + +static void arg_date_errorfn( + struct arg_date *parent, + FILE *fp, + int errorcode, + const char *argval, + const char *progname) { + const char *shortopts = parent->hdr.shortopts; + const char *longopts = parent->hdr.longopts; + const char *datatype = parent->hdr.datatype; /* make argval NULL safe */ argval = argval ? argval : ""; - arg_dstr_catf(ds, "%s: ", progname); + fprintf(fp, "%s: ", progname); switch (errorcode) { - case ARG_ERR_MINCOUNT: - arg_dstr_cat(ds, "missing option "); - arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); + case EMINCOUNT: + fputs("missing option ", fp); + arg_print_option(fp, shortopts, longopts, datatype, "\n"); break; - case ARG_ERR_MAXCOUNT: - arg_dstr_cat(ds, "excess option "); - arg_print_option_ds(ds, shortopts, longopts, argval, "\n"); + case EMAXCOUNT: + fputs("excess option ", fp); + arg_print_option(fp, shortopts, longopts, argval, "\n"); break; - case ARG_ERR_BADDATE: { + case EBADDATE: { struct tm tm; char buff[200]; - arg_dstr_catf(ds, "illegal timestamp format \"%s\"\n", argval); + fprintf(fp, "illegal timestamp format \"%s\"\n", argval); memset(&tm, 0, sizeof(tm)); arg_strptime("1999-12-31 23:59:59", "%F %H:%M:%S", &tm); strftime(buff, sizeof(buff), parent->format, &tm); - arg_dstr_catf(ds, "correct format is \"%s\"\n", buff); + printf("correct format is \"%s\"\n", buff); break; } } } -struct arg_date* arg_date0(const char* shortopts, const char* longopts, const char* format, const char* datatype, const char* glossary) { + +struct arg_date *arg_date0( + const char *shortopts, + const char *longopts, + const char *format, + const char *datatype, + const char *glossary) { return arg_daten(shortopts, longopts, format, datatype, 0, 1, glossary); } -struct arg_date* arg_date1(const char* shortopts, const char* longopts, const char* format, const char* datatype, const char* glossary) { + +struct arg_date *arg_date1( + const char *shortopts, + const char *longopts, + const char *format, + const char *datatype, + const char *glossary) { return arg_daten(shortopts, longopts, format, datatype, 1, 1, glossary); } -struct arg_date* -arg_daten(const char* shortopts, const char* longopts, const char* format, const char* datatype, int mincount, int maxcount, const char* glossary) { + +struct arg_date *arg_daten( + const char *shortopts, + const char *longopts, + const char *format, + const char *datatype, + int mincount, + int maxcount, + const char *glossary) { size_t nbytes; - struct arg_date* result; + struct arg_date *result; /* foolproof things by ensuring maxcount is not less than mincount */ maxcount = (maxcount < mincount) ? mincount : maxcount; @@ -1960,37 +896,39 @@ arg_daten(const char* shortopts, const char* longopts, const char* format, const format = "%x"; nbytes = sizeof(struct arg_date) /* storage for struct arg_date */ - + maxcount * sizeof(struct tm); /* storage for tmval[maxcount] array */ + + maxcount * sizeof(struct tm); /* storage for tmval[maxcount] array */ /* allocate storage for the arg_date struct + tmval[] array. */ /* we use calloc because we want the tmval[] array zero filled. */ - result = (struct arg_date*)xcalloc(1, nbytes); + result = (struct arg_date *)calloc(1, nbytes); + if (result) { + /* init the arg_hdr struct */ + result->hdr.flag = ARG_HASVALUE; + result->hdr.shortopts = shortopts; + result->hdr.longopts = longopts; + result->hdr.datatype = datatype ? datatype : format; + result->hdr.glossary = glossary; + result->hdr.mincount = mincount; + result->hdr.maxcount = maxcount; + result->hdr.parent = result; + result->hdr.resetfn = (arg_resetfn *)arg_date_resetfn; + result->hdr.scanfn = (arg_scanfn *)arg_date_scanfn; + result->hdr.checkfn = (arg_checkfn *)arg_date_checkfn; + result->hdr.errorfn = (arg_errorfn *)arg_date_errorfn; - /* init the arg_hdr struct */ - result->hdr.flag = ARG_HASVALUE; - result->hdr.shortopts = shortopts; - result->hdr.longopts = longopts; - result->hdr.datatype = datatype ? datatype : format; - result->hdr.glossary = glossary; - result->hdr.mincount = mincount; - result->hdr.maxcount = maxcount; - result->hdr.parent = result; - result->hdr.resetfn = (arg_resetfn*)arg_date_resetfn; - result->hdr.scanfn = (arg_scanfn*)arg_date_scanfn; - result->hdr.checkfn = (arg_checkfn*)arg_date_checkfn; - result->hdr.errorfn = (arg_errorfn*)arg_date_errorfn; + /* store the tmval[maxcount] array immediately after the arg_date struct */ + result->tmval = (struct tm *)(result + 1); - /* store the tmval[maxcount] array immediately after the arg_date struct */ - result->tmval = (struct tm*)(result + 1); - - /* init the remaining arg_date member variables */ - result->count = 0; - result->format = format; + /* init the remaining arg_date member variables */ + result->count = 0; + result->format = format; + } ARG_TRACE(("arg_daten() returns %p\n", result)); return result; } + /*- * Copyright (c) 1997, 1998, 2005, 2008 The NetBSD Foundation, Inc. * All rights reserved. @@ -2028,31 +966,40 @@ arg_daten(const char* shortopts, const char* longopts, const char* format, const * We do not implement alternate representations. However, we always * check whether a given modifier is allowed for a certain conversion. */ -#define ALT_E 0x01 -#define ALT_O 0x02 -#define LEGAL_ALT(x) \ - { \ - if (alt_format & ~(x)) \ - return (0); \ - } -#define TM_YEAR_BASE (1900) +#define ALT_E 0x01 +#define ALT_O 0x02 +#define LEGAL_ALT(x) { if (alt_format & ~(x)) return (0); } +#define TM_YEAR_BASE (1900) -static int conv_num(const char**, int*, int, int); +static int conv_num(const char * *, int *, int, int); -static const char* day[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; +static const char *day[7] = { + "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", + "Friday", "Saturday" +}; -static const char* abday[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; +static const char *abday[7] = { + "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" +}; -static const char* mon[12] = {"January", "February", "March", "April", "May", "June", - "July", "August", "September", "October", "November", "December"}; +static const char *mon[12] = { + "January", "February", "March", "April", "May", "June", "July", + "August", "September", "October", "November", "December" +}; -static const char* abmon[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; +static const char *abmon[12] = { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" +}; -static const char* am_pm[2] = {"AM", "PM"}; +static const char *am_pm[2] = { + "AM", "PM" +}; -static int arg_strcasecmp(const char* s1, const char* s2) { - const unsigned char* us1 = (const unsigned char*)s1; - const unsigned char* us2 = (const unsigned char*)s2; + +static int arg_strcasecmp(const char *s1, const char *s2) { + const unsigned char *us1 = (const unsigned char *)s1; + const unsigned char *us2 = (const unsigned char *)s2; while (tolower(*us1) == tolower(*us2++)) if (*us1++ == '\0') return 0; @@ -2060,10 +1007,11 @@ static int arg_strcasecmp(const char* s1, const char* s2) { return tolower(*us1) - tolower(*--us2); } -static int arg_strncasecmp(const char* s1, const char* s2, size_t n) { + +static int arg_strncasecmp(const char *s1, const char *s2, size_t n) { if (n != 0) { - const unsigned char* us1 = (const unsigned char*)s1; - const unsigned char* us2 = (const unsigned char*)s2; + const unsigned char *us1 = (const unsigned char *)s1; + const unsigned char *us2 = (const unsigned char *)s2; do { if (tolower(*us1) != tolower(*us2++)) return tolower(*us1) - tolower(*--us2); @@ -2076,9 +1024,10 @@ static int arg_strncasecmp(const char* s1, const char* s2, size_t n) { return 0; } -char* arg_strptime(const char* buf, const char* fmt, struct tm* tm) { + +char *arg_strptime(const char *buf, const char *fmt, struct tm *tm) { char c; - const char* bp; + const char *bp; size_t len = 0; int alt_format, i, split_year = 0; @@ -2089,8 +1038,8 @@ char* arg_strptime(const char* buf, const char* fmt, struct tm* tm) { alt_format = 0; /* Eat up white-space. */ - if (isspace(c)) { - while (isspace(*bp)) + if (ISSPACE(c)) { + while (ISSPACE(*bp)) bp++; fmt++; @@ -2100,10 +1049,11 @@ char* arg_strptime(const char* buf, const char* fmt, struct tm* tm) { if ((c = *fmt++) != '%') goto literal; - again: + +again: switch (c = *fmt++) { case '%': /* "%%" is converted to "%". */ - literal: +literal: if (c != *bp++) return (0); break; @@ -2362,20 +1312,24 @@ char* arg_strptime(const char* buf, const char* fmt, struct tm* tm) { case 'n': /* Any kind of white-space. */ case 't': LEGAL_ALT(0); - while (isspace(*bp)) + while (ISSPACE(*bp)) bp++; break; + default: /* Unknown/unsupported conversion. */ return (0); } + + } /* LINTED functional specification */ - return ((char*)bp); + return ((char *)bp); } -static int conv_num(const char** buf, int* dest, int llim, int ulim) { + +static int conv_num(const char * *buf, int *dest, int llim, int ulim) { int result = 0; /* The limit also determines the number of valid digits. */ @@ -2397,8 +1351,6 @@ static int conv_num(const char** buf, int* dest, int llim, int ulim) { return (1); } /******************************************************************************* - * arg_dbl: Implements the double command-line option - * * This file is part of the argtable3 library. * * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann @@ -2428,25 +1380,23 @@ static int conv_num(const char** buf, int* dest, int llim, int ulim) { * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ -#include "argtable3.h" - -#ifndef ARG_AMALGAMATION -#include "argtable3_private.h" -#endif - #include -static void arg_dbl_resetfn(struct arg_dbl* parent) { +#include "argtable3.h" + + +static void arg_dbl_resetfn(struct arg_dbl *parent) { ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent)); parent->count = 0; } -static int arg_dbl_scanfn(struct arg_dbl* parent, const char* argval) { + +static int arg_dbl_scanfn(struct arg_dbl *parent, const char *argval) { int errorcode = 0; if (parent->count == parent->hdr.maxcount) { /* maximum number of arguments exceeded */ - errorcode = ARG_ERR_MAXCOUNT; + errorcode = EMAXCOUNT; } else if (!argval) { /* a valid argument with no argument value was given. */ /* This happens when an optional argument value was invoked. */ @@ -2454,7 +1404,7 @@ static int arg_dbl_scanfn(struct arg_dbl* parent, const char* argval) { parent->count++; } else { double val; - char* end; + char *end; /* extract double from argval into val */ val = strtod(argval, &end); @@ -2463,101 +1413,125 @@ static int arg_dbl_scanfn(struct arg_dbl* parent, const char* argval) { if (*end == 0) parent->dval[parent->count++] = val; else - errorcode = ARG_ERR_BADDOUBLE; + errorcode = EBADDOUBLE; } ARG_TRACE(("%s:scanfn(%p) returns %d\n", __FILE__, parent, errorcode)); return errorcode; } -static int arg_dbl_checkfn(struct arg_dbl* parent) { - int errorcode = (parent->count < parent->hdr.mincount) ? ARG_ERR_MINCOUNT : 0; + +static int arg_dbl_checkfn(struct arg_dbl *parent) { + int errorcode = (parent->count < parent->hdr.mincount) ? EMINCOUNT : 0; ARG_TRACE(("%s:checkfn(%p) returns %d\n", __FILE__, parent, errorcode)); return errorcode; } -static void arg_dbl_errorfn(struct arg_dbl* parent, arg_dstr_t ds, int errorcode, const char* argval, const char* progname) { - const char* shortopts = parent->hdr.shortopts; - const char* longopts = parent->hdr.longopts; - const char* datatype = parent->hdr.datatype; + +static void arg_dbl_errorfn( + struct arg_dbl *parent, + FILE *fp, + int errorcode, + const char *argval, + const char *progname) { + const char *shortopts = parent->hdr.shortopts; + const char *longopts = parent->hdr.longopts; + const char *datatype = parent->hdr.datatype; /* make argval NULL safe */ argval = argval ? argval : ""; - arg_dstr_catf(ds, "%s: ", progname); + fprintf(fp, "%s: ", progname); switch (errorcode) { - case ARG_ERR_MINCOUNT: - arg_dstr_cat(ds, "missing option "); - arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); + case EMINCOUNT: + fputs("missing option ", fp); + arg_print_option(fp, shortopts, longopts, datatype, "\n"); break; - case ARG_ERR_MAXCOUNT: - arg_dstr_cat(ds, "excess option "); - arg_print_option_ds(ds, shortopts, longopts, argval, "\n"); + case EMAXCOUNT: + fputs("excess option ", fp); + arg_print_option(fp, shortopts, longopts, argval, "\n"); break; - case ARG_ERR_BADDOUBLE: - arg_dstr_catf(ds, "invalid argument \"%s\" to option ", argval); - arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); + case EBADDOUBLE: + fprintf(fp, "invalid argument \"%s\" to option ", argval); + arg_print_option(fp, shortopts, longopts, datatype, "\n"); break; } } -struct arg_dbl* arg_dbl0(const char* shortopts, const char* longopts, const char* datatype, const char* glossary) { + +struct arg_dbl *arg_dbl0( + const char *shortopts, + const char *longopts, + const char *datatype, + const char *glossary) { return arg_dbln(shortopts, longopts, datatype, 0, 1, glossary); } -struct arg_dbl* arg_dbl1(const char* shortopts, const char* longopts, const char* datatype, const char* glossary) { + +struct arg_dbl *arg_dbl1( + const char *shortopts, + const char *longopts, + const char *datatype, + const char *glossary) { return arg_dbln(shortopts, longopts, datatype, 1, 1, glossary); } -struct arg_dbl* arg_dbln(const char* shortopts, const char* longopts, const char* datatype, int mincount, int maxcount, const char* glossary) { + +struct arg_dbl *arg_dbln( + const char *shortopts, + const char *longopts, + const char *datatype, + int mincount, + int maxcount, + const char *glossary) { size_t nbytes; - struct arg_dbl* result; - size_t addr; - size_t rem; + struct arg_dbl *result; /* foolproof things by ensuring maxcount is not less than mincount */ maxcount = (maxcount < mincount) ? mincount : maxcount; - nbytes = sizeof(struct arg_dbl) /* storage for struct arg_dbl */ + nbytes = sizeof(struct arg_dbl) /* storage for struct arg_dbl */ + (maxcount + 1) * sizeof(double); /* storage for dval[maxcount] array plus one extra for padding to memory boundary */ - result = (struct arg_dbl*)xmalloc(nbytes); + result = (struct arg_dbl *)malloc(nbytes); + if (result) { + size_t addr; + size_t rem; - /* init the arg_hdr struct */ - result->hdr.flag = ARG_HASVALUE; - result->hdr.shortopts = shortopts; - result->hdr.longopts = longopts; - result->hdr.datatype = datatype ? datatype : ""; - result->hdr.glossary = glossary; - result->hdr.mincount = mincount; - result->hdr.maxcount = maxcount; - result->hdr.parent = result; - result->hdr.resetfn = (arg_resetfn*)arg_dbl_resetfn; - result->hdr.scanfn = (arg_scanfn*)arg_dbl_scanfn; - result->hdr.checkfn = (arg_checkfn*)arg_dbl_checkfn; - result->hdr.errorfn = (arg_errorfn*)arg_dbl_errorfn; + /* init the arg_hdr struct */ + result->hdr.flag = ARG_HASVALUE; + result->hdr.shortopts = shortopts; + result->hdr.longopts = longopts; + result->hdr.datatype = datatype ? datatype : ""; + result->hdr.glossary = glossary; + result->hdr.mincount = mincount; + result->hdr.maxcount = maxcount; + result->hdr.parent = result; + result->hdr.resetfn = (arg_resetfn *)arg_dbl_resetfn; + result->hdr.scanfn = (arg_scanfn *)arg_dbl_scanfn; + result->hdr.checkfn = (arg_checkfn *)arg_dbl_checkfn; + result->hdr.errorfn = (arg_errorfn *)arg_dbl_errorfn; - /* Store the dval[maxcount] array on the first double boundary that - * immediately follows the arg_dbl struct. We do the memory alignment - * purely for SPARC and Motorola systems. They require floats and - * doubles to be aligned on natural boundaries. - */ - addr = (size_t)(result + 1); - rem = addr % sizeof(double); - result->dval = (double*)(addr + sizeof(double) - rem); - ARG_TRACE(("addr=%p, dval=%p, sizeof(double)=%d rem=%d\n", addr, result->dval, (int)sizeof(double), (int)rem)); + /* Store the dval[maxcount] array on the first double boundary that + * immediately follows the arg_dbl struct. We do the memory alignment + * purely for SPARC and Motorola systems. They require floats and + * doubles to be aligned on natural boundaries. + */ + addr = (size_t)(result + 1); + rem = addr % sizeof(double); + result->dval = (double *)(addr + sizeof(double) - rem); + ARG_TRACE(("addr=%zu, dval=%p, sizeof(double)=%d rem=%d\n", addr, result->dval, (int)sizeof(double), (int)rem)); - result->count = 0; + result->count = 0; + } ARG_TRACE(("arg_dbln() returns %p\n", result)); return result; } /******************************************************************************* - * arg_end: Implements the error handling utilities - * * This file is part of the argtable3 library. * * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann @@ -2587,107 +1561,108 @@ struct arg_dbl* arg_dbln(const char* shortopts, const char* longopts, const char * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ -#include "argtable3.h" - -#ifndef ARG_AMALGAMATION -#include "argtable3_private.h" -#endif - #include -static void arg_end_resetfn(struct arg_end* parent) { +#include "argtable3.h" + + +static void arg_end_resetfn(struct arg_end *parent) { ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent)); parent->count = 0; } -static void arg_end_errorfn(void* parent, arg_dstr_t ds, int error, const char* argval, const char* progname) { +static void arg_end_errorfn( + void *parent, + FILE *fp, + int error, + const char *argval, + const char *progname) { /* suppress unreferenced formal parameter warning */ (void)parent; progname = progname ? progname : ""; argval = argval ? argval : ""; - arg_dstr_catf(ds, "%s: ", progname); + fprintf(fp, "%s: ", progname); switch (error) { case ARG_ELIMIT: - arg_dstr_cat(ds, "too many errors to display"); + fputs("too many errors to display", fp); break; case ARG_EMALLOC: - arg_dstr_cat(ds, "insufficient memory"); + fputs("insufficent memory", fp); break; case ARG_ENOMATCH: - arg_dstr_catf(ds, "unexpected argument \"%s\"", argval); + fprintf(fp, "unexpected argument \"%s\"", argval); break; case ARG_EMISSARG: - arg_dstr_catf(ds, "option \"%s\" requires an argument", argval); + fprintf(fp, "option \"%s\" requires an argument", argval); break; case ARG_ELONGOPT: - arg_dstr_catf(ds, "invalid option \"%s\"", argval); + fprintf(fp, "invalid option \"%s\"", argval); break; default: - arg_dstr_catf(ds, "invalid option \"-%c\"", error); + fprintf(fp, "invalid option \"-%c\"", error); break; } - arg_dstr_cat(ds, "\n"); + fputc('\n', fp); } -struct arg_end* arg_end(int maxcount) { + +struct arg_end *arg_end(int maxcount) { size_t nbytes; - struct arg_end* result; + struct arg_end *result; - nbytes = sizeof(struct arg_end) + maxcount * sizeof(int) /* storage for int error[maxcount] array*/ - + maxcount * sizeof(void*) /* storage for void* parent[maxcount] array */ - + maxcount * sizeof(char*); /* storage for char* argval[maxcount] array */ + nbytes = sizeof(struct arg_end) + + maxcount * sizeof(int) /* storage for int error[maxcount] array*/ + + maxcount * sizeof(void *) /* storage for void* parent[maxcount] array */ + + maxcount * sizeof(char *); /* storage for char* argval[maxcount] array */ - result = (struct arg_end*)xmalloc(nbytes); + result = (struct arg_end *)malloc(nbytes); + if (result) { + /* init the arg_hdr struct */ + result->hdr.flag = ARG_TERMINATOR; + result->hdr.shortopts = NULL; + result->hdr.longopts = NULL; + result->hdr.datatype = NULL; + result->hdr.glossary = NULL; + result->hdr.mincount = 1; + result->hdr.maxcount = maxcount; + result->hdr.parent = result; + result->hdr.resetfn = (arg_resetfn *)arg_end_resetfn; + result->hdr.scanfn = NULL; + result->hdr.checkfn = NULL; + result->hdr.errorfn = (arg_errorfn *)arg_end_errorfn; - /* init the arg_hdr struct */ - result->hdr.flag = ARG_TERMINATOR; - result->hdr.shortopts = NULL; - result->hdr.longopts = NULL; - result->hdr.datatype = NULL; - result->hdr.glossary = NULL; - result->hdr.mincount = 1; - result->hdr.maxcount = maxcount; - result->hdr.parent = result; - result->hdr.resetfn = (arg_resetfn*)arg_end_resetfn; - result->hdr.scanfn = NULL; - result->hdr.checkfn = NULL; - result->hdr.errorfn = (arg_errorfn*)arg_end_errorfn; + /* store error[maxcount] array immediately after struct arg_end */ + result->error = (int *)(result + 1); - /* store error[maxcount] array immediately after struct arg_end */ - result->error = (int*)(result + 1); + /* store parent[maxcount] array immediately after error[] array */ + result->parent = (void * *)(result->error + maxcount); - /* store parent[maxcount] array immediately after error[] array */ - result->parent = (void**)(result->error + maxcount); - - /* store argval[maxcount] array immediately after parent[] array */ - result->argval = (const char**)(result->parent + maxcount); + /* store argval[maxcount] array immediately after parent[] array */ + result->argval = (const char * *)(result->parent + maxcount); + } ARG_TRACE(("arg_end(%d) returns %p\n", maxcount, result)); return result; } -void arg_print_errors_ds(arg_dstr_t ds, struct arg_end* end, const char* progname) { + +void arg_print_errors(FILE *fp, struct arg_end *end, const char *progname) { int i; ARG_TRACE(("arg_errors()\n")); for (i = 0; i < end->count; i++) { - struct arg_hdr* errorparent = (struct arg_hdr*)(end->parent[i]); + struct arg_hdr *errorparent = (struct arg_hdr *)(end->parent[i]); if (errorparent->errorfn) - errorparent->errorfn(end->parent[i], ds, end->error[i], end->argval[i], progname); + errorparent->errorfn(end->parent[i], + fp, + end->error[i], + end->argval[i], + progname); } } - -void arg_print_errors(FILE* fp, struct arg_end* end, const char* progname) { - arg_dstr_t ds = arg_dstr_create(); - arg_print_errors_ds(ds, end, progname); - fputs(arg_dstr_cstr(ds), fp); - arg_dstr_destroy(ds); -} /******************************************************************************* - * arg_file: Implements the file command-line option - * * This file is part of the argtable3 library. * * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann @@ -2717,30 +1692,28 @@ void arg_print_errors(FILE* fp, struct arg_end* end, const char* progname) { * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ +#include +#include + #include "argtable3.h" -#ifndef ARG_AMALGAMATION -#include "argtable3_private.h" -#endif - -#include -#include - #ifdef WIN32 -#define FILESEPARATOR1 '\\' -#define FILESEPARATOR2 '/' +# define FILESEPARATOR1 '\\' +# define FILESEPARATOR2 '/' #else -#define FILESEPARATOR1 '/' -#define FILESEPARATOR2 '/' +# define FILESEPARATOR1 '/' +# define FILESEPARATOR2 '/' #endif -static void arg_file_resetfn(struct arg_file* parent) { + +static void arg_file_resetfn(struct arg_file *parent) { ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent)); parent->count = 0; } + /* Returns ptr to the base filename within *filename */ -static const char* arg_basename(const char* filename) { +static const char *arg_basename(const char *filename) { const char *result = NULL, *result1, *result2; /* Find the last occurrence of eother file separator character. */ @@ -2750,13 +1723,13 @@ static const char* arg_basename(const char* filename) { result2 = (filename ? strrchr(filename, FILESEPARATOR2) : NULL); if (result2) - result = result2 + 1; /* using FILESEPARATOR2 (the alternative file separator) */ + result = result2 + 1; /* using FILESEPARATOR2 (the alternative file separator) */ if (result1) - result = result1 + 1; /* using FILESEPARATOR1 (the preferred file separator) */ + result = result1 + 1; /* using FILESEPARATOR1 (the preferred file separator) */ if (!result) - result = filename; /* neither file separator was found so basename is the whole filename */ + result = filename; /* neither file separator was found so basename is the whole filename */ /* special cases of "." and ".." are not considered basenames */ if (result && (strcmp(".", result) == 0 || strcmp("..", result) == 0)) @@ -2765,10 +1738,11 @@ static const char* arg_basename(const char* filename) { return result; } + /* Returns ptr to the file extension within *basename */ -static const char* arg_extension(const char* basename) { +static const char *arg_extension(const char *basename) { /* find the last occurrence of '.' in basename */ - const char* result = (basename ? strrchr(basename, '.') : NULL); + const char *result = (basename ? strrchr(basename, '.') : NULL); /* if no '.' was found then return pointer to end of basename */ if (basename && !result) @@ -2785,22 +1759,23 @@ static const char* arg_extension(const char* basename) { return result; } -static int arg_file_scanfn(struct arg_file* parent, const char* argval) { + +static int arg_file_scanfn(struct arg_file *parent, const char *argval) { int errorcode = 0; if (parent->count == parent->hdr.maxcount) { /* maximum number of arguments exceeded */ - errorcode = ARG_ERR_MAXCOUNT; + errorcode = EMAXCOUNT; } else if (!argval) { /* a valid argument with no argument value was given. */ /* This happens when an optional argument value was invoked. */ /* leave parent arguiment value unaltered but still count the argument. */ parent->count++; } else { - parent->filename[parent->count] = argval; - parent->basename[parent->count] = arg_basename(argval); + parent->filename[parent->count] = argval; + parent->basename[parent->count] = arg_basename(argval); parent->extension[parent->count] = - arg_extension(parent->basename[parent->count]); /* only seek extensions within the basename (not the file path)*/ + arg_extension(parent->basename[parent->count]); /* only seek extensions within the basename (not the file path)*/ parent->count++; } @@ -2808,94 +1783,118 @@ static int arg_file_scanfn(struct arg_file* parent, const char* argval) { return errorcode; } -static int arg_file_checkfn(struct arg_file* parent) { - int errorcode = (parent->count < parent->hdr.mincount) ? ARG_ERR_MINCOUNT : 0; + +static int arg_file_checkfn(struct arg_file *parent) { + int errorcode = (parent->count < parent->hdr.mincount) ? EMINCOUNT : 0; ARG_TRACE(("%s:checkfn(%p) returns %d\n", __FILE__, parent, errorcode)); return errorcode; } -static void arg_file_errorfn(struct arg_file* parent, arg_dstr_t ds, int errorcode, const char* argval, const char* progname) { - const char* shortopts = parent->hdr.shortopts; - const char* longopts = parent->hdr.longopts; - const char* datatype = parent->hdr.datatype; + +static void arg_file_errorfn( + struct arg_file *parent, + FILE *fp, + int errorcode, + const char *argval, + const char *progname) { + const char *shortopts = parent->hdr.shortopts; + const char *longopts = parent->hdr.longopts; + const char *datatype = parent->hdr.datatype; /* make argval NULL safe */ argval = argval ? argval : ""; - arg_dstr_catf(ds, "%s: ", progname); + fprintf(fp, "%s: ", progname); switch (errorcode) { - case ARG_ERR_MINCOUNT: - arg_dstr_cat(ds, "missing option "); - arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); + case EMINCOUNT: + fputs("missing option ", fp); + arg_print_option(fp, shortopts, longopts, datatype, "\n"); break; - case ARG_ERR_MAXCOUNT: - arg_dstr_cat(ds, "excess option "); - arg_print_option_ds(ds, shortopts, longopts, argval, "\n"); + case EMAXCOUNT: + fputs("excess option ", fp); + arg_print_option(fp, shortopts, longopts, argval, "\n"); break; default: - arg_dstr_catf(ds, "unknown error at \"%s\"\n", argval); + fprintf(fp, "unknown error at \"%s\"\n", argval); } } -struct arg_file* arg_file0(const char* shortopts, const char* longopts, const char* datatype, const char* glossary) { + +struct arg_file *arg_file0( + const char *shortopts, + const char *longopts, + const char *datatype, + const char *glossary) { return arg_filen(shortopts, longopts, datatype, 0, 1, glossary); } -struct arg_file* arg_file1(const char* shortopts, const char* longopts, const char* datatype, const char* glossary) { + +struct arg_file *arg_file1( + const char *shortopts, + const char *longopts, + const char *datatype, + const char *glossary) { return arg_filen(shortopts, longopts, datatype, 1, 1, glossary); } -struct arg_file* arg_filen(const char* shortopts, const char* longopts, const char* datatype, int mincount, int maxcount, const char* glossary) { + +struct arg_file *arg_filen( + const char *shortopts, + const char *longopts, + const char *datatype, + int mincount, + int maxcount, + const char *glossary) { size_t nbytes; - struct arg_file* result; - int i; + struct arg_file *result; /* foolproof things by ensuring maxcount is not less than mincount */ maxcount = (maxcount < mincount) ? mincount : maxcount; - nbytes = sizeof(struct arg_file) /* storage for struct arg_file */ - + sizeof(char*) * maxcount /* storage for filename[maxcount] array */ - + sizeof(char*) * maxcount /* storage for basename[maxcount] array */ - + sizeof(char*) * maxcount; /* storage for extension[maxcount] array */ + nbytes = sizeof(struct arg_file) /* storage for struct arg_file */ + + sizeof(char *) * maxcount /* storage for filename[maxcount] array */ + + sizeof(char *) * maxcount /* storage for basename[maxcount] array */ + + sizeof(char *) * maxcount; /* storage for extension[maxcount] array */ - result = (struct arg_file*)xmalloc(nbytes); + result = (struct arg_file *)malloc(nbytes); + if (result) { + int i; - /* init the arg_hdr struct */ - result->hdr.flag = ARG_HASVALUE; - result->hdr.shortopts = shortopts; - result->hdr.longopts = longopts; - result->hdr.glossary = glossary; - result->hdr.datatype = datatype ? datatype : ""; - result->hdr.mincount = mincount; - result->hdr.maxcount = maxcount; - result->hdr.parent = result; - result->hdr.resetfn = (arg_resetfn*)arg_file_resetfn; - result->hdr.scanfn = (arg_scanfn*)arg_file_scanfn; - result->hdr.checkfn = (arg_checkfn*)arg_file_checkfn; - result->hdr.errorfn = (arg_errorfn*)arg_file_errorfn; + /* init the arg_hdr struct */ + result->hdr.flag = ARG_HASVALUE; + result->hdr.shortopts = shortopts; + result->hdr.longopts = longopts; + result->hdr.glossary = glossary; + result->hdr.datatype = datatype ? datatype : ""; + result->hdr.mincount = mincount; + result->hdr.maxcount = maxcount; + result->hdr.parent = result; + result->hdr.resetfn = (arg_resetfn *)arg_file_resetfn; + result->hdr.scanfn = (arg_scanfn *)arg_file_scanfn; + result->hdr.checkfn = (arg_checkfn *)arg_file_checkfn; + result->hdr.errorfn = (arg_errorfn *)arg_file_errorfn; - /* store the filename,basename,extension arrays immediately after the arg_file struct */ - result->filename = (const char**)(result + 1); - result->basename = result->filename + maxcount; - result->extension = result->basename + maxcount; - result->count = 0; + /* store the filename,basename,extension arrays immediately after the arg_file struct */ + result->filename = (const char * *)(result + 1); + result->basename = result->filename + maxcount; + result->extension = result->basename + maxcount; + result->count = 0; - /* foolproof the string pointers by initialising them with empty strings */ - for (i = 0; i < maxcount; i++) { - result->filename[i] = ""; - result->basename[i] = ""; - result->extension[i] = ""; + /* foolproof the string pointers by initialising them with empty strings */ + for (i = 0; i < maxcount; i++) { + result->filename[i] = ""; + result->basename[i] = ""; + result->extension[i] = ""; + } } ARG_TRACE(("arg_filen() returns %p\n", result)); return result; } /******************************************************************************* - * arg_int: Implements the int command-line option - * * This file is part of the argtable3 library. * * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann @@ -2925,21 +1924,19 @@ struct arg_file* arg_filen(const char* shortopts, const char* longopts, const ch * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ +#include +#include +#include + #include "argtable3.h" -#ifndef ARG_AMALGAMATION -#include "argtable3_private.h" -#endif -#include -#include -#include - -static void arg_int_resetfn(struct arg_int* parent) { +static void arg_int_resetfn(struct arg_int *parent) { ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent)); parent->count = 0; } + /* strtol0x() is like strtol() except that the numeric string is */ /* expected to be prefixed by "0X" where X is a user supplied char. */ /* The string may optionally be prefixed by white space and + or - */ @@ -2950,13 +1947,16 @@ static void arg_int_resetfn(struct arg_int* parent) { /* eg: to parse oct str="+0o12324", specify X='O' and base=8. */ /* eg: to parse bin str="-0B01010", specify X='B' and base=2. */ /* Failure of conversion is indicated by result where *endptr==str. */ -static long int strtol0X(const char* str, const char** endptr, char X, int base) { - long int val; /* stores result */ - int s = 1; /* sign is +1 or -1 */ - const char* ptr = str; /* ptr to current position in str */ +static long int strtol0X(const char *str, + const char * *endptr, + char X, + int base) { + long int val; /* stores result */ + int s = 1; /* sign is +1 or -1 */ + const char *ptr = str; /* ptr to current position in str */ /* skip leading whitespace */ - while (isspace(*ptr)) + while (ISSPACE(*ptr)) ptr++; /* printf("1) %s\n",ptr); */ @@ -2991,7 +1991,7 @@ static long int strtol0X(const char* str, const char** endptr, char X, int base) /* printf("4) %s\n",ptr); */ /* attempt conversion on remainder of string using strtol() */ - val = strtol(ptr, (char**)endptr, base); + val = strtol(ptr, (char * *)endptr, base); if (*endptr == ptr) { /* conversion failed */ *endptr = str; @@ -3002,9 +2002,10 @@ static long int strtol0X(const char* str, const char** endptr, char X, int base) return s * val; } + /* Returns 1 if str matches suffix (case insensitive). */ /* Str may contain trailing whitespace, but nothing else. */ -static int detectsuffix(const char* str, const char* suffix) { +static int detectsuffix(const char *str, const char *suffix) { /* scan pairwise through strings until mismatch detected */ while (toupper(*str) == toupper(*suffix)) { /* printf("'%c' '%c'\n", *str, *suffix); */ @@ -3021,22 +2022,23 @@ static int detectsuffix(const char* str, const char* suffix) { /* return 0 (fail) if the matching did not consume the entire suffix */ if (*suffix != 0) - return 0; /* failed to consume entire suffix */ + return 0; /* failed to consume entire suffix */ /* skip any remaining whitespace in str */ - while (isspace(*str)) + while (ISSPACE(*str)) str++; /* return 1 (success) if we have reached end of str else return 0 (fail) */ return (*str == '\0') ? 1 : 0; } -static int arg_int_scanfn(struct arg_int* parent, const char* argval) { + +static int arg_int_scanfn(struct arg_int *parent, const char *argval) { int errorcode = 0; if (parent->count == parent->hdr.maxcount) { /* maximum number of arguments exceeded */ - errorcode = ARG_ERR_MAXCOUNT; + errorcode = EMAXCOUNT; } else if (!argval) { /* a valid argument with no argument value was given. */ /* This happens when an optional argument value was invoked. */ @@ -3044,7 +2046,7 @@ static int arg_int_scanfn(struct arg_int* parent, const char* argval) { parent->count++; } else { long int val; - const char* end; + const char *end; /* attempt to extract hex integer (eg: +0x123) from argval into val conversion */ val = strtol0X(argval, &end, 'X', 16); @@ -3056,10 +2058,10 @@ static int arg_int_scanfn(struct arg_int* parent, const char* argval) { val = strtol0X(argval, &end, 'B', 2); if (end == argval) { /* binary failed, attempt decimal conversion with no prefix (eg 1234) */ - val = strtol(argval, (char**)&end, 10); + val = strtol(argval, (char * *)&end, 10); if (end == argval) { /* all supported number formats failed */ - return ARG_ERR_BADINT; + return EBADINT; } } } @@ -3068,90 +2070,131 @@ static int arg_int_scanfn(struct arg_int* parent, const char* argval) { /* Safety check for integer overflow. WARNING: this check */ /* achieves nothing on machines where size(int)==size(long). */ if (val > INT_MAX || val < INT_MIN) - errorcode = ARG_ERR_OVERFLOW; +#ifdef __STDC_WANT_SECURE_LIB__ + errorcode = EOVERFLOW_; +#else + errorcode = EOVERFLOW; +#endif /* Detect any suffixes (KB,MB,GB) and multiply argument value appropriately. */ /* We need to be mindful of integer overflows when using such big numbers. */ - if (detectsuffix(end, "KB")) /* kilobytes */ - { + if (detectsuffix(end, "KB")) { /* kilobytes */ if (val > (INT_MAX / 1024) || val < (INT_MIN / 1024)) - errorcode = ARG_ERR_OVERFLOW; /* Overflow would occur if we proceed */ +#ifdef __STDC_WANT_SECURE_LIB__ + errorcode = EOVERFLOW_; /* Overflow would occur if we proceed */ +#else + errorcode = EOVERFLOW; /* Overflow would occur if we proceed */ +#endif else - val *= 1024; /* 1KB = 1024 */ - } else if (detectsuffix(end, "MB")) /* megabytes */ - { + val *= 1024; /* 1KB = 1024 */ + } else if (detectsuffix(end, "MB")) { /* megabytes */ if (val > (INT_MAX / 1048576) || val < (INT_MIN / 1048576)) - errorcode = ARG_ERR_OVERFLOW; /* Overflow would occur if we proceed */ +#ifdef __STDC_WANT_SECURE_LIB__ + errorcode = EOVERFLOW_; /* Overflow would occur if we proceed */ +#else + errorcode = EOVERFLOW; /* Overflow would occur if we proceed */ +#endif else - val *= 1048576; /* 1MB = 1024*1024 */ - } else if (detectsuffix(end, "GB")) /* gigabytes */ - { + val *= 1048576; /* 1MB = 1024*1024 */ + } else if (detectsuffix(end, "GB")) { /* gigabytes */ if (val > (INT_MAX / 1073741824) || val < (INT_MIN / 1073741824)) - errorcode = ARG_ERR_OVERFLOW; /* Overflow would occur if we proceed */ +#ifdef __STDC_WANT_SECURE_LIB__ + errorcode = EOVERFLOW_; /* Overflow would occur if we proceed */ +#else + errorcode = EOVERFLOW; /* Overflow would occur if we proceed */ +#endif else - val *= 1073741824; /* 1GB = 1024*1024*1024 */ + val *= 1073741824; /* 1GB = 1024*1024*1024 */ } else if (!detectsuffix(end, "")) - errorcode = ARG_ERR_BADINT; /* invalid suffix detected */ + errorcode = EBADINT; /* invalid suffix detected */ /* if success then store result in parent->ival[] array */ if (errorcode == 0) - parent->ival[parent->count++] = (int)val; + parent->ival[parent->count++] = val; } /* printf("%s:scanfn(%p,%p) returns %d\n",__FILE__,parent,argval,errorcode); */ return errorcode; } -static int arg_int_checkfn(struct arg_int* parent) { - int errorcode = (parent->count < parent->hdr.mincount) ? ARG_ERR_MINCOUNT : 0; + +static int arg_int_checkfn(struct arg_int *parent) { + int errorcode = (parent->count < parent->hdr.mincount) ? EMINCOUNT : 0; /*printf("%s:checkfn(%p) returns %d\n",__FILE__,parent,errorcode);*/ return errorcode; } -static void arg_int_errorfn(struct arg_int* parent, arg_dstr_t ds, int errorcode, const char* argval, const char* progname) { - const char* shortopts = parent->hdr.shortopts; - const char* longopts = parent->hdr.longopts; - const char* datatype = parent->hdr.datatype; + +static void arg_int_errorfn( + struct arg_int *parent, + FILE *fp, + int errorcode, + const char *argval, + const char *progname) { + const char *shortopts = parent->hdr.shortopts; + const char *longopts = parent->hdr.longopts; + const char *datatype = parent->hdr.datatype; /* make argval NULL safe */ argval = argval ? argval : ""; - arg_dstr_catf(ds, "%s: ", progname); + fprintf(fp, "%s: ", progname); switch (errorcode) { - case ARG_ERR_MINCOUNT: - arg_dstr_cat(ds, "missing option "); - arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); + case EMINCOUNT: + fputs("missing option ", fp); + arg_print_option(fp, shortopts, longopts, datatype, "\n"); break; - case ARG_ERR_MAXCOUNT: - arg_dstr_cat(ds, "excess option "); - arg_print_option_ds(ds, shortopts, longopts, argval, "\n"); + case EMAXCOUNT: + fputs("excess option ", fp); + arg_print_option(fp, shortopts, longopts, argval, "\n"); break; - case ARG_ERR_BADINT: - arg_dstr_catf(ds, "invalid argument \"%s\" to option ", argval); - arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); + case EBADINT: + fprintf(fp, "invalid argument \"%s\" to option ", argval); + arg_print_option(fp, shortopts, longopts, datatype, "\n"); break; - case ARG_ERR_OVERFLOW: - arg_dstr_cat(ds, "integer overflow at option "); - arg_print_option_ds(ds, shortopts, longopts, datatype, " "); - arg_dstr_catf(ds, "(%s is too large)\n", argval); +#ifdef __STDC_WANT_SECURE_LIB__ + case EOVERFLOW_: +#else + case EOVERFLOW: +#endif + fputs("integer overflow at option ", fp); + arg_print_option(fp, shortopts, longopts, datatype, " "); + fprintf(fp, "(%s is too large)\n", argval); break; } } -struct arg_int* arg_int0(const char* shortopts, const char* longopts, const char* datatype, const char* glossary) { + +struct arg_int *arg_int0( + const char *shortopts, + const char *longopts, + const char *datatype, + const char *glossary) { return arg_intn(shortopts, longopts, datatype, 0, 1, glossary); } -struct arg_int* arg_int1(const char* shortopts, const char* longopts, const char* datatype, const char* glossary) { + +struct arg_int *arg_int1( + const char *shortopts, + const char *longopts, + const char *datatype, + const char *glossary) { return arg_intn(shortopts, longopts, datatype, 1, 1, glossary); } -struct arg_int* arg_intn(const char* shortopts, const char* longopts, const char* datatype, int mincount, int maxcount, const char* glossary) { + +struct arg_int *arg_intn( + const char *shortopts, + const char *longopts, + const char *datatype, + int mincount, + int maxcount, + const char *glossary) { size_t nbytes; - struct arg_int* result; + struct arg_int *result; /* foolproof things by ensuring maxcount is not less than mincount */ maxcount = (maxcount < mincount) ? mincount : maxcount; @@ -3159,32 +2202,31 @@ struct arg_int* arg_intn(const char* shortopts, const char* longopts, const char nbytes = sizeof(struct arg_int) /* storage for struct arg_int */ + maxcount * sizeof(int); /* storage for ival[maxcount] array */ - result = (struct arg_int*)xmalloc(nbytes); + result = (struct arg_int *)malloc(nbytes); + if (result) { + /* init the arg_hdr struct */ + result->hdr.flag = ARG_HASVALUE; + result->hdr.shortopts = shortopts; + result->hdr.longopts = longopts; + result->hdr.datatype = datatype ? datatype : ""; + result->hdr.glossary = glossary; + result->hdr.mincount = mincount; + result->hdr.maxcount = maxcount; + result->hdr.parent = result; + result->hdr.resetfn = (arg_resetfn *)arg_int_resetfn; + result->hdr.scanfn = (arg_scanfn *)arg_int_scanfn; + result->hdr.checkfn = (arg_checkfn *)arg_int_checkfn; + result->hdr.errorfn = (arg_errorfn *)arg_int_errorfn; - /* init the arg_hdr struct */ - result->hdr.flag = ARG_HASVALUE; - result->hdr.shortopts = shortopts; - result->hdr.longopts = longopts; - result->hdr.datatype = datatype ? datatype : ""; - result->hdr.glossary = glossary; - result->hdr.mincount = mincount; - result->hdr.maxcount = maxcount; - result->hdr.parent = result; - result->hdr.resetfn = (arg_resetfn*)arg_int_resetfn; - result->hdr.scanfn = (arg_scanfn*)arg_int_scanfn; - result->hdr.checkfn = (arg_checkfn*)arg_int_checkfn; - result->hdr.errorfn = (arg_errorfn*)arg_int_errorfn; - - /* store the ival[maxcount] array immediately after the arg_int struct */ - result->ival = (int*)(result + 1); - result->count = 0; + /* store the ival[maxcount] array immediately after the arg_int struct */ + result->ival = (int *)(result + 1); + result->count = 0; + } ARG_TRACE(("arg_intn() returns %p\n", result)); return result; } /******************************************************************************* - * arg_lit: Implements the literature command-line option - * * This file is part of the argtable3 library. * * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann @@ -3214,96 +2256,116 @@ struct arg_int* arg_intn(const char* shortopts, const char* longopts, const char * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ -#include "argtable3.h" - -#ifndef ARG_AMALGAMATION -#include "argtable3_private.h" -#endif - #include -static void arg_lit_resetfn(struct arg_lit* parent) { +#include "argtable3.h" + + +static void arg_lit_resetfn(struct arg_lit *parent) { ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent)); parent->count = 0; } -static int arg_lit_scanfn(struct arg_lit* parent, const char* argval) { + +static int arg_lit_scanfn(struct arg_lit *parent, const char *argval) { int errorcode = 0; if (parent->count < parent->hdr.maxcount) parent->count++; else - errorcode = ARG_ERR_MAXCOUNT; + errorcode = EMAXCOUNT; - ARG_TRACE(("%s:scanfn(%p,%s) returns %d\n", __FILE__, parent, argval, errorcode)); + ARG_TRACE(("%s:scanfn(%p,%s) returns %d\n", __FILE__, parent, argval, + errorcode)); return errorcode; } -static int arg_lit_checkfn(struct arg_lit* parent) { - int errorcode = (parent->count < parent->hdr.mincount) ? ARG_ERR_MINCOUNT : 0; + +static int arg_lit_checkfn(struct arg_lit *parent) { + int errorcode = (parent->count < parent->hdr.mincount) ? EMINCOUNT : 0; ARG_TRACE(("%s:checkfn(%p) returns %d\n", __FILE__, parent, errorcode)); return errorcode; } -static void arg_lit_errorfn(struct arg_lit* parent, arg_dstr_t ds, int errorcode, const char* argval, const char* progname) { - const char* shortopts = parent->hdr.shortopts; - const char* longopts = parent->hdr.longopts; - const char* datatype = parent->hdr.datatype; + +static void arg_lit_errorfn( + struct arg_lit *parent, + FILE *fp, + int errorcode, + const char *argval, + const char *progname) { + const char *shortopts = parent->hdr.shortopts; + const char *longopts = parent->hdr.longopts; + const char *datatype = parent->hdr.datatype; switch (errorcode) { - case ARG_ERR_MINCOUNT: - arg_dstr_catf(ds, "%s: missing option ", progname); - arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); - arg_dstr_cat(ds, "\n"); + case EMINCOUNT: + fprintf(fp, "%s: missing option ", progname); + arg_print_option(fp, shortopts, longopts, datatype, "\n"); + fprintf(fp, "\n"); break; - case ARG_ERR_MAXCOUNT: - arg_dstr_catf(ds, "%s: extraneous option ", progname); - arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); + case EMAXCOUNT: + fprintf(fp, "%s: extraneous option ", progname); + arg_print_option(fp, shortopts, longopts, datatype, "\n"); break; } - ARG_TRACE(("%s:errorfn(%p, %p, %d, %s, %s)\n", __FILE__, parent, ds, errorcode, argval, progname)); + ARG_TRACE(("%s:errorfn(%p, %p, %d, %s, %s)\n", __FILE__, parent, fp, + errorcode, argval, progname)); } -struct arg_lit* arg_lit0(const char* shortopts, const char* longopts, const char* glossary) { + +struct arg_lit *arg_lit0( + const char *shortopts, + const char *longopts, + const char *glossary) { return arg_litn(shortopts, longopts, 0, 1, glossary); } -struct arg_lit* arg_lit1(const char* shortopts, const char* longopts, const char* glossary) { + +struct arg_lit *arg_lit1( + const char *shortopts, + const char *longopts, + const char *glossary) { return arg_litn(shortopts, longopts, 1, 1, glossary); } -struct arg_lit* arg_litn(const char* shortopts, const char* longopts, int mincount, int maxcount, const char* glossary) { - struct arg_lit* result; + +struct arg_lit *arg_litn( + const char *shortopts, + const char *longopts, + int mincount, + int maxcount, + const char *glossary) { + struct arg_lit *result; /* foolproof things by ensuring maxcount is not less than mincount */ maxcount = (maxcount < mincount) ? mincount : maxcount; - result = (struct arg_lit*)xmalloc(sizeof(struct arg_lit)); + result = (struct arg_lit *)malloc(sizeof(struct arg_lit)); + if (result) { + /* init the arg_hdr struct */ + result->hdr.flag = 0; + result->hdr.shortopts = shortopts; + result->hdr.longopts = longopts; + result->hdr.datatype = NULL; + result->hdr.glossary = glossary; + result->hdr.mincount = mincount; + result->hdr.maxcount = maxcount; + result->hdr.parent = result; + result->hdr.resetfn = (arg_resetfn *)arg_lit_resetfn; + result->hdr.scanfn = (arg_scanfn *)arg_lit_scanfn; + result->hdr.checkfn = (arg_checkfn *)arg_lit_checkfn; + result->hdr.errorfn = (arg_errorfn *)arg_lit_errorfn; - /* init the arg_hdr struct */ - result->hdr.flag = 0; - result->hdr.shortopts = shortopts; - result->hdr.longopts = longopts; - result->hdr.datatype = NULL; - result->hdr.glossary = glossary; - result->hdr.mincount = mincount; - result->hdr.maxcount = maxcount; - result->hdr.parent = result; - result->hdr.resetfn = (arg_resetfn*)arg_lit_resetfn; - result->hdr.scanfn = (arg_scanfn*)arg_lit_scanfn; - result->hdr.checkfn = (arg_checkfn*)arg_lit_checkfn; - result->hdr.errorfn = (arg_errorfn*)arg_lit_errorfn; - - /* init local variables */ - result->count = 0; + /* init local variables */ + result->count = 0; + } ARG_TRACE(("arg_litn() returns %p\n", result)); return result; } /******************************************************************************* - * arg_rem: Implements the rem command-line option - * * This file is part of the argtable3 library. * * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann @@ -3333,36 +2395,32 @@ struct arg_lit* arg_litn(const char* shortopts, const char* longopts, int mincou * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ -#include "argtable3.h" - -#ifndef ARG_AMALGAMATION -#include "argtable3_private.h" -#endif - #include -struct arg_rem* arg_rem(const char* datatype, const char* glossary) { - struct arg_rem* result = (struct arg_rem*)xmalloc(sizeof(struct arg_rem)); +#include "argtable3.h" - result->hdr.flag = 0; - result->hdr.shortopts = NULL; - result->hdr.longopts = NULL; - result->hdr.datatype = datatype; - result->hdr.glossary = glossary; - result->hdr.mincount = 1; - result->hdr.maxcount = 1; - result->hdr.parent = result; - result->hdr.resetfn = NULL; - result->hdr.scanfn = NULL; - result->hdr.checkfn = NULL; - result->hdr.errorfn = NULL; +struct arg_rem *arg_rem(const char *datatype, const char *glossary) { + struct arg_rem *result = (struct arg_rem *)malloc(sizeof(struct arg_rem)); + if (result) { + result->hdr.flag = 0; + result->hdr.shortopts = NULL; + result->hdr.longopts = NULL; + result->hdr.datatype = datatype; + result->hdr.glossary = glossary; + result->hdr.mincount = 1; + result->hdr.maxcount = 1; + result->hdr.parent = result; + result->hdr.resetfn = NULL; + result->hdr.scanfn = NULL; + result->hdr.checkfn = NULL; + result->hdr.errorfn = NULL; + } ARG_TRACE(("arg_rem() returns %p\n", result)); return result; } + /******************************************************************************* - * arg_rex: Implements the regex command-line option - * * This file is part of the argtable3 library. * * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann @@ -3392,54 +2450,58 @@ struct arg_rem* arg_rem(const char* datatype, const char* glossary) { * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ -#include "argtable3.h" - -#ifndef ARG_AMALGAMATION -#include "argtable3_private.h" -#endif - #include #include +#include "argtable3.h" + + #ifndef _TREX_H_ #define _TREX_H_ +/*************************************************************** + T-Rex a tiny regular expression library -/* - * This module uses the T-Rex regular expression library to implement the regex - * logic. Here is the copyright notice of the library: - * - * Copyright (C) 2003-2006 Alberto Demichelis - * - * This software is provided 'as-is', without any express - * or implied warranty. In no event will the authors be held - * liable for any damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for - * any purpose, including commercial applications, and to alter - * it and redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; - * you must not claim that you wrote the original software. - * If you use this software in a product, an acknowledgment - * in the product documentation would be appreciated but - * is not required. - * - * 2. Altered source versions must be plainly marked as such, - * and must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any - * source distribution. - */ + Copyright (C) 2003-2006 Alberto Demichelis + + This software is provided 'as-is', without any express + or implied warranty. In no event will the authors be held + liable for any damages arising from the use of this software. + + Permission is granted to anyone to use this software for + any purpose, including commercial applications, and to alter + it and redistribute it freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; + you must not claim that you wrote the original software. + If you use this software in a product, an acknowledgment + in the product documentation would be appreciated but + is not required. + + 2. Altered source versions must be plainly marked as such, + and must not be misrepresented as being the original software. + + 3. This notice may not be removed or altered from any + source distribution. + +****************************************************************/ #ifdef __cplusplus extern "C" { #endif +#ifdef _UNICODE +#define TRexChar unsigned short +#define MAX_CHAR 0xFFFF +#define _TREXC(c) L##c +#define trex_strlen wcslen +#define trex_printf wprintf +#else #define TRexChar char #define MAX_CHAR 0xFF #define _TREXC(c) (c) #define trex_strlen strlen #define trex_printf printf +#endif #ifndef TREX_API #define TREX_API extern @@ -3454,18 +2516,17 @@ typedef unsigned int TRexBool; typedef struct TRex TRex; typedef struct { - const TRexChar* begin; + const TRexChar *begin; int len; } TRexMatch; -TREX_API TRex* trex_compile(const TRexChar* pattern, const TRexChar** error, int flags); -TREX_API void trex_free(TRex* exp); -TREX_API TRexBool trex_match(TRex* exp, const TRexChar* text); -TREX_API TRexBool trex_search(TRex* exp, const TRexChar* text, const TRexChar** out_begin, const TRexChar** out_end); -TREX_API TRexBool -trex_searchrange(TRex* exp, const TRexChar* text_begin, const TRexChar* text_end, const TRexChar** out_begin, const TRexChar** out_end); -TREX_API int trex_getsubexpcount(TRex* exp); -TREX_API TRexBool trex_getsubexp(TRex* exp, int n, TRexMatch* subexp); +TREX_API TRex *trex_compile(const TRexChar *pattern, const TRexChar **error, int flags); +TREX_API void trex_free(TRex *exp); +TREX_API TRexBool trex_match(TRex *exp, const TRexChar *text); +TREX_API TRexBool trex_search(TRex *exp, const TRexChar *text, const TRexChar **out_begin, const TRexChar **out_end); +TREX_API TRexBool trex_searchrange(TRex *exp, const TRexChar *text_begin, const TRexChar *text_end, const TRexChar **out_begin, const TRexChar **out_end); +TREX_API int trex_getsubexpcount(TRex *exp); +TREX_API TRexBool trex_getsubexp(TRex *exp, int n, TRexMatch *subexp); #ifdef __cplusplus } @@ -3473,32 +2534,35 @@ TREX_API TRexBool trex_getsubexp(TRex* exp, int n, TRexMatch* subexp); #endif + + struct privhdr { - const char* pattern; + const char *pattern; int flags; }; -static void arg_rex_resetfn(struct arg_rex* parent) { + +static void arg_rex_resetfn(struct arg_rex *parent) { ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent)); parent->count = 0; } -static int arg_rex_scanfn(struct arg_rex* parent, const char* argval) { +static int arg_rex_scanfn(struct arg_rex *parent, const char *argval) { int errorcode = 0; - const TRexChar* error = NULL; - TRex* rex = NULL; - TRexBool is_match = TRex_False; + const TRexChar *error = NULL; + TRex *rex = NULL; + TRexBool is_match; if (parent->count == parent->hdr.maxcount) { /* maximum number of arguments exceeded */ - errorcode = ARG_ERR_MAXCOUNT; + errorcode = EMAXCOUNT; } else if (!argval) { /* a valid argument with no argument value was given. */ /* This happens when an optional argument value was invoked. */ /* leave parent argument value unaltered but still count the argument. */ parent->count++; } else { - struct privhdr* priv = (struct privhdr*)parent->hdr.priv; + struct privhdr *priv = (struct privhdr *)parent->hdr.priv; /* test the current argument value for a match with the regular expression */ /* if a match is detected, record the argument value in the arg_rex struct */ @@ -3506,7 +2570,7 @@ static int arg_rex_scanfn(struct arg_rex* parent, const char* argval) { rex = trex_compile(priv->pattern, &error, priv->flags); is_match = trex_match(rex, argval); if (!is_match) - errorcode = ARG_ERR_REGNOMATCH; + errorcode = EREGNOMATCH; else parent->sval[parent->count++] = argval; @@ -3517,79 +2581,107 @@ static int arg_rex_scanfn(struct arg_rex* parent, const char* argval) { return errorcode; } -static int arg_rex_checkfn(struct arg_rex* parent) { - int errorcode = (parent->count < parent->hdr.mincount) ? ARG_ERR_MINCOUNT : 0; -#if 0 - struct privhdr *priv = (struct privhdr*)parent->hdr.priv; +static int arg_rex_checkfn(struct arg_rex *parent) { + int errorcode = (parent->count < parent->hdr.mincount) ? EMINCOUNT : 0; + //struct privhdr *priv = (struct privhdr*)parent->hdr.priv; /* free the regex "program" we constructed in resetfn */ - regfree(&(priv->regex)); + //regfree(&(priv->regex)); /*printf("%s:checkfn(%p) returns %d\n",__FILE__,parent,errorcode);*/ -#endif return errorcode; } -static void arg_rex_errorfn(struct arg_rex* parent, arg_dstr_t ds, int errorcode, const char* argval, const char* progname) { - const char* shortopts = parent->hdr.shortopts; - const char* longopts = parent->hdr.longopts; - const char* datatype = parent->hdr.datatype; +static void arg_rex_errorfn(struct arg_rex *parent, + FILE *fp, + int errorcode, + const char *argval, + const char *progname) { + const char *shortopts = parent->hdr.shortopts; + const char *longopts = parent->hdr.longopts; + const char *datatype = parent->hdr.datatype; /* make argval NULL safe */ argval = argval ? argval : ""; - arg_dstr_catf(ds, "%s: ", progname); + fprintf(fp, "%s: ", progname); switch (errorcode) { - case ARG_ERR_MINCOUNT: - arg_dstr_cat(ds, "missing option "); - arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); + case EMINCOUNT: + fputs("missing option ", fp); + arg_print_option(fp, shortopts, longopts, datatype, "\n"); break; - case ARG_ERR_MAXCOUNT: - arg_dstr_cat(ds, "excess option "); - arg_print_option_ds(ds, shortopts, longopts, argval, "\n"); + case EMAXCOUNT: + fputs("excess option ", fp); + arg_print_option(fp, shortopts, longopts, argval, "\n"); break; - case ARG_ERR_REGNOMATCH: - arg_dstr_cat(ds, "illegal value "); - arg_print_option_ds(ds, shortopts, longopts, argval, "\n"); + case EREGNOMATCH: + fputs("illegal value ", fp); + arg_print_option(fp, shortopts, longopts, argval, "\n"); break; default: { - #if 0 - char errbuff[256]; - regerror(errorcode, NULL, errbuff, sizeof(errbuff)); - printf("%s\n", errbuff); - #endif - } break; + //char errbuff[256]; + //regerror(errorcode, NULL, errbuff, sizeof(errbuff)); + //printf("%s\n", errbuff); + } + break; } } -struct arg_rex* arg_rex0(const char* shortopts, const char* longopts, const char* pattern, const char* datatype, int flags, const char* glossary) { - return arg_rexn(shortopts, longopts, pattern, datatype, 0, 1, flags, glossary); + +struct arg_rex *arg_rex0(const char *shortopts, + const char *longopts, + const char *pattern, + const char *datatype, + int flags, + const char *glossary) { + return arg_rexn(shortopts, + longopts, + pattern, + datatype, + 0, + 1, + flags, + glossary); } -struct arg_rex* arg_rex1(const char* shortopts, const char* longopts, const char* pattern, const char* datatype, int flags, const char* glossary) { - return arg_rexn(shortopts, longopts, pattern, datatype, 1, 1, flags, glossary); +struct arg_rex *arg_rex1(const char *shortopts, + const char *longopts, + const char *pattern, + const char *datatype, + int flags, + const char *glossary) { + return arg_rexn(shortopts, + longopts, + pattern, + datatype, + 1, + 1, + flags, + glossary); } -struct arg_rex* arg_rexn(const char* shortopts, - const char* longopts, - const char* pattern, - const char* datatype, + +struct arg_rex *arg_rexn(const char *shortopts, + const char *longopts, + const char *pattern, + const char *datatype, int mincount, int maxcount, int flags, - const char* glossary) { + const char *glossary) { size_t nbytes; - struct arg_rex* result; - struct privhdr* priv; + struct arg_rex *result; + struct privhdr *priv; int i; - const TRexChar* error = NULL; - TRex* rex = NULL; + const TRexChar *error = NULL; + TRex *rex = NULL; if (!pattern) { - printf("argtable: ERROR - illegal regular expression pattern \"(NULL)\"\n"); + printf( + "argtable: ERROR - illegal regular expression pattern \"(NULL)\"\n"); printf("argtable: Bad argument table.\n"); return NULL; } @@ -3597,33 +2689,36 @@ struct arg_rex* arg_rexn(const char* shortopts, /* foolproof things by ensuring maxcount is not less than mincount */ maxcount = (maxcount < mincount) ? mincount : maxcount; - nbytes = sizeof(struct arg_rex) /* storage for struct arg_rex */ - + sizeof(struct privhdr) /* storage for private arg_rex data */ - + maxcount * sizeof(char*); /* storage for sval[maxcount] array */ + nbytes = sizeof(struct arg_rex) /* storage for struct arg_rex */ + + sizeof(struct privhdr) /* storage for private arg_rex data */ + + maxcount * sizeof(char *); /* storage for sval[maxcount] array */ + + result = (struct arg_rex *)malloc(nbytes); + if (result == NULL) + return result; /* init the arg_hdr struct */ - result = (struct arg_rex*)xmalloc(nbytes); - result->hdr.flag = ARG_HASVALUE; + result->hdr.flag = ARG_HASVALUE; result->hdr.shortopts = shortopts; - result->hdr.longopts = longopts; - result->hdr.datatype = datatype ? datatype : pattern; - result->hdr.glossary = glossary; - result->hdr.mincount = mincount; - result->hdr.maxcount = maxcount; - result->hdr.parent = result; - result->hdr.resetfn = (arg_resetfn*)arg_rex_resetfn; - result->hdr.scanfn = (arg_scanfn*)arg_rex_scanfn; - result->hdr.checkfn = (arg_checkfn*)arg_rex_checkfn; - result->hdr.errorfn = (arg_errorfn*)arg_rex_errorfn; + result->hdr.longopts = longopts; + result->hdr.datatype = datatype ? datatype : pattern; + result->hdr.glossary = glossary; + result->hdr.mincount = mincount; + result->hdr.maxcount = maxcount; + result->hdr.parent = result; + result->hdr.resetfn = (arg_resetfn *)arg_rex_resetfn; + result->hdr.scanfn = (arg_scanfn *)arg_rex_scanfn; + result->hdr.checkfn = (arg_checkfn *)arg_rex_checkfn; + result->hdr.errorfn = (arg_errorfn *)arg_rex_errorfn; /* store the arg_rex_priv struct immediately after the arg_rex struct */ - result->hdr.priv = result + 1; - priv = (struct privhdr*)(result->hdr.priv); + result->hdr.priv = result + 1; + priv = (struct privhdr *)(result->hdr.priv); priv->pattern = pattern; priv->flags = flags; /* store the sval[maxcount] array immediately after the arg_rex_priv struct */ - result->sval = (const char**)(priv + 1); + result->sval = (const char * *)(priv + 1); result->count = 0; /* foolproof the string pointers by initializing them to reference empty strings */ @@ -3648,11 +2743,13 @@ struct arg_rex* arg_rexn(const char* shortopts, return result; } + + /* see copyright notice in trex.h */ +#include +#include #include #include -#include -#include #ifdef _UINCODE #define scisprint iswprint @@ -3669,24 +2766,27 @@ struct arg_rex* arg_rexn(const char* shortopts, #ifdef _DEBUG #include -static const TRexChar* g_nnames[] = {_SC("NONE"), _SC("OP_GREEDY"), _SC("OP_OR"), _SC("OP_EXPR"), _SC("OP_NOCAPEXPR"), - _SC("OP_DOT"), _SC("OP_CLASS"), _SC("OP_CCLASS"), _SC("OP_NCLASS"), _SC("OP_RANGE"), - _SC("OP_CHAR"), _SC("OP_EOL"), _SC("OP_BOL"), _SC("OP_WB")}; +static const TRexChar *g_nnames[] = { + _SC("NONE"), _SC("OP_GREEDY"), _SC("OP_OR"), + _SC("OP_EXPR"), _SC("OP_NOCAPEXPR"), _SC("OP_DOT"), _SC("OP_CLASS"), + _SC("OP_CCLASS"), _SC("OP_NCLASS"), _SC("OP_RANGE"), _SC("OP_CHAR"), + _SC("OP_EOL"), _SC("OP_BOL"), _SC("OP_WB") +}; #endif -#define OP_GREEDY (MAX_CHAR + 1) /* * + ? {n} */ -#define OP_OR (MAX_CHAR + 2) -#define OP_EXPR (MAX_CHAR + 3) /* parentesis () */ -#define OP_NOCAPEXPR (MAX_CHAR + 4) /* parentesis (?:) */ -#define OP_DOT (MAX_CHAR + 5) -#define OP_CLASS (MAX_CHAR + 6) -#define OP_CCLASS (MAX_CHAR + 7) -#define OP_NCLASS (MAX_CHAR + 8) /* negates class the [^ */ -#define OP_RANGE (MAX_CHAR + 9) -#define OP_CHAR (MAX_CHAR + 10) -#define OP_EOL (MAX_CHAR + 11) -#define OP_BOL (MAX_CHAR + 12) -#define OP_WB (MAX_CHAR + 13) +#define OP_GREEDY (MAX_CHAR+1) // * + ? {n} +#define OP_OR (MAX_CHAR+2) +#define OP_EXPR (MAX_CHAR+3) //parentesis () +#define OP_NOCAPEXPR (MAX_CHAR+4) //parentesis (?:) +#define OP_DOT (MAX_CHAR+5) +#define OP_CLASS (MAX_CHAR+6) +#define OP_CCLASS (MAX_CHAR+7) +#define OP_NCLASS (MAX_CHAR+8) //negates class the [^ +#define OP_RANGE (MAX_CHAR+9) +#define OP_CHAR (MAX_CHAR+10) +#define OP_EOL (MAX_CHAR+11) +#define OP_BOL (MAX_CHAR+12) +#define OP_WB (MAX_CHAR+13) #define TREX_SYMBOL_ANY_CHAR ('.') #define TREX_SYMBOL_GREEDY_ONE_OR_MORE ('+') @@ -3697,6 +2797,7 @@ static const TRexChar* g_nnames[] = {_SC("NONE"), _SC("OP_GREEDY"), _SC("OP_O #define TREX_SYMBOL_BEGINNING_OF_STRING ('^') #define TREX_SYMBOL_ESCAPE_CHAR ('\\') + typedef int TRexNodeType; typedef struct tagTRexNode { @@ -3707,25 +2808,25 @@ typedef struct tagTRexNode { } TRexNode; struct TRex { - const TRexChar* _eol; - const TRexChar* _bol; - const TRexChar* _p; + const TRexChar *_eol; + const TRexChar *_bol; + const TRexChar *_p; int _first; int _op; - TRexNode* _nodes; + TRexNode *_nodes; int _nallocated; int _nsize; int _nsubexpr; - TRexMatch* _matches; + TRexMatch *_matches; int _currsubexp; - void* _jmpbuf; - const TRexChar** _error; + void *_jmpbuf; + const TRexChar **_error; int _flags; }; -static int trex_list(TRex* exp); +static int trex_list(TRex *exp); -static int trex_newnode(TRex* exp, TRexNodeType type) { +static int trex_newnode(TRex *exp, TRexNodeType type) { TRexNode n; int newid; n.type = type; @@ -3734,26 +2835,25 @@ static int trex_newnode(TRex* exp, TRexNodeType type) { n.right = exp->_nsubexpr++; if (exp->_nallocated < (exp->_nsize + 1)) { exp->_nallocated *= 2; - exp->_nodes = (TRexNode*)xrealloc(exp->_nodes, exp->_nallocated * sizeof(TRexNode)); + exp->_nodes = (TRexNode *)realloc(exp->_nodes, exp->_nallocated * sizeof(TRexNode)); } exp->_nodes[exp->_nsize++] = n; newid = exp->_nsize - 1; return (int)newid; } -static void trex_error(TRex* exp, const TRexChar* error) { - if (exp->_error) - *exp->_error = error; - longjmp(*((jmp_buf*)exp->_jmpbuf), -1); +static void trex_error(TRex *exp, const TRexChar *error) { + if (exp->_error) *exp->_error = error; + longjmp(*((jmp_buf *)exp->_jmpbuf), -1); } -static void trex_expect(TRex* exp, int n) { +static void trex_expect(TRex *exp, int n) { if ((*exp->_p) != n) trex_error(exp, _SC("expected paren")); exp->_p++; } -static TRexChar trex_escapechar(TRex* exp) { +static TRexChar trex_escapechar(TRex *exp) { if (*exp->_p == TREX_SYMBOL_ESCAPE_CHAR) { exp->_p++; switch (*exp->_p) { @@ -3775,18 +2875,17 @@ static TRexChar trex_escapechar(TRex* exp) { default: return (*exp->_p++); } - } else if (!scisprint(*exp->_p)) - trex_error(exp, _SC("letter expected")); + } else if (!scisprint(*exp->_p)) trex_error(exp, _SC("letter expected")); return (*exp->_p++); } -static int trex_charclass(TRex* exp, int classid) { +static int trex_charclass(TRex *exp, int classid) { int n = trex_newnode(exp, OP_CCLASS); exp->_nodes[n].left = classid; return n; } -static int trex_charnode(TRex* exp, TRexBool isclass) { +static int trex_charnode(TRex *exp, TRexBool isclass) { TRexChar t; if (*exp->_p == TREX_SYMBOL_ESCAPE_CHAR) { exp->_p++; @@ -3833,42 +2932,46 @@ static int trex_charnode(TRex* exp, TRexBool isclass) { exp->_nodes[node].left = *exp->_p; exp->_p++; return node; - } - /* fall through */ + } //else default default: t = *exp->_p; exp->_p++; return trex_newnode(exp, t); } } else if (!scisprint(*exp->_p)) { + trex_error(exp, _SC("letter expected")); } t = *exp->_p; exp->_p++; return trex_newnode(exp, t); } -static int trex_class(TRex* exp) { +static int trex_class(TRex *exp) { int ret = -1; int first = -1, chain; if (*exp->_p == TREX_SYMBOL_BEGINNING_OF_STRING) { ret = trex_newnode(exp, OP_NCLASS); exp->_p++; - } else - ret = trex_newnode(exp, OP_CLASS); + } else ret = trex_newnode(exp, OP_CLASS); - if (*exp->_p == ']') - trex_error(exp, _SC("empty class")); + if (*exp->_p == ']') trex_error(exp, _SC("empty class")); chain = ret; while (*exp->_p != ']' && exp->_p != exp->_eol) { if (*exp->_p == '-' && first != -1) { int r, t; - if (*exp->_p++ == ']') + if (*exp->_p++ == ']') { trex_error(exp, _SC("unfinished range")); + } + r = trex_newnode(exp, OP_RANGE); - if (first > *exp->_p) + if (first > *exp->_p) { trex_error(exp, _SC("invalid range")); - if (exp->_nodes[first].type == OP_CCLASS) + } + + if (exp->_nodes[first].type == OP_CCLASS) { trex_error(exp, _SC("cannot use character classes in ranges")); + } + exp->_nodes[r].left = exp->_nodes[first].type; t = trex_escapechar(exp); exp->_nodes[r].right = t; @@ -3889,8 +2992,6 @@ static int trex_class(TRex* exp) { if (first != -1) { int c = first; exp->_nodes[chain].next = c; - chain = c; - first = -1; } /* hack? */ exp->_nodes[ret].left = exp->_nodes[ret].next; @@ -3898,26 +2999,26 @@ static int trex_class(TRex* exp) { return ret; } -static int trex_parsenumber(TRex* exp) { +static int trex_parsenumber(TRex *exp) { int ret = *exp->_p - '0'; int positions = 10; exp->_p++; while (isdigit(*exp->_p)) { - ret = ret * 10 + (*exp->_p++ - '0'); - if (positions == 1000000000) - trex_error(exp, _SC("overflow in numeric constant")); + ret = ret * 10 + (*exp->_p++ -'0'); + if (positions == 1000000000) trex_error(exp, _SC("overflow in numeric constant")); positions *= 10; }; return ret; } -static int trex_element(TRex* exp) { +static int trex_element(TRex *exp) { int ret = -1; switch (*exp->_p) { case '(': { int expr, newn; exp->_p++; + if (*exp->_p == '?') { exp->_p++; trex_expect(exp, ':'); @@ -3928,7 +3029,8 @@ static int trex_element(TRex* exp) { exp->_nodes[expr].left = newn; ret = expr; trex_expect(exp, ')'); - } break; + } + break; case '[': exp->_p++; ret = trex_class(exp); @@ -3971,8 +3073,7 @@ static int trex_element(TRex* exp) { break; case '{': exp->_p++; - if (!isdigit(*exp->_p)) - trex_error(exp, _SC("number expected")); + if (!isdigit(*exp->_p)) trex_error(exp, _SC("number expected")); p0 = (unsigned short)trex_parsenumber(exp); /*******************************/ switch (*exp->_p) { @@ -3994,6 +3095,7 @@ static int trex_element(TRex* exp) { /*******************************/ isgreedy = TRex_True; break; + } if (isgreedy) { int nnode = trex_newnode(exp, OP_GREEDY); @@ -4002,8 +3104,7 @@ static int trex_element(TRex* exp) { ret = nnode; } } - if ((*exp->_p != TREX_SYMBOL_BRANCH) && (*exp->_p != ')') && (*exp->_p != TREX_SYMBOL_GREEDY_ZERO_OR_MORE) && - (*exp->_p != TREX_SYMBOL_GREEDY_ONE_OR_MORE) && (*exp->_p != '\0')) { + if ((*exp->_p != TREX_SYMBOL_BRANCH) && (*exp->_p != ')') && (*exp->_p != TREX_SYMBOL_GREEDY_ZERO_OR_MORE) && (*exp->_p != TREX_SYMBOL_GREEDY_ONE_OR_MORE) && (*exp->_p != '\0')) { int nnode = trex_element(exp); exp->_nodes[ret].next = nnode; } @@ -4011,7 +3112,7 @@ static int trex_element(TRex* exp) { return ret; } -static int trex_list(TRex* exp) { +static int trex_list(TRex *exp) { int ret = -1, e; if (*exp->_p == TREX_SYMBOL_BEGINNING_OF_STRING) { exp->_p++; @@ -4020,8 +3121,7 @@ static int trex_list(TRex* exp) { e = trex_element(exp); if (ret != -1) { exp->_nodes[ret].next = e; - } else - ret = e; + } else ret = e; if (*exp->_p == TREX_SYMBOL_BRANCH) { int temp, tright; @@ -4046,9 +3146,9 @@ static TRexBool trex_matchcclass(int cclass, TRexChar c) { case 'W': return (!isalnum(c) && c != '_') ? TRex_True : TRex_False; case 's': - return isspace(c) ? TRex_True : TRex_False; + return ISSPACE(c) ? TRex_True : TRex_False; case 'S': - return !isspace(c) ? TRex_True : TRex_False; + return !ISSPACE(c) ? TRex_True : TRex_False; case 'd': return isdigit(c) ? TRex_True : TRex_False; case 'D': @@ -4073,43 +3173,39 @@ static TRexBool trex_matchcclass(int cclass, TRexChar c) { return TRex_False; /*cannot happen*/ } -static TRexBool trex_matchclass(TRex* exp, TRexNode* node, TRexChar c) { +static TRexBool trex_matchclass(TRex *exp, TRexNode *node, TRexChar c) { do { switch (node->type) { case OP_RANGE: if (exp->_flags & TREX_ICASE) { - if (c >= toupper(node->left) && c <= toupper(node->right)) - return TRex_True; - if (c >= tolower(node->left) && c <= tolower(node->right)) - return TRex_True; + if (c >= toupper(node->left) && c <= toupper(node->right)) return TRex_True; + if (c >= tolower(node->left) && c <= tolower(node->right)) return TRex_True; } else { - if (c >= node->left && c <= node->right) - return TRex_True; + if (c >= node->left && c <= node->right) return TRex_True; } break; case OP_CCLASS: - if (trex_matchcclass(node->left, c)) - return TRex_True; + if (trex_matchcclass(node->left, c)) return TRex_True; break; default: if (exp->_flags & TREX_ICASE) { - if (c == tolower(node->type) || c == toupper(node->type)) - return TRex_True; + if (c == tolower(node->type) || c == toupper(node->type)) return TRex_True; } else { - if (c == node->type) - return TRex_True; + if (c == node->type)return TRex_True; } + } - } while ((node->next != -1) && ((node = &exp->_nodes[node->next]) != NULL)); + } while ((node->next != -1) && (node = &exp->_nodes[node->next])); return TRex_False; } -static const TRexChar* trex_matchnode(TRex* exp, TRexNode* node, const TRexChar* str, TRexNode* next) { +static const TRexChar *trex_matchnode(TRex *exp, TRexNode *node, const TRexChar *str, TRexNode *next) { + TRexNodeType type = node->type; switch (type) { case OP_GREEDY: { - /* TRexNode *greedystop = (node->next != -1) ? &exp->_nodes[node->next] : NULL; */ - TRexNode* greedystop = NULL; + //TRexNode *greedystop = (node->next != -1) ? &exp->_nodes[node->next] : NULL; + TRexNode *greedystop = NULL; int p0 = (node->right >> 16) & 0x0000FFFF, p1 = node->right & 0x0000FFFF, nmaches = 0; const TRexChar *s = str, *good = str; @@ -4120,16 +3216,18 @@ static const TRexChar* trex_matchnode(TRex* exp, TRexNode* node, const TRexChar* } while ((nmaches == 0xFFFF || nmaches < p1)) { - const TRexChar* stop; - if ((s = trex_matchnode(exp, &exp->_nodes[node->left], s, greedystop)) == NULL) + + const TRexChar *stop; + if (!(s = trex_matchnode(exp, &exp->_nodes[node->left], s, greedystop))) break; nmaches++; good = s; if (greedystop) { - /* checks that 0 matches satisfy the expression(if so skips) */ - /* if not would always stop(for instance if is a '?') */ - if (greedystop->type != OP_GREEDY || (greedystop->type == OP_GREEDY && ((greedystop->right >> 16) & 0x0000FFFF) != 0)) { - TRexNode* gnext = NULL; + //checks that 0 matches satisfy the expression(if so skips) + //if not would always stop(for instance if is a '?') + if (greedystop->type != OP_GREEDY || + (greedystop->type == OP_GREEDY && ((greedystop->right >> 16) & 0x0000FFFF) != 0)) { + TRexNode *gnext = NULL; if (greedystop->next != -1) { gnext = &exp->_nodes[greedystop->next]; } else if (next && next->next != -1) { @@ -4137,13 +3235,10 @@ static const TRexChar* trex_matchnode(TRex* exp, TRexNode* node, const TRexChar* } stop = trex_matchnode(exp, greedystop, s, gnext); if (stop) { - /* if satisfied stop it */ - if (p0 == p1 && p0 == nmaches) - break; - else if (nmaches >= p0 && p1 == 0xFFFF) - break; - else if (nmaches >= p0 && nmaches <= p1) - break; + //if satisfied stop it + if (p0 == p1 && p0 == nmaches) break; + else if (nmaches >= p0 && p1 == 0xFFFF) break; + else if (nmaches >= p0 && nmaches <= p1) break; } } } @@ -4151,18 +3246,15 @@ static const TRexChar* trex_matchnode(TRex* exp, TRexNode* node, const TRexChar* if (s >= exp->_eol) break; } - if (p0 == p1 && p0 == nmaches) - return good; - else if (nmaches >= p0 && p1 == 0xFFFF) - return good; - else if (nmaches >= p0 && nmaches <= p1) - return good; + if (p0 == p1 && p0 == nmaches) return good; + else if (nmaches >= p0 && p1 == 0xFFFF) return good; + else if (nmaches >= p0 && nmaches <= p1) return good; return NULL; } case OP_OR: { - const TRexChar* asd = str; - TRexNode* temp = &exp->_nodes[node->left]; - while ((asd = trex_matchnode(exp, temp, asd, NULL)) != NULL) { + const TRexChar *asd = str; + TRexNode *temp = &exp->_nodes[node->left]; + while ((asd = trex_matchnode(exp, temp, asd, NULL))) { if (temp->next != -1) temp = &exp->_nodes[temp->next]; else @@ -4170,19 +3262,18 @@ static const TRexChar* trex_matchnode(TRex* exp, TRexNode* node, const TRexChar* } asd = str; temp = &exp->_nodes[node->right]; - while ((asd = trex_matchnode(exp, temp, asd, NULL)) != NULL) { + while ((asd = trex_matchnode(exp, temp, asd, NULL))) { if (temp->next != -1) temp = &exp->_nodes[temp->next]; else return asd; } return NULL; - break; } case OP_EXPR: case OP_NOCAPEXPR: { - TRexNode* n = &exp->_nodes[node->left]; - const TRexChar* cur = str; + TRexNode *n = &exp->_nodes[node->left]; + const TRexChar *cur = str; int capture = -1; if (node->type != OP_NOCAPEXPR && node->right == exp->_currsubexp) { capture = exp->_currsubexp; @@ -4191,47 +3282,45 @@ static const TRexChar* trex_matchnode(TRex* exp, TRexNode* node, const TRexChar* } do { - TRexNode* subnext = NULL; + TRexNode *subnext = NULL; if (n->next != -1) { subnext = &exp->_nodes[n->next]; } else { subnext = next; } - if ((cur = trex_matchnode(exp, n, cur, subnext)) == NULL) { + if (!(cur = trex_matchnode(exp, n, cur, subnext))) { if (capture != -1) { exp->_matches[capture].begin = 0; exp->_matches[capture].len = 0; } return NULL; } - } while ((n->next != -1) && ((n = &exp->_nodes[n->next]) != NULL)); + } while ((n->next != -1) && (n = &exp->_nodes[n->next])); if (capture != -1) exp->_matches[capture].len = (int)(cur - exp->_matches[capture].begin); return cur; } case OP_WB: - if ((str == exp->_bol && !isspace(*str)) || (str == exp->_eol && !isspace(*(str - 1))) || (!isspace(*str) && isspace(*(str + 1))) || - (isspace(*str) && !isspace(*(str + 1)))) { + if ((str == exp->_bol && !ISSPACE(*str)) + || ((str == exp->_eol && !ISSPACE(*(str - 1)))) + || ((!ISSPACE(*str) && ISSPACE(*(str + 1)))) + || ((ISSPACE(*str) && !ISSPACE(*(str + 1))))) { return (node->left == 'b') ? str : NULL; } return (node->left == 'b') ? NULL : str; case OP_BOL: - if (str == exp->_bol) - return str; + if (str == exp->_bol) return str; return NULL; case OP_EOL: - if (str == exp->_eol) - return str; + if (str == exp->_eol) return str; return NULL; - case OP_DOT: { + case OP_DOT: str++; - } return str; case OP_NCLASS: case OP_CLASS: - if (trex_matchclass(exp, &exp->_nodes[node->left], *str) ? (type == OP_CLASS ? TRex_True : TRex_False) - : (type == OP_NCLASS ? TRex_True : TRex_False)) { + if (trex_matchclass(exp, &exp->_nodes[node->left], *str) ? (type == OP_CLASS ? TRex_True : TRex_False) : (type == OP_NCLASS ? TRex_True : TRex_False)) { str++; return str; } @@ -4244,32 +3333,31 @@ static const TRexChar* trex_matchnode(TRex* exp, TRexNode* node, const TRexChar* return NULL; default: /* char */ if (exp->_flags & TREX_ICASE) { - if (*str != tolower(node->type) && *str != toupper(node->type)) - return NULL; + if (*str != tolower(node->type) && *str != toupper(node->type)) return NULL; } else { - if (*str != node->type) - return NULL; + if (*str != node->type) return NULL; } str++; return str; } + return NULL; } /* public api */ -TRex* trex_compile(const TRexChar* pattern, const TRexChar** error, int flags) { - TRex* exp = (TRex*)xmalloc(sizeof(TRex)); +TRex *trex_compile(const TRexChar *pattern, const TRexChar **error, int flags) { + TRex *exp = (TRex *)malloc(sizeof(TRex)); exp->_eol = exp->_bol = NULL; exp->_p = pattern; exp->_nallocated = (int)scstrlen(pattern) * sizeof(TRexChar); - exp->_nodes = (TRexNode*)xmalloc(exp->_nallocated * sizeof(TRexNode)); + exp->_nodes = (TRexNode *)malloc(exp->_nallocated * sizeof(TRexNode)); exp->_nsize = 0; exp->_matches = 0; exp->_nsubexpr = 0; exp->_first = trex_newnode(exp, OP_EXPR); exp->_error = error; - exp->_jmpbuf = xmalloc(sizeof(jmp_buf)); + exp->_jmpbuf = malloc(sizeof(jmp_buf)); exp->_flags = flags; - if (setjmp(*((jmp_buf*)exp->_jmpbuf)) == 0) { + if (setjmp(*((jmp_buf *)exp->_jmpbuf)) == 0) { int res = trex_list(exp); exp->_nodes[exp->_first].left = res; if (*exp->_p != '\0') @@ -4277,7 +3365,7 @@ TRex* trex_compile(const TRexChar* pattern, const TRexChar** error, int flags) { #ifdef _DEBUG { int nsize, i; - TRexNode* t; + TRexNode *t; nsize = exp->_nsize; t = &exp->_nodes[0]; scprintf(_SC("\n")); @@ -4291,7 +3379,7 @@ TRex* trex_compile(const TRexChar* pattern, const TRexChar** error, int flags) { scprintf(_SC("\n")); } #endif - exp->_matches = (TRexMatch*)xmalloc(exp->_nsubexpr * sizeof(TRexMatch)); + exp->_matches = (TRexMatch *) malloc(exp->_nsubexpr * sizeof(TRexMatch)); memset(exp->_matches, 0, exp->_nsubexpr * sizeof(TRexMatch)); } else { trex_free(exp); @@ -4300,17 +3388,17 @@ TRex* trex_compile(const TRexChar* pattern, const TRexChar** error, int flags) { return exp; } -void trex_free(TRex* exp) { +void trex_free(TRex *exp) { if (exp) { - xfree(exp->_nodes); - xfree(exp->_jmpbuf); - xfree(exp->_matches); - xfree(exp); + if (exp->_nodes) free(exp->_nodes); + if (exp->_jmpbuf) free(exp->_jmpbuf); + if (exp->_matches) free(exp->_matches); + free(exp); } } -TRexBool trex_match(TRex* exp, const TRexChar* text) { - const TRexChar* res = NULL; +TRexBool trex_match(TRex *exp, const TRexChar *text) { + const TRexChar *res = NULL; exp->_bol = text; exp->_eol = text + scstrlen(text); exp->_currsubexp = 0; @@ -4320,11 +3408,10 @@ TRexBool trex_match(TRex* exp, const TRexChar* text) { return TRex_True; } -TRexBool trex_searchrange(TRex* exp, const TRexChar* text_begin, const TRexChar* text_end, const TRexChar** out_begin, const TRexChar** out_end) { - const TRexChar* cur = NULL; +TRexBool trex_searchrange(TRex *exp, const TRexChar *text_begin, const TRexChar *text_end, const TRexChar **out_begin, const TRexChar **out_end) { + const TRexChar *cur = NULL; int node = exp->_first; - if (text_begin >= text_end) - return TRex_False; + if (text_begin >= text_end) return TRex_False; exp->_bol = text_begin; exp->_eol = text_end; do { @@ -4344,30 +3431,25 @@ TRexBool trex_searchrange(TRex* exp, const TRexChar* text_begin, const TRexChar* --text_begin; - if (out_begin) - *out_begin = text_begin; - if (out_end) - *out_end = cur; + if (out_begin) *out_begin = text_begin; + if (out_end) *out_end = cur; return TRex_True; } -TRexBool trex_search(TRex* exp, const TRexChar* text, const TRexChar** out_begin, const TRexChar** out_end) { +TRexBool trex_search(TRex *exp, const TRexChar *text, const TRexChar **out_begin, const TRexChar **out_end) { return trex_searchrange(exp, text, text + scstrlen(text), out_begin, out_end); } -int trex_getsubexpcount(TRex* exp) { +int trex_getsubexpcount(TRex *exp) { return exp->_nsubexpr; } -TRexBool trex_getsubexp(TRex* exp, int n, TRexMatch* subexp) { - if (n < 0 || n >= exp->_nsubexpr) - return TRex_False; +TRexBool trex_getsubexp(TRex *exp, int n, TRexMatch *subexp) { + if (n < 0 || n >= exp->_nsubexpr) return TRex_False; *subexp = exp->_matches[n]; return TRex_True; } /******************************************************************************* - * arg_str: Implements the str command-line option - * * This file is part of the argtable3 library. * * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann @@ -4397,34 +3479,31 @@ TRexBool trex_getsubexp(TRex* exp, int n, TRexMatch* subexp) { * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ -#include "argtable3.h" - -#ifndef ARG_AMALGAMATION -#include "argtable3_private.h" -#endif - #include -static void arg_str_resetfn(struct arg_str* parent) { +#include "argtable3.h" + + +static void arg_str_resetfn(struct arg_str *parent) { int i; - ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent)); + parent->count = 0; for (i = 0; i < parent->count; i++) { parent->sval[i] = ""; } - parent->count = 0; } -static int arg_str_scanfn(struct arg_str* parent, const char* argval) { + +static int arg_str_scanfn(struct arg_str *parent, const char *argval) { int errorcode = 0; if (parent->count == parent->hdr.maxcount) { /* maximum number of arguments exceeded */ - errorcode = ARG_ERR_MAXCOUNT; + errorcode = EMAXCOUNT; } else if (!argval) { /* a valid argument with no argument value was given. */ /* This happens when an optional argument value was invoked. */ - /* leave parent argument value unaltered but still count the argument. */ + /* leave parent arguiment value unaltered but still count the argument. */ parent->count++; } else { parent->sval[parent->count++] = argval; @@ -4434,366 +3513,110 @@ static int arg_str_scanfn(struct arg_str* parent, const char* argval) { return errorcode; } -static int arg_str_checkfn(struct arg_str* parent) { - int errorcode = (parent->count < parent->hdr.mincount) ? ARG_ERR_MINCOUNT : 0; + +static int arg_str_checkfn(struct arg_str *parent) { + int errorcode = (parent->count < parent->hdr.mincount) ? EMINCOUNT : 0; ARG_TRACE(("%s:checkfn(%p) returns %d\n", __FILE__, parent, errorcode)); return errorcode; } -static void arg_str_errorfn(struct arg_str* parent, arg_dstr_t ds, int errorcode, const char* argval, const char* progname) { - const char* shortopts = parent->hdr.shortopts; - const char* longopts = parent->hdr.longopts; - const char* datatype = parent->hdr.datatype; + +static void arg_str_errorfn( + struct arg_str *parent, + FILE *fp, + int errorcode, + const char *argval, + const char *progname) { + const char *shortopts = parent->hdr.shortopts; + const char *longopts = parent->hdr.longopts; + const char *datatype = parent->hdr.datatype; /* make argval NULL safe */ argval = argval ? argval : ""; - arg_dstr_catf(ds, "%s: ", progname); + fprintf(fp, "%s: ", progname); switch (errorcode) { - case ARG_ERR_MINCOUNT: - arg_dstr_cat(ds, "missing option "); - arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); + case EMINCOUNT: + fputs("missing option ", fp); + arg_print_option(fp, shortopts, longopts, datatype, "\n"); break; - case ARG_ERR_MAXCOUNT: - arg_dstr_cat(ds, "excess option "); - arg_print_option_ds(ds, shortopts, longopts, argval, "\n"); + case EMAXCOUNT: + fputs("excess option ", fp); + arg_print_option(fp, shortopts, longopts, argval, "\n"); break; } } -struct arg_str* arg_str0(const char* shortopts, const char* longopts, const char* datatype, const char* glossary) { + +struct arg_str *arg_str0( + const char *shortopts, + const char *longopts, + const char *datatype, + const char *glossary) { return arg_strn(shortopts, longopts, datatype, 0, 1, glossary); } -struct arg_str* arg_str1(const char* shortopts, const char* longopts, const char* datatype, const char* glossary) { + +struct arg_str *arg_str1( + const char *shortopts, + const char *longopts, + const char *datatype, + const char *glossary) { return arg_strn(shortopts, longopts, datatype, 1, 1, glossary); } -struct arg_str* arg_strn(const char* shortopts, const char* longopts, const char* datatype, int mincount, int maxcount, const char* glossary) { + +struct arg_str *arg_strn( + const char *shortopts, + const char *longopts, + const char *datatype, + int mincount, + int maxcount, + const char *glossary) { size_t nbytes; - struct arg_str* result; - int i; + struct arg_str *result; /* should not allow this stupid error */ /* we should return an error code warning this logic error */ /* foolproof things by ensuring maxcount is not less than mincount */ maxcount = (maxcount < mincount) ? mincount : maxcount; - nbytes = sizeof(struct arg_str) /* storage for struct arg_str */ - + maxcount * sizeof(char*); /* storage for sval[maxcount] array */ + nbytes = sizeof(struct arg_str) /* storage for struct arg_str */ + + maxcount * sizeof(char *); /* storage for sval[maxcount] array */ - result = (struct arg_str*)xmalloc(nbytes); + result = (struct arg_str *)malloc(nbytes); + if (result) { + int i; - /* init the arg_hdr struct */ - result->hdr.flag = ARG_HASVALUE; - result->hdr.shortopts = shortopts; - result->hdr.longopts = longopts; - result->hdr.datatype = datatype ? datatype : ""; - result->hdr.glossary = glossary; - result->hdr.mincount = mincount; - result->hdr.maxcount = maxcount; - result->hdr.parent = result; - result->hdr.resetfn = (arg_resetfn*)arg_str_resetfn; - result->hdr.scanfn = (arg_scanfn*)arg_str_scanfn; - result->hdr.checkfn = (arg_checkfn*)arg_str_checkfn; - result->hdr.errorfn = (arg_errorfn*)arg_str_errorfn; + /* init the arg_hdr struct */ + result->hdr.flag = ARG_HASVALUE; + result->hdr.shortopts = shortopts; + result->hdr.longopts = longopts; + result->hdr.datatype = datatype ? datatype : ""; + result->hdr.glossary = glossary; + result->hdr.mincount = mincount; + result->hdr.maxcount = maxcount; + result->hdr.parent = result; + result->hdr.resetfn = (arg_resetfn *)arg_str_resetfn; + result->hdr.scanfn = (arg_scanfn *)arg_str_scanfn; + result->hdr.checkfn = (arg_checkfn *)arg_str_checkfn; + result->hdr.errorfn = (arg_errorfn *)arg_str_errorfn; - /* store the sval[maxcount] array immediately after the arg_str struct */ - result->sval = (const char**)(result + 1); - result->count = 0; + /* store the sval[maxcount] array immediately after the arg_str struct */ + result->sval = (const char * *)(result + 1); + result->count = 0; - /* foolproof the string pointers by initializing them to reference empty strings */ - for (i = 0; i < maxcount; i++) - result->sval[i] = ""; + /* foolproof the string pointers by initialising them to reference empty strings */ + for (i = 0; i < maxcount; i++) + result->sval[i] = ""; + } ARG_TRACE(("arg_strn() returns %p\n", result)); return result; } /******************************************************************************* - * arg_cmd: Provides the sub-command mechanism - * - * This file is part of the argtable3 library. - * - * Copyright (C) 2013-2019 Tom G. Huang - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of STEWART HEITMANN 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 COPYRIGHT HOLDERS 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 STEWART HEITMANN 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 "argtable3.h" - -#ifndef ARG_AMALGAMATION -#include "argtable3_private.h" -#endif - -#include -#include -#include - -#define MAX_MODULE_VERSION_SIZE 128 - -static arg_hashtable_t* s_hashtable = NULL; -static char* s_module_name = NULL; -static int s_mod_ver_major = 0; -static int s_mod_ver_minor = 0; -static int s_mod_ver_patch = 0; -static char* s_mod_ver_tag = NULL; -static char* s_mod_ver = NULL; - -void arg_set_module_name(const char* name) { - size_t slen; - - xfree(s_module_name); - slen = strlen(name); - s_module_name = (char*)xmalloc(slen + 1); - memset(s_module_name, 0, slen + 1); - -#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || (defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__)) - strncpy_s(s_module_name, slen + 1, name, slen); -#else - memcpy(s_module_name, name, slen); -#endif -} - -void arg_set_module_version(int major, int minor, int patch, const char* tag) { - size_t slen_tag, slen_ds; - arg_dstr_t ds; - - s_mod_ver_major = major; - s_mod_ver_minor = minor; - s_mod_ver_patch = patch; - - xfree(s_mod_ver_tag); - slen_tag = strlen(tag); - s_mod_ver_tag = (char*)xmalloc(slen_tag + 1); - memset(s_mod_ver_tag, 0, slen_tag + 1); - -#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || (defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__)) - strncpy_s(s_mod_ver_tag, slen_tag + 1, tag, slen_tag); -#else - memcpy(s_mod_ver_tag, tag, slen_tag); -#endif - - ds = arg_dstr_create(); - arg_dstr_catf(ds, "%d.", s_mod_ver_major); - arg_dstr_catf(ds, "%d.", s_mod_ver_minor); - arg_dstr_catf(ds, "%d.", s_mod_ver_patch); - arg_dstr_cat(ds, s_mod_ver_tag); - - xfree(s_mod_ver); - slen_ds = strlen(arg_dstr_cstr(ds)); - s_mod_ver = (char*)xmalloc(slen_ds + 1); - memset(s_mod_ver, 0, slen_ds + 1); - -#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || (defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__)) - strncpy_s(s_mod_ver, slen_ds + 1, arg_dstr_cstr(ds), slen_ds); -#else - memcpy(s_mod_ver, arg_dstr_cstr(ds), slen_ds); -#endif - - arg_dstr_destroy(ds); -} - -static unsigned int hash_key(const void* key) { - const char* str = (const char*)key; - int c; - unsigned int hash = 5381; - - while ((c = *str++) != 0) - hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ - - return hash; -} - -static int equal_keys(const void* key1, const void* key2) { - char* k1 = (char*)key1; - char* k2 = (char*)key2; - return (0 == strcmp(k1, k2)); -} - -void arg_cmd_init(void) { - s_hashtable = arg_hashtable_create(32, hash_key, equal_keys); -} - -void arg_cmd_uninit(void) { - arg_hashtable_destroy(s_hashtable, 1); -} - -void arg_cmd_register(const char* name, arg_cmdfn* proc, const char* description) { - arg_cmd_info_t* cmd_info; - size_t slen_name; - void* k; - - assert(strlen(name) < ARG_CMD_NAME_LEN); - assert(strlen(description) < ARG_CMD_DESCRIPTION_LEN); - - /* Check if the command already exists. */ - /* If the command exists, replace the existing command. */ - /* If the command doesn't exist, insert the command. */ - cmd_info = (arg_cmd_info_t*)arg_hashtable_search(s_hashtable, name); - if (cmd_info) { - arg_hashtable_remove(s_hashtable, name); - cmd_info = NULL; - } - - cmd_info = (arg_cmd_info_t*)xmalloc(sizeof(arg_cmd_info_t)); - memset(cmd_info, 0, sizeof(arg_cmd_info_t)); - -#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || (defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__)) - strncpy_s(cmd_info->name, ARG_CMD_NAME_LEN, name, strlen(name)); - strncpy_s(cmd_info->description, ARG_CMD_DESCRIPTION_LEN, description, strlen(description)); -#else - memcpy(cmd_info->name, name, strlen(name)); - memcpy(cmd_info->description, description, strlen(description)); -#endif - - cmd_info->proc = proc; - - slen_name = strlen(name); - k = xmalloc(slen_name + 1); - memset(k, 0, slen_name + 1); - -#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || (defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__)) - strncpy_s((char*)k, slen_name + 1, name, slen_name); -#else - memcpy((char*)k, name, slen_name); -#endif - - arg_hashtable_insert(s_hashtable, k, cmd_info); -} - -void arg_cmd_unregister(const char* name) { - arg_hashtable_remove(s_hashtable, name); -} - -int arg_cmd_dispatch(const char* name, int argc, char* argv[], arg_dstr_t res) { - arg_cmd_info_t* cmd_info = arg_cmd_info(name); - - assert(cmd_info != NULL); - assert(cmd_info->proc != NULL); - - return cmd_info->proc(argc, argv, res); -} - -arg_cmd_info_t* arg_cmd_info(const char* name) { - return (arg_cmd_info_t*)arg_hashtable_search(s_hashtable, name); -} - -unsigned int arg_cmd_count(void) { - return arg_hashtable_count(s_hashtable); -} - -arg_cmd_itr_t arg_cmd_itr_create(void) { - return (arg_cmd_itr_t)arg_hashtable_itr_create(s_hashtable); -} - -int arg_cmd_itr_advance(arg_cmd_itr_t itr) { - return arg_hashtable_itr_advance((arg_hashtable_itr_t*)itr); -} - -char* arg_cmd_itr_key(arg_cmd_itr_t itr) { - return (char*)arg_hashtable_itr_key((arg_hashtable_itr_t*)itr); -} - -arg_cmd_info_t* arg_cmd_itr_value(arg_cmd_itr_t itr) { - return (arg_cmd_info_t*)arg_hashtable_itr_value((arg_hashtable_itr_t*)itr); -} - -void arg_cmd_itr_destroy(arg_cmd_itr_t itr) { - arg_hashtable_itr_destroy((arg_hashtable_itr_t*)itr); -} - -int arg_cmd_itr_search(arg_cmd_itr_t itr, void* k) { - return arg_hashtable_itr_search((arg_hashtable_itr_t*)itr, s_hashtable, k); -} - -static const char* module_name(void) { - if (s_module_name == NULL || strlen(s_module_name) == 0) - return ""; - - return s_module_name; -} - -static const char* module_version(void) { - if (s_mod_ver == NULL || strlen(s_mod_ver) == 0) - return "0.0.0.0"; - - return s_mod_ver; -} - -void arg_make_get_help_msg(arg_dstr_t res) { - arg_dstr_catf(res, "%s v%s\n", module_name(), module_version()); - arg_dstr_catf(res, "Please type '%s help' to get more information.\n", module_name()); -} - -void arg_make_help_msg(arg_dstr_t ds, char* cmd_name, void** argtable) { - arg_cmd_info_t* cmd_info = (arg_cmd_info_t*)arg_hashtable_search(s_hashtable, cmd_name); - if (cmd_info) { - arg_dstr_catf(ds, "%s: %s\n", cmd_name, cmd_info->description); - } - - arg_dstr_cat(ds, "Usage:\n"); - arg_dstr_catf(ds, " %s", module_name()); - - arg_print_syntaxv_ds(ds, argtable, "\n \nAvailable options:\n"); - arg_print_glossary_ds(ds, argtable, " %-23s %s\n"); - - arg_dstr_cat(ds, "\n"); -} - -void arg_make_syntax_err_msg(arg_dstr_t ds, void** argtable, struct arg_end* end) { - arg_print_errors_ds(ds, end, module_name()); - arg_dstr_cat(ds, "Usage: \n"); - arg_dstr_catf(ds, " %s", module_name()); - arg_print_syntaxv_ds(ds, argtable, "\n"); - arg_dstr_cat(ds, "\n"); -} - -int arg_make_syntax_err_help_msg(arg_dstr_t ds, char* name, int help, int nerrors, void** argtable, struct arg_end* end, int* exitcode) { - /* help handling - * note: '-h|--help' takes precedence over error reporting - */ - if (help > 0) { - arg_make_help_msg(ds, name, argtable); - *exitcode = EXIT_SUCCESS; - return 1; - } - - /* syntax error handling */ - if (nerrors > 0) { - arg_make_syntax_err_msg(ds, argtable, end); - *exitcode = EXIT_FAILURE; - return 1; - } - - return 0; -} -/******************************************************************************* - * argtable3: Implements the main interfaces of the library - * * This file is part of the argtable3 library. * * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann @@ -4823,26 +3646,18 @@ int arg_make_syntax_err_help_msg(arg_dstr_t ds, char* name, int help, int nerror * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ -#include "argtable3.h" - -#ifndef ARG_AMALGAMATION -#include "argtable3_private.h" -#include "getopt.h" -#endif - -#ifdef _WIN32 -#define WIN32_LEAN_AND_MEAN -#include -#undef WIN32_LEAN_AND_MEAN -#endif - -#include -#include -#include #include #include +#include +#include -static void arg_register_error(struct arg_end* end, void* parent, int error, const char* argval) { +#include "argtable3.h" + +static +void arg_register_error(struct arg_end *end, + void *parent, + int error, + const char *argval) { /* printf("arg_register_error(%p,%p,%d,%s)\n",end,parent,error,argval); */ if (end->count < end->hdr.maxcount) { end->error[end->count] = error; @@ -4850,20 +3665,22 @@ static void arg_register_error(struct arg_end* end, void* parent, int error, con end->argval[end->count] = argval; end->count++; } else { - end->error[end->hdr.maxcount - 1] = ARG_ELIMIT; + end->error[end->hdr.maxcount - 1] = ARG_ELIMIT; end->parent[end->hdr.maxcount - 1] = end; end->argval[end->hdr.maxcount - 1] = NULL; } } + /* * Return index of first table entry with a matching short option * or -1 if no match was found. */ -static int find_shortoption(struct arg_hdr** table, char shortopt) { +static int find_shortoption(struct arg_hdr **table, char shortopt) { int tabindex; for (tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { - if (table[tabindex]->shortopts && strchr(table[tabindex]->shortopts, shortopt)) + if (table[tabindex]->shortopts && + strchr(table[tabindex]->shortopts, shortopt)) return tabindex; } return -1; @@ -4872,18 +3689,16 @@ static int find_shortoption(struct arg_hdr** table, char shortopt) { struct longoptions { int getoptval; int noptions; - struct option* options; + struct option *options; }; #if 0 static -void dump_longoptions(struct longoptions * longoptions) -{ +void dump_longoptions(struct longoptions *longoptions) { int i; printf("getoptval = %d\n", longoptions->getoptval); printf("noptions = %d\n", longoptions->noptions); - for (i = 0; i < longoptions->noptions; i++) - { + for (i = 0; i < longoptions->noptions; i++) { printf("options[%d].name = \"%s\"\n", i, longoptions->options[i].name); @@ -4894,14 +3709,12 @@ void dump_longoptions(struct longoptions * longoptions) } #endif -static struct longoptions* alloc_longoptions(struct arg_hdr** table) { - struct longoptions* result; +static struct longoptions *alloc_longoptions(struct arg_hdr **table) { + struct longoptions *result; size_t nbytes; int noptions = 1; size_t longoptlen = 0; int tabindex; - int option_index = 0; - char* store; /* * Determine the total number of option structs required @@ -4915,7 +3728,7 @@ static struct longoptions* alloc_longoptions(struct arg_hdr** table) { */ tabindex = 0; do { - const char* longopts = table[tabindex]->longopts; + const char *longopts = table[tabindex]->longopts; longoptlen += (longopts ? strlen(longopts) : 0) + 1; while (longopts) { noptions++; @@ -4924,110 +3737,130 @@ static struct longoptions* alloc_longoptions(struct arg_hdr** table) { } while (!(table[tabindex++]->flag & ARG_TERMINATOR)); /*printf("%d long options consuming %d chars in total\n",noptions,longoptlen);*/ + /* allocate storage for return data structure as: */ /* (struct longoptions) + (struct options)[noptions] + char[longoptlen] */ - nbytes = sizeof(struct longoptions) + sizeof(struct option) * noptions + longoptlen; - result = (struct longoptions*)xmalloc(nbytes); + nbytes = sizeof(struct longoptions) + + sizeof(struct option) * noptions + + longoptlen; + result = (struct longoptions *)malloc(nbytes); + if (result) { + int option_index = 0; + char *store; - result->getoptval = 0; - result->noptions = noptions; - result->options = (struct option*)(result + 1); - store = (char*)(result->options + noptions); + result->getoptval = 0; + result->noptions = noptions; + result->options = (struct option *)(result + 1); + store = (char *)(result->options + noptions); - for (tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { - const char* longopts = table[tabindex]->longopts; + for (tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { + const char *longopts = table[tabindex]->longopts; - while (longopts && *longopts) { - char* storestart = store; + while (longopts && *longopts) { + char *storestart = store; - /* copy progressive longopt strings into the store */ - while (*longopts != 0 && *longopts != ',') - *store++ = *longopts++; - *store++ = 0; - if (*longopts == ',') - longopts++; - /*fprintf(stderr,"storestart=\"%s\"\n",storestart);*/ + /* copy progressive longopt strings into the store */ + while (*longopts != 0 && *longopts != ',') + *store++ = *longopts++; + *store++ = 0; + if (*longopts == ',') + longopts++; + /*fprintf(stderr,"storestart=\"%s\"\n",storestart);*/ - result->options[option_index].name = storestart; - result->options[option_index].flag = &(result->getoptval); - result->options[option_index].val = tabindex; - if (table[tabindex]->flag & ARG_HASOPTVALUE) - result->options[option_index].has_arg = 2; - else if (table[tabindex]->flag & ARG_HASVALUE) - result->options[option_index].has_arg = 1; - else - result->options[option_index].has_arg = 0; + result->options[option_index].name = storestart; + result->options[option_index].flag = &(result->getoptval); + result->options[option_index].val = tabindex; + if (table[tabindex]->flag & ARG_HASOPTVALUE) + result->options[option_index].has_arg = 2; + else if (table[tabindex]->flag & ARG_HASVALUE) + result->options[option_index].has_arg = 1; + else + result->options[option_index].has_arg = 0; - option_index++; + option_index++; + } } + /* terminate the options array with a zero-filled entry */ + result->options[option_index].name = 0; + result->options[option_index].has_arg = 0; + result->options[option_index].flag = 0; + result->options[option_index].val = 0; } - /* terminate the options array with a zero-filled entry */ - result->options[option_index].name = 0; - result->options[option_index].has_arg = 0; - result->options[option_index].flag = 0; - result->options[option_index].val = 0; /*dump_longoptions(result);*/ return result; } -static char* alloc_shortoptions(struct arg_hdr** table) { - char* result; +static char *alloc_shortoptions(struct arg_hdr **table) { + char *result; size_t len = 2; int tabindex; - char* res; /* determine the total number of option chars required */ for (tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { - struct arg_hdr* hdr = table[tabindex]; + struct arg_hdr *hdr = table[tabindex]; len += 3 * (hdr->shortopts ? strlen(hdr->shortopts) : 0); } - result = xmalloc(len); + result = malloc(len); + if (result) { + char *res = result; - res = result; + /* add a leading ':' so getopt return codes distinguish */ + /* unrecognised option and options missing argument values */ + *res++ = ':'; - /* add a leading ':' so getopt return codes distinguish */ - /* unrecognised option and options missing argument values */ - *res++ = ':'; - - for (tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { - struct arg_hdr* hdr = table[tabindex]; - const char* shortopts = hdr->shortopts; - while (shortopts && *shortopts) { - *res++ = *shortopts++; - if (hdr->flag & ARG_HASVALUE) - *res++ = ':'; - if (hdr->flag & ARG_HASOPTVALUE) - *res++ = ':'; + for (tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { + struct arg_hdr *hdr = table[tabindex]; + const char *shortopts = hdr->shortopts; + while (shortopts && *shortopts) { + *res++ = *shortopts++; + if (hdr->flag & ARG_HASVALUE) + *res++ = ':'; + if (hdr->flag & ARG_HASOPTVALUE) + *res++ = ':'; + } } + /* null terminate the string */ + *res = 0; } - /* null terminate the string */ - *res = 0; /*printf("alloc_shortoptions() returns \"%s\"\n",(result?result:"NULL"));*/ return result; } + /* return index of the table terminator entry */ -static int arg_endindex(struct arg_hdr** table) { +static int arg_endindex(struct arg_hdr **table) { int tabindex = 0; while (!(table[tabindex]->flag & ARG_TERMINATOR)) tabindex++; return tabindex; } -static void arg_parse_tagged(int argc, char** argv, struct arg_hdr** table, struct arg_end* endtable) { - struct longoptions* longoptions; - char* shortoptions; + +static void arg_parse_tagged(int argc, + char **argv, + struct arg_hdr **table, + struct arg_end *endtable) { + struct longoptions *longoptions; + char *shortoptions; int copt; /*printf("arg_parse_tagged(%d,%p,%p,%p)\n",argc,argv,table,endtable);*/ /* allocate short and long option arrays for the given opttable[]. */ /* if the allocs fail then put an error msg in the last table entry. */ - longoptions = alloc_longoptions(table); + longoptions = alloc_longoptions(table); shortoptions = alloc_shortoptions(table); + if (!longoptions || !shortoptions) { + /* one or both memory allocs failed */ + arg_register_error(endtable, endtable, ARG_EMALLOC, NULL); + /* free anything that was allocated (this is null safe) */ + free(shortoptions); + free(longoptions); + return; + } /*dump_longoptions(longoptions);*/ @@ -5036,7 +3869,9 @@ static void arg_parse_tagged(int argc, char** argv, struct arg_hdr** table, stru opterr = 0; /* fetch and process args using getopt_long */ - while ((copt = getopt_long(argc, argv, shortoptions, longoptions->options, NULL)) != -1) { + while ((copt = + getopt_long(argc, argv, shortoptions, longoptions->options, + NULL)) != -1) { /* printf("optarg='%s'\n",optarg); printf("optind=%d\n",optind); @@ -5046,11 +3881,13 @@ static void arg_parse_tagged(int argc, char** argv, struct arg_hdr** table, stru switch (copt) { case 0: { int tabindex = longoptions->getoptval; - void* parent = table[tabindex]->parent; + void *parent = table[tabindex]->parent; /*printf("long option detected from argtable[%d]\n", tabindex);*/ - if (optarg && optarg[0] == 0 && (table[tabindex]->flag & ARG_HASVALUE)) { + if (optarg && optarg[0] == 0 && + (table[tabindex]->flag & ARG_HASVALUE)) { /* printf(": long option %s requires an argument\n",argv[optind-1]); */ - arg_register_error(endtable, endtable, ARG_EMISSARG, argv[optind - 1]); + arg_register_error(endtable, endtable, ARG_EMISSARG, + argv[optind - 1]); /* continue to scan the (empty) argument value to enforce argument count checking */ } if (table[tabindex]->scanfn) { @@ -5058,7 +3895,8 @@ static void arg_parse_tagged(int argc, char** argv, struct arg_hdr** table, stru if (errorcode != 0) arg_register_error(endtable, parent, errorcode, optarg); } - } break; + } + break; case '?': /* @@ -5069,7 +3907,8 @@ static void arg_parse_tagged(int argc, char** argv, struct arg_hdr** table, stru switch (optopt) { case 0: /*printf("?0 unrecognised long option %s\n",argv[optind-1]);*/ - arg_register_error(endtable, endtable, ARG_ELONGOPT, argv[optind - 1]); + arg_register_error(endtable, endtable, ARG_ELONGOPT, + argv[optind - 1]); break; default: /*printf("?* unrecognised short option '%c'\n",optopt);*/ @@ -5083,7 +3922,8 @@ static void arg_parse_tagged(int argc, char** argv, struct arg_hdr** table, stru * getopt_long() found an option with its argument missing. */ /*printf(": option %s requires an argument\n",argv[optind-1]); */ - arg_register_error(endtable, endtable, ARG_EMISSARG, argv[optind - 1]); + arg_register_error(endtable, endtable, ARG_EMISSARG, + argv[optind - 1]); break; default: { @@ -5096,7 +3936,7 @@ static void arg_parse_tagged(int argc, char** argv, struct arg_hdr** table, stru arg_register_error(endtable, endtable, copt, NULL); } else { if (table[tabindex]->scanfn) { - void* parent = table[tabindex]->parent; + void *parent = table[tabindex]->parent; int errorcode = table[tabindex]->scanfn(parent, optarg); if (errorcode != 0) arg_register_error(endtable, parent, errorcode, optarg); @@ -5107,19 +3947,23 @@ static void arg_parse_tagged(int argc, char** argv, struct arg_hdr** table, stru } } - xfree(shortoptions); - xfree(longoptions); + free(shortoptions); + free(longoptions); } -static void arg_parse_untagged(int argc, char** argv, struct arg_hdr** table, struct arg_end* endtable) { + +static void arg_parse_untagged(int argc, + char **argv, + struct arg_hdr **table, + struct arg_end *endtable) { int tabindex = 0; int errorlast = 0; - const char* optarglast = NULL; - void* parentlast = NULL; + const char *optarglast = NULL; + void *parentlast = NULL; /*printf("arg_parse_untagged(%d,%p,%p,%p)\n",argc,argv,table,endtable);*/ while (!(table[tabindex]->flag & ARG_TERMINATOR)) { - void* parent; + void *parent; int errorcode; /* if we have exhausted our argv[optind] entries then we have finished */ @@ -5182,12 +4026,13 @@ static void arg_parse_untagged(int argc, char** argv, struct arg_hdr** table, st return; } -static void arg_parse_check(struct arg_hdr** table, struct arg_end* endtable) { + +static void arg_parse_check(struct arg_hdr **table, struct arg_end *endtable) { int tabindex = 0; /* printf("arg_parse_check()\n"); */ do { if (table[tabindex]->checkfn) { - void* parent = table[tabindex]->parent; + void *parent = table[tabindex]->parent; int errorcode = table[tabindex]->checkfn(parent); if (errorcode != 0) arg_register_error(endtable, parent, errorcode, NULL); @@ -5195,8 +4040,9 @@ static void arg_parse_check(struct arg_hdr** table, struct arg_end* endtable) { } while (!(table[tabindex++]->flag & ARG_TERMINATOR)); } -static void arg_reset(void** argtable) { - struct arg_hdr** table = (struct arg_hdr**)argtable; + +static void arg_reset(void **argtable) { + struct arg_hdr * *table = (struct arg_hdr * *)argtable; int tabindex = 0; /*printf("arg_reset(%p)\n",argtable);*/ do { @@ -5205,12 +4051,12 @@ static void arg_reset(void** argtable) { } while (!(table[tabindex++]->flag & ARG_TERMINATOR)); } -int arg_parse(int argc, char** argv, void** argtable) { - struct arg_hdr** table = (struct arg_hdr**)argtable; - struct arg_end* endtable; + +int arg_parse(int argc, char * *argv, void * *argtable) { + struct arg_hdr * *table = (struct arg_hdr * *)argtable; + struct arg_end *endtable; int endindex; - char** argvcopy = NULL; - int i; + char * *argvcopy = NULL; /*printf("arg_parse(%d,%p,%p)\n",argc,argv,argtable);*/ @@ -5219,7 +4065,7 @@ int arg_parse(int argc, char** argv, void** argtable) { /* locate the first end-of-table marker within the array */ endindex = arg_endindex(table); - endtable = (struct arg_end*)table[endindex]; + endtable = (struct arg_end *)table[endindex]; /* Special case of argc==0. This can occur on Texas Instruments DSP. */ /* Failure to trap this case results in an unwanted NULL result from */ @@ -5232,34 +4078,41 @@ int arg_parse(int argc, char** argv, void** argtable) { return endtable->count; } - argvcopy = (char**)xmalloc(sizeof(char*) * (argc + 1)); + argvcopy = (char **)malloc(sizeof(char *) * (argc + 1)); + if (argvcopy) { + int i; - /* - Fill in the local copy of argv[]. We need a local copy - because getopt rearranges argv[] which adversely affects - susbsequent parsing attempts. - */ - for (i = 0; i < argc; i++) - argvcopy[i] = argv[i]; + /* + Fill in the local copy of argv[]. We need a local copy + because getopt rearranges argv[] which adversely affects + susbsequent parsing attempts. + */ + for (i = 0; i < argc; i++) + argvcopy[i] = argv[i]; - argvcopy[argc] = NULL; + argvcopy[argc] = NULL; - /* parse the command line (local copy) for tagged options */ - arg_parse_tagged(argc, argvcopy, table, endtable); + /* parse the command line (local copy) for tagged options */ + arg_parse_tagged(argc, argvcopy, table, endtable); - /* parse the command line (local copy) for untagged options */ - arg_parse_untagged(argc, argvcopy, table, endtable); + /* parse the command line (local copy) for untagged options */ + arg_parse_untagged(argc, argvcopy, table, endtable); - /* if no errors so far then perform post-parse checks otherwise dont bother */ - if (endtable->count == 0) - arg_parse_check(table, endtable); + /* if no errors so far then perform post-parse checks otherwise dont bother */ + if (endtable->count == 0) + arg_parse_check(table, endtable); - /* release the local copt of argv[] */ - xfree(argvcopy); + /* release the local copt of argv[] */ + free(argvcopy); + } else { + /* memory alloc failed */ + arg_register_error(endtable, endtable, ARG_EMALLOC, NULL); + } return endtable->count; } + /* * Concatenate contents of src[] string onto *pdest[] string. * The *pdest pointer is altered to point to the end of the @@ -5280,9 +4133,9 @@ int arg_parse(int argc, char** argv, void** argtable) { * dest[] == "goodbye cruel world!" * ndest == 10 */ -static void arg_cat(char** pdest, const char* src, size_t* pndest) { - char* dest = *pdest; - char* end = dest + *pndest; +static void arg_cat(char **pdest, const char *src, size_t *pndest) { + char *dest = *pdest; + char *end = dest + *pndest; /*locate null terminator of dest string */ while (dest < end && *dest != 0) @@ -5297,10 +4150,16 @@ static void arg_cat(char** pdest, const char* src, size_t* pndest) { /* update *pdest and *pndest */ *pndest = end - dest; - *pdest = dest; + *pdest = dest; } -static void arg_cat_option(char* dest, size_t ndest, const char* shortopts, const char* longopts, const char* datatype, int optvalue) { + +static void arg_cat_option(char *dest, + size_t ndest, + const char *shortopts, + const char *longopts, + const char *datatype, + int optvalue) { if (shortopts) { char option[3]; @@ -5328,7 +4187,7 @@ static void arg_cat_option(char* dest, size_t ndest, const char* shortopts, cons /* add comma separated option tag */ ncspn = strcspn(longopts, ","); -#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || (defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__)) +#ifdef __STDC_WANT_SECURE_LIB__ strncat_s(dest, ndest, longopts, (ncspn < ndest) ? ncspn : ndest); #else strncat(dest, longopts, (ncspn < ndest) ? ncspn : ndest); @@ -5353,12 +4212,17 @@ static void arg_cat_option(char* dest, size_t ndest, const char* shortopts, cons } } -static void -arg_cat_optionv(char* dest, size_t ndest, const char* shortopts, const char* longopts, const char* datatype, int optvalue, const char* separator) { +static void arg_cat_optionv(char *dest, + size_t ndest, + const char *shortopts, + const char *longopts, + const char *datatype, + int optvalue, + const char *separator) { separator = separator ? separator : ""; if (shortopts) { - const char* c = shortopts; + const char *c = shortopts; while (*c) { /* "-a|-b|-c" */ char shortopt[3]; @@ -5380,7 +4244,7 @@ arg_cat_optionv(char* dest, size_t ndest, const char* shortopts, const char* lon arg_cat(&dest, separator, &ndest); if (longopts) { - const char* c = longopts; + const char *c = longopts; while (*c) { size_t ncspn; @@ -5389,7 +4253,7 @@ arg_cat_optionv(char* dest, size_t ndest, const char* shortopts, const char* lon /* add comma separated option tag */ ncspn = strcspn(c, ","); -#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || (defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__)) +#ifdef __STDC_WANT_SECURE_LIB__ strncat_s(dest, ndest, c, (ncspn < ndest) ? ncspn : ndest); #else strncat(dest, c, (ncspn < ndest) ? ncspn : ndest); @@ -5419,38 +4283,46 @@ arg_cat_optionv(char* dest, size_t ndest, const char* shortopts, const char* lon } } -void arg_print_option_ds(arg_dstr_t ds, const char* shortopts, const char* longopts, const char* datatype, const char* suffix) { + +/* this function should be deprecated because it doesnt consider optional argument values (ARG_HASOPTVALUE) */ +void arg_print_option(FILE *fp, + const char *shortopts, + const char *longopts, + const char *datatype, + const char *suffix) { char syntax[200] = ""; suffix = suffix ? suffix : ""; /* there is no way of passing the proper optvalue for optional argument values here, so we must ignore it */ - arg_cat_optionv(syntax, sizeof(syntax), shortopts, longopts, datatype, 0, "|"); + arg_cat_optionv(syntax, + sizeof(syntax), + shortopts, + longopts, + datatype, + 0, + "|"); - arg_dstr_cat(ds, syntax); - arg_dstr_cat(ds, (char*)suffix); + fputs(syntax, fp); + fputs(suffix, fp); } -/* this function should be deprecated because it doesn't consider optional argument values (ARG_HASOPTVALUE) */ -void arg_print_option(FILE* fp, const char* shortopts, const char* longopts, const char* datatype, const char* suffix) { - arg_dstr_t ds = arg_dstr_create(); - arg_print_option_ds(ds, shortopts, longopts, datatype, suffix); - fputs(arg_dstr_cstr(ds), fp); - arg_dstr_destroy(ds); -} /* * Print a GNU style [OPTION] string in which all short options that * do not take argument values are presented in abbreviated form, as * in: -xvfsd, or -xvf[sd], or [-xvsfd] */ -static void arg_print_gnuswitch_ds(arg_dstr_t ds, struct arg_hdr** table) { +static +void arg_print_gnuswitch(FILE *fp, struct arg_hdr * *table) { int tabindex; - char* format1 = " -%c"; - char* format2 = " [-%c"; - char* suffix = ""; + const char *format1 = " -%c"; + const char *format2 = " [-%c"; + const char *suffix = ""; /* print all mandatory switches that are without argument values */ - for (tabindex = 0; table[tabindex] && !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { + for (tabindex = 0; + table[tabindex] && !(table[tabindex]->flag & ARG_TERMINATOR); + tabindex++) { /* skip optional options */ if (table[tabindex]->mincount < 1) continue; @@ -5464,13 +4336,15 @@ static void arg_print_gnuswitch_ds(arg_dstr_t ds, struct arg_hdr** table) { continue; /* print the short option (only the first short option char, ignore multiple choices)*/ - arg_dstr_catf(ds, format1, table[tabindex]->shortopts[0]); + fprintf(fp, format1, table[tabindex]->shortopts[0]); format1 = "%c"; format2 = "[%c"; } /* print all optional switches that are without argument values */ - for (tabindex = 0; table[tabindex] && !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { + for (tabindex = 0; + table[tabindex] && !(table[tabindex]->flag & ARG_TERMINATOR); + tabindex++) { /* skip mandatory args */ if (table[tabindex]->mincount > 0) continue; @@ -5484,161 +4358,142 @@ static void arg_print_gnuswitch_ds(arg_dstr_t ds, struct arg_hdr** table) { continue; /* print first short option */ - arg_dstr_catf(ds, format2, table[tabindex]->shortopts[0]); + fprintf(fp, format2, table[tabindex]->shortopts[0]); format2 = "%c"; suffix = "]"; } - arg_dstr_catf(ds, "%s", suffix); + fprintf(fp, "%s", suffix); } -void arg_print_syntax_ds(arg_dstr_t ds, void** argtable, const char* suffix) { - struct arg_hdr** table = (struct arg_hdr**)argtable; + +void arg_print_syntax(FILE *fp, void * *argtable, const char *suffix) { + struct arg_hdr * *table = (struct arg_hdr * *)argtable; int i, tabindex; /* print GNU style [OPTION] string */ - arg_print_gnuswitch_ds(ds, table); + arg_print_gnuswitch(fp, table); /* print remaining options in abbreviated style */ - for (tabindex = 0; table[tabindex] && !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { + for (tabindex = 0; + table[tabindex] && !(table[tabindex]->flag & ARG_TERMINATOR); + tabindex++) { char syntax[200] = ""; const char *shortopts, *longopts, *datatype; /* skip short options without arg values (they were printed by arg_print_gnu_switch) */ - if (table[tabindex]->shortopts && !(table[tabindex]->flag & ARG_HASVALUE)) + if (table[tabindex]->shortopts && + !(table[tabindex]->flag & ARG_HASVALUE)) continue; shortopts = table[tabindex]->shortopts; - longopts = table[tabindex]->longopts; - datatype = table[tabindex]->datatype; - arg_cat_option(syntax, sizeof(syntax), shortopts, longopts, datatype, table[tabindex]->flag & ARG_HASOPTVALUE); + longopts = table[tabindex]->longopts; + datatype = table[tabindex]->datatype; + arg_cat_option(syntax, + sizeof(syntax), + shortopts, + longopts, + datatype, + table[tabindex]->flag & ARG_HASOPTVALUE); if (strlen(syntax) > 0) { /* print mandatory instances of this option */ - for (i = 0; i < table[tabindex]->mincount; i++) { - arg_dstr_cat(ds, " "); - arg_dstr_cat(ds, syntax); - } + for (i = 0; i < table[tabindex]->mincount; i++) + fprintf(fp, " %s", syntax); /* print optional instances enclosed in "[..]" */ switch (table[tabindex]->maxcount - table[tabindex]->mincount) { case 0: break; case 1: - arg_dstr_cat(ds, " ["); - arg_dstr_cat(ds, syntax); - arg_dstr_cat(ds, "]"); + fprintf(fp, " [%s]", syntax); break; case 2: - arg_dstr_cat(ds, " ["); - arg_dstr_cat(ds, syntax); - arg_dstr_cat(ds, "]"); - arg_dstr_cat(ds, " ["); - arg_dstr_cat(ds, syntax); - arg_dstr_cat(ds, "]"); + fprintf(fp, " [%s] [%s]", syntax, syntax); break; default: - arg_dstr_cat(ds, " ["); - arg_dstr_cat(ds, syntax); - arg_dstr_cat(ds, "]..."); + fprintf(fp, " [%s]...", syntax); break; } } } - if (suffix) { - arg_dstr_cat(ds, (char*)suffix); - } + if (suffix) + fprintf(fp, "%s", suffix); } -void arg_print_syntax(FILE* fp, void** argtable, const char* suffix) { - arg_dstr_t ds = arg_dstr_create(); - arg_print_syntax_ds(ds, argtable, suffix); - fputs(arg_dstr_cstr(ds), fp); - arg_dstr_destroy(ds); -} -void arg_print_syntaxv_ds(arg_dstr_t ds, void** argtable, const char* suffix) { - struct arg_hdr** table = (struct arg_hdr**)argtable; +void arg_print_syntaxv(FILE *fp, void * *argtable, const char *suffix) { + struct arg_hdr * *table = (struct arg_hdr * *)argtable; int i, tabindex; /* print remaining options in abbreviated style */ - for (tabindex = 0; table[tabindex] && !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { + for (tabindex = 0; + table[tabindex] && !(table[tabindex]->flag & ARG_TERMINATOR); + tabindex++) { char syntax[200] = ""; const char *shortopts, *longopts, *datatype; shortopts = table[tabindex]->shortopts; - longopts = table[tabindex]->longopts; - datatype = table[tabindex]->datatype; - arg_cat_optionv(syntax, sizeof(syntax), shortopts, longopts, datatype, table[tabindex]->flag & ARG_HASOPTVALUE, "|"); + longopts = table[tabindex]->longopts; + datatype = table[tabindex]->datatype; + arg_cat_optionv(syntax, + sizeof(syntax), + shortopts, + longopts, + datatype, + table[tabindex]->flag & ARG_HASOPTVALUE, + "|"); /* print mandatory options */ - for (i = 0; i < table[tabindex]->mincount; i++) { - arg_dstr_cat(ds, " "); - arg_dstr_cat(ds, syntax); - } + for (i = 0; i < table[tabindex]->mincount; i++) + fprintf(fp, " %s", syntax); /* print optional args enclosed in "[..]" */ switch (table[tabindex]->maxcount - table[tabindex]->mincount) { case 0: break; case 1: - arg_dstr_cat(ds, " ["); - arg_dstr_cat(ds, syntax); - arg_dstr_cat(ds, "]"); + fprintf(fp, " [%s]", syntax); break; case 2: - arg_dstr_cat(ds, " ["); - arg_dstr_cat(ds, syntax); - arg_dstr_cat(ds, "]"); - arg_dstr_cat(ds, " ["); - arg_dstr_cat(ds, syntax); - arg_dstr_cat(ds, "]"); + fprintf(fp, " [%s] [%s]", syntax, syntax); break; default: - arg_dstr_cat(ds, " ["); - arg_dstr_cat(ds, syntax); - arg_dstr_cat(ds, "]..."); + fprintf(fp, " [%s]...", syntax); break; } } - if (suffix) { - arg_dstr_cat(ds, (char*)suffix); - } + if (suffix) + fprintf(fp, "%s", suffix); } -void arg_print_syntaxv(FILE* fp, void** argtable, const char* suffix) { - arg_dstr_t ds = arg_dstr_create(); - arg_print_syntaxv_ds(ds, argtable, suffix); - fputs(arg_dstr_cstr(ds), fp); - arg_dstr_destroy(ds); -} -void arg_print_glossary_ds(arg_dstr_t ds, void** argtable, const char* format) { - struct arg_hdr** table = (struct arg_hdr**)argtable; +void arg_print_glossary(FILE *fp, void * *argtable, const char *format) { + struct arg_hdr * *table = (struct arg_hdr * *)argtable; int tabindex; format = format ? format : " %-20s %s\n"; for (tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { if (table[tabindex]->glossary) { char syntax[200] = ""; - const char* shortopts = table[tabindex]->shortopts; - const char* longopts = table[tabindex]->longopts; - const char* datatype = table[tabindex]->datatype; - const char* glossary = table[tabindex]->glossary; - arg_cat_optionv(syntax, sizeof(syntax), shortopts, longopts, datatype, table[tabindex]->flag & ARG_HASOPTVALUE, ", "); - arg_dstr_catf(ds, format, syntax, glossary); + const char *shortopts = table[tabindex]->shortopts; + const char *longopts = table[tabindex]->longopts; + const char *datatype = table[tabindex]->datatype; + const char *glossary = table[tabindex]->glossary; + arg_cat_optionv(syntax, + sizeof(syntax), + shortopts, + longopts, + datatype, + table[tabindex]->flag & ARG_HASOPTVALUE, + ", "); + fprintf(fp, format, syntax, glossary); } } } -void arg_print_glossary(FILE* fp, void** argtable, const char* format) { - arg_dstr_t ds = arg_dstr_create(); - arg_print_glossary_ds(ds, argtable, format); - fputs(arg_dstr_cstr(ds), fp); - arg_dstr_destroy(ds); -} /** * Print a piece of text formatted, which means in a column with a @@ -5672,62 +4527,62 @@ void arg_print_glossary(FILE* fp, void** argtable, const char* format) { * * Author: Uli Fouquet */ -static void arg_print_formatted_ds(arg_dstr_t ds, const unsigned lmargin, const unsigned rmargin, const char* text) { - const unsigned int textlen = (unsigned int)strlen(text); - unsigned int line_start = 0; - unsigned int line_end = textlen; - const unsigned int colwidth = (rmargin - lmargin) + 1; - - assert(strlen(text) < UINT_MAX); +static +void arg_print_formatted(FILE *fp, + const unsigned lmargin, + const unsigned rmargin, + const char *text) { + const unsigned textlen = (unsigned)strlen(text); + unsigned line_start = 0; + unsigned line_end = textlen + 1; + const unsigned colwidth = (rmargin - lmargin) + 1; /* Someone doesn't like us... */ - if (line_end < line_start) { - arg_dstr_catf(ds, "%s\n", text); + if (line_end == line_start) { + fprintf(fp, "%s\n", text); } - while (line_end > line_start) { - /* Eat leading white spaces. This is essential because while + while (line_end - 1 > line_start) { + /* Eat leading whitespaces. This is essential because while wrapping lines, there will often be a whitespace at beginning of line */ - while (isspace(*(text + line_start))) { - line_start++; - } + while (ISSPACE(*(text + line_start))) + { line_start++; } + + if ((line_end - line_start) > colwidth) + { line_end = line_start + colwidth; } /* Find last whitespace, that fits into line */ - if (line_end - line_start > colwidth) { - line_end = line_start + colwidth; + while ((line_end > line_start) + && (line_end - line_start > colwidth) + && !ISSPACE(*(text + line_end))) + { line_end--; } - while ((line_end > line_start) && !isspace(*(text + line_end))) { - line_end--; - } - - /* Consume trailing spaces */ - while ((line_end > line_start) && isspace(*(text + line_end))) { - line_end--; - } - - /* Restore the last non-space character */ - line_end++; - } + /* Do not print trailing whitespace. If this text + has got only one line, line_end now points to the + last char due to initialization. */ + line_end--; /* Output line of text */ while (line_start < line_end) { - char c = *(text + line_start); - arg_dstr_catc(ds, c); + fputc(*(text + line_start), fp); line_start++; } - arg_dstr_cat(ds, "\n"); + fputc('\n', fp); /* Initialize another line */ - if (line_end < textlen) { + if (line_end + 1 < textlen) { unsigned i; - for (i = 0; i < lmargin; i++) { - arg_dstr_cat(ds, " "); - } + for (i = 0; i < lmargin; i++) + { fputc(' ', fp); } line_end = textlen; } + + /* If we have to print another line, get also the last char. */ + line_end++; + } /* lines of text */ } @@ -5740,17 +4595,17 @@ static void arg_print_formatted_ds(arg_dstr_t ds, const unsigned lmargin, const * * Contributed by Uli Fouquet */ -void arg_print_glossary_gnu_ds(arg_dstr_t ds, void** argtable) { - struct arg_hdr** table = (struct arg_hdr**)argtable; +void arg_print_glossary_gnu(FILE *fp, void * *argtable) { + struct arg_hdr * *table = (struct arg_hdr * *)argtable; int tabindex; for (tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { if (table[tabindex]->glossary) { char syntax[200] = ""; - const char* shortopts = table[tabindex]->shortopts; - const char* longopts = table[tabindex]->longopts; - const char* datatype = table[tabindex]->datatype; - const char* glossary = table[tabindex]->glossary; + const char *shortopts = table[tabindex]->shortopts; + const char *longopts = table[tabindex]->longopts; + const char *datatype = table[tabindex]->datatype; + const char *glossary = table[tabindex]->glossary; if (!shortopts && longopts) { /* Indent trailing line by 4 spaces... */ @@ -5758,35 +4613,35 @@ void arg_print_glossary_gnu_ds(arg_dstr_t ds, void** argtable) { *(syntax + 4) = '\0'; } - arg_cat_optionv(syntax, sizeof(syntax), shortopts, longopts, datatype, table[tabindex]->flag & ARG_HASOPTVALUE, ", "); + arg_cat_optionv(syntax, + sizeof(syntax), + shortopts, + longopts, + datatype, + table[tabindex]->flag & ARG_HASOPTVALUE, + ", "); /* If syntax fits not into column, print glossary in new line... */ if (strlen(syntax) > 25) { - arg_dstr_catf(ds, " %-25s %s\n", syntax, ""); + fprintf(fp, " %-25s %s\n", syntax, ""); *syntax = '\0'; } - arg_dstr_catf(ds, " %-25s ", syntax); - arg_print_formatted_ds(ds, 28, 79, glossary); + fprintf(fp, " %-25s ", syntax); + arg_print_formatted(fp, 28, 79, glossary); } } /* for each table entry */ - arg_dstr_cat(ds, "\n"); + fputc('\n', fp); } -void arg_print_glossary_gnu(FILE* fp, void** argtable) { - arg_dstr_t ds = arg_dstr_create(); - arg_print_glossary_gnu_ds(ds, argtable); - fputs(arg_dstr_cstr(ds), fp); - arg_dstr_destroy(ds); -} /** * Checks the argtable[] array for NULL entries and returns 1 * if any are found, zero otherwise. */ -int arg_nullcheck(void** argtable) { - struct arg_hdr** table = (struct arg_hdr**)argtable; +int arg_nullcheck(void * *argtable) { + struct arg_hdr * *table = (struct arg_hdr * *)argtable; int tabindex; /*printf("arg_nullcheck(%p)\n",argtable);*/ @@ -5814,8 +4669,8 @@ int arg_nullcheck(void** argtable) { * with the newer arg_freetable() function. * We still keep arg_free() for backwards compatibility. */ -void arg_free(void** argtable) { - struct arg_hdr** table = (struct arg_hdr**)argtable; +void arg_free(void * *argtable) { + struct arg_hdr * *table = (struct arg_hdr * *)argtable; int tabindex = 0; int flag; /*printf("arg_free(%p)\n",argtable);*/ @@ -5830,31 +4685,23 @@ void arg_free(void** argtable) { break; flag = table[tabindex]->flag; - xfree(table[tabindex]); + free(table[tabindex]); table[tabindex++] = NULL; } while (!(flag & ARG_TERMINATOR)); } /* frees each non-NULL element of argtable[], where n is the size of the number of entries in the array */ -void arg_freetable(void** argtable, size_t n) { - struct arg_hdr** table = (struct arg_hdr**)argtable; +void arg_freetable(void * *argtable, size_t n) { + struct arg_hdr * *table = (struct arg_hdr * *)argtable; size_t tabindex = 0; /*printf("arg_freetable(%p)\n",argtable);*/ for (tabindex = 0; tabindex < n; tabindex++) { if (table[tabindex] == NULL) continue; - xfree(table[tabindex]); + free(table[tabindex]); table[tabindex] = NULL; }; } -#ifdef _WIN32 -BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { - return TRUE; - UNREFERENCED_PARAMETER(hinstDLL); - UNREFERENCED_PARAMETER(fdwReason); - UNREFERENCED_PARAMETER(lpvReserved); -} -#endif diff --git a/client/deps/cliparser/argtable3.h b/client/deps/cliparser/argtable3.h index 204253876..d8e3c53cc 100644 --- a/client/deps/cliparser/argtable3.h +++ b/client/deps/cliparser/argtable3.h @@ -33,8 +33,8 @@ #ifndef ARGTABLE3 #define ARGTABLE3 -#include /* FILE */ -#include /* struct tm */ +#include /* FILE */ +#include /* struct tm */ #ifdef __cplusplus extern "C" { @@ -50,226 +50,259 @@ extern "C" { #endif /* ARG_REPLACE_GETOPT */ /* bit masks for arg_hdr.flag */ -enum { ARG_TERMINATOR = 0x1, ARG_HASVALUE = 0x2, ARG_HASOPTVALUE = 0x4 }; +enum { + ARG_TERMINATOR = 0x1, + ARG_HASVALUE = 0x2, + ARG_HASOPTVALUE = 0x4 +}; -#if defined(_WIN32) - #if defined(argtable3_EXPORTS) - #define ARG_EXTERN __declspec(dllexport) - #elif defined(argtable3_IMPORTS) - #define ARG_EXTERN __declspec(dllimport) - #else - #define ARG_EXTERN - #endif -#else - #define ARG_EXTERN -#endif +typedef void (arg_resetfn)(void *parent); +typedef int (arg_scanfn)(void *parent, const char *argval); +typedef int (arg_checkfn)(void *parent); +typedef void (arg_errorfn)(void *parent, FILE *fp, int error, const char *argval, const char *progname); -typedef struct _internal_arg_dstr* arg_dstr_t; -typedef void* arg_cmd_itr_t; - -typedef void(arg_resetfn)(void* parent); -typedef int(arg_scanfn)(void* parent, const char* argval); -typedef int(arg_checkfn)(void* parent); -typedef void(arg_errorfn)(void* parent, arg_dstr_t ds, int error, const char* argval, const char* progname); -typedef void(arg_dstr_freefn)(char* buf); -typedef int(arg_cmdfn)(int argc, char* argv[], arg_dstr_t res); -typedef int(arg_comparefn)(const void* k1, const void* k2); /* - * The arg_hdr struct defines properties that are common to all arg_xxx structs. - * The argtable library requires each arg_xxx struct to have an arg_hdr - * struct as its first data member. - * The argtable library functions then use this data to identify the - * properties of the command line option, such as its option tags, - * datatype string, and glossary strings, and so on. - * Moreover, the arg_hdr struct contains pointers to custom functions that - * are provided by each arg_xxx struct which perform the tasks of parsing - * that particular arg_xxx arguments, performing post-parse checks, and - * reporting errors. - * These functions are private to the individual arg_xxx source code - * and are the pointer to them are initiliased by that arg_xxx struct's - * constructor function. The user could alter them after construction - * if desired, but the original intention is for them to be set by the - * constructor and left unaltered. - */ +* The arg_hdr struct defines properties that are common to all arg_xxx structs. +* The argtable library requires each arg_xxx struct to have an arg_hdr +* struct as its first data member. +* The argtable library functions then use this data to identify the +* properties of the command line option, such as its option tags, +* datatype string, and glossary strings, and so on. +* Moreover, the arg_hdr struct contains pointers to custom functions that +* are provided by each arg_xxx struct which perform the tasks of parsing +* that particular arg_xxx arguments, performing post-parse checks, and +* reporting errors. +* These functions are private to the individual arg_xxx source code +* and are the pointer to them are initiliased by that arg_xxx struct's +* constructor function. The user could alter them after construction +* if desired, but the original intention is for them to be set by the +* constructor and left unaltered. +*/ struct arg_hdr { - char flag; /* Modifier flags: ARG_TERMINATOR, ARG_HASVALUE. */ - const char* shortopts; /* String defining the short options */ - const char* longopts; /* String defiing the long options */ - const char* datatype; /* Description of the argument data type */ - const char* glossary; /* Description of the option as shown by arg_print_glossary function */ - int mincount; /* Minimum number of occurences of this option accepted */ - int maxcount; /* Maximum number of occurences if this option accepted */ - void* parent; /* Pointer to parent arg_xxx struct */ - arg_resetfn* resetfn; /* Pointer to parent arg_xxx reset function */ - arg_scanfn* scanfn; /* Pointer to parent arg_xxx scan function */ - arg_checkfn* checkfn; /* Pointer to parent arg_xxx check function */ - arg_errorfn* errorfn; /* Pointer to parent arg_xxx error function */ - void* priv; /* Pointer to private header data for use by arg_xxx functions */ + char flag; /* Modifier flags: ARG_TERMINATOR, ARG_HASVALUE. */ + const char *shortopts; /* String defining the short options */ + const char *longopts; /* String defiing the long options */ + const char *datatype; /* Description of the argument data type */ + const char *glossary; /* Description of the option as shown by arg_print_glossary function */ + int mincount; /* Minimum number of occurences of this option accepted */ + int maxcount; /* Maximum number of occurences if this option accepted */ + void *parent; /* Pointer to parent arg_xxx struct */ + arg_resetfn *resetfn; /* Pointer to parent arg_xxx reset function */ + arg_scanfn *scanfn; /* Pointer to parent arg_xxx scan function */ + arg_checkfn *checkfn; /* Pointer to parent arg_xxx check function */ + arg_errorfn *errorfn; /* Pointer to parent arg_xxx error function */ + void *priv; /* Pointer to private header data for use by arg_xxx functions */ }; struct arg_rem { - struct arg_hdr hdr; /* The mandatory argtable header struct */ + struct arg_hdr hdr; /* The mandatory argtable header struct */ }; struct arg_lit { - struct arg_hdr hdr; /* The mandatory argtable header struct */ - int count; /* Number of matching command line args */ + struct arg_hdr hdr; /* The mandatory argtable header struct */ + int count; /* Number of matching command line args */ }; struct arg_int { - struct arg_hdr hdr; /* The mandatory argtable header struct */ - int count; /* Number of matching command line args */ - int* ival; /* Array of parsed argument values */ + struct arg_hdr hdr; /* The mandatory argtable header struct */ + int count; /* Number of matching command line args */ + int *ival; /* Array of parsed argument values */ }; struct arg_dbl { - struct arg_hdr hdr; /* The mandatory argtable header struct */ - int count; /* Number of matching command line args */ - double* dval; /* Array of parsed argument values */ + struct arg_hdr hdr; /* The mandatory argtable header struct */ + int count; /* Number of matching command line args */ + double *dval; /* Array of parsed argument values */ }; struct arg_str { - struct arg_hdr hdr; /* The mandatory argtable header struct */ - int count; /* Number of matching command line args */ - const char** sval; /* Array of parsed argument values */ + struct arg_hdr hdr; /* The mandatory argtable header struct */ + int count; /* Number of matching command line args */ + const char **sval; /* Array of parsed argument values */ }; struct arg_rex { - struct arg_hdr hdr; /* The mandatory argtable header struct */ - int count; /* Number of matching command line args */ - const char** sval; /* Array of parsed argument values */ + struct arg_hdr hdr; /* The mandatory argtable header struct */ + int count; /* Number of matching command line args */ + const char **sval; /* Array of parsed argument values */ }; struct arg_file { - struct arg_hdr hdr; /* The mandatory argtable header struct */ - int count; /* Number of matching command line args*/ - const char** filename; /* Array of parsed filenames (eg: /home/foo.bar) */ - const char** basename; /* Array of parsed basenames (eg: foo.bar) */ - const char** extension; /* Array of parsed extensions (eg: .bar) */ + struct arg_hdr hdr; /* The mandatory argtable header struct */ + int count; /* Number of matching command line args*/ + const char **filename; /* Array of parsed filenames (eg: /home/foo.bar) */ + const char **basename; /* Array of parsed basenames (eg: foo.bar) */ + const char **extension; /* Array of parsed extensions (eg: .bar) */ }; struct arg_date { - struct arg_hdr hdr; /* The mandatory argtable header struct */ - const char* format; /* strptime format string used to parse the date */ - int count; /* Number of matching command line args */ - struct tm* tmval; /* Array of parsed time values */ + struct arg_hdr hdr; /* The mandatory argtable header struct */ + const char *format; /* strptime format string used to parse the date */ + int count; /* Number of matching command line args */ + struct tm *tmval; /* Array of parsed time values */ }; -enum { ARG_ELIMIT = 1, ARG_EMALLOC, ARG_ENOMATCH, ARG_ELONGOPT, ARG_EMISSARG }; +enum {ARG_ELIMIT = 1, ARG_EMALLOC, ARG_ENOMATCH, ARG_ELONGOPT, ARG_EMISSARG}; struct arg_end { - struct arg_hdr hdr; /* The mandatory argtable header struct */ - int count; /* Number of errors encountered */ - int* error; /* Array of error codes */ - void** parent; /* Array of pointers to offending arg_xxx struct */ - const char** argval; /* Array of pointers to offending argv[] string */ + struct arg_hdr hdr; /* The mandatory argtable header struct */ + int count; /* Number of errors encountered */ + int *error; /* Array of error codes */ + void **parent; /* Array of pointers to offending arg_xxx struct */ + const char **argval; /* Array of pointers to offending argv[] string */ }; +/* typedef struct arg_cmd_info { char name[ARG_CMD_NAME_LEN]; char description[ARG_CMD_DESCRIPTION_LEN]; arg_cmdfn* proc; } arg_cmd_info_t; +*/ /**** arg_xxx constructor functions *********************************/ -ARG_EXTERN struct arg_rem* arg_rem(const char* datatype, const char* glossary); +struct arg_rem *arg_rem(const char *datatype, const char *glossary); -ARG_EXTERN struct arg_lit* arg_lit0(const char* shortopts, const char* longopts, const char* glossary); -ARG_EXTERN struct arg_lit* arg_lit1(const char* shortopts, const char* longopts, const char* glossary); -ARG_EXTERN struct arg_lit* arg_litn(const char* shortopts, const char* longopts, int mincount, int maxcount, const char* glossary); +struct arg_lit *arg_lit0(const char *shortopts, + const char *longopts, + const char *glossary); +struct arg_lit *arg_lit1(const char *shortopts, + const char *longopts, + const char *glossary); +struct arg_lit *arg_litn(const char *shortopts, + const char *longopts, + int mincount, + int maxcount, + const char *glossary); -ARG_EXTERN struct arg_key* arg_key0(const char* keyword, int flags, const char* glossary); -ARG_EXTERN struct arg_key* arg_key1(const char* keyword, int flags, const char* glossary); -ARG_EXTERN struct arg_key* arg_keyn(const char* keyword, int flags, int mincount, int maxcount, const char* glossary); +struct arg_key *arg_key0(const char *keyword, + int flags, + const char *glossary); +struct arg_key *arg_key1(const char *keyword, + int flags, + const char *glossary); +struct arg_key *arg_keyn(const char *keyword, + int flags, + int mincount, + int maxcount, + const char *glossary); -ARG_EXTERN struct arg_int* arg_int0(const char* shortopts, const char* longopts, const char* datatype, const char* glossary); -ARG_EXTERN struct arg_int* arg_int1(const char* shortopts, const char* longopts, const char* datatype, const char* glossary); -ARG_EXTERN struct arg_int* arg_intn(const char* shortopts, const char* longopts, const char* datatype, int mincount, int maxcount, const char* glossary); +struct arg_int *arg_int0(const char *shortopts, + const char *longopts, + const char *datatype, + const char *glossary); +struct arg_int *arg_int1(const char *shortopts, + const char *longopts, + const char *datatype, + const char *glossary); +struct arg_int *arg_intn(const char *shortopts, + const char *longopts, + const char *datatype, + int mincount, + int maxcount, + const char *glossary); -ARG_EXTERN struct arg_dbl* arg_dbl0(const char* shortopts, const char* longopts, const char* datatype, const char* glossary); -ARG_EXTERN struct arg_dbl* arg_dbl1(const char* shortopts, const char* longopts, const char* datatype, const char* glossary); -ARG_EXTERN struct arg_dbl* arg_dbln(const char* shortopts, const char* longopts, const char* datatype, int mincount, int maxcount, const char* glossary); +struct arg_dbl *arg_dbl0(const char *shortopts, + const char *longopts, + const char *datatype, + const char *glossary); +struct arg_dbl *arg_dbl1(const char *shortopts, + const char *longopts, + const char *datatype, + const char *glossary); +struct arg_dbl *arg_dbln(const char *shortopts, + const char *longopts, + const char *datatype, + int mincount, + int maxcount, + const char *glossary); -ARG_EXTERN struct arg_str* arg_str0(const char* shortopts, const char* longopts, const char* datatype, const char* glossary); -ARG_EXTERN struct arg_str* arg_str1(const char* shortopts, const char* longopts, const char* datatype, const char* glossary); -ARG_EXTERN struct arg_str* arg_strn(const char* shortopts, const char* longopts, const char* datatype, int mincount, int maxcount, const char* glossary); +struct arg_str *arg_str0(const char *shortopts, + const char *longopts, + const char *datatype, + const char *glossary); +struct arg_str *arg_str1(const char *shortopts, + const char *longopts, + const char *datatype, + const char *glossary); +struct arg_str *arg_strn(const char *shortopts, + const char *longopts, + const char *datatype, + int mincount, + int maxcount, + const char *glossary); -ARG_EXTERN struct arg_rex* arg_rex0(const char* shortopts, const char* longopts, const char* pattern, const char* datatype, int flags, const char* glossary); -ARG_EXTERN struct arg_rex* arg_rex1(const char* shortopts, const char* longopts, const char* pattern, const char* datatype, int flags, const char* glossary); -ARG_EXTERN struct arg_rex* arg_rexn(const char* shortopts, - const char* longopts, - const char* pattern, - const char* datatype, +struct arg_rex *arg_rex0(const char *shortopts, + const char *longopts, + const char *pattern, + const char *datatype, + int flags, + const char *glossary); +struct arg_rex *arg_rex1(const char *shortopts, + const char *longopts, + const char *pattern, + const char *datatype, + int flags, + const char *glossary); +struct arg_rex *arg_rexn(const char *shortopts, + const char *longopts, + const char *pattern, + const char *datatype, int mincount, int maxcount, int flags, - const char* glossary); + const char *glossary); -ARG_EXTERN struct arg_file* arg_file0(const char* shortopts, const char* longopts, const char* datatype, const char* glossary); -ARG_EXTERN struct arg_file* arg_file1(const char* shortopts, const char* longopts, const char* datatype, const char* glossary); -ARG_EXTERN struct arg_file* arg_filen(const char* shortopts, const char* longopts, const char* datatype, int mincount, int maxcount, const char* glossary); +struct arg_file *arg_file0(const char *shortopts, + const char *longopts, + const char *datatype, + const char *glossary); +struct arg_file *arg_file1(const char *shortopts, + const char *longopts, + const char *datatype, + const char *glossary); +struct arg_file *arg_filen(const char *shortopts, + const char *longopts, + const char *datatype, + int mincount, + int maxcount, + const char *glossary); -ARG_EXTERN struct arg_date* arg_date0(const char* shortopts, const char* longopts, const char* format, const char* datatype, const char* glossary); -ARG_EXTERN struct arg_date* arg_date1(const char* shortopts, const char* longopts, const char* format, const char* datatype, const char* glossary); -ARG_EXTERN struct arg_date* arg_daten(const char* shortopts, const char* longopts, const char* format, const char* datatype, int mincount, int maxcount, const char* glossary); +struct arg_date *arg_date0(const char *shortopts, + const char *longopts, + const char *format, + const char *datatype, + const char *glossary); +struct arg_date *arg_date1(const char *shortopts, + const char *longopts, + const char *format, + const char *datatype, + const char *glossary); +struct arg_date *arg_daten(const char *shortopts, + const char *longopts, + const char *format, + const char *datatype, + int mincount, + int maxcount, + const char *glossary); -ARG_EXTERN struct arg_end* arg_end(int maxerrors); +struct arg_end *arg_end(int maxcount); -#define ARG_DSTR_STATIC ((arg_dstr_freefn*)0) -#define ARG_DSTR_VOLATILE ((arg_dstr_freefn*)1) -#define ARG_DSTR_DYNAMIC ((arg_dstr_freefn*)3) /**** other functions *******************************************/ -ARG_EXTERN int arg_nullcheck(void** argtable); -ARG_EXTERN int arg_parse(int argc, char** argv, void** argtable); -ARG_EXTERN void arg_print_option(FILE* fp, const char* shortopts, const char* longopts, const char* datatype, const char* suffix); -ARG_EXTERN void arg_print_syntax(FILE* fp, void** argtable, const char* suffix); -ARG_EXTERN void arg_print_syntaxv(FILE* fp, void** argtable, const char* suffix); -ARG_EXTERN void arg_print_glossary(FILE* fp, void** argtable, const char* format); -ARG_EXTERN void arg_print_glossary_gnu(FILE* fp, void** argtable); -ARG_EXTERN void arg_print_errors(FILE* fp, struct arg_end* end, const char* progname); -ARG_EXTERN void arg_print_option_ds(arg_dstr_t ds, const char* shortopts, const char* longopts, const char* datatype, const char* suffix); -ARG_EXTERN void arg_print_syntax_ds(arg_dstr_t ds, void** argtable, const char* suffix); -ARG_EXTERN void arg_print_syntaxv_ds(arg_dstr_t ds, void** argtable, const char* suffix); -ARG_EXTERN void arg_print_glossary_ds(arg_dstr_t ds, void** argtable, const char* format); -ARG_EXTERN void arg_print_glossary_gnu_ds(arg_dstr_t ds, void** argtable); -ARG_EXTERN void arg_print_errors_ds(arg_dstr_t ds, struct arg_end* end, const char* progname); -ARG_EXTERN void arg_freetable(void** argtable, size_t n); - -ARG_EXTERN arg_dstr_t arg_dstr_create(void); -ARG_EXTERN void arg_dstr_destroy(arg_dstr_t ds); -ARG_EXTERN void arg_dstr_reset(arg_dstr_t ds); -ARG_EXTERN void arg_dstr_free(arg_dstr_t ds); -ARG_EXTERN void arg_dstr_set(arg_dstr_t ds, char* str, arg_dstr_freefn* free_proc); -ARG_EXTERN void arg_dstr_cat(arg_dstr_t ds, const char* str); -ARG_EXTERN void arg_dstr_catc(arg_dstr_t ds, char c); -ARG_EXTERN void arg_dstr_catf(arg_dstr_t ds, const char* fmt, ...); -ARG_EXTERN char* arg_dstr_cstr(arg_dstr_t ds); - -ARG_EXTERN void arg_cmd_init(void); -ARG_EXTERN void arg_cmd_uninit(void); -ARG_EXTERN void arg_cmd_register(const char* name, arg_cmdfn* proc, const char* description); -ARG_EXTERN void arg_cmd_unregister(const char* name); -ARG_EXTERN int arg_cmd_dispatch(const char* name, int argc, char* argv[], arg_dstr_t res); -ARG_EXTERN unsigned int arg_cmd_count(void); -ARG_EXTERN arg_cmd_info_t* arg_cmd_info(const char* name); -ARG_EXTERN arg_cmd_itr_t arg_cmd_itr_create(void); -ARG_EXTERN void arg_cmd_itr_destroy(arg_cmd_itr_t itr); -ARG_EXTERN int arg_cmd_itr_advance(arg_cmd_itr_t itr); -ARG_EXTERN char* arg_cmd_itr_key(arg_cmd_itr_t itr); -ARG_EXTERN arg_cmd_info_t* arg_cmd_itr_value(arg_cmd_itr_t itr); -ARG_EXTERN int arg_cmd_itr_search(arg_cmd_itr_t itr, void* k); -ARG_EXTERN void arg_mgsort(void* data, int size, int esize, int i, int k, arg_comparefn* comparefn); -ARG_EXTERN void arg_make_get_help_msg(arg_dstr_t res); -ARG_EXTERN void arg_make_help_msg(arg_dstr_t ds, char* cmd_name, void** argtable); -ARG_EXTERN void arg_make_syntax_err_msg(arg_dstr_t ds, void** argtable, struct arg_end* end); -ARG_EXTERN int arg_make_syntax_err_help_msg(arg_dstr_t ds, char* name, int help, int nerrors, void** argtable, struct arg_end* end, int* exitcode); -ARG_EXTERN void arg_set_module_name(const char* name); -ARG_EXTERN void arg_set_module_version(int major, int minor, int patch, const char* tag); +int arg_nullcheck(void **argtable); +int arg_parse(int argc, char **argv, void **argtable); +void arg_print_option(FILE *fp, const char *shortopts, const char *longopts, const char *datatype, const char *suffix); +void arg_print_syntax(FILE *fp, void **argtable, const char *suffix); +void arg_print_syntaxv(FILE *fp, void **argtable, const char *suffix); +void arg_print_glossary(FILE *fp, void **argtable, const char *format); +void arg_print_glossary_gnu(FILE *fp, void **argtable); +void arg_print_errors(FILE *fp, struct arg_end *end, const char *progname); +void arg_freetable(void **argtable, size_t n); /**** deprecated functions, for back-compatibility only ********/ -ARG_EXTERN void arg_free(void** argtable); +void arg_free(void **argtable); #ifdef __cplusplus } From e8999f3318ee8c8234d0dae73d0f15fd7a4b8e62 Mon Sep 17 00:00:00 2001 From: dxl <64101226@qq.com> Date: Thu, 7 May 2020 16:57:15 +0800 Subject: [PATCH 090/632] Translation some comments from Chinese to English. --- client/android/CMakeLists.txt | 19 ++++++++------- client/android/jni_tools.c | 41 +++++++++----------------------- client/android/jni_tools.h | 14 +++++------ client/android/pm3_main.c | 44 ++++++++++++++++------------------- 4 files changed, 48 insertions(+), 70 deletions(-) diff --git a/client/android/CMakeLists.txt b/client/android/CMakeLists.txt index d320db6a1..1e03d1658 100644 --- a/client/android/CMakeLists.txt +++ b/client/android/CMakeLists.txt @@ -1,17 +1,20 @@ -#需要的最cmake版本 +# version cmake_minimum_required(VERSION 3.4.1) -#添加预编译宏定义参数,此次的作用是开启配置文件的引入! +# We are build on android platform, so we need add def "ANDROID" +# NDK version for SDK 19 doesn't implement the whole C++11 standard in the STL. +# see: https://stackoverflow.com/questions/44736135/ndk-clang-error-undefined-reference-to-localeconv +# so we need add def getlocaledecpoint()='.' add_definitions(-DANDROID -D"getlocaledecpoint()='.'" -DZ_SOLO) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -O3 -fvisibility=hidden -w") -#缩短路径定义 +# Root path into client set(PM3_ROOT ../../) add_subdirectory(../deps deps) -#添加动态库定义 +# client resources add_library(pm3rrg_rdv4 SHARED ${PM3_ROOT}/common/util_posix.c ${PM3_ROOT}/common/crapto1/crapto1.c @@ -143,13 +146,12 @@ add_library(pm3rrg_rdv4 SHARED ${PM3_ROOT}/client/src/cmdlfpcf7931.c ${PM3_ROOT}/client/src/cmdhfmfhard.c ${PM3_ROOT}/client/src/cmdusart.c - - # android source + # android resources jni_tools.c pm3_main.c ) -#添加头文件配置 +# includes target_include_directories(pm3rrg_rdv4 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${PM3_ROOT}/include/ @@ -166,5 +168,4 @@ find_library(pm3rrg_rdv4_reveng REQUIRED) find_library(pm3rrg_rdv4_z REQUIRED) find_library(pm3rrg_rdv4_hardnested REQUIRED) -target_link_libraries(pm3rrg_rdv4 pm3rrg_rdv4_hardnested pm3rrg_rdv4_mbedtls pm3rrg_rdv4_cliparser pm3rrg_rdv4_jansson pm3rrg_rdv4_lua pm3rrg_rdv4_tinycbor pm3rrg_rdv4_amiibo pm3rrg_rdv4_reveng pm3rrg_rdv4_z android log) -#添加动态库链接! +target_link_libraries(pm3rrg_rdv4 pm3rrg_rdv4_hardnested pm3rrg_rdv4_mbedtls pm3rrg_rdv4_cliparser pm3rrg_rdv4_jansson pm3rrg_rdv4_lua pm3rrg_rdv4_tinycbor pm3rrg_rdv4_amiibo pm3rrg_rdv4_reveng pm3rrg_rdv4_z android log) \ No newline at end of file diff --git a/client/android/jni_tools.c b/client/android/jni_tools.c index 1a5fc9592..6e12da2be 100644 --- a/client/android/jni_tools.c +++ b/client/android/jni_tools.c @@ -7,10 +7,10 @@ #include #include "stdbool.h" -//当前线程是否添加的标志位 +// native thread attach label static bool g_IsAttach; -//TODO 环境变量获取函数 +// get current env for jvm JNIEnv *getJniEnv() { JNIEnv *currentThreadEnv; g_IsAttach = false; @@ -32,66 +32,47 @@ JNIEnv *getJniEnv() { } } -//解绑线程env -void deatchThread() { +// detach native thread from jvm +void detachThread() { if (g_IsAttach) { - LOGD("线程解绑成功!"); (*g_JavaVM)->DetachCurrentThread(g_JavaVM); } } -//TODO 命令行解析 +// cmd arg parse CMD *parse_command_line(const char *commandStr) { - //一个指针,指向传进来的命令字符串(const修饰的,我们需要复刻一份!) CMD *cmd = (CMD *) malloc(sizeof(CMD)); if (!cmd) { - LOGD("申请空间失败!"); return NULL; } - //拷贝字符串到堆空间! + // copy the source to the heap char *pTmp = strdup(commandStr); - LOGD("拷贝参数字符串到临时堆!"); - //返回的结果!先初始化为20个空间 + // new memory size is default 20 for char ** int size = 20; cmd->cmd = (char **) malloc(size * sizeof(char **)); - if (cmd->cmd) { - LOGD("申请参数空间成功!"); - } else { - LOGD("申请空间失败!"); - } - //进行截取 + if (!cmd->cmd) return NULL; + // parse char *pStr = strtok(pTmp, " "); - LOGD("第0次截取完成: %s", pStr); - //给结果数组进行下标为0的第一次初始化 cmd->cmd[0] = pStr; - //局部变量用于储存解析到的命令个数,下标移动为一 int count = 1; - //需要截取命令参数,以空格为限定符 for (; pStr != NULL; ++count) { - //如果容量不够,则扩容! + // Capacity expansion if (count == (size - 1)) { size += 20; cmd->cmd = (char **) realloc(cmd->cmd, size * sizeof(char **)); - LOGD("超过初始容量,自动扩容!"); } pStr = strtok(NULL, " "); if (pStr) { cmd->cmd[count] = pStr; - LOGD("第%d次截取完成: %s", count, pStr); } } cmd->len = (count - 1); - LOGD("解析函数执行完成!"); return cmd; } -//内存释放 +// cmd arg struct free void free_command_line(CMD *cmd) { - //二级指针需要逐层释放! - LOGD("释放命令行字符串二级引用!"); free(cmd->cmd[0]); - LOGD("释放命令行一级引用!"); free(cmd->cmd); - LOGD("释放结构体内存"); free(cmd); } diff --git a/client/android/jni_tools.h b/client/android/jni_tools.h index 3d76184b9..8e900374f 100644 --- a/client/android/jni_tools.h +++ b/client/android/jni_tools.h @@ -10,31 +10,31 @@ #include //JNI LOG -#define TAG "DXL BlUESPP_PN532" +#define TAG "PM3" #define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE,TAG,__VA_ARGS__) #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__) #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG,__VA_ARGS__) #define LOGW(...) __android_log_print(ANDROID_LOG_WARN,TAG,__VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG,__VA_ARGS__) -//全局的环境变量定义 +// a global jvm instance JavaVM *g_JavaVM; -//线程环境指针获取函数 +// get current env for jvm JNIEnv *getJniEnv(); -//子线程释放函数,必须是native层创建的线程才可以调用 -void deatchThread(); +// detach native thread from jvm, must native thread can detach! +void detachThread(); typedef struct { char **cmd; int len; } CMD; -//命令行解析函数 +// cmd arg parse CMD *parse_command_line(const char *commandStr); -//解析结果释放函数! +// cmd arg struct free void free_command_line(CMD *); #endif //DXL_TOOLS_H diff --git a/client/android/pm3_main.c b/client/android/pm3_main.c index 87c6bbd44..3039bbf8e 100644 --- a/client/android/pm3_main.c +++ b/client/android/pm3_main.c @@ -79,7 +79,7 @@ static bool open() { } /* - * 发送一条命令等待执行! + * Transfers to the command buffer and waits for a new command to be executed * */ jint sendCMD(JNIEnv *env, jobject instance, jstring cmd_) { //may be pm3 not running. @@ -93,19 +93,9 @@ jint sendCMD(JNIEnv *env, jobject instance, jstring cmd_) { CloseProxmark(); } } - //无论如何,新的命令的输入了,就要换个行! + // display on new line PrintAndLogEx(NORMAL, "\n"); - char *cmd = (char *)((*env)->GetStringUTFChars(env, cmd_, 0)); - // Many parts of the PM3 client will assume that they can read any write from pwd. So we set - // pwd to whatever the PM3 "executable directory" is, to get consistent behaviour. - /*int ret = chdir(get_my_executable_directory()); - if (ret == -1) { - LOGW("Couldn't chdir(get_my_executable_directory()), errno=%s", strerror(errno)); - } - char pwd[1024]; - memset((void *) &pwd, 0, sizeof(pwd)); - getcwd((char *) &pwd, sizeof(pwd)); - LOGI("pwd = %s", pwd);*/ + char *cmd = (char *) ((*env)->GetStringUTFChars(env, cmd_, 0)); int ret = CommandReceived(cmd); if (ret == 99) { // exit / quit @@ -117,14 +107,14 @@ jint sendCMD(JNIEnv *env, jobject instance, jstring cmd_) { } /* - * 是否在执行命令 + * Is client running! * */ jboolean isExecuting(JNIEnv *env, jobject instance) { - return (jboolean)((jboolean) conn.run); + return (jboolean) ((jboolean) conn.run); } /* - * 进行设备链接验证! + * test hw and hw and client. * */ jboolean testPm3(JNIEnv *env, jobject instance) { bool ret1 = open(); @@ -133,13 +123,19 @@ jboolean testPm3(JNIEnv *env, jobject instance) { return false; } bool ret2 = TestProxmark() == PM3_SUCCESS; - return (jboolean)(ret1 && ret2); + return (jboolean) (ret1 && ret2); } +/* + * stop pm3 client + * */ void stopPm3(JNIEnv *env, jobject instance) { CloseProxmark(); } +/* + * native function map to jvm + * */ JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { JNIEnv *jniEnv = NULL; if ((*vm)->GetEnv(vm, (void **) &jniEnv, JNI_VERSION_1_4) != JNI_OK) { @@ -152,21 +148,21 @@ JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { } jclass clz_test = (*jniEnv)->FindClass(jniEnv, "cn/rrg/devices/Proxmark3RRGRdv4"); JNINativeMethod methods[] = { - {"startExecute", "(Ljava/lang/String;)I", (void *) sendCMD}, - {"stopExecute", "()V", (void *) stopPm3}, - {"isExecuting", "()Z", (void *) isExecuting} + {"startExecute", "(Ljava/lang/String;)I", (void *) sendCMD}, + {"stopExecute", "()V", (void *) stopPm3}, + {"isExecuting", "()Z", (void *) isExecuting} }; JNINativeMethod methods1[] = { - {"testPm3", "()Z", (void *) testPm3}, - {"closePm3", "()V", stopPm3} + {"testPm3", "()Z", (void *) testPm3}, + {"closePm3", "()V", stopPm3} }; if ((*jniEnv)->RegisterNatives(jniEnv, clazz, methods, sizeof(methods) / sizeof(methods[0])) != - JNI_OK) { + JNI_OK) { return -1; } if ((*jniEnv)->RegisterNatives(jniEnv, clz_test, methods1, sizeof(methods1) / sizeof(methods1[0])) != - JNI_OK) { + JNI_OK) { return -1; } (*jniEnv)->DeleteLocalRef(jniEnv, clazz); From 00b5841597742ec3bb902d9d927e962d4b2ba124 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 7 May 2020 12:13:52 +0200 Subject: [PATCH 091/632] cmake android: add backslashes for host compatibility --- client/android/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/android/CMakeLists.txt b/client/android/CMakeLists.txt index 1e03d1658..fc7c759bb 100644 --- a/client/android/CMakeLists.txt +++ b/client/android/CMakeLists.txt @@ -5,7 +5,7 @@ cmake_minimum_required(VERSION 3.4.1) # NDK version for SDK 19 doesn't implement the whole C++11 standard in the STL. # see: https://stackoverflow.com/questions/44736135/ndk-clang-error-undefined-reference-to-localeconv # so we need add def getlocaledecpoint()='.' -add_definitions(-DANDROID -D"getlocaledecpoint()='.'" -DZ_SOLO) +add_definitions(-DANDROID -D"getlocaledecpoint\(\)='.'" -DZ_SOLO) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -O3 -fvisibility=hidden -w") From b34851d2812fd5712273ae6ca5e2a25ebb6d8cd8 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 7 May 2020 12:19:46 +0200 Subject: [PATCH 092/632] make style --- client/android/pm3_main.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/client/android/pm3_main.c b/client/android/pm3_main.c index 3039bbf8e..6855856ab 100644 --- a/client/android/pm3_main.c +++ b/client/android/pm3_main.c @@ -95,7 +95,7 @@ jint sendCMD(JNIEnv *env, jobject instance, jstring cmd_) { } // display on new line PrintAndLogEx(NORMAL, "\n"); - char *cmd = (char *) ((*env)->GetStringUTFChars(env, cmd_, 0)); + char *cmd = (char *)((*env)->GetStringUTFChars(env, cmd_, 0)); int ret = CommandReceived(cmd); if (ret == 99) { // exit / quit @@ -110,7 +110,7 @@ jint sendCMD(JNIEnv *env, jobject instance, jstring cmd_) { * Is client running! * */ jboolean isExecuting(JNIEnv *env, jobject instance) { - return (jboolean) ((jboolean) conn.run); + return (jboolean)((jboolean) conn.run); } /* @@ -123,7 +123,7 @@ jboolean testPm3(JNIEnv *env, jobject instance) { return false; } bool ret2 = TestProxmark() == PM3_SUCCESS; - return (jboolean) (ret1 && ret2); + return (jboolean)(ret1 && ret2); } /* @@ -148,21 +148,21 @@ JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { } jclass clz_test = (*jniEnv)->FindClass(jniEnv, "cn/rrg/devices/Proxmark3RRGRdv4"); JNINativeMethod methods[] = { - {"startExecute", "(Ljava/lang/String;)I", (void *) sendCMD}, - {"stopExecute", "()V", (void *) stopPm3}, - {"isExecuting", "()Z", (void *) isExecuting} + {"startExecute", "(Ljava/lang/String;)I", (void *) sendCMD}, + {"stopExecute", "()V", (void *) stopPm3}, + {"isExecuting", "()Z", (void *) isExecuting} }; JNINativeMethod methods1[] = { - {"testPm3", "()Z", (void *) testPm3}, - {"closePm3", "()V", stopPm3} + {"testPm3", "()Z", (void *) testPm3}, + {"closePm3", "()V", stopPm3} }; if ((*jniEnv)->RegisterNatives(jniEnv, clazz, methods, sizeof(methods) / sizeof(methods[0])) != - JNI_OK) { + JNI_OK) { return -1; } if ((*jniEnv)->RegisterNatives(jniEnv, clz_test, methods1, sizeof(methods1) / sizeof(methods1[0])) != - JNI_OK) { + JNI_OK) { return -1; } (*jniEnv)->DeleteLocalRef(jniEnv, clazz); From b9f6f096aa9d565af3a59998fd65c744da318f96 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 7 May 2020 14:20:49 +0200 Subject: [PATCH 093/632] hook reveng outputs to pm3 machinery, add regression test --- client/deps/reveng/Makefile | 2 +- client/deps/reveng/bmpbit.c | 6 ++++++ client/deps/reveng/config.h | 6 ++++++ pm3test.sh | 2 +- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/client/deps/reveng/Makefile b/client/deps/reveng/Makefile index 0dbfa6007..d0382771d 100644 --- a/client/deps/reveng/Makefile +++ b/client/deps/reveng/Makefile @@ -4,7 +4,7 @@ # Add -DPRESETS to compile with preset models (edit config.h) MYSRCPATHS = -MYINCLUDES = -I../cliparser +MYINCLUDES = -I../cliparser -I../../src -I../../../include MYCFLAGS = MYDEFS = -DPRESETS MYSRCS = \ diff --git a/client/deps/reveng/bmpbit.c b/client/deps/reveng/bmpbit.c index e44ddb250..522d71ecc 100644 --- a/client/deps/reveng/bmpbit.c +++ b/client/deps/reveng/bmpbit.c @@ -30,6 +30,12 @@ #endif #include "reveng.h" +#ifdef BMPTST +# undef fprintf +# undef puts +# undef fputs +#endif + #if (defined BMPTST) || (BMP_BIT < 32) /* Size in bits of a bmp_t. Not necessarily a power of two. */ int bmpbit; diff --git a/client/deps/reveng/config.h b/client/deps/reveng/config.h index 94d3c4da5..177df030e 100644 --- a/client/deps/reveng/config.h +++ b/client/deps/reveng/config.h @@ -101,4 +101,10 @@ * * *****************************************/ +// Proxmark3 stdout/stderr hooking +#include "ui.h" +#define fprintf(stream, ...) PrintAndLogEx(INFO, __VA_ARGS__) +#define fputs(s, stream) PrintAndLogEx(INFO, "%s", s) +#define puts(s) PrintAndLogEx(SUCCESS, "%s", s) + #endif /* CONFIG_H */ diff --git a/pm3test.sh b/pm3test.sh index 99fe168dc..825398fae 100755 --- a/pm3test.sh +++ b/pm3test.sh @@ -108,7 +108,7 @@ while true; do if ! CheckExecute "proxmark help text hardnested" "$PM3BIN -t 2>&1" "hardnested"; then break; fi printf "\n${C_BLUE}Testing data manipulation:${C_NC}\n" - if ! CheckExecute "reveng test" "$PM3BIN -c 'reveng -w 8 -s 01020304e3 010204039d'" "CRC-8/SMBUS"; then break; fi + if ! CheckExecute "reveng test" "$PM3BIN -c 'reveng -h;reveng -w 8 -s 01020304e3 010204039d'" "CRC-8/SMBUS"; then break; fi if ! CheckExecute "mfu pwdgen test" "$PM3BIN -c 'hf mfu pwdgen t'" "Selftest OK"; then break; fi printf "\n${C_BLUE}Testing LF:${C_NC}\n" From 94d4f2b75efbad9a68a47261c911065fb2356aaf Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 7 May 2020 14:45:53 +0200 Subject: [PATCH 094/632] fix cmake for reveng --- client/deps/reveng.cmake | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/client/deps/reveng.cmake b/client/deps/reveng.cmake index d5f3259ed..d7e3cfd8a 100644 --- a/client/deps/reveng.cmake +++ b/client/deps/reveng.cmake @@ -8,7 +8,10 @@ add_library(pm3rrg_rdv4_reveng STATIC ) target_compile_definitions(pm3rrg_rdv4_reveng PRIVATE PRESETS) -target_include_directories(pm3rrg_rdv4_reveng PRIVATE ../cliparser) +target_include_directories(pm3rrg_rdv4_reveng PRIVATE + cliparser + ../src + ../../include) target_include_directories(pm3rrg_rdv4_reveng INTERFACE reveng) target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_reveng PROPERTY POSITION_INDEPENDENT_CODE ON) From cdf7f776534d93ee678970e9aa444a838db527e8 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 7 May 2020 16:25:26 +0200 Subject: [PATCH 095/632] chg: added test for revengs readline/cliparsing --- pm3test.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pm3test.sh b/pm3test.sh index 825398fae..9a90ddcc5 100755 --- a/pm3test.sh +++ b/pm3test.sh @@ -108,7 +108,8 @@ while true; do if ! CheckExecute "proxmark help text hardnested" "$PM3BIN -t 2>&1" "hardnested"; then break; fi printf "\n${C_BLUE}Testing data manipulation:${C_NC}\n" - if ! CheckExecute "reveng test" "$PM3BIN -c 'reveng -h;reveng -w 8 -s 01020304e3 010204039d'" "CRC-8/SMBUS"; then break; fi + if ! CheckExecute "reveng readline test" "$PM3BIN -c 'reveng -h;reveng -D'" "CRC-64/GO-ISO"; then break; fi + if ! CheckExecute "reveng test" "$PM3BIN -c 'reveng -w 8 -s 01020304e3 010204039d'" "CRC-8/SMBUS"; then break; fi if ! CheckExecute "mfu pwdgen test" "$PM3BIN -c 'hf mfu pwdgen t'" "Selftest OK"; then break; fi printf "\n${C_BLUE}Testing LF:${C_NC}\n" From d6fd7f14d6a61879802adf67e1b8c3f6033d484d Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 7 May 2020 19:14:53 +0200 Subject: [PATCH 096/632] simpler ul_print_type --- client/src/cmdhfmfu.c | 58 +++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 32 deletions(-) diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index c71cff645..9dc739417 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -653,66 +653,60 @@ static int ndef_print_CC(uint8_t *data) { int ul_print_type(uint32_t tagtype, uint8_t spaces) { - char spc[11] = " "; - spc[10] = 0x00; - if (spaces > 10) spaces = 10; - - char *spacer = spc + (10 - spaces); - if (tagtype & UL) - PrintAndLogEx(SUCCESS, "%sTYPE: " _YELLOW_("MIFARE Ultralight (MF0ICU1) %s"), spacer, (tagtype & MAGIC) ? "" : ""); + PrintAndLogEx(SUCCESS, "%*sTYPE: " _YELLOW_("MIFARE Ultralight (MF0ICU1) %s"), spaces, "", (tagtype & MAGIC) ? "" : ""); else if (tagtype & UL_C) - PrintAndLogEx(SUCCESS, "%sTYPE: " _YELLOW_("MIFARE Ultralight C (MF0ULC) %s"), spacer, (tagtype & MAGIC) ? "" : ""); + PrintAndLogEx(SUCCESS, "%*sTYPE: " _YELLOW_("MIFARE Ultralight C (MF0ULC) %s"), spaces, "", (tagtype & MAGIC) ? "" : ""); else if (tagtype & UL_NANO_40) - PrintAndLogEx(SUCCESS, "%sTYPE: " _YELLOW_("MIFARE Ultralight Nano 40bytes (MF0UNH00)"), spacer); + PrintAndLogEx(SUCCESS, "%*sTYPE: " _YELLOW_("MIFARE Ultralight Nano 40bytes (MF0UNH00)"), spaces, ""); else if (tagtype & UL_EV1_48) - PrintAndLogEx(SUCCESS, "%sTYPE: " _YELLOW_("MIFARE Ultralight EV1 48bytes (MF0UL1101)"), spacer); + PrintAndLogEx(SUCCESS, "%*sTYPE: " _YELLOW_("MIFARE Ultralight EV1 48bytes (MF0UL1101)"), spaces, ""); else if (tagtype & UL_EV1_128) - PrintAndLogEx(SUCCESS, "%sTYPE: " _YELLOW_("MIFARE Ultralight EV1 128bytes (MF0UL2101)"), spacer); + PrintAndLogEx(SUCCESS, "%*sTYPE: " _YELLOW_("MIFARE Ultralight EV1 128bytes (MF0UL2101)"), spaces, ""); else if (tagtype & UL_EV1) - PrintAndLogEx(NORMAL, "%sTYPE: " _YELLOW_("MIFARE Ultralight EV1 UNKNOWN"), spacer); + PrintAndLogEx(NORMAL, "%*sTYPE: " _YELLOW_("MIFARE Ultralight EV1 UNKNOWN"), spaces, ""); else if (tagtype & NTAG) - PrintAndLogEx(NORMAL, "%sTYPE: " _YELLOW_("NTAG UNKNOWN"), spacer); + PrintAndLogEx(NORMAL, "%*sTYPE: " _YELLOW_("NTAG UNKNOWN"), spaces, ""); else if (tagtype & NTAG_203) - PrintAndLogEx(SUCCESS, "%sTYPE: " _YELLOW_("NTAG 203 144bytes (NT2H0301F0DT)"), spacer); + PrintAndLogEx(SUCCESS, "%*sTYPE: " _YELLOW_("NTAG 203 144bytes (NT2H0301F0DT)"), spaces, ""); else if (tagtype & NTAG_210) - PrintAndLogEx(SUCCESS, "%sTYPE: " _YELLOW_("NTAG 210 48bytes (NT2L1011G0DU)"), spacer); + PrintAndLogEx(SUCCESS, "%*sTYPE: " _YELLOW_("NTAG 210 48bytes (NT2L1011G0DU)"), spaces, ""); else if (tagtype & NTAG_212) - PrintAndLogEx(SUCCESS, "%sTYPE: " _YELLOW_("NTAG 212 128bytes (NT2L1211G0DU)"), spacer); + PrintAndLogEx(SUCCESS, "%*sTYPE: " _YELLOW_("NTAG 212 128bytes (NT2L1211G0DU)"), spaces, ""); else if (tagtype & NTAG_213) - PrintAndLogEx(SUCCESS, "%sTYPE: " _YELLOW_("NTAG 213 144bytes (NT2H1311G0DU)"), spacer); + PrintAndLogEx(SUCCESS, "%*sTYPE: " _YELLOW_("NTAG 213 144bytes (NT2H1311G0DU)"), spaces, ""); else if (tagtype & NTAG_213_F) - PrintAndLogEx(SUCCESS, "%sTYPE: " _YELLOW_("NTAG 213F 144bytes (NT2H1311F0DTL)"), spacer); + PrintAndLogEx(SUCCESS, "%*sTYPE: " _YELLOW_("NTAG 213F 144bytes (NT2H1311F0DTL)"), spaces, ""); else if (tagtype & NTAG_215) - PrintAndLogEx(SUCCESS, "%sTYPE: " _YELLOW_("NTAG 215 504bytes (NT2H1511G0DU)"), spacer); + PrintAndLogEx(SUCCESS, "%*sTYPE: " _YELLOW_("NTAG 215 504bytes (NT2H1511G0DU)"), spaces, ""); else if (tagtype & NTAG_216) - PrintAndLogEx(SUCCESS, "%sTYPE: " _YELLOW_("NTAG 216 888bytes (NT2H1611G0DU)"), spacer); + PrintAndLogEx(SUCCESS, "%*sTYPE: " _YELLOW_("NTAG 216 888bytes (NT2H1611G0DU)"), spaces, ""); else if (tagtype & NTAG_216_F) - PrintAndLogEx(SUCCESS, "%sTYPE: " _YELLOW_("NTAG 216F 888bytes (NT2H1611F0DTL)"), spacer); + PrintAndLogEx(SUCCESS, "%*sTYPE: " _YELLOW_("NTAG 216F 888bytes (NT2H1611F0DTL)"), spaces, ""); else if (tagtype & NTAG_I2C_1K) - PrintAndLogEx(SUCCESS, "%sTYPE: " _YELLOW_("NTAG I2C 888bytes (NT3H1101FHK)"), spacer); + PrintAndLogEx(SUCCESS, "%*sTYPE: " _YELLOW_("NTAG I2C 888bytes (NT3H1101FHK)"), spaces, ""); else if (tagtype & NTAG_I2C_2K) - PrintAndLogEx(SUCCESS, "%sTYPE: " _YELLOW_("NTAG I2C 1904bytes (NT3H1201FHK)"), spacer); + PrintAndLogEx(SUCCESS, "%*sTYPE: " _YELLOW_("NTAG I2C 1904bytes (NT3H1201FHK)"), spaces, ""); else if (tagtype & NTAG_I2C_1K_PLUS) - PrintAndLogEx(SUCCESS, "%sTYPE: " _YELLOW_("NTAG I2C plus 888bytes (NT3H2111FHK)"), spacer); + PrintAndLogEx(SUCCESS, "%*sTYPE: " _YELLOW_("NTAG I2C plus 888bytes (NT3H2111FHK)"), spaces, ""); else if (tagtype & NTAG_I2C_2K_PLUS) - PrintAndLogEx(SUCCESS, "%sTYPE: " _YELLOW_("NTAG I2C plus 1912bytes (NT3H2211FHK)"), spacer); + PrintAndLogEx(SUCCESS, "%*sTYPE: " _YELLOW_("NTAG I2C plus 1912bytes (NT3H2211FHK)"), spaces, ""); else if (tagtype & MY_D) - PrintAndLogEx(SUCCESS, "%sTYPE: " _YELLOW_("INFINEON my-d\x99 (SLE 66RxxS)"), spacer); + PrintAndLogEx(SUCCESS, "%*sTYPE: " _YELLOW_("INFINEON my-d\x99 (SLE 66RxxS)"), spaces, ""); else if (tagtype & MY_D_NFC) - PrintAndLogEx(SUCCESS, "%sTYPE: " _YELLOW_("INFINEON my-d\x99 NFC (SLE 66RxxP)"), spacer); + PrintAndLogEx(SUCCESS, "%*sTYPE: " _YELLOW_("INFINEON my-d\x99 NFC (SLE 66RxxP)"), spaces, ""); else if (tagtype & MY_D_MOVE) - PrintAndLogEx(SUCCESS, "%sTYPE: " _YELLOW_("INFINEON my-d\x99 move (SLE 66R01P)"), spacer); + PrintAndLogEx(SUCCESS, "%*sTYPE: " _YELLOW_("INFINEON my-d\x99 move (SLE 66R01P)"), spaces, ""); else if (tagtype & MY_D_MOVE_NFC) - PrintAndLogEx(SUCCESS, "%sTYPE: " _YELLOW_("INFINEON my-d\x99 move NFC (SLE 66R01P)"), spacer); + PrintAndLogEx(SUCCESS, "%*sTYPE: " _YELLOW_("INFINEON my-d\x99 move NFC (SLE 66R01P)"), spaces, ""); else if (tagtype & MY_D_MOVE_LEAN) - PrintAndLogEx(SUCCESS, "%sTYPE: " _YELLOW_("INFINEON my-d\x99 move lean (SLE 66R01L)"), spacer); + PrintAndLogEx(SUCCESS, "%*sTYPE: " _YELLOW_("INFINEON my-d\x99 move lean (SLE 66R01L)"), spaces, ""); else if (tagtype & FUDAN_UL) - PrintAndLogEx(SUCCESS, "%sTYPE: " _YELLOW_("FUDAN Ultralight Compatible (or other compatible) %s"), spacer, (tagtype & MAGIC) ? "" : ""); + PrintAndLogEx(SUCCESS, "%*sTYPE: " _YELLOW_("FUDAN Ultralight Compatible (or other compatible) %s"), spaces, "", (tagtype & MAGIC) ? "" : ""); else - PrintAndLogEx(NORMAL, "%sTYPE: " _YELLOW_("Unknown %06x"), spacer, tagtype); + PrintAndLogEx(NORMAL, "%*sTYPE: " _YELLOW_("Unknown %06x"), spaces, "", tagtype); return PM3_SUCCESS; } From 4066287b9842e56868938fceab4bb1948d757c93 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 7 May 2020 19:17:09 +0200 Subject: [PATCH 097/632] Let's see if the prompt suffixed spaces are still needed. Please shout if it breaks. --- client/src/ui.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/ui.c b/client/src/ui.c index 0b0ffdb56..488cce8d9 100644 --- a/client/src/ui.c +++ b/client/src/ui.c @@ -314,7 +314,7 @@ static void fPrintAndLog(FILE *stream, const char *fmt, ...) { if (g_printAndLog & PRINTANDLOG_PRINT) { memcpy_filter_emoji(buffer3, buffer2, sizeof(buffer2), session.emoji_mode); fprintf(stream, "%s", buffer3); - fprintf(stream, " "); // cleaning prompt +// fprintf(stream, " "); // cleaning prompt fprintf(stream, "\n"); } From a8a9e98ca22d97be0eb0bdbb59e3efa693bd3caa Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 7 May 2020 19:44:03 +0200 Subject: [PATCH 098/632] Revert "Let's see if the prompt suffixed spaces are still needed. Please shout if it breaks." ok now I see where it breaks :) will debug locally... This reverts commit 4066287b9842e56868938fceab4bb1948d757c93. --- client/src/ui.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/ui.c b/client/src/ui.c index 488cce8d9..0b0ffdb56 100644 --- a/client/src/ui.c +++ b/client/src/ui.c @@ -314,7 +314,7 @@ static void fPrintAndLog(FILE *stream, const char *fmt, ...) { if (g_printAndLog & PRINTANDLOG_PRINT) { memcpy_filter_emoji(buffer3, buffer2, sizeof(buffer2), session.emoji_mode); fprintf(stream, "%s", buffer3); -// fprintf(stream, " "); // cleaning prompt + fprintf(stream, " "); // cleaning prompt fprintf(stream, "\n"); } From edb1c85cd3bfbdd3900d71d59f1fcb3079d873f5 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 7 May 2020 21:56:09 +0200 Subject: [PATCH 099/632] fix colored readline prompt bug --- client/src/proxmark3.h | 13 ++++++------- client/src/ui.c | 4 ++++ include/ansi.h | 14 ++++++++++++-- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/client/src/proxmark3.h b/client/src/proxmark3.h index 9f4c767e2..6402baea9 100644 --- a/client/src/proxmark3.h +++ b/client/src/proxmark3.h @@ -18,15 +18,14 @@ #define PROXPROMPT_COMPOSE "[" "%s%s" "] pm3 --> " -#define PROXPROMPT_CTX_SCRIPTFILE "|" _GREEN_("script") -#define PROXPROMPT_CTX_SCRIPTCMD "|" _GREEN_("script") -#define PROXPROMPT_CTX_STDIN "|" _GREEN_("script") +#define PROXPROMPT_CTX_SCRIPTFILE "|" _RL_GREEN_("script") +#define PROXPROMPT_CTX_SCRIPTCMD "|" _RL_GREEN_("script") +#define PROXPROMPT_CTX_STDIN "|" _RL_GREEN_("script") #define PROXPROMPT_CTX_INTERACTIVE "" -#define PROXPROMPT_DEV_USB _BOLD_GREEN_("usb") -#define PROXPROMPT_DEV_FPC _BOLD_GREEN_("fpc") -#define PROXPROMPT_DEV_OFFLINE _BOLD_RED_("offline") - +#define PROXPROMPT_DEV_USB _RL_BOLD_GREEN_("usb") +#define PROXPROMPT_DEV_FPC _RL_BOLD_GREEN_("fpc") +#define PROXPROMPT_DEV_OFFLINE _RL_BOLD_RED_("offline") #define PROXHISTORY "history.txt" #define PROXLOG "log_%Y%m%d.txt" diff --git a/client/src/ui.c b/client/src/ui.c index 0b0ffdb56..58cd1606a 100644 --- a/client/src/ui.c +++ b/client/src/ui.c @@ -358,6 +358,10 @@ void memcpy_filter_ansi(void *dest, const void *src, size_t n, bool filter) { uint8_t *rsrc = (uint8_t *)src; uint16_t si = 0; for (uint16_t i = 0; i < n; i++) { + if ((i < n) + && ((rsrc[i] == '\001') || (rsrc[i] == '\002'))) + // skip readline special markers + continue; if ((i < n - 1) && (rsrc[i] == '\x1b') && (rsrc[i + 1] >= 0x40) diff --git a/include/ansi.h b/include/ansi.h index e86a36ee4..28784ba8c 100644 --- a/include/ansi.h +++ b/include/ansi.h @@ -5,12 +5,22 @@ #define _BLUE_(s) "\x1b[34m" s AEND #define _RED_(s) "\x1b[31m" s AEND -#define _BOLD_RED_(s) "\x1b[1;31m" s AEND #define _GREEN_(s) "\x1b[32m" s AEND -#define _BOLD_GREEN_(s) "\x1b[1;32m" s AEND #define _YELLOW_(s) "\x1b[33m" s AEND #define _MAGENTA_(s) "\x1b[35m" s AEND #define _CYAN_(s) "\x1b[36m" s AEND #define _WHITE_(s) "\x1b[37m" s AEND +// https://wiki.hackzine.org/development/misc/readline-color-prompt.html +// Applications may indicate that the prompt contains +// characters that take up no physical screen space when displayed by +// bracketing a sequence of such characters with the special markers +// RL_PROMPT_START_IGNORE = '\001' and RL_PROMPT_END_IGNORE = '\002' +#define RL_ESC(a) "\001" a "\002" + +#define _RL_RED_(s) RL_ESC("\x1b[31m") s RL_ESC(AEND) +#define _RL_GREEN_(s) RL_ESC("\x1b[32m") s RL_ESC(AEND) +#define _RL_BOLD_RED_(s) RL_ESC("\x1b[1;31m") s RL_ESC(AEND) +#define _RL_BOLD_GREEN_(s) RL_ESC("\x1b[1;32m") s RL_ESC(AEND) + #endif From 1c136c3e932d94551cdc86c83521cbf076d12df2 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 7 May 2020 19:17:09 +0200 Subject: [PATCH 100/632] Let's see if the prompt suffixed spaces are still needed. Please shout if it breaks. --- client/src/ui.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/ui.c b/client/src/ui.c index 58cd1606a..f4e9ec9a6 100644 --- a/client/src/ui.c +++ b/client/src/ui.c @@ -314,7 +314,7 @@ static void fPrintAndLog(FILE *stream, const char *fmt, ...) { if (g_printAndLog & PRINTANDLOG_PRINT) { memcpy_filter_emoji(buffer3, buffer2, sizeof(buffer2), session.emoji_mode); fprintf(stream, "%s", buffer3); - fprintf(stream, " "); // cleaning prompt +// fprintf(stream, " "); // cleaning prompt fprintf(stream, "\n"); } From 1ad5cc473fdbf0fc2c6a0dfd59609b44a1bf067c Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 7 May 2020 23:00:45 +0200 Subject: [PATCH 101/632] rework banners --- client/src/proxmark3.c | 79 +++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 44 deletions(-) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index 1ed8bb65a..f57ca4018 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -40,10 +40,11 @@ // Used to enable/disable use of preferences json file #define USE_PREFERENCE_FILE -#ifdef _WIN32 - -static void utf8_showBanner(void) { +#define BANNERMSG1 " :snowflake: iceman@icesql.net :coffee:" +#define BANNERMSG2 " https://github.com/rfidresearchgroup/proxmark3/" +#define BANNERMSG3 "pre-release v4.0" +static inline void utf8_showBanner(void) { char sq[] = { 0xE2, 0x96, 0x88, 0x00 }; // square block char tr[] = { 0xE2, 0x95, 0x97, 0x00 }; // top rigth corner char tl[] = { 0xE2, 0x95, 0x94, 0x00 }; // top left corner @@ -51,59 +52,49 @@ static void utf8_showBanner(void) { char bl[] = { 0xE2, 0x95, 0x9A, 0x00 }; // bottom left corner char hl[] = { 0xE2, 0x95, 0x90, 0x00 }; // horiz line char vl[] = { 0xE2, 0x95, 0x91, 0x00 }; // vert line - char msg1 [60]; - char msg2 [60]; - char msg3 [60]; - - strcpy(msg1, " :snowflake: iceman@icesql.net :coffee:"); - strcpy(msg2, " https://github.com/rfidresearchgroup/proxmark3/"); - strcpy(msg3, "pre-release v4.0"); - - g_printAndLog = PRINTANDLOG_PRINT; - - PrintAndLogEx(NORMAL, "\n"); PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s %s%s%s%s %s%s%s%s %s%s%s%s%s "), sq, sq, sq, sq, sq, sq, tr, sq, sq, sq, tr, sq, sq, sq, tr, sq, sq, sq, sq, tr); PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s %s%s%s%s%s %s%s%s%s"), sq, sq, tl, hl, hl, sq, sq, tr, sq, sq, sq, sq, tr, sq, sq, sq, sq, vl, hl, hl, sq, vl); PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s %s%s%s%s%s%s"), sq, sq, sq, sq, sq, sq, tl, br, sq, sq, tl, sq, sq, sq, sq, tl, sq, sq, vl, sq, sq, sq, sq, tl, br); - PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s %s%s%s%s%s%s%s%s%s%s%s %s%s%s%s")" %s", sq, sq, tr, hl, hl, hl, br, sq, sq, vl, bl, sq, sq, tl, br, sq, sq, vl, hl, hl, sq, vl, msg1); - PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s %s%s%s %s%s%s %s%s%s %s%s%s%s%s%s")" %s", sq, sq, vl, sq, sq, vl, bl, hl, br, sq, sq, vl, sq, sq, sq, sq, tl, br, msg2); - PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s %s%s%s %s%s%s %s%s%s%s%s ")" %s", bl, hl, br, bl, hl, br, bl, hl, br, bl, hl, hl, hl, br, msg3); - - PrintAndLogEx(NORMAL, ""); - fflush(stdout); - g_printAndLog = PRINTANDLOG_PRINT | PRINTANDLOG_LOG; + PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s %s%s%s%s%s%s%s%s%s%s%s %s%s%s%s")" %s", sq, sq, tr, hl, hl, hl, br, sq, sq, vl, bl, sq, sq, tl, br, sq, sq, vl, hl, hl, sq, vl, BANNERMSG1); + PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s %s%s%s %s%s%s %s%s%s %s%s%s%s%s%s")" %s", sq, sq, vl, sq, sq, vl, bl, hl, br, sq, sq, vl, sq, sq, sq, sq, tl, br, BANNERMSG2); + PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s %s%s%s %s%s%s %s%s%s%s%s ")" %s", bl, hl, br, bl, hl, br, bl, hl, br, bl, hl, hl, hl, br, BANNERMSG3); } -#endif - -static void showBanner(void) { - -#ifdef _WIN32 - // If on windows and using UTF-8 then we need utf-8 ascii art for banner. - if (GetConsoleCP() == 65001) { - utf8_showBanner(); - return; - } -#endif - - g_printAndLog = PRINTANDLOG_PRINT; - - PrintAndLogEx(NORMAL, "\n"); -#if defined(__linux__) || defined(__APPLE__) || defined(_WIN32) +static inline void ansi_showBanner(void) { PrintAndLogEx(NORMAL, " " _BLUE_("██████╗ ███╗ ███╗ ████╗ ")); PrintAndLogEx(NORMAL, " " _BLUE_("██╔══██╗████╗ ████║ ══█║")); PrintAndLogEx(NORMAL, " " _BLUE_("██████╔╝██╔████╔██║ ████╔╝")); - PrintAndLogEx(NORMAL, " " _BLUE_("██╔═══╝ ██║╚██╔╝██║ ══█║") " :snowflake: iceman@icesql.net :coffee:"); - PrintAndLogEx(NORMAL, " " _BLUE_("██║ ██║ ╚═╝ ██║ ████╔╝") " https://github.com/rfidresearchgroup/proxmark3/"); - PrintAndLogEx(NORMAL, " " _BLUE_("╚═╝ ╚═╝ ╚═╝ ╚═══╝ ") " pre-release v4.0"); -#else + PrintAndLogEx(NORMAL, " " _BLUE_("██╔═══╝ ██║╚██╔╝██║ ══█║") " " BANNERMSG1); + PrintAndLogEx(NORMAL, " " _BLUE_("██║ ██║ ╚═╝ ██║ ████╔╝") " " BANNERMSG2); + PrintAndLogEx(NORMAL, " " _BLUE_("╚═╝ ╚═╝ ╚═╝ ╚═══╝ ") " " BANNERMSG3); +} + +static inline void ascii_showBanner(void) { PrintAndLogEx(NORMAL, " ======. ===. ===. ====."); PrintAndLogEx(NORMAL, " ==...==.====. ====. ..=."); PrintAndLogEx(NORMAL, " ======..==.====.==. ====.."); - PrintAndLogEx(NORMAL, " ==..... ==..==..==. ..=. iceman@icesql.net :coffee:"); - PrintAndLogEx(NORMAL, " ==. ==. ... ==. ====.. https://github.com/rfidresearchgroup/proxmark3/"); - PrintAndLogEx(NORMAL, " ... ... ... ..... pre-release v4.0"); + PrintAndLogEx(NORMAL, " ==..... ==..==..==. ..=." " " BANNERMSG1); + PrintAndLogEx(NORMAL, " ==. ==. ... ==. ====.." " " BANNERMSG2); + PrintAndLogEx(NORMAL, " ... ... ... ..... " " " BANNERMSG3); +} + +static void showBanner(void) { + + g_printAndLog = PRINTANDLOG_PRINT; + PrintAndLogEx(NORMAL, "\n"); + +#if defined(_WIN32) + if (GetConsoleCP() == 65001) { + // If on Windows and using UTF-8 then we need utf-8 ascii art for banner. + utf8_showBanner(); + } else { + ansi_showBanner(); + } +#elif defined(__linux__) || defined(__APPLE__) + ansi_showBanner(); +#else + ascii_showBanner(); #endif // PrintAndLogEx(NORMAL, "\nSupport iceman on patreon - https://www.patreon.com/iceman1001/"); // PrintAndLogEx(NORMAL, " on paypal - https://www.paypal.me/iceman1001"); From 3a75de121599baf25a96bb52d4e832ba078b391f Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 7 May 2020 23:33:35 +0200 Subject: [PATCH 102/632] rework banners --- client/src/proxmark3.c | 55 ++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index f57ca4018..c854241cb 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -45,38 +45,45 @@ #define BANNERMSG3 "pre-release v4.0" static inline void utf8_showBanner(void) { - char sq[] = { 0xE2, 0x96, 0x88, 0x00 }; // square block - char tr[] = { 0xE2, 0x95, 0x97, 0x00 }; // top rigth corner - char tl[] = { 0xE2, 0x95, 0x94, 0x00 }; // top left corner - char br[] = { 0xE2, 0x95, 0x9D, 0x00 }; // bottom right corner - char bl[] = { 0xE2, 0x95, 0x9A, 0x00 }; // bottom left corner - char hl[] = { 0xE2, 0x95, 0x90, 0x00 }; // horiz line - char vl[] = { 0xE2, 0x95, 0x91, 0x00 }; // vert line + const char* sq = "\xE2\x96\x88"; // square block + const char* tr = "\xE2\x95\x97"; // top right corner + const char* tl = "\xE2\x95\x94"; // top left corner + const char* br = "\xE2\x95\x9D"; // bottom right corner + const char* bl = "\xE2\x95\x9A"; // bottom left corner + const char* hl = "\xE2\x95\x90"; // horiz line + const char* vl = "\xE2\x95\x91"; // vert line + const char* __ = " "; - PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s %s%s%s%s %s%s%s%s %s%s%s%s%s "), sq, sq, sq, sq, sq, sq, tr, sq, sq, sq, tr, sq, sq, sq, tr, sq, sq, sq, sq, tr); - PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s %s%s%s%s%s %s%s%s%s"), sq, sq, tl, hl, hl, sq, sq, tr, sq, sq, sq, sq, tr, sq, sq, sq, sq, vl, hl, hl, sq, vl); - PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s %s%s%s%s%s%s"), sq, sq, sq, sq, sq, sq, tl, br, sq, sq, tl, sq, sq, sq, sq, tl, sq, sq, vl, sq, sq, sq, sq, tl, br); - PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s %s%s%s%s%s%s%s%s%s%s%s %s%s%s%s")" %s", sq, sq, tr, hl, hl, hl, br, sq, sq, vl, bl, sq, sq, tl, br, sq, sq, vl, hl, hl, sq, vl, BANNERMSG1); - PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s %s%s%s %s%s%s %s%s%s %s%s%s%s%s%s")" %s", sq, sq, vl, sq, sq, vl, bl, hl, br, sq, sq, vl, sq, sq, sq, sq, tl, br, BANNERMSG2); - PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s %s%s%s %s%s%s %s%s%s%s%s ")" %s", bl, hl, br, bl, hl, br, bl, hl, br, bl, hl, hl, hl, br, BANNERMSG3); + PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"), + sq, sq, sq, sq, sq, sq, tr, __, sq, sq, sq, tr, __, __, __, sq, sq, sq, tr, sq, sq, sq, sq, sq, tr, __); + PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"), + sq, sq, tl, hl, hl, sq, sq, tr, sq, sq, sq, sq, tr, __, sq, sq, sq, sq, vl, bl, hl, hl, hl, sq, sq, tr); + PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"), + sq, sq, sq, sq, sq, sq, tl, br, sq, sq, tl, sq, sq, sq, sq, tl, sq, sq, vl, __, sq, sq, sq, sq, tl, br); + PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s")" " BANNERMSG1, + sq, sq, tl, hl, hl, hl, br, __, sq, sq, vl, bl, sq, sq, tl, br, sq, sq, vl, __, bl, hl, hl, sq, sq, tr); + PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s")" " BANNERMSG2, + sq, sq, vl, __, __, __, __, __, sq, sq, vl, __, bl, hl, br, __, sq, sq, vl, sq, sq, sq, sq, sq, tl, br); + PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s")" " BANNERMSG3, + bl, hl, br, __, __, __, __, __, bl, hl, br, __, __, __, __, __, bl, hl, br, bl, hl, hl, hl, hl, br, __); } static inline void ansi_showBanner(void) { - PrintAndLogEx(NORMAL, " " _BLUE_("██████╗ ███╗ ███╗ ████╗ ")); - PrintAndLogEx(NORMAL, " " _BLUE_("██╔══██╗████╗ ████║ ══█║")); + PrintAndLogEx(NORMAL, " " _BLUE_("██████╗ ███╗ ███╗█████╗ ")); + PrintAndLogEx(NORMAL, " " _BLUE_("██╔══██╗████╗ ████║╚═══██╗")); PrintAndLogEx(NORMAL, " " _BLUE_("██████╔╝██╔████╔██║ ████╔╝")); - PrintAndLogEx(NORMAL, " " _BLUE_("██╔═══╝ ██║╚██╔╝██║ ══█║") " " BANNERMSG1); - PrintAndLogEx(NORMAL, " " _BLUE_("██║ ██║ ╚═╝ ██║ ████╔╝") " " BANNERMSG2); - PrintAndLogEx(NORMAL, " " _BLUE_("╚═╝ ╚═╝ ╚═╝ ╚═══╝ ") " " BANNERMSG3); + PrintAndLogEx(NORMAL, " " _BLUE_("██╔═══╝ ██║╚██╔╝██║ ╚══██╗") " " BANNERMSG1); + PrintAndLogEx(NORMAL, " " _BLUE_("██║ ██║ ╚═╝ ██║█████╔╝") " " BANNERMSG2); + PrintAndLogEx(NORMAL, " " _BLUE_("╚═╝ ╚═╝ ╚═╝╚════╝ ") " " BANNERMSG3); } static inline void ascii_showBanner(void) { - PrintAndLogEx(NORMAL, " ======. ===. ===. ====."); - PrintAndLogEx(NORMAL, " ==...==.====. ====. ..=."); - PrintAndLogEx(NORMAL, " ======..==.====.==. ====.."); - PrintAndLogEx(NORMAL, " ==..... ==..==..==. ..=." " " BANNERMSG1); - PrintAndLogEx(NORMAL, " ==. ==. ... ==. ====.." " " BANNERMSG2); - PrintAndLogEx(NORMAL, " ... ... ... ..... " " " BANNERMSG3); + PrintAndLogEx(NORMAL, " ######. ###. ###.#####. "); + PrintAndLogEx(NORMAL, " ##...##.####. ####. ...##."); + PrintAndLogEx(NORMAL, " ######..##.####.##. ####.."); + PrintAndLogEx(NORMAL, " ##..... ##..##..##. ..##." " " BANNERMSG1); + PrintAndLogEx(NORMAL, " ##. ##. .. ##.#####.." " " BANNERMSG2); + PrintAndLogEx(NORMAL, " .. .. .. ..... " " " BANNERMSG3); } static void showBanner(void) { From 59057b6a35a98cdd4d9ff22053f22001ad0c9f69 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 8 May 2020 00:48:20 +0200 Subject: [PATCH 103/632] banners: clang still warns on unused static inlines fcts, change strategy --- client/src/proxmark3.c | 91 +++++++++++++++++++++++------------------- 1 file changed, 49 insertions(+), 42 deletions(-) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index c854241cb..0a0e99024 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -44,46 +44,53 @@ #define BANNERMSG2 " https://github.com/rfidresearchgroup/proxmark3/" #define BANNERMSG3 "pre-release v4.0" -static inline void utf8_showBanner(void) { - const char* sq = "\xE2\x96\x88"; // square block - const char* tr = "\xE2\x95\x97"; // top right corner - const char* tl = "\xE2\x95\x94"; // top left corner - const char* br = "\xE2\x95\x9D"; // bottom right corner - const char* bl = "\xE2\x95\x9A"; // bottom left corner - const char* hl = "\xE2\x95\x90"; // horiz line - const char* vl = "\xE2\x95\x91"; // vert line - const char* __ = " "; +typedef enum LogoMode { UTF8, ANSI, ASCII } LogoMode; - PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"), - sq, sq, sq, sq, sq, sq, tr, __, sq, sq, sq, tr, __, __, __, sq, sq, sq, tr, sq, sq, sq, sq, sq, tr, __); - PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"), - sq, sq, tl, hl, hl, sq, sq, tr, sq, sq, sq, sq, tr, __, sq, sq, sq, sq, vl, bl, hl, hl, hl, sq, sq, tr); - PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"), - sq, sq, sq, sq, sq, sq, tl, br, sq, sq, tl, sq, sq, sq, sq, tl, sq, sq, vl, __, sq, sq, sq, sq, tl, br); - PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s")" " BANNERMSG1, - sq, sq, tl, hl, hl, hl, br, __, sq, sq, vl, bl, sq, sq, tl, br, sq, sq, vl, __, bl, hl, hl, sq, sq, tr); - PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s")" " BANNERMSG2, - sq, sq, vl, __, __, __, __, __, sq, sq, vl, __, bl, hl, br, __, sq, sq, vl, sq, sq, sq, sq, sq, tl, br); - PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s")" " BANNERMSG3, - bl, hl, br, __, __, __, __, __, bl, hl, br, __, __, __, __, __, bl, hl, br, bl, hl, hl, hl, hl, br, __); -} +static void showBanner_logo(LogoMode mode) { + switch (mode) { + case UTF8: { + const char* sq = "\xE2\x96\x88"; // square block + const char* tr = "\xE2\x95\x97"; // top right corner + const char* tl = "\xE2\x95\x94"; // top left corner + const char* br = "\xE2\x95\x9D"; // bottom right corner + const char* bl = "\xE2\x95\x9A"; // bottom left corner + const char* hl = "\xE2\x95\x90"; // horiz line + const char* vl = "\xE2\x95\x91"; // vert line + const char* __ = " "; -static inline void ansi_showBanner(void) { - PrintAndLogEx(NORMAL, " " _BLUE_("██████╗ ███╗ ███╗█████╗ ")); - PrintAndLogEx(NORMAL, " " _BLUE_("██╔══██╗████╗ ████║╚═══██╗")); - PrintAndLogEx(NORMAL, " " _BLUE_("██████╔╝██╔████╔██║ ████╔╝")); - PrintAndLogEx(NORMAL, " " _BLUE_("██╔═══╝ ██║╚██╔╝██║ ╚══██╗") " " BANNERMSG1); - PrintAndLogEx(NORMAL, " " _BLUE_("██║ ██║ ╚═╝ ██║█████╔╝") " " BANNERMSG2); - PrintAndLogEx(NORMAL, " " _BLUE_("╚═╝ ╚═╝ ╚═╝╚════╝ ") " " BANNERMSG3); -} - -static inline void ascii_showBanner(void) { - PrintAndLogEx(NORMAL, " ######. ###. ###.#####. "); - PrintAndLogEx(NORMAL, " ##...##.####. ####. ...##."); - PrintAndLogEx(NORMAL, " ######..##.####.##. ####.."); - PrintAndLogEx(NORMAL, " ##..... ##..##..##. ..##." " " BANNERMSG1); - PrintAndLogEx(NORMAL, " ##. ##. .. ##.#####.." " " BANNERMSG2); - PrintAndLogEx(NORMAL, " .. .. .. ..... " " " BANNERMSG3); + PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"), + sq, sq, sq, sq, sq, sq, tr, __, sq, sq, sq, tr, __, __, __, sq, sq, sq, tr, sq, sq, sq, sq, sq, tr, __); + PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"), + sq, sq, tl, hl, hl, sq, sq, tr, sq, sq, sq, sq, tr, __, sq, sq, sq, sq, vl, bl, hl, hl, hl, sq, sq, tr); + PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"), + sq, sq, sq, sq, sq, sq, tl, br, sq, sq, tl, sq, sq, sq, sq, tl, sq, sq, vl, __, sq, sq, sq, sq, tl, br); + PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s")" " BANNERMSG1, + sq, sq, tl, hl, hl, hl, br, __, sq, sq, vl, bl, sq, sq, tl, br, sq, sq, vl, __, bl, hl, hl, sq, sq, tr); + PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s")" " BANNERMSG2, + sq, sq, vl, __, __, __, __, __, sq, sq, vl, __, bl, hl, br, __, sq, sq, vl, sq, sq, sq, sq, sq, tl, br); + PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s")" " BANNERMSG3, + bl, hl, br, __, __, __, __, __, bl, hl, br, __, __, __, __, __, bl, hl, br, bl, hl, hl, hl, hl, br, __); + break; + } + case ANSI: { + PrintAndLogEx(NORMAL, " " _BLUE_("██████╗ ███╗ ███╗█████╗ ")); + PrintAndLogEx(NORMAL, " " _BLUE_("██╔══██╗████╗ ████║╚═══██╗")); + PrintAndLogEx(NORMAL, " " _BLUE_("██████╔╝██╔████╔██║ ████╔╝")); + PrintAndLogEx(NORMAL, " " _BLUE_("██╔═══╝ ██║╚██╔╝██║ ╚══██╗") " " BANNERMSG1); + PrintAndLogEx(NORMAL, " " _BLUE_("██║ ██║ ╚═╝ ██║█████╔╝") " " BANNERMSG2); + PrintAndLogEx(NORMAL, " " _BLUE_("╚═╝ ╚═╝ ╚═╝╚════╝ ") " " BANNERMSG3); + break; + } + case ASCII: { + PrintAndLogEx(NORMAL, " ######. ###. ###.#####. "); + PrintAndLogEx(NORMAL, " ##...##.####. ####. ...##."); + PrintAndLogEx(NORMAL, " ######..##.####.##. ####.."); + PrintAndLogEx(NORMAL, " ##..... ##..##..##. ..##." " " BANNERMSG1); + PrintAndLogEx(NORMAL, " ##. ##. .. ##.#####.." " " BANNERMSG2); + PrintAndLogEx(NORMAL, " .. .. .. ..... " " " BANNERMSG3); + break; + } + } } static void showBanner(void) { @@ -94,14 +101,14 @@ static void showBanner(void) { #if defined(_WIN32) if (GetConsoleCP() == 65001) { // If on Windows and using UTF-8 then we need utf-8 ascii art for banner. - utf8_showBanner(); + showBanner_logo(UTF8); } else { - ansi_showBanner(); + showBanner_logo(ANSI); } #elif defined(__linux__) || defined(__APPLE__) - ansi_showBanner(); + showBanner_logo(ANSI); #else - ascii_showBanner(); + showBanner_logo(ASCII); #endif // PrintAndLogEx(NORMAL, "\nSupport iceman on patreon - https://www.patreon.com/iceman1001/"); // PrintAndLogEx(NORMAL, " on paypal - https://www.paypal.me/iceman1001"); From 293b638f717c580a4d447ff6e25ff59152c4d52b Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 8 May 2020 11:55:43 +0200 Subject: [PATCH 104/632] fix mem corruption in trace load/list --- client/src/cmdtrace.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index 2da9ce675..53acb1b92 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -494,6 +494,7 @@ static int CmdTraceLoad(const char *Cmd) { if (g_trace) free(g_trace); + g_traceLen = 0; g_trace = calloc(fsize, sizeof(uint8_t)); if (!g_trace) { PrintAndLogEx(FAILED, "Cannot allocate memory for trace"); @@ -628,16 +629,17 @@ int CmdTraceList(const char *Cmd) { uint16_t tracepos = 0; - // reserve some space. - if (!g_trace) { + + if (isOnline) { + // reserve some space. + if (g_trace) + free(g_trace); + g_traceLen = 0; g_trace = calloc(PM3_CMD_DATA_SIZE, sizeof(uint8_t)); if (g_trace == NULL) { PrintAndLogEx(FAILED, "Cannot allocate memory for trace"); return PM3_EMALLOC; } - } - - if (isOnline) { // Query for the size of the trace, downloading PM3_CMD_DATA_SIZE PacketResponseNG response; if (!GetFromDevice(BIG_BUF, g_trace, PM3_CMD_DATA_SIZE, 0, NULL, 0, &response, 4000, true)) { From f6c2516779075e45ff72d3579abcfd17b1a53fa0 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 8 May 2020 12:30:18 +0200 Subject: [PATCH 105/632] chg: "trace list" - adjust messages --- client/src/cmdtrace.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index 53acb1b92..3e00e10e0 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -496,7 +496,7 @@ static int CmdTraceLoad(const char *Cmd) { g_traceLen = 0; g_trace = calloc(fsize, sizeof(uint8_t)); - if (!g_trace) { + if (g_trace == NULL) { PrintAndLogEx(FAILED, "Cannot allocate memory for trace"); fclose(f); return PM3_EMALLOC; @@ -505,7 +505,7 @@ static int CmdTraceLoad(const char *Cmd) { size_t bytes_read = fread(g_trace, 1, fsize, f); g_traceLen = bytes_read; fclose(f); - PrintAndLogEx(SUCCESS, "Recorded Activity (TraceLen = %lu bytes) loaded from file %s", g_traceLen, filename); + PrintAndLogEx(SUCCESS, "Recorded Activity (TraceLen = " _YELLOW_("%lu") " bytes) loaded from " _YELLOW_("%s"), g_traceLen, filename); return PM3_SUCCESS; } @@ -627,10 +627,8 @@ int CmdTraceList(const char *Cmd) { //Validations if (errors) return usage_trace_list(); - uint16_t tracepos = 0; - - if (isOnline) { + // reserve some space. if (g_trace) free(g_trace); @@ -640,6 +638,9 @@ int CmdTraceList(const char *Cmd) { PrintAndLogEx(FAILED, "Cannot allocate memory for trace"); return PM3_EMALLOC; } + + PrintAndLogEx(INFO, "downloading tracelog from device"); + // Query for the size of the trace, downloading PM3_CMD_DATA_SIZE PacketResponseNG response; if (!GetFromDevice(BIG_BUF, g_trace, PM3_CMD_DATA_SIZE, 0, NULL, 0, &response, 4000, true)) { @@ -665,6 +666,11 @@ int CmdTraceList(const char *Cmd) { } PrintAndLogEx(SUCCESS, "Recorded activity (trace len = " _YELLOW_("%lu") " bytes)", g_traceLen); + if (g_traceLen == 0) { + return PM3_SUCCESS; + } + + uint16_t tracepos = 0; /* if (protocol == FELICA) { From 3716d4d82327477d9a724cdee4ab563f2876b31d Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 8 May 2020 12:42:10 +0200 Subject: [PATCH 106/632] convert OLD->MIX --- armsrc/appmain.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index abfe6a86e..bd8bb8d22 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -1428,7 +1428,7 @@ static void PacketReceived(PacketCommandNG *packet) { // upload file from client uint8_t *mem = BigBuf_get_addr(); memcpy(mem + packet->oldarg[0], packet->data.asBytes, PM3_CMD_DATA_SIZE); - reply_old(CMD_ACK, 1, 0, 0, 0, 0); + reply_mix(CMD_ACK, 1, 0, 0, 0, 0); break; } case CMD_SMART_UPGRADE: { @@ -1628,7 +1628,7 @@ static void PacketReceived(PacketCommandNG *packet) { // arg1 = RFU // arg2 = tracelen? // asbytes = samplingconfig array - reply_old(CMD_ACK, 1, 0, BigBuf_get_traceLen(), getSamplingConfig(), sizeof(sample_config)); + reply_mix(CMD_ACK, 1, 0, BigBuf_get_traceLen(), getSamplingConfig(), sizeof(sample_config)); LED_B_OFF(); break; } @@ -1759,7 +1759,7 @@ static void PacketReceived(PacketCommandNG *packet) { int changed = rdv40_spiffs_lazy_mount(); uint32_t size = size_in_spiffs((char *)filename); if (changed) rdv40_spiffs_lazy_unmount(); - reply_old(CMD_ACK, size, 0, 0, 0, 0); + reply_mix(CMD_ACK, size, 0, 0, 0, 0); LED_B_OFF(); break; } @@ -1935,7 +1935,7 @@ static void PacketReceived(PacketCommandNG *packet) { Flash_UniqueID(info->flashid); FlashStop(); } - reply_old(CMD_ACK, isok, 0, 0, info, sizeof(rdv40_validation_t)); + reply_mix(CMD_ACK, isok, 0, 0, info, sizeof(rdv40_validation_t)); BigBuf_free(); LED_B_OFF(); From 1621b0e7c88d5a1c777bc6a684f5e8633bc3b41d Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 8 May 2020 13:23:06 +0200 Subject: [PATCH 107/632] trace list - different alloc --- client/src/cmdtrace.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index 3e00e10e0..6cbfc2e7a 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -632,7 +632,9 @@ int CmdTraceList(const char *Cmd) { // reserve some space. if (g_trace) free(g_trace); + g_traceLen = 0; + g_trace = calloc(PM3_CMD_DATA_SIZE, sizeof(uint8_t)); if (g_trace == NULL) { PrintAndLogEx(FAILED, "Cannot allocate memory for trace"); @@ -645,18 +647,22 @@ int CmdTraceList(const char *Cmd) { PacketResponseNG response; if (!GetFromDevice(BIG_BUF, g_trace, PM3_CMD_DATA_SIZE, 0, NULL, 0, &response, 4000, true)) { PrintAndLogEx(WARNING, "timeout while waiting for reply."); + free(g_trace); return PM3_ETIMEOUT; } g_traceLen = response.oldarg[2]; + + // if tracelog buffer was larger and we need to download more. if (g_traceLen > PM3_CMD_DATA_SIZE) { - uint8_t *p = realloc(g_trace, g_traceLen); - if (p == NULL) { + + free(g_trace); + g_trace = calloc(g_traceLen, sizeof(uint8_t)); + if (g_trace == NULL) { PrintAndLogEx(FAILED, "Cannot allocate memory for trace"); - free(g_trace); return PM3_EMALLOC; } - g_trace = p; + if (!GetFromDevice(BIG_BUF, g_trace, g_traceLen, 0, NULL, 0, NULL, 2500, false)) { PrintAndLogEx(WARNING, "command execution time out"); free(g_trace); From f70210ebef5eba908ffd862ac614c5a147ed99cf Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 8 May 2020 13:27:45 +0200 Subject: [PATCH 108/632] textual --- client/src/comms.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/client/src/comms.c b/client/src/comms.c index de5eafb24..4c0a8d990 100644 --- a/client/src/comms.c +++ b/client/src/comms.c @@ -830,6 +830,9 @@ static bool dl_it(uint8_t *dest, uint32_t bytes, PacketResponseNG *response, siz if (getReply(response)) { + if (response->cmd == CMD_ACK) + return true; + // sample_buf is a array pointer, located in data.c // arg0 = offset in transfer. Startindex of this chunk // arg1 = length bytes to transfer @@ -852,8 +855,6 @@ static bool dl_it(uint8_t *dest, uint32_t bytes, PacketResponseNG *response, siz memcpy(dest + offset, response->data.asBytes, copy_bytes); bytes_completed += copy_bytes; - } else if (response->cmd == CMD_ACK) { - return true; } else if (response->cmd == CMD_WTX && response->length == sizeof(uint16_t)) { uint16_t wtx = response->data.asDwords[0] & 0xFFFF; PrintAndLogEx(DEBUG, "Got Waiting Time eXtension request %i ms", wtx); @@ -870,8 +871,8 @@ static bool dl_it(uint8_t *dest, uint32_t bytes, PacketResponseNG *response, siz if (msclock() - tmp_clk > 3000 && show_warning) { // 3 seconds elapsed (but this doesn't mean the timeout was exceeded) - PrintAndLogEx(NORMAL, "Waiting for a response from the Proxmark3..."); - PrintAndLogEx(NORMAL, "You can cancel this operation by pressing the pm3 button"); + PrintAndLogEx(INFO, "Waiting for a response from the Proxmark3..."); + PrintAndLogEx(INFO, "You can cancel this operation by pressing the pm3 button"); show_warning = false; } } From 1efda3aa849f1885f3934a1f5d316438076e92f8 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 8 May 2020 13:55:24 +0200 Subject: [PATCH 109/632] fix: zlib compilation on mingw / ps, (@doegox) --- common/zlib/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/zlib/Makefile b/common/zlib/Makefile index 9444aee9f..baec1eb1e 100644 --- a/common/zlib/Makefile +++ b/common/zlib/Makefile @@ -1,7 +1,7 @@ MYSRCPATHS = ../../common/zlib MYSRCS = deflate.c adler32.c trees.c zutil.c inflate.c inffast.c inftrees.c MYINCLUDES = -I../../common/zlib -MYCFLAGS = -Wno-error=strict-prototypes +MYCFLAGS = -Wno-strict-prototypes -Wno-missing-prototypes -Wno-missing-declarations MYDEFS = -DZ_SOLO -DNO_GZIP -DZLIB_PM3_TUNED #-DDEBUG -Dverbose=1 From b028b90f03970505026366a32aef982ee0e968f5 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 8 May 2020 15:03:08 +0200 Subject: [PATCH 110/632] fix coverity 286652 286658 286662 --- client/src/cmdhfmfdes.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index dad36ca3c..5883f1675 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -1968,7 +1968,7 @@ static int CmdHF14ADesClearRecordFile(const char *Cmd) { int fidlength = 0; uint8_t fid[2] = {0}; - CLIParamHexToBuf(arg_get_str(3), fid, 2, &fidlength); + CLIGetHexWithReturn(3, fid, &fidlength); CLIParserFree(); if (filenolen != 1) { @@ -2028,7 +2028,7 @@ static int CmdHF14ADesDeleteFile(const char *Cmd) { int fidlength = 0; uint8_t fid[2] = {0}; - CLIParamHexToBuf(arg_get_str(3), fid, 2, &fidlength); + CLIGetHexWithReturn(3, fid, &fidlength); CLIParserFree(); if (filenolen != 1) { @@ -2093,7 +2093,7 @@ static int CmdHF14ADesCreateFile(const char *Cmd) { int fidlength = 0; uint8_t fid[2] = {0}; - CLIParamHexToBuf(arg_get_str(3), fid, 2, &fidlength); + CLIGetHexWithReturn(3, fid, &fidlength); uint8_t comset = arg_get_int(4); int arlength = 0; @@ -2241,7 +2241,6 @@ static int CmdHF14ADesGetValueData(const char *Cmd) { return res; } - static int CmdHF14ADesReadData(const char *Cmd) { CLIParserInit("hf mfdes readdata", "Read data from File", @@ -2269,11 +2268,11 @@ static int CmdHF14ADesReadData(const char *Cmd) { int offsetlength = 0; uint8_t offset[3] = {0}; - CLIParamHexToBuf(arg_get_str(3), offset, 3, &offsetlength); + CLIGetHexWithReturn(3, offset, &offsetlength); int flength = 0; uint8_t filesize[3] = {0}; - CLIParamHexToBuf(arg_get_str(4), filesize, 3, &flength); + CLIGetHexWithReturn(4, filesize, &flength); int type = arg_get_int(5); CLIParserFree(); @@ -2375,7 +2374,7 @@ static int CmdHF14ADesChangeValue(const char *Cmd) { value.fileno = _fileno[0]; int vlength = 0x0; - CLIParamHexToBuf(arg_get_str(3), value.value, 4, &vlength); + CLIGetHexWithReturn(3, value.value, &vlength); int mode = arg_get_int(4); CLIParserFree(); @@ -2467,7 +2466,7 @@ static int CmdHF14ADesWriteData(const char *Cmd) { int offsetlength = 0; uint8_t offset[3] = {0}; - CLIParamHexToBuf(arg_get_str(3), offset, 3, &offsetlength); + CLIGetHexWithReturn(3, offset, &offsetlength); int dlength = 0xFFFF; uint8_t *data = (uint8_t *)calloc(0xFFFF, sizeof(uint8_t)); @@ -2475,7 +2474,7 @@ static int CmdHF14ADesWriteData(const char *Cmd) { PrintAndLogEx(ERR, "failed to allocate memory"); return PM3_EMALLOC; } - CLIParamHexToBuf(arg_get_str(4), data, 0xFFFF, &dlength); + CLIGetHexWithReturn(4, data, &dlength); int type = arg_get_int(5); @@ -2580,7 +2579,7 @@ static int CmdHF14ADesCreateRecordFile(const char *Cmd) { int fidlength = 0; uint8_t fid[2] = {0}; - CLIParamHexToBuf(arg_get_str(3), fid, 2, &fidlength); + CLIGetHexWithReturn(3, fid, &fidlength); uint8_t comset = arg_get_int(4); int arlength = 0; @@ -3445,7 +3444,7 @@ static int CmdHF14ADesAuth(const char *Cmd) { uint8_t key[24] = {0}; int keylen = 0; - CLIParamHexToBuf(arg_get_str(5), key, 24, &keylen); + CLIGetHexWithReturn(5, key, &keylen); CLIParserFree(); if (keylen == 0) { From 7cfdc4f081fada4b4639c2f752b549da71183e8b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 8 May 2020 16:26:08 +0200 Subject: [PATCH 111/632] add a tracelog file, hf mfu sniff or a ntag --- traces/hf_mfu.trace | Bin 0 -> 372 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 traces/hf_mfu.trace diff --git a/traces/hf_mfu.trace b/traces/hf_mfu.trace new file mode 100644 index 0000000000000000000000000000000000000000..7b325653cbc0c19bc01a08cf67597e5c6e215548 GIT binary patch literal 372 zcmb0>evwsyg^@vx;r#iFtPY$^4K54^SoLqPF5qNhn5@uXX?uh9fEa5-2g?ds%NdWS z-D6eIq=H87w7bI Date: Fri, 8 May 2020 16:26:28 +0200 Subject: [PATCH 112/632] chg: more regression tests --- pm3test.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pm3test.sh b/pm3test.sh index 9a90ddcc5..f96285e7e 100755 --- a/pm3test.sh +++ b/pm3test.sh @@ -108,9 +108,11 @@ while true; do if ! CheckExecute "proxmark help text hardnested" "$PM3BIN -t 2>&1" "hardnested"; then break; fi printf "\n${C_BLUE}Testing data manipulation:${C_NC}\n" - if ! CheckExecute "reveng readline test" "$PM3BIN -c 'reveng -h;reveng -D'" "CRC-64/GO-ISO"; then break; fi - if ! CheckExecute "reveng test" "$PM3BIN -c 'reveng -w 8 -s 01020304e3 010204039d'" "CRC-8/SMBUS"; then break; fi - if ! CheckExecute "mfu pwdgen test" "$PM3BIN -c 'hf mfu pwdgen t'" "Selftest OK"; then break; fi + if ! CheckExecute "reveng readline test" "$PM3BIN -c 'reveng -h;reveng -D'" "CRC-64/GO-ISO"; then break; fi + if ! CheckExecute "reveng -g test" "$PM3BIN -c 'reveng -g abda202c'" "CRC-16/ISO-IEC-14443-3-A"; then break; fi + if ! CheckExecute "reveng -w test" "$PM3BIN -c 'reveng -w 8 -s 01020304e3 010204039d'" "CRC-8/SMBUS"; then break; fi + if ! CheckExecute "mfu pwdgen test" "$PM3BIN -c 'hf mfu pwdgen t'" "Selftest OK"; then break; fi + if ! CheckExecute "trace load/list test" "$PM3BIN -c 'trace load traces/hf_mfu.trace; trace list 1;'" "READBLOCK(8)"; then break; fi printf "\n${C_BLUE}Testing LF:${C_NC}\n" if ! CheckExecute "lf EM4x05 test" "$PM3BIN -c 'data load traces/em4x05.pm3;lf search 1'" "FDX-B ID found"; then break; fi From 3720ff144de128361ecd89e674f0a5723ce4a0a2 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 8 May 2020 16:26:58 +0200 Subject: [PATCH 113/632] coverity nags --- armsrc/lfops.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/armsrc/lfops.c b/armsrc/lfops.c index c65696d1a..712760636 100644 --- a/armsrc/lfops.c +++ b/armsrc/lfops.c @@ -261,8 +261,9 @@ void printT55xxConfig(void) { else PRN_NA; + // remove last space s[strlen(s)] = 0; - DbpString(s); + DbpStringEx(FLAG_LOG, s, sizeof(s)); } DbpString(""); } From b78e060909bab6a0953e3ab1e2672f66d22affc1 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 8 May 2020 16:43:31 +0200 Subject: [PATCH 114/632] textual --- client/src/flash.c | 6 +++--- client/src/proxmark3.c | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/client/src/flash.c b/client/src/flash.c index 278aa34d9..249f7d826 100644 --- a/client/src/flash.c +++ b/client/src/flash.c @@ -240,7 +240,7 @@ int flash_load(flash_file_t *ctx, const char *name, int can_write_bl, int flash_ goto fail; } - PrintAndLogEx(SUCCESS, _BLUE_("Loading ELF file") _YELLOW_(" %s"), name); + PrintAndLogEx(SUCCESS, _CYAN_("Loading ELF file") _YELLOW_(" %s"), name); if (fread(&ehdr, sizeof(ehdr), 1, fd) != 1) { PrintAndLogEx(ERR, "Error while reading ELF file header"); @@ -356,7 +356,7 @@ static int enter_bootloader(char *serial_port_name) { return PM3_SUCCESS; if (state & DEVICE_INFO_FLAG_CURRENT_MODE_OS) { - PrintAndLogEx(SUCCESS, _BLUE_("Entering bootloader...")); + PrintAndLogEx(SUCCESS, _CYAN_("Entering bootloader...")); if ((state & DEVICE_INFO_FLAG_BOOTROM_PRESENT) && (state & DEVICE_INFO_FLAG_OSIMAGE_PRESENT)) { @@ -375,7 +375,7 @@ static int enter_bootloader(char *serial_port_name) { msleep(1000); if (OpenProxmark(serial_port_name, true, 60, true, FLASHMODE_SPEED)) { - PrintAndLogEx(NORMAL, " " _GREEN_("Found")); + PrintAndLogEx(NORMAL, _GREEN_(" found")); return PM3_SUCCESS; } else { PrintAndLogEx(ERR, _RED_("Error:") " Proxmark3 not found."); diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index 0a0e99024..a592503de 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -549,11 +549,11 @@ static int flash_pm3(char *serial_port_name, uint8_t num_files, char *filenames[ PrintAndLogEx(SUCCESS, "About to use the following file%s:", num_files > 1 ? "s" : ""); for (int i = 0 ; i < num_files; ++i) { - PrintAndLogEx(SUCCESS, " %s", filepaths[i]); + PrintAndLogEx(SUCCESS, " "_YELLOW_("%s"), filepaths[i]); } if (OpenProxmark(serial_port_name, true, 60, true, FLASHMODE_SPEED)) { - PrintAndLogEx(NORMAL, _GREEN_("Found")); + PrintAndLogEx(NORMAL, _GREEN_(" found")); } else { PrintAndLogEx(ERR, "Could not find Proxmark3 on " _RED_("%s") ".\n", serial_port_name); ret = PM3_ETIMEOUT; @@ -577,7 +577,7 @@ static int flash_pm3(char *serial_port_name, uint8_t num_files, char *filenames[ PrintAndLogEx(NORMAL, ""); } - PrintAndLogEx(SUCCESS, "\n" _BLUE_("Flashing...")); + PrintAndLogEx(SUCCESS, _CYAN_("Flashing...")); for (int i = 0; i < num_files; i++) { ret = flash_write(&files[i]); @@ -585,7 +585,7 @@ static int flash_pm3(char *serial_port_name, uint8_t num_files, char *filenames[ goto finish; } flash_free(&files[i]); - PrintAndLogEx(NORMAL, "\n"); + PrintAndLogEx(NORMAL, ""); } finish: @@ -597,9 +597,9 @@ finish2: free(filepaths[i]); } if (ret == PM3_SUCCESS) - PrintAndLogEx(SUCCESS, _BLUE_("All done.")); + PrintAndLogEx(SUCCESS, _CYAN_("All done")); else - PrintAndLogEx(ERR, "Aborted on error."); + PrintAndLogEx(ERR, "Aborted on error"); PrintAndLogEx(NORMAL, "\nHave a nice day!"); return ret; } From 74f16dc092033d13a4488c8a432e95373da27ae0 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 8 May 2020 15:56:32 +0200 Subject: [PATCH 115/632] move whereami to deps --- client/CMakeLists.txt | 18 ++++++++++++++++-- client/Makefile | 18 ++++++++++++------ client/android/CMakeLists.txt | 17 +++++++++++++++-- client/deps/CMakeLists.txt | 3 ++- client/deps/whereami.cmake | 6 ++++++ client/deps/whereami/Makefile | 9 +++++++++ client/{src => deps/whereami}/whereami.c | 0 client/{src => deps/whereami}/whereami.h | 0 8 files changed, 60 insertions(+), 11 deletions(-) create mode 100644 client/deps/whereami.cmake create mode 100644 client/deps/whereami/Makefile rename client/{src => deps/whereami}/whereami.c (100%) rename client/{src => deps/whereami}/whereami.h (100%) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 7b17c1e36..07d2abb40 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -174,7 +174,6 @@ set (TARGET_SOURCES src/tea.c src/ui.c src/util.c - src/whereami.c src/wiegand_formats.c src/wiegand_formatutils.c ) @@ -260,8 +259,23 @@ find_library(pm3rrg_rdv4_mbedtls REQUIRED) find_library(pm3rrg_rdv4_reveng REQUIRED) find_library(pm3rrg_rdv4_z REQUIRED) find_library(pm3rrg_rdv4_hardnested REQUIRED) +find_library(pm3rrg_rdv4_whereami REQUIRED) -target_link_libraries(proxmark3 PRIVATE readline pthread m pm3rrg_rdv4_mbedtls pm3rrg_rdv4_cliparser pm3rrg_rdv4_jansson pm3rrg_rdv4_lua pm3rrg_rdv4_tinycbor pm3rrg_rdv4_amiibo pm3rrg_rdv4_reveng pm3rrg_rdv4_z pm3rrg_rdv4_hardnested ${ADDITIONAL_LNK}) +target_link_libraries(proxmark3 PRIVATE + readline + pthread + m + pm3rrg_rdv4_mbedtls + pm3rrg_rdv4_cliparser + pm3rrg_rdv4_jansson + pm3rrg_rdv4_lua + pm3rrg_rdv4_tinycbor + pm3rrg_rdv4_amiibo + pm3rrg_rdv4_reveng + pm3rrg_rdv4_z + pm3rrg_rdv4_hardnested + pm3rrg_rdv4_whereami + ${ADDITIONAL_LNK}) install(TARGETS proxmark3 DESTINATION "bin") install(DIRECTORY cmdscripts lualibs luascripts resources dictionaries DESTINATION "share/proxmark3") diff --git a/client/Makefile b/client/Makefile index 3a3aeedce..48789d9f9 100644 --- a/client/Makefile +++ b/client/Makefile @@ -46,6 +46,8 @@ HARDNESTEDPATH = ./deps/hardnested HARDNESTEDLIB = $(HARDNESTEDPATH)/libhardnested.a CLIPARSERPATH = ./deps/cliparser CLIPARSERLIB = $(CLIPARSERPATH)/libcliparser.a +WAILIBPATH = ./deps/whereami +WAILIB = $(WAILIBPATH)/libwhereami.a # common libraries MBEDTLSLIBPATH = ../common/mbedtls @@ -53,12 +55,12 @@ MBEDTLSLIB = $(OBJDIR)/libmbedtls.a ZLIBPATH = ../common/zlib ZLIB = $(OBJDIR)/libz.a -LIBS = -I$(LUALIBPATH) -I$(MBEDTLSLIBPATH) -I$(JANSSONLIBPATH) -I$(CBORLIBPATH) -I$(ZLIBPATH) -I$(REVENGPATH) -I$(AMIIBOLIBPATH) -I$(HARDNESTEDPATH) -I$(CLIPARSERPATH) +LIBS = -I$(LUALIBPATH) -I$(MBEDTLSLIBPATH) -I$(JANSSONLIBPATH) -I$(CBORLIBPATH) -I$(ZLIBPATH) -I$(REVENGPATH) -I$(AMIIBOLIBPATH) -I$(HARDNESTEDPATH) -I$(CLIPARSERPATH) -I$(WAILIBPATH) INCLUDES_CLIENT += -I./src -I../include -I../common -I../common_fpga $(LIBS) CFLAGS ?= $(DEFCFLAGS) # We cannot just use CFLAGS+=... because it has impact on sub-makes if CFLAGS is defined in env: -PM3CFLAGS = $(CFLAGS) $(INCLUDES_CLIENT) -DWAI_PM3_TUNED +PM3CFLAGS = $(CFLAGS) $(INCLUDES_CLIENT) # WIP Testing #PM3CFLAGS = $(CFLAGS) -std=c11 -pedantic $(INCLUDES_CLIENT) PREFIX ?= /usr/local @@ -192,7 +194,6 @@ CMDSRCS = crapto1/crapto1.c \ loclass/ikeys.c \ loclass/elite_crack.c \ fileutils.c \ - whereami.c \ mifare/mifarehost.c \ parity.c \ crc.c \ @@ -313,8 +314,8 @@ all: $(BINS) all-static: LDLIBS:=-static $(LDLIBS) all-static: $(BINS) -proxmark3: LDLIBS+=$(LUALIB) $(JANSSONLIB) $(MBEDTLSLIB) $(CBORLIB) $(ZLIB) $(REVENGLIB) $(AMIIBOLIB) $(HARDNESTEDLIB) $(CLIPARSERLIB) $(BTLDLIBS) $(QTLDLIBS) -proxmark3: $(OBJDIR)/proxmark3.o $(COREOBJS) $(CMDOBJS) $(OBJCOBJS) $(QTGUIOBJS) liblua jansson tinycbor reveng mbedtls zlib amiibo hardnested cliparser lualibs/pm3_cmd.lua lualibs/mfc_default_keys.lua +proxmark3: LDLIBS+=$(LUALIB) $(JANSSONLIB) $(MBEDTLSLIB) $(CBORLIB) $(ZLIB) $(REVENGLIB) $(AMIIBOLIB) $(HARDNESTEDLIB) $(CLIPARSERLIB) $(WAILIB) $(BTLDLIBS) $(QTLDLIBS) +proxmark3: $(OBJDIR)/proxmark3.o $(COREOBJS) $(CMDOBJS) $(OBJCOBJS) $(QTGUIOBJS) liblua jansson tinycbor reveng mbedtls zlib amiibo hardnested cliparser whereami lualibs/pm3_cmd.lua lualibs/mfc_default_keys.lua $(info [=] LD $@) $(Q)$(LD) $(LDFLAGS) $(OBJDIR)/proxmark3.o $(COREOBJS) $(CMDOBJS) $(OBJCOBJS) $(QTGUIOBJS) $(LDLIBS) -o $@ @@ -346,6 +347,7 @@ clean: $(Q)$(MAKE) --no-print-directory -C $(AMIIBOLIBPATH) clean $(Q)$(MAKE) --no-print-directory -C $(HARDNESTEDPATH) clean $(Q)$(MAKE) --no-print-directory -C $(CLIPARSERPATH) clean + $(Q)$(MAKE) --no-print-directory -C $(WAILIBPATH) clean install: all $(info [@] Installing client to $(DESTDIR)$(PREFIX)...) @@ -402,6 +404,10 @@ cliparser: $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C $(CLIPARSERPATH) all +whereami: + $(info [*] MAKE $@) + $(Q)$(MAKE) --no-print-directory -C $(WAILIBPATH) all + # common libraries: mbedtls: $(info [*] MAKE $@) @@ -411,7 +417,7 @@ zlib: $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C $(ZLIBPATH) OBJDIR=$(ROOT_DIR)$(OBJDIR) BINDIR=$(ROOT_DIR)$(OBJDIR) all -.PHONY: all clean install uninstall tarbin liblua jansson tinycbor reveng hardnested amiibo cliparser mbedtls zlib +.PHONY: all clean install uninstall tarbin liblua jansson tinycbor reveng hardnested amiibo cliparser whereami mbedtls zlib # easy printing of MAKE VARIABLES print-%: ; @echo $* = $($*) diff --git a/client/android/CMakeLists.txt b/client/android/CMakeLists.txt index fc7c759bb..318909e72 100644 --- a/client/android/CMakeLists.txt +++ b/client/android/CMakeLists.txt @@ -136,7 +136,6 @@ add_library(pm3rrg_rdv4 SHARED ${PM3_ROOT}/client/src/cmdparser.c ${PM3_ROOT}/client/src/cmdscript.c ${PM3_ROOT}/client/src/cmdlfvisa2000.c - ${PM3_ROOT}/client/src/whereami.c ${PM3_ROOT}/client/src/cmdmain.c ${PM3_ROOT}/client/src/cmdflashmem.c ${PM3_ROOT}/client/src/scripting.c @@ -167,5 +166,19 @@ find_library(pm3rrg_rdv4_mbedtls REQUIRED) find_library(pm3rrg_rdv4_reveng REQUIRED) find_library(pm3rrg_rdv4_z REQUIRED) find_library(pm3rrg_rdv4_hardnested REQUIRED) +find_library(pm3rrg_rdv4_whereami REQUIRED) -target_link_libraries(pm3rrg_rdv4 pm3rrg_rdv4_hardnested pm3rrg_rdv4_mbedtls pm3rrg_rdv4_cliparser pm3rrg_rdv4_jansson pm3rrg_rdv4_lua pm3rrg_rdv4_tinycbor pm3rrg_rdv4_amiibo pm3rrg_rdv4_reveng pm3rrg_rdv4_z android log) \ No newline at end of file +target_link_libraries( + pm3rrg_rdv4 + pm3rrg_rdv4_hardnested + pm3rrg_rdv4_mbedtls + pm3rrg_rdv4_cliparser + pm3rrg_rdv4_jansson + pm3rrg_rdv4_lua + pm3rrg_rdv4_tinycbor + pm3rrg_rdv4_amiibo + pm3rrg_rdv4_reveng + pm3rrg_rdv4_whereami + pm3rrg_rdv4_z + android + log) diff --git a/client/deps/CMakeLists.txt b/client/deps/CMakeLists.txt index 6b577d438..ac42065bf 100644 --- a/client/deps/CMakeLists.txt +++ b/client/deps/CMakeLists.txt @@ -6,4 +6,5 @@ include(mbedtls.cmake) include(amiibo.cmake) include(reveng.cmake) include(zlib.cmake) -include(hardnested.cmake) \ No newline at end of file +include(hardnested.cmake) +include(whereami.cmake) diff --git a/client/deps/whereami.cmake b/client/deps/whereami.cmake new file mode 100644 index 000000000..d2d6a5b2a --- /dev/null +++ b/client/deps/whereami.cmake @@ -0,0 +1,6 @@ +add_library(pm3rrg_rdv4_whereami STATIC whereami/whereami.c) + +target_compile_definitions(pm3rrg_rdv4_whereami PRIVATE WAI_PM3_TUNED) +target_include_directories(pm3rrg_rdv4_whereami INTERFACE whereami) +target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -Werror -O3) +set_property(TARGET pm3rrg_rdv4_whereami PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/whereami/Makefile b/client/deps/whereami/Makefile new file mode 100644 index 000000000..c25e4b056 --- /dev/null +++ b/client/deps/whereami/Makefile @@ -0,0 +1,9 @@ +MYSRCPATHS = +MYINCLUDES = +MYCFLAGS = +MYDEFS = -DWAI_PM3_TUNED +MYSRCS = whereami.c + +LIB_A = libwhereami.a + +include ../../../Makefile.host diff --git a/client/src/whereami.c b/client/deps/whereami/whereami.c similarity index 100% rename from client/src/whereami.c rename to client/deps/whereami/whereami.c diff --git a/client/src/whereami.h b/client/deps/whereami/whereami.h similarity index 100% rename from client/src/whereami.h rename to client/deps/whereami/whereami.h From a2b776ed1e5ae453b77f11aa329b46dbe15b78f8 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 8 May 2020 16:31:46 +0200 Subject: [PATCH 116/632] Remove redundant def --- client/android/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/android/CMakeLists.txt b/client/android/CMakeLists.txt index 318909e72..2a313532e 100644 --- a/client/android/CMakeLists.txt +++ b/client/android/CMakeLists.txt @@ -5,7 +5,7 @@ cmake_minimum_required(VERSION 3.4.1) # NDK version for SDK 19 doesn't implement the whole C++11 standard in the STL. # see: https://stackoverflow.com/questions/44736135/ndk-clang-error-undefined-reference-to-localeconv # so we need add def getlocaledecpoint()='.' -add_definitions(-DANDROID -D"getlocaledecpoint\(\)='.'" -DZ_SOLO) +add_definitions(-DANDROID -D"getlocaledecpoint\(\)='.'") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -O3 -fvisibility=hidden -w") From c24df1547a2f5e29aed5626c272f9e76bbe63211 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 8 May 2020 16:36:35 +0200 Subject: [PATCH 117/632] android cmake: remove c99 restriction --- client/android/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/android/CMakeLists.txt b/client/android/CMakeLists.txt index 2a313532e..5b417ff63 100644 --- a/client/android/CMakeLists.txt +++ b/client/android/CMakeLists.txt @@ -7,7 +7,7 @@ cmake_minimum_required(VERSION 3.4.1) # so we need add def getlocaledecpoint()='.' add_definitions(-DANDROID -D"getlocaledecpoint\(\)='.'") -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -O3 -fvisibility=hidden -w") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3 -fvisibility=hidden -w") # Root path into client set(PM3_ROOT ../../) From 68cb1efe148103bcacda75f84012db0eac9f9f5f Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 8 May 2020 17:40:13 +0200 Subject: [PATCH 118/632] Clean deps just in case --- client/Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/Makefile b/client/Makefile index 48789d9f9..10345e683 100644 --- a/client/Makefile +++ b/client/Makefile @@ -348,6 +348,9 @@ clean: $(Q)$(MAKE) --no-print-directory -C $(HARDNESTEDPATH) clean $(Q)$(MAKE) --no-print-directory -C $(CLIPARSERPATH) clean $(Q)$(MAKE) --no-print-directory -C $(WAILIBPATH) clean + @# Just in case someone compiled within these dirs: + $(Q)$(MAKE) --no-print-directory -C $(ZLIBPATH) clean + $(Q)$(MAKE) --no-print-directory -C $(MBEDTLSLIBPATH) clean install: all $(info [@] Installing client to $(DESTDIR)$(PREFIX)...) From f97516ca38d55bc47c787872313de8d4cbf92b4a Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 8 May 2020 17:42:37 +0200 Subject: [PATCH 119/632] textual coherence --- client/Makefile | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/client/Makefile b/client/Makefile index 10345e683..37096d6e6 100644 --- a/client/Makefile +++ b/client/Makefile @@ -38,14 +38,14 @@ JANSSONLIBPATH = ./deps/jansson JANSSONLIB = $(JANSSONLIBPATH)/libjansson.a CBORLIBPATH = ./deps/tinycbor CBORLIB = $(CBORLIBPATH)/tinycbor.a -REVENGPATH = ./deps/reveng -REVENGLIB = $(REVENGPATH)/libreveng.a +REVENGLIBPATH = ./deps/reveng +REVENGLIB = $(REVENGLIBPATH)/libreveng.a AMIIBOLIBPATH = ./deps/amiitool AMIIBOLIB = $(AMIIBOLIBPATH)/libamiibo.a -HARDNESTEDPATH = ./deps/hardnested -HARDNESTEDLIB = $(HARDNESTEDPATH)/libhardnested.a -CLIPARSERPATH = ./deps/cliparser -CLIPARSERLIB = $(CLIPARSERPATH)/libcliparser.a +HARDNESTEDLIBPATH = ./deps/hardnested +HARDNESTEDLIB = $(HARDNESTEDLIBPATH)/libhardnested.a +CLIPARSERLIBPATH = ./deps/cliparser +CLIPARSERLIB = $(CLIPARSERLIBPATH)/libcliparser.a WAILIBPATH = ./deps/whereami WAILIB = $(WAILIBPATH)/libwhereami.a @@ -55,7 +55,7 @@ MBEDTLSLIB = $(OBJDIR)/libmbedtls.a ZLIBPATH = ../common/zlib ZLIB = $(OBJDIR)/libz.a -LIBS = -I$(LUALIBPATH) -I$(MBEDTLSLIBPATH) -I$(JANSSONLIBPATH) -I$(CBORLIBPATH) -I$(ZLIBPATH) -I$(REVENGPATH) -I$(AMIIBOLIBPATH) -I$(HARDNESTEDPATH) -I$(CLIPARSERPATH) -I$(WAILIBPATH) +LIBS = -I$(LUALIBPATH) -I$(MBEDTLSLIBPATH) -I$(JANSSONLIBPATH) -I$(CBORLIBPATH) -I$(ZLIBPATH) -I$(REVENGLIBPATH) -I$(AMIIBOLIBPATH) -I$(HARDNESTEDLIBPATH) -I$(CLIPARSERLIBPATH) -I$(WAILIBPATH) INCLUDES_CLIENT += -I./src -I../include -I../common -I../common_fpga $(LIBS) CFLAGS ?= $(DEFCFLAGS) @@ -343,10 +343,10 @@ clean: $(Q)$(MAKE) --no-print-directory -C $(LUALIBPATH) clean $(Q)$(MAKE) --no-print-directory -C $(JANSSONLIBPATH) clean $(Q)$(MAKE) --no-print-directory -C $(CBORLIBPATH) clean - $(Q)$(MAKE) --no-print-directory -C $(REVENGPATH) clean + $(Q)$(MAKE) --no-print-directory -C $(REVENGLIBPATH) clean $(Q)$(MAKE) --no-print-directory -C $(AMIIBOLIBPATH) clean - $(Q)$(MAKE) --no-print-directory -C $(HARDNESTEDPATH) clean - $(Q)$(MAKE) --no-print-directory -C $(CLIPARSERPATH) clean + $(Q)$(MAKE) --no-print-directory -C $(HARDNESTEDLIBPATH) clean + $(Q)$(MAKE) --no-print-directory -C $(CLIPARSERLIBPATH) clean $(Q)$(MAKE) --no-print-directory -C $(WAILIBPATH) clean @# Just in case someone compiled within these dirs: $(Q)$(MAKE) --no-print-directory -C $(ZLIBPATH) clean @@ -393,11 +393,11 @@ tinycbor: reveng: $(info [*] MAKE $@) - $(Q)$(MAKE) --no-print-directory -C $(REVENGPATH) all + $(Q)$(MAKE) --no-print-directory -C $(REVENGLIBPATH) all hardnested: $(info [*] MAKE $@) - $(Q)$(MAKE) --no-print-directory -C $(HARDNESTEDPATH) all + $(Q)$(MAKE) --no-print-directory -C $(HARDNESTEDLIBPATH) all amiibo: $(info [*] MAKE $@) @@ -405,7 +405,7 @@ amiibo: cliparser: $(info [*] MAKE $@) - $(Q)$(MAKE) --no-print-directory -C $(CLIPARSERPATH) all + $(Q)$(MAKE) --no-print-directory -C $(CLIPARSERLIBPATH) all whereami: $(info [*] MAKE $@) From ff7b7b3a6f9ef774e69d723a46ce0a1dfaea36e7 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 8 May 2020 18:12:10 +0200 Subject: [PATCH 120/632] proper filtering of RL markers --- client/src/proxmark3.c | 5 ++++- client/src/ui.c | 17 +++++++++++++---- client/src/ui.h | 1 + 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index a592503de..53cef9067 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -331,7 +331,10 @@ check_script: } char prompt[PROXPROMPT_MAX_SIZE] = {0}; prompt_compose(prompt, sizeof(prompt), prompt_ctx, prompt_dev); - PrintAndLogEx(NORMAL, "%s%s", prompt, cmd); + // always filter RL magic separators if not using readline + char prompt_filtered[PROXPROMPT_MAX_SIZE] = {0}; + memcpy_filter_rlmarkers(prompt_filtered, prompt, sizeof(prompt_filtered)); + PrintAndLogEx(NORMAL, "%s%s", prompt_filtered, cmd); g_printAndLog = PRINTANDLOG_PRINT | PRINTANDLOG_LOG; // add to history if not from a script diff --git a/client/src/ui.c b/client/src/ui.c index f4e9ec9a6..5d5b84743 100644 --- a/client/src/ui.c +++ b/client/src/ui.c @@ -351,6 +351,19 @@ void SetFlushAfterWrite(bool value) { flushAfterWrite = value; } +void memcpy_filter_rlmarkers(void *dest, const void *src, size_t n) { + uint8_t *rdest = (uint8_t *)dest; + uint8_t *rsrc = (uint8_t *)src; + uint16_t si = 0; + for (uint16_t i = 0; i < n; i++) { + if ((i < n) + && ((rsrc[i] == '\001') || (rsrc[i] == '\002'))) + // skip readline special markers + continue; + rdest[si++] = rsrc[i]; + } +} + void memcpy_filter_ansi(void *dest, const void *src, size_t n, bool filter) { if (filter) { // Filter out ANSI sequences on these OS @@ -358,10 +371,6 @@ void memcpy_filter_ansi(void *dest, const void *src, size_t n, bool filter) { uint8_t *rsrc = (uint8_t *)src; uint16_t si = 0; for (uint16_t i = 0; i < n; i++) { - if ((i < n) - && ((rsrc[i] == '\001') || (rsrc[i] == '\002'))) - // skip readline special markers - continue; if ((i < n - 1) && (rsrc[i] == '\x1b') && (rsrc[i + 1] >= 0x40) diff --git a/client/src/ui.h b/client/src/ui.h index 7a2c90659..20b5a3619 100644 --- a/client/src/ui.h +++ b/client/src/ui.h @@ -56,6 +56,7 @@ void PrintAndLogOptions(const char *str[][2], size_t size, size_t space); void PrintAndLogEx(logLevel_t level, const char *fmt, ...); void SetFlushAfterWrite(bool value); void memcpy_filter_ansi(void *dest, const void *src, size_t n, bool filter); +void memcpy_filter_rlmarkers(void *dest, const void *src, size_t n); void memcpy_filter_emoji(void *dest, const void *src, size_t n, emojiMode_t mode); int searchHomeFilePath(char **foundpath, const char *filename, bool create_home); From 36cad6f51a4c80660df68b91c7105ec904aed002 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 8 May 2020 18:12:39 +0200 Subject: [PATCH 121/632] textual --- client/luascripts/test_t55x7_psk.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/client/luascripts/test_t55x7_psk.lua b/client/luascripts/test_t55x7_psk.lua index 0c991dcb0..361b231c4 100644 --- a/client/luascripts/test_t55x7_psk.lua +++ b/client/luascripts/test_t55x7_psk.lua @@ -6,7 +6,7 @@ local ansicolors = require('ansicolors') copyright = '' author = 'Iceman' -version = 'v1.0.2' +version = 'v1.0.3' desc = [[ This script will program a T55x7 TAG with the configuration: block 0x00 data 0x00088040 The outlined procedure is as following: @@ -31,7 +31,6 @@ In all 12 individual test for the PSK demod ]] example = [[ 1. script run test_t55x7_psk - 2. script run test_t55x7_psk -o ]] usage = [[ script run test_t55x7_psk [-h] From 24c85e74ac399b1b0186dfae6769e15ff8a9afd6 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 8 May 2020 18:14:06 +0200 Subject: [PATCH 122/632] I see coverity coming... --- client/src/ui.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/client/src/ui.c b/client/src/ui.c index 5d5b84743..ce3c528f4 100644 --- a/client/src/ui.c +++ b/client/src/ui.c @@ -356,8 +356,7 @@ void memcpy_filter_rlmarkers(void *dest, const void *src, size_t n) { uint8_t *rsrc = (uint8_t *)src; uint16_t si = 0; for (uint16_t i = 0; i < n; i++) { - if ((i < n) - && ((rsrc[i] == '\001') || (rsrc[i] == '\002'))) + if ((rsrc[i] == '\001') || (rsrc[i] == '\002')) // skip readline special markers continue; rdest[si++] = rsrc[i]; From a96e94b8728cdedef5c46443b2c8fcae2ff69353 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 8 May 2020 21:13:01 +0200 Subject: [PATCH 123/632] coverity fix --- armsrc/lfsampling.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/armsrc/lfsampling.c b/armsrc/lfsampling.c index 2851dc08b..ae61aa612 100644 --- a/armsrc/lfsampling.c +++ b/armsrc/lfsampling.c @@ -110,24 +110,27 @@ void initSampleBuffer(uint32_t *sample_size) { } void initSampleBufferEx(uint32_t *sample_size, bool use_malloc) { - + if (sample_size == NULL) { + Dbprintf("initSampleBufferEx, param NULL"); + return; + } BigBuf_free(); + // We can't erase the buffer now, it would drastically delay the acquisition if (use_malloc) { - if (sample_size == NULL || *sample_size == 0) { + if (*sample_size == 0) { *sample_size = BigBuf_max_traceLen(); data.buffer = BigBuf_get_addr(); } else { *sample_size = MIN(*sample_size, BigBuf_max_traceLen()); data.buffer = BigBuf_malloc(*sample_size); - } } else { - if (sample_size == NULL || *sample_size == 0) { + if (*sample_size == 0) { *sample_size = BigBuf_max_traceLen(); } data.buffer = BigBuf_get_addr(); From c687ced062712df2053a51ab732675caea13837e Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 8 May 2020 21:14:23 +0200 Subject: [PATCH 124/632] chg: lf keri demod - more leanient when it comes to bits --- client/src/cmdlfkeri.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdlfkeri.c b/client/src/cmdlfkeri.c index 5e126955e..135bc2640 100644 --- a/client/src/cmdlfkeri.c +++ b/client/src/cmdlfkeri.c @@ -390,7 +390,7 @@ int detectKeri(uint8_t *dest, size_t *size, bool *invert) { *invert ^= 1; } - if (*size != 64) return -3; //wrong demoded size + if (*size < 64) return -3; //wrong demoded size return (int)startIdx; } From 93c1be689ac9fce5420a52a207ecb86a2ba1d732 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 9 May 2020 00:23:46 +0200 Subject: [PATCH 125/632] lfsampling: interruptible only when logging not yet triggered --- armsrc/lfsampling.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/armsrc/lfsampling.c b/armsrc/lfsampling.c index ae61aa612..9f875cd92 100644 --- a/armsrc/lfsampling.c +++ b/armsrc/lfsampling.c @@ -259,7 +259,8 @@ uint32_t DoAcquisition(uint8_t decimation, uint8_t bits_per_sample, bool avg, in while (!BUTTON_PRESS()) { // only every 1000th times, in order to save time when collecting samples. - if (checked == 1000) { + // interruptible only when logging not yet triggered + if ((checked == 1000) && (trigger_threshold > 0)) { if (data_available()) { checked = -1; break; From c349aa0a13174a8989a31d1749c2c055062d6e2d Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 9 May 2020 00:24:20 +0200 Subject: [PATCH 126/632] make style --- client/src/proxmark3.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index 53cef9067..08a4686ac 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -49,27 +49,27 @@ typedef enum LogoMode { UTF8, ANSI, ASCII } LogoMode; static void showBanner_logo(LogoMode mode) { switch (mode) { case UTF8: { - const char* sq = "\xE2\x96\x88"; // square block - const char* tr = "\xE2\x95\x97"; // top right corner - const char* tl = "\xE2\x95\x94"; // top left corner - const char* br = "\xE2\x95\x9D"; // bottom right corner - const char* bl = "\xE2\x95\x9A"; // bottom left corner - const char* hl = "\xE2\x95\x90"; // horiz line - const char* vl = "\xE2\x95\x91"; // vert line - const char* __ = " "; + const char *sq = "\xE2\x96\x88"; // square block + const char *tr = "\xE2\x95\x97"; // top right corner + const char *tl = "\xE2\x95\x94"; // top left corner + const char *br = "\xE2\x95\x9D"; // bottom right corner + const char *bl = "\xE2\x95\x9A"; // bottom left corner + const char *hl = "\xE2\x95\x90"; // horiz line + const char *vl = "\xE2\x95\x91"; // vert line + const char *__ = " "; PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"), - sq, sq, sq, sq, sq, sq, tr, __, sq, sq, sq, tr, __, __, __, sq, sq, sq, tr, sq, sq, sq, sq, sq, tr, __); + sq, sq, sq, sq, sq, sq, tr, __, sq, sq, sq, tr, __, __, __, sq, sq, sq, tr, sq, sq, sq, sq, sq, tr, __); PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"), - sq, sq, tl, hl, hl, sq, sq, tr, sq, sq, sq, sq, tr, __, sq, sq, sq, sq, vl, bl, hl, hl, hl, sq, sq, tr); + sq, sq, tl, hl, hl, sq, sq, tr, sq, sq, sq, sq, tr, __, sq, sq, sq, sq, vl, bl, hl, hl, hl, sq, sq, tr); PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"), - sq, sq, sq, sq, sq, sq, tl, br, sq, sq, tl, sq, sq, sq, sq, tl, sq, sq, vl, __, sq, sq, sq, sq, tl, br); + sq, sq, sq, sq, sq, sq, tl, br, sq, sq, tl, sq, sq, sq, sq, tl, sq, sq, vl, __, sq, sq, sq, sq, tl, br); PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s")" " BANNERMSG1, - sq, sq, tl, hl, hl, hl, br, __, sq, sq, vl, bl, sq, sq, tl, br, sq, sq, vl, __, bl, hl, hl, sq, sq, tr); + sq, sq, tl, hl, hl, hl, br, __, sq, sq, vl, bl, sq, sq, tl, br, sq, sq, vl, __, bl, hl, hl, sq, sq, tr); PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s")" " BANNERMSG2, - sq, sq, vl, __, __, __, __, __, sq, sq, vl, __, bl, hl, br, __, sq, sq, vl, sq, sq, sq, sq, sq, tl, br); + sq, sq, vl, __, __, __, __, __, sq, sq, vl, __, bl, hl, br, __, sq, sq, vl, sq, sq, sq, sq, sq, tl, br); PrintAndLogEx(NORMAL, " " _BLUE_("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s")" " BANNERMSG3, - bl, hl, br, __, __, __, __, __, bl, hl, br, __, __, __, __, __, bl, hl, br, bl, hl, hl, hl, hl, br, __); + bl, hl, br, __, __, __, __, __, bl, hl, br, __, __, __, __, __, bl, hl, br, bl, hl, hl, hl, hl, br, __); break; } case ANSI: { From e695223d3b522fe8ac040f0f276b5110d7544b96 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 9 May 2020 11:58:47 +0200 Subject: [PATCH 127/632] mf textual --- client/src/mifare/mifarehost.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/mifare/mifarehost.c b/client/src/mifare/mifarehost.c index c3ad1b0a0..c1982b088 100644 --- a/client/src/mifare/mifarehost.c +++ b/client/src/mifare/mifarehost.c @@ -538,10 +538,10 @@ int mfnested(uint8_t blockNo, uint8_t keyType, uint8_t *key, uint8_t trgBlockNo, free(statelists[1].head.slhead); num_to_bytes(key64, 6, resultKey); - PrintAndLogEx(SUCCESS, "target block:%3u key type: %c -- found valid key [ " _YELLOW_("%s") " ]", + PrintAndLogEx(SUCCESS, "target block:%3u key type: %c -- found valid key [" _YELLOW_("%s") "]", package->block, package->keytype ? 'B' : 'A', - sprint_hex_inrow(resultKey, 6) + sprint_hex(resultKey, 6) ); return -5; } @@ -714,10 +714,10 @@ int mfStaticNested(uint8_t blockNo, uint8_t keyType, uint8_t *key, uint8_t trgBl num_to_bytes(key64, 6, resultKey); - PrintAndLogEx(SUCCESS, "target block:%3u key type: %c -- found valid key [ " _YELLOW_("%s") " ]", + PrintAndLogEx(SUCCESS, "target block:%3u key type: %c -- found valid key [" _YELLOW_("%s") "]", package->block, package->keytype ? 'B' : 'A', - sprint_hex_inrow(resultKey, 6) + sprint_hex(resultKey, 6) ); return PM3_SUCCESS; } else if (res == PM3_ETIMEOUT || res == PM3_EOPABORTED) { From 39c000fb53766d738e6ded128e687a067da66d0b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 9 May 2020 12:27:53 +0200 Subject: [PATCH 128/632] missing field initialise --- client/src/emv/test/cda_test.c | 1 + client/src/emv/test/dda_test.c | 1 + client/src/emv/test/sda_test.c | 1 + 3 files changed, 3 insertions(+) diff --git a/client/src/emv/test/cda_test.c b/client/src/emv/test/cda_test.c index 38f756073..72f076a54 100644 --- a/client/src/emv/test/cda_test.c +++ b/client/src/emv/test/cda_test.c @@ -56,6 +56,7 @@ struct emv_pk c_mchip_05 = { 0x10, 0xd2, 0x7b, 0x3e, 0xfc, 0xcd, 0x8f, 0x83, 0xde, 0x30, 0x52, 0xca, 0xd1, 0xe4, 0x89, 0x38, 0xc6, 0x8d, 0x09, 0x5a, 0xac, 0x91, 0xb5, 0xf3, 0x7e, 0x28, 0xbb, 0x49, 0xec, 0x7e, 0xd5, 0x97, }, + .expire = 0, }; const unsigned char c_issuer_cert[] = { diff --git a/client/src/emv/test/dda_test.c b/client/src/emv/test/dda_test.c index a23a046dc..55e2830ad 100644 --- a/client/src/emv/test/dda_test.c +++ b/client/src/emv/test/dda_test.c @@ -57,6 +57,7 @@ struct emv_pk mchip_05 = { 0x10, 0xd2, 0x7b, 0x3e, 0xfc, 0xcd, 0x8f, 0x83, 0xde, 0x30, 0x52, 0xca, 0xd1, 0xe4, 0x89, 0x38, 0xc6, 0x8d, 0x09, 0x5a, 0xac, 0x91, 0xb5, 0xf3, 0x7e, 0x28, 0xbb, 0x49, 0xec, 0x7e, 0xd5, 0x97, }, + .expire = 0, }; const unsigned char d_issuer_cert[] = { diff --git a/client/src/emv/test/sda_test.c b/client/src/emv/test/sda_test.c index 86f201e58..c8da53d7a 100644 --- a/client/src/emv/test/sda_test.c +++ b/client/src/emv/test/sda_test.c @@ -53,6 +53,7 @@ struct emv_pk vsdc_01 = { 0xbc, 0xa2, 0x12, 0x4a, 0x30, 0xa2, 0x8f, 0x54, 0x40, 0x2c, 0x34, 0xae, 0xca, 0x33, 0x1a, 0xb6, 0x7e, 0x1e, 0x79, 0xb2, 0x85, 0xdd, 0x57, 0x71, 0xb5, 0xd9, 0xff, 0x79, 0xea, 0x63, 0x0b, 0x75, }, + .expire = 0, }; const unsigned char issuer_cert[] = { From cfa75a6cabad89132f969b9094dd88b46cc48e8e Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 9 May 2020 12:32:19 +0200 Subject: [PATCH 129/632] missing field init --- client/src/wiegand_formats.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/wiegand_formats.c b/client/src/wiegand_formats.c index 13c08f143..7c25cd7ff 100644 --- a/client/src/wiegand_formats.c +++ b/client/src/wiegand_formats.c @@ -597,7 +597,7 @@ static const cardformat_t FormatTable[] = { {"H10320", Pack_H10320, Unpack_H10320, "HID H10320 36-bit BCD", {1, 0, 0, 0, 1}}, // from Proxmark forums {"H10302", Pack_H10302, Unpack_H10302, "HID H10302 37-bit huge ID", {1, 0, 0, 0, 1}}, // from Proxmark forums {"H10304", Pack_H10304, Unpack_H10304, "HID H10304 37-bit", {1, 1, 0, 0, 1}}, // imported from old pack/unpack - {"P10001", Pack_P10001, Unpack_P10001, "HID P10001 Honeywell 40-bit" }, // from cardinfo.barkweb.com.au + {"P10001", Pack_P10001, Unpack_P10001, "HID P10001 Honeywell 40-bit", {1, 1, 0, 1, 0}}, // from cardinfo.barkweb.com.au {"C1k48s", Pack_C1k48s, Unpack_C1k48s, "HID Corporate 1000 48-bit standard layout", {1, 1, 0, 0, 1}}, // imported from old pack/unpack {NULL, NULL, NULL, NULL, {0, 0, 0, 0, 0}} // Must null terminate array }; From 92a1f82135fac887545128abd84dd90a554ad4ed Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 9 May 2020 12:42:42 +0200 Subject: [PATCH 130/632] Activate -Wmissing-field-initializers --- Makefile.defs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index 0cfdf85a7..987e9c661 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -47,12 +47,12 @@ endif DEFCFLAGS = -Wall -Werror -O3 # Some more warnings we want as errors: -DEFCFLAGS += -Wcast-align -Wbad-function-cast -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wshadow -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations -Wempty-body -Wignored-qualifiers +DEFCFLAGS += -Wcast-align -Wbad-function-cast -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wshadow -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers # Some more warnings we need first to eliminate, so temporarely tolerated: DEFCFLAGS += -Wno-error=cast-align # TODO?: -#DEFCFLAGS += -Wunused-parameter -Wold-style-declaration -Wsign-compare -Wimplicit-fallthrough=3 -Wtype-limits -Wmissing-field-initializers -Wunused-but-set-parameter -Wswitch-enum -Wold-style-definition -#DEFCFLAGS += -Wno-error=unused-parameter -Wno-error=old-style-declaration -Wno-error=sign-compare -Wno-error=implicit-fallthrough -Wno-error=type-limits -Wno-error=missing-field-initializers -Wno-error=unused-but-set-parameter -Wno-error=switch-enum -Wno-error=old-style-definition +#DEFCFLAGS += -Wunused-parameter -Wold-style-declaration -Wsign-compare -Wimplicit-fallthrough=3 -Wtype-limits -Wunused-but-set-parameter -Wswitch-enum -Wold-style-definition +#DEFCFLAGS += -Wno-error=unused-parameter -Wno-error=old-style-declaration -Wno-error=sign-compare -Wno-error=implicit-fallthrough -Wno-error=type-limits -Wno-error=unused-but-set-parameter -Wno-error=switch-enum -Wno-error=old-style-definition # unknown to clang: -Wclobbered -Wmissing-parameter-type -Wcast-function-type # unknown to clang < 8: -Woverride-init # unknown to gcc < 6: -Wshift-negative-value From 394397c54ed46f67ce6421eced824697af35b104 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 9 May 2020 12:56:40 +0200 Subject: [PATCH 131/632] silent tinycbor warnings --- client/deps/tinycbor/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/deps/tinycbor/Makefile b/client/deps/tinycbor/Makefile index 99039ac98..42879259b 100644 --- a/client/deps/tinycbor/Makefile +++ b/client/deps/tinycbor/Makefile @@ -1,7 +1,7 @@ MYSRCPATHS = MYINCLUDES = # Strange errors on Mingw when compiling with C99 -MYCFLAGS = +MYCFLAGS = -Wno-bad-function-cast -Wno-incompatible-pointer-types-discards-qualifiers MYDEFS = MYSRCS = \ cborencoder.c \ From ee61d028a45744289ad2a8b47c080362eeca9477 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 9 May 2020 13:15:53 +0200 Subject: [PATCH 132/632] textual --- Makefile.defs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index 987e9c661..2263d9757 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -51,8 +51,14 @@ DEFCFLAGS += -Wcast-align -Wbad-function-cast -Wredundant-decls -Wmissing-protot # Some more warnings we need first to eliminate, so temporarely tolerated: DEFCFLAGS += -Wno-error=cast-align # TODO?: -#DEFCFLAGS += -Wunused-parameter -Wold-style-declaration -Wsign-compare -Wimplicit-fallthrough=3 -Wtype-limits -Wunused-but-set-parameter -Wswitch-enum -Wold-style-definition -#DEFCFLAGS += -Wno-error=unused-parameter -Wno-error=old-style-declaration -Wno-error=sign-compare -Wno-error=implicit-fallthrough -Wno-error=type-limits -Wno-error=unused-but-set-parameter -Wno-error=switch-enum -Wno-error=old-style-definition +#DEFCFLAGS += -Wunused-parameter -Wno-error=unused-parameter +#DEFCFLAGS += -Wold-style-declaration -Wno-error=old-style-declaration +#DEFCFLAGS += -Wsign-compare -Wno-error=sign-compare +#DEFCFLAGS += -Wimplicit-fallthrough=3 -Wno-error=implicit-fallthrough +#DEFCFLAGS += -Wtype-limits -Wno-error=type-limits +#DEFCFLAGS += -Wunused-but-set-parameter -Wno-error=unused-but-set-parameter +#DEFCFLAGS += -Wswitch-enum -Wno-error=switch-enum +#DEFCFLAGS += -Wold-style-definition -Wno-error=old-style-definition # unknown to clang: -Wclobbered -Wmissing-parameter-type -Wcast-function-type # unknown to clang < 8: -Woverride-init # unknown to gcc < 6: -Wshift-negative-value From 1b0fd2389a978a0084f386909fcc060ebbdfa141 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 9 May 2020 14:41:12 +0200 Subject: [PATCH 133/632] Remove tautological-type-limit-compare --- client/src/cmdhflist.c | 2 +- client/src/emv/apduinfo.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/client/src/cmdhflist.c b/client/src/cmdhflist.c index 16fdb309e..8ade2f7dc 100644 --- a/client/src/cmdhflist.c +++ b/client/src/cmdhflist.c @@ -509,7 +509,7 @@ void annotateIso15693(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { if (cmd[1] >= 0x2D && cmd[1] <= 0x9F) snprintf(exp, size, "Optional RFU"); else if (cmd[1] >= 0xA0 && cmd[1] <= 0xDF) snprintf(exp, size, "Cust IC MFG dependent"); - else if (cmd[1] >= 0xE0 && cmd[1] <= 0xFF) snprintf(exp, size, "Proprietary IC MFG dependent"); + else if (cmd[1] >= 0xE0) snprintf(exp, size, "Proprietary IC MFG dependent"); else snprintf(exp, size, "?"); } diff --git a/client/src/emv/apduinfo.c b/client/src/emv/apduinfo.c index bc8d3f8ae..2b319cbe8 100644 --- a/client/src/emv/apduinfo.c +++ b/client/src/emv/apduinfo.c @@ -425,7 +425,7 @@ int APDUEncode(APDUStruct *apdu, uint8_t *data, int *len) { if (len) *len = 0; - if (apdu->le > 0x10000 || apdu->lc > 0xffff) + if (apdu->le > 0x10000) return 1; size_t dptr = 0; @@ -434,7 +434,7 @@ int APDUEncode(APDUStruct *apdu, uint8_t *data, int *len) { data[dptr++] = apdu->p1; data[dptr++] = apdu->p2; - if (apdu->lc) { + if (apdu->lc) { // apdu->lc is uint16_t so max 0xffff if (apdu->extended_apdu || apdu->lc > 0xff || apdu->le > 0x100) { data[dptr++] = 0x00; data[dptr++] = (apdu->lc >> 8) & 0xff; From 5c09e33de669c683b846612870ae156fc63328bb Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 9 May 2020 15:06:28 +0200 Subject: [PATCH 134/632] extra warnings --- Makefile.defs | 51 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index 2263d9757..1de6b19b5 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -45,23 +45,44 @@ else RANLIB= ranlib endif -DEFCFLAGS = -Wall -Werror -O3 +DEFCFLAGS = -Wall -Werror -O3 -fstrict-aliasing -pipe # Some more warnings we want as errors: -DEFCFLAGS += -Wcast-align -Wbad-function-cast -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wshadow -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers +DEFCFLAGS += -Wbad-function-cast -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wshadow -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits # Some more warnings we need first to eliminate, so temporarely tolerated: -DEFCFLAGS += -Wno-error=cast-align -# TODO?: -#DEFCFLAGS += -Wunused-parameter -Wno-error=unused-parameter -#DEFCFLAGS += -Wold-style-declaration -Wno-error=old-style-declaration -#DEFCFLAGS += -Wsign-compare -Wno-error=sign-compare -#DEFCFLAGS += -Wimplicit-fallthrough=3 -Wno-error=implicit-fallthrough -#DEFCFLAGS += -Wtype-limits -Wno-error=type-limits -#DEFCFLAGS += -Wunused-but-set-parameter -Wno-error=unused-but-set-parameter -#DEFCFLAGS += -Wswitch-enum -Wno-error=switch-enum -#DEFCFLAGS += -Wold-style-definition -Wno-error=old-style-definition -# unknown to clang: -Wclobbered -Wmissing-parameter-type -Wcast-function-type -# unknown to clang < 8: -Woverride-init -# unknown to gcc < 6: -Wshift-negative-value +DEFCFLAGS += -Wcast-align -Wno-error=cast-align + +# Next ones are activated only if GCCEXTRA=1 or CLANGEXTRA=1 +EXTRACFLAGS = +EXTRACFLAGS += -Wunused-parameter -Wno-error=unused-parameter +EXTRACFLAGS += -Wsign-compare -Wno-error=sign-compare +EXTRACFLAGS += -Wswitch-enum -Wno-error=switch-enum +EXTRACFLAGS += -Wold-style-definition -Wno-error=old-style-definition + +# unknown to clang or old gcc: +# First we activate Wextra then we explicitly list those we know about +GCCEXTRACFLAGS = -Wextra +GCCEXTRACFLAGS += -Wclobbered -Wno-error=clobbered +GCCEXTRACFLAGS += -Wcast-function-type -Wno-error=cast-function-type +GCCEXTRACFLAGS += -Wimplicit-fallthrough=3 -Wno-error=implicit-fallthrough +GCCEXTRACFLAGS += -Wmissing-parameter-type -Wno-error=missing-parameter-type +GCCEXTRACFLAGS += -Wold-style-declaration -Wno-error=old-style-declaration +GCCEXTRACFLAGS += -Woverride-init -Wno-error=override-init +GCCEXTRACFLAGS += -Wshift-negative-value -Wno-error=shift-negative-value +GCCEXTRACFLAGS += -Wunused-but-set-parameter -Wno-error=unused-but-set-parameter +ifeq ($(GCCEXTRA),1) + DEFCFLAGS += $(GCCEXTRACFLAGS) $(EXTRACFLAGS) +endif +# unknown to gcc or old clang: +# First we activate Wextra then we explicitly list those we know about +CLANGEXTRACFLAGS = -Wextra +CLANGEXTRACFLAGS += -Wtautological-type-limit-compare +CLANGEXTRACFLAGS += -Wnull-pointer-arithmetic +CLANGEXTRACFLAGS += -Woverride-init +CLANGEXTRACFLAGS += -Wshift-negative-value +CLANGEXTRACFLAGS += -Wimplicit-fallthrough +ifeq ($(CLANGEXTRA),1) + DEFCFLAGS += $(CLANGEXTRACFLAGS) $(EXTRACFLAGS) +endif ifeq ($(platform),Darwin) # their readline has strict-prototype issues From dc8178d43e30b4d56788339fb2475fa9ca0822c4 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 9 May 2020 15:27:35 +0200 Subject: [PATCH 135/632] Remove type-limits warning --- client/src/cmdhfmfhard.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/src/cmdhfmfhard.c b/client/src/cmdhfmfhard.c index 2a245df37..0e421a80a 100644 --- a/client/src/cmdhfmfhard.c +++ b/client/src/cmdhfmfhard.c @@ -1230,7 +1230,8 @@ static void check_for_BitFlipProperties(bool time_budget) { args[i][1] = MIN(args[i][0] + bytes_per_thread - 1, 255); args[i][2] = time_budget; } - args[NUM_CHECK_BITFLIPS_THREADS - 1][1] = MAX(args[NUM_CHECK_BITFLIPS_THREADS - 1][1], 255); + // args[][] is uint8_t so max 255, no need to check it + // args[NUM_CHECK_BITFLIPS_THREADS - 1][1] = MAX(args[NUM_CHECK_BITFLIPS_THREADS - 1][1], 255); // start threads for (uint8_t i = 0; i < NUM_CHECK_BITFLIPS_THREADS; i++) { From a7c00ecef03cf00ead7b83c588847968cc63c7b0 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 9 May 2020 16:12:54 +0200 Subject: [PATCH 136/632] warnings --- Makefile.defs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index 1de6b19b5..a19dfc078 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -60,20 +60,22 @@ EXTRACFLAGS += -Wold-style-definition -Wno-error=old-style-definition # unknown to clang or old gcc: # First we activate Wextra then we explicitly list those we know about +# Those without -Wno-error are supposed to be completely solved GCCEXTRACFLAGS = -Wextra GCCEXTRACFLAGS += -Wclobbered -Wno-error=clobbered -GCCEXTRACFLAGS += -Wcast-function-type -Wno-error=cast-function-type +GCCEXTRACFLAGS += -Wcast-function-type GCCEXTRACFLAGS += -Wimplicit-fallthrough=3 -Wno-error=implicit-fallthrough -GCCEXTRACFLAGS += -Wmissing-parameter-type -Wno-error=missing-parameter-type +GCCEXTRACFLAGS += -Wmissing-parameter-type GCCEXTRACFLAGS += -Wold-style-declaration -Wno-error=old-style-declaration -GCCEXTRACFLAGS += -Woverride-init -Wno-error=override-init -GCCEXTRACFLAGS += -Wshift-negative-value -Wno-error=shift-negative-value +GCCEXTRACFLAGS += -Woverride-init +GCCEXTRACFLAGS += -Wshift-negative-value GCCEXTRACFLAGS += -Wunused-but-set-parameter -Wno-error=unused-but-set-parameter ifeq ($(GCCEXTRA),1) DEFCFLAGS += $(GCCEXTRACFLAGS) $(EXTRACFLAGS) endif # unknown to gcc or old clang: # First we activate Wextra then we explicitly list those we know about +# Those without -Wno-error are supposed to be completely solved CLANGEXTRACFLAGS = -Wextra CLANGEXTRACFLAGS += -Wtautological-type-limit-compare CLANGEXTRACFLAGS += -Wnull-pointer-arithmetic From f3293c9dcdc48cb84620f093ac1db10f7dbf2f04 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 10 May 2020 22:29:29 +0200 Subject: [PATCH 137/632] chg: lf nexwatch demod - now descrambles the id aswell --- client/src/cmdlfnexwatch.c | 194 +++++++++++++++++++++++++++++++------ 1 file changed, 163 insertions(+), 31 deletions(-) diff --git a/client/src/cmdlfnexwatch.c b/client/src/cmdlfnexwatch.c index c5d168a7c..0f1a5ceb3 100644 --- a/client/src/cmdlfnexwatch.c +++ b/client/src/cmdlfnexwatch.c @@ -35,7 +35,7 @@ static int usage_lf_nexwatch_clone(void) { PrintAndLogEx(NORMAL, " r : raw hex data. 16 bytes max"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " lf nexwatch clone r 5600000000213C9F8F150C0000000000"); + PrintAndLogEx(NORMAL, " lf nexwatch clone r 5600000000213C9F8F150C"); return PM3_SUCCESS; } @@ -49,13 +49,11 @@ static int usage_lf_nexwatch_sim(void) { PrintAndLogEx(NORMAL, " r : raw hex data. 16 bytes max"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " lf nexwatch sim r 5600000000213C9F8F150C0000000000"); + PrintAndLogEx(NORMAL, " lf nexwatch sim r 5600000000213C9F8F150C"); return PM3_SUCCESS; } -static int CmdNexWatchDemod(const char *Cmd) { - (void)Cmd; - +int demodNexWatch(void) { if (PSKDemod("", false) != PM3_SUCCESS) { PrintAndLogEx(DEBUG, "DEBUG: Error - NexWatch can't demod signal"); return PM3_ESOFT; @@ -80,37 +78,176 @@ static int CmdNexWatchDemod(const char *Cmd) { return PM3_ESOFT; } - setDemodBuff(DemodBuffer, size, idx + 4); - setClockGrid(g_DemodClock, g_DemodStartIdx + ((idx + 4) * g_DemodClock)); - -// idx = 8 + 32; // 8 = preamble, 32 = reserved bits (always 0) - - //get ID - uint32_t ID = 0; - for (uint8_t k = 0; k < 4; k++) { - for (uint8_t m = 0; m < 8; m++) { - ID = (ID << 1) | DemodBuffer[m + k + (m * 4)]; - } - } - //parity check (TBD) - - //checksum check (TBD) - - //output - PrintAndLogEx(SUCCESS, "NexWatch ID: " _YELLOW_("%"PRIu32), ID); + // skip the 4 first bits from the nexwatch preamble identification (we use 4 extra zeros..) + idx += 4; + + setDemodBuff(DemodBuffer, size, idx); + setClockGrid(g_DemodClock, g_DemodStartIdx + (idx * g_DemodClock)); + if (invert) { PrintAndLogEx(INFO, "Had to Invert - probably NexKey"); for (size_t i = 0; i < size; i++) DemodBuffer[i] ^= 1; } - // bits to hex - CmdPrintDemodBuff("x"); - //PrintAndLogEx(INFO, "Raw: %s", sprint_hex_inrow(DemodBuffer, DemodBufferLen)); + // get rawid + uint32_t rawid = 0; + for (uint8_t k = 0; k < 4; k++) { + for (uint8_t m = 0; m < 8; m++) { + rawid = (rawid << 1) | DemodBuffer[m + k + (m * 4)]; + } + } + /* + Descrambled id + + ref:: http://www.proxmark.org/forum/viewtopic.php?pid=14662#p14662 + + 32bit UID: 00100100011001000011111100010010 + + bits numbered from left (MSB): + 1234567890 1234567890 1234567890 12 + + descramble: + b1 b5 b9 b13 b17 b21 b25 b29 b2 b6 b10 b14 b18 b22 b26 b30 b3 b7 b11 b15 b19 b23 b27 b31 b4 b8 b12 b16 b20 b24 b28 b32 + + 00000100011101001010110100001100 = 74755340 + + */ + +// Since the description is not zero indexed we adjust. +#define DOFFSET 8 + 32 - 1 + + // descrambled id + uint32_t d_id = 0; + // b1 b5 b9 b13 + d_id |= DemodBuffer[DOFFSET + 1] << 31; + d_id |= DemodBuffer[DOFFSET + 5] << 30; + d_id |= DemodBuffer[DOFFSET + 9] << 29; + d_id |= DemodBuffer[DOFFSET + 13] << 28; + + // b17 b21 b25 b29 + d_id |= DemodBuffer[DOFFSET + 17] << 27; + d_id |= DemodBuffer[DOFFSET + 21] << 26; + d_id |= DemodBuffer[DOFFSET + 25] << 25; + d_id |= DemodBuffer[DOFFSET + 29] << 24; + + // b2 b6 b10 b14 + d_id |= DemodBuffer[DOFFSET + 2] << 23; + d_id |= DemodBuffer[DOFFSET + 6] << 22; + d_id |= DemodBuffer[DOFFSET + 10] << 21; + d_id |= DemodBuffer[DOFFSET + 14] << 20; + + // b18 b22 b26 b30 + d_id |= DemodBuffer[DOFFSET + 18] << 19; + d_id |= DemodBuffer[DOFFSET + 22] << 18; + d_id |= DemodBuffer[DOFFSET + 26] << 17; + d_id |= DemodBuffer[DOFFSET + 30] << 16; + + // b3 b7 b11 b15 + d_id |= DemodBuffer[DOFFSET + 3] << 15; + d_id |= DemodBuffer[DOFFSET + 7] << 14; + d_id |= DemodBuffer[DOFFSET + 11] << 13; + d_id |= DemodBuffer[DOFFSET + 15] << 12; + + // b19 b23 b27 b31 + d_id |= DemodBuffer[DOFFSET + 19] << 11; + d_id |= DemodBuffer[DOFFSET + 23] << 10; + d_id |= DemodBuffer[DOFFSET + 27] << 9; + d_id |= DemodBuffer[DOFFSET + 31] << 8; + + // b4 b8 b12 b16 + d_id |= DemodBuffer[DOFFSET + 4] << 7; + d_id |= DemodBuffer[DOFFSET + 8] << 6; + d_id |= DemodBuffer[DOFFSET + 12] << 5; + d_id |= DemodBuffer[DOFFSET + 16] << 4; + + // b20 b24 b28 b32 + d_id |= DemodBuffer[DOFFSET + 20] << 3; + d_id |= DemodBuffer[DOFFSET + 24] << 2; + d_id |= DemodBuffer[DOFFSET + 28] << 1; + d_id |= DemodBuffer[DOFFSET + 32]; + + // parity check + // from 8 preamble, 32 zeros, 32 id, 4 mode, comes EOEO parity. +/* + uint8_t even; + for (uint8_t p=0; p < 76; p++) { + even = (DemodBuffer[p] == 1); + } + + uint8_t calc_parity = (!even << 3 | even << 2 | !even << 1 | even); + uint8_t parity = bytebits_to_byte(DemodBuffer + 76, 4); +*/ + /* + Checksum::: + 1. Subtract every byte from ID field using an unsigned, one byte register: + 1F - 15 - A5 - 6D = 0xF6 + + 2. Subtract BE from the result: + 0xF6 - 0xBE = 3A + + 3. Reverse the bits of a parity nibble: + 5(0101) -> (1010) A + + 4. Subtract the reversed parity from the result: + 3A - A = 30 -> 00110000 + + + 5. Reverse the bits: + 00001100 -> 0C + */ + + /* + uint8_t calc; + calc = ((d_id >> 24) & 0xFF); + calc -= ((d_id >> 16) & 0xFF); + calc -= ((d_id >> 8) & 0xFF); + calc -= (d_id & 0xFF); + + PrintAndLogEx(NORMAL, "Sum: 0x%02x", calc); + + uint8_t revpar = (even << 3 | !even << 2 | even << 1 | !even); + + uint8_t a[] = {0xbe, 0xbc, 0x88, 0x86 }; + for (uint8_t c=0; c < ARRAYLEN(a); c++) { + uint8_t b = calc; + b -= a[c]; + PrintAndLogEx(NORMAL, "Subtract [0x%02X] : 0x%02X", a[c], b); + b -= revpar; + PrintAndLogEx(NORMAL, "Subtract revpar : 0x%02X", b); + PrintAndLogEx(NORMAL, "reversed : 0x%02X", reflect8(b)); + } + + calc -= 0xBE; + PrintAndLogEx(NORMAL, "--after 0xBE: %02x", calc); + calc -= revpar; + PrintAndLogEx(NORMAL, "--before reverse: %02x", calc); + calc = reflect8(calc); + */ + +// uint8_t chk = bytebits_to_byte(DemodBuffer + 80, 8); + uint8_t mode = bytebits_to_byte(DemodBuffer + 72, 4); + + // output + PrintAndLogEx(SUCCESS, " NexWatch raw id : " _YELLOW_("0x%"PRIx32) , rawid); + PrintAndLogEx(SUCCESS, " descrambled id : " _YELLOW_("%"PRIu32) " " _YELLOW_("0x%"PRIx32), d_id, d_id); + PrintAndLogEx(SUCCESS, " mode : %x", mode); +// PrintAndLogEx(SUCCESS, " parity : %s [%X == %X]", (parity == calc_parity) ? _GREEN_("ok") : _RED_("fail"), parity, calc_parity); +// PrintAndLogEx(NORMAL, " checksum : %02x == %02x", calc, chk); + + // bits to hex (output used for SIM/CLONE cmd) + CmdPrintDemodBuff("x"); +// PrintAndLogEx(INFO, "Raw: %s", sprint_hex_inrow(DemodBuffer, size)); +//binarraytohex(char *target, const size_t targetlen, (char *)DemodBuffer, size); return PM3_SUCCESS; } +static int CmdNexWatchDemod(const char *Cmd) { + (void)Cmd; + return demodNexWatch(); +} + //by marshmellow //see ASKDemod for what args are accepted static int CmdNexWatchRead(const char *Cmd) { @@ -261,8 +398,3 @@ int detectNexWatch(uint8_t *dest, size_t *size, bool *invert) { // size tests? return (int) startIdx; } - -int demodNexWatch(void) { - return CmdNexWatchDemod(""); -} - From 8a9c7d2efcd736b0300065009b043813a7a4ac25 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 10 May 2020 23:59:42 +0200 Subject: [PATCH 138/632] argtable3: fix buffer overrun This bug was suddently triggered by Appveyor compilation and seems to make sense. [-] CC argtable3.c inlined from 'arg_cat_option' at argtable3.c:4208:13, inlined from 'arg_print_syntax' at argtable3.c:4392:9: argtable3.c:4149:11: error: writing 1 byte into a region of size 0 [-Werror=stringop-overflow=] 4149 | *dest = 0; | ~~~~~~^~~ argtable3.c: In function 'arg_print_syntax': argtable3.c:4381:14: note: at offset 200 to object 'syntax' with size 200 declared here 4381 | char syntax[200] = ""; | ^~~~~~ --- client/deps/cliparser/argtable3.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/deps/cliparser/argtable3.c b/client/deps/cliparser/argtable3.c index f66c22d6d..f64688b2a 100644 --- a/client/deps/cliparser/argtable3.c +++ b/client/deps/cliparser/argtable3.c @@ -4135,7 +4135,8 @@ int arg_parse(int argc, char * *argv, void * *argtable) { */ static void arg_cat(char **pdest, const char *src, size_t *pndest) { char *dest = *pdest; - char *end = dest + *pndest; + // PM3 fix: leave room for null terminate char + char *end = dest + *pndest - 1; /*locate null terminator of dest string */ while (dest < end && *dest != 0) From 280b7d9c465c40bc89eca52320dcb6456aa219de Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 11 May 2020 01:13:58 +0200 Subject: [PATCH 139/632] chg: 'lf nexwatch demod' - correct parity calc --- client/src/cmdlfnexwatch.c | 50 ++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/client/src/cmdlfnexwatch.c b/client/src/cmdlfnexwatch.c index 0f1a5ceb3..c9a610964 100644 --- a/client/src/cmdlfnexwatch.c +++ b/client/src/cmdlfnexwatch.c @@ -53,6 +53,16 @@ static int usage_lf_nexwatch_sim(void) { return PM3_SUCCESS; } +static inline uint32_t bitcount(uint32_t a) { +#if defined __GNUC__ + return __builtin_popcountl(a); +#else + a = a - ((a >> 1) & 0x55555555); + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); + return (((a + (a >> 4)) & 0x0f0f0f0f) * 0x01010101) >> 24; +#endif +} + int demodNexWatch(void) { if (PSKDemod("", false) != PM3_SUCCESS) { PrintAndLogEx(DEBUG, "DEBUG: Error - NexWatch can't demod signal"); @@ -106,13 +116,14 @@ int demodNexWatch(void) { 32bit UID: 00100100011001000011111100010010 bits numbered from left (MSB): - 1234567890 1234567890 1234567890 12 + 1234 5678 9012 34567 8901234567890 12 + 0010 0100 0110 0100 00111111000100 10 descramble: b1 b5 b9 b13 b17 b21 b25 b29 b2 b6 b10 b14 b18 b22 b26 b30 b3 b7 b11 b15 b19 b23 b27 b31 b4 b8 b12 b16 b20 b24 b28 b32 - 00000100011101001010110100001100 = 74755340 - + gives: + 0000 0100 0111 0100 1010 1101 0000 1110 = 74755342 */ // Since the description is not zero indexed we adjust. @@ -167,18 +178,24 @@ int demodNexWatch(void) { d_id |= DemodBuffer[DOFFSET + 24] << 2; d_id |= DemodBuffer[DOFFSET + 28] << 1; d_id |= DemodBuffer[DOFFSET + 32]; + + uint8_t mode = bytebits_to_byte(DemodBuffer + 72, 4); // parity check - // from 8 preamble, 32 zeros, 32 id, 4 mode, comes EOEO parity. -/* - uint8_t even; - for (uint8_t p=0; p < 76; p++) { - even = (DemodBuffer[p] == 1); + // from 32 hex id, 4 mode, descramble par (1234) -> (4231) + uint8_t xor_par = 0; + for (uint8_t i = 40; i < 76; i +=4) { + xor_par ^= bytebits_to_byte(DemodBuffer + i, 4); } - - uint8_t calc_parity = (!even << 3 | even << 2 | !even << 1 | even); + + uint8_t calc_parity ; + calc_parity = (((xor_par >> 3 ) & 1) ); + calc_parity |= (((xor_par >> 1 ) & 1) << 1); + calc_parity |= (((xor_par >> 2 ) & 1) << 2); + calc_parity |= ((xor_par & 1) << 3); + uint8_t parity = bytebits_to_byte(DemodBuffer + 76, 4); -*/ + /* Checksum::: 1. Subtract every byte from ID field using an unsigned, one byte register: @@ -207,9 +224,7 @@ int demodNexWatch(void) { PrintAndLogEx(NORMAL, "Sum: 0x%02x", calc); - uint8_t revpar = (even << 3 | !even << 2 | even << 1 | !even); - - uint8_t a[] = {0xbe, 0xbc, 0x88, 0x86 }; + uint8_t a[] = {0xbe, 0xbc, 0x88, 0x86 }; for (uint8_t c=0; c < ARRAYLEN(a); c++) { uint8_t b = calc; b -= a[c]; @@ -227,19 +242,18 @@ int demodNexWatch(void) { */ // uint8_t chk = bytebits_to_byte(DemodBuffer + 80, 8); - uint8_t mode = bytebits_to_byte(DemodBuffer + 72, 4); + // output PrintAndLogEx(SUCCESS, " NexWatch raw id : " _YELLOW_("0x%"PRIx32) , rawid); - PrintAndLogEx(SUCCESS, " descrambled id : " _YELLOW_("%"PRIu32) " " _YELLOW_("0x%"PRIx32), d_id, d_id); + PrintAndLogEx(SUCCESS, " 88bit id : " _YELLOW_("%"PRIu32) " " _YELLOW_("0x%"PRIx32), d_id, d_id); PrintAndLogEx(SUCCESS, " mode : %x", mode); -// PrintAndLogEx(SUCCESS, " parity : %s [%X == %X]", (parity == calc_parity) ? _GREEN_("ok") : _RED_("fail"), parity, calc_parity); + PrintAndLogEx(SUCCESS, " parity : %s [%X == %X]", (parity == calc_parity) ? _GREEN_("ok") : _RED_("fail"), parity, calc_parity); // PrintAndLogEx(NORMAL, " checksum : %02x == %02x", calc, chk); // bits to hex (output used for SIM/CLONE cmd) CmdPrintDemodBuff("x"); // PrintAndLogEx(INFO, "Raw: %s", sprint_hex_inrow(DemodBuffer, size)); -//binarraytohex(char *target, const size_t targetlen, (char *)DemodBuffer, size); return PM3_SUCCESS; } From f6245cdb7949d14a1ff1b27f9422722fe18417b1 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 11 May 2020 01:23:28 +0200 Subject: [PATCH 140/632] fix appveyor multiple definition of enum error --- client/src/cmdlft55xx.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdlft55xx.h b/client/src/cmdlft55xx.h index 71fda2a72..7074124e6 100644 --- a/client/src/cmdlft55xx.h +++ b/client/src/cmdlft55xx.h @@ -47,7 +47,7 @@ #define T55X7_bin 0b0010 #define T5555_DEFAULT_CONFIG_BLOCK 0x6001F004 // data rate 64 , ask, manchester, 2 data blocks? -enum { +typedef enum { T55x7_RAW = 0x00, T55x7_DEFAULT = 0x00, T5555_DEFAULT = 0x01, From c1209ca0f53a188ec02c0a953f9c8a3e1594b895 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 11 May 2020 02:16:43 +0200 Subject: [PATCH 141/632] (clang) fix unused function warning --- client/src/cmdlfnexwatch.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/cmdlfnexwatch.c b/client/src/cmdlfnexwatch.c index c9a610964..ba91b21c2 100644 --- a/client/src/cmdlfnexwatch.c +++ b/client/src/cmdlfnexwatch.c @@ -52,7 +52,7 @@ static int usage_lf_nexwatch_sim(void) { PrintAndLogEx(NORMAL, " lf nexwatch sim r 5600000000213C9F8F150C"); return PM3_SUCCESS; } - +/* static inline uint32_t bitcount(uint32_t a) { #if defined __GNUC__ return __builtin_popcountl(a); @@ -62,7 +62,7 @@ static inline uint32_t bitcount(uint32_t a) { return (((a + (a >> 4)) & 0x0f0f0f0f) * 0x01010101) >> 24; #endif } - +*/ int demodNexWatch(void) { if (PSKDemod("", false) != PM3_SUCCESS) { PrintAndLogEx(DEBUG, "DEBUG: Error - NexWatch can't demod signal"); From 9b08f7c39be0bce4af3b8050e2fc040ac2065048 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 11 May 2020 09:29:51 +0200 Subject: [PATCH 142/632] chg: 'lf nexwatch demod' - now detects type, and show parity /chksum --- client/src/cmdlfnexwatch.c | 72 ++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 42 deletions(-) diff --git a/client/src/cmdlfnexwatch.c b/client/src/cmdlfnexwatch.c index c9a610964..061b3005f 100644 --- a/client/src/cmdlfnexwatch.c +++ b/client/src/cmdlfnexwatch.c @@ -180,7 +180,9 @@ int demodNexWatch(void) { d_id |= DemodBuffer[DOFFSET + 32]; uint8_t mode = bytebits_to_byte(DemodBuffer + 72, 4); - + uint8_t parity = bytebits_to_byte(DemodBuffer + 76, 4); + uint8_t chk = bytebits_to_byte(DemodBuffer + 80, 8); + // parity check // from 32 hex id, 4 mode, descramble par (1234) -> (4231) uint8_t xor_par = 0; @@ -194,62 +196,48 @@ int demodNexWatch(void) { calc_parity |= (((xor_par >> 2 ) & 1) << 2); calc_parity |= ((xor_par & 1) << 3); - uint8_t parity = bytebits_to_byte(DemodBuffer + 76, 4); - - /* - Checksum::: - 1. Subtract every byte from ID field using an unsigned, one byte register: - 1F - 15 - A5 - 6D = 0xF6 - - 2. Subtract BE from the result: - 0xF6 - 0xBE = 3A - - 3. Reverse the bits of a parity nibble: - 5(0101) -> (1010) A - - 4. Subtract the reversed parity from the result: - 3A - A = 30 -> 00110000 - - - 5. Reverse the bits: - 00001100 -> 0C - */ - - /* + // Checksum uint8_t calc; calc = ((d_id >> 24) & 0xFF); calc -= ((d_id >> 16) & 0xFF); calc -= ((d_id >> 8) & 0xFF); calc -= (d_id & 0xFF); + + uint8_t revpar = (reflect8(calc_parity) >> 4); - PrintAndLogEx(NORMAL, "Sum: 0x%02x", calc); + typedef struct { + uint8_t magic; + char desc[10]; + uint8_t chk; + } nexwatch_magic_t; + + nexwatch_magic_t items[] = { {0xBE, "Quadrakey", 0}, {0x88, "Nexkey", 0} }; - uint8_t a[] = {0xbe, 0xbc, 0x88, 0x86 }; - for (uint8_t c=0; c < ARRAYLEN(a); c++) { - uint8_t b = calc; - b -= a[c]; - PrintAndLogEx(NORMAL, "Subtract [0x%02X] : 0x%02X", a[c], b); - b -= revpar; - PrintAndLogEx(NORMAL, "Subtract revpar : 0x%02X", b); - PrintAndLogEx(NORMAL, "reversed : 0x%02X", reflect8(b)); + uint8_t m_idx; + for ( m_idx = 0; m_idx < ARRAYLEN(items); m_idx++) { + uint8_t foo = calc; + foo -= items[m_idx].magic; + foo -= revpar; + foo = reflect8(foo); + items[m_idx].chk = foo; + if (foo == chk) { + break; + } } - calc -= 0xBE; - PrintAndLogEx(NORMAL, "--after 0xBE: %02x", calc); - calc -= revpar; - PrintAndLogEx(NORMAL, "--before reverse: %02x", calc); - calc = reflect8(calc); - */ - -// uint8_t chk = bytebits_to_byte(DemodBuffer + 80, 8); - + // detect keytype // output PrintAndLogEx(SUCCESS, " NexWatch raw id : " _YELLOW_("0x%"PRIx32) , rawid); PrintAndLogEx(SUCCESS, " 88bit id : " _YELLOW_("%"PRIu32) " " _YELLOW_("0x%"PRIx32), d_id, d_id); PrintAndLogEx(SUCCESS, " mode : %x", mode); PrintAndLogEx(SUCCESS, " parity : %s [%X == %X]", (parity == calc_parity) ? _GREEN_("ok") : _RED_("fail"), parity, calc_parity); -// PrintAndLogEx(NORMAL, " checksum : %02x == %02x", calc, chk); + if (m_idx < 3) { + PrintAndLogEx(SUCCESS, " checksum : %s [%X]", _GREEN_("ok"), chk); + PrintAndLogEx(SUCCESS, " Keytype : " _GREEN_("%s"), items[m_idx].desc); + } else { + PrintAndLogEx(WARNING, " checksum : %s [%X == %X]", _RED_("fail"), chk, items[m_idx].chk); + } // bits to hex (output used for SIM/CLONE cmd) CmdPrintDemodBuff("x"); From 2f293e211a4a299c6d168183204409d859f58154 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 11 May 2020 10:21:32 +0200 Subject: [PATCH 143/632] show compiler version --- armsrc/Makefile | 5 ++++- bootrom/Makefile | 7 +++++-- client/Makefile | 1 + 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/armsrc/Makefile b/armsrc/Makefile index 747f4254b..16c6a7f9e 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -145,7 +145,10 @@ endif OBJS = $(OBJDIR)/fullimage.s19 FPGA_COMPRESSOR = ../tools/fpga_compress/fpga_compress -all: $(OBJS) +all: showinfo $(OBJS) + +showinfo: + $(info compiler version: $(shell $(CC) --version|head -n 1)) .DELETE_ON_ERROR: diff --git a/bootrom/Makefile b/bootrom/Makefile index 5c7823896..676bd9a05 100644 --- a/bootrom/Makefile +++ b/bootrom/Makefile @@ -41,7 +41,10 @@ version.c: default_version.c $(info [=] GEN $@) $(Q)sh ../tools/mkversion.sh > $@ || perl ../tools/mkversion.pl > $@ || $(CP) $^ $@ -all: $(OBJS) +all: showinfo $(OBJS) + +showinfo: + $(info compiler version: $(shell $(CC) --version|head -n 1)) tarbin: $(OBJS) $(info [=] GEN $@) @@ -68,7 +71,7 @@ uninstall: $(info [@] Uninstalling bootrom from $(DESTDIR)$(PREFIX)...) $(Q)$(RM) $(foreach fw,$(INSTALLFW),$(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLFWRELPATH)$(PATHSEP)$(notdir $(fw))) -.PHONY: all clean help install +.PHONY: all clean help install showinfo help: @echo Multi-OS Makefile, you are running on $(DETECTED_OS) @echo Possible targets: diff --git a/client/Makefile b/client/Makefile index 37096d6e6..54fa3af2c 100644 --- a/client/Makefile +++ b/client/Makefile @@ -159,6 +159,7 @@ $(info native BT support: Bluez found, enabled) else $(info native BT support: Bluez not found, disabled) endif +$(info compiler version: $(shell $(CC) --version|head -n 1)) $(info ===================================================================) # Flags to generate temporary dependency files From 11884df687977a34686af800f7d517144c065392 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 11 May 2020 11:45:45 +0200 Subject: [PATCH 144/632] textual --- client/src/cmdlft55xx.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/client/src/cmdlft55xx.c b/client/src/cmdlft55xx.c index 7f7eccb19..cedd4b3c8 100644 --- a/client/src/cmdlft55xx.c +++ b/client/src/cmdlft55xx.c @@ -29,7 +29,6 @@ #include "fileutils.h" // loadDictionary #include "util_posix.h" - // Some defines for readability #define T55XX_DLMODE_FIXED 0 // Default Mode #define T55XX_DLMODE_LLR 1 // Long Leading Reference @@ -1312,7 +1311,7 @@ bool tryDetectModulationEx(uint8_t downlink_mode, bool print_config, uint32_t wa config.Q5 = tests[0].Q5; config.ST = tests[0].ST; config.downlink_mode = downlink_mode; - + if (print_config) printConfiguration(config); @@ -1599,17 +1598,18 @@ int special(const char *Cmd) { } int printConfiguration(t55xx_conf_block_t b) { - PrintAndLogEx(NORMAL, " Chip Type : %s", (b.Q5) ? "T5555 ( Q5 )" : "T55x7"); - PrintAndLogEx(NORMAL, " Modulation : %s", GetSelectedModulationStr(b.modulation)); - PrintAndLogEx(NORMAL, " Bit Rate : %s", GetBitRateStr(b.bitrate, (b.block0 & T55x7_X_MODE && (b.block0 >> 28 == 6 || b.block0 >> 28 == 9)))); - PrintAndLogEx(NORMAL, " Inverted : %s", (b.inverted) ? _GREEN_("Yes") : "No"); - PrintAndLogEx(NORMAL, " Offset : %d", b.offset); - PrintAndLogEx(NORMAL, " Seq. Term. : %s", (b.ST) ? _GREEN_("Yes") : "No"); - PrintAndLogEx(NORMAL, " Block0 : 0x%08X", b.block0); - PrintAndLogEx(NORMAL, " Downlink Mode : %s", GetDownlinkModeStr(b.downlink_mode)); - PrintAndLogEx(NORMAL, " Password Set : %s", (b.usepwd) ? _RED_("Yes") : _GREEN_("No")); - if (b.usepwd) - PrintAndLogEx(NORMAL, " Password : %08X", b.pwd); + PrintAndLogEx(INFO, " Chip Type : " _GREEN_("%s"), (b.Q5) ? "T5555 ( Q5 )" : "T55x7"); + PrintAndLogEx(INFO, " Modulation : " _GREEN_("%s"), GetSelectedModulationStr(b.modulation)); + PrintAndLogEx(INFO, " Bit Rate : %s", GetBitRateStr(b.bitrate, (b.block0 & T55x7_X_MODE && (b.block0 >> 28 == 6 || b.block0 >> 28 == 9)))); + PrintAndLogEx(INFO, " Inverted : %s", (b.inverted) ? _GREEN_("Yes") : "No"); + PrintAndLogEx(INFO, " Offset : %d", b.offset); + PrintAndLogEx(INFO, " Seq. Term. : %s", (b.ST) ? _GREEN_("Yes") : "No"); + PrintAndLogEx(INFO, " Block0 : 0x%08X", b.block0); + PrintAndLogEx(INFO, " Downlink Mode : %s", GetDownlinkModeStr(b.downlink_mode)); + PrintAndLogEx(INFO, " Password Set : %s", (b.usepwd) ? _RED_("Yes") : _GREEN_("No")); + if (b.usepwd) { + PrintAndLogEx(INFO, " Password : %08X", b.pwd); + } PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } @@ -2181,7 +2181,7 @@ static int CmdT55xxInfo(const char *Cmd) { uint32_t datamod = (block0 >> (32 - 28)) & 0x07; uint32_t maxblk = (block0 >> (32 - 31)) & 0x07; uint32_t st = block0 & 0x01; - PrintAndLogEx(NORMAL, "-- Q5 Configuration & Tag Information -----------------------"); + PrintAndLogEx(NORMAL, "--- " _CYAN_("Q5 Configuration & Information") " ------------"); PrintAndLogEx(NORMAL, "-------------------------------------------------------------"); PrintAndLogEx(NORMAL, " Header : 0x%03X%s", header, (header != 0x600) ? _RED_(" - Warning") : ""); PrintAndLogEx(NORMAL, " Page select : %d", ps); @@ -2216,7 +2216,7 @@ static int CmdT55xxInfo(const char *Cmd) { uint32_t inv = (block0 >> (32 - 31)) & 0x01; uint32_t por = (block0 >> (32 - 32)) & 0x01; - PrintAndLogEx(NORMAL, "-- T55x7 Configuration & Tag Information --------------------"); + PrintAndLogEx(NORMAL, "--- " _CYAN_("T55x7 Configuration & Information") " ---------"); PrintAndLogEx(NORMAL, "-------------------------------------------------------------"); PrintAndLogEx(NORMAL, " Safer key : %s", GetSaferStr(safer)); PrintAndLogEx(NORMAL, " reserved : %d", resv); From b40c8dd5d26f4ebee13a4b85d050ad399a8ee59d Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 9 May 2020 12:59:21 +0200 Subject: [PATCH 145/632] tinycbor: avoid overriding cflags, hide warnings --- client/deps/tinycbor/Makefile | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/client/deps/tinycbor/Makefile b/client/deps/tinycbor/Makefile index 42879259b..4de65aa7f 100644 --- a/client/deps/tinycbor/Makefile +++ b/client/deps/tinycbor/Makefile @@ -1,7 +1,7 @@ MYSRCPATHS = MYINCLUDES = # Strange errors on Mingw when compiling with C99 -MYCFLAGS = -Wno-bad-function-cast -Wno-incompatible-pointer-types-discards-qualifiers +MYCFLAGS = -Wno-bad-function-cast -Wno-redundant-decls -Wno-incompatible-pointer-types-discards-qualifiers -Wno-discarded-qualifiers -Wno-unknown-warning-option -Wno-maybe-uninitialized MYDEFS = MYSRCS = \ cborencoder.c \ @@ -18,7 +18,4 @@ LIB_A = tinycbor.a # Transition: remove old directories and objects MYCLEANOLDPATH = ../../tinycbor -# Strange errors on Mingw when compiling with -O3 -CFLAGS ?= -Wall -Werror -O2 - include ../../../Makefile.host From f9463d183a4cea1a0c43307f371cbbb1ba6982bd Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 10 May 2020 14:05:15 +0200 Subject: [PATCH 146/632] bootloader: fix missing prototypes and shadowed vars --- bootrom/bootrom.c | 8 ++++++-- common_arm/usb_cdc.c | 28 ++++++++++++++-------------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/bootrom/bootrom.c b/bootrom/bootrom.c index aa633f448..95fa5d467 100644 --- a/bootrom/bootrom.c +++ b/bootrom/bootrom.c @@ -10,6 +10,7 @@ #include "usb_cdc.h" #include "proxmark3_arm.h" +#define DEBUG 0 struct common_area common_area __attribute__((section(".commonarea"))); unsigned int start_addr, end_addr, bootrom_unlocked; @@ -45,13 +46,15 @@ static int reply_old(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, return result; } -void DbpString(char *str) { +#if DEBUG +static void DbpString(char *str) { uint8_t len = 0; while (str[len] != 0x00) len++; reply_old(CMD_DEBUG_PRINT_STRING, len, 0, 0, (uint8_t *)str, len); } +#endif static void ConfigClocks(void) { // we are using a 16 MHz crystal as the basis for everything @@ -76,7 +79,7 @@ static void Fatal(void) { for (;;) {}; } -void UsbPacketReceived(uint8_t *packet, int len) { +static void UsbPacketReceived(uint8_t *packet, int len) { int i, dont_ack = 0; PacketCommandOLD *c = (PacketCommandOLD *)packet; @@ -235,6 +238,7 @@ static void flash_mode(void) { } } +void BootROM(void); void BootROM(void) { //------------ // First set up all the I/O pins; GPIOs configured directly, other ones diff --git a/common_arm/usb_cdc.c b/common_arm/usb_cdc.c index ca2c1986a..2b8a8eee7 100644 --- a/common_arm/usb_cdc.c +++ b/common_arm/usb_cdc.c @@ -394,7 +394,7 @@ static const char StrMS_OSDescriptor[] = { 'M', 0, 'S', 0, 'F', 0, 'T', 0, '1', 0, '0', 0, '0', 0, MS_VENDOR_CODE, 0 }; -const char *getStringDescriptor(uint8_t idx) { +static const char *getStringDescriptor(uint8_t idx) { switch (idx) { case 0: return StrLanguageCodes; @@ -793,7 +793,7 @@ int usb_write(const uint8_t *data, const size_t len) { * \brief Send Data through the control endpoint *---------------------------------------------------------------------------- */ -void AT91F_USB_SendData(AT91PS_UDP pUdp, const char *pData, uint32_t length) { +void AT91F_USB_SendData(AT91PS_UDP pudp, const char *pData, uint32_t length) { AT91_REG csr; do { @@ -801,17 +801,17 @@ void AT91F_USB_SendData(AT91PS_UDP pUdp, const char *pData, uint32_t length) { length -= cpt; while (cpt--) - pUdp->UDP_FDR[AT91C_EP_CONTROL] = *pData++; + pudp->UDP_FDR[AT91C_EP_CONTROL] = *pData++; - if (pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_TXCOMP) { + if (pudp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_TXCOMP) { UDP_CLEAR_EP_FLAGS(AT91C_EP_CONTROL, AT91C_UDP_TXCOMP); - while (pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_TXCOMP); + while (pudp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_TXCOMP); } UDP_SET_EP_FLAGS(AT91C_EP_CONTROL, AT91C_UDP_TXPKTRDY); do { - csr = pUdp->UDP_CSR[AT91C_EP_CONTROL]; + csr = pudp->UDP_CSR[AT91C_EP_CONTROL]; // Data IN stage has been stopped by a status OUT if (csr & AT91C_UDP_RX_DATA_BK0) { @@ -822,9 +822,9 @@ void AT91F_USB_SendData(AT91PS_UDP pUdp, const char *pData, uint32_t length) { } while (length); - if (pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_TXCOMP) { + if (pudp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_TXCOMP) { UDP_CLEAR_EP_FLAGS(AT91C_EP_CONTROL, AT91C_UDP_TXCOMP); - while (pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_TXCOMP); + while (pudp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_TXCOMP); } } @@ -833,22 +833,22 @@ void AT91F_USB_SendData(AT91PS_UDP pUdp, const char *pData, uint32_t length) { //* \fn AT91F_USB_SendZlp //* \brief Send zero length packet through the control endpoint //*---------------------------------------------------------------------------- -void AT91F_USB_SendZlp(AT91PS_UDP pUdp) { +void AT91F_USB_SendZlp(AT91PS_UDP pudp) { UDP_SET_EP_FLAGS(AT91C_EP_CONTROL, AT91C_UDP_TXPKTRDY); - while (!(pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_TXCOMP)) {}; + while (!(pudp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_TXCOMP)) {}; UDP_CLEAR_EP_FLAGS(AT91C_EP_CONTROL, AT91C_UDP_TXCOMP); - while (pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_TXCOMP) {}; + while (pudp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_TXCOMP) {}; } //*---------------------------------------------------------------------------- //* \fn AT91F_USB_SendStall //* \brief Stall the control endpoint //*---------------------------------------------------------------------------- -void AT91F_USB_SendStall(AT91PS_UDP pUdp) { +void AT91F_USB_SendStall(AT91PS_UDP pudp) { UDP_SET_EP_FLAGS(AT91C_EP_CONTROL, AT91C_UDP_FORCESTALL); - while (!(pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_ISOERROR)) {}; + while (!(pudp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_ISOERROR)) {}; UDP_CLEAR_EP_FLAGS(AT91C_EP_CONTROL, (AT91C_UDP_FORCESTALL | AT91C_UDP_ISOERROR)); - while (pUdp->UDP_CSR[AT91C_EP_CONTROL] & (AT91C_UDP_FORCESTALL | AT91C_UDP_ISOERROR)) {}; + while (pudp->UDP_CSR[AT91C_EP_CONTROL] & (AT91C_UDP_FORCESTALL | AT91C_UDP_ISOERROR)) {}; } //*---------------------------------------------------------------------------- From 99b55a36e4c8258db9e8f1a81ae50314fc08e8e9 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 10 May 2020 14:17:08 +0200 Subject: [PATCH 147/632] arm: remove redundant declarations --- armsrc/appmain.h | 1 - armsrc/desfire_crypto.h | 2 -- armsrc/mifarecmd.h | 1 - armsrc/spiffs_config.h | 2 -- 4 files changed, 6 deletions(-) diff --git a/armsrc/appmain.h b/armsrc/appmain.h index 141c943f9..8baff4db1 100644 --- a/armsrc/appmain.h +++ b/armsrc/appmain.h @@ -13,7 +13,6 @@ #include "common.h" -extern const uint8_t OddByteParity[256]; extern int rsamples; // = 0; extern uint8_t trigger; extern bool allow_send_wtx; diff --git a/armsrc/desfire_crypto.h b/armsrc/desfire_crypto.h index 58588cd0d..f8a99a991 100644 --- a/armsrc/desfire_crypto.h +++ b/armsrc/desfire_crypto.h @@ -99,8 +99,6 @@ struct desfire_tag { uint32_t selected_application; }; typedef struct desfire_tag *desfiretag_t; -void crc32_ex(const uint8_t *data, const size_t len, uint8_t *crc); -void crc32_append(uint8_t *data, const size_t len); void des_encrypt(void *out, const void *in, const void *key); void des_decrypt(void *out, const void *in, const void *key); void tdes_nxp_receive(const void *in, void *out, size_t length, const void *key, unsigned char iv[8], int keymode); diff --git a/armsrc/mifarecmd.h b/armsrc/mifarecmd.h index a4bf2b30b..df25521f9 100644 --- a/armsrc/mifarecmd.h +++ b/armsrc/mifarecmd.h @@ -52,7 +52,6 @@ void OnSuccessMagic(); void OnErrorMagic(uint8_t reason); int32_t dist_nt(uint32_t nt1, uint32_t nt2); -void ReaderMifare(bool first_try, uint8_t block, uint8_t keytype); //void RAMFUNC SniffMifare(uint8_t param); void Mifare_DES_Auth1(uint8_t arg0, uint8_t *datain); diff --git a/armsrc/spiffs_config.h b/armsrc/spiffs_config.h index 7710a65a8..0cf3b96f5 100644 --- a/armsrc/spiffs_config.h +++ b/armsrc/spiffs_config.h @@ -18,8 +18,6 @@ #include "string.h" #include "flashmem.h" -void Dbprintf(const char *fmt, ...); - //#include //#include // ----------- >8 ------------ From 838d3459187edf9cb3510ffd7e276f33fc9d93af Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 10 May 2020 14:57:08 +0200 Subject: [PATCH 148/632] resolve inline warnings --- armsrc/legicrf.c | 5 +++++ armsrc/legicrfsim.c | 10 ++++++++++ common/crapto1/crapto1.h | 4 ++++ common/crapto1/crypto1.c | 13 +++++++++++++ 4 files changed, 32 insertions(+) diff --git a/armsrc/legicrf.c b/armsrc/legicrf.c index 35ac379ad..b28b57d7b 100644 --- a/armsrc/legicrf.c +++ b/armsrc/legicrf.c @@ -92,7 +92,12 @@ static inline uint8_t rx_byte_from_fpga() { // // Note: The SSC receiver is never synchronized the calculation may be performed // on a i/q pair from two subsequent correlations, but does not matter. +// Note: inlining this function would fail with -Os +#ifdef __OPTIMIZE_SIZE__ +static int32_t sample_power() { +#else static inline int32_t sample_power() { +#endif int32_t q = (int8_t)rx_byte_from_fpga(); q = ABS(q); int32_t i = (int8_t)rx_byte_from_fpga(); diff --git a/armsrc/legicrfsim.c b/armsrc/legicrfsim.c index ee658f4bd..346b9dd56 100644 --- a/armsrc/legicrfsim.c +++ b/armsrc/legicrfsim.c @@ -65,7 +65,12 @@ static uint32_t last_frame_end; /* ts of last bit of previews rx or tx frame */ //----------------------------------------------------------------------------- // Returns true if a pulse/pause is received within timeout +// Note: inlining this function would fail with -Os +#ifdef __OPTIMIZE_SIZE__ +static bool wait_for(bool value, const uint32_t timeout) { +#else static inline bool wait_for(bool value, const uint32_t timeout) { +#endif while ((bool)(AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_DIN) != value) { if (GetCountSspClk() > timeout) { return false; @@ -126,7 +131,12 @@ static inline int8_t rx_bit() { // Note: The Subcarrier is not disabled during bits to prevent glitches. This is // not mandatory but results in a cleaner signal. tx_frame will disable // the subcarrier when the frame is done. +// Note: inlining this function would fail with -Os +#ifdef __OPTIMIZE_SIZE__ +static void tx_bit(bool bit) { +#else static inline void tx_bit(bool bit) { +#endif LED_C_ON(); if (bit) { diff --git a/common/crapto1/crapto1.h b/common/crapto1/crapto1.h index b6be544a5..708ddb033 100644 --- a/common/crapto1/crapto1.h +++ b/common/crapto1/crapto1.h @@ -66,6 +66,9 @@ bool validate_prng_nonce(uint32_t nonce); #define LF_POLY_EVEN (0x870804) #define BIT(x, n) ((x) >> (n) & 1) #define BEBIT(x, n) BIT(x, (n) ^ 24) +#ifdef __OPTIMIZE_SIZE__ +int filter(uint32_t const x); +#else static inline int filter(uint32_t const x) { uint32_t f; @@ -77,3 +80,4 @@ static inline int filter(uint32_t const x) { return BIT(0xEC57E80A, f); } #endif +#endif diff --git a/common/crapto1/crypto1.c b/common/crapto1/crypto1.c index 82203ef5e..866a0fb98 100644 --- a/common/crapto1/crypto1.c +++ b/common/crapto1/crypto1.c @@ -21,6 +21,19 @@ #include "crapto1.h" #include "parity.h" +#ifdef __OPTIMIZE_SIZE__ +int filter(uint32_t const x) { + uint32_t f; + + f = 0xf22c0 >> (x & 0xf) & 16; + f |= 0x6c9c0 >> (x >> 4 & 0xf) & 8; + f |= 0x3c8b0 >> (x >> 8 & 0xf) & 4; + f |= 0x1e458 >> (x >> 12 & 0xf) & 2; + f |= 0x0d938 >> (x >> 16 & 0xf) & 1; + return BIT(0xEC57E80A, f); +} +#endif + #define SWAPENDIAN(x)\ (x = (x >> 8 & 0xff00ff) | (x & 0xff00ff) << 8, x = x >> 16 | x << 16) From 026707b960b8aeb5ef02b8d9c0d7c30ff8829c9d Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 10 May 2020 16:59:38 +0200 Subject: [PATCH 149/632] arm: fix prototypes --- armsrc/Standalone/hf_14asniff.c | 4 ++-- armsrc/Standalone/hf_bog.c | 2 +- armsrc/Standalone/hf_colin.c | 12 +++++----- armsrc/Standalone/hf_legic.c | 4 ++-- armsrc/Standalone/hf_mattyrun.c | 2 +- armsrc/Standalone/hf_msdsal.c | 4 ++-- armsrc/Standalone/hf_young.c | 2 +- armsrc/Standalone/lf_em4100emul.c | 2 +- armsrc/Standalone/lf_em4100rwc.c | 2 +- armsrc/Standalone/lf_hidbrute.c | 2 +- armsrc/Standalone/lf_icehid.c | 12 +++++----- armsrc/Standalone/lf_proxbrute.c | 2 +- armsrc/Standalone/lf_samyrun.c | 2 +- armsrc/Standalone/lf_skeleton.c | 2 +- armsrc/Standalone/placeholder.c | 2 +- armsrc/Standalone/standalone.h | 4 ++-- armsrc/appmain.c | 16 ++++++------- armsrc/epa.c | 6 ++--- armsrc/epa.h | 4 ++-- armsrc/felica.c | 10 ++++---- armsrc/felica.h | 2 +- armsrc/flashmem.c | 6 ++--- armsrc/flashmem.h | 6 ++--- armsrc/hitag2.c | 6 ++--- armsrc/hitagS.c | 6 ++--- armsrc/i2c.c | 30 ++++++++++++------------ armsrc/iclass.c | 24 +++++++++---------- armsrc/iso14443a.c | 21 +++++++++-------- armsrc/iso14443b.c | 18 +++++++-------- armsrc/iso14443b.h | 2 +- armsrc/iso15693.c | 4 ++-- armsrc/legicrf.c | 12 +++++----- armsrc/legicrfsim.c | 6 ++--- armsrc/lfadc.c | 10 ++++---- armsrc/lfadc.h | 8 +++---- armsrc/lfops.c | 22 +++++++++--------- armsrc/lfsampling.c | 12 +++++----- armsrc/lfsampling.h | 8 +++---- armsrc/mifarecmd.c | 20 ++++++++-------- armsrc/mifarecmd.h | 6 ++--- armsrc/mifaredesfire.c | 6 ++--- armsrc/mifaredesfire.h | 6 ++--- armsrc/mifaresniff_disabled.c | 2 +- armsrc/mifareutil.c | 4 ++-- armsrc/mifareutil.h | 2 +- armsrc/pcf7931.c | 2 +- armsrc/pcf7931.h | 2 +- armsrc/spiffs.c | 38 +++++++++++++++---------------- armsrc/spiffs.h | 14 ++++++------ armsrc/start.c | 3 ++- armsrc/string.c | 3 ++- armsrc/thinfilm.c | 4 ++-- armsrc/ticks.h | 6 ++--- armsrc/util.c | 2 +- 54 files changed, 211 insertions(+), 208 deletions(-) diff --git a/armsrc/Standalone/hf_14asniff.c b/armsrc/Standalone/hf_14asniff.c index 706a41b8b..3cbaa05f6 100644 --- a/armsrc/Standalone/hf_14asniff.c +++ b/armsrc/Standalone/hf_14asniff.c @@ -68,7 +68,7 @@ #define HF_14ASNIFF_LOGFILE "hf_14asniff.trc" -void DownloadTraceInstructions() { +void DownloadTraceInstructions(void) { Dbprintf(""); Dbprintf("To get the trace from flash and display it:"); Dbprintf("1. mem spiffs dump o "HF_14ASNIFF_LOGFILE" f trace.trc"); @@ -81,7 +81,7 @@ void ModInfo(void) { DownloadTraceInstructions(); } -void RunMod() { +void RunMod(void) { StandAloneMode(); Dbprintf("Starting standalone mode: hf_14asniff"); diff --git a/armsrc/Standalone/hf_bog.c b/armsrc/Standalone/hf_bog.c index d1cc2e202..c34f0e20a 100644 --- a/armsrc/Standalone/hf_bog.c +++ b/armsrc/Standalone/hf_bog.c @@ -235,7 +235,7 @@ void ModInfo(void) { DbpString(" HF 14a sniff standalone with ULC/ULEV1/NTAG auth storing in flashmem - aka BogitoRun (Bogito)"); } -void RunMod() { +void RunMod(void) { StandAloneMode(); diff --git a/armsrc/Standalone/hf_colin.c b/armsrc/Standalone/hf_colin.c index ffe2a613f..78b36eb78 100644 --- a/armsrc/Standalone/hf_colin.c +++ b/armsrc/Standalone/hf_colin.c @@ -215,22 +215,22 @@ void delete_schema(MFC1KSchema *p, int *schemas_counter, int index) { } } -void cjSetCursFRight() { +void cjSetCursFRight(void) { vtsend_cursor_position(NULL, 98, (currfline)); currfline++; } -void cjSetCursRight() { +void cjSetCursRight(void) { vtsend_cursor_position(NULL, 59, (currline)); currline++; } -void cjSetCursLeft() { +void cjSetCursLeft(void) { vtsend_cursor_position(NULL, 0, (curlline)); curlline++; } -void cjTabulize() { DbprintfEx(FLAG_RAWPRINT, "\t\t\t"); } +void cjTabulize(void) { DbprintfEx(FLAG_RAWPRINT, "\t\t\t"); } /* void cjPrintKey(uint64_t key, uint8_t *foundKey, uint16_t sectorNo, uint8_t type) { @@ -275,7 +275,7 @@ void add_schemas_from_json_in_spiffs(char *filename) { } } -void ReadLastTagFromFlash() { +void ReadLastTagFromFlash(void) { SpinOff(0); LED_A_ON(); LED_B_ON(); @@ -332,7 +332,7 @@ void WriteTagToFlash(uint32_t uid, size_t size) { void ModInfo(void) { DbpString(" HF Mifare ultra fast sniff/sim/clone - aka VIGIKPWN (Colin Brigato)"); } -void RunMod() { +void RunMod(void) { StandAloneMode(); // add_schema(Schemas, Noralsy, &total_schemas); diff --git a/armsrc/Standalone/hf_legic.c b/armsrc/Standalone/hf_legic.c index d72c8148e..d1add7fe3 100644 --- a/armsrc/Standalone/hf_legic.c +++ b/armsrc/Standalone/hf_legic.c @@ -44,7 +44,7 @@ * */ -void DownloadLogInstructions() { +void DownloadLogInstructions(void) { Dbprintf(""); Dbprintf("[=] List all dumps from flash:"); Dbprintf("[=] " _YELLOW_("-") " mem spiffs tree"); @@ -99,7 +99,7 @@ void ModInfo(void) { // A, B, C = Reading // A, D = Simulating -void RunMod() { +void RunMod(void) { StandAloneMode(); FpgaDownloadAndGo(FPGA_BITSTREAM_HF); Dbprintf("[=] >> HF Legic Prime Read/Simulate Started <<"); diff --git a/armsrc/Standalone/hf_mattyrun.c b/armsrc/Standalone/hf_mattyrun.c index 60619e657..b533e9573 100644 --- a/armsrc/Standalone/hf_mattyrun.c +++ b/armsrc/Standalone/hf_mattyrun.c @@ -210,7 +210,7 @@ void ModInfo(void) { DbpString(" HF Mifare sniff/clone - aka MattyRun (Matías A. Ré Medina)"); } -void RunMod() { +void RunMod(void) { StandAloneMode(); Dbprintf(">> Matty mifare chk/dump/sim a.k.a MattyRun Started <<"); FpgaDownloadAndGo(FPGA_BITSTREAM_HF); diff --git a/armsrc/Standalone/hf_msdsal.c b/armsrc/Standalone/hf_msdsal.c index c79d01aed..85f7edf8e 100644 --- a/armsrc/Standalone/hf_msdsal.c +++ b/armsrc/Standalone/hf_msdsal.c @@ -54,7 +54,7 @@ void ModInfo(void) { uint8_t ppdol [255] = {0x80, 0xA8, 0x00, 0x00, 0x02, 0x83, 0x00}; // Default GET PROCESSING -uint8_t treatPDOL(uint8_t *apdu) { //Generate GET PROCESSING +static uint8_t treatPDOL(uint8_t *apdu) { //Generate GET PROCESSING uint8_t plen = 7; //PDOL Format: 80 A8 00 00 + (PDOL Length+2) + 83 + PDOL Length + PDOL + 00 for (uint8_t i = 1; i <= apdu[0]; i++) { //Magic stuff, the generation order is important @@ -117,7 +117,7 @@ uint8_t treatPDOL(uint8_t *apdu) { //Generate GET PROCESSING return plen; } -void RunMod() { +void RunMod(void) { StandAloneMode(); Dbprintf(_YELLOW_(">>") "Reading Visa cards & Emulating a Visa MSD Transaction a.k.a. MSDSal Started<<"); FpgaDownloadAndGo(FPGA_BITSTREAM_HF); diff --git a/armsrc/Standalone/hf_young.c b/armsrc/Standalone/hf_young.c index f137e9992..d29aac220 100644 --- a/armsrc/Standalone/hf_young.c +++ b/armsrc/Standalone/hf_young.c @@ -37,7 +37,7 @@ void ModInfo(void) { DbpString(" HF Mifare sniff/simulation - (Craig Young)"); } -void RunMod() { +void RunMod(void) { StandAloneMode(); Dbprintf(">> Craig Young Mifare sniff UID/clone uid 2 magic/sim a.k.a YoungRun Started <<"); FpgaDownloadAndGo(FPGA_BITSTREAM_HF); diff --git a/armsrc/Standalone/lf_em4100emul.c b/armsrc/Standalone/lf_em4100emul.c index dce6c455e..166c668f8 100644 --- a/armsrc/Standalone/lf_em4100emul.c +++ b/armsrc/Standalone/lf_em4100emul.c @@ -79,7 +79,7 @@ void LED_Slot(int i) { } } -void RunMod() { +void RunMod(void) { StandAloneMode(); FpgaDownloadAndGo(FPGA_BITSTREAM_LF); Dbprintf("[=] >> LF EM4100 simulator started <<"); diff --git a/armsrc/Standalone/lf_em4100rwc.c b/armsrc/Standalone/lf_em4100rwc.c index fcd3fe294..19aa39919 100644 --- a/armsrc/Standalone/lf_em4100rwc.c +++ b/armsrc/Standalone/lf_em4100rwc.c @@ -118,7 +118,7 @@ void SaveIDtoFlash(int addr, uint64_t id) { } #endif -void RunMod() { +void RunMod(void) { StandAloneMode(); FpgaDownloadAndGo(FPGA_BITSTREAM_LF); Dbprintf("[=] >> LF EM4100 read/write/clone started <<"); diff --git a/armsrc/Standalone/lf_hidbrute.c b/armsrc/Standalone/lf_hidbrute.c index 7cae49a5b..2b2b43718 100644 --- a/armsrc/Standalone/lf_hidbrute.c +++ b/armsrc/Standalone/lf_hidbrute.c @@ -42,7 +42,7 @@ void ModInfo(void) { } // samy's sniff and repeat routine for LF -void RunMod() { +void RunMod(void) { StandAloneMode(); Dbprintf(">> LF HID corporate bruteforce a.k.a CorporateBrute Started <<"); FpgaDownloadAndGo(FPGA_BITSTREAM_LF); diff --git a/armsrc/Standalone/lf_icehid.c b/armsrc/Standalone/lf_icehid.c index c71ff344d..29a87305d 100644 --- a/armsrc/Standalone/lf_icehid.c +++ b/armsrc/Standalone/lf_icehid.c @@ -54,7 +54,7 @@ #define LF_HIDCOLLECT_LOGFILE "lf_hidcollect.log" -void DownloadLogInstructions() { +void DownloadLogInstructions(void) { Dbprintf(""); Dbprintf("[=] To get the logfile from flash and display it:"); Dbprintf("[=] " _YELLOW_("1.") " mem spiffs dump o "LF_HIDCOLLECT_LOGFILE" f "LF_HIDCOLLECT_LOGFILE); @@ -76,7 +76,7 @@ void append(uint8_t *entry, size_t entry_len) { LED_B_OFF(); } -uint32_t IceEM410xdemod() { +uint32_t IceEM410xdemod(void) { uint8_t *dest = BigBuf_get_addr(); size_t idx = 0; @@ -128,7 +128,7 @@ uint32_t IceEM410xdemod() { return PM3_SUCCESS; } -uint32_t IceAWIDdemod() { +uint32_t IceAWIDdemod(void) { uint8_t *dest = BigBuf_get_addr(); size_t size = MIN(12800, BigBuf_max_traceLen()); @@ -180,7 +180,7 @@ uint32_t IceAWIDdemod() { return PM3_SUCCESS; } -uint32_t IceIOdemod() { +uint32_t IceIOdemod(void) { int dummyIdx = 0; uint8_t version = 0, facilitycode = 0; @@ -224,7 +224,7 @@ uint32_t IceIOdemod() { return PM3_SUCCESS; } -uint32_t IceHIDDemod() { +uint32_t IceHIDDemod(void) { int dummyIdx = 0; @@ -320,7 +320,7 @@ void ModInfo(void) { DbpString(_YELLOW_(" LF HID / IOprox / AWID / EM4100 collector mode") " - a.k.a IceHID (Iceman)"); } -void RunMod() { +void RunMod(void) { FpgaDownloadAndGo(FPGA_BITSTREAM_LF); LFSetupFPGAForADC(LF_DIVISOR_125, true); diff --git a/armsrc/Standalone/lf_proxbrute.c b/armsrc/Standalone/lf_proxbrute.c index 3cdfa6819..b4caf2e3f 100644 --- a/armsrc/Standalone/lf_proxbrute.c +++ b/armsrc/Standalone/lf_proxbrute.c @@ -23,7 +23,7 @@ void ModInfo(void) { } // samy's sniff and repeat routine for LF -void RunMod() { +void RunMod(void) { StandAloneMode(); Dbprintf(">> LF HID proxII bruteforce a.k.a ProxBrute Started (Brad Antoniewicz) <<"); FpgaDownloadAndGo(FPGA_BITSTREAM_LF); diff --git a/armsrc/Standalone/lf_samyrun.c b/armsrc/Standalone/lf_samyrun.c index 4dc45b0b3..579a06470 100644 --- a/armsrc/Standalone/lf_samyrun.c +++ b/armsrc/Standalone/lf_samyrun.c @@ -31,7 +31,7 @@ void ModInfo(void) { // C = playing bank A // D = playing bank B -void RunMod() { +void RunMod(void) { StandAloneMode(); FpgaDownloadAndGo(FPGA_BITSTREAM_LF); Dbprintf(">> LF HID Read/Clone/Sim a.k.a SamyRun Started <<"); diff --git a/armsrc/Standalone/lf_skeleton.c b/armsrc/Standalone/lf_skeleton.c index 0d00c698d..2f87e92c7 100644 --- a/armsrc/Standalone/lf_skeleton.c +++ b/armsrc/Standalone/lf_skeleton.c @@ -18,7 +18,7 @@ void ModInfo(void) { DbpString(" LF skeleton mode - aka Skeleton (iceman)"); } -void RunMod() { +void RunMod(void) { StandAloneMode(); Dbprintf("[=] LF skeleton code a.k.a Skeleton started"); FpgaDownloadAndGo(FPGA_BITSTREAM_LF); diff --git a/armsrc/Standalone/placeholder.c b/armsrc/Standalone/placeholder.c index 84f724920..49028e27c 100644 --- a/armsrc/Standalone/placeholder.c +++ b/armsrc/Standalone/placeholder.c @@ -6,5 +6,5 @@ void ModInfo(void) { DbpString(" No standalone mode present"); } -void RunMod() { +void RunMod(void) { } diff --git a/armsrc/Standalone/standalone.h b/armsrc/Standalone/standalone.h index 2dd35e94a..29363f82f 100644 --- a/armsrc/Standalone/standalone.h +++ b/armsrc/Standalone/standalone.h @@ -11,7 +11,7 @@ #ifndef __STANDALONE_H #define __STANDALONE_H -void RunMod(); -void ModInfo(); +void RunMod(void); +void ModInfo(void); #endif /* __STANDALONE_H */ diff --git a/armsrc/appmain.c b/armsrc/appmain.c index bd8bb8d22..7cb974cec 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -144,7 +144,7 @@ uint16_t AvgAdc(int ch) { return (a + 15) >> 5; } -void MeasureAntennaTuning(void) { +static void MeasureAntennaTuning(void) { uint32_t peak = 0; @@ -221,7 +221,7 @@ void MeasureAntennaTuning(void) { } // Measure HF in milliVolt -uint16_t MeasureAntennaTuningHfData(void) { +static uint16_t MeasureAntennaTuningHfData(void) { #if defined RDV4 return (MAX_ADC_HF_VOLTAGE_RDV40 * AvgAdc(ADC_CHAN_HF_RDV40)) >> 10; @@ -232,7 +232,7 @@ uint16_t MeasureAntennaTuningHfData(void) { } // Measure LF in milliVolt -uint32_t MeasureAntennaTuningLfData(void) { +static uint32_t MeasureAntennaTuningLfData(void) { return (MAX_ADC_LF_VOLTAGE * AvgAdc(ADC_CHAN_LF)) >> 10; } @@ -246,7 +246,7 @@ void ReadMem(int addr) { extern struct version_information version_information; /* bootrom version information is pointed to from _bootphase1_version_pointer */ extern char *_bootphase1_version_pointer, _flash_start, _flash_end, __data_src_start__; -void SendVersion(void) { +static void SendVersion(void) { char temp[PM3_CMD_DATA_SIZE - 12]; /* Limited data payload in USB packets */ char VersionString[PM3_CMD_DATA_SIZE - 12] = { '\0' }; @@ -302,7 +302,7 @@ void SendVersion(void) { reply_ng(CMD_VERSION, PM3_SUCCESS, (uint8_t *)&payload, 12 + payload.versionstr_len); } -void TimingIntervalAcquisition(void) { +static void TimingIntervalAcquisition(void) { // trigger new acquisition by turning main oscillator off and on mck_from_pll_to_slck(); mck_from_slck_to_pll(); @@ -312,7 +312,7 @@ void TimingIntervalAcquisition(void) { // measure the Connection Speed by sending SpeedTestBufferSize bytes to client and measuring the elapsed time. // Note: this mimics GetFromBigbuf(), i.e. we have the overhead of the PacketCommandNG structure included. -void printConnSpeed(void) { +static void printConnSpeed(void) { DbpString(_BLUE_("Transfer Speed")); Dbprintf(" Sending packets to client..."); @@ -339,7 +339,7 @@ void printConnSpeed(void) { /** * Prints runtime information about the PM3. **/ -void SendStatus(void) { +static void SendStatus(void) { BigBuf_print_status(); Fpga_print_status(); #ifdef WITH_FLASH @@ -382,7 +382,7 @@ void SendStatus(void) { reply_ng(CMD_STATUS, PM3_SUCCESS, NULL, 0); } -void SendCapabilities(void) { +static void SendCapabilities(void) { capabilities_t capabilities; capabilities.version = CAPABILITIES_VERSION; capabilities.via_fpc = reply_via_fpc; diff --git a/armsrc/epa.c b/armsrc/epa.c index 867f4a43f..cdc83fe5d 100644 --- a/armsrc/epa.c +++ b/armsrc/epa.c @@ -113,7 +113,7 @@ static char iso_type = 0; //----------------------------------------------------------------------------- // Wrapper for sending APDUs to type A and B cards //----------------------------------------------------------------------------- -int EPA_APDU(uint8_t *apdu, size_t length, uint8_t *response) { +static int EPA_APDU(uint8_t *apdu, size_t length, uint8_t *response) { switch (iso_type) { case 'a': return iso14_apdu(apdu, (uint16_t) length, false, response, NULL); @@ -130,7 +130,7 @@ int EPA_APDU(uint8_t *apdu, size_t length, uint8_t *response) { //----------------------------------------------------------------------------- // Closes the communication channel and turns off the field //----------------------------------------------------------------------------- -void EPA_Finish() { +void EPA_Finish(void) { FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); LEDsoff(); iso_type = 0; @@ -501,7 +501,7 @@ void EPA_PACE_Replay(PacketCommandNG *c) { // Set up a communication channel (Card Select, PPS) // Returns 0 on success or a non-zero error code on failure //----------------------------------------------------------------------------- -int EPA_Setup() { +int EPA_Setup(void) { // first, look for type A cards // power up the field diff --git a/armsrc/epa.h b/armsrc/epa.h index 66a95c059..237238181 100644 --- a/armsrc/epa.h +++ b/armsrc/epa.h @@ -23,12 +23,12 @@ typedef struct { } pace_version_info_t; // general functions -void EPA_Finish(); +void EPA_Finish(void); size_t EPA_Parse_CardAccess(uint8_t *data, size_t length, pace_version_info_t *pace_info); int EPA_Read_CardAccess(uint8_t *buffer, size_t max_length); -int EPA_Setup(); +int EPA_Setup(void); // PACE related functions int EPA_PACE_MSE_Set_AT(pace_version_info_t pace_version_info, uint8_t password); diff --git a/armsrc/felica.c b/armsrc/felica.c index 2cb23b48c..40536fa08 100644 --- a/armsrc/felica.c +++ b/armsrc/felica.c @@ -37,11 +37,11 @@ static uint8_t felica_select_card(felica_card_select_t *card); static void TransmitFor18092_AsReader(uint8_t *frame, int len, uint32_t *timing, uint8_t power, uint8_t highspeed); bool WaitForFelicaReply(uint16_t maxbytes); -void iso18092_set_timeout(uint32_t timeout) { +static void iso18092_set_timeout(uint32_t timeout) { felica_timeout = timeout + (DELAY_AIR2ARM_AS_READER + DELAY_ARM2AIR_AS_READER) / (16 * 8) + 2; } -uint32_t iso18092_get_timeout(void) { +static uint32_t iso18092_get_timeout(void) { return felica_timeout - (DELAY_AIR2ARM_AS_READER + DELAY_ARM2AIR_AS_READER) / (16 * 8) - 2; } @@ -80,7 +80,7 @@ static struct { # define SYNC_16BIT 0xB24D #endif -static void FelicaFrameReset() { +static void FelicaFrameReset(void) { FelicaFrame.state = STATE_UNSYNCD; FelicaFrame.posCnt = 0; FelicaFrame.crc_ok = false; @@ -481,7 +481,7 @@ static void iso18092_setup(uint8_t fpga_minor_mode) { LED_D_ON(); } -void felica_reset_frame_mode() { +static void felica_reset_frame_mode(void) { switch_off(); //Resetting Frame mode (First set in fpgaloader.c) AT91C_BASE_SSC->SSC_RFMR = SSC_FRAME_MODE_BITS_IN_WORD(8) | AT91C_SSC_MSBF | SSC_FRAME_MODE_WORDS_PER_TRANSFER(0); @@ -738,7 +738,7 @@ void felica_sim_lite(uint64_t uid) { #define RES_SVC_LEN 11 + 3 -void felica_dump_lite_s() { +void felica_dump_lite_s(void) { uint8_t ndef[8]; uint8_t poll[10] = { 0xb2, 0x4d, 0x06, FELICA_POLL_REQ, 0xff, 0xff, 0x00, 0x00, 0x09, 0x21}; uint16_t liteblks[28] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x90, 0x91, 0x92, 0xa0}; diff --git a/armsrc/felica.h b/armsrc/felica.h index ef34dc108..885815abb 100644 --- a/armsrc/felica.h +++ b/armsrc/felica.h @@ -17,6 +17,6 @@ void felica_sendraw(PacketCommandNG *c); void felica_sniff(uint32_t samplesToSkip, uint32_t triggersToSkip); void felica_sim_lite(uint64_t uid); -void felica_dump_lite_s(); +void felica_dump_lite_s(void); #endif diff --git a/armsrc/flashmem.c b/armsrc/flashmem.c index e3a20cacc..80f20e105 100644 --- a/armsrc/flashmem.c +++ b/armsrc/flashmem.c @@ -25,7 +25,7 @@ void FlashmemSetSpiBaudrate(uint32_t baudrate) { } // initialize -bool FlashInit() { +bool FlashInit(void) { FlashSetup(FLASHMEM_SPIBAUDRATE); StartTicks(); @@ -435,7 +435,7 @@ bool Flash_WipeMemoryPage(uint8_t page) { return true; } // Wipes flash memory completely, fills with 0xFF -bool Flash_WipeMemory() { +bool Flash_WipeMemory(void) { if (!FlashInit()) { if (DBGLEVEL > 3) Dbprintf("Flash_WriteData init fail"); return false; @@ -462,7 +462,7 @@ bool Flash_WipeMemory() { } // enable the flash write -void Flash_WriteEnable() { +void Flash_WriteEnable(void) { FlashSendLastByte(WRITEENABLE); if (DBGLEVEL > 3) Dbprintf("Flash Write enabled"); } diff --git a/armsrc/flashmem.h b/armsrc/flashmem.h index 42fc3d2f0..e5a4e0459 100644 --- a/armsrc/flashmem.h +++ b/armsrc/flashmem.h @@ -111,7 +111,7 @@ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// void FlashmemSetSpiBaudrate(uint32_t baudrate); -bool FlashInit(); +bool FlashInit(void); void FlashSetup(uint32_t baudrate); void FlashStop(void); bool Flash_WaitIdle(void); @@ -122,9 +122,9 @@ void Flash_TransferAdresse(uint32_t address); bool Flash_CheckBusy(uint32_t timeout); -void Flash_WriteEnable(); +void Flash_WriteEnable(void); bool Flash_WipeMemoryPage(uint8_t page); -bool Flash_WipeMemory(); +bool Flash_WipeMemory(void); bool Flash_Erase4k(uint8_t block, uint8_t sector); //bool Flash_Erase32k(uint32_t address); bool Flash_Erase64k(uint8_t block); diff --git a/armsrc/hitag2.c b/armsrc/hitag2.c index 1c045c5e8..4387bdbb0 100644 --- a/armsrc/hitag2.c +++ b/armsrc/hitag2.c @@ -373,7 +373,7 @@ static uint32_t hitag_reader_send_frame(const uint8_t *frame, size_t frame_len) return wait; } -uint8_t hitag_crc(uint8_t *data, size_t length) { +static uint8_t hitag_crc(uint8_t *data, size_t length) { uint8_t crc = 0xff; unsigned int byte, bit; for (byte = 0; byte < ((length + 7) / 8); byte++) { @@ -411,7 +411,7 @@ void fix_ac_decoding(uint8_t *input, size_t len) { // looks at number of received bits. // 0 = collision? // 32 = good response -bool hitag_plain(uint8_t *rx, const size_t rxlen, uint8_t *tx, size_t *txlen, bool hitag_s) { +static bool hitag_plain(uint8_t *rx, const size_t rxlen, uint8_t *tx, size_t *txlen, bool hitag_s) { uint8_t crc; *txlen = 0; switch (rxlen) { @@ -480,7 +480,7 @@ bool hitag_plain(uint8_t *rx, const size_t rxlen, uint8_t *tx, size_t *txlen, bo } -bool hitag1_authenticate(uint8_t *rx, const size_t rxlen, uint8_t *tx, size_t *txlen) { +static bool hitag1_authenticate(uint8_t *rx, const size_t rxlen, uint8_t *tx, size_t *txlen) { uint8_t crc; *txlen = 0; switch (rxlen) { diff --git a/armsrc/hitagS.c b/armsrc/hitagS.c index 8e9a4bb88..1ab4d5b6d 100644 --- a/armsrc/hitagS.c +++ b/armsrc/hitagS.c @@ -110,7 +110,7 @@ bool end = false; * Implementation of the crc8 calculation from Hitag S * from http://www.proxmark.org/files/Documents/125%20kHz%20-%20Hitag/HitagS.V11.pdf */ -void calc_crc(unsigned char *crc, unsigned char data, unsigned char Bitcount) { +static void calc_crc(unsigned char *crc, unsigned char data, unsigned char Bitcount) { *crc ^= data; // crc = crc (exor) data do { if (*crc & 0x80) { // if (MSB-CRC == 1) @@ -333,7 +333,7 @@ static int check_select(uint8_t *rx, uint32_t uid) { return 0; } -void hitagS_set_frame_modulation() { +static void hitagS_set_frame_modulation(void) { switch (tag.mode) { case HT_STANDARD: sof_bits = 1; @@ -1075,7 +1075,7 @@ void SimulateHitagSTag(bool tag_mem_supplied, uint8_t *data) { DbpString("Sim Stopped"); } -void hitagS_receive_frame(uint8_t *rx, size_t *rxlen, int *response) { +static void hitagS_receive_frame(uint8_t *rx, size_t *rxlen, int *response) { // Reset values for receiving frames memset(rx, 0x00, HITAG_FRAME_LEN * sizeof(uint8_t)); diff --git a/armsrc/i2c.c b/armsrc/i2c.c index 3d1f050c3..4a3d0dc08 100644 --- a/armsrc/i2c.c +++ b/armsrc/i2c.c @@ -39,7 +39,7 @@ volatile unsigned long c; // timer. // I2CSpinDelayClk(4) = 12.31us // I2CSpinDelayClk(1) = 3.07us -void __attribute__((optimize("O0"))) I2CSpinDelayClk(uint16_t delay) { +static void __attribute__((optimize("O0"))) I2CSpinDelayClk(uint16_t delay) { for (c = delay * 2; c; c--) {}; } @@ -146,7 +146,7 @@ void I2C_Reset_EnterBootloader(void) { } // Wait for the clock to go High. -bool WaitSCL_H_delay(uint32_t delay) { +static bool WaitSCL_H_delay(uint32_t delay) { while (delay--) { if (SCL_read) { return true; @@ -158,11 +158,11 @@ bool WaitSCL_H_delay(uint32_t delay) { // 5000 * 3.07us = 15350us. 15.35ms // 15000 * 3.07us = 46050us. 46.05ms -bool WaitSCL_H(void) { +static bool WaitSCL_H(void) { return WaitSCL_H_delay(15000); } -bool WaitSCL_L_delay(uint32_t delay) { +static bool WaitSCL_L_delay(uint32_t delay) { while (delay--) { if (!SCL_read) { return true; @@ -172,14 +172,14 @@ bool WaitSCL_L_delay(uint32_t delay) { return false; } // 5000 * 3.07us = 15350us. 15.35ms -bool WaitSCL_L(void) { +static bool WaitSCL_L(void) { return WaitSCL_L_delay(15000); } // Wait max 1800ms or until SCL goes LOW. // It timeout reading response from card // Which ever comes first -bool WaitSCL_L_timeout(void) { +static bool WaitSCL_L_timeout(void) { volatile uint16_t delay = 1800; while (delay--) { // exit on SCL LOW @@ -191,7 +191,7 @@ bool WaitSCL_L_timeout(void) { return (delay == 0); } -bool I2C_Start(void) { +static bool I2C_Start(void) { I2C_DELAY_XCLK(4); SDA_H; @@ -209,7 +209,7 @@ bool I2C_Start(void) { return true; } -bool I2C_WaitForSim() { +static bool I2C_WaitForSim(void) { // wait for data from card if (!WaitSCL_L_timeout()) @@ -225,7 +225,7 @@ bool I2C_WaitForSim() { } // send i2c STOP -void I2C_Stop(void) { +static void I2C_Stop(void) { SCL_L; I2C_DELAY_2CLK; SDA_L; @@ -238,7 +238,7 @@ void I2C_Stop(void) { } // Send i2c ACK -void I2C_Ack(void) { +static void I2C_Ack(void) { SCL_L; I2C_DELAY_2CLK; SDA_L; @@ -251,7 +251,7 @@ void I2C_Ack(void) { } // Send i2c NACK -void I2C_NoAck(void) { +static void I2C_NoAck(void) { SCL_L; I2C_DELAY_2CLK; SDA_H; @@ -263,7 +263,7 @@ void I2C_NoAck(void) { I2C_DELAY_2CLK; } -bool I2C_WaitAck(void) { +static bool I2C_WaitAck(void) { SCL_L; I2C_DELAY_1CLK; SDA_H; @@ -282,7 +282,7 @@ bool I2C_WaitAck(void) { return true; } -void I2C_SendByte(uint8_t data) { +static void I2C_SendByte(uint8_t data) { uint8_t bits = 8; while (bits--) { @@ -308,7 +308,7 @@ void I2C_SendByte(uint8_t data) { SCL_L; } -int16_t I2C_ReadByte(void) { +static int16_t I2C_ReadByte(void) { uint8_t bits = 8, b = 0; SDA_H; @@ -623,7 +623,7 @@ int I2C_get_version(uint8_t *maj, uint8_t *min) { } // Will read response from smart card module, retries 3 times to get the data. -bool sc_rx_bytes(uint8_t *dest, uint8_t *destlen) { +static bool sc_rx_bytes(uint8_t *dest, uint8_t *destlen) { uint8_t i = 3; int16_t len = 0; diff --git a/armsrc/iclass.c b/armsrc/iclass.c index 9ab2b5013..cca922a29 100644 --- a/armsrc/iclass.c +++ b/armsrc/iclass.c @@ -520,7 +520,7 @@ static RAMFUNC int OutOfNDecoding(int bit) { // Manchester //============================================================================= static tDemodIc Demod; -static void DemodIcReset() { +static void DemodIcReset(void) { Demod.bitCount = 0; Demod.posCount = 0; Demod.syncBit = 0; @@ -985,7 +985,7 @@ void RAMFUNC SniffIClass(void) { switch_off(); } -void rotateCSN(uint8_t *originalCSN, uint8_t *rotatedCSN) { +static void rotateCSN(uint8_t *originalCSN, uint8_t *rotatedCSN) { int i; for (i = 0; i < 8; i++) rotatedCSN[i] = (originalCSN[i] >> 3) | (originalCSN[(i + 1) % 8] << 5); @@ -1146,7 +1146,7 @@ static void CodeIClassTagAnswer(const uint8_t *cmd, int len) { } // Only SOF -static void CodeIClassTagSOF() { +static void CodeIClassTagSOF(void) { //So far a dummy implementation, not used //int lastProxToAirDuration =0; @@ -1757,7 +1757,7 @@ static void TransmitIClassCommand(const uint8_t *cmd, int len, int *wait) { //----------------------------------------------------------------------------- // Prepare iClass reader command to send to FPGA //----------------------------------------------------------------------------- -void CodeIClassCommand(const uint8_t *cmd, int len) { +static void CodeIClassCommand(const uint8_t *cmd, int len) { int i, j, k; ToSendReset(); @@ -1793,7 +1793,7 @@ void CodeIClassCommand(const uint8_t *cmd, int len) { ToSendMax++; } -void ReaderTransmitIClass_ext(uint8_t *frame, int len, int wait) { +static void ReaderTransmitIClass_ext(uint8_t *frame, int len, int wait) { // This is tied to other size changes CodeIClassCommand(frame, len); @@ -1804,7 +1804,7 @@ void ReaderTransmitIClass_ext(uint8_t *frame, int len, int wait) { LogTrace(frame, len, rsamples, rsamples, NULL, true); } -void ReaderTransmitIClass(uint8_t *frame, int len) { +static void ReaderTransmitIClass(uint8_t *frame, int len) { ReaderTransmitIClass_ext(frame, len, 330); } @@ -1862,7 +1862,7 @@ static int GetIClassAnswer(uint8_t *receivedResponse, int maxLen, int *wait) { return false; } -int ReaderReceiveIClass(uint8_t *receivedAnswer) { +static int ReaderReceiveIClass(uint8_t *receivedAnswer) { if (GetIClassAnswer(receivedAnswer, 0, NULL) == false) return 0; @@ -1871,7 +1871,7 @@ int ReaderReceiveIClass(uint8_t *receivedAnswer) { return Demod.len; } -void setupIclassReader() { +static void setupIclassReader(void) { LEDsoff(); @@ -1898,7 +1898,7 @@ void setupIclassReader() { LED_A_ON(); } -bool sendCmdGetResponseWithRetries(uint8_t *command, size_t cmdsize, uint8_t *resp, uint8_t expected_size, int8_t retries) { +static bool sendCmdGetResponseWithRetries(uint8_t *command, size_t cmdsize, uint8_t *resp, uint8_t expected_size, int8_t retries) { while (retries-- > 0) { ReaderTransmitIClass(command, cmdsize); @@ -1935,7 +1935,7 @@ bool sendCmdGetResponseWithRetries(uint8_t *command, size_t cmdsize, uint8_t *re * 1 = Got CSN * 2 = Got CSN and CC */ -uint8_t handshakeIclassTag_ext(uint8_t *card_data, bool use_credit_key) { +static uint8_t handshakeIclassTag_ext(uint8_t *card_data, bool use_credit_key) { // act_all... static uint8_t act_all[] = { ICLASS_CMD_ACTALL }; @@ -2000,7 +2000,7 @@ uint8_t handshakeIclassTag_ext(uint8_t *card_data, bool use_credit_key) { // we got all data; return 2; } -uint8_t handshakeIclassTag(uint8_t *card_data) { +static uint8_t handshakeIclassTag(uint8_t *card_data) { return handshakeIclassTag_ext(card_data, false); } @@ -2458,7 +2458,7 @@ void iClass_Dump(uint8_t blockno, uint8_t numblks) { BigBuf_free(); } -bool iClass_WriteBlock_ext(uint8_t blockno, uint8_t *data) { +static bool iClass_WriteBlock_ext(uint8_t blockno, uint8_t *data) { uint8_t resp[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; uint8_t write[] = { 0x80 | ICLASS_CMD_UPDATE, blockno, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; memcpy(write + 2, data, 12); // data + mac diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 402d35d8a..a793664e0 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -191,7 +191,7 @@ const bool Mod_Miller_LUT[] = { #define IsMillerModulationNibble1(b) (Mod_Miller_LUT[(b & 0x000000F0) >> 4]) #define IsMillerModulationNibble2(b) (Mod_Miller_LUT[(b & 0x0000000F)]) -tUart14a *GetUart14a() { +tUart14a *GetUart14a(void) { return &Uart; } @@ -363,7 +363,7 @@ const bool Mod_Manchester_LUT[] = { #define IsManchesterModulationNibble1(b) (Mod_Manchester_LUT[(b & 0x00F0) >> 4]) #define IsManchesterModulationNibble2(b) (Mod_Manchester_LUT[(b & 0x000F)]) -tDemod14a *GetDemod14a() { +tDemod14a *GetDemod14a(void) { return &Demod; } void Demod14aReset(void) { @@ -480,7 +480,7 @@ RAMFUNC int ManchesterDecoding(uint8_t bit, uint16_t offset, uint32_t non_real_t // Thinfilm, Kovio mangels ISO14443A in the way that they don't use start bit nor parity bits. -RAMFUNC int ManchesterDecoding_Thinfilm(uint8_t bit) { +static RAMFUNC int ManchesterDecoding_Thinfilm(uint8_t bit) { Demod.twoBits = (Demod.twoBits << 8) | bit; if (Demod.state == DEMOD_14A_UNSYNCD) { @@ -1613,7 +1613,7 @@ void SimulateIso14443aTag(uint8_t tagType, uint8_t flags, uint8_t *data) { // prepare a delayed transfer. This simply shifts ToSend[] by a number // of bits specified in the delay parameter. -void PrepareDelayedTransfer(uint16_t delay) { +static void PrepareDelayedTransfer(uint16_t delay) { delay &= 0x07; if (!delay) return; @@ -1683,7 +1683,7 @@ static void TransmitFor14443a(const uint8_t *cmd, uint16_t len, uint32_t *timing //----------------------------------------------------------------------------- // Prepare reader command (in bits, support short frames) to send to FPGA //----------------------------------------------------------------------------- -void CodeIso14443aBitsAsReaderPar(const uint8_t *cmd, uint16_t bits, const uint8_t *par) { +static void CodeIso14443aBitsAsReaderPar(const uint8_t *cmd, uint16_t bits, const uint8_t *par) { int last = 0; ToSendReset(); @@ -1759,10 +1759,11 @@ void CodeIso14443aBitsAsReaderPar(const uint8_t *cmd, uint16_t bits, const uint8 //----------------------------------------------------------------------------- // Prepare reader command to send to FPGA //----------------------------------------------------------------------------- -void CodeIso14443aAsReaderPar(const uint8_t *cmd, uint16_t len, const uint8_t *par) { +/* +static void CodeIso14443aAsReaderPar(const uint8_t *cmd, uint16_t len, const uint8_t *par) { CodeIso14443aBitsAsReaderPar(cmd, len * 8, par); } - +*/ //----------------------------------------------------------------------------- // Wait for commands from reader // Stop when button is pressed (return 1) or field was gone (return 2) @@ -2153,7 +2154,7 @@ void ReaderTransmitPar(uint8_t *frame, uint16_t len, uint8_t *par, uint32_t *tim ReaderTransmitBitsPar(frame, len * 8, par, timing); } -void ReaderTransmitBits(uint8_t *frame, uint16_t len, uint32_t *timing) { +static void ReaderTransmitBits(uint8_t *frame, uint16_t len, uint32_t *timing) { // Generate parity and redirect uint8_t par[MAX_PARITY_SIZE] = {0x00}; GetParity(frame, len / 8, par); @@ -2167,7 +2168,7 @@ void ReaderTransmit(uint8_t *frame, uint16_t len, uint32_t *timing) { ReaderTransmitBitsPar(frame, len * 8, par, timing); } -int ReaderReceiveOffset(uint8_t *receivedAnswer, uint16_t offset, uint8_t *par) { +static int ReaderReceiveOffset(uint8_t *receivedAnswer, uint16_t offset, uint8_t *par) { if (!GetIso14443aAnswerFromTag(receivedAnswer, par, offset)) return false; LogTrace(receivedAnswer, Demod.len, Demod.startTime * 16 - DELAY_AIR2ARM_AS_READER, Demod.endTime * 16 - DELAY_AIR2ARM_AS_READER, par, false); @@ -2769,7 +2770,7 @@ OUT: // Determine the distance between two nonces. // Assume that the difference is small, but we don't know which is first. // Therefore try in alternating directions. -int32_t dist_nt(uint32_t nt1, uint32_t nt2) { +static int32_t dist_nt(uint32_t nt1, uint32_t nt2) { if (nt1 == nt2) return 0; diff --git a/armsrc/iso14443b.c b/armsrc/iso14443b.c index 10beb4489..7aa3e981e 100644 --- a/armsrc/iso14443b.c +++ b/armsrc/iso14443b.c @@ -91,7 +91,7 @@ static struct { uint8_t *output; } Uart; -static void Uart14bReset() { +static void Uart14bReset(void) { Uart.state = STATE_14B_UNSYNCD; Uart.shiftReg = 0; Uart.bitCnt = 0; @@ -134,7 +134,7 @@ static struct { } Demod; // Clear out the state of the "UART" that receives from the tag. -static void Demod14bReset() { +static void Demod14bReset(void) { Demod.state = DEMOD_UNSYNCD; Demod.bitCount = 0; Demod.posCount = 0; @@ -765,7 +765,7 @@ static RAMFUNC int Handle14443bTagSamplesDemod(int ci, int cq) { // The soft decision on the bit uses an estimate of just the // quadrant of the reference angle, not the exact angle. -#define MAKE_SOFT_DECISION() { \ +#define MAKE_SOFT_DECISION(void) { \ if (Demod.sumI > 0) { \ v = ci; \ } else { \ @@ -780,7 +780,7 @@ static RAMFUNC int Handle14443bTagSamplesDemod(int ci, int cq) { // Subcarrier amplitude v = sqrt(ci^2 + cq^2), approximated here by abs(ci) + abs(cq) // Subcarrier amplitude v = sqrt(ci^2 + cq^2), approximated here by max(abs(ci),abs(cq)) + 1/2*min(abs(ci),abs(cq))) -#define CHECK_FOR_SUBCARRIER_old() { \ +#define CHECK_FOR_SUBCARRIER_old(void) { \ if (ci < 0) { \ if (cq < 0) { /* ci < 0, cq < 0 */ \ if (cq < ci) { \ @@ -813,7 +813,7 @@ static RAMFUNC int Handle14443bTagSamplesDemod(int ci, int cq) { } //note: couldn't we just use MAX(ABS(ci),ABS(cq)) + (MIN(ABS(ci),ABS(cq))/2) from common.h - marshmellow -#define CHECK_FOR_SUBCARRIER() { v = MAX(myI, myQ) + (MIN(myI, myQ) >> 1); } +#define CHECK_FOR_SUBCARRIER(void) { v = MAX(myI, myQ) + (MIN(myI, myQ) >> 1); } switch (Demod.state) { case DEMOD_UNSYNCD: @@ -964,7 +964,7 @@ static RAMFUNC int Handle14443bTagSamplesDemod(int ci, int cq) { * Demodulate the samples we received from the tag, also log to tracebuffer * quiet: set to 'TRUE' to disable debug output */ -static void GetTagSamplesFor14443bDemod() { +static void GetTagSamplesFor14443bDemod(void) { bool finished = false; // int lastRxCounter = ISO14443B_DMA_BUFFER_SIZE; uint32_t time_0 = 0, time_stop = 0; @@ -1195,7 +1195,7 @@ uint8_t iso14443b_apdu(uint8_t const *message, size_t message_length, uint8_t *r /** * SRx Initialise. */ -uint8_t iso14443b_select_srx_card(iso14b_card_select_t *card) { +static uint8_t iso14443b_select_srx_card(iso14b_card_select_t *card) { // INITIATE command: wake up the tag using the INITIATE static const uint8_t init_srx[] = { ISO14443B_INITIATE, 0x00, 0x97, 0x5b }; // SELECT command (with space for CRC) @@ -1332,7 +1332,7 @@ uint8_t iso14443b_select_card(iso14b_card_select_t *card) { // Set up ISO 14443 Type B communication (similar to iso14443a_setup) // field is setup for "Sending as Reader" -void iso14443b_setup() { +void iso14443b_setup(void) { LEDsoff(); FpgaDownloadAndGo(FPGA_BITSTREAM_HF); @@ -1577,7 +1577,7 @@ void RAMFUNC SniffIso14443b(void) { switch_off(); } -void iso14b_set_trigger(bool enable) { +static void iso14b_set_trigger(bool enable) { trigger = enable; } diff --git a/armsrc/iso14443b.h b/armsrc/iso14443b.h index 12ee316e9..62dbd6590 100644 --- a/armsrc/iso14443b.h +++ b/armsrc/iso14443b.h @@ -26,7 +26,7 @@ # define AddCrc14B(data, len) compute_crc(CRC_14443_B, (data), (len), (data)+(len), (data)+(len)+1) #endif -void iso14443b_setup(); +void iso14443b_setup(void); uint8_t iso14443b_apdu(uint8_t const *message, size_t message_length, uint8_t *response); uint8_t iso14443b_select_card(iso14b_card_select_t *card); uint8_t iso14443b_select_card_srx(iso14b_card_select_t *card); diff --git a/armsrc/iso15693.c b/armsrc/iso15693.c index a35ac4c57..d3a0996e6 100644 --- a/armsrc/iso15693.c +++ b/armsrc/iso15693.c @@ -703,7 +703,7 @@ static void BuildInventoryResponse(uint8_t *cmdout, uint8_t *uid) { // If you do not need the answer use NULL for *recv[] // return: length of received data // logging enabled -int SendDataTag(uint8_t *send, int sendlen, bool init, int speed, uint8_t *outdata) { +static int SendDataTag(uint8_t *send, int sendlen, bool init, int speed, uint8_t *outdata) { int t_samples = 0, wait = 0, elapsed = 0, answer_len = 0; @@ -741,7 +741,7 @@ int SendDataTag(uint8_t *send, int sendlen, bool init, int speed, uint8_t *outda // Decodes a message from a tag and displays its metadata and content #define DBD15STATLEN 48 -void DbdecodeIso15693Answer(int len, uint8_t *d) { +static void DbdecodeIso15693Answer(int len, uint8_t *d) { if (len > 3) { char status[DBD15STATLEN + 1] = {0}; diff --git a/armsrc/legicrf.c b/armsrc/legicrf.c index b28b57d7b..0a96fcb01 100644 --- a/armsrc/legicrf.c +++ b/armsrc/legicrf.c @@ -65,7 +65,7 @@ static uint32_t last_frame_end; /* ts of last bit of previews rx or tx frame */ // I/O interface abstraction (FPGA -> ARM) //----------------------------------------------------------------------------- -static inline uint8_t rx_byte_from_fpga() { +static inline uint8_t rx_byte_from_fpga(void) { for (;;) { WDT_HIT(); @@ -94,9 +94,9 @@ static inline uint8_t rx_byte_from_fpga() { // on a i/q pair from two subsequent correlations, but does not matter. // Note: inlining this function would fail with -Os #ifdef __OPTIMIZE_SIZE__ -static int32_t sample_power() { +static int32_t sample_power(void) { #else -static inline int32_t sample_power() { +static inline int32_t sample_power(void) { #endif int32_t q = (int8_t)rx_byte_from_fpga(); q = ABS(q); @@ -113,7 +113,7 @@ static inline int32_t sample_power() { // // Note: The demodulator would be drifting (18.9us * 5 != 100us), rx_frame // has a delay loop that aligns rx_bit calls to the TAG tx timeslots. -static inline bool rx_bit() { +static inline bool rx_bit(void) { int32_t power; for (size_t i = 0; i < 5; ++i) { @@ -211,7 +211,7 @@ static uint32_t rx_frame(uint8_t len) { return frame; } -static bool rx_ack() { +static bool rx_ack(void) { // change fpga into rx mode FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR | FPGA_HF_READER_RX_XCORR_848_KHZ @@ -387,7 +387,7 @@ static int16_t read_byte(uint16_t index, uint8_t cmd_sz) { // Transmit write command, wait until (3.6ms) the tag sends back an unencrypted // ACK ('1' bit) and forward the prng time based. -bool write_byte(uint16_t index, uint8_t byte, uint8_t addr_sz) { +static bool write_byte(uint16_t index, uint8_t byte, uint8_t addr_sz) { uint32_t cmd = index << 1 | LEGIC_WRITE; // prepare command uint8_t crc = calc_crc4(cmd, addr_sz + 1, byte); // calculate crc cmd |= byte << (addr_sz + 1); // append value diff --git a/armsrc/legicrfsim.c b/armsrc/legicrfsim.c index 346b9dd56..e2b06ba9b 100644 --- a/armsrc/legicrfsim.c +++ b/armsrc/legicrfsim.c @@ -88,7 +88,7 @@ static inline bool wait_for(bool value, const uint32_t timeout) { // - A bit length >80.2us is a 1 // - A bit length <80.2us is a 0 // - A bit length >148.6us is a code violation -static inline int8_t rx_bit() { +static inline int8_t rx_bit(void) { // backup ts for threshold calculation uint32_t bit_start = last_frame_end; @@ -187,7 +187,7 @@ static void tx_frame(uint32_t frame, uint8_t len) { LogTrace(cmdbytes, sizeof(cmdbytes), last_frame_start, last_frame_end, NULL, false); } -static void tx_ack() { +static void tx_ack(void) { // wait for ack timeslot last_frame_end += TAG_ACK_WAIT; legic_prng_forward(TAG_ACK_WAIT / TAG_BIT_PERIOD - 1); @@ -308,7 +308,7 @@ static int32_t init_card(uint8_t cardtype, legic_card_select_t *p_card) { return 0; } -static void init_tag() { +static void init_tag(void) { // configure FPGA FpgaDownloadAndGo(FPGA_BITSTREAM_HF); FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_SIMULATOR diff --git a/armsrc/lfadc.c b/armsrc/lfadc.c index 0a85312bc..461a74783 100644 --- a/armsrc/lfadc.c +++ b/armsrc/lfadc.c @@ -65,7 +65,7 @@ void lf_sample_mean(void) { Dbprintf("LF ADC average %u", adc_avg); } -size_t lf_count_edge_periods_ex(size_t max, bool wait, bool detect_gap) { +static size_t lf_count_edge_periods_ex(size_t max, bool wait, bool detect_gap) { size_t periods = 0; volatile uint8_t adc_val; uint8_t avg_peak = adc_avg + 3, avg_through = adc_avg - 3; @@ -132,7 +132,7 @@ size_t lf_detect_gap(size_t max) { return lf_count_edge_periods_ex(max, false, true); } -void lf_reset_counter() { +void lf_reset_counter(void) { // TODO: find out the correct reset settings for tag and reader mode // if (reader_mode) { @@ -147,11 +147,11 @@ void lf_reset_counter() { // } } -bool lf_get_tag_modulation() { +bool lf_get_tag_modulation(void) { return (rising_edge == false); } -bool lf_get_reader_modulation() { +bool lf_get_reader_modulation(void) { return rising_edge; } @@ -228,7 +228,7 @@ void lf_init(bool reader, bool simulate) { lf_sample_mean(); } -void lf_finalize() { +void lf_finalize(void) { // Disable timers AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS; AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKDIS; diff --git a/armsrc/lfadc.h b/armsrc/lfadc.h index 09e5762c6..2238e2eb5 100644 --- a/armsrc/lfadc.h +++ b/armsrc/lfadc.h @@ -21,15 +21,15 @@ void lf_sample_mean(void); bool lf_test_periods(size_t expected, size_t count); size_t lf_count_edge_periods(size_t max); size_t lf_detect_gap(size_t max); -void lf_reset_counter(); +void lf_reset_counter(void); -bool lf_get_tag_modulation(); -bool lf_get_reader_modulation(); +bool lf_get_tag_modulation(void); +bool lf_get_reader_modulation(void); void lf_wait_periods(size_t periods); //void lf_init(bool reader); void lf_init(bool reader, bool simulate); -void lf_finalize(); +void lf_finalize(void); size_t lf_detect_field_drop(size_t max); bool lf_manchester_send_bytes(const uint8_t *frame, size_t frame_len); void lf_modulation(bool modulation); diff --git a/armsrc/lfops.c b/armsrc/lfops.c index 712760636..e89e594d8 100644 --- a/armsrc/lfops.c +++ b/armsrc/lfops.c @@ -622,7 +622,7 @@ void ReadTItag(void) { StopTicks(); } -void WriteTIbyte(uint8_t b) { +static void WriteTIbyte(uint8_t b) { int i = 0; // modulate 8 bits out to the antenna @@ -1574,7 +1574,7 @@ void TurnReadLFOn(uint32_t delay) { //int adcval = ((MAX_ADC_LF_VOLTAGE * AvgAdc(ADC_CHAN_LF)) >> 10); WaitUS(delay); } -void TurnReadLF_off(uint32_t delay) { +static void TurnReadLF_off(uint32_t delay) { FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); WaitUS(delay); } @@ -1586,7 +1586,7 @@ void TurnReadLF_off(uint32_t delay) { #define T55_LLR_REF (136 * 8) // Write one bit to chip -void T55xxWriteBit(uint8_t bit, uint8_t downlink_idx) { +static void T55xxWriteBit(uint8_t bit, uint8_t downlink_idx) { switch (bit) { case 0 : @@ -1622,7 +1622,7 @@ void T55xxWriteBit(uint8_t bit, uint8_t downlink_idx) { // num_bits - how many bits (low x bits of data) Max 32 bits at a time // max_len - how many bytes can the bit_array hold (ensure no buffer overflow) // returns "Next" bit offset / bits stored (for next store) -uint8_t T55xx_SetBits(uint8_t *bs, uint8_t start_offset, uint32_t data, uint8_t num_bits, uint8_t max_len) { +static uint8_t T55xx_SetBits(uint8_t *bs, uint8_t start_offset, uint32_t data, uint8_t num_bits, uint8_t max_len) { int8_t next_offset = start_offset; // Check if data will fit. @@ -1646,7 +1646,7 @@ uint8_t T55xx_SetBits(uint8_t *bs, uint8_t start_offset, uint32_t data, uint8_t } // Send one downlink command to the card -void T55xx_SendCMD(uint32_t data, uint32_t pwd, uint16_t arg) { +static void T55xx_SendCMD(uint32_t data, uint32_t pwd, uint16_t arg) { /* arg bits @@ -2108,7 +2108,7 @@ void T55xxWakeUp(uint32_t pwd, uint8_t flags) { /*-------------- Cloning routines -----------*/ -void WriteT55xx(uint32_t *blockdata, uint8_t startblock, uint8_t numblocks) { +static void WriteT55xx(uint32_t *blockdata, uint8_t startblock, uint8_t numblocks) { t55xx_write_block_t cmd; cmd.pwd = 0; @@ -2300,7 +2300,7 @@ uint8_t *fwd_write_ptr; //forwardlink bit pointer // These timings work for 4469/4269/4305 (with the 55*8 above) // WRITE_0 = 23*8 , 9*8 -uint8_t Prepare_Cmd(uint8_t cmd) { +static uint8_t Prepare_Cmd(uint8_t cmd) { *forward_ptr++ = 0; //start bit *forward_ptr++ = 0; //second pause for 4050 code @@ -2320,7 +2320,7 @@ uint8_t Prepare_Cmd(uint8_t cmd) { // prepares address bits // see EM4469 spec //==================================================================== -uint8_t Prepare_Addr(uint8_t addr) { +static uint8_t Prepare_Addr(uint8_t addr) { register uint8_t line_parity; @@ -2341,7 +2341,7 @@ uint8_t Prepare_Addr(uint8_t addr) { // prepares data bits intreleaved with parity bits // see EM4469 spec //==================================================================== -uint8_t Prepare_Data(uint16_t data_low, uint16_t data_hi) { +static uint8_t Prepare_Data(uint16_t data_low, uint16_t data_hi) { register uint8_t column_parity; register uint8_t i, j; @@ -2377,7 +2377,7 @@ uint8_t Prepare_Data(uint16_t data_low, uint16_t data_hi) { // Requires: forwarLink_data filled with valid bits (1 bit per byte) // fwd_bit_count set with number of bits to be sent //==================================================================== -void SendForward(uint8_t fwd_bit_count) { +static void SendForward(uint8_t fwd_bit_count) { // iceman, 21.3us increments for the USclock verification. // 55FC * 8us == 440us / 21.3 === 20.65 steps. could be too short. Go for 56FC instead @@ -2411,7 +2411,7 @@ void SendForward(uint8_t fwd_bit_count) { } } -void EM4xLogin(uint32_t pwd) { +static void EM4xLogin(uint32_t pwd) { uint8_t len; forward_ptr = forwardLink_data; len = Prepare_Cmd(FWD_CMD_LOGIN); diff --git a/armsrc/lfsampling.c b/armsrc/lfsampling.c index 9f875cd92..cddf9cbbc 100644 --- a/armsrc/lfsampling.c +++ b/armsrc/lfsampling.c @@ -29,7 +29,7 @@ Default LF config is set to: */ sample_config config = { 1, 8, 1, LF_DIVISOR_125, 0, 0, 1} ; -void printConfig() { +void printConfig(void) { uint32_t d = config.divisor; DbpString(_BLUE_("LF Sampling config")); Dbprintf(" [q] divisor.............%d ( "_GREEN_("%d.%02d kHz")")", d, 12000 / (d + 1), ((1200000 + (d + 1) / 2) / (d + 1)) - ((12000 / (d + 1)) * 100)); @@ -90,7 +90,7 @@ sample_config *getSamplingConfig(void) { * @param stream * @param bit */ -void pushBit(BitstreamOut *stream, uint8_t bit) { +static void pushBit(BitstreamOut *stream, uint8_t bit) { int bytepos = stream->position >> 3; // divide by 8 int bitpos = stream->position & 7; *(stream->buffer + bytepos) &= ~(1 << (7 - bitpos)); @@ -143,7 +143,7 @@ void initSampleBufferEx(uint32_t *sample_size, bool use_malloc) { samples.total_saved = 0; } -uint32_t getSampleCounter() { +uint32_t getSampleCounter(void) { return samples.total_saved; } @@ -346,7 +346,7 @@ uint32_t DoPartialAcquisition(int trigger_threshold, bool verbose, uint32_t samp return DoAcquisition(1, 8, 0, trigger_threshold, verbose, sample_size, cancel_after, 0); } -uint32_t ReadLF(bool reader_field, bool verbose, uint32_t sample_size) { +static uint32_t ReadLF(bool reader_field, bool verbose, uint32_t sample_size) { if (verbose) printConfig(); @@ -368,7 +368,7 @@ uint32_t SampleLF(bool verbose, uint32_t sample_size) { * Initializes the FPGA for sniffer-mode (field off), and acquires the samples. * @return number of bits sampled **/ -uint32_t SniffLF() { +uint32_t SniffLF(void) { BigBuf_Clear_ext(false); return ReadLF(false, true, 0); } @@ -526,7 +526,7 @@ void doCotagAcquisition(size_t sample_size) { computeSignalProperties(dest, bufsize); } -uint32_t doCotagAcquisitionManchester() { +uint32_t doCotagAcquisitionManchester(void) { uint8_t *dest = BigBuf_get_addr(); uint16_t bufsize = BigBuf_max_traceLen(); diff --git a/armsrc/lfsampling.h b/armsrc/lfsampling.h index bad90d62c..44910316d 100644 --- a/armsrc/lfsampling.h +++ b/armsrc/lfsampling.h @@ -40,7 +40,7 @@ uint32_t SampleLF(bool verbose, uint32_t sample_size); * Initializes the FPGA for sniff-mode (field off), and acquires the samples. * @return number of bits sampled **/ -uint32_t SniffLF(); +uint32_t SniffLF(void); uint32_t DoAcquisition(uint8_t decimation, uint8_t bits_per_sample, bool avg, int16_t trigger_threshold, bool verbose, uint32_t sample_size, uint32_t cancel_after, int32_t samples_to_skip); @@ -73,7 +73,7 @@ void initSampleBuffer(uint32_t *sample_size); void initSampleBufferEx(uint32_t *sample_size, bool use_malloc); void logSampleSimple(uint8_t sample); void logSample(uint8_t sample, uint8_t decimation, uint8_t bits_per_sample, bool avg); -uint32_t getSampleCounter(); +uint32_t getSampleCounter(void); /** * Setup the FPGA to listen for samples. This method downloads the FPGA bitstream @@ -97,8 +97,8 @@ void LFSetupFPGAForADC(int divisor, bool reader_field); */ void setSamplingConfig(sample_config *sc); -sample_config *getSamplingConfig(); +sample_config *getSamplingConfig(void); -void printConfig(); +void printConfig(void); #endif // __LFSAMPLING_H diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index 0266af633..55dee2019 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -44,7 +44,7 @@ // send an incomplete dummy response in order to trigger the card's authentication failure timeout #ifndef CHK_TIMEOUT -# define CHK_TIMEOUT() { \ +# define CHK_TIMEOUT(void) { \ ReaderTransmit(&dummy_answer, 1, NULL); \ uint32_t timeout = GetCountSspClk() + HARDNESTED_AUTHENTICATION_TIMEOUT; \ while (GetCountSspClk() < timeout) {}; \ @@ -627,7 +627,7 @@ void MifareUSetPwd(uint8_t arg0, uint8_t *datain) { } // Return 1 if the nonce is invalid else return 0 -int valid_nonce(uint32_t Nt, uint32_t NtEnc, uint32_t Ks1, uint8_t *parity) { +static int valid_nonce(uint32_t Nt, uint32_t NtEnc, uint32_t Ks1, uint8_t *parity) { return ((oddparity8((Nt >> 24) & 0xFF) == ((parity[0]) ^ oddparity8((NtEnc >> 24) & 0xFF) ^ BIT(Ks1, 16))) & \ (oddparity8((Nt >> 16) & 0xFF) == ((parity[1]) ^ oddparity8((NtEnc >> 16) & 0xFF) ^ BIT(Ks1, 8))) & \ (oddparity8((Nt >> 8) & 0xFF) == ((parity[2]) ^ oddparity8((NtEnc >> 8) & 0xFF) ^ BIT(Ks1, 0)))) ? 1 : 0; @@ -1229,7 +1229,7 @@ typedef struct chk_t { // 2 = failed to select. // 1 = wrong key // 0 = correct key -uint8_t chkKey(struct chk_t *c) { +static uint8_t chkKey(struct chk_t *c) { uint8_t i = 0, res = 2; while (i < 5) { // this part is from Piwi's faster nonce collecting part in Hardnested. @@ -1250,7 +1250,7 @@ uint8_t chkKey(struct chk_t *c) { return res; } -uint8_t chkKey_readb(struct chk_t *c, uint8_t *keyb) { +static uint8_t chkKey_readb(struct chk_t *c, uint8_t *keyb) { if (!iso14443a_fast_select_card(c->uid, c->cl)) return 2; @@ -1275,7 +1275,7 @@ uint8_t chkKey_readb(struct chk_t *c, uint8_t *keyb) { return res; } -void chkKey_scanA(struct chk_t *c, struct sector_t *k_sector, uint8_t *found, uint8_t *sectorcnt, uint8_t *foundkeys) { +static void chkKey_scanA(struct chk_t *c, struct sector_t *k_sector, uint8_t *found, uint8_t *sectorcnt, uint8_t *foundkeys) { for (uint8_t s = 0; s < *sectorcnt; s++) { // skip already found A keys @@ -1293,7 +1293,7 @@ void chkKey_scanA(struct chk_t *c, struct sector_t *k_sector, uint8_t *found, ui } } -void chkKey_scanB(struct chk_t *c, struct sector_t *k_sector, uint8_t *found, uint8_t *sectorcnt, uint8_t *foundkeys) { +static void chkKey_scanB(struct chk_t *c, struct sector_t *k_sector, uint8_t *found, uint8_t *sectorcnt, uint8_t *foundkeys) { for (uint8_t s = 0; s < *sectorcnt; s++) { // skip already found B keys @@ -1313,7 +1313,7 @@ void chkKey_scanB(struct chk_t *c, struct sector_t *k_sector, uint8_t *found, ui // loop all A keys, // when A is found but not B, try to read B. -void chkKey_loopBonly(struct chk_t *c, struct sector_t *k_sector, uint8_t *found, uint8_t *sectorcnt, uint8_t *foundkeys) { +static void chkKey_loopBonly(struct chk_t *c, struct sector_t *k_sector, uint8_t *found, uint8_t *sectorcnt, uint8_t *foundkeys) { // read Block B, if A is found. for (uint8_t s = 0; s < *sectorcnt; ++s) { @@ -2190,7 +2190,7 @@ void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain) { OnSuccessMagic(); } -void MifareCIdent() { +void MifareCIdent(void) { // variables uint8_t isGen = 0; uint8_t rec[1] = {0x00}; @@ -2248,7 +2248,7 @@ OUT: BigBuf_free(); } -void MifareHasStaticNonce() { +void MifareHasStaticNonce(void) { // variables int retval = PM3_SUCCESS, len; @@ -2297,7 +2297,7 @@ OUT: crypto1_deinit(pcs); } -void OnSuccessMagic() { +void OnSuccessMagic(void) { FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); LEDsoff(); set_tracing(false); diff --git a/armsrc/mifarecmd.h b/armsrc/mifarecmd.h index df25521f9..2d9a4799a 100644 --- a/armsrc/mifarecmd.h +++ b/armsrc/mifarecmd.h @@ -41,14 +41,14 @@ int MifareECardLoadExt(uint8_t sectorcnt, uint8_t keytype); void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain); // Work with "magic Chinese" card void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain); -void MifareCIdent(); // is "magic chinese" card? -void MifareHasStaticNonce(); // Has the tag a static nonce? +void MifareCIdent(void); // is "magic chinese" card? +void MifareHasStaticNonce(void); // Has the tag a static nonce? void MifareSetMod(uint8_t *datain); void MifarePersonalizeUID(uint8_t keyType, uint8_t perso_option, uint64_t key); void MifareUSetPwd(uint8_t arg0, uint8_t *datain); -void OnSuccessMagic(); +void OnSuccessMagic(void); void OnErrorMagic(uint8_t reason); int32_t dist_nt(uint32_t nt1, uint32_t nt2); diff --git a/armsrc/mifaredesfire.c b/armsrc/mifaredesfire.c index ff5babda0..57235ba22 100644 --- a/armsrc/mifaredesfire.c +++ b/armsrc/mifaredesfire.c @@ -36,7 +36,7 @@ static uint8_t deselect_cmd[] = {0xc2, 0xe0, 0xb4}; struct desfire_key skey = {0}; static desfirekey_t sessionkey = &skey; -bool InitDesfireCard() { +bool InitDesfireCard(void) { pcb_blocknum = 0; @@ -107,7 +107,7 @@ void MifareSendCommand(uint8_t *datain) { LED_B_OFF(); } -void MifareDesfireGetInformation() { +void MifareDesfireGetInformation(void) { LEDsoff(); @@ -683,7 +683,7 @@ size_t CreateAPDU(uint8_t *datain, size_t len, uint8_t *dataout) { // crc_update(&desfire_crc32, byte, 8); // uint32_t crc = crc_finish(&desfire_crc32); -void OnSuccess() { +void OnSuccess(void) { pcb_blocknum = 0; ReaderTransmit(deselect_cmd, 3, NULL); if (mifare_ultra_halt()) { diff --git a/armsrc/mifaredesfire.h b/armsrc/mifaredesfire.h index 1e19ec49f..b34e436f1 100644 --- a/armsrc/mifaredesfire.h +++ b/armsrc/mifaredesfire.h @@ -13,14 +13,14 @@ #include "common.h" -bool InitDesfireCard(); +bool InitDesfireCard(void); void MifareSendCommand(uint8_t *datain); -void MifareDesfireGetInformation(); +void MifareDesfireGetInformation(void); void MifareDES_Auth1(uint8_t *datain); void ReaderMifareDES(uint32_t param, uint32_t param2, uint8_t *datain); int DesfireAPDU(uint8_t *cmd, size_t cmd_len, uint8_t *dataout); size_t CreateAPDU(uint8_t *datain, size_t len, uint8_t *dataout); -void OnSuccess(); +void OnSuccess(void); void OnError(uint8_t reason); void OnErrorNG(uint16_t cmd, uint8_t reason); diff --git a/armsrc/mifaresniff_disabled.c b/armsrc/mifaresniff_disabled.c index 6ccdc8e6c..76d25d228 100644 --- a/armsrc/mifaresniff_disabled.c +++ b/armsrc/mifaresniff_disabled.c @@ -308,7 +308,7 @@ bool RAMFUNC MfSniffLogic(const uint8_t *data, uint16_t len, uint8_t *parity, ui } */ -void RAMFUNC MfSniffSend() { +void RAMFUNC MfSniffSend(void) { uint16_t tracelen = BigBuf_get_traceLen(); int packlen = tracelen; // total number of bytes to send uint8_t *data = BigBuf_get_addr(); diff --git a/armsrc/mifareutil.c b/armsrc/mifareutil.c index 893db4763..71c57a963 100644 --- a/armsrc/mifareutil.c +++ b/armsrc/mifareutil.c @@ -355,7 +355,7 @@ int mifare_ultra_auth(uint8_t *keybytes) { return 1; } -int mifare_ultra_readblockEx(uint8_t blockNo, uint8_t *blockData) { +static int mifare_ultra_readblockEx(uint8_t blockNo, uint8_t *blockData) { uint16_t len = 0; uint8_t bt[2] = {0x00, 0x00}; uint8_t receivedAnswer[MAX_FRAME_SIZE] = {0x00}; @@ -509,7 +509,7 @@ int mifare_classic_halt(struct Crypto1State *pcs, uint32_t uid) { return mifare_classic_halt_ex(pcs); } -int mifare_ultra_halt() { +int mifare_ultra_halt(void) { uint16_t len = 0; uint8_t receivedAnswer[4] = {0x00, 0x00, 0x00, 0x00}; len = mifare_sendcmd_short(NULL, CRYPT_NONE, ISO14443A_CMD_HALT, 0x00, receivedAnswer, NULL, NULL); diff --git a/armsrc/mifareutil.h b/armsrc/mifareutil.h index 64eb04545..b1d6396d5 100644 --- a/armsrc/mifareutil.h +++ b/armsrc/mifareutil.h @@ -75,7 +75,7 @@ int mifare_ultra_auth(uint8_t *keybytes); int mifare_ultra_readblock(uint8_t blockNo, uint8_t *blockData); //int mifare_ultra_writeblock_compat(uint8_t blockNo, uint8_t *blockData); int mifare_ultra_writeblock(uint8_t blockNo, uint8_t *blockData); -int mifare_ultra_halt(); +int mifare_ultra_halt(void); // desfire int mifare_sendcmd_special(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t *data, uint8_t *answer, uint8_t *answer_parity, uint32_t *timing); diff --git a/armsrc/pcf7931.c b/armsrc/pcf7931.c index 21a739f45..6ad44d7c4 100644 --- a/armsrc/pcf7931.c +++ b/armsrc/pcf7931.c @@ -173,7 +173,7 @@ bool IsBlock1PCF7931(uint8_t *block) { return false; } -void ReadPCF7931() { +void ReadPCF7931(void) { int found_blocks = 0; // successfully read blocks int max_blocks = 8; // readable blocks uint8_t memory_blocks[8][17]; // PCF content diff --git a/armsrc/pcf7931.h b/armsrc/pcf7931.h index 67a11f5f8..b9ad40a92 100644 --- a/armsrc/pcf7931.h +++ b/armsrc/pcf7931.h @@ -6,7 +6,7 @@ size_t DemodPCF7931(uint8_t **outBlocks); bool IsBlock0PCF7931(uint8_t *block); bool IsBlock1PCF7931(uint8_t *block); -void ReadPCF7931(); +void ReadPCF7931(void); void SendCmdPCF7931(uint32_t *tab); bool AddBytePCF7931(uint8_t byte, uint32_t *tab, int32_t l, int32_t p); bool AddBitPCF7931(bool b, uint32_t *tab, int32_t l, int32_t p); diff --git a/armsrc/spiffs.c b/armsrc/spiffs.c index 3db0e3c27..0ade78239 100644 --- a/armsrc/spiffs.c +++ b/armsrc/spiffs.c @@ -108,7 +108,7 @@ static enum spiffs_mount_status { RDV40_SPIFFS_UNKNOWN } RDV40_SPIFFS_MOUNT_STATUS; -int rdv40_spiffs_mounted() { +static int rdv40_spiffs_mounted(void) { int ret = 0; switch (RDV40_SPIFFS_MOUNT_STATUS) { @@ -124,7 +124,7 @@ int rdv40_spiffs_mounted() { return ret; } -int rdv40_spiffs_mount() { +int rdv40_spiffs_mount(void) { if (rdv40_spiffs_mounted()) { Dbprintf("ERR: SPIFFS already mounted !"); return SPIFFS_ERR_MOUNTED; @@ -146,7 +146,7 @@ int rdv40_spiffs_mount() { return ret; } -int rdv40_spiffs_unmount() { +int rdv40_spiffs_unmount(void) { if (!rdv40_spiffs_mounted()) { Dbprintf("ERR: SPIFFS not mounted !"); return SPIFFS_ERR_NOT_MOUNTED; @@ -162,7 +162,7 @@ int rdv40_spiffs_unmount() { return ret; } -int rdv40_spiffs_check() { +int rdv40_spiffs_check(void) { rdv40_spiffs_lazy_mount(); SPIFFS_check(&fs); SPIFFS_gc_quick(&fs, 0); @@ -195,17 +195,17 @@ void read_from_spiffs(const char *filename, uint8_t *dst, uint32_t size) { SPIFFS_close(&fs, fd); } -void rename_in_spiffs(const char *old_filename, const char *new_filename) { +static void rename_in_spiffs(const char *old_filename, const char *new_filename) { if (SPIFFS_rename(&fs, old_filename, new_filename) < 0) Dbprintf("errno %i\n", SPIFFS_errno(&fs)); } -void remove_from_spiffs(const char *filename) { +static void remove_from_spiffs(const char *filename) { if (SPIFFS_remove(&fs, filename) < 0) Dbprintf("errno %i\n", SPIFFS_errno(&fs)); } -spiffs_stat stat_in_spiffs(const char *filename) { +static spiffs_stat stat_in_spiffs(const char *filename) { spiffs_stat s; if (SPIFFS_stat(&fs, filename, &s) < 0) Dbprintf("errno %i\n", SPIFFS_errno(&fs)); @@ -217,7 +217,7 @@ uint32_t size_in_spiffs(const char *filename) { return s.size; } -rdv40_spiffs_fsinfo info_of_spiffs() { +static rdv40_spiffs_fsinfo info_of_spiffs(void) { rdv40_spiffs_fsinfo fsinfo; fsinfo.blockSize = SPIFFS_CFG_LOG_BLOCK_SZ; fsinfo.pageSize = LOG_PAGE_SIZE; @@ -238,7 +238,7 @@ int exists_in_spiffs(const char *filename) { return rc == SPIFFS_OK; } -RDV40SpiFFSFileType filetype_in_spiffs(const char *filename) { +static RDV40SpiFFSFileType filetype_in_spiffs(const char *filename) { RDV40SpiFFSFileType filetype = RDV40_SPIFFS_FILETYPE_UNKNOWN; char symlinked[SPIFFS_OBJ_NAME_LEN]; sprintf(symlinked, "%s.lnk", filename); @@ -270,16 +270,16 @@ RDV40SpiFFSFileType filetype_in_spiffs(const char *filename) { } return filetype; } - -int is_valid_filename(const char *filename) { +/* +static int is_valid_filename(const char *filename) { if (filename == NULL) { return false; } uint32_t len = strlen(filename); return len > 0 && len < SPIFFS_OBJ_NAME_LEN; } - -void copy_in_spiffs(const char *src, const char *dst) { +*/ +static void copy_in_spiffs(const char *src, const char *dst) { uint32_t size = size_in_spiffs((char *)src); uint8_t *mem = BigBuf_malloc(size); read_from_spiffs((char *)src, (uint8_t *)mem, size); @@ -297,7 +297,7 @@ void copy_in_spiffs(const char *src, const char *dst) { // 1 if the mount status actually changed // so you know what to do IN CASE you wished to set things "back to previous // state" -int rdv40_spiffs_lazy_mount() { +int rdv40_spiffs_lazy_mount(void) { int changed = 0; if (!rdv40_spiffs_mounted()) { changed = rdv40_spiffs_mount(); @@ -309,7 +309,7 @@ int rdv40_spiffs_lazy_mount() { } // unmount if not already -int rdv40_spiffs_lazy_unmount() { +int rdv40_spiffs_lazy_unmount(void) { int changed = 0; if (rdv40_spiffs_mounted()) { changed = rdv40_spiffs_unmount(); @@ -362,7 +362,7 @@ void my_lazy_spiffs_act(){ // this lazy_mount since needed and can also report back the change on state implied by eventual mount, if needed rdv40_spiffs_lazy_read((const char *)".SHOULDRESET",(uint8_t *)resetret,4); if( resetret == "YESS" ) { uint8_t -changed = rdv40_spiffs_lazy_format(); // this will imply change only if we where +changed = rdv40_spiffs_lazy_format(void); // this will imply change only if we where already mounted beforehand, was the case after our reading without further rollback rdv40_spiffs_lazy_mount_rollback(changed); // so if we were mounted just get back to this state. If not, just don't. @@ -444,7 +444,7 @@ int rdv40_spiffs_stat(char *filename, uint32_t *buf, RDV40SpiFFSSafetyLevel leve ) } -int rdv40_spiffs_getfsinfo(rdv40_spiffs_fsinfo *fsinfo, RDV40SpiFFSSafetyLevel level) { +static int rdv40_spiffs_getfsinfo(rdv40_spiffs_fsinfo *fsinfo, RDV40SpiFFSSafetyLevel level) { RDV40_SPIFFS_SAFE_FUNCTION( // *fsinfo = info_of_spiffs(); // ) @@ -538,7 +538,7 @@ int rdv40_spiffs_read_as_filetype(char *filename, uint8_t *dst, uint32_t size, R ///////// MISC HIGH LEVEL FUNCTIONS //////////////////////////////////////////// #define SPIFFS_BANNER DbpString(_BLUE_("Flash Memory FileSystem tree (SPIFFS)")); -void rdv40_spiffs_safe_print_fsinfo() { +void rdv40_spiffs_safe_print_fsinfo(void) { rdv40_spiffs_fsinfo fsinfo; rdv40_spiffs_getfsinfo(&fsinfo, RDV40_SPIFFS_SAFETY_SAFE); @@ -603,7 +603,7 @@ void rdv40_spiffs_safe_print_tree(uint8_t banner) { // Selftest function -void test_spiffs() { +void test_spiffs(void) { Dbprintf("----------------------------------------------"); Dbprintf("Testing SPIFFS operations"); Dbprintf("----------------------------------------------"); diff --git a/armsrc/spiffs.h b/armsrc/spiffs.h index f10c86db0..b3578f599 100644 --- a/armsrc/spiffs.h +++ b/armsrc/spiffs.h @@ -33,9 +33,9 @@ typedef struct rdv40_spiffs_fsinfo { int rdv40_spiffs_read_as_filetype(char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level); -int rdv40_spiffs_check(); -int rdv40_spiffs_lazy_unmount(); -int rdv40_spiffs_lazy_mount(); +int rdv40_spiffs_check(void); +int rdv40_spiffs_lazy_unmount(void); +int rdv40_spiffs_lazy_mount(void); int rdv40_spiffs_lazy_mount_rollback(int changed); int rdv40_spiffs_write(char *filename, uint8_t *src, uint32_t size, RDV40SpiFFSSafetyLevel level); int rdv40_spiffs_read(char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level); @@ -44,12 +44,12 @@ int rdv40_spiffs_remove(char *filename, RDV40SpiFFSSafetyLevel level); int rdv40_spiffs_read_as_symlink(char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level); void write_to_spiffs(const char *filename, uint8_t *src, uint32_t size); void read_from_spiffs(const char *filename, uint8_t *dst, uint32_t size); -void test_spiffs(); +void test_spiffs(void); void rdv40_spiffs_safe_print_tree(uint8_t banner); -int rdv40_spiffs_unmount(); -int rdv40_spiffs_mount(); +int rdv40_spiffs_unmount(void); +int rdv40_spiffs_mount(void); int rdv40_spiffs_is_symlink(const char *s); -void rdv40_spiffs_safe_print_fsinfo(); +void rdv40_spiffs_safe_print_fsinfo(void); int rdv40_spiffs_make_symlink(char *linkdest, char *filename, RDV40SpiFFSSafetyLevel level); void append_to_spiffs(const char *filename, uint8_t *src, uint32_t size); int rdv40_spiffs_copy(char *src, char *dst, RDV40SpiFFSSafetyLevel level); diff --git a/armsrc/start.c b/armsrc/start.c index 3e6f34702..f0f4ea56c 100644 --- a/armsrc/start.c +++ b/armsrc/start.c @@ -59,7 +59,8 @@ static void uncompress_data_section(void) { common_area.arg1 = data_section.total_in; } -void __attribute__((section(".startos"))) Vector(void) { +void __attribute__((section(".startos"))) Vector(void); +void Vector(void) { /* Stack should have been set up by the bootloader */ // char *src; char *dst, *end; diff --git a/armsrc/string.c b/armsrc/string.c index 8dbe26808..95b53b6ec 100644 --- a/armsrc/string.c +++ b/armsrc/string.c @@ -247,7 +247,7 @@ int strncmp(const char *s1, const char *s2, size_t n) { #define isspace(a) __extension__ ({ unsigned char bb__isspace = (a) - 9; bb__isspace == (' ' - 9) || bb__isspace <= (13 - 9); }) - +/* unsigned long strtoul(const char *p, char **out_p, int base) { unsigned long v = 0; @@ -319,6 +319,7 @@ long strtol(const char *p, char **out_p, int base) { if (out_p) *out_p = (char *)p; return v; } +*/ char c_tolower(int c) { // (int)a = 97, (int)A = 65 diff --git a/armsrc/thinfilm.c b/armsrc/thinfilm.c index e4b2e9b23..d84c2711a 100644 --- a/armsrc/thinfilm.c +++ b/armsrc/thinfilm.c @@ -51,7 +51,7 @@ void ReadThinFilm(void) { #define SEC_F 0x00 uint16_t FpgaSendQueueDelay; -uint16_t ReadReaderField(void) { +static uint16_t ReadReaderField(void) { #if defined RDV4 return AvgAdc(ADC_CHAN_HF_RDV40); #else @@ -71,7 +71,7 @@ static void CodeThinfilmAsTag(const uint8_t *cmd, uint16_t len) { ToSendMax++; } -int EmSendCmdThinfilmRaw(uint8_t *resp, uint16_t respLen) { +static int EmSendCmdThinfilmRaw(uint8_t *resp, uint16_t respLen) { volatile uint8_t b; uint16_t i = 0; uint32_t ThisTransferTime; diff --git a/armsrc/ticks.h b/armsrc/ticks.h index b39ec52bd..9d8d178d5 100644 --- a/armsrc/ticks.h +++ b/armsrc/ticks.h @@ -30,10 +30,10 @@ uint32_t RAMFUNC GetCountUS(void); void ResetUSClock(void); void SpinDelayCountUs(uint32_t us); -void StartCountSspClk(); +void StartCountSspClk(void); void ResetSspClk(void); -uint32_t RAMFUNC GetCountSspClk(); -uint32_t RAMFUNC GetCountSspClkDelta(); +uint32_t RAMFUNC GetCountSspClk(void); +uint32_t RAMFUNC GetCountSspClkDelta(uint32_t start); void StartTicks(void); uint32_t GetTicks(void); diff --git a/armsrc/util.c b/armsrc/util.c index d1a4fb938..ccff567eb 100644 --- a/armsrc/util.c +++ b/armsrc/util.c @@ -83,7 +83,7 @@ uint8_t hex2int(char hexchar) { } } -void LEDsoff() { +void LEDsoff(void) { LED_A_OFF(); LED_B_OFF(); LED_C_OFF(); From 5f1ff72f7cb1008847b458a1b02139057a7669ac Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 10 May 2020 17:28:55 +0200 Subject: [PATCH 150/632] arm: fix warnings discarded-qualifiers --- armsrc/dbprint.c | 6 +++--- armsrc/dbprint.h | 6 +++--- armsrc/lfops.c | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/armsrc/dbprint.c b/armsrc/dbprint.c index 9b18b7aca..bfeb0ded2 100644 --- a/armsrc/dbprint.c +++ b/armsrc/dbprint.c @@ -22,7 +22,7 @@ // Debug print functions, to go out over USB, to the usual PC-side client. //============================================================================= -void DbpStringEx(uint32_t flags, char *src, size_t srclen) { +void DbpStringEx(uint32_t flags, const char *src, size_t srclen) { #if DEBUG struct { uint16_t flag; @@ -35,7 +35,7 @@ void DbpStringEx(uint32_t flags, char *src, size_t srclen) { #endif } -void DbpString(char *str) { +void DbpString(const char *str) { #if DEBUG DbpStringEx(FLAG_LOG, str, strlen(str)); #endif @@ -98,7 +98,7 @@ void Dbhexdump(int len, uint8_t *d, bool bAsci) { #endif } -void print_result(char *name, uint8_t *buf, size_t len) { +void print_result(const char *name, uint8_t *buf, size_t len) { uint8_t *p = buf; uint16_t tmp = len & 0xFFF0; diff --git a/armsrc/dbprint.h b/armsrc/dbprint.h index c3229f46f..2a8444ef3 100644 --- a/armsrc/dbprint.h +++ b/armsrc/dbprint.h @@ -42,12 +42,12 @@ reply_via_usb = tmpusb;} -void DbpString(char *str); -void DbpStringEx(uint32_t flags, char *src, size_t srclen); +void DbpString(const char *str); +void DbpStringEx(uint32_t flags, const char *src, size_t srclen); void Dbprintf(const char *fmt, ...); void DbprintfEx(uint32_t flags, const char *fmt, ...); void Dbhexdump(int len, uint8_t *d, bool bAsci); -void print_result(char *name, uint8_t *buf, size_t len); +void print_result(const char *name, uint8_t *buf, size_t len); //void PrintToSendBuffer(void); #endif diff --git a/armsrc/lfops.c b/armsrc/lfops.c index e89e594d8..5c3e6973b 100644 --- a/armsrc/lfops.c +++ b/armsrc/lfops.c @@ -1535,7 +1535,7 @@ void CmdIOdemodFSK(int findone, uint32_t *high, uint32_t *low, int ledcontrol) { calccrc &= 0xff; calccrc = 0xff - calccrc; - char *crcStr = (crc == calccrc) ? "ok" : "!crc"; + const char *crcStr = (crc == calccrc) ? "ok" : "!crc"; Dbprintf("IO Prox XSF(%02d)%02x:%05d (%08x%08x) [%02x %s]", version, facilitycode, number, code, code2, crc, crcStr); // if we're only looking for one tag From 8160131119ca84a80df936953ad9be0869ed80fe Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 10 May 2020 18:04:50 +0200 Subject: [PATCH 151/632] fix standalone warnings --- armsrc/Standalone/hf_14asniff.c | 2 +- armsrc/Standalone/hf_bog.c | 2 +- armsrc/Standalone/hf_colin.c | 27 ++++++++++++++++----------- armsrc/Standalone/hf_legic.c | 4 ++-- armsrc/Standalone/lf_em4100emul.c | 9 +++++---- armsrc/Standalone/lf_em4100rwc.c | 15 ++++++++------- armsrc/Standalone/lf_icehid.c | 12 ++++++------ armsrc/spiffs.c | 6 +++--- armsrc/spiffs.h | 6 +++--- armsrc/string.c | 3 +-- armsrc/string.h | 2 ++ 11 files changed, 48 insertions(+), 40 deletions(-) diff --git a/armsrc/Standalone/hf_14asniff.c b/armsrc/Standalone/hf_14asniff.c index 3cbaa05f6..c52928825 100644 --- a/armsrc/Standalone/hf_14asniff.c +++ b/armsrc/Standalone/hf_14asniff.c @@ -68,7 +68,7 @@ #define HF_14ASNIFF_LOGFILE "hf_14asniff.trc" -void DownloadTraceInstructions(void) { +static void DownloadTraceInstructions(void) { Dbprintf(""); Dbprintf("To get the trace from flash and display it:"); Dbprintf("1. mem spiffs dump o "HF_14ASNIFF_LOGFILE" f trace.trc"); diff --git a/armsrc/Standalone/hf_bog.c b/armsrc/Standalone/hf_bog.c index c34f0e20a..50e1d824f 100644 --- a/armsrc/Standalone/hf_bog.c +++ b/armsrc/Standalone/hf_bog.c @@ -41,7 +41,7 @@ from the client to view the stored quadlets. #define HF_BOG_LOGFILE "hf_bog.log" // This is actually copied from SniffIso14443a -void RAMFUNC SniffAndStore(uint8_t param) { +static void RAMFUNC SniffAndStore(uint8_t param) { iso14443a_setup(FPGA_HF_ISO14443A_SNIFFER); diff --git a/armsrc/Standalone/hf_colin.c b/armsrc/Standalone/hf_colin.c index 78b36eb78..b1090a019 100644 --- a/armsrc/Standalone/hf_colin.c +++ b/armsrc/Standalone/hf_colin.c @@ -104,7 +104,12 @@ static const uint8_t is_hex[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +// Note: inlining this function would fail with -Os +#ifdef __OPTIMIZE_SIZE__ +static uint64_t hex2i(const char *s) { +#else static inline uint64_t hex2i(const char *s) { +#endif uint64_t val = 0; if (s == NULL || s[0] == 0) return 0; @@ -198,14 +203,14 @@ MFC1KSchema InfiHexact = {.name = "Infineon/Hexact", int total_schemas = 0; -void add_schema(MFC1KSchema *p, MFC1KSchema a, int *schemas_counter) { +static void add_schema(MFC1KSchema *p, MFC1KSchema a, int *schemas_counter) { if (*schemas_counter < MAX_SCHEMAS) { p[*schemas_counter] = a; *schemas_counter += 1; } } - -void delete_schema(MFC1KSchema *p, int *schemas_counter, int index) { +/* +static void delete_schema(MFC1KSchema *p, int *schemas_counter, int index) { if (*schemas_counter > 0 && index < *schemas_counter && index > -1) { int last_index = *schemas_counter - 1; for (int i = index; i < last_index; i++) { @@ -214,23 +219,23 @@ void delete_schema(MFC1KSchema *p, int *schemas_counter, int index) { *schemas_counter -= 1; } } - -void cjSetCursFRight(void) { +*/ +static void cjSetCursFRight(void) { vtsend_cursor_position(NULL, 98, (currfline)); currfline++; } -void cjSetCursRight(void) { +static void cjSetCursRight(void) { vtsend_cursor_position(NULL, 59, (currline)); currline++; } -void cjSetCursLeft(void) { +static void cjSetCursLeft(void) { vtsend_cursor_position(NULL, 0, (curlline)); curlline++; } -void cjTabulize(void) { DbprintfEx(FLAG_RAWPRINT, "\t\t\t"); } +static void cjTabulize(void) { DbprintfEx(FLAG_RAWPRINT, "\t\t\t"); } /* void cjPrintKey(uint64_t key, uint8_t *foundKey, uint16_t sectorNo, uint8_t type) { @@ -240,7 +245,7 @@ foundKey[5]); cjSetCursRight(); DbprintfEx(FLAG_NEWLINE, "SEC: %02x | KEY : %s | } */ -char *ReadSchemasFromSPIFFS(char *filename) { +static char *ReadSchemasFromSPIFFS(char *filename) { SpinOff(0); int changed = rdv40_spiffs_lazy_mount(); @@ -255,7 +260,7 @@ char *ReadSchemasFromSPIFFS(char *filename) { return (char *)mem; } -void add_schemas_from_json_in_spiffs(char *filename) { +static void add_schemas_from_json_in_spiffs(char *filename) { char *jsonfile = ReadSchemasFromSPIFFS((char *)filename); @@ -275,7 +280,7 @@ void add_schemas_from_json_in_spiffs(char *filename) { } } -void ReadLastTagFromFlash(void) { +static void ReadLastTagFromFlash(void) { SpinOff(0); LED_A_ON(); LED_B_ON(); diff --git a/armsrc/Standalone/hf_legic.c b/armsrc/Standalone/hf_legic.c index d1add7fe3..5bcbfca63 100644 --- a/armsrc/Standalone/hf_legic.c +++ b/armsrc/Standalone/hf_legic.c @@ -44,7 +44,7 @@ * */ -void DownloadLogInstructions(void) { +static void DownloadLogInstructions(void) { Dbprintf(""); Dbprintf("[=] List all dumps from flash:"); Dbprintf("[=] " _YELLOW_("-") " mem spiffs tree"); @@ -53,7 +53,7 @@ void DownloadLogInstructions(void) { Dbprintf("[=] " _YELLOW_("-") " mem spiffs dump o hf-legic-UID-dump.bin f hf-legic-UID-dump.bin"); } -void save_dump_to_file(legic_card_select_t *p_card) { +static void save_dump_to_file(legic_card_select_t *p_card) { #ifdef WITH_FLASH diff --git a/armsrc/Standalone/lf_em4100emul.c b/armsrc/Standalone/lf_em4100emul.c index 166c668f8..6ad2580a4 100644 --- a/armsrc/Standalone/lf_em4100emul.c +++ b/armsrc/Standalone/lf_em4100emul.c @@ -18,6 +18,7 @@ #include "ticks.h" #include "string.h" #include "BigBuf.h" +#include "commonutil.h" #define MAX_IND 16 // 4 LEDs - 2^4 combinations #define CLOCK 64 //for 125kHz @@ -34,7 +35,7 @@ void ModInfo(void) { DbpString(" LF EM4100 simulator standalone mode"); } -uint64_t ReversQuads(uint64_t bits) { +static uint64_t ReversQuads(uint64_t bits) { uint64_t result = 0; for (int i = 0; i < 16; i++) { result += ((bits >> (60 - 4 * i)) & 0xf) << (4 * i); @@ -42,14 +43,14 @@ uint64_t ReversQuads(uint64_t bits) { return result >> 24; } -void FillBuff(uint8_t bit) { +static void FillBuff(uint8_t bit) { memset(bba + buflen, bit, CLOCK / 2); buflen += (CLOCK / 2); memset(bba + buflen, bit ^ 1, CLOCK / 2); buflen += (CLOCK / 2); } -void ConstructEM410xEmulBuf(uint64_t id) { +static void ConstructEM410xEmulBuf(uint64_t id) { int i, j, binary[4], parity[4]; buflen = 0; @@ -70,7 +71,7 @@ void ConstructEM410xEmulBuf(uint64_t id) { FillBuff(0); } -void LED_Slot(int i) { +static void LED_Slot(int i) { LEDsoff(); if (slots_count > 4) { LED(i % MAX_IND, 0); //binary indication for slots_count > 4 diff --git a/armsrc/Standalone/lf_em4100rwc.c b/armsrc/Standalone/lf_em4100rwc.c index 19aa39919..a7364bd81 100644 --- a/armsrc/Standalone/lf_em4100rwc.c +++ b/armsrc/Standalone/lf_em4100rwc.c @@ -27,6 +27,7 @@ #include "string.h" #include "BigBuf.h" #include "spiffs.h" +#include "commonutil.h" #ifdef WITH_FLASH #include "flashmem.h" @@ -47,7 +48,7 @@ void ModInfo(void) { DbpString(" LF EM4100 read/write/clone mode"); } -uint64_t ReversQuads(uint64_t bits) { +static uint64_t ReversQuads(uint64_t bits) { uint64_t result = 0; for (int i = 0; i < 16; i++) { result += ((bits >> (60 - 4 * i)) & 0xf) << (4 * i); @@ -55,14 +56,14 @@ uint64_t ReversQuads(uint64_t bits) { return result >> 24; } -void FillBuff(uint8_t bit) { +static void FillBuff(uint8_t bit) { memset(bba + buflen, bit, CLOCK / 2); buflen += (CLOCK / 2); memset(bba + buflen, bit ^ 1, CLOCK / 2); buflen += (CLOCK / 2); } -void ConstructEM410xEmulBuf(uint64_t id) { +static void ConstructEM410xEmulBuf(uint64_t id) { int i, j, binary[4], parity[4]; buflen = 0; @@ -83,7 +84,7 @@ void ConstructEM410xEmulBuf(uint64_t id) { FillBuff(0); } -void LED_Slot(int i) { +static void LED_Slot(int i) { LEDsoff(); if (slots_count > 4) { LED(i % MAX_IND, 0); //binary indication, usefully for slots_count > 4 @@ -92,7 +93,7 @@ void LED_Slot(int i) { } } -void FlashLEDs(uint32_t speed, uint8_t times) { +static void FlashLEDs(uint32_t speed, uint8_t times) { for (int i = 0; i < times * 2; i++) { LED_A_INV(); LED_B_INV(); @@ -103,9 +104,9 @@ void FlashLEDs(uint32_t speed, uint8_t times) { } #ifdef WITH_FLASH -void SaveIDtoFlash(int addr, uint64_t id) { +static void SaveIDtoFlash(int addr, uint64_t id) { uint8_t bt[5]; - char *filename = "emdump"; + const char *filename = "emdump"; rdv40_spiffs_mount(); for (int i = 0; i < 5; i++) { bt[4 - i] = (uint8_t)(id >> 8 * i & 0xff); diff --git a/armsrc/Standalone/lf_icehid.c b/armsrc/Standalone/lf_icehid.c index 29a87305d..7ac91d126 100644 --- a/armsrc/Standalone/lf_icehid.c +++ b/armsrc/Standalone/lf_icehid.c @@ -54,7 +54,7 @@ #define LF_HIDCOLLECT_LOGFILE "lf_hidcollect.log" -void DownloadLogInstructions(void) { +static void DownloadLogInstructions(void) { Dbprintf(""); Dbprintf("[=] To get the logfile from flash and display it:"); Dbprintf("[=] " _YELLOW_("1.") " mem spiffs dump o "LF_HIDCOLLECT_LOGFILE" f "LF_HIDCOLLECT_LOGFILE); @@ -64,7 +64,7 @@ void DownloadLogInstructions(void) { bool log_exists; -void append(uint8_t *entry, size_t entry_len) { +static void append(uint8_t *entry, size_t entry_len) { LED_B_ON(); if (log_exists == false) { @@ -76,7 +76,7 @@ void append(uint8_t *entry, size_t entry_len) { LED_B_OFF(); } -uint32_t IceEM410xdemod(void) { +static uint32_t IceEM410xdemod(void) { uint8_t *dest = BigBuf_get_addr(); size_t idx = 0; @@ -128,7 +128,7 @@ uint32_t IceEM410xdemod(void) { return PM3_SUCCESS; } -uint32_t IceAWIDdemod(void) { +static uint32_t IceAWIDdemod(void) { uint8_t *dest = BigBuf_get_addr(); size_t size = MIN(12800, BigBuf_max_traceLen()); @@ -180,7 +180,7 @@ uint32_t IceAWIDdemod(void) { return PM3_SUCCESS; } -uint32_t IceIOdemod(void) { +static uint32_t IceIOdemod(void) { int dummyIdx = 0; uint8_t version = 0, facilitycode = 0; @@ -224,7 +224,7 @@ uint32_t IceIOdemod(void) { return PM3_SUCCESS; } -uint32_t IceHIDDemod(void) { +static uint32_t IceHIDDemod(void) { int dummyIdx = 0; diff --git a/armsrc/spiffs.c b/armsrc/spiffs.c index 0ade78239..4267412c5 100644 --- a/armsrc/spiffs.c +++ b/armsrc/spiffs.c @@ -400,20 +400,20 @@ int rdv40_spiffs_lazy_mount_rollback(int changed) { // statement or some function taking function parameters // TODO : forbid writing to a filename which already exists as lnk ! // TODO : forbid writing to a filename.lnk which already exists without lnk ! -int rdv40_spiffs_write(char *filename, uint8_t *src, uint32_t size, RDV40SpiFFSSafetyLevel level) { +int rdv40_spiffs_write(const char *filename, uint8_t *src, uint32_t size, RDV40SpiFFSSafetyLevel level) { RDV40_SPIFFS_SAFE_FUNCTION( write_to_spiffs(filename, src, size); ) } -int rdv40_spiffs_append(char *filename, uint8_t *src, uint32_t size, RDV40SpiFFSSafetyLevel level) { +int rdv40_spiffs_append(const char *filename, uint8_t *src, uint32_t size, RDV40SpiFFSSafetyLevel level) { RDV40_SPIFFS_SAFE_FUNCTION( append_to_spiffs(filename, src, size); ) } // todo integrate reading symlinks transparently -int rdv40_spiffs_read(char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level) { +int rdv40_spiffs_read(const char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level) { RDV40_SPIFFS_SAFE_FUNCTION( read_from_spiffs(filename, dst, size); ) diff --git a/armsrc/spiffs.h b/armsrc/spiffs.h index b3578f599..5a9e58a94 100644 --- a/armsrc/spiffs.h +++ b/armsrc/spiffs.h @@ -37,8 +37,8 @@ int rdv40_spiffs_check(void); int rdv40_spiffs_lazy_unmount(void); int rdv40_spiffs_lazy_mount(void); int rdv40_spiffs_lazy_mount_rollback(int changed); -int rdv40_spiffs_write(char *filename, uint8_t *src, uint32_t size, RDV40SpiFFSSafetyLevel level); -int rdv40_spiffs_read(char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level); +int rdv40_spiffs_write(const char *filename, uint8_t *src, uint32_t size, RDV40SpiFFSSafetyLevel level); +int rdv40_spiffs_read(const char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level); int rdv40_spiffs_rename(char *old_filename, char *new_filename, RDV40SpiFFSSafetyLevel level); int rdv40_spiffs_remove(char *filename, RDV40SpiFFSSafetyLevel level); int rdv40_spiffs_read_as_symlink(char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level); @@ -53,7 +53,7 @@ void rdv40_spiffs_safe_print_fsinfo(void); int rdv40_spiffs_make_symlink(char *linkdest, char *filename, RDV40SpiFFSSafetyLevel level); void append_to_spiffs(const char *filename, uint8_t *src, uint32_t size); int rdv40_spiffs_copy(char *src, char *dst, RDV40SpiFFSSafetyLevel level); -int rdv40_spiffs_append(char *filename, uint8_t *src, uint32_t size, RDV40SpiFFSSafetyLevel level); +int rdv40_spiffs_append(const char *filename, uint8_t *src, uint32_t size, RDV40SpiFFSSafetyLevel level); int rdv40_spiffs_stat(char *filename, uint32_t *buf, RDV40SpiFFSSafetyLevel level); uint32_t size_in_spiffs(const char *filename); int exists_in_spiffs(const char *filename); diff --git a/armsrc/string.c b/armsrc/string.c index 95b53b6ec..8dbe26808 100644 --- a/armsrc/string.c +++ b/armsrc/string.c @@ -247,7 +247,7 @@ int strncmp(const char *s1, const char *s2, size_t n) { #define isspace(a) __extension__ ({ unsigned char bb__isspace = (a) - 9; bb__isspace == (' ' - 9) || bb__isspace <= (13 - 9); }) -/* + unsigned long strtoul(const char *p, char **out_p, int base) { unsigned long v = 0; @@ -319,7 +319,6 @@ long strtol(const char *p, char **out_p, int base) { if (out_p) *out_p = (char *)p; return v; } -*/ char c_tolower(int c) { // (int)a = 97, (int)A = 65 diff --git a/armsrc/string.h b/armsrc/string.h index 0ebb4ab54..f8388d0a1 100644 --- a/armsrc/string.h +++ b/armsrc/string.h @@ -33,6 +33,8 @@ char *strrchr(const char *s, int c); size_t strcspn(const char *s1, const char *s2); char *strpbrk(const char *s1, const char *s2); int strncmp(const char *s1, const char *s2, size_t n); +unsigned long strtoul(const char *p, char **out_p, int base); +long strtol(const char *p, char **out_p, int base); char c_tolower(int c); char c_isprint(unsigned char c); From 8e4aba5e53dc165b91abbbc135b2de32a57e1f77 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 10 May 2020 18:34:35 +0200 Subject: [PATCH 152/632] arm: fix prototypes --- common_arm/usb_cdc.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/common_arm/usb_cdc.c b/common_arm/usb_cdc.c index 2b8a8eee7..c06542252 100644 --- a/common_arm/usb_cdc.c +++ b/common_arm/usb_cdc.c @@ -479,7 +479,7 @@ static void SpinDelayUs(int us) { * \brief This function deactivates the USB device *---------------------------------------------------------------------------- */ -void usb_disable() { +void usb_disable(void) { // Disconnect the USB device AT91C_BASE_PIOA->PIO_ODR = GPIO_USB_PU; @@ -495,7 +495,7 @@ void usb_disable() { * \brief This function Activates the USB device *---------------------------------------------------------------------------- */ -void usb_enable() { +void usb_enable(void) { // Set the PLL USB Divider AT91C_BASE_CKGR->CKGR_PLLR |= AT91C_CKGR_USBDIV_1 ; @@ -548,7 +548,7 @@ int GetUSBconfigured(void) { return usb_configured; } -bool usb_check() { +bool usb_check(void) { /* // reconnected ONCE and @@ -599,7 +599,7 @@ bool usb_check() { return (btConfiguration) ? true : false; } -bool usb_poll() { +bool usb_poll(void) { if (!usb_check()) return false; return (pUdp->UDP_CSR[AT91C_EP_OUT] & btReceiveBank); } @@ -612,7 +612,7 @@ bool usb_poll() { that the length available to read is non-zero, thus hopefully fixes the bug. **/ -bool usb_poll_validate_length() { +bool usb_poll_validate_length(void) { if (!usb_check()) return false; if (!(pUdp->UDP_CSR[AT91C_EP_OUT] & btReceiveBank)) return false; return ((pUdp->UDP_CSR[AT91C_EP_OUT] & AT91C_UDP_RXBYTECNT) >> 16) > 0; @@ -858,7 +858,7 @@ void AT91F_USB_SendStall(AT91PS_UDP pudp) { //* 1. this is for USB endpoint0. the control endpoint. //* 2. mixed with CDC ACM endpoint3 , interrupt, control endpoint //*---------------------------------------------------------------------------- -void AT91F_CDC_Enumerate() { +void AT91F_CDC_Enumerate(void) { uint8_t bmRequestType, bRequest; uint16_t wValue, wIndex, wLength, wStatus; From d7422aaf998ddc517200fe06fa057591a13e7ab8 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 10 May 2020 18:40:15 +0200 Subject: [PATCH 153/632] bootrom fix warnings --- bootrom/bootrom.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bootrom/bootrom.c b/bootrom/bootrom.c index 95fa5d467..7f4e38ac7 100644 --- a/bootrom/bootrom.c +++ b/bootrom/bootrom.c @@ -79,7 +79,7 @@ static void Fatal(void) { for (;;) {}; } -static void UsbPacketReceived(uint8_t *packet, int len) { +static void UsbPacketReceived(uint8_t *packet) { int i, dont_ack = 0; PacketCommandOLD *c = (PacketCommandOLD *)packet; @@ -220,7 +220,7 @@ static void flash_mode(void) { // Check if there is a usb packet available if (usb_poll_validate_length()) { if (usb_read(rx, sizeof(rx))) { - UsbPacketReceived(rx, sizeof(rx)); + UsbPacketReceived(rx); } } @@ -316,7 +316,7 @@ void BootROM(void) { if (!common_area_present) { /* Common area not ok, initialize it */ - int i; + size_t i; /* Makeshift memset, no need to drag util.c into this */ for (i = 0; i < sizeof(common_area); i++) ((char *)&common_area)[i] = 0; From 72e7f2e98c0ac80f5e5280ef169e9886f443fdc5 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 10 May 2020 00:35:47 +0200 Subject: [PATCH 154/632] arm warnings --- common_arm/Makefile.common | 64 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 62 insertions(+), 2 deletions(-) diff --git a/common_arm/Makefile.common b/common_arm/Makefile.common index be5d2a847..1a1496490 100644 --- a/common_arm/Makefile.common +++ b/common_arm/Makefile.common @@ -39,8 +39,68 @@ VPATH = . ../common_arm ../common ../common/crapto1 ../common/mbedtls ../common/ INCLUDES = ../include/proxmark3_arm.h ../include/at91sam7s512.h ../include/config_gpio.h ../include/pm3_cmd.h -CFLAGS ?= -Wall -Werror -pedantic -Wunused -Os -mthumb-interwork -CFLAGS += -c $(INCLUDE) -std=c99 $(APP_CFLAGS) +ARMCFLAGS = -mthumb-interwork +DEFCFLAGS = -Wall -Werror -Os -pedantic -fstrict-aliasing -pipe + +# Some more warnings we want as errors: +DEFCFLAGS += -Wbad-function-cast -Wchar-subscripts -Wundef -Wunused -Wuninitialized -Wpointer-arith -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits + +# Some more warnings we need first to eliminate, so temporarely tolerated: +DEFCFLAGS += -Wshadow -Wno-error=shadow +DEFCFLAGS += -Winline -Wno-error=inline +DEFCFLAGS += -Wmissing-prototypes -Wno-error=missing-prototypes +DEFCFLAGS += -Wmissing-declarations -Wno-error=missing-declarations +DEFCFLAGS += -Wstrict-prototypes -Wno-error=strict-prototypes +# still vsnprintf etc to sort out... +#DEFCFLAGS += -Wredundant-decls -Wno-error=redundant-decls +#DEFCFLAGS += -Wcast-align -Wno-error=cast-align + +# Next ones are activated only if GCCEXTRA=1 or CLANGEXTRA=1 +EXTRACFLAGS = +EXTRACFLAGS += -Wunused-parameter -Wno-error=unused-parameter +EXTRACFLAGS += -Wswitch-enum -Wno-error=switch-enum +EXTRACFLAGS += -Wsign-compare -Wno-error=sign-compare +EXTRACFLAGS += -Wold-style-definition -Wno-error=old-style-definition + +# unknown to clang or old gcc: +# First we activate Wextra then we explicitly list those we know about +# Those without -Wno-error are supposed to be completely solved +GCCEXTRACFLAGS = -Wextra +# unknown to arm-none-eabi/4.9.3 +GCCEXTRACFLAGS += -Wwrite-strings -Wno-error=discarded-qualifiers + +GCCEXTRACFLAGS += -Wold-style-declaration -Wno-error=old-style-declaration +GCCEXTRACFLAGS += -Wimplicit-fallthrough=3 -Wno-error=implicit-fallthrough +GCCEXTRACFLAGS += -Wclobbered +GCCEXTRACFLAGS += -Wcast-function-type +GCCEXTRACFLAGS += -Wmissing-parameter-type +GCCEXTRACFLAGS += -Woverride-init +GCCEXTRACFLAGS += -Wshift-negative-value +GCCEXTRACFLAGS += -Wunused-but-set-parameter +# Not yet enabled in DEFCFLAGS: +GCCEXTRACFLAGS += -Wredundant-decls -Wno-error=redundant-decls +GCCEXTRACFLAGS += -Wcast-align -Wno-error=cast-align + +ifeq ($(GCCEXTRA),1) + DEFCFLAGS += $(GCCEXTRACFLAGS) $(EXTRACFLAGS) +endif +# unknown to gcc or old clang: +# First we activate Wextra then we explicitly list those we know about +# Those without -Wno-error are supposed to be completely solved +CLANGEXTRACFLAGS = -Wextra +CLANGEXTRACFLAGS += -Wtautological-type-limit-compare +CLANGEXTRACFLAGS += -Wnull-pointer-arithmetic +CLANGEXTRACFLAGS += -Woverride-init +CLANGEXTRACFLAGS += -Wshift-negative-value +CLANGEXTRACFLAGS += -Wimplicit-fallthrough +# tolerate warnings when using clang +CLANGEXTRACFLAGS += -Wno-unused-command-line-argument -Wno-error=unknown-attributes -Wno-error=undef -Wno-error=keyword-macro -Wno-error=incompatible-library-redeclaration -Wno-error=macro-redefined -Wno-error=gnu-include-next +ifeq ($(CLANGEXTRA),1) + DEFCFLAGS += $(CLANGEXTRACFLAGS) $(EXTRACFLAGS) +endif + +CFLAGS ?= $(DEFCFLAGS) +CFLAGS += $(ARMCFLAGS) -c $(INCLUDE) -std=c99 $(APP_CFLAGS) LDFLAGS += -nostartfiles -nodefaultlibs -Wl,-gc-sections -Wl,--build-id=none -n LIBS = -lgcc From 77a834954e0fb7b8b1787a44dbc29948d9050c11 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 11 May 2020 11:39:11 +0200 Subject: [PATCH 155/632] Remove arm clang flags --- common_arm/Makefile.common | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/common_arm/Makefile.common b/common_arm/Makefile.common index 1a1496490..f44f89106 100644 --- a/common_arm/Makefile.common +++ b/common_arm/Makefile.common @@ -55,7 +55,7 @@ DEFCFLAGS += -Wstrict-prototypes -Wno-error=strict-prototypes #DEFCFLAGS += -Wredundant-decls -Wno-error=redundant-decls #DEFCFLAGS += -Wcast-align -Wno-error=cast-align -# Next ones are activated only if GCCEXTRA=1 or CLANGEXTRA=1 +# Next ones are activated only if GCCEXTRA=1 EXTRACFLAGS = EXTRACFLAGS += -Wunused-parameter -Wno-error=unused-parameter EXTRACFLAGS += -Wswitch-enum -Wno-error=switch-enum @@ -84,20 +84,6 @@ GCCEXTRACFLAGS += -Wcast-align -Wno-error=cast-align ifeq ($(GCCEXTRA),1) DEFCFLAGS += $(GCCEXTRACFLAGS) $(EXTRACFLAGS) endif -# unknown to gcc or old clang: -# First we activate Wextra then we explicitly list those we know about -# Those without -Wno-error are supposed to be completely solved -CLANGEXTRACFLAGS = -Wextra -CLANGEXTRACFLAGS += -Wtautological-type-limit-compare -CLANGEXTRACFLAGS += -Wnull-pointer-arithmetic -CLANGEXTRACFLAGS += -Woverride-init -CLANGEXTRACFLAGS += -Wshift-negative-value -CLANGEXTRACFLAGS += -Wimplicit-fallthrough -# tolerate warnings when using clang -CLANGEXTRACFLAGS += -Wno-unused-command-line-argument -Wno-error=unknown-attributes -Wno-error=undef -Wno-error=keyword-macro -Wno-error=incompatible-library-redeclaration -Wno-error=macro-redefined -Wno-error=gnu-include-next -ifeq ($(CLANGEXTRA),1) - DEFCFLAGS += $(CLANGEXTRACFLAGS) $(EXTRACFLAGS) -endif CFLAGS ?= $(DEFCFLAGS) CFLAGS += $(ARMCFLAGS) -c $(INCLUDE) -std=c99 $(APP_CFLAGS) From b377ca763a974e1ed1f07365970db361bb79339a Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 11 May 2020 13:58:38 +0200 Subject: [PATCH 156/632] cmdlft55xx : Fix buf overrun (gcc 10 error) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit src/cmdlft55xx.c:2560:43: error: ‘ - (Unknown)’ directive output may be truncated writing 21 bytes into a region of size between 15 and 24 [-Werror=format-truncation=] 2560 | snprintf(retStr, sizeof(buf), "%u - " _RED_("(Unknown)"), id); | ^~~~~~~ src/cmdlft55xx.c:2560:13: note: ‘snprintf’ output between 23 and 32 bytes into a destination of size 25 2560 | snprintf(retStr, sizeof(buf), "%u - " _RED_("(Unknown)"), id); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --- client/src/cmdlft55xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdlft55xx.c b/client/src/cmdlft55xx.c index 7f7eccb19..d2c3bea55 100644 --- a/client/src/cmdlft55xx.c +++ b/client/src/cmdlft55xx.c @@ -2538,7 +2538,7 @@ bool AcquireData(uint8_t page, uint8_t block, bool pwdmode, uint32_t password, u } char *GetPskCfStr(uint32_t id, bool q5) { - static char buf[25]; + static char buf[40]; char *retStr = buf; switch (id) { case 0: From 30c37e14e31f03d2aa401d5f2de80f465441ed22 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 11 May 2020 15:01:56 +0200 Subject: [PATCH 157/632] appveyor verbose --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 230bb44bf..777dcb86d 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -187,7 +187,7 @@ build_script: #make - bash -c -i 'pwd;make clean;make all' + bash -c -i 'pwd;make clean;make V=1' #some checks From f4e8fc89a8c9c437b9c120c5614e675039d96d7d Mon Sep 17 00:00:00 2001 From: Dmitriy Loginoov Date: Mon, 11 May 2020 16:58:16 +0300 Subject: [PATCH 158/632] Rewrited lf_em4100rwc standalone mode, added card bruteforce mode. --- armsrc/Standalone/Makefile.hal | 5 +- armsrc/Standalone/Makefile.inc | 4 + armsrc/Standalone/lf_em4100rswb.c | 341 ++++++++++++++++++++++++++++++ 3 files changed, 349 insertions(+), 1 deletion(-) create mode 100644 armsrc/Standalone/lf_em4100rswb.c diff --git a/armsrc/Standalone/Makefile.hal b/armsrc/Standalone/Makefile.hal index 5c462053b..f685c56f2 100644 --- a/armsrc/Standalone/Makefile.hal +++ b/armsrc/Standalone/Makefile.hal @@ -20,6 +20,9 @@ define KNOWN_STANDALONE_DEFINITIONS | LF_EM4100RWC | Read/simulate em4100 tags & clone it | | | to T555x tags | +----------------------------------------------------------+ +| LF_EM4100RSWB | Read/simulate/brute em4100 tags & | +| | clone it to T555x tags | ++----------------------------------------------------------+ | LF_HIDBRUTE | HID corporate 1000 bruteforce | | | - Federico dotta & Maurizio Agazzini | +----------------------------------------------------------+ @@ -55,7 +58,7 @@ define KNOWN_STANDALONE_DEFINITIONS +----------------------------------------------------------+ endef -STANDALONE_MODES := LF_SKELETON LF_EM4100EMUL LF_EM4100RWC LF_HIDBRUTE LF_ICEHID LF_PROXBRUTE LF_SAMYRUN +STANDALONE_MODES := LF_SKELETON LF_EM4100EMUL LF_EM4100RWC LF_EM4100RSWB LF_HIDBRUTE LF_ICEHID LF_PROXBRUTE LF_SAMYRUN STANDALONE_MODES += HF_14ASNIFF HF_BOG HF_COLIN HF_LEGIC HF_MATTYRUN HF_MSDSAL HF_YOUNG STANDALONE_MODES_REQ_SMARTCARD := STANDALONE_MODES_REQ_FLASH := LF_ICEHID HF_14ASNIFF HF_BOG HF_COLIN diff --git a/armsrc/Standalone/Makefile.inc b/armsrc/Standalone/Makefile.inc index 6182b6948..c04cda0bc 100644 --- a/armsrc/Standalone/Makefile.inc +++ b/armsrc/Standalone/Makefile.inc @@ -49,6 +49,10 @@ endif ifneq (,$(findstring WITH_STANDALONE_LF_EM4100RWC,$(APP_CFLAGS))) SRC_STANDALONE = lf_em4100rwc.c endif +# WITH_STANDALONE_LF_EM4100RSWB +ifneq (,$(findstring WITH_STANDALONE_LF_EM4100RSWB,$(APP_CFLAGS))) + SRC_STANDALONE = lf_em4100rswb.c +endif # WITH_STANDALONE_HF_LEGIC ifneq (,$(findstring WITH_STANDALONE_HF_LEGIC,$(APP_CFLAGS))) SRC_STANDALONE = hf_legic.c diff --git a/armsrc/Standalone/lf_em4100rswb.c b/armsrc/Standalone/lf_em4100rswb.c new file mode 100644 index 000000000..c4d5fa66a --- /dev/null +++ b/armsrc/Standalone/lf_em4100rswb.c @@ -0,0 +1,341 @@ +//----------------------------------------------------------------------------- +// Monster1024 +// based on code by: Artyom Gnatyuk, 2020 +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// LF rswb - This mode can simulate ID from selected slot, read ID to +// selected slot, write from selected slot to T5555/T55x7 tag and store +// readed ID to flash (only RDV4). +// Predefined its is not recomended because you can incedently rewrite your MANDATORY tag data. +// +// To recall stored ID from flash execute: +// mem spifss dump o emdump p +// or: +// mem spifss dump o emdump f emdump +// then from shell: +// hexdump emdump -e '5/1 "%02X" /0 "\n"' +// +// Mode list (switched by single click): +// +// 0 - READ Read source card ID and store it to current slot +// Will switch to SIM mode automatically. +// +// 1 - SIM Simulate readed ID +// +// 2 - WRITE(CLONE) Write readed ID to T55x7 card +// !!! Warning, card id WILL BE OVERRWRITED +// +// 3 - BRUTE Brute upper or down from readed card) +// You can PRESS SINGLE to exit brute mode OR +// PRESS DOUBLE to save bruted ID to current slot (will automatically switch to SIM mode) AND +// Also You can HOLD button to change brute speeds. +// +// Slots are switched by HOLD (LONG PRESS) +//----------------------------------------------------------------------------- +#include "standalone.h" +#include "proxmark3_arm.h" +#include "appmain.h" +#include "fpgaloader.h" +#include "lfops.h" +#include "util.h" +#include "dbprint.h" +#include "ticks.h" +#include "string.h" +#include "BigBuf.h" +#include "spiffs.h" +#include "inttypes.h" +#include "parity.h" + +#ifdef WITH_FLASH +#include "flashmem.h" +#endif + +#define LF_CLOCK 64 //for 125kHz +#define LF_RWSB_T55XX_TYPE 1 //Tag type: 0 - T5555, 1-T55x7 + +#define LF_RWSB_UNKNOWN_RESULT 0 +#define LF_RWSB_BRUTE_STOPED 1 +#define LF_RWSB_BRUTE_SAVED 2 + +//modes +#define LF_RWSB_MODE_READ 0 +#define LF_RWSB_MODE_SIM 1 +#define LF_RWSB_MODE_WRITE 2 +#define LF_RWSB_MODE_BRUTE 3 + +// Predefined bruteforce speed +// avg: 1s, 1.2s, 1.5s, 2s +int bruteforceSpeedCurrent = 1; +int bruteforceSpeed[] = {10, 12, 14, 16}; + +// low & high - array for storage IDs. Its length must be equal. +// Predefined IDs must be stored in low[]. +// In high[] must be nulls +uint64_t low[] = {0, 0, 0, 0}; +uint32_t high[] = {0, 0, 0, 0}; +uint8_t *bba, slots_count; +int buflen; + +void ModInfo(void) { + DbpString(" LF EM4100 read/sim/write/brute mode"); +} + +uint64_t ReversQuads(uint64_t bits) { + uint64_t result = 0; + for (int i = 0; i < 16; i++) { + result += ((bits >> (60 - 4 * i)) & 0xf) << (4 * i); + } + return result >> 24; +} + +void FillBuff(uint8_t bit) { + memset(bba + buflen, bit, LF_CLOCK / 2); + buflen += (LF_CLOCK / 2); + memset(bba + buflen, bit ^ 1, LF_CLOCK / 2); + buflen += (LF_CLOCK / 2); +} + +void ConstructEM410xEmulBuf(uint64_t id) { + bba = BigBuf_get_addr(); + + int i, j, binary[4], parity[4]; + buflen = 0; + for (i = 0; i < 9; i++) + FillBuff(1); + parity[0] = parity[1] = parity[2] = parity[3] = 0; + for (i = 0; i < 10; i++) { + for (j = 3; j >= 0; j--, id /= 2) + binary[j] = id % 2; + for (j = 0; j < 4; j++) + FillBuff(binary[j]); + FillBuff(binary[0] ^ binary[1] ^ binary[2] ^ binary[3]); + for (j = 0; j < 4; j++) + parity[j] ^= binary[j]; + } + for (j = 0; j < 4; j++) + FillBuff(parity[j]); + FillBuff(0); +} + +void LED_Update(int mode, int slot) { + LEDsoff(); + switch (mode) { + case 0: + break; + case 1: + LED_A_ON(); + break; + case 2: + LED_B_ON(); + break; + case 3: + LED_A_ON(); + LED_B_ON(); + break; + } + switch (slot) { + case 0: + break; + case 1: + LED_C_ON(); + break; + case 2: + LED_D_ON(); + break; + case 3: + LED_C_ON(); + LED_D_ON(); + break; + } +} + +void FlashLEDs(uint32_t speed, uint8_t times) { + for (int i = 0; i < times * 2; i++) { + LED_A_INV(); + LED_B_INV(); + LED_C_INV(); + LED_D_INV(); + SpinDelay(speed); + } +} + +#ifdef WITH_FLASH +void SaveIDtoFlash(int addr, uint64_t id) { + uint8_t bt[5]; + char *filename = "emdump"; + rdv40_spiffs_mount(); + for (int i = 0; i < 5; i++) { + bt[4 - i] = (uint8_t)(id >> 8 * i & 0xff); + } + if (exists_in_spiffs(filename) == false) { + rdv40_spiffs_write(filename, &bt[0], 5, RDV40_SPIFFS_SAFETY_NORMAL); + } else { + rdv40_spiffs_append(filename, &bt[0], 5, RDV40_SPIFFS_SAFETY_NORMAL); + } +} +#endif + +uint64_t PackEmID(uint64_t original, int newCardNum) { + uint64_t buf = original; + //clear pairity bits + buf &= ~(1 << 0); + buf &= ~(1 << 25); + //clear card number + for (int i = 1; i <= 16; i++) { + buf &= ~(1 << i); + } + buf |= (newCardNum & 0xFFFF) << 1; + buf |= oddparity32((buf >> 1) & 0xFFF) & 1; + buf |= (evenparity32((buf >> 13) & 0xFFF) & 1) << 25; + + uint32_t cardnumNew = (buf >> 1) & 0xFFFF; + uint32_t fcNew = (buf >> 17) & 0xFF; + Dbprintf("[=] RECONSTRUCT TAG ID: %"PRIx64" - FC: %u - Card: %u\n", buf, fcNew, cardnumNew); + return buf; +} + + +void PrintFcAndCardNum(uint64_t lowData) { + // Calculate Facility Code and Card Number from high and low + uint32_t fc = (lowData >> 17) & 0xFF; + uint32_t cardnum = (lowData >> 1) & 0xFFFF; + Dbprintf("[=] READ TAG ID: %"PRIx64" - FC: %u - Card: %u", lowData, fc, cardnum); +} + +int ButeEMTag(uint64_t originalCard, int slot) { + int speed_count = 4; + + int direction = 1; + + uint32_t cardnum = (originalCard >> 1) & 0xFFFF; + if (cardnum > 32767) { + direction = -1; + } + + uint64_t currentCard; + while (cardnum > 1 && cardnum < 65535) { + WDT_HIT(); + if (data_available()) break; + + cardnum = cardnum + direction; + currentCard = PackEmID(originalCard, cardnum); + Dbprintf("[=] >> Simulating card id %"PRIx64" <<", currentCard); + ConstructEM410xEmulBuf(ReversQuads(currentCard)); + SimulateTagLowFrequencyEx(buflen, 0, 1, bruteforceSpeed[bruteforceSpeedCurrent] * 10000); + + int button_pressed = BUTTON_CLICKED(1000); + if (button_pressed == BUTTON_SINGLE_CLICK) { + Dbprintf("[=] >> Exit bruteforce mode without saving. <<"); + return LF_RWSB_BRUTE_STOPED; + } else if (button_pressed == BUTTON_DOUBLE_CLICK) { + FlashLEDs(100, 10); + Dbprintf("[=] >> Saving bruteforced card to current slot <<"); + low[slot] = currentCard; +#ifdef WITH_FLASH + SaveIDtoFlash(slot, low[slot]); +#endif + return LF_RWSB_BRUTE_SAVED; + } else if (button_pressed == BUTTON_HOLD) { + FlashLEDs(100, 1); + WAIT_BUTTON_RELEASED(); + bruteforceSpeedCurrent = (bruteforceSpeedCurrent + 1) % speed_count; + FlashLEDs(100, bruteforceSpeedCurrent + 1); + Dbprintf("[=] >> Setting speed to %d (%d) <<", bruteforceSpeedCurrent, bruteforceSpeed[bruteforceSpeedCurrent]); + } + } + return LF_RWSB_BRUTE_STOPED; +} + +int ExecuteMode(int mode, int slot) { + LED_Update(mode, slot); + WDT_HIT(); + + switch (mode) { + //default first mode is simulate + case LF_RWSB_MODE_READ: + Dbprintf("[=] >> Read mode started <<"); + CmdEM410xdemod(1, &high[slot], &low[slot], 0); + LED_Update(mode, slot); + Dbprintf("[=] >> Tag found. Saving. <<"); + FlashLEDs(100, 5); + PrintFcAndCardNum(low[slot]); +#ifdef WITH_FLASH + SaveIDtoFlash(slot, low[slot]); +#endif + return LF_RWSB_UNKNOWN_RESULT; + case LF_RWSB_MODE_SIM: + Dbprintf("[=] >> Sim mode started <<"); + ConstructEM410xEmulBuf(ReversQuads(low[slot])); + SimulateTagLowFrequency(buflen, 0, 1); + return LF_RWSB_UNKNOWN_RESULT; + case LF_RWSB_MODE_WRITE: + Dbprintf("[!!] >> Write mode started <<"); + WriteEM410x(LF_RWSB_T55XX_TYPE, (uint32_t)(low[slot] >> 32), (uint32_t)(low[slot] & 0xffffffff)); + return LF_RWSB_UNKNOWN_RESULT; + case LF_RWSB_MODE_BRUTE: + Dbprintf("[=] >> Bruteforce mode started <<"); + return ButeEMTag(low[slot], slot); + } + return LF_RWSB_UNKNOWN_RESULT; +} + +int SwitchMode(int mode, int slot) { + WDT_HIT(); + ExecuteMode(mode, slot); + + if (mode == LF_RWSB_MODE_READ) { + //After read mode we need to switch to sim mode automatically + Dbprintf("[=] >> automatically switch to sim mode after read <<"); + + return SwitchMode(LF_RWSB_MODE_SIM, slot); + } else if (mode == LF_RWSB_MODE_BRUTE) { + //We have already have a click inside brute mode. Lets switch next mode + Dbprintf("[=] >> automatically switch to read mode after brute <<"); + + return SwitchMode(LF_RWSB_MODE_READ, slot); + } + return mode; +} + +void RunMod() { + StandAloneMode(); + FpgaDownloadAndGo(FPGA_BITSTREAM_LF); + Dbprintf("[=] >> LF EM4100 read/write/clone/brute started <<"); + int slots_count = 4; + int mode_count = 4; + + int mode = 0; + int slot = 0; + mode = SwitchMode(mode, slot); + + bba = BigBuf_get_addr(); + for (;;) { + WDT_HIT(); + if (data_available()) break; + + int button_pressed = BUTTON_CLICKED(1000); + LED_Update(mode, slot); + + //press button - switch mode + //hold button - switch slot + if (button_pressed == BUTTON_SINGLE_CLICK) { + Dbprintf("[=] >> Single click <<"); + mode = (mode + 1) % mode_count; + SpinDown(100); + + mode = SwitchMode(mode, slot); + } else if (button_pressed == BUTTON_HOLD) { + Dbprintf("[=] >> Button hold <<"); + slot = (slot + 1) % slots_count; + SpinUp(100); + SpinDelay(300); + + //automatically switch to SIM mode on slot selection + mode = LF_RWSB_MODE_SIM; + mode = SwitchMode(mode, slot); + } + } +} From 91b8569391b59d1105f82531dfaec82fafb492ec Mon Sep 17 00:00:00 2001 From: Dmitriy Loginoov Date: Mon, 11 May 2020 17:52:35 +0300 Subject: [PATCH 159/632] Added changelog line, fixed mode order in Makefiles, added line to documentation. --- CHANGELOG.md | 1 + armsrc/Standalone/Makefile.hal | 8 ++++---- armsrc/Standalone/Makefile.inc | 8 ++++---- .../Use_of_Proxmark/4_Advanced-compilation-parameters.md | 1 + 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a81289d4c..d67785eb2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added `LF_EM4100RSWB` (based on `LF_EM4100RWC`) standalone mode to read/sim/clone/brute EM4100 cards (@Monster1024) - Added `HF_MSDSAL` standalone mode which read and emulate Visa EMV cards (@Netxing) - Added Mifare Ultralight tear off experiment (@cintainfinita and @fukmar) - Added Mifare Desfire Read/Write/Create files/records/values functionality and several fixes to `hf mfdes` (@bkerler) diff --git a/armsrc/Standalone/Makefile.hal b/armsrc/Standalone/Makefile.hal index f685c56f2..c6dc9952e 100644 --- a/armsrc/Standalone/Makefile.hal +++ b/armsrc/Standalone/Makefile.hal @@ -17,12 +17,12 @@ define KNOWN_STANDALONE_DEFINITIONS | LF_EM4100EMUL | Simulate predefined em4100 tags only | | | | +----------------------------------------------------------+ -| LF_EM4100RWC | Read/simulate em4100 tags & clone it | -| | to T555x tags | -+----------------------------------------------------------+ | LF_EM4100RSWB | Read/simulate/brute em4100 tags & | | | clone it to T555x tags | +----------------------------------------------------------+ +| LF_EM4100RWC | Read/simulate em4100 tags & clone it | +| | to T555x tags | ++----------------------------------------------------------+ | LF_HIDBRUTE | HID corporate 1000 bruteforce | | | - Federico dotta & Maurizio Agazzini | +----------------------------------------------------------+ @@ -58,7 +58,7 @@ define KNOWN_STANDALONE_DEFINITIONS +----------------------------------------------------------+ endef -STANDALONE_MODES := LF_SKELETON LF_EM4100EMUL LF_EM4100RWC LF_EM4100RSWB LF_HIDBRUTE LF_ICEHID LF_PROXBRUTE LF_SAMYRUN +STANDALONE_MODES := LF_SKELETON LF_EM4100EMUL LF_EM4100RSWB LF_EM4100RWC LF_HIDBRUTE LF_ICEHID LF_PROXBRUTE LF_SAMYRUN STANDALONE_MODES += HF_14ASNIFF HF_BOG HF_COLIN HF_LEGIC HF_MATTYRUN HF_MSDSAL HF_YOUNG STANDALONE_MODES_REQ_SMARTCARD := STANDALONE_MODES_REQ_FLASH := LF_ICEHID HF_14ASNIFF HF_BOG HF_COLIN diff --git a/armsrc/Standalone/Makefile.inc b/armsrc/Standalone/Makefile.inc index c04cda0bc..a06cfe75e 100644 --- a/armsrc/Standalone/Makefile.inc +++ b/armsrc/Standalone/Makefile.inc @@ -45,14 +45,14 @@ endif ifneq (,$(findstring WITH_STANDALONE_LF_EM4100EMUL,$(APP_CFLAGS))) SRC_STANDALONE = lf_em4100emul.c endif -# WITH_STANDALONE_LF_EM4100RWC -ifneq (,$(findstring WITH_STANDALONE_LF_EM4100RWC,$(APP_CFLAGS))) - SRC_STANDALONE = lf_em4100rwc.c -endif # WITH_STANDALONE_LF_EM4100RSWB ifneq (,$(findstring WITH_STANDALONE_LF_EM4100RSWB,$(APP_CFLAGS))) SRC_STANDALONE = lf_em4100rswb.c endif +# WITH_STANDALONE_LF_EM4100RWC +ifneq (,$(findstring WITH_STANDALONE_LF_EM4100RWC,$(APP_CFLAGS))) + SRC_STANDALONE = lf_em4100rwc.c +endif # WITH_STANDALONE_HF_LEGIC ifneq (,$(findstring WITH_STANDALONE_HF_LEGIC,$(APP_CFLAGS))) SRC_STANDALONE = hf_legic.c diff --git a/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md b/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md index 46e1c6504..0780ec87b 100644 --- a/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md +++ b/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md @@ -82,6 +82,7 @@ Here are the supported values you can assign to `STANDALONE` in `Makefile.platfo | | No standalone mode | LF_SKELETON | standalone mode skeleton - Iceman | LF_EM4100EMUL | LF EM4100 simulator standalone mode - temskiy +| LF_EM4100RSWB | LF EM4100 read/write/clone/brute mode - Monster1024 | LF_EM4100RWC | LF EM4100 read/write/clone mode - temskiy | LF_HIDBRUTE | HID corporate 1000 bruteforce - Federico dotta & Maurizio Agazzini | LF_ICEHID | LF HID collector to flashmem - Iceman From 8b8d60c6673ee6c6e0aa4c59210de1edb2d13007 Mon Sep 17 00:00:00 2001 From: Dmitriy Loginoov Date: Mon, 11 May 2020 18:18:47 +0300 Subject: [PATCH 160/632] Fixed compiler warnings. --- armsrc/Standalone/lf_em4100rswb.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/armsrc/Standalone/lf_em4100rswb.c b/armsrc/Standalone/lf_em4100rswb.c index c4d5fa66a..559f85fee 100644 --- a/armsrc/Standalone/lf_em4100rswb.c +++ b/armsrc/Standalone/lf_em4100rswb.c @@ -76,14 +76,14 @@ int bruteforceSpeed[] = {10, 12, 14, 16}; // In high[] must be nulls uint64_t low[] = {0, 0, 0, 0}; uint32_t high[] = {0, 0, 0, 0}; -uint8_t *bba, slots_count; +uint8_t *bba; int buflen; void ModInfo(void) { DbpString(" LF EM4100 read/sim/write/brute mode"); } -uint64_t ReversQuads(uint64_t bits) { +static uint64_t ReversQuads(uint64_t bits) { uint64_t result = 0; for (int i = 0; i < 16; i++) { result += ((bits >> (60 - 4 * i)) & 0xf) << (4 * i); @@ -91,14 +91,14 @@ uint64_t ReversQuads(uint64_t bits) { return result >> 24; } -void FillBuff(uint8_t bit) { +static void FillBuff(uint8_t bit) { memset(bba + buflen, bit, LF_CLOCK / 2); buflen += (LF_CLOCK / 2); memset(bba + buflen, bit ^ 1, LF_CLOCK / 2); buflen += (LF_CLOCK / 2); } -void ConstructEM410xEmulBuf(uint64_t id) { +static void ConstructEM410xEmulBuf(uint64_t id) { bba = BigBuf_get_addr(); int i, j, binary[4], parity[4]; @@ -120,7 +120,7 @@ void ConstructEM410xEmulBuf(uint64_t id) { FillBuff(0); } -void LED_Update(int mode, int slot) { +static void LED_Update(int mode, int slot) { LEDsoff(); switch (mode) { case 0: @@ -152,7 +152,7 @@ void LED_Update(int mode, int slot) { } } -void FlashLEDs(uint32_t speed, uint8_t times) { +static void FlashLEDs(uint32_t speed, uint8_t times) { for (int i = 0; i < times * 2; i++) { LED_A_INV(); LED_B_INV(); @@ -163,7 +163,7 @@ void FlashLEDs(uint32_t speed, uint8_t times) { } #ifdef WITH_FLASH -void SaveIDtoFlash(int addr, uint64_t id) { +static void SaveIDtoFlash(int addr, uint64_t id) { uint8_t bt[5]; char *filename = "emdump"; rdv40_spiffs_mount(); @@ -178,7 +178,7 @@ void SaveIDtoFlash(int addr, uint64_t id) { } #endif -uint64_t PackEmID(uint64_t original, int newCardNum) { +static uint64_t PackEmID(uint64_t original, int newCardNum) { uint64_t buf = original; //clear pairity bits buf &= ~(1 << 0); @@ -198,14 +198,14 @@ uint64_t PackEmID(uint64_t original, int newCardNum) { } -void PrintFcAndCardNum(uint64_t lowData) { +static void PrintFcAndCardNum(uint64_t lowData) { // Calculate Facility Code and Card Number from high and low uint32_t fc = (lowData >> 17) & 0xFF; uint32_t cardnum = (lowData >> 1) & 0xFFFF; Dbprintf("[=] READ TAG ID: %"PRIx64" - FC: %u - Card: %u", lowData, fc, cardnum); } -int ButeEMTag(uint64_t originalCard, int slot) { +static int ButeEMTag(uint64_t originalCard, int slot) { int speed_count = 4; int direction = 1; @@ -249,7 +249,7 @@ int ButeEMTag(uint64_t originalCard, int slot) { return LF_RWSB_BRUTE_STOPED; } -int ExecuteMode(int mode, int slot) { +static int ExecuteMode(int mode, int slot) { LED_Update(mode, slot); WDT_HIT(); @@ -282,7 +282,7 @@ int ExecuteMode(int mode, int slot) { return LF_RWSB_UNKNOWN_RESULT; } -int SwitchMode(int mode, int slot) { +static int SwitchMode(int mode, int slot) { WDT_HIT(); ExecuteMode(mode, slot); From 093065f77abd7a2f21d8023646ab1ed1a3eeb219 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 11 May 2020 17:23:01 +0200 Subject: [PATCH 161/632] chg: 'data load' - color --- client/src/cmddata.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmddata.c b/client/src/cmddata.c index cf2256acb..9125184be 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -1810,7 +1810,7 @@ static int CmdLoad(const char *Cmd) { fclose(f); - PrintAndLogEx(SUCCESS, "loaded %zu samples", GraphTraceLen); + PrintAndLogEx(SUCCESS, "loaded " _YELLOW_("%zu") " samples", GraphTraceLen); uint8_t bits[GraphTraceLen]; size_t size = getFromGraphBuf(bits); From 5fd48305de2170525bb1e9798aa0e6a33b9b3769 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 11 May 2020 21:58:47 +0200 Subject: [PATCH 162/632] chg: lf nexwath sim/clone - now supports 88bit format direct. See helptext for samples --- client/src/cmdlfnexwatch.c | 352 +++++++++++++++++++++++-------------- 1 file changed, 218 insertions(+), 134 deletions(-) diff --git a/client/src/cmdlfnexwatch.c b/client/src/cmdlfnexwatch.c index 0db6a38cd..8d740bb02 100644 --- a/client/src/cmdlfnexwatch.c +++ b/client/src/cmdlfnexwatch.c @@ -24,45 +24,131 @@ #include "protocols.h" // t55xx defines #include "cmdlft55xx.h" // clone.. +typedef enum { + SCRAMBLE, + DESCRAMBLE +} NexWatchScramble_t; + static int CmdHelp(const char *Cmd); static int usage_lf_nexwatch_clone(void) { PrintAndLogEx(NORMAL, "clone a Nexwatch tag to a T55x7 tag."); + PrintAndLogEx(NORMAL, "You can use raw hex values or create a credential based on id, mode"); + PrintAndLogEx(NORMAL, "and type of credential (Nexkey/Quadrakey)"); PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(NORMAL, "Usage: lf nexwatch clone [h] [b ]"); + PrintAndLogEx(NORMAL, "Usage: lf nexwatch clone [h] [b ] [c ] [m ] [n|q]"); PrintAndLogEx(NORMAL, "Options:"); PrintAndLogEx(NORMAL, " h : this help"); - PrintAndLogEx(NORMAL, " r : raw hex data. 16 bytes max"); + PrintAndLogEx(NORMAL, " r : raw hex data. 12 bytes max"); + PrintAndLogEx(NORMAL, " c : card id (decimal)"); + PrintAndLogEx(NORMAL, " m : mode (decimal) (0-15, defaults to 1)"); + PrintAndLogEx(NORMAL, " n : Nexkey credential"); + PrintAndLogEx(NORMAL, " q : Quadrakey credential"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); PrintAndLogEx(NORMAL, " lf nexwatch clone r 5600000000213C9F8F150C"); + PrintAndLogEx(NORMAL, " lf nexwatch clone c 521512301 m 1 n -- Nexkey credential"); + PrintAndLogEx(NORMAL, " lf nexwatch clone c 521512301 m 1 q -- Quadrakey credential"); return PM3_SUCCESS; } static int usage_lf_nexwatch_sim(void) { PrintAndLogEx(NORMAL, "Enables simulation of Nexwatch card"); + PrintAndLogEx(NORMAL, "You can use raw hex values or create a credential based on id, mode"); + PrintAndLogEx(NORMAL, "and type of credential (Nexkey/Quadrakey)"); PrintAndLogEx(NORMAL, "Simulation runs until the button is pressed or another USB command is issued."); PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(NORMAL, "Usage: lf nexwatch sim [h] "); + PrintAndLogEx(NORMAL, "Usage: lf nexwatch sim [h] [c ] [m ] [n|q]"); PrintAndLogEx(NORMAL, "Options:"); PrintAndLogEx(NORMAL, " h : this help"); PrintAndLogEx(NORMAL, " r : raw hex data. 16 bytes max"); + PrintAndLogEx(NORMAL, " c : card id (decimal)"); + PrintAndLogEx(NORMAL, " m : mode (decimal) (0-15, defaults to 1)"); + PrintAndLogEx(NORMAL, " n : Nexkey credential"); + PrintAndLogEx(NORMAL, " q : Quadrakey credential"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); PrintAndLogEx(NORMAL, " lf nexwatch sim r 5600000000213C9F8F150C"); + PrintAndLogEx(NORMAL, " lf nexwatch sim c 521512301 m 1 n -- Nexkey credential"); + PrintAndLogEx(NORMAL, " lf nexwatch sim c 521512301 m 1 q -- Quadrakey credential"); return PM3_SUCCESS; } -/* -static inline uint32_t bitcount(uint32_t a) { -#if defined __GNUC__ - return __builtin_popcountl(a); -#else - a = a - ((a >> 1) & 0x55555555); - a = (a & 0x33333333) + ((a >> 2) & 0x33333333); - return (((a + (a >> 4)) & 0x0f0f0f0f) * 0x01010101) >> 24; -#endif + +// scramble parity (1234) -> (4231) +static uint8_t nexwatch_parity_swap(uint8_t parity) { + uint8_t a = (((parity >> 3 ) & 1) ); + a |= (((parity >> 1 ) & 1) << 1); + a |= (((parity >> 2 ) & 1) << 2); + a |= ((parity & 1) << 3); + return a; } -*/ +// parity check +// from 32b hex id, 4b mode, +static uint8_t nexwatch_parity(uint8_t hexid[5]) { + uint8_t p = 0; + for (uint8_t i = 0; i < 5; i++) { + p ^= NIBBLE_HIGH(hexid[i]); + p ^= NIBBLE_LOW(hexid[i]); + } + return nexwatch_parity_swap(p); +} + +/// NETWATCH checksum +/// @param magic = 0xBE Quadrakey, 0x88 Nexkey +/// @param id = descrambled id (printed card number) +/// @param parity = the parity based upon the scrambled raw id. +static uint8_t nexwatch_checksum(uint8_t magic, uint32_t id, uint8_t parity) { + uint8_t a = ((id >> 24) & 0xFF); + a -= ((id >> 16) & 0xFF); + a -= ((id >> 8) & 0xFF); + a -= (id & 0xFF); + a -= magic; + a -= (reflect8(parity) >> 4); + return reflect8(a); +} + +// Scrambled id ( 88 bit cardnumber format) +// ref:: http://www.proxmark.org/forum/viewtopic.php?pid=14662#p14662 +static int nexwatch_scamble(NexWatchScramble_t action, uint32_t *id, uint32_t *scambled) { + + // 255 = Not used/Unknown other values are the bit offset in the ID/FC values + uint8_t hex_2_id [] = { + 31, 27, 23, 19, 15, 11, 7, 3, + 30, 26, 22, 18, 14, 10, 6, 2, + 29, 25, 21, 17, 13, 9, 5, 1, + 28, 24, 20, 16, 12, 8, 4, 0 + }; + + switch(action) { + case DESCRAMBLE: { + *id = 0; + for (uint8_t idx = 0; idx < 32; idx++) { + + if (hex_2_id[idx] == 255) + continue; + + bool bit_state = (*scambled >> hex_2_id[idx]) & 1; + *id |= (bit_state << (31 - idx)); + } + break; + } + case SCRAMBLE: { + *scambled = 0; + for (uint8_t idx = 0; idx < 32; idx++) { + + if (hex_2_id[idx] == 255) + continue; + + bool bit_state = (*id >> idx) & 1; + *scambled |= (bit_state << (31 - hex_2_id[idx])); + } + break; + } + default: break; + } + return PM3_SUCCESS; +} + int demodNexWatch(void) { if (PSKDemod("", false) != PM3_SUCCESS) { PrintAndLogEx(DEBUG, "DEBUG: Error - NexWatch can't demod signal"); @@ -95,10 +181,15 @@ int demodNexWatch(void) { setClockGrid(g_DemodClock, g_DemodStartIdx + (idx * g_DemodClock)); if (invert) { - PrintAndLogEx(INFO, "Had to Invert - probably NexKey"); + PrintAndLogEx(INFO, "Inverted the demodulated data"); for (size_t i = 0; i < size; i++) DemodBuffer[i] ^= 1; } + + //got a good demod + uint32_t raw1 = bytebits_to_byte(DemodBuffer, 32); + uint32_t raw2 = bytebits_to_byte(DemodBuffer + 32, 32); + uint32_t raw3 = bytebits_to_byte(DemodBuffer + 32 + 32, 32); // get rawid uint32_t rawid = 0; @@ -108,140 +199,62 @@ int demodNexWatch(void) { } } - /* - Descrambled id - - ref:: http://www.proxmark.org/forum/viewtopic.php?pid=14662#p14662 - - 32bit UID: 00100100011001000011111100010010 - - bits numbered from left (MSB): - 1234 5678 9012 34567 8901234567890 12 - 0010 0100 0110 0100 00111111000100 10 - - descramble: - b1 b5 b9 b13 b17 b21 b25 b29 b2 b6 b10 b14 b18 b22 b26 b30 b3 b7 b11 b15 b19 b23 b27 b31 b4 b8 b12 b16 b20 b24 b28 b32 - - gives: - 0000 0100 0111 0100 1010 1101 0000 1110 = 74755342 - */ - -// Since the description is not zero indexed we adjust. -#define DOFFSET 8 + 32 - 1 - // descrambled id - uint32_t d_id = 0; - // b1 b5 b9 b13 - d_id |= DemodBuffer[DOFFSET + 1] << 31; - d_id |= DemodBuffer[DOFFSET + 5] << 30; - d_id |= DemodBuffer[DOFFSET + 9] << 29; - d_id |= DemodBuffer[DOFFSET + 13] << 28; - - // b17 b21 b25 b29 - d_id |= DemodBuffer[DOFFSET + 17] << 27; - d_id |= DemodBuffer[DOFFSET + 21] << 26; - d_id |= DemodBuffer[DOFFSET + 25] << 25; - d_id |= DemodBuffer[DOFFSET + 29] << 24; - - // b2 b6 b10 b14 - d_id |= DemodBuffer[DOFFSET + 2] << 23; - d_id |= DemodBuffer[DOFFSET + 6] << 22; - d_id |= DemodBuffer[DOFFSET + 10] << 21; - d_id |= DemodBuffer[DOFFSET + 14] << 20; - - // b18 b22 b26 b30 - d_id |= DemodBuffer[DOFFSET + 18] << 19; - d_id |= DemodBuffer[DOFFSET + 22] << 18; - d_id |= DemodBuffer[DOFFSET + 26] << 17; - d_id |= DemodBuffer[DOFFSET + 30] << 16; - - // b3 b7 b11 b15 - d_id |= DemodBuffer[DOFFSET + 3] << 15; - d_id |= DemodBuffer[DOFFSET + 7] << 14; - d_id |= DemodBuffer[DOFFSET + 11] << 13; - d_id |= DemodBuffer[DOFFSET + 15] << 12; - - // b19 b23 b27 b31 - d_id |= DemodBuffer[DOFFSET + 19] << 11; - d_id |= DemodBuffer[DOFFSET + 23] << 10; - d_id |= DemodBuffer[DOFFSET + 27] << 9; - d_id |= DemodBuffer[DOFFSET + 31] << 8; - - // b4 b8 b12 b16 - d_id |= DemodBuffer[DOFFSET + 4] << 7; - d_id |= DemodBuffer[DOFFSET + 8] << 6; - d_id |= DemodBuffer[DOFFSET + 12] << 5; - d_id |= DemodBuffer[DOFFSET + 16] << 4; - - // b20 b24 b28 b32 - d_id |= DemodBuffer[DOFFSET + 20] << 3; - d_id |= DemodBuffer[DOFFSET + 24] << 2; - d_id |= DemodBuffer[DOFFSET + 28] << 1; - d_id |= DemodBuffer[DOFFSET + 32]; - + uint32_t cn = 0; + uint32_t scambled = bytebits_to_byte(DemodBuffer + 8 + 32, 32); + nexwatch_scamble(DESCRAMBLE, &cn, &scambled); + uint8_t mode = bytebits_to_byte(DemodBuffer + 72, 4); uint8_t parity = bytebits_to_byte(DemodBuffer + 76, 4); uint8_t chk = bytebits_to_byte(DemodBuffer + 80, 8); // parity check - // from 32 hex id, 4 mode, descramble par (1234) -> (4231) - uint8_t xor_par = 0; - for (uint8_t i = 40; i < 76; i +=4) { - xor_par ^= bytebits_to_byte(DemodBuffer + i, 4); + // from 32b hex id, 4b mode + uint8_t hex[5] = {0}; + for (uint8_t i = 0; i < 5; i++) { + hex[i] = bytebits_to_byte(DemodBuffer + 8 + 32 + (i * 8), 8); } - - uint8_t calc_parity ; - calc_parity = (((xor_par >> 3 ) & 1) ); - calc_parity |= (((xor_par >> 1 ) & 1) << 1); - calc_parity |= (((xor_par >> 2 ) & 1) << 2); - calc_parity |= ((xor_par & 1) << 3); - - // Checksum - uint8_t calc; - calc = ((d_id >> 24) & 0xFF); - calc -= ((d_id >> 16) & 0xFF); - calc -= ((d_id >> 8) & 0xFF); - calc -= (d_id & 0xFF); - - uint8_t revpar = (reflect8(calc_parity) >> 4); - + // mode is only 4 bits. + hex[4] &= 0xf0; + uint8_t calc_parity = nexwatch_parity(hex); + + // Checksum typedef struct { uint8_t magic; char desc[10]; uint8_t chk; } nexwatch_magic_t; - nexwatch_magic_t items[] = { {0xBE, "Quadrakey", 0}, {0x88, "Nexkey", 0} }; uint8_t m_idx; for ( m_idx = 0; m_idx < ARRAYLEN(items); m_idx++) { - uint8_t foo = calc; - foo -= items[m_idx].magic; - foo -= revpar; - foo = reflect8(foo); - items[m_idx].chk = foo; - if (foo == chk) { + + items[m_idx].chk = nexwatch_checksum(items[m_idx].magic, cn, calc_parity); + if (items[m_idx].chk == chk) { break; } } - // detect keytype - // output PrintAndLogEx(SUCCESS, " NexWatch raw id : " _YELLOW_("0x%"PRIx32) , rawid); - PrintAndLogEx(SUCCESS, " 88bit id : " _YELLOW_("%"PRIu32) " " _YELLOW_("0x%"PRIx32), d_id, d_id); - PrintAndLogEx(SUCCESS, " mode : %x", mode); - PrintAndLogEx(SUCCESS, " parity : %s [%X == %X]", (parity == calc_parity) ? _GREEN_("ok") : _RED_("fail"), parity, calc_parity); + if (m_idx < 3) { - PrintAndLogEx(SUCCESS, " checksum : %s [%X]", _GREEN_("ok"), chk); - PrintAndLogEx(SUCCESS, " Keytype : " _GREEN_("%s"), items[m_idx].desc); + PrintAndLogEx(SUCCESS, " fingerprint : " _GREEN_("%s"), items[m_idx].desc); + } + PrintAndLogEx(SUCCESS, " 88bit id : " _YELLOW_("%"PRIu32) " (" _YELLOW_("0x%"PRIx32)")", cn, cn); + PrintAndLogEx(SUCCESS, " mode : %x", mode); + if ( parity == calc_parity) { + PrintAndLogEx(SUCCESS, " parity : %s (0x%X)", _GREEN_("ok"), parity); } else { - PrintAndLogEx(WARNING, " checksum : %s [%X == %X]", _RED_("fail"), chk, items[m_idx].chk); + PrintAndLogEx(WARNING, " parity : %s (0x%X != 0x%X)", _RED_("fail"), parity, calc_parity); + } + if (m_idx < 3) { + PrintAndLogEx(SUCCESS, " checksum : %s (0x%02X)", _GREEN_("ok"), chk); + } else { + PrintAndLogEx(WARNING, " checksum : %s (0x%02X != 0x%02X)", _RED_("fail"), chk, items[m_idx].chk); } - // bits to hex (output used for SIM/CLONE cmd) - CmdPrintDemodBuff("x"); -// PrintAndLogEx(INFO, "Raw: %s", sprint_hex_inrow(DemodBuffer, size)); + PrintAndLogEx(INFO, " raw : " _YELLOW_("%"PRIX64"%"PRIX64"%"PRIX64), raw1, raw2, raw3); return PM3_SUCCESS; } @@ -259,29 +272,54 @@ static int CmdNexWatchRead(const char *Cmd) { static int CmdNexWatchClone(const char *Cmd) { - // 56000000 00213C9F 8F150C00 00000000 - uint32_t blocks[5]; + // 56000000 00213C9F 8F150C00 + uint32_t blocks[4]; + bool use_raw = false; bool errors = false; uint8_t cmdp = 0; int datalen = 0; - + uint8_t magic = 0xBE; + uint32_t cn = 0; + uint8_t rawhex[16] = {0x56, 0}; + while (param_getchar(Cmd, cmdp) != 0x00 && !errors) { switch (tolower(param_getchar(Cmd, cmdp))) { case 'h': return usage_lf_nexwatch_clone(); case 'r': { - // skip first block, 4*4 = 16 bytes left - uint8_t rawhex[16] = {0}; int res = param_gethex_to_eol(Cmd, cmdp + 1, rawhex, sizeof(rawhex), &datalen); if (res != 0) errors = true; - for (uint8_t i = 1; i < ARRAYLEN(blocks); i++) { - blocks[i] = bytes_to_num(rawhex + ((i - 1) * 4), sizeof(uint32_t)); - } + use_raw = true; cmdp += 2; break; } + case 'c': { + cn = param_get32ex(Cmd, cmdp + 1, 0, 10); + uint32_t scrambled; + nexwatch_scamble(SCRAMBLE, &cn, &scrambled); + num_to_bytes(scrambled, 4, rawhex + 5); + cmdp += 2; + break; + } + case 'm': { + uint8_t mode = param_get8ex(Cmd, cmdp + 1, 1, 10); + mode &= 0x0F; + rawhex[9] |= (mode << 4); + cmdp += 2; + break; + } + case 'n': { + magic = 0x88; + cmdp++; + break; + } + case 'q': { + magic = 0xBE; + cmdp++; + break; + } default: PrintAndLogEx(WARNING, "Unknown parameter '%c'", param_getchar(Cmd, cmdp)); errors = true; @@ -292,7 +330,17 @@ static int CmdNexWatchClone(const char *Cmd) { if (errors || cmdp == 0) return usage_lf_nexwatch_clone(); //Nexwatch - compat mode, PSK, data rate 40, 3 data blocks - blocks[0] = T55x7_MODULATION_PSK1 | T55x7_BITRATE_RF_32 | 4 << T55x7_MAXBLOCK_SHIFT; + blocks[0] = T55x7_MODULATION_PSK1 | T55x7_BITRATE_RF_32 | 3 << T55x7_MAXBLOCK_SHIFT; + + if (use_raw == false) { + uint8_t parity = nexwatch_parity(rawhex + 5) & 0xF; + rawhex[9] |= parity; + rawhex[10] |= nexwatch_checksum(magic, cn, parity); + } + + for (uint8_t i = 1; i < ARRAYLEN(blocks); i++) { + blocks[i] = bytes_to_num(rawhex + ((i - 1) * 4), sizeof(uint32_t)); + } PrintAndLogEx(INFO, "Preparing to clone NexWatch to T55x7 with raw hex"); print_blocks(blocks, ARRAYLEN(blocks)); @@ -307,9 +355,12 @@ static int CmdNexWatchSim(const char *Cmd) { uint8_t cmdp = 0; bool errors = false; - int rawlen = 0; - uint8_t rawhex[16] = {0}; - uint32_t rawblocks[4]; + bool use_raw = false; + uint8_t rawhex[12] = {0x56, 0}; + int rawlen = sizeof(rawhex); + uint8_t magic = 0xBE; + uint32_t cn = 0; + uint8_t bs[128]; memset(bs, 0, sizeof(bs)); @@ -322,9 +373,35 @@ static int CmdNexWatchSim(const char *Cmd) { if (res != 0) errors = true; + use_raw = true; cmdp += 2; break; } + case 'c': { + cn = param_get32ex(Cmd, cmdp + 1, 0, 10); + uint32_t scrambled; + nexwatch_scamble(SCRAMBLE, &cn, &scrambled); + num_to_bytes(scrambled, 4, rawhex + 5); + cmdp += 2; + break; + } + case 'm': { + uint8_t mode = param_get8ex(Cmd, cmdp + 1, 1, 10); + mode &= 0x0F; + rawhex[9] |= (mode << 4); + cmdp += 2; + break; + } + case 'n': { + magic = 0x88; + cmdp++; + break; + } + case 'q': { + magic = 0xBE; + cmdp++; + break; + } default: PrintAndLogEx(WARNING, "Unknown parameter '%c'", param_getchar(Cmd, cmdp)); errors = true; @@ -334,7 +411,14 @@ static int CmdNexWatchSim(const char *Cmd) { if (errors || cmdp == 0) return usage_lf_nexwatch_sim(); + if (use_raw == false) { + uint8_t parity = nexwatch_parity(rawhex + 5) & 0xF; + rawhex[9] |= parity; + rawhex[10] |= nexwatch_checksum(magic, cn, parity); + } + // hex to bits. + uint32_t rawblocks[4]; for (size_t i = 0; i < ARRAYLEN(rawblocks); i++) { rawblocks[i] = bytes_to_num(rawhex + (i * sizeof(uint32_t)), sizeof(uint32_t)); num_to_bytebits(rawblocks[i], sizeof(uint32_t) * 8, bs + (i * sizeof(uint32_t) * 8)); From 00b67e2cdd80066094d224beb6a073f2d7649b61 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 11 May 2020 22:12:46 +0200 Subject: [PATCH 163/632] remove warnings of unused --- armsrc/Standalone/hf_legic.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/armsrc/Standalone/hf_legic.c b/armsrc/Standalone/hf_legic.c index 5bcbfca63..73590268e 100644 --- a/armsrc/Standalone/hf_legic.c +++ b/armsrc/Standalone/hf_legic.c @@ -44,6 +44,7 @@ * */ +#ifdef WITH_FLASH static void DownloadLogInstructions(void) { Dbprintf(""); Dbprintf("[=] List all dumps from flash:"); @@ -52,6 +53,7 @@ static void DownloadLogInstructions(void) { Dbprintf("[=] To save a dump file from flash to client:"); Dbprintf("[=] " _YELLOW_("-") " mem spiffs dump o hf-legic-UID-dump.bin f hf-legic-UID-dump.bin"); } +#endif static void save_dump_to_file(legic_card_select_t *p_card) { From 4b68ac0a905a348843c84b0d268c633cb4bfeb15 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 11 May 2020 22:34:33 +0200 Subject: [PATCH 164/632] chg: lenient nexwatch demod sizes --- client/src/cmdlfnexwatch.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/cmdlfnexwatch.c b/client/src/cmdlfnexwatch.c index 8d740bb02..d67550ee5 100644 --- a/client/src/cmdlfnexwatch.c +++ b/client/src/cmdlfnexwatch.c @@ -157,7 +157,7 @@ int demodNexWatch(void) { bool invert = false; size_t size = DemodBufferLen; int idx = detectNexWatch(DemodBuffer, &size, &invert); - if (idx <= 0) { + if (idx < 0) { if (idx == -1) PrintAndLogEx(DEBUG, "DEBUG: Error - NexWatch not enough samples"); // else if (idx == -2) @@ -470,7 +470,7 @@ int detectNexWatch(uint8_t *dest, size_t *size, bool *invert) { uint8_t preamble[28] = {0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // sanity check. - if (*size < sizeof(preamble) + 100) return -1; + if (*size < 96) return -1; size_t startIdx = 0; From 30184b2b5ce3a6742c16cfa08d3b5b86a6ad25ea Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 11 May 2020 22:34:54 +0200 Subject: [PATCH 165/632] cleaning --- client/src/cmdlfkeri.c | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/client/src/cmdlfkeri.c b/client/src/cmdlfkeri.c index 135bc2640..a26278f1c 100644 --- a/client/src/cmdlfkeri.c +++ b/client/src/cmdlfkeri.c @@ -269,19 +269,6 @@ static int CmdKeriClone(const char *Cmd) { } } - // this is managed in above code - // internalid = param_get32ex(Cmd, 0, 0, 10); - /* - // Q5 is caught in the while loop - //Q5 - if (tolower(param_getchar(Cmd, 1)) == 'q') { - blocks[0] = - T5555_MODULATION_PSK1 | - T5555_SET_BITRATE(128) | - T5555_PSK_RF_2 | - 2 << T5555_MAXBLOCK_SHIFT; - } - */ // Setup card data/build internal id switch (keritype) { case 'i' : // Internal ID From d5adbc89a5f11740c306965fdec4563689f01a77 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 11 May 2020 22:38:17 +0200 Subject: [PATCH 166/632] file --- traces/nexkey_74755342.pm3 | 10000 +++++++++++++++++++++++++++++++++++ 1 file changed, 10000 insertions(+) create mode 100644 traces/nexkey_74755342.pm3 diff --git a/traces/nexkey_74755342.pm3 b/traces/nexkey_74755342.pm3 new file mode 100644 index 000000000..d956250e6 --- /dev/null +++ b/traces/nexkey_74755342.pm3 @@ -0,0 +1,10000 @@ +-18 +0 +-15 +-1 +-16 +-1 +-17 +-1 +-16 +1 +-15 +1 +-15 +-1 +-17 +0 +-16 +1 +-14 +1 +-14 +1 +-16 +0 +-15 +1 +-14 +2 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-15 +0 +-16 +0 +-16 +1 +-15 +1 +-14 +0 +-16 +0 +-15 +1 +-14 +1 +-14 +0 +-16 +0 +-16 +1 +-14 +2 +-14 +0 +-16 +0 +-16 +1 +-16 +2 +-15 +-1 +-17 +0 +-16 +1 +-14 +1 +-14 +0 +-16 +-1 +-16 +1 +-15 +1 +-14 +0 +-16 +-1 +-16 +1 +-13 +2 +-14 +0 +-17 +-1 +-17 +2 +-13 +2 +-14 +0 +-16 +0 +-16 +1 +-15 +1 +-15 +-1 +-16 +-1 +-15 +1 +-14 +1 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +0 +-16 +1 +-15 +1 +-14 +2 +-15 +0 +-16 +-1 +-15 +1 +-15 +2 +-15 +0 +-17 +-1 +-16 +1 +-14 +1 +-14 +1 +-16 +-1 +-15 +1 +-15 +2 +-15 +1 +-16 +0 +-16 +1 +-14 +2 +-15 +1 +-16 +0 +-15 +2 +-13 +2 +-14 +0 +-15 +1 +-15 +2 +-14 +1 +-14 +0 +-16 +1 +-15 +2 +-13 +3 +-13 +2 +-14 +2 +-14 +3 +-12 +3 +-13 +1 +-15 +1 +-15 +1 +-13 +2 +-14 +1 +-16 +0 +-15 +2 +-13 +1 +-14 +2 +-16 +2 +-15 +2 +-13 +1 +-15 +1 +-15 +1 +-15 +1 +-14 +1 +-14 +0 +-16 +0 +-16 +0 +-14 +2 +-14 +1 +-16 +0 +-16 +1 +-14 +2 +-15 +0 +-16 +1 +-15 +1 +-15 +0 +-16 +-2 +-18 +-1 +-18 +0 +-15 +1 +-15 +0 +-16 +0 +-15 +2 +-14 +2 +-13 +1 +-16 +1 +-16 +1 +-14 +3 +-14 +1 +-16 +0 +-16 +2 +-14 +1 +-14 +0 +-16 +1 +-15 +1 +-14 +1 +-15 +-1 +-17 +-2 +-17 +-1 +-15 +0 +-16 +-2 +-17 +-2 +-16 +0 +-16 +0 +-15 +-1 +-18 +-2 +-17 +-1 +-15 +0 +-16 +-1 +-17 +-1 +-16 +1 +-15 +0 +-15 +-1 +-17 +0 +-15 +0 +-15 +0 +-15 +1 +-16 +-1 +-17 +2 +-15 +1 +-13 +0 +-17 +-1 +-16 +1 +-14 +1 +-15 +0 +-15 +0 +-16 +1 +-15 +0 +-14 +0 +-16 +-1 +-16 +1 +-13 +1 +-15 +0 +-16 +0 +-15 +1 +-14 +1 +-15 +1 +-16 +-1 +-16 +1 +-14 +1 +-14 +-1 +-17 +1 +-15 +1 +-15 +2 +-14 +0 +-15 +0 +-15 +1 +-14 +2 +-15 +1 +-16 +1 +-16 +0 +-15 +2 +-14 +0 +-16 +-1 +-16 +1 +-15 +1 +-13 +1 +-15 +0 +-15 +0 +-14 +2 +-15 +0 +-15 +0 +-16 +1 +-15 +2 +-15 +0 +-15 +1 +-16 +1 +-14 +1 +-15 +1 +-16 +2 +-15 +1 +-14 +1 +-15 +1 +-15 +0 +-16 +1 +-14 +2 +-15 +2 +-15 +0 +-16 +1 +-14 +1 +-14 +0 +-15 +0 +-15 +2 +-14 +1 +-14 +1 +-17 +-1 +-16 +0 +-15 +1 +-15 +1 +-16 +1 +-15 +1 +-14 +2 +-14 +1 +-16 +1 +-15 +1 +-15 +1 +-15 +1 +-17 +1 +-16 +1 +-14 +1 +-15 +1 +-16 +0 +-16 +1 +-15 +1 +-15 +1 +-15 +1 +-15 +0 +-15 +1 +-15 +1 +-16 +0 +-15 +1 +-15 +1 +-14 +0 +-17 +0 +-16 +0 +-14 +3 +-14 +0 +-16 +0 +-16 +2 +-14 +1 +-15 +0 +-16 +0 +-16 +1 +-14 +3 +-14 +0 +-17 +0 +-16 +1 +-13 +2 +-13 +1 +-16 +2 +-16 +2 +-14 +1 +-14 +0 +-17 +1 +-16 +1 +-14 +2 +-15 +0 +-16 +0 +-16 +2 +-14 +1 +-14 +1 +-17 +-1 +-16 +1 +-13 +2 +-13 +0 +-16 +1 +-16 +1 +-14 +1 +-14 +0 +-15 +0 +-15 +1 +-15 +2 +-14 +-1 +-16 +0 +-16 +2 +-13 +2 +-14 +0 +-16 +-1 +-17 +1 +-13 +2 +-15 +-1 +-16 +0 +-14 +1 +-32 +-60 +-11 +-13 +10 +-9 +3 +-15 +1 +-13 +5 +-11 +5 +-11 +5 +-10 +57 +31 +-3 +-5 +-22 +-5 +-19 +-1 +-17 +-1 +-16 +-1 +-19 +-3 +-18 +0 +-33 +-61 +-12 +-14 +9 +-11 +2 +-16 +0 +-15 +3 +-12 +4 +-11 +4 +-10 +58 +30 +-3 +-5 +-21 +-5 +-18 +-1 +-18 +-1 +-16 +-3 +-19 +-3 +-18 +-1 +-34 +-61 +-13 +-14 +8 +-11 +1 +-17 +0 +-14 +4 +-12 +3 +-13 +3 +-10 +5 +-10 +5 +-13 +2 +-13 +2 +-13 +2 +-13 +3 +-15 +2 +-15 +0 +-15 +54 +27 +-7 +-6 +-24 +-8 +-21 +-3 +-20 +-3 +-17 +-3 +-19 +-3 +-18 +-1 +-16 +0 +-17 +-2 +-17 +-1 +-18 +-1 +-16 +-1 +-16 +-1 +-18 +-2 +-17 +-1 +-16 +0 +-16 +0 +-16 +0 +-16 +2 +-14 +0 +-16 +-1 +-17 +0 +-14 +1 +-15 +1 +-15 +0 +-16 +1 +-14 +1 +-14 +2 +-15 +1 +-17 +-1 +-15 +0 +-15 +1 +-13 +1 +-16 +1 +-16 +1 +-13 +1 +-15 +0 +-15 +0 +-16 +2 +-14 +1 +-14 +0 +-16 +1 +-16 +0 +-14 +1 +-14 +0 +-16 +1 +-15 +1 +-13 +0 +-15 +1 +-16 +1 +-16 +1 +-15 +1 +-13 +0 +-15 +0 +-16 +1 +-13 +1 +-15 +1 +-16 +0 +-16 +1 +-14 +1 +-14 +1 +-15 +0 +-16 +1 +-15 +1 +-15 +0 +-15 +0 +-16 +1 +-15 +1 +-15 +1 +-16 +1 +-16 +0 +-13 +2 +-14 +1 +-16 +1 +-16 +1 +-14 +1 +-14 +2 +-17 +-1 +-17 +0 +-15 +1 +-14 +0 +-16 +1 +-16 +1 +-14 +1 +-15 +0 +-16 +0 +-14 +1 +-13 +1 +-14 +-1 +-16 +1 +-16 +2 +-14 +1 +-15 +0 +-16 +0 +-14 +2 +-13 +1 +-14 +-1 +-15 +0 +-16 +2 +-14 +1 +-15 +0 +-15 +1 +-16 +1 +-13 +1 +-14 +1 +-16 +1 +-15 +1 +-15 +1 +-14 +0 +-15 +0 +-16 +1 +-15 +2 +-15 +0 +-16 +0 +-15 +1 +-15 +1 +-15 +-1 +-16 +1 +-15 +1 +-14 +1 +-15 +1 +-16 +0 +-16 +1 +-15 +2 +-14 +1 +-15 +0 +-17 +0 +-15 +1 +-15 +0 +-16 +0 +-15 +1 +-15 +1 +-15 +0 +-16 +1 +-16 +1 +-14 +2 +-14 +0 +-17 +-1 +-16 +1 +-14 +1 +-14 +2 +-16 +-1 +-16 +1 +-15 +1 +-14 +0 +-16 +-1 +-17 +1 +-14 +1 +-13 +1 +-15 +0 +-16 +1 +-14 +2 +-13 +1 +-14 +2 +-14 +2 +-13 +2 +-13 +3 +-13 +3 +-13 +3 +-13 +2 +-15 +1 +-16 +1 +-16 +0 +-14 +1 +-15 +0 +-16 +0 +-16 +2 +-13 +2 +-13 +3 +-14 +2 +-14 +3 +-12 +4 +-12 +2 +-14 +2 +-15 +3 +-13 +2 +-13 +1 +-15 +1 +-14 +1 +-13 +3 +-13 +1 +-16 +1 +-16 +1 +-14 +2 +-15 +1 +-15 +0 +-15 +1 +-14 +2 +-14 +0 +-17 +0 +-15 +1 +-14 +1 +-14 +0 +-16 +0 +-15 +1 +-14 +1 +-14 +1 +-16 +0 +-15 +1 +-12 +2 +-14 +-1 +-16 +-1 +-17 +1 +-14 +0 +-16 +-1 +-17 +-1 +-17 +0 +-15 +0 +-16 +-2 +-17 +-1 +-17 +0 +-15 +1 +-15 +0 +-18 +-1 +-16 +0 +-15 +1 +-15 +0 +-17 +0 +-16 +0 +-14 +1 +-15 +0 +-17 +-1 +-16 +0 +-14 +1 +-16 +0 +-16 +-1 +-16 +1 +-14 +1 +-14 +-1 +-16 +0 +-16 +1 +-14 +1 +-15 +1 +-15 +0 +-16 +1 +-14 +1 +-14 +1 +-16 +0 +-16 +1 +-14 +2 +-16 +0 +-16 +-1 +-16 +1 +-15 +1 +-15 +1 +-16 +1 +-16 +0 +-14 +1 +-16 +0 +-17 +1 +-16 +1 +-14 +1 +-14 +0 +-16 +0 +-17 +0 +-14 +2 +-15 +-1 +-16 +1 +-17 +1 +-14 +1 +-15 +0 +-16 +0 +-16 +1 +-15 +1 +-15 +1 +-17 +-1 +-17 +1 +-14 +1 +-15 +0 +-16 +0 +-16 +1 +-14 +1 +-15 +0 +-16 +0 +-16 +0 +-14 +2 +-15 +0 +-15 +0 +-16 +2 +-32 +-59 +-10 +-12 +9 +-9 +3 +-15 +2 +-12 +4 +-10 +5 +-10 +5 +-11 +56 +30 +-4 +-4 +-21 +-6 +-20 +-1 +-17 +-2 +-18 +-2 +-18 +-3 +-18 +-1 +-15 +-1 +-17 +-2 +-17 +-3 +-17 +0 +-15 +1 +-15 +-1 +-17 +-1 +-16 +0 +-33 +-60 +-11 +-13 +9 +-9 +3 +-15 +2 +-13 +5 +-11 +5 +-11 +5 +-11 +57 +30 +-3 +-4 +-22 +-4 +-18 +-1 +-16 +-1 +-17 +-2 +-18 +-1 +-16 +0 +-14 +1 +-14 +0 +-16 +1 +-15 +2 +-13 +2 +-14 +1 +-16 +0 +-16 +0 +-16 +1 +-15 +-1 +-17 +-1 +-17 +0 +-15 +1 +-15 +1 +-16 +0 +-15 +2 +-31 +-59 +-10 +-11 +11 +-9 +4 +-15 +3 +-12 +4 +-10 +5 +-11 +5 +-9 +7 +-9 +5 +-12 +3 +-12 +3 +-14 +3 +-12 +3 +-14 +1 +-15 +1 +-15 +54 +28 +-6 +-6 +-23 +-6 +-20 +-3 +-18 +-2 +-17 +-3 +-19 +-2 +-18 +-1 +-15 +0 +-17 +-2 +-18 +-2 +-18 +-1 +-16 +0 +-15 +0 +-17 +-1 +-16 +1 +-33 +-60 +-11 +-12 +9 +-10 +2 +-15 +1 +-14 +4 +-11 +4 +-11 +4 +-11 +57 +30 +-4 +-5 +-22 +-4 +-18 +-2 +-17 +-2 +-17 +-3 +-19 +-2 +-18 +-1 +-16 +-1 +-16 +-1 +-17 +-1 +-16 +0 +-15 +0 +-17 +-2 +-18 +-2 +-18 +0 +-15 +0 +-16 +-2 +-18 +-1 +-16 +1 +-14 +1 +-14 +1 +-16 +0 +-15 +2 +-14 +1 +-14 +1 +-16 +1 +-15 +1 +-14 +1 +-14 +0 +-16 +0 +-15 +1 +-32 +-60 +-10 +-12 +10 +-9 +3 +-15 +1 +-14 +4 +-11 +4 +-11 +5 +-10 +6 +-9 +4 +-13 +2 +-14 +2 +-13 +3 +-13 +2 +-15 +1 +-15 +1 +-15 +3 +-13 +1 +-15 +0 +-16 +0 +-15 +2 +-14 +2 +-15 +0 +-15 +1 +-15 +2 +-14 +1 +-15 +1 +-16 +0 +-16 +2 +-14 +0 +-16 +-1 +-17 +-1 +-16 +-1 +-15 +0 +-18 +-1 +-17 +-2 +-16 +0 +-15 +0 +-16 +0 +-17 +0 +-16 +2 +-13 +1 +-17 +-1 +-17 +-1 +-16 +1 +-14 +0 +-15 +1 +-16 +-1 +-16 +52 +27 +-7 +-9 +-27 +-9 +-23 +-5 +-20 +-3 +-18 +-4 +-19 +-3 +-18 +-1 +-17 +0 +-16 +-2 +-18 +-1 +-17 +0 +-16 +0 +-15 +-1 +-16 +-1 +-17 +0 +-15 +0 +-14 +1 +-16 +0 +-16 +1 +-15 +0 +-14 +0 +-16 +-1 +-16 +0 +-33 +-61 +-11 +-12 +10 +-9 +3 +-15 +2 +-14 +5 +-11 +4 +-11 +4 +-10 +57 +31 +-3 +-5 +-21 +-5 +-18 +-3 +-16 +-1 +-17 +-3 +-18 +-2 +-18 +0 +-16 +0 +-17 +-1 +-17 +-1 +-18 +-1 +-15 +0 +-15 +0 +-17 +-1 +-16 +1 +-33 +-59 +-11 +-14 +10 +-11 +2 +-15 +1 +-13 +3 +-11 +5 +-11 +4 +-10 +57 +29 +-5 +-4 +-21 +-5 +-19 +-3 +-18 +-1 +-18 +-3 +-19 +-3 +-18 +-1 +-15 +0 +-15 +-1 +-18 +-2 +-16 +0 +-15 +0 +-16 +0 +-17 +0 +-16 +1 +-15 +1 +-14 +0 +-17 +0 +-16 +0 +-15 +1 +-14 +0 +-17 +1 +-16 +1 +-14 +1 +-14 +-1 +-17 +-1 +-15 +0 +-14 +0 +-15 +1 +-16 +-1 +-16 +1 +-33 +-60 +-9 +-12 +9 +-9 +3 +-14 +3 +-13 +4 +-10 +4 +-11 +5 +-10 +57 +31 +-3 +-5 +-22 +-5 +-19 +-1 +-17 +-2 +-18 +-2 +-18 +-3 +-18 +-1 +-16 +-1 +-17 +-2 +-18 +-1 +-17 +0 +-15 +0 +-14 +-1 +-17 +-1 +-16 +1 +-32 +-60 +-10 +-12 +9 +-10 +3 +-15 +2 +-14 +4 +-12 +5 +-11 +5 +-10 +5 +-10 +4 +-13 +1 +-15 +0 +-15 +1 +-14 +0 +-16 +1 +-16 +1 +-15 +3 +-13 +1 +-15 +0 +-16 +0 +-15 +2 +-13 +1 +-16 +1 +-16 +0 +-15 +54 +29 +-5 +-7 +-25 +-6 +-21 +-3 +-18 +-1 +-17 +-3 +-19 +-3 +-18 +-1 +-16 +-1 +-16 +-2 +-18 +-2 +-17 +0 +-15 +0 +-15 +-1 +-16 +0 +-17 +0 +-15 +1 +-16 +-1 +-17 +0 +-17 +1 +-15 +2 +-15 +1 +-16 +0 +-15 +1 +-15 +1 +-15 +0 +-16 +0 +-16 +0 +-15 +1 +-14 +0 +-16 +-1 +-16 +1 +-14 +1 +-14 +0 +-16 +1 +-14 +2 +-14 +2 +-14 +2 +-14 +1 +-14 +3 +-30 +-57 +-10 +-13 +9 +-10 +4 +-15 +1 +-13 +5 +-10 +7 +-9 +7 +-7 +59 +31 +-3 +-5 +-22 +-5 +-19 +-3 +-18 +-1 +-17 +-1 +-17 +-1 +-17 +1 +-14 +1 +-15 +0 +-16 +-1 +-16 +1 +-14 +2 +-14 +0 +-16 +1 +-15 +2 +-14 +2 +-14 +1 +-15 +-1 +-15 +2 +-15 +1 +-15 +1 +-16 +0 +-15 +1 +-15 +2 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +0 +-16 +0 +-16 +1 +-15 +1 +-15 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +1 +-16 +-1 +-15 +2 +-14 +1 +-15 +0 +-17 +1 +-15 +1 +-14 +1 +-14 +1 +-15 +0 +-15 +1 +-14 +2 +-13 +1 +-16 +1 +-16 +1 +-14 +2 +-15 +0 +-16 +0 +-16 +1 +-14 +1 +-15 +0 +-17 +0 +-16 +0 +-14 +2 +-14 +0 +-16 +-1 +-16 +1 +-14 +0 +-15 +-1 +-16 +-1 +-16 +0 +-16 +1 +-15 +-1 +-18 +-2 +-17 +0 +-15 +1 +-16 +-2 +-17 +-1 +-17 +0 +-15 +1 +-15 +0 +-16 +1 +-14 +2 +-12 +2 +-13 +1 +-15 +0 +-15 +2 +-14 +2 +-13 +1 +-16 +1 +-14 +2 +-13 +2 +-13 +1 +-15 +1 +-16 +2 +-14 +2 +-14 +1 +-15 +1 +-16 +2 +-14 +1 +-14 +0 +-16 +1 +-15 +2 +-14 +2 +-15 +1 +-16 +0 +-15 +1 +-14 +1 +-14 +0 +-16 +0 +-16 +1 +-14 +2 +-15 +1 +-16 +-1 +-16 +1 +-14 +2 +-14 +0 +-16 +0 +-15 +1 +-14 +2 +-15 +0 +-17 +0 +-16 +1 +-14 +1 +-14 +0 +-16 +0 +-16 +1 +-15 +2 +-14 +-1 +-17 +0 +-16 +-1 +-16 +0 +-16 +-1 +-17 +0 +-15 +2 +-14 +2 +-13 +0 +-15 +1 +-15 +1 +-14 +2 +-14 +0 +-15 +0 +-16 +1 +-14 +2 +-14 +1 +-16 +1 +-16 +1 +-13 +1 +-15 +0 +-16 +1 +-16 +1 +-14 +2 +-15 +1 +-16 +0 +-16 +1 +-14 +1 +-14 +0 +-16 +1 +-15 +1 +-14 +1 +-14 +1 +-16 +0 +-16 +1 +-15 +2 +-14 +0 +-16 +0 +-16 +0 +-14 +1 +-14 +0 +-15 +0 +-16 +1 +-14 +1 +-15 +1 +-16 +1 +-15 +1 +-14 +1 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-15 +0 +-17 +0 +-16 +1 +-14 +1 +-14 +-1 +-17 +1 +-16 +1 +-14 +1 +-14 +1 +-16 +-1 +-16 +1 +-15 +1 +-15 +-1 +-18 +-2 +-17 +0 +-15 +0 +-16 +-1 +-17 +-1 +-16 +1 +-15 +2 +-14 +1 +-16 +1 +-15 +2 +-12 +2 +-14 +1 +-16 +1 +-15 +2 +-13 +2 +-13 +1 +-16 +1 +-16 +1 +-13 +2 +-14 +1 +-16 +0 +-15 +1 +-13 +2 +-14 +0 +-15 +0 +-16 +1 +-15 +2 +-15 +1 +-16 +0 +-16 +0 +-14 +2 +-15 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +1 +-16 +0 +-15 +0 +-14 +1 +-14 +1 +-16 +0 +-16 +1 +-14 +1 +-15 +0 +-17 +1 +-15 +1 +-14 +1 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +0 +-16 +0 +-16 +1 +-15 +1 +-14 +1 +-16 +0 +-15 +1 +-14 +2 +-14 +0 +-16 +-1 +-16 +1 +-15 +0 +-16 +-1 +-17 +-1 +-16 +-1 +-15 +1 +-14 +1 +-15 +1 +-15 +2 +-13 +2 +-14 +1 +-15 +1 +-14 +1 +-13 +3 +-14 +1 +-15 +1 +-15 +1 +-14 +1 +-15 +1 +-16 +0 +-15 +1 +-14 +2 +-15 +1 +-16 +0 +-16 +1 +-14 +1 +-15 +0 +-16 +0 +-15 +2 +-14 +1 +-15 +0 +-17 +0 +-15 +1 +-14 +2 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +1 +-17 +0 +-16 +1 +-14 +2 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-15 +0 +-16 +0 +-16 +1 +-15 +1 +-15 +0 +-16 +0 +-16 +1 +-14 +1 +-15 +1 +-16 +0 +-16 +1 +-14 +1 +-15 +0 +-16 +0 +-16 +0 +-14 +1 +-15 +0 +-16 +-1 +-17 +0 +-16 +-1 +-16 +-1 +-17 +-1 +-17 +-1 +-15 +0 +-17 +-1 +-16 +0 +-15 +2 +-12 +2 +-13 +2 +-15 +1 +-15 +2 +-12 +3 +-13 +0 +-15 +1 +-15 +2 +-14 +1 +-14 +1 +-16 +1 +-15 +1 +-32 +-59 +-10 +-12 +9 +-9 +4 +-15 +2 +-13 +5 +-10 +4 +-11 +5 +-10 +58 +31 +-3 +-4 +-22 +-4 +-19 +-2 +-17 +-1 +-17 +-2 +-18 +-2 +-18 +-1 +-34 +-62 +-12 +-13 +8 +-11 +2 +-16 +0 +-14 +3 +-12 +3 +-12 +4 +-11 +57 +29 +-4 +-5 +-23 +-5 +-20 +-2 +-17 +-1 +-17 +-3 +-19 +-2 +-19 +-1 +-34 +-61 +-13 +-15 +8 +-12 +2 +-16 +0 +-15 +3 +-11 +3 +-12 +4 +-11 +6 +-10 +2 +-14 +1 +-15 +0 +-15 +1 +-14 +1 +-15 +0 +-15 +1 +-14 +54 +29 +-5 +-7 +-24 +-6 +-21 +-3 +-18 +-2 +-17 +-2 +-19 +-2 +-17 +-1 +-15 +0 +-16 +-1 +-17 +-2 +-17 +-1 +-15 +1 +-16 +-1 +-17 +0 +-16 +1 +-15 +0 +-15 +0 +-16 +0 +-16 +0 +-14 +1 +-14 +0 +-16 +0 +-16 +1 +-15 +1 +-14 +0 +-16 +-1 +-16 +0 +-15 +1 +-14 +-1 +-16 +0 +-16 +1 +-14 +1 +-15 +1 +-16 +0 +-16 +1 +-14 +1 +-14 +0 +-16 +0 +-16 +1 +-13 +2 +-14 +1 +-16 +0 +-16 +1 +-14 +1 +-14 +0 +-16 +1 +-15 +0 +-15 +1 +-15 +0 +-16 +1 +-16 +1 +-14 +1 +-14 +0 +-17 +0 +-16 +-1 +-16 +1 +-16 +-1 +-17 +-1 +-16 +1 +-15 +1 +-15 +1 +-16 +1 +-15 +1 +-13 +2 +-13 +0 +-16 +1 +-16 +2 +-13 +1 +-15 +1 +-16 +0 +-15 +2 +-13 +2 +-14 +-1 +-16 +1 +-16 +1 +-15 +2 +-14 +0 +-15 +1 +-16 +2 +-14 +2 +-14 +0 +-16 +-1 +-15 +1 +-14 +2 +-14 +0 +-16 +1 +-16 +2 +-13 +2 +-14 +0 +-16 +-1 +-16 +1 +-14 +2 +-15 +0 +-17 +0 +-16 +1 +-14 +2 +-14 +1 +-16 +0 +-16 +1 +-15 +1 +-14 +0 +-16 +0 +-15 +1 +-14 +2 +-15 +0 +-17 +0 +-16 +1 +-15 +1 +-15 +0 +-16 +0 +-16 +1 +-15 +2 +-14 +0 +-16 +0 +-16 +1 +-15 +0 +-15 +0 +-18 +-1 +-17 +0 +-16 +0 +-16 +-1 +-18 +-1 +-17 +1 +-15 +2 +-14 +2 +-15 +1 +-15 +2 +-14 +2 +-14 +1 +-16 +1 +-16 +2 +-13 +2 +-14 +1 +-15 +0 +-15 +2 +-13 +2 +-14 +0 +-16 +0 +-16 +2 +-14 +2 +-14 +0 +-16 +1 +-16 +2 +-13 +1 +-14 +0 +-16 +-1 +-15 +1 +-14 +2 +-14 +0 +-16 +0 +-15 +2 +-14 +2 +-14 +1 +-15 +-1 +-15 +1 +-14 +2 +-14 +0 +-16 +0 +-16 +1 +-14 +2 +-15 +1 +-16 +-1 +-15 +1 +-14 +1 +-14 +0 +-16 +0 +-15 +1 +-14 +2 +-15 +-1 +-17 +-1 +-16 +1 +-14 +1 +-15 +1 +-16 +0 +-16 +2 +-13 +1 +-14 +0 +-16 +-1 +-16 +0 +-15 +1 +-15 +-1 +-18 +-1 +-16 +0 +-15 +1 +-15 +-1 +-17 +-1 +-16 +2 +-13 +2 +-14 +1 +-15 +1 +-15 +2 +-13 +2 +-14 +0 +-15 +1 +-15 +2 +-13 +3 +-13 +1 +-15 +0 +-16 +2 +-12 +2 +-14 +0 +-16 +0 +-16 +1 +-15 +2 +-15 +0 +-16 +1 +-16 +1 +-14 +1 +-14 +1 +-16 +0 +-16 +1 +-15 +1 +-15 +0 +-16 +0 +-15 +1 +-14 +2 +-14 +1 +-16 +-1 +-15 +1 +-15 +1 +-15 +0 +-17 +1 +-16 +1 +-14 +1 +-15 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +1 +-17 +0 +-16 +1 +-14 +1 +-15 +0 +-16 +0 +-17 +0 +-14 +1 +-15 +1 +-16 +0 +-15 +1 +-15 +1 +-15 +-1 +-16 +0 +-17 +-1 +-16 +0 +-17 +-1 +-18 +-1 +-17 +1 +-13 +3 +-13 +1 +-16 +0 +-15 +1 +-14 +2 +-14 +1 +-15 +-1 +-15 +2 +-14 +2 +-14 +1 +-15 +0 +-15 +1 +-13 +3 +-14 +0 +-15 +0 +-15 +2 +-13 +2 +-15 +0 +-17 +0 +-16 +1 +-15 +1 +-14 +-1 +-16 +0 +-15 +1 +-13 +2 +-14 +1 +-16 +0 +-16 +1 +-14 +2 +-14 +1 +-16 +0 +-15 +1 +-32 +-60 +-11 +-13 +10 +-9 +3 +-15 +2 +-13 +4 +-10 +4 +-11 +5 +-10 +57 +30 +-4 +-5 +-22 +-5 +-19 +-2 +-17 +-1 +-17 +-2 +-19 +-2 +-18 +-1 +-16 +0 +-17 +-2 +-19 +-1 +-17 +0 +-16 +0 +-15 +-1 +-17 +-1 +-16 +1 +-33 +-60 +-11 +-14 +7 +-11 +1 +-17 +1 +-15 +2 +-13 +4 +-12 +3 +-12 +56 +29 +-5 +-6 +-23 +-6 +-19 +-3 +-17 +-2 +-18 +-3 +-19 +-4 +-19 +-1 +-17 +-1 +-16 +-1 +-18 +-1 +-16 +0 +-15 +1 +-14 +0 +-15 +0 +-15 +2 +-13 +2 +-14 +1 +-16 +0 +-16 +2 +-13 +1 +-14 +0 +-16 +1 +-15 +1 +-32 +-60 +-10 +-12 +11 +-8 +3 +-14 +2 +-14 +5 +-10 +4 +-10 +5 +-10 +7 +-9 +5 +-12 +3 +-13 +1 +-13 +3 +-13 +2 +-15 +0 +-15 +1 +-15 +54 +28 +-6 +-8 +-24 +-7 +-21 +-3 +-17 +-2 +-17 +-2 +-19 +-3 +-18 +-1 +-16 +-1 +-16 +-2 +-18 +-2 +-17 +-1 +-16 +0 +-16 +-1 +-16 +-2 +-16 +0 +-33 +-61 +-12 +-14 +8 +-11 +2 +-16 +1 +-14 +3 +-10 +5 +-11 +4 +-10 +57 +31 +-3 +-5 +-22 +-5 +-18 +-1 +-16 +-1 +-17 +-3 +-18 +-2 +-18 +0 +-16 +0 +-16 +-1 +-17 +-1 +-16 +1 +-15 +0 +-15 +-1 +-17 +-1 +-16 +0 +-14 +1 +-15 +-1 +-16 +-1 +-16 +0 +-14 +1 +-15 +0 +-17 +0 +-16 +1 +-14 +1 +-15 +-1 +-16 +-1 +-16 +1 +-14 +1 +-14 +1 +-17 +0 +-16 +1 +-32 +-60 +-10 +-13 +10 +-10 +3 +-15 +2 +-14 +4 +-11 +5 +-11 +5 +-10 +5 +-9 +5 +-13 +3 +-14 +2 +-15 +3 +-12 +1 +-15 +1 +-16 +1 +-15 +2 +-13 +0 +-16 +0 +-16 +0 +-15 +2 +-14 +1 +-15 +0 +-17 +0 +-17 +1 +-15 +0 +-17 +-1 +-17 +0 +-16 +1 +-14 +1 +-15 +1 +-14 +1 +-14 +3 +-13 +1 +-15 +0 +-15 +1 +-15 +2 +-12 +2 +-15 +1 +-15 +0 +-15 +3 +-14 +2 +-15 +0 +-15 +0 +-15 +3 +-13 +2 +-14 +0 +-15 +1 +-15 +54 +29 +-6 +-7 +-25 +-7 +-22 +-3 +-18 +-2 +-17 +-3 +-19 +-3 +-18 +-2 +-16 +0 +-16 +-1 +-18 +-1 +-18 +0 +-16 +0 +-16 +0 +-17 +-1 +-17 +1 +-14 +1 +-14 +-1 +-16 +0 +-17 +1 +-14 +1 +-15 +0 +-17 +0 +-15 +1 +-33 +-60 +-11 +-13 +10 +-10 +3 +-15 +1 +-13 +4 +-11 +5 +-11 +5 +-10 +57 +29 +-4 +-4 +-23 +-4 +-19 +-3 +-17 +-2 +-18 +-3 +-19 +-4 +-20 +-3 +-17 +-2 +-17 +-2 +-18 +-1 +-16 +0 +-15 +1 +-15 +-1 +-16 +0 +-16 +2 +-31 +-60 +-10 +-12 +10 +-9 +4 +-14 +2 +-13 +5 +-11 +5 +-11 +4 +-10 +57 +30 +-4 +-5 +-22 +-5 +-18 +-2 +-17 +-1 +-17 +-2 +-19 +-2 +-18 +0 +-15 +0 +-16 +-2 +-18 +-1 +-17 +0 +-15 +0 +-16 +0 +-17 +-1 +-16 +1 +-15 +1 +-15 +-1 +-16 +0 +-16 +1 +-14 +1 +-15 +0 +-17 +0 +-17 +1 +-14 +2 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +0 +-16 +0 +-16 +1 +-32 +-60 +-10 +-12 +9 +-10 +3 +-16 +1 +-13 +4 +-11 +5 +-11 +5 +-10 +57 +30 +-4 +-5 +-22 +-5 +-20 +-4 +-19 +-3 +-19 +-4 +-20 +-3 +-19 +-1 +-16 +-1 +-17 +-1 +-17 +-1 +-16 +1 +-14 +1 +-15 +-1 +-16 +0 +-16 +1 +-32 +-60 +-10 +-13 +9 +-10 +3 +-15 +1 +-13 +5 +-11 +5 +-10 +5 +-10 +7 +-9 +5 +-12 +3 +-14 +2 +-14 +3 +-12 +2 +-15 +1 +-15 +1 +-15 +3 +-13 +1 +-16 +0 +-16 +1 +-15 +2 +-13 +1 +-15 +0 +-16 +0 +-14 +53 +27 +-6 +-8 +-25 +-7 +-21 +-3 +-18 +-2 +-18 +-3 +-19 +-3 +-18 +-1 +-17 +0 +-16 +-1 +-17 +-2 +-17 +-1 +-15 +1 +-16 +-1 +-16 +0 +-17 +1 +-16 +1 +-16 +0 +-17 +0 +-16 +1 +-15 +1 +-15 +0 +-17 +-1 +-16 +1 +-15 +1 +-15 +-1 +-18 +-3 +-17 +-1 +-17 +-1 +-15 +0 +-16 +1 +-16 +2 +-13 +1 +-14 +1 +-15 +0 +-15 +2 +-14 +3 +-13 +1 +-15 +1 +-15 +2 +-31 +-59 +-11 +-12 +10 +-10 +4 +-14 +1 +-13 +4 +-10 +5 +-11 +5 +-11 +57 +29 +-4 +-5 +-22 +-4 +-19 +-1 +-17 +-1 +-17 +-2 +-18 +-2 +-17 +-1 +-16 +0 +-16 +-2 +-17 +-1 +-17 +0 +-16 +1 +-16 +-1 +-17 +-1 +-16 +1 +-15 +1 +-15 +0 +-16 +0 +-16 +0 +-14 +1 +-15 +0 +-15 +0 +-16 +1 +-15 +1 +-15 +0 +-17 +1 +-15 +1 +-14 +1 +-15 +0 +-16 +-1 +-16 +1 +-14 +0 +-14 +1 +-16 +0 +-16 +1 +-14 +1 +-15 +0 +-16 +0 +-16 +1 +-15 +-1 +-16 +-1 +-17 +-2 +-17 +0 +-16 +0 +-15 +-1 +-16 +0 +-16 +2 +-13 +3 +-14 +2 +-15 +0 +-15 +1 +-15 +1 +-15 +-1 +-17 +-1 +-17 +0 +-15 +1 +-16 +-1 +-17 +-1 +-17 +0 +-15 +1 +-15 +0 +-17 +-1 +-16 +0 +-15 +1 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +-1 +-17 +-1 +-16 +2 +-13 +3 +-15 +-1 +-18 +-1 +-16 +1 +-15 +0 +-15 +-1 +-18 +-1 +-16 +0 +-14 +0 +-15 +0 +-17 +1 +-16 +1 +-15 +1 +-15 +0 +-16 +-1 +-15 +1 +-14 +1 +-15 +1 +-16 +0 +-16 +0 +-14 +0 +-16 +0 +-16 +1 +-15 +1 +-15 +1 +-15 +1 +-16 +1 +-16 +0 +-14 +2 +-15 +-1 +-18 +-1 +-18 +0 +-15 +1 +-15 +0 +-15 +0 +-15 +2 +-14 +2 +-14 +1 +-16 +1 +-15 +0 +-14 +2 +-14 +0 +-16 +0 +-15 +1 +-15 +2 +-15 +-1 +-16 +0 +-15 +2 +-13 +3 +-13 +2 +-15 +1 +-15 +2 +-13 +5 +-12 +3 +-13 +2 +-14 +3 +-13 +3 +-13 +1 +-15 +1 +-14 +2 +-13 +3 +-13 +2 +-15 +1 +-14 +3 +-13 +3 +-14 +1 +-15 +1 +-14 +1 +-13 +3 +-14 +1 +-15 +0 +-15 +2 +-13 +2 +-14 +1 +-16 +0 +-15 +1 +-14 +2 +-14 +1 +-16 +1 +-16 +2 +-14 +2 +-14 +0 +-17 +0 +-16 +1 +-15 +1 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +0 +-16 +-1 +-16 +1 +-15 +1 +-16 +-2 +-18 +-1 +-17 +-1 +-16 +1 +-15 +-1 +-17 +-1 +-17 +0 +-16 +1 +-14 +1 +-16 +1 +-14 +2 +-13 +2 +-14 +2 +-15 +1 +-15 +2 +-14 +2 +-14 +1 +-16 +1 +-15 +1 +-13 +3 +-13 +1 +-16 +1 +-15 +1 +-14 +2 +-14 +1 +-15 +-1 +-15 +1 +-14 +2 +-13 +1 +-16 +1 +-16 +1 +-14 +1 +-14 +1 +-16 +-1 +-15 +1 +-13 +1 +-14 +0 +-16 +0 +-16 +1 +-14 +2 +-14 +0 +-16 +0 +-16 +2 +-13 +1 +-14 +0 +-16 +0 +-16 +1 +-15 +1 +-15 +0 +-16 +0 +-16 +2 +-13 +2 +-15 +1 +-17 +0 +-15 +1 +-15 +1 +-14 +0 +-16 +1 +-16 +0 +-14 +2 +-14 +0 +-16 +0 +-16 +1 +-15 +0 +-17 +-2 +-18 +-1 +-17 +0 +-15 +1 +-14 +1 +-16 +1 +-16 +1 +-13 +2 +-14 +1 +-15 +1 +-15 +1 +-14 +2 +-14 +1 +-16 +1 +-14 +2 +-14 +2 +-14 +1 +-16 +1 +-16 +1 +-14 +2 +-14 +0 +-16 +0 +-16 +1 +-14 +2 +-15 +0 +-15 +0 +-16 +2 +-14 +1 +-14 +0 +-16 +0 +-15 +0 +-14 +1 +-14 +1 +-16 +0 +-15 +2 +-14 +2 +-14 +0 +-16 +0 +-15 +1 +-14 +1 +-14 +0 +-16 +1 +-16 +1 +-14 +1 +-15 +1 +-16 +0 +-15 +1 +-14 +1 +-14 +-1 +-16 +0 +-15 +1 +-14 +1 +-15 +1 +-16 +-1 +-15 +1 +-13 +1 +-14 +1 +-16 +0 +-16 +1 +-14 +1 +-15 +0 +-17 +-1 +-16 +1 +-15 +1 +-15 +0 +-18 +0 +-16 +0 +-15 +1 +-15 +0 +-17 +-1 +-17 +0 +-15 +0 +-15 +0 +-16 +1 +-14 +2 +-13 +2 +-14 +1 +-16 +1 +-15 +1 +-13 +2 +-13 +1 +-15 +1 +-15 +2 +-13 +1 +-14 +1 +-16 +1 +-15 +1 +-14 +1 +-14 +1 +-16 +1 +-16 +2 +-13 +2 +-14 +0 +-17 +0 +-16 +1 +-14 +2 +-14 +1 +-15 +1 +-15 +2 +-13 +1 +-15 +0 +-17 +0 +-16 +1 +-14 +1 +-14 +0 +-15 +0 +-16 +1 +-33 +-60 +-11 +-12 +9 +-9 +4 +-14 +2 +-13 +4 +-11 +5 +-11 +4 +-11 +57 +31 +-3 +-4 +-22 +-4 +-19 +-2 +-17 +-2 +-17 +-3 +-19 +-3 +-19 +-1 +-34 +-62 +-13 +-15 +7 +-12 +-1 +-18 +-1 +-16 +2 +-12 +2 +-13 +3 +-12 +56 +29 +-4 +-5 +-22 +-4 +-19 +-1 +-15 +-1 +-16 +-2 +-18 +-1 +-17 +0 +-33 +-61 +-11 +-14 +9 +-10 +2 +-16 +1 +-15 +4 +-11 +4 +-11 +5 +-10 +6 +-10 +4 +-12 +2 +-14 +2 +-15 +3 +-13 +2 +-15 +1 +-15 +1 +-15 +53 +28 +-6 +-7 +-24 +-6 +-20 +-3 +-18 +-1 +-18 +-3 +-19 +-3 +-18 +-1 +-16 +0 +-16 +-1 +-18 +-2 +-18 +-1 +-16 +1 +-16 +-1 +-17 +0 +-17 +0 +-15 +1 +-16 +0 +-17 +-1 +-17 +1 +-16 +1 +-15 +0 +-16 +-1 +-15 +1 +-14 +1 +-15 +0 +-16 +-1 +-16 +1 +-14 +1 +-15 +0 +-17 +0 +-17 +-1 +-16 +-1 +-16 +-1 +-17 +-1 +-17 +0 +-16 +0 +-16 +-1 +-17 +1 +-15 +1 +-13 +2 +-13 +1 +-16 +1 +-16 +2 +-14 +2 +-13 +2 +-15 +0 +-14 +1 +-14 +2 +-13 +0 +-15 +1 +-15 +2 +-14 +2 +-14 +1 +-16 +0 +-16 +1 +-14 +1 +-15 +1 +-16 +0 +-16 +1 +-14 +2 +-15 +-1 +-16 +0 +-15 +1 +-13 +1 +-14 +1 +-16 +-1 +-16 +1 +-14 +1 +-15 +-1 +-16 +0 +-15 +2 +-13 +2 +-14 +1 +-16 +-1 +-16 +1 +-14 +1 +-15 +0 +-15 +0 +-15 +1 +-15 +1 +-15 +1 +-16 +-1 +-15 +1 +-14 +1 +-14 +1 +-16 +0 +-15 +1 +-14 +2 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-15 +-1 +-18 +-1 +-17 +-1 +-16 +0 +-17 +-1 +-17 +-1 +-17 +0 +-15 +-1 +-16 +0 +-16 +1 +-14 +3 +-13 +3 +-13 +1 +-15 +1 +-15 +2 +-13 +2 +-14 +1 +-16 +0 +-14 +2 +-14 +3 +-13 +1 +-15 +1 +-15 +1 +-13 +1 +-14 +0 +-16 +1 +-16 +2 +-14 +2 +-14 +1 +-16 +0 +-15 +1 +-15 +2 +-15 +0 +-16 +0 +-15 +2 +-13 +1 +-15 +1 +-16 +0 +-16 +1 +-15 +2 +-14 +0 +-16 +0 +-15 +1 +-13 +1 +-15 +0 +-16 +-1 +-16 +1 +-14 +2 +-14 +1 +-16 +0 +-15 +1 +-14 +1 +-15 +1 +-16 +0 +-16 +2 +-14 +1 +-14 +0 +-17 +0 +-15 +1 +-14 +1 +-15 +0 +-16 +-1 +-16 +0 +-14 +1 +-16 +-1 +-17 +-1 +-17 +-1 +-17 +0 +-17 +-1 +-17 +-1 +-17 +0 +-15 +1 +-15 +1 +-16 +1 +-14 +2 +-13 +3 +-13 +1 +-15 +1 +-15 +2 +-14 +2 +-13 +1 +-15 +0 +-15 +2 +-14 +2 +-14 +1 +-15 +1 +-15 +2 +-14 +1 +-14 +1 +-16 +1 +-16 +2 +-13 +2 +-14 +0 +-15 +0 +-15 +1 +-14 +2 +-14 +0 +-16 +1 +-16 +1 +-13 +1 +-15 +0 +-16 +-1 +-15 +1 +-14 +1 +-14 +1 +-16 +0 +-16 +1 +-13 +2 +-15 +-1 +-16 +-1 +-16 +1 +-13 +1 +-14 +0 +-16 +0 +-16 +0 +-14 +2 +-14 +1 +-16 +1 +-16 +1 +-14 +1 +-15 +0 +-16 +0 +-16 +2 +-14 +1 +-14 +0 +-16 +-1 +-17 +-1 +-17 +0 +-16 +-1 +-17 +-1 +-16 +1 +-14 +2 +-13 +0 +-16 +1 +-16 +1 +-13 +1 +-13 +1 +-15 +1 +-15 +1 +-13 +2 +-14 +0 +-16 +1 +-16 +1 +-14 +2 +-15 +1 +-16 +1 +-15 +1 +-14 +1 +-14 +1 +-16 +0 +-15 +1 +-14 +2 +-13 +0 +-16 +1 +-16 +1 +-14 +1 +-14 +0 +-16 +0 +-15 +1 +-14 +1 +-14 +0 +-17 +1 +-16 +1 +-14 +1 +-15 +0 +-16 +-1 +-15 +1 +-14 +1 +-15 +1 +-16 +1 +-15 +1 +-14 +2 +-14 +0 +-16 +-1 +-16 +1 +-14 +1 +-15 +1 +-16 +0 +-16 +1 +-14 +2 +-15 +0 +-16 +1 +-16 +1 +-14 +1 +-15 +0 +-16 +1 +-16 +1 +-33 +-60 +-10 +-13 +8 +-11 +1 +-16 +1 +-14 +4 +-11 +4 +-12 +5 +-10 +57 +30 +-3 +-4 +-22 +-4 +-19 +-2 +-17 +-1 +-17 +-2 +-18 +-3 +-18 +-1 +-15 +0 +-15 +-1 +-17 +-1 +-16 +0 +-15 +1 +-15 +0 +-17 +0 +-16 +1 +-33 +-60 +-10 +-12 +10 +-10 +3 +-15 +2 +-13 +5 +-11 +5 +-10 +5 +-11 +57 +31 +-4 +-5 +-22 +-4 +-19 +-1 +-16 +-1 +-17 +-2 +-19 +-3 +-18 +-1 +-16 +-1 +-16 +-2 +-17 +-1 +-17 +0 +-15 +0 +-15 +-1 +-18 +0 +-16 +1 +-14 +2 +-16 +0 +-16 +0 +-17 +1 +-15 +1 +-14 +0 +-16 +-1 +-16 +1 +-32 +-60 +-10 +-13 +10 +-10 +3 +-15 +2 +-13 +3 +-11 +4 +-11 +5 +-10 +5 +-10 +4 +-13 +2 +-14 +1 +-14 +3 +-13 +1 +-15 +1 +-16 +1 +-15 +53 +27 +-6 +-7 +-25 +-6 +-21 +-4 +-17 +-1 +-18 +-2 +-18 +-2 +-17 +0 +-16 +0 +-16 +-2 +-19 +-1 +-17 +0 +-16 +0 +-16 +-1 +-17 +-1 +-16 +0 +-33 +-60 +-11 +-13 +9 +-10 +3 +-15 +1 +-13 +4 +-11 +4 +-11 +5 +-11 +57 +30 +-5 +-5 +-22 +-5 +-19 +-1 +-17 +-2 +-17 +-3 +-18 +-2 +-18 +-1 +-16 +0 +-16 +-1 +-17 +-1 +-17 +0 +-16 +0 +-16 +-1 +-17 +-1 +-16 +1 +-14 +1 +-15 +0 +-16 +0 +-17 +0 +-15 +-1 +-15 +0 +-16 +0 +-16 +1 +-14 +2 +-14 +0 +-17 +0 +-15 +1 +-14 +1 +-15 +1 +-16 +-1 +-16 +1 +-32 +-60 +-11 +-13 +9 +-10 +3 +-16 +2 +-14 +4 +-10 +4 +-11 +5 +-10 +6 +-10 +4 +-13 +2 +-13 +3 +-14 +3 +-13 +2 +-15 +1 +-15 +1 +-15 +3 +-13 +1 +-15 +0 +-16 +1 +-15 +3 +-13 +1 +-15 +1 +-15 +1 +-15 +2 +-13 +1 +-16 +0 +-15 +0 +-15 +2 +-14 +1 +-15 +1 +-15 +1 +-15 +2 +-13 +1 +-16 +1 +-16 +1 +-15 +1 +-14 +1 +-16 +0 +-16 +0 +-15 +1 +-14 +1 +-16 +0 +-16 +0 +-15 +3 +-13 +1 +-16 +0 +-16 +1 +-15 +54 +29 +-6 +-7 +-25 +-7 +-21 +-3 +-18 +-2 +-18 +-3 +-19 +-3 +-19 +-2 +-16 +-1 +-17 +-3 +-19 +-2 +-17 +-1 +-16 +0 +-16 +-1 +-17 +-1 +-17 +1 +-15 +1 +-15 +0 +-17 +-1 +-16 +0 +-15 +1 +-14 +0 +-16 +0 +-16 +1 +-32 +-60 +-10 +-13 +9 +-10 +4 +-15 +1 +-14 +4 +-11 +5 +-11 +4 +-10 +57 +30 +-3 +-5 +-21 +-4 +-19 +-2 +-17 +-1 +-17 +-3 +-18 +-3 +-18 +-1 +-16 +0 +-16 +-2 +-17 +-1 +-17 +-1 +-15 +1 +-15 +-1 +-17 +-1 +-16 +1 +-32 +-60 +-10 +-12 +9 +-9 +4 +-15 +1 +-13 +5 +-11 +4 +-12 +5 +-10 +56 +30 +-4 +-4 +-22 +-4 +-18 +-3 +-18 +-2 +-17 +-2 +-18 +-3 +-18 +0 +-16 +0 +-17 +-2 +-19 +-1 +-17 +0 +-16 +0 +-15 +-1 +-16 +0 +-17 +0 +-15 +0 +-16 +-1 +-17 +-1 +-16 +1 +-15 +1 +-15 +-1 +-16 +0 +-16 +1 +-15 +2 +-15 +1 +-16 +0 +-16 +1 +-15 +1 +-15 +0 +-15 +1 +-16 +1 +-32 +-60 +-11 +-12 +9 +-10 +3 +-14 +2 +-13 +5 +-11 +5 +-10 +5 +-10 +57 +30 +-3 +-4 +-22 +-5 +-19 +-2 +-16 +-1 +-17 +-3 +-19 +-2 +-18 +-1 +-16 +0 +-16 +-2 +-17 +-1 +-17 +0 +-15 +0 +-16 +0 +-16 +-1 +-16 +1 +-32 +-60 +-11 +-13 +9 +-9 +3 +-15 +2 +-14 +3 +-11 +4 +-11 +5 +-10 +6 +-9 +4 +-12 +2 +-14 +2 +-14 +3 +-12 +1 +-15 +0 +-16 +1 +-15 +2 +-13 +1 +-16 +0 +-16 +1 +-15 +2 +-13 +1 +-15 +1 +-16 +0 +-15 +54 +27 +-6 +-7 +-25 +-7 +-21 +-4 +-19 +-3 +-18 +-3 +-19 +-2 +-18 +-1 +-16 +-1 +-16 +-1 +-18 +-2 +-18 +-1 +-16 +0 +-16 +-1 +-17 +-1 +-17 +0 +-15 +0 +-15 +0 +-16 +-1 +-16 +1 +-15 +1 +-15 +0 +-17 +0 +-15 +1 +-14 +1 +-15 +0 +-16 +1 +-15 +2 +-13 +1 +-13 +1 +-16 +0 +-15 +1 +-14 +1 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +0 +-15 +0 +-15 +1 +-32 +-59 +-10 +-12 +10 +-9 +4 +-15 +1 +-13 +5 +-10 +5 +-11 +5 +-10 +56 +30 +-4 +-5 +-23 +-5 +-18 +-2 +-17 +-1 +-18 +-2 +-19 +-2 +-18 +-1 +-16 +0 +-16 +-1 +-18 +-1 +-17 +-1 +-16 +1 +-15 +-1 +-17 +0 +-17 +0 +-15 +0 +-15 +0 +-17 +-1 +-17 +1 +-15 +1 +-15 +-1 +-17 +0 +-17 +1 +-14 +1 +-15 +0 +-16 +0 +-16 +2 +-14 +2 +-13 +0 +-16 +0 +-15 +1 +-13 +1 +-14 +0 +-16 +0 +-15 +2 +-14 +1 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +0 +-16 +0 +-15 +1 +-14 +1 +-14 +1 +-15 +0 +-16 +1 +-15 +2 +-14 +0 +-16 +0 +-16 +1 +-13 +1 +-14 +1 +-16 +-1 +-16 +1 +-15 +1 +-15 +1 +-16 +1 +-14 +1 +-14 +1 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-15 +0 +-16 +1 +-16 +1 +-14 +1 +-14 +1 +-16 +1 +-16 +2 +-13 +2 +-14 +-1 +-16 +0 +-16 +1 +-14 +2 +-15 +-1 +-17 +-1 +-17 +1 +-14 +1 +-15 +0 +-16 +0 +-15 +1 +-14 +1 +-14 +-1 +-15 +1 +-15 +1 +-13 +1 +-14 +1 +-16 +0 +-15 +1 +-14 +1 +-14 +1 +-16 +0 +-15 +1 +-13 +2 +-15 +1 +-16 +0 +-15 +2 +-14 +1 +-15 +0 +-16 +-1 +-16 +2 +-15 +2 +-15 +1 +-16 +1 +-16 +1 +-14 +1 +-14 +1 +-16 +0 +-15 +1 +-14 +2 +-13 +0 +-16 +0 +-16 +1 +-15 +1 +-15 +1 +-15 +0 +-15 +1 +-13 +1 +-15 +0 +-17 +0 +-16 +1 +-15 +2 +-15 +1 +-15 +0 +-16 +1 +-13 +1 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +-1 +-16 +0 +-16 +2 +-13 +2 +-14 +1 +-16 +-1 +-16 +1 +-15 +1 +-15 +-1 +-16 +0 +-16 +0 +-15 +1 +-16 +0 +-17 +-1 +-16 +1 +-15 +1 +-14 +0 +-16 +1 +-15 +1 +-14 +3 +-14 +1 +-15 +0 +-15 +1 +-14 +1 +-14 +1 +-16 +1 +-15 +1 +-14 +3 +-14 +1 +-16 +1 +-15 +1 +-14 +2 +-14 +1 +-15 +1 +-15 +1 +-14 +1 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +1 +-15 +-1 +-16 +1 +-15 +1 +-15 +0 +-16 +0 +-15 +1 +-13 +1 +-15 +1 +-16 +-1 +-16 +1 +-14 +1 +-14 +1 +-16 +1 +-15 +1 +-14 +1 +-15 +0 +-16 +0 +-16 +1 +-14 +1 +-15 +1 +-17 +0 +-15 +1 +-15 +2 +-15 +0 +-17 +0 +-15 +1 +-13 +2 +-15 +1 +-16 +-1 +-16 +1 +-15 +1 +-15 +0 +-17 +0 +-16 +1 +-14 +3 +-14 +1 +-16 +-1 +-15 +0 +-14 +1 +-13 +0 +-16 +1 +-15 +1 +-14 +2 +-14 +0 +-16 +0 +-16 +1 +-15 +1 +-15 +1 +-16 +1 +-15 +1 +-14 +2 +-14 +0 +-16 +-1 +-16 +1 +-14 +1 +-14 +0 +-15 +1 +-16 +1 +-14 +2 +-14 +0 +-16 +1 +-15 +1 +-14 +1 +-15 +0 +-16 +1 +-16 +1 +-14 +1 +-15 +1 +-16 +1 +-16 +0 +-14 +2 +-14 +1 +-16 +1 +-16 +1 +-13 +2 +-14 +0 +-16 +0 +-16 +1 +-14 +2 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +0 +-15 +-1 +-16 +1 +-15 +1 +-14 +0 +-15 +0 +-16 +1 +-14 +1 +-15 +0 +-17 +-1 +-16 +1 +-15 +1 +-15 +0 +-16 +0 +-16 +1 +-14 +1 +-15 +0 +-15 +1 +-15 +1 +-14 +1 +-14 +1 +-16 +1 +-16 +1 +-14 +1 +-15 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +1 +-16 +1 +-15 +2 +-14 +2 +-14 +0 +-16 +1 +-15 +1 +-14 +2 +-14 +0 +-16 +0 +-16 +1 +-13 +1 +-14 +1 +-16 +0 +-15 +1 +-14 +1 +-14 +1 +-16 +1 +-16 +2 +-13 +1 +-14 +1 +-16 +0 +-15 +1 +-14 +2 +-14 +0 +-16 +0 +-16 +2 +-13 +2 +-14 +1 +-15 +0 +-15 +1 +-15 +1 +-14 +0 +-16 +0 +-16 +0 +-15 +1 +-16 +1 +-16 +0 +-16 +1 +-15 +2 +-15 +0 +-17 +-1 +-16 +1 +-13 +1 +-15 +-1 +-16 +-1 +-16 +1 +-15 +1 +-15 +0 +-16 +1 +-15 +1 +-33 +-60 +-10 +-12 +9 +-9 +3 +-15 +3 +-14 +5 +-10 +4 +-10 +6 +-10 +58 +31 +-3 +-4 +-22 +-4 +-19 +-2 +-17 +-1 +-17 +-2 +-19 +-2 +-18 +-1 +-34 +-61 +-12 +-14 +8 +-11 +2 +-17 +1 +-15 +3 +-12 +4 +-12 +4 +-11 +56 +29 +-4 +-5 +-23 +-5 +-19 +-2 +-18 +-1 +-17 +-3 +-19 +-2 +-19 +-1 +-34 +-61 +-12 +-15 +8 +-11 +2 +-16 +0 +-15 +3 +-13 +3 +-12 +3 +-11 +5 +-9 +4 +-13 +2 +-14 +2 +-14 +2 +-13 +2 +-15 +1 +-16 +1 +-15 +54 +29 +-6 +-7 +-24 +-7 +-20 +-4 +-19 +-3 +-18 +-3 +-19 +-3 +-18 +-2 +-16 +-1 +-17 +-2 +-18 +-2 +-18 +-1 +-16 +0 +-16 +-1 +-18 +-1 +-16 +1 +-14 +1 +-15 +-1 +-16 +-1 +-16 +1 +-14 +0 +-15 +1 +-16 +-1 +-15 +1 +-14 +2 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +1 +-15 +0 +-16 +1 +-14 +1 +-14 +1 +-17 +0 +-15 +1 +-15 +2 +-15 +1 +-15 +0 +-16 +1 +-14 +1 +-14 +0 +-16 +0 +-16 +1 +-14 +2 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-15 +0 +-16 +0 +-15 +2 +-14 +2 +-14 +1 +-16 +0 +-16 +1 +-13 +1 +-14 +0 +-16 +0 +-15 +1 +-15 +1 +-15 +0 +-16 +0 +-15 +1 +-14 +2 +-14 +0 +-16 +1 +-16 +1 +-14 +1 +-15 +0 +-17 +0 +-16 +1 +-14 +2 +-15 +0 +-16 +0 +-16 +2 +-14 +1 +-14 +1 +-16 +0 +-16 +1 +-14 +1 +-14 +1 +-15 +1 +-15 +1 +-14 +1 +-14 +1 +-16 +0 +-16 +2 +-14 +2 +-14 +0 +-16 +-1 +-15 +1 +-13 +1 +-14 +0 +-16 +1 +-15 +1 +-14 +2 +-14 +1 +-16 +1 +-16 +1 +-15 +1 +-14 +0 +-17 +0 +-16 +1 +-14 +2 +-14 +1 +-16 +0 +-16 +1 +-15 +1 +-14 +1 +-16 +1 +-15 +1 +-14 +1 +-15 +1 +-16 +0 +-16 +1 +-14 +2 +-15 +1 +-16 +0 +-15 +1 +-13 +1 +-15 +-1 +-16 +0 +-16 +1 +-14 +1 +-15 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +0 +-16 +0 +-16 +1 +-15 +0 +-15 +0 +-16 +0 +-16 +1 +-14 +2 +-14 +0 +-16 +0 +-16 +1 +-13 +2 +-14 +0 +-16 +-1 +-16 +1 +-15 +1 +-15 +-1 +-16 +1 +-16 +0 +-15 +1 +-14 +1 +-15 +0 +-15 +2 +-13 +2 +-14 +1 +-16 +0 +-15 +1 +-14 +1 +-14 +1 +-16 +1 +-16 +1 +-13 +1 +-14 +1 +-16 +0 +-15 +1 +-14 +1 +-14 +-1 +-16 +1 +-16 +1 +-14 +1 +-15 +0 +-17 +0 +-16 +1 +-14 +1 +-14 +0 +-15 +1 +-16 +1 +-14 +2 +-15 +0 +-15 +-1 +-15 +2 +-14 +1 +-15 +1 +-16 +0 +-16 +0 +-14 +2 +-14 +1 +-16 +1 +-15 +2 +-14 +1 +-15 +0 +-16 +0 +-16 +1 +-14 +2 +-14 +0 +-16 +-1 +-17 +1 +-15 +1 +-15 +0 +-16 +0 +-15 +3 +-12 +3 +-14 +-1 +-17 +0 +-17 +1 +-14 +1 +-14 +1 +-16 +0 +-15 +1 +-14 +2 +-14 +0 +-16 +-1 +-15 +1 +-14 +1 +-15 +1 +-16 +1 +-16 +2 +-13 +2 +-15 +0 +-16 +0 +-15 +1 +-14 +1 +-14 +0 +-16 +1 +-16 +1 +-15 +2 +-15 +0 +-16 +0 +-15 +2 +-14 +2 +-14 +1 +-16 +1 +-16 +1 +-13 +1 +-14 +0 +-15 +0 +-16 +1 +-14 +1 +-15 +0 +-17 +0 +-16 +1 +-14 +1 +-16 +1 +-15 +0 +-16 +1 +-14 +1 +-14 +0 +-16 +0 +-15 +1 +-14 +2 +-15 +0 +-16 +0 +-16 +2 +-13 +1 +-15 +0 +-16 +-1 +-15 +1 +-14 +1 +-15 +-1 +-16 +0 +-16 +1 +-14 +1 +-15 +0 +-16 +-1 +-16 +1 +-14 +1 +-14 +0 +-16 +0 +-16 +1 +-14 +2 +-14 +0 +-16 +-1 +-16 +1 +-14 +1 +-14 +0 +-16 +0 +-15 +1 +-14 +2 +-14 +1 +-15 +0 +-15 +1 +-32 +-59 +-11 +-12 +10 +-9 +3 +-15 +1 +-13 +5 +-11 +4 +-11 +5 +-10 +57 +30 +-4 +-4 +-21 +-6 +-19 +-2 +-16 +-1 +-17 +-2 +-19 +-2 +-17 +-1 +-16 +0 +-17 +-1 +-17 +-1 +-17 +0 +-15 +0 +-15 +0 +-17 +-1 +-17 +0 +-33 +-61 +-11 +-13 +9 +-10 +2 +-14 +2 +-13 +4 +-10 +4 +-11 +5 +-10 +56 +30 +-4 +-5 +-23 +-5 +-19 +-2 +-17 +-1 +-17 +-2 +-19 +-3 +-17 +-1 +-17 +-1 +-17 +-2 +-18 +-2 +-17 +-1 +-15 +0 +-16 +-1 +-17 +-1 +-16 +1 +-14 +1 +-15 +0 +-17 +-1 +-16 +0 +-14 +1 +-16 +0 +-16 +0 +-16 +1 +-32 +-60 +-10 +-12 +10 +-10 +3 +-15 +1 +-13 +5 +-11 +5 +-10 +5 +-10 +7 +-9 +4 +-12 +3 +-13 +2 +-13 +3 +-12 +1 +-15 +0 +-16 +1 +-16 +53 +27 +-6 +-7 +-24 +-7 +-21 +-3 +-18 +-2 +-18 +-2 +-19 +-2 +-18 +-1 +-16 +-1 +-17 +-1 +-18 +-1 +-17 +0 +-15 +-1 +-16 +-1 +-18 +-1 +-16 +1 +-33 +-60 +-11 +-13 +9 +-10 +2 +-15 +1 +-14 +4 +-11 +4 +-11 +5 +-10 +57 +31 +-3 +-5 +-22 +-4 +-18 +-2 +-16 +-1 +-18 +-3 +-19 +-2 +-18 +-1 +-16 +0 +-16 +-2 +-18 +-1 +-17 +0 +-14 +1 +-16 +-1 +-17 +0 +-16 +1 +-15 +1 +-15 +-1 +-17 +-1 +-16 +1 +-14 +1 +-15 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +1 +-15 +1 +-15 +1 +-15 +1 +-14 +1 +-16 +1 +-15 +1 +-32 +-60 +-11 +-13 +9 +-9 +2 +-14 +1 +-14 +4 +-11 +4 +-12 +6 +-11 +6 +-10 +5 +-13 +3 +-14 +2 +-13 +3 +-13 +1 +-15 +0 +-15 +1 +-15 +2 +-14 +1 +-15 +0 +-16 +1 +-15 +3 +-13 +2 +-15 +0 +-16 +0 +-15 +1 +-14 +1 +-15 +1 +-16 +1 +-15 +2 +-14 +1 +-16 +0 +-16 +1 +-14 +2 +-13 +1 +-16 +0 +-16 +0 +-15 +1 +-14 +0 +-16 +0 +-15 +1 +-15 +2 +-13 +2 +-15 +0 +-15 +0 +-16 +1 +-14 +1 +-15 +1 +-16 +0 +-15 +53 +28 +-5 +-7 +-25 +-6 +-21 +-4 +-19 +-3 +-18 +-3 +-19 +-3 +-18 +-1 +-16 +-1 +-17 +-2 +-17 +-1 +-18 +-1 +-16 +0 +-16 +-1 +-17 +-1 +-16 +0 +-14 +1 +-16 +-1 +-17 +0 +-16 +1 +-15 +1 +-15 +1 +-16 +0 +-15 +1 +-32 +-60 +-10 +-13 +9 +-10 +3 +-15 +2 +-13 +4 +-11 +4 +-12 +5 +-11 +58 +31 +-3 +-4 +-22 +-4 +-19 +-2 +-17 +-1 +-18 +-2 +-19 +-3 +-18 +-1 +-16 +0 +-16 +-1 +-18 +-1 +-17 +0 +-15 +1 +-16 +0 +-16 +-1 +-17 +1 +-32 +-60 +-11 +-13 +9 +-11 +3 +-16 +1 +-14 +3 +-11 +4 +-11 +4 +-11 +57 +29 +-4 +-5 +-23 +-5 +-19 +-3 +-18 +-1 +-17 +-3 +-18 +-2 +-17 +0 +-15 +-1 +-16 +-1 +-17 +-2 +-17 +0 +-16 +0 +-16 +-1 +-16 +0 +-15 +1 +-14 +1 +-15 +0 +-17 +-1 +-16 +2 +-14 +1 +-14 +1 +-17 +0 +-16 +1 +-14 +2 +-15 +0 +-16 +0 +-16 +1 +-14 +1 +-15 +1 +-16 +0 +-15 +1 +-32 +-59 +-10 +-12 +9 +-9 +3 +-15 +1 +-13 +4 +-10 +4 +-11 +6 +-10 +57 +30 +-4 +-5 +-22 +-5 +-19 +-2 +-17 +-1 +-17 +-2 +-17 +-3 +-17 +-1 +-16 +0 +-16 +-1 +-18 +-1 +-17 +-1 +-15 +1 +-16 +-1 +-16 +-1 +-17 +1 +-33 +-60 +-12 +-13 +8 +-10 +3 +-16 +1 +-14 +4 +-11 +5 +-11 +5 +-11 +6 +-11 +4 +-12 +2 +-13 +2 +-14 +3 +-12 +1 +-15 +1 +-15 +1 +-14 +3 +-13 +1 +-15 +1 +-16 +1 +-15 +2 +-12 +2 +-15 +1 +-16 +1 +-15 +54 +27 +-6 +-8 +-24 +-7 +-21 +-4 +-18 +-2 +-18 +-2 +-19 +-3 +-18 +-1 +-17 +0 +-16 +-1 +-18 +-1 +-17 +-1 +-15 +0 +-15 +-1 +-17 +-1 +-16 +1 +-14 +1 +-15 +-1 +-17 +0 +-15 +1 +-15 +1 +-15 +0 +-16 +-1 +-16 +0 +-14 +2 +-14 +0 +-17 +0 +-16 +1 +-15 +1 +-15 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +1 +-16 +0 +-16 +1 +-14 +1 +-14 +-1 +-17 +0 +-16 +1 +-32 +-60 +-11 +-13 +9 +-10 +3 +-15 +1 +-13 +4 +-11 +5 +-11 +5 +-10 +58 +31 +-3 +-3 +-22 +-5 +-19 +-1 +-17 +-1 +-17 +-2 +-18 +-3 +-17 +-1 +-16 +0 +-16 +-1 +-18 +-1 +-17 +0 +-16 +0 +-15 +-1 +-17 +0 +-17 +1 +-15 +2 +-15 +0 +-16 +0 +-17 +1 +-14 +1 +-15 +0 +-16 +-1 +-15 +2 +-13 +1 +-15 +0 +-17 +0 +-16 +1 +-14 +1 +-15 +1 +-16 +0 +-16 +1 +-14 +1 +-15 +1 +-16 +1 +-15 +0 +-14 +1 +-14 +1 +-16 +0 +-16 +1 +-14 +1 +-14 +1 +-16 +0 +-15 +1 +-14 +1 +-16 +0 +-17 +-1 +-16 +1 +-14 +1 +-14 +1 +-16 +1 +-16 +1 +-14 +1 +-15 +0 +-16 +-1 +-17 +1 +-14 +1 +-15 +0 +-16 +-1 +-16 +1 +-15 +2 +-15 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +1 +-16 +0 +-15 +1 +-14 +3 +-14 +0 +-15 +0 +-15 +2 +-13 +3 +-15 +-1 +-16 +0 +-16 +2 +-13 +2 +-14 +0 +-15 +-1 +-16 +1 +-14 +1 +-14 +0 +-16 +1 +-15 +1 +-14 +1 +-15 +0 +-16 +-1 +-16 +1 +-14 +1 +-14 +0 +-15 +0 +-16 +1 +-14 +1 +-14 +1 +-16 +-1 +-16 +1 +-14 +2 +-14 +1 +-16 +0 +-16 +1 +-14 +1 +-15 +0 +-16 +0 +-15 +2 +-13 +2 +-15 +0 +-17 +0 +-16 +0 +-14 +2 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-15 +0 +-16 +-1 +-15 +1 +-14 +1 +-15 +-1 +-17 +-1 +-16 +1 +-14 +1 +-15 +0 +-16 +-1 +-16 +1 +-14 +1 +-15 +1 +-16 +1 +-15 +1 +-14 +1 +-15 +0 +-15 +-1 +-15 +1 +-14 +1 +-14 +1 +-16 +1 +-15 +2 +-13 +2 +-14 +1 +-16 +0 +-15 +1 +-14 +2 +-15 +1 +-16 +0 +-15 +2 +-14 +1 +-14 +0 +-16 +0 +-15 +1 +-14 +2 +-14 +1 +-16 +0 +-16 +2 +-13 +2 +-14 +0 +-17 +0 +-15 +0 +-14 +1 +-15 +0 +-16 +-1 +-15 +1 +-14 +2 +-14 +0 +-16 +0 +-15 +1 +-14 +2 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-15 +1 +-17 +1 +-15 +1 +-14 +2 +-15 +0 +-16 +0 +-15 +2 +-14 +1 +-15 +0 +-16 +-1 +-16 +1 +-15 +1 +-15 +0 +-17 +0 +-16 +1 +-13 +1 +-14 +0 +-16 +0 +-16 +1 +-14 +2 +-15 +0 +-16 +1 +-16 +2 +-14 +2 +-15 +1 +-16 +0 +-16 +1 +-14 +1 +-14 +1 +-16 +0 +-16 +2 +-13 +2 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +0 +-16 +-1 +-15 +2 +-14 +1 +-15 +0 +-16 +0 +-16 +1 +-14 +2 +-14 +0 +-15 +0 +-15 +2 +-14 +2 +-14 +1 +-16 +0 +-15 +1 +-14 +1 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-15 +1 +-16 +0 +-15 +1 +-14 +1 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +1 +-16 +0 +-17 +1 +-15 +2 +-15 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +0 +-16 +-1 +-16 +1 +-15 +0 +-15 +0 +-16 +0 +-15 +1 +-13 +2 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +0 +-16 +0 +-16 +0 +-14 +1 +-14 +0 +-15 +0 +-15 +2 +-14 +1 +-14 +1 +-15 +0 +-15 +2 +-13 +1 +-15 +0 +-16 +0 +-15 +1 +-15 +1 +-15 +0 +-16 +0 +-16 +1 +-14 +1 +-15 +1 +-17 +1 +-15 +1 +-14 +2 +-14 +1 +-16 +0 +-16 +1 +-14 +1 +-14 +0 +-17 +0 +-16 +1 +-14 +1 +-14 +0 +-16 +1 +-16 +2 +-14 +1 +-14 +1 +-16 +0 +-16 +1 +-14 +1 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-15 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +0 +-16 +0 +-16 +0 +-15 +1 +-15 +0 +-16 +0 +-16 +1 +-15 +1 +-14 +0 +-16 +1 +-15 +1 +-14 +2 +-15 +0 +-16 +1 +-15 +2 +-13 +1 +-14 +0 +-16 +1 +-14 +1 +-14 +1 +-15 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +0 +-16 +-1 +-16 +1 +-12 +2 +-14 +0 +-17 +0 +-16 +0 +-14 +1 +-14 +0 +-16 +0 +-16 +2 +-31 +-59 +-11 +-13 +10 +-10 +4 +-15 +1 +-13 +3 +-11 +5 +-11 +4 +-10 +58 +29 +-3 +-5 +-22 +-5 +-18 +-2 +-17 +-1 +-17 +-2 +-19 +-2 +-19 +-1 +-34 +-61 +-13 +-15 +7 +-12 +2 +-16 +0 +-15 +3 +-12 +3 +-12 +5 +-11 +57 +30 +-4 +-5 +-21 +-5 +-19 +-3 +-17 +-1 +-18 +-3 +-19 +-3 +-19 +-3 +-35 +-62 +-13 +-15 +7 +-12 +1 +-16 +0 +-15 +3 +-12 +3 +-12 +4 +-11 +5 +-9 +4 +-13 +3 +-13 +2 +-14 +3 +-13 +1 +-15 +1 +-16 +0 +-15 +53 +28 +-6 +-7 +-24 +-6 +-20 +-3 +-18 +-2 +-18 +-2 +-18 +-2 +-18 +-1 +-15 +-1 +-16 +-1 +-18 +-2 +-17 +0 +-15 +0 +-15 +-1 +-16 +-1 +-16 +1 +-15 +0 +-14 +0 +-17 +0 +-16 +1 +-15 +2 +-15 +-1 +-17 +-1 +-16 +0 +-15 +1 +-14 +0 +-16 +0 +-16 +1 +-15 +2 +-15 +0 +-17 +0 +-16 +1 +-14 +2 +-14 +0 +-16 +0 +-16 +1 +-15 +1 +-14 +0 +-16 +0 +-15 +1 +-14 +2 +-15 +1 +-16 +-1 +-16 +1 +-15 +1 +-15 +0 +-17 +0 +-16 +1 +-15 +1 +-15 +0 +-16 +0 +-16 +2 +-14 +1 +-15 +0 +-16 +0 +-15 +2 +-14 +2 +-13 +1 +-16 +0 +-16 +1 +-14 +2 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +1 +-15 +0 +-16 +1 +-14 +1 +-15 +0 +-16 +1 +-16 +2 +-13 +1 +-14 +0 +-16 +0 +-16 +0 +-14 +2 +-14 +0 +-15 +1 +-16 +1 +-14 +1 +-14 +0 +-17 +0 +-16 +1 +-14 +2 +-14 +0 +-15 +0 +-16 +1 +-14 +2 +-14 +0 +-16 +-1 +-15 +1 +-14 +2 +-15 +1 +-16 +0 +-16 +1 +-14 +2 +-14 +1 +-16 +0 +-15 +1 +-15 +1 +-14 +0 +-17 +0 +-16 +1 +-14 +1 +-14 +0 +-16 +0 +-16 +1 +-15 +0 +-15 +-1 +-17 +0 +-16 +1 +-15 +1 +-14 +0 +-16 +0 +-15 +2 +-14 +2 +-14 +1 +-16 +0 +-16 +2 +-14 +2 +-14 +1 +-16 +1 +-16 +1 +-14 +1 +-15 +0 +-16 +0 +-16 +1 +-14 +2 +-14 +1 +-16 +0 +-15 +1 +-14 +1 +-14 +1 +-16 +1 +-16 +1 +-13 +1 +-14 +0 +-16 +0 +-16 +1 +-15 +2 +-14 +0 +-15 +0 +-15 +1 +-14 +2 +-14 +1 +-15 +1 +-15 +1 +-14 +2 +-14 +1 +-16 +1 +-15 +1 +-14 +1 +-14 +-1 +-16 +0 +-16 +1 +-14 +2 +-15 +1 +-16 +0 +-15 +0 +-14 +1 +-15 +0 +-16 +0 +-16 +1 +-14 +1 +-15 +1 +-16 +0 +-16 +1 +-15 +1 +-15 +-1 +-17 +-1 +-16 +1 +-14 +1 +-14 +1 +-16 +0 +-16 +1 +-15 +1 +-14 +0 +-16 +1 +-16 +1 +-14 +1 +-15 +0 +-16 +1 +-16 +2 +-14 +1 +-15 +0 +-16 +0 +-16 +1 +-13 +2 +-14 +0 +-16 +1 +-16 +2 +-14 +2 +-14 +0 +-16 +0 +-16 +2 +-14 +2 +-14 +0 +-16 +0 +-15 +2 +-13 +3 +-15 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +-1 +-16 +-1 +-16 +1 +-14 +1 +-14 +1 +-16 +-1 +-16 +1 +-13 +2 +-14 +1 +-17 +1 +-16 +2 +-14 +2 +-14 +0 +-16 +0 +-16 +1 +-14 +1 +-14 +1 +-16 +0 +-16 +0 +-13 +1 +-15 +-1 +-17 +0 +-16 +1 +-14 +1 +-15 +0 +-16 +0 +-16 +1 +-14 +1 +-15 +-1 +-16 +0 +-16 +0 +-15 +1 +-15 +0 +-16 +-1 +-15 +1 +-15 +1 +-15 +0 +-16 +0 +-16 +1 +-13 +2 +-14 +1 +-15 +0 +-15 +1 +-14 +1 +-15 +0 +-16 +1 +-15 +2 +-14 +1 +-14 +1 +-15 +0 +-15 +1 +-14 +1 +-14 +1 +-15 +0 +-15 +1 +-15 +2 +-14 +0 +-16 +0 +-15 +1 +-14 +2 +-15 +1 +-16 +-1 +-15 +1 +-14 +2 +-14 +1 +-16 +0 +-16 +0 +-14 +2 +-15 +0 +-16 +0 +-16 +1 +-14 +2 +-14 +1 +-16 +0 +-16 +0 +-33 +-61 +-11 +-12 +10 +-9 +4 +-15 +2 +-13 +5 +-11 +3 +-11 +5 +-10 +57 +29 +-4 +-5 +-22 +-5 +-19 +-2 +-17 +-2 +-18 +-3 +-19 +-3 +-18 +-1 +-16 +-1 +-16 +-2 +-18 +-3 +-18 +-1 +-15 +1 +-15 +1 +-16 +-1 +-16 +1 +-33 +-60 +-11 +-12 +9 +-10 +3 +-15 +2 +-13 +4 +-11 +5 +-11 +5 +-10 +57 +31 +-3 +-4 +-21 +-5 +-18 +-1 +-17 +-1 +-17 +-3 +-18 +-2 +-17 +-1 +-16 +0 +-16 +-1 +-17 +-2 +-17 +0 +-15 +1 +-15 +0 +-16 +-1 +-16 +0 +-14 +0 +-15 +0 +-16 +0 +-16 +1 +-14 +1 +-15 +1 +-17 +0 +-16 +0 +-33 +-61 +-11 +-13 +10 +-10 +3 +-15 +1 +-13 +4 +-11 +3 +-11 +5 +-10 +6 +-10 +4 +-13 +2 +-13 +2 +-14 +3 +-13 +1 +-15 +1 +-15 +1 +-16 +53 +28 +-6 +-7 +-25 +-7 +-21 +-4 +-18 +-1 +-18 +-2 +-19 +-3 +-18 +-1 +-16 +-1 +-16 +-2 +-18 +-1 +-17 +-1 +-16 +0 +-16 +-1 +-17 +-1 +-17 +1 +-32 +-60 +-11 +-12 +10 +-9 +4 +-16 +1 +-14 +4 +-11 +5 +-11 +5 +-9 +58 +31 +-3 +-4 +-22 +-4 +-19 +-1 +-16 +-2 +-17 +-3 +-19 +-2 +-18 +-1 +-16 +-1 +-17 +-1 +-18 +-1 +-17 +0 +-15 +1 +-15 +-1 +-17 +-1 +-16 +-1 +-14 +1 +-15 +0 +-16 +0 +-16 +1 +-15 +1 +-15 +0 +-17 +1 +-16 +1 +-14 +1 +-14 +-1 +-16 +0 +-16 +1 +-14 +1 +-14 +1 +-16 +0 +-15 +1 +-32 +-59 +-10 +-12 +10 +-10 +2 +-15 +1 +-14 +4 +-11 +5 +-12 +5 +-10 +6 +-10 +5 +-13 +3 +-14 +3 +-14 +3 +-13 +0 +-16 +0 +-16 +1 +-15 +2 +-13 +1 +-15 +1 +-15 +1 +-15 +2 +-13 +1 +-16 +1 +-15 +1 +-15 +3 +-14 +1 +-15 +1 +-15 +1 +-14 +1 +-13 +1 +-16 +1 +-15 +1 +-15 +3 +-13 +2 +-16 +1 +-15 +1 +-15 +2 +-14 +1 +-15 +0 +-16 +0 +-15 +1 +-13 +1 +-16 +0 +-15 +0 +-15 +2 +-13 +1 +-15 +0 +-16 +0 +-15 +53 +28 +-6 +-7 +-25 +-7 +-21 +-3 +-18 +-2 +-18 +-3 +-19 +-4 +-18 +-2 +-16 +-1 +-16 +-1 +-18 +-1 +-17 +-1 +-16 +0 +-16 +-1 +-17 +-1 +-17 +1 +-14 +0 +-15 +0 +-18 +-1 +-16 +0 +-15 +1 +-15 +0 +-16 +0 +-16 +1 +-32 +-60 +-11 +-13 +9 +-10 +3 +-15 +1 +-14 +4 +-11 +4 +-11 +4 +-10 +57 +30 +-4 +-5 +-22 +-5 +-19 +-2 +-17 +-1 +-17 +-3 +-18 +-2 +-17 +-1 +-16 +0 +-16 +-1 +-17 +-1 +-17 +1 +-15 +0 +-15 +-1 +-16 +0 +-16 +1 +-32 +-60 +-11 +-13 +10 +-10 +2 +-15 +1 +-14 +4 +-10 +4 +-12 +5 +-11 +57 +29 +-4 +-5 +-22 +-5 +-20 +-2 +-17 +-2 +-17 +-2 +-18 +-3 +-18 +-1 +-16 +0 +-16 +-2 +-18 +-1 +-18 +0 +-15 +1 +-16 +0 +-16 +-1 +-16 +1 +-14 +1 +-15 +-1 +-16 +-1 +-16 +1 +-15 +1 +-15 +0 +-16 +0 +-16 +1 +-15 +1 +-14 +0 +-17 +0 +-15 +0 +-14 +1 +-14 +0 +-16 +0 From 36c523659bb315f40e72cfe1afad47a6e7c17e0a Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 11 May 2020 22:49:44 +0200 Subject: [PATCH 167/632] textual --- traces/README.txt | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/traces/README.txt b/traces/README.txt index 5eada015d..a55786807 100644 --- a/traces/README.txt +++ b/traces/README.txt @@ -1,36 +1,42 @@ -pac-8E4C058E.pm3: PAC/Stanley 20204/21020 PAC8 tag (ID: 8E4C058E) em4102-clamshell.pm3: Samy's clamshell EM4102 tag (ID: 1f00d9b3a5) em4102-thin.pm3: Samy's thin credit-card style EM4102 tag (ID: 1a0041375d) EM4102-1.pm3: credit card style card EM4102 tag (ID: 010872e77c) EM4102-2.pm3: credit card style card EM4102 tag (ID: 010872beec) EM4102-3.pm3: credit card style card EM4102 tag (ID: 010872e14f) +EM4102-Fob.pm3: (ID: 0400193cbe) em4x05.pm3: ear tag FDX-B ISO-11784/5 (ID: 6DB0840800F80001 - Application Identifier: 8000, Country Code: 124 (Canada), National ID: 270601654) em4x50.pm3: credit card style card EM4x50 tag (ID: DE2A3F00) hid-proxCardII-05512-11432784-1.pm3: clamshell-style HID ProxCard II card +HID-weak-fob-11647.pm3: HID 32bit Prox Card#: 11647. very weak tag/read but just readable. indala-00002-12345678-1A.pm3: Indala credit-card style card +indala-504278295.pm3: PSK 26 bit indala homeagain.pm3: HomeAgain animal (cat) tag - ID 985121004515220 homeagain1600.pm3: HomeAgain animal (cat) tag - ID 985121004515220 keri.pm3: Keri PSK-3 Key Ring tag (back of tag: 1460 3411) Transit999-best.pm3: Transit 999 format (UID 99531670) - -The files 'modulation-'... are all encoded with identical data (hex 00 01 02 03 04 05 06 07 08 09 0A 0B) -for the purpose of recognition and testing of demodulation schemes. They were created by writing Q5 tags -appropriately configured. The raw data is in 'modulation-data.dat'. - -ata5577-HIDemu-FC1-C9.pm3: ata5577 in hid prox 26 bit emulation facility code:1 card#:9 -casi-12ed825c29.pm3: casi rusco 40 bit (EM410x ID: 12ed825c29) -EM4102-Fob.pm3: (ID: 0400193cbe) +ATA5577-HIDemu-FC1-C9.pm3: ata5577 in hid prox 26 bit emulation facility code:1 card#:9 +AWID-15-259.pm3: AWID FSK RF/50 FC: 15 Card: 259 +Casi-12ed825c29.pm3: casi rusco 40 bit (EM410x ID: 12ed825c29) ioprox-XSF-01-3B-44725.pm3: IO Prox FSK RF/64 ID in name ioprox-XSF-01-BE-03011.pm3: IO Prox FSK RF/64 ID in name -indala-504278295.pm3: PSK 26 bit indala -AWID-15-259.pm3: AWID FSK RF/50 FC: 15 Card: 259 -HID-weak-fob-11647.pm3: HID 32bit Prox Card#: 11647. very weak tag/read but just readable. -visa2000.pm3: VISA2000 ASK/MAN RF/64, Card: 480518 -securakey-64169.pm3 Securakey Tag BitLen: 26, Card ID: 64169, FC: 0x35 - motorola_0437_00072.pm3: Motorola Grey clamshell card, old. (RAW: A0000000E308C0C1) +nexkey_74755342.pm3: NEXWATCH, Nexkey ID: 74755342 +pac-8E4C058E.pm3: PAC/Stanley 20204/21020 PAC8 tag (ID: 8E4C058E) +quadrakey-521512301.pm3: NEXWATCH, Quadrakey ID: 521512301 +securakey-64169.pm3: Securakey Tag BitLen: 26, Card ID: 64169, FC: 0x35 verichip_1022000000084146.pm3: VeriChip, epoxy encased glasschip (ID: 1022-00000000084146) - +visa2000.pm3: VISA2000 ASK/MAN RF/64, Card: 480518 +Paradox-96_40426-APJN08.pm3: PARADOX FC 96 CN 40426 +TITEST.txt: Texas Instrument - can't decode it any longer +gallagher.pm3: GALLAGHER tag. +--- sniff-ht2-BC3B8810-acg-reader.pm3: sniffing of Hitag2 being read by an HID ACG LF Multitag reader sniff-ht2-BC3B8810-frosch-reader.pm3: sniffing of Hitag2 being read by a Frosch Hitag reader sniff-ht2-BC3B8810-rfidler-reader.pm3: sniffing of Hitag2 being read by a RFIDler +--- +The files 'modulation-'... +are all encoded with identical data (hex 00 01 02 03 04 05 06 07 08 09 0A 0B) +for the purpose of recognition and testing of demodulation schemes. They were created by writing Q5 tags +appropriately configured. The raw data is in 'modulation-data.dat'. +--- +hf_mfu.trace: Tracelog file for a MFU simulation \ No newline at end of file From b46a99d7d71e0c9bceeec78859492f010d9e4c9f Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 11 May 2020 23:50:14 +0200 Subject: [PATCH 168/632] remove switch-enum warnings --- client/deps/hardnested/hardnested_bf_core.c | 6 ++++-- client/deps/jansson/Makefile | 2 +- client/deps/liblua/Makefile | 2 +- client/src/cmdhficlass.c | 2 +- client/src/cmdhfmfhard.c | 3 ++- client/src/cmdlfhitag.c | 7 +++++-- client/src/ui.c | 5 ++++- common/mbedtls/Makefile | 2 +- 8 files changed, 19 insertions(+), 10 deletions(-) diff --git a/client/deps/hardnested/hardnested_bf_core.c b/client/deps/hardnested/hardnested_bf_core.c index 0f2d57f16..1fa7626e4 100644 --- a/client/deps/hardnested/hardnested_bf_core.c +++ b/client/deps/hardnested/hardnested_bf_core.c @@ -610,7 +610,8 @@ uint64_t crack_states_bitsliced_dispatch(uint32_t cuid, uint8_t *best_first_byte break; #endif #endif - default: + case SIMD_AUTO: + case SIMD_NONE: crack_states_bitsliced_function_p = &crack_states_bitsliced_NOSIMD; break; } @@ -642,7 +643,8 @@ void bitslice_test_nonces_dispatch(uint32_t nonces_to_bruteforce, uint32_t *bf_t break; #endif #endif - default: + case SIMD_AUTO: + case SIMD_NONE: bitslice_test_nonces_function_p = &bitslice_test_nonces_NOSIMD; break; } diff --git a/client/deps/jansson/Makefile b/client/deps/jansson/Makefile index 487a85af8..5073b78a1 100644 --- a/client/deps/jansson/Makefile +++ b/client/deps/jansson/Makefile @@ -1,6 +1,6 @@ MYSRCPATHS = MYINCLUDES = -I. -MYCFLAGS = -Wno-unused-function -Wno-cast-align -Wno-bad-function-cast +MYCFLAGS = -Wno-unused-function -Wno-cast-align -Wno-bad-function-cast -Wno-switch-enum MYDEFS = -DHAVE_STDINT_H MYSRCS = \ dump.c \ diff --git a/client/deps/liblua/Makefile b/client/deps/liblua/Makefile index 296fd9e24..e2cf7baa3 100644 --- a/client/deps/liblua/Makefile +++ b/client/deps/liblua/Makefile @@ -1,7 +1,7 @@ MYSRCPATHS = MYINCLUDES = -I. # Lua lib requires GNU extensions (implicit declarations of functions): -std=gnu99 or -std=gnu11 -MYCFLAGS = -Wno-cast-align -Wno-bad-function-cast +MYCFLAGS = -Wno-cast-align -Wno-bad-function-cast -Wno-switch-enum MYDEFS = -DLUA_COMPAT_ALL $(SYSCFLAGS) MYSRCS = lapi.c lcode.c lctype.c ldebug.c ldo.c ldump.c lfunc.c lgc.c llex.c \ lmem.c lobject.c lopcodes.c lparser.c lstate.c lstring.c ltable.c \ diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index e46f045a3..b277820e2 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -775,7 +775,7 @@ static int CmdHFiClassELoad(const char *Cmd) { res = loadFileJSON(filename, dump, 2048, &bytes_read); break; } - default: + case DICTIONARY: PrintAndLogEx(ERR, "No dictionary loaded"); free(dump); return PM3_ESOFT; diff --git a/client/src/cmdhfmfhard.c b/client/src/cmdhfmfhard.c index 0e421a80a..f01f43fae 100644 --- a/client/src/cmdhfmfhard.c +++ b/client/src/cmdhfmfhard.c @@ -90,7 +90,8 @@ static void get_SIMD_instruction_set(char *instruction_set) { case SIMD_MMX: strcpy(instruction_set, "MMX"); break; - default: + case SIMD_AUTO: + case SIMD_NONE: strcpy(instruction_set, "no"); break; } diff --git a/client/src/cmdlfhitag.c b/client/src/cmdlfhitag.c index 4c35fedf1..5a11216fb 100644 --- a/client/src/cmdlfhitag.c +++ b/client/src/cmdlfhitag.c @@ -572,10 +572,12 @@ static int CmdLFHitagReader(const char *Cmd) { // No additional parameters needed break; } + case RHT1F_PLAIN: + case RHT1F_AUTHENTICATE: case WHTSF_CHALLENGE: case WHTSF_KEY: + case WHT2F_PASSWORD: case WHT2F_CRYPTO: - default: return usage_hitag_reader(); } @@ -678,6 +680,8 @@ static int CmdLFHitagWriter(const char *Cmd) { num_to_bytes(param_get32ex(Cmd, 3, 0, 16), 4, htd.crypto.data); break; } + case RHT1F_PLAIN: + case RHT1F_AUTHENTICATE: case RHTSF_CHALLENGE: case RHTSF_KEY: case RHT2F_PASSWORD: @@ -685,7 +689,6 @@ static int CmdLFHitagWriter(const char *Cmd) { case RHT2F_CRYPTO: case RHT2F_TEST_AUTH_ATTEMPTS: case RHT2F_UID_ONLY: - default: return usage_hitag_writer(); } diff --git a/client/src/ui.c b/client/src/ui.c index ce3c528f4..9414fbb34 100644 --- a/client/src/ui.c +++ b/client/src/ui.c @@ -424,10 +424,13 @@ static bool emojify_token(const char *token, uint8_t token_length, const char ** } break; } - default: {// ERASE + case ERASE: { *emojified_token_length = 0; break; } + case ALIAS: { // should never happen + return false; + } } return true; } diff --git a/common/mbedtls/Makefile b/common/mbedtls/Makefile index 880f6bcc8..4ae8357b3 100644 --- a/common/mbedtls/Makefile +++ b/common/mbedtls/Makefile @@ -1,6 +1,6 @@ MYSRCPATHS = MYINCLUDES = -I. -I.. -MYCFLAGS = -Wno-cast-align +MYCFLAGS = -Wno-cast-align -Wno-switch-enum MYDEFS = MYSRCS = \ aes.c \ From 1a89680e7b4d5d1f41806f41075ecb24dee15e1a Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 11 May 2020 22:45:23 +0200 Subject: [PATCH 169/632] fix unused-but-set warning --- client/src/emv/crypto_polarssl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/emv/crypto_polarssl.c b/client/src/emv/crypto_polarssl.c index e258f1bbb..9d18a370b 100644 --- a/client/src/emv/crypto_polarssl.c +++ b/client/src/emv/crypto_polarssl.c @@ -156,7 +156,7 @@ static struct crypto_pk *crypto_pk_polarssl_open_priv_rsa(va_list vl) { static int myrand(void *rng_state, unsigned char *output, size_t len) { size_t i; - rng_state = NULL; + (void)rng_state; for (i = 0; i < len; ++i) output[i] = rand(); From 605a754b20ab478a0c9f0fa6c38d40bfb8f76d2b Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 11 May 2020 23:57:32 +0200 Subject: [PATCH 170/632] old-style-definition warnings --- common/legic_prng.c | 2 +- common/zlib/Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/common/legic_prng.c b/common/legic_prng.c index 8646f55a9..1447d3b1b 100644 --- a/common/legic_prng.c +++ b/common/legic_prng.c @@ -46,7 +46,7 @@ void legic_prng_forward(int count) { } } -uint8_t legic_prng_get_bit() { +uint8_t legic_prng_get_bit(void) { uint8_t idx = 7 - ((lfsr.a & 4) | (lfsr.a >> 2 & 2) | (lfsr.a >> 4 & 1)); return lfsr.b >> idx & 1; } diff --git a/common/zlib/Makefile b/common/zlib/Makefile index baec1eb1e..2f68e0ea2 100644 --- a/common/zlib/Makefile +++ b/common/zlib/Makefile @@ -1,7 +1,7 @@ MYSRCPATHS = ../../common/zlib MYSRCS = deflate.c adler32.c trees.c zutil.c inflate.c inffast.c inftrees.c MYINCLUDES = -I../../common/zlib -MYCFLAGS = -Wno-strict-prototypes -Wno-missing-prototypes -Wno-missing-declarations +MYCFLAGS = -Wno-strict-prototypes -Wno-missing-prototypes -Wno-missing-declarations -Wno-old-style-definition -Wno-implicit-fallthrough MYDEFS = -DZ_SOLO -DNO_GZIP -DZLIB_PM3_TUNED #-DDEBUG -Dverbose=1 From 56371fe7d510c87648771a56538d59bd6679d7a2 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 12 May 2020 00:07:06 +0200 Subject: [PATCH 171/632] coverity fixes --- client/src/cmdlfnexwatch.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/cmdlfnexwatch.c b/client/src/cmdlfnexwatch.c index d67550ee5..a8f783ef7 100644 --- a/client/src/cmdlfnexwatch.c +++ b/client/src/cmdlfnexwatch.c @@ -254,7 +254,7 @@ int demodNexWatch(void) { PrintAndLogEx(WARNING, " checksum : %s (0x%02X != 0x%02X)", _RED_("fail"), chk, items[m_idx].chk); } - PrintAndLogEx(INFO, " raw : " _YELLOW_("%"PRIX64"%"PRIX64"%"PRIX64), raw1, raw2, raw3); + PrintAndLogEx(INFO, " raw : " _YELLOW_("%"PRIX32"%"PRIX32"%"PRIX32), raw1, raw2, raw3); return PM3_SUCCESS; } @@ -418,7 +418,7 @@ static int CmdNexWatchSim(const char *Cmd) { } // hex to bits. - uint32_t rawblocks[4]; + uint32_t rawblocks[3]; for (size_t i = 0; i < ARRAYLEN(rawblocks); i++) { rawblocks[i] = bytes_to_num(rawhex + (i * sizeof(uint32_t)), sizeof(uint32_t)); num_to_bytebits(rawblocks[i], sizeof(uint32_t) * 8, bs + (i * sizeof(uint32_t) * 8)); From 09903384fa96dc097953a9c9a92f2bae8b90e7f2 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 12 May 2020 00:25:44 +0200 Subject: [PATCH 172/632] fix osx --- client/deps/hardnested/hardnested_bf_core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/deps/hardnested/hardnested_bf_core.c b/client/deps/hardnested/hardnested_bf_core.c index 1fa7626e4..db0eee1d2 100644 --- a/client/deps/hardnested/hardnested_bf_core.c +++ b/client/deps/hardnested/hardnested_bf_core.c @@ -591,11 +591,11 @@ uint64_t crack_states_bitsliced_dispatch(uint32_t cuid, uint8_t *best_first_byte switch (GetSIMDInstrAuto()) { #if defined (__i386__) || defined (__x86_64__) #if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) case SIMD_AVX512: +#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) crack_states_bitsliced_function_p = &crack_states_bitsliced_AVX512; - break; #endif + break; case SIMD_AVX2: crack_states_bitsliced_function_p = &crack_states_bitsliced_AVX2; break; From d2f9fb6084149bcb3044e2c2ee21b741c5099cae Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 12 May 2020 00:26:45 +0200 Subject: [PATCH 173/632] fix hardnested switch-enum --- client/deps/hardnested/hardnested_bf_core.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/client/deps/hardnested/hardnested_bf_core.h b/client/deps/hardnested/hardnested_bf_core.h index 00b20b786..b5dcc4bab 100644 --- a/client/deps/hardnested/hardnested_bf_core.h +++ b/client/deps/hardnested/hardnested_bf_core.h @@ -52,13 +52,20 @@ THE SOFTWARE. #include "hardnested_bruteforce.h" // statelist_t + typedef enum { SIMD_AUTO, +#if defined (__i386__) || defined (__x86_64__) +#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) +#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) SIMD_AVX512, +#endif SIMD_AVX2, SIMD_AVX, SIMD_SSE2, SIMD_MMX, +#endif +#endif SIMD_NONE, } SIMDExecInstr; void SetSIMDInstr(SIMDExecInstr instr); From 2819792f8e9913d7cc526c24017c3f8db32c674e Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 12 May 2020 00:27:21 +0200 Subject: [PATCH 174/632] Revert "fix osx" This reverts commit 09903384fa96dc097953a9c9a92f2bae8b90e7f2. --- client/deps/hardnested/hardnested_bf_core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/deps/hardnested/hardnested_bf_core.c b/client/deps/hardnested/hardnested_bf_core.c index db0eee1d2..1fa7626e4 100644 --- a/client/deps/hardnested/hardnested_bf_core.c +++ b/client/deps/hardnested/hardnested_bf_core.c @@ -591,11 +591,11 @@ uint64_t crack_states_bitsliced_dispatch(uint32_t cuid, uint8_t *best_first_byte switch (GetSIMDInstrAuto()) { #if defined (__i386__) || defined (__x86_64__) #if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) - case SIMD_AVX512: #if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) + case SIMD_AVX512: crack_states_bitsliced_function_p = &crack_states_bitsliced_AVX512; -#endif break; +#endif case SIMD_AVX2: crack_states_bitsliced_function_p = &crack_states_bitsliced_AVX2; break; From 5ee82d63541aa9c45b74672f9973b057ae724e8d Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 11 May 2020 22:15:32 +0200 Subject: [PATCH 175/632] Add old-style-definition warning --- Makefile.defs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index a19dfc078..348c9359b 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -47,7 +47,7 @@ endif DEFCFLAGS = -Wall -Werror -O3 -fstrict-aliasing -pipe # Some more warnings we want as errors: -DEFCFLAGS += -Wbad-function-cast -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wshadow -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits +DEFCFLAGS += -Wbad-function-cast -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wshadow -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits -Wold-style-definition # Some more warnings we need first to eliminate, so temporarely tolerated: DEFCFLAGS += -Wcast-align -Wno-error=cast-align @@ -56,7 +56,6 @@ EXTRACFLAGS = EXTRACFLAGS += -Wunused-parameter -Wno-error=unused-parameter EXTRACFLAGS += -Wsign-compare -Wno-error=sign-compare EXTRACFLAGS += -Wswitch-enum -Wno-error=switch-enum -EXTRACFLAGS += -Wold-style-definition -Wno-error=old-style-definition # unknown to clang or old gcc: # First we activate Wextra then we explicitly list those we know about From c719e545dc8e06fd4eb310a4d664384a2ffa0e1b Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 11 May 2020 23:46:26 +0200 Subject: [PATCH 176/632] add -Wswitch-enum flag --- Makefile.defs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.defs b/Makefile.defs index 348c9359b..7f421d5a1 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -50,12 +50,12 @@ DEFCFLAGS = -Wall -Werror -O3 -fstrict-aliasing -pipe DEFCFLAGS += -Wbad-function-cast -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wshadow -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits -Wold-style-definition # Some more warnings we need first to eliminate, so temporarely tolerated: DEFCFLAGS += -Wcast-align -Wno-error=cast-align +DEFCFLAGS += -Wswitch-enum -Wno-error=switch-enum # Next ones are activated only if GCCEXTRA=1 or CLANGEXTRA=1 EXTRACFLAGS = EXTRACFLAGS += -Wunused-parameter -Wno-error=unused-parameter EXTRACFLAGS += -Wsign-compare -Wno-error=sign-compare -EXTRACFLAGS += -Wswitch-enum -Wno-error=switch-enum # unknown to clang or old gcc: # First we activate Wextra then we explicitly list those we know about From 7f6c078de2f8ce53594f299f70e61a8cb7c7839e Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 12 May 2020 00:44:22 +0200 Subject: [PATCH 177/632] fix cbor enum --- client/src/fido/cbortools.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/client/src/fido/cbortools.c b/client/src/fido/cbortools.c index d58b11145..2eb386bc2 100644 --- a/client/src/fido/cbortools.c +++ b/client/src/fido/cbortools.c @@ -155,8 +155,18 @@ static CborError dumprecursive(uint8_t cmdCode, bool isResponse, CborValue *it, got_next = true; break; } - - default: { + case CborByteStringType: + case CborTextStringType: + case CborTagType: + case CborSimpleType: + case CborBooleanType: + case CborNullType: + case CborUndefinedType: + case CborHalfFloatType: + case CborFloatType: + case CborDoubleType: + case CborInvalidType: + case CborIntegerType: { err = dumpelm(it, &got_next, (isMapType && (elmCount % 2)) ? 0 : nestingLevel); if (err) return err; From 3e05d28678adec9fdb26c1c431f4d3be54274fa5 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 12 May 2020 00:50:49 +0200 Subject: [PATCH 178/632] more hardnested switch to handle --- client/src/cmdhfmf.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index ba017676c..8f54b1db8 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -163,11 +163,17 @@ static int usage_hf14_hardnested(void) { PrintAndLogEx(NORMAL, " f read/write instead of default name"); PrintAndLogEx(NORMAL, " t tests?"); PrintAndLogEx(NORMAL, " i set type of SIMD instructions. Without this flag programs autodetect it."); +#if defined (__i386__) || defined (__x86_64__) +#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) +#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) PrintAndLogEx(NORMAL, " i 5 = AVX512"); +#endif PrintAndLogEx(NORMAL, " i 2 = AVX2"); PrintAndLogEx(NORMAL, " i a = AVX"); PrintAndLogEx(NORMAL, " i s = SSE2"); PrintAndLogEx(NORMAL, " i m = MMX"); +#endif +#endif PrintAndLogEx(NORMAL, " i n = none (use CPU regular instruction set)"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); @@ -1805,9 +1811,13 @@ static int CmdHF14AMfNestedHard(const char *Cmd) { SetSIMDInstr(SIMD_AUTO); ctmp = tolower(param_getchar(Cmd, cmdp + 1)); switch (ctmp) { +#if defined (__i386__) || defined (__x86_64__) +#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) +#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) case '5': SetSIMDInstr(SIMD_AVX512); break; +#endif case '2': SetSIMDInstr(SIMD_AVX2); break; @@ -1820,6 +1830,8 @@ static int CmdHF14AMfNestedHard(const char *Cmd) { case 'm': SetSIMDInstr(SIMD_MMX); break; +#endif +#endif case 'n': SetSIMDInstr(SIMD_NONE); break; From a3aa38e62499e40b6997d69e0922901b2b980728 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 12 May 2020 00:58:02 +0200 Subject: [PATCH 179/632] trying to help old gcc 5... --- client/src/fido/cbortools.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/fido/cbortools.c b/client/src/fido/cbortools.c index 2eb386bc2..a7b08e619 100644 --- a/client/src/fido/cbortools.c +++ b/client/src/fido/cbortools.c @@ -130,7 +130,7 @@ static CborError dumprecursive(uint8_t cmdCode, bool isResponse, CborValue *it, CborError err; CborType type = cbor_value_get_type(it); //printf("^%x^", type); - bool got_next; + bool got_next = false; switch (type) { case CborMapType: From 8dcf670f720ed2bf5f311f799d0891b0f24e0d0f Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 12 May 2020 01:17:38 +0200 Subject: [PATCH 180/632] ore hardnested switch to handle --- client/src/cmdhfmf.c | 12 ++++++++++++ client/src/cmdhfmfhard.c | 6 ++++++ 2 files changed, 18 insertions(+) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 8f54b1db8..50f3d9de1 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -228,10 +228,16 @@ static int usage_hf14_autopwn(void) { PrintAndLogEx(NORMAL, " * 2 = 2k"); PrintAndLogEx(NORMAL, " * 4 = 4k"); PrintAndLogEx(NORMAL, " i set type of SIMD instructions for hardnested. Default: autodetection."); +#if defined (__i386__) || defined (__x86_64__) +#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) +#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) PrintAndLogEx(NORMAL, " i 5 = AVX512"); +#endif PrintAndLogEx(NORMAL, " i 2 = AVX2"); PrintAndLogEx(NORMAL, " i a = AVX"); PrintAndLogEx(NORMAL, " i s = SSE2"); +#endif +#endif PrintAndLogEx(NORMAL, " i m = MMX"); PrintAndLogEx(NORMAL, " i n = none (use CPU regular instruction set)"); PrintAndLogEx(NORMAL, ""); @@ -1998,9 +2004,13 @@ static int CmdHF14AMfAutoPWN(const char *Cmd) { SetSIMDInstr(SIMD_AUTO); ctmp = tolower(param_getchar(Cmd, cmdp + 1)); switch (ctmp) { +#if defined (__i386__) || defined (__x86_64__) +#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) +#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) case '5': SetSIMDInstr(SIMD_AVX512); break; +#endif case '2': SetSIMDInstr(SIMD_AVX2); break; @@ -2013,6 +2023,8 @@ static int CmdHF14AMfAutoPWN(const char *Cmd) { case 'm': SetSIMDInstr(SIMD_MMX); break; +#endif +#endif case 'n': SetSIMDInstr(SIMD_NONE); break; diff --git a/client/src/cmdhfmfhard.c b/client/src/cmdhfmfhard.c index f01f43fae..6599a667e 100644 --- a/client/src/cmdhfmfhard.c +++ b/client/src/cmdhfmfhard.c @@ -75,9 +75,13 @@ static float brute_force_per_second; static void get_SIMD_instruction_set(char *instruction_set) { switch (GetSIMDInstrAuto()) { +#if defined (__i386__) || defined (__x86_64__) +#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) +#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) case SIMD_AVX512: strcpy(instruction_set, "AVX512F"); break; +#endif case SIMD_AVX2: strcpy(instruction_set, "AVX2"); break; @@ -90,6 +94,8 @@ static void get_SIMD_instruction_set(char *instruction_set) { case SIMD_MMX: strcpy(instruction_set, "MMX"); break; +#endif +#endif case SIMD_AUTO: case SIMD_NONE: strcpy(instruction_set, "no"); From 61610a5c6133bf4095d0b292240f6c2c00f8feec Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 12 May 2020 01:49:01 +0200 Subject: [PATCH 181/632] fiddling with makefile --- Makefile.defs | 18 ++++++++++++------ common_arm/Makefile.common | 3 +++ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index 7f421d5a1..be504caa9 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -52,6 +52,13 @@ DEFCFLAGS += -Wbad-function-cast -Wredundant-decls -Wmissing-prototypes -Wchar-s DEFCFLAGS += -Wcast-align -Wno-error=cast-align DEFCFLAGS += -Wswitch-enum -Wno-error=switch-enum +ifeq ($(platform),Darwin) +# their readline has strict-prototype issues +DEFCFLAGS += -Wno-strict-prototypes +else +DEFCFLAGS += -Wstrict-prototypes +endif + # Next ones are activated only if GCCEXTRA=1 or CLANGEXTRA=1 EXTRACFLAGS = EXTRACFLAGS += -Wunused-parameter -Wno-error=unused-parameter @@ -84,10 +91,9 @@ CLANGEXTRACFLAGS += -Wimplicit-fallthrough ifeq ($(CLANGEXTRA),1) DEFCFLAGS += $(CLANGEXTRACFLAGS) $(EXTRACFLAGS) endif - -ifeq ($(platform),Darwin) -# their readline has strict-prototype issues -DEFCFLAGS += -Wstrict-prototypes -Wno-error=strict-prototypes -else -DEFCFLAGS += -Wstrict-prototypes +ifeq ($(CLANGEVERYTHING),1) + DEFCFLAGS += -Weverything -Wno-error +endif +ifeq ($(NOERROR),1) + DEFCFLAGS += -Wno-error endif diff --git a/common_arm/Makefile.common b/common_arm/Makefile.common index f44f89106..95b419e8e 100644 --- a/common_arm/Makefile.common +++ b/common_arm/Makefile.common @@ -84,6 +84,9 @@ GCCEXTRACFLAGS += -Wcast-align -Wno-error=cast-align ifeq ($(GCCEXTRA),1) DEFCFLAGS += $(GCCEXTRACFLAGS) $(EXTRACFLAGS) endif +ifeq ($(NOERROR),1) + DEFCFLAGS += -Wno-error +endif CFLAGS ?= $(DEFCFLAGS) CFLAGS += $(ARMCFLAGS) -c $(INCLUDE) -std=c99 $(APP_CFLAGS) From 8f188a5329ae2fd72a3d8f9b6060dd6dd0169e83 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 12 May 2020 10:27:54 +0200 Subject: [PATCH 182/632] redundant --- armsrc/hitagS.c | 2 +- armsrc/legicrf.c | 2 +- armsrc/mifarecmd.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/armsrc/hitagS.c b/armsrc/hitagS.c index 1ab4d5b6d..00d204ce3 100644 --- a/armsrc/hitagS.c +++ b/armsrc/hitagS.c @@ -1645,7 +1645,7 @@ void check_challenges(bool file_given, uint8_t *data) { size_t rxlen = 0; uint8_t txbuf[HITAG_FRAME_LEN]; int t_wait = HITAG_T_WAIT_MAX; - int lastbit, STATE = 0;; + int lastbit, STATE = 0; bool bStop; int response_bit[200]; unsigned char mask = 1; diff --git a/armsrc/legicrf.c b/armsrc/legicrf.c index 0a96fcb01..474d0df84 100644 --- a/armsrc/legicrf.c +++ b/armsrc/legicrf.c @@ -436,7 +436,7 @@ void LegicRfInfo(void) { // read MCC and check against UID int16_t mcc = read_byte(4, card.cmdsize); - int16_t calc_mcc = CRC8Legic(card.uid, 4);; + int16_t calc_mcc = CRC8Legic(card.uid, 4); if (mcc != calc_mcc) { reply_mix(CMD_ACK, 0, 0, 0, 0, 0); goto OUT; diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index 55dee2019..ad0b050c1 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -1840,7 +1840,7 @@ void MifarePersonalizeUID(uint8_t keyType, uint8_t perso_option, uint64_t key) { int len = mifare_sendcmd_short(pcs, true, MIFARE_EV1_PERSONAL_UID, perso_option, receivedAnswer, receivedAnswerPar, NULL); if (len != 1 || receivedAnswer[0] != CARD_ACK) { if (DBGLEVEL >= DBG_ERROR) Dbprintf("Cmd Error: %02x", receivedAnswer[0]); - break;; + break; } if (mifare_classic_halt(pcs, cuid)) { From 5e4c83cc2fec8d17707b1134347a0ab834fc0a2e Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 12 May 2020 10:30:14 +0200 Subject: [PATCH 183/632] redundant --- client/src/cmdhficlass.c | 4 ++-- client/src/cmdhfmf.c | 2 +- client/src/cmdlft55xx.c | 12 ++++++------ client/src/cmdlfti.c | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index b277820e2..0107372c7 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -225,7 +225,7 @@ static int usage_hf_iclass_calc_newkey(void) { PrintAndLogEx(NORMAL, _YELLOW_("\thf iclass calcnewkey o 1122334455667788 n 2233445566778899")); PrintAndLogEx(NORMAL, "\nNOTE: * = required"); PrintAndLogEx(NORMAL, ""); - return PM3_SUCCESS;; + return PM3_SUCCESS; } static int usage_hf_iclass_managekeys(void) { PrintAndLogEx(NORMAL, "Manage iClass Keys in client memory:\n"); @@ -315,7 +315,7 @@ static int usage_hf_iclass_chk(void) { PrintAndLogEx(NORMAL, _YELLOW_("\thf iclass chk f dictionaries/iclass_default_keys.dic")); PrintAndLogEx(NORMAL, _YELLOW_("\thf iclass chk f dictionaries/iclass_default_keys.dic e")); PrintAndLogEx(NORMAL, ""); - return PM3_SUCCESS;; + return PM3_SUCCESS; } static int usage_hf_iclass_lookup(void) { PrintAndLogEx(NORMAL, "Lookup keys takes some sniffed trace data and tries to verify what key was used against a dictionary file\n"); diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 50f3d9de1..676fe6505 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -2921,7 +2921,7 @@ static int CmdHF14AMfChk(const char *Cmd) { } keyBlock = p; } - PrintAndLogEx(NORMAL, "[%2d] key %s", keycnt, sprint_hex((keyBlock + 6 * keycnt), 6));; + PrintAndLogEx(NORMAL, "[%2d] key %s", keycnt, sprint_hex((keyBlock + 6 * keycnt), 6)); keycnt++; } else if (clen == 1) { if (ctmp == 't') { transferToEml = 1; continue; } diff --git a/client/src/cmdlft55xx.c b/client/src/cmdlft55xx.c index 47c661bf4..3c0c46077 100644 --- a/client/src/cmdlft55xx.c +++ b/client/src/cmdlft55xx.c @@ -1619,7 +1619,7 @@ static int CmdT55xxWakeUp(const char *Cmd) { uint32_t password = 0; uint8_t cmdp = 0; bool errors = false; - uint8_t downlink_mode = config.downlink_mode;; + uint8_t downlink_mode = config.downlink_mode; while (param_getchar(Cmd, cmdp) != 0x00 && !errors) { switch (tolower(param_getchar(Cmd, cmdp))) { @@ -1675,7 +1675,7 @@ static int CmdT55xxWriteBlock(const char *Cmd) { bool errors = false; bool validate = false; uint8_t cmdp = 0; - uint32_t downlink_mode = config.downlink_mode;; + uint32_t downlink_mode = config.downlink_mode; while (param_getchar(Cmd, cmdp) != 0x00 && !errors) { switch (tolower(param_getchar(Cmd, cmdp))) { @@ -1815,7 +1815,7 @@ static int CmdT55xxDangerousRaw(const char *Cmd) { static int CmdT55xxReadTrace(const char *Cmd) { bool frombuff = false; - uint8_t downlink_mode = config.downlink_mode;; + uint8_t downlink_mode = config.downlink_mode; uint8_t cmdp = 0; bool errors = false; @@ -2252,7 +2252,7 @@ static int CmdT55xxDump(const char *Cmd) { uint32_t password = 0; uint8_t override = 0; - uint8_t downlink_mode = config.downlink_mode;; + uint8_t downlink_mode = config.downlink_mode; bool usepwd = false; bool errors = false; uint8_t cmdp = 0; @@ -2455,7 +2455,7 @@ static int CmdT55xxRestore(const char *Cmd) { uint32_t password = 0; uint8_t override = 0; - uint8_t downlink_mode = config.downlink_mode;; + uint8_t downlink_mode = config.downlink_mode; bool usepwd = false; bool errors = false; uint8_t cmdp = 0; @@ -2809,7 +2809,7 @@ static void t55x7_create_config_block(int tagtype) { static int CmdResetRead(const char *Cmd) { - uint8_t downlink_mode = config.downlink_mode;; + uint8_t downlink_mode = config.downlink_mode; uint8_t flags = 0; uint8_t cmdp = 0; bool errors = false; diff --git a/client/src/cmdlfti.c b/client/src/cmdlfti.c index 1c0dcbe1e..5a088d3c4 100644 --- a/client/src/cmdlfti.c +++ b/client/src/cmdlfti.c @@ -87,13 +87,13 @@ static int CmdTIDemod(const char *Cmd) { int convLen = (highLen > lowLen) ? highLen : lowLen; uint16_t crc; int i, j, TagType; - int lowSum = 0, highSum = 0;; + int lowSum = 0, highSum = 0; int lowTot = 0, highTot = 0; int retval = PM3_ESOFT; for (i = 0; i < GraphTraceLen - convLen; i++) { lowSum = 0; - highSum = 0;; + highSum = 0; for (j = 0; j < lowLen; j++) { lowSum += LowTone[j] * GraphBuffer[i + j]; From 66fd6d70a04c9b41a76d197f6a8ffff81d7a8a68 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 12 May 2020 13:26:16 +0200 Subject: [PATCH 184/632] hardnested: more readable preprocessing --- client/deps/hardnested/hardnested_bf_core.c | 23 +-- client/deps/hardnested/hardnested_bf_core.h | 14 +- .../hardnested/hardnested_bitarray_core.c | 144 +++++++----------- client/src/cmdhfmf.c | 24 +-- client/src/cmdhfmfhard.c | 6 +- 5 files changed, 81 insertions(+), 130 deletions(-) diff --git a/client/deps/hardnested/hardnested_bf_core.c b/client/deps/hardnested/hardnested_bf_core.c index 1fa7626e4..a5196be37 100644 --- a/client/deps/hardnested/hardnested_bf_core.c +++ b/client/deps/hardnested/hardnested_bf_core.c @@ -559,19 +559,16 @@ void SetSIMDInstr(SIMDExecInstr instr) { static SIMDExecInstr GetSIMDInstr(void) { SIMDExecInstr instr = SIMD_NONE; -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) instr = SIMD_AVX512; - else if (__builtin_cpu_supports("avx2")) instr = SIMD_AVX2; -#else - if (__builtin_cpu_supports("avx2")) instr = SIMD_AVX2; + else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) instr = SIMD_AVX2; else if (__builtin_cpu_supports("avx")) instr = SIMD_AVX; else if (__builtin_cpu_supports("sse2")) instr = SIMD_SSE2; else if (__builtin_cpu_supports("mmx")) instr = SIMD_MMX; else -#endif #endif instr = SIMD_NONE; @@ -589,13 +586,12 @@ SIMDExecInstr GetSIMDInstrAuto(void) { // determine the available instruction set at runtime and call the correct function uint64_t crack_states_bitsliced_dispatch(uint32_t cuid, uint8_t *best_first_bytes, statelist_t *p, uint32_t *keys_found, uint64_t *num_keys_tested, uint32_t nonces_to_bruteforce, uint8_t *bf_test_nonce_2nd_byte, noncelist_t *nonces) { switch (GetSIMDInstrAuto()) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) case SIMD_AVX512: crack_states_bitsliced_function_p = &crack_states_bitsliced_AVX512; break; #endif +#if defined(COMPILER_HAS_SIMD) case SIMD_AVX2: crack_states_bitsliced_function_p = &crack_states_bitsliced_AVX2; break; @@ -608,7 +604,6 @@ uint64_t crack_states_bitsliced_dispatch(uint32_t cuid, uint8_t *best_first_byte case SIMD_MMX: crack_states_bitsliced_function_p = &crack_states_bitsliced_MMX; break; -#endif #endif case SIMD_AUTO: case SIMD_NONE: @@ -622,13 +617,12 @@ uint64_t crack_states_bitsliced_dispatch(uint32_t cuid, uint8_t *best_first_byte void bitslice_test_nonces_dispatch(uint32_t nonces_to_bruteforce, uint32_t *bf_test_nonce, uint8_t *bf_test_nonce_par) { switch (GetSIMDInstrAuto()) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) case SIMD_AVX512: bitslice_test_nonces_function_p = &bitslice_test_nonces_AVX512; break; #endif +#if defined(COMPILER_HAS_SIMD) case SIMD_AVX2: bitslice_test_nonces_function_p = &bitslice_test_nonces_AVX2; break; @@ -641,7 +635,6 @@ void bitslice_test_nonces_dispatch(uint32_t nonces_to_bruteforce, uint32_t *bf_t case SIMD_MMX: bitslice_test_nonces_function_p = &bitslice_test_nonces_MMX; break; -#endif #endif case SIMD_AUTO: case SIMD_NONE: diff --git a/client/deps/hardnested/hardnested_bf_core.h b/client/deps/hardnested/hardnested_bf_core.h index b5dcc4bab..51eca7de5 100644 --- a/client/deps/hardnested/hardnested_bf_core.h +++ b/client/deps/hardnested/hardnested_bf_core.h @@ -52,19 +52,25 @@ THE SOFTWARE. #include "hardnested_bruteforce.h" // statelist_t +#if ( defined (__i386__) || defined (__x86_64__) ) && \ + ( !defined(__APPLE__) || \ + (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) ) +# define COMPILER_HAS_SIMD +# if defined(COMPILER_HAS_SIMD) && ((__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2)) +# define COMPILER_HAS_SIMD_AVX512 +# endif +#endif typedef enum { SIMD_AUTO, -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) SIMD_AVX512, #endif +#if defined(COMPILER_HAS_SIMD) SIMD_AVX2, SIMD_AVX, SIMD_SSE2, SIMD_MMX, -#endif #endif SIMD_NONE, } SIMDExecInstr; diff --git a/client/deps/hardnested/hardnested_bitarray_core.c b/client/deps/hardnested/hardnested_bitarray_core.c index e9e84aa40..19d1274f9 100644 --- a/client/deps/hardnested/hardnested_bitarray_core.c +++ b/client/deps/hardnested/hardnested_bitarray_core.c @@ -17,6 +17,7 @@ // #include "hardnested_bitarray_core.h" +#include "hardnested_bf_core.h" #include #include @@ -305,19 +306,16 @@ count_bitarray_AND4_t *count_bitarray_AND4_function_p = &count_bitarray_AND4_dis // determine the available instruction set at runtime and call the correct function uint32_t *malloc_bitarray_dispatch(uint32_t x) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) malloc_bitarray_function_p = &malloc_bitarray_AVX512; - else if (__builtin_cpu_supports("avx2")) malloc_bitarray_function_p = &malloc_bitarray_AVX2; -#else - if (__builtin_cpu_supports("avx2")) malloc_bitarray_function_p = &malloc_bitarray_AVX2; + else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) malloc_bitarray_function_p = &malloc_bitarray_AVX2; else if (__builtin_cpu_supports("avx")) malloc_bitarray_function_p = &malloc_bitarray_AVX; else if (__builtin_cpu_supports("sse2")) malloc_bitarray_function_p = &malloc_bitarray_SSE2; else if (__builtin_cpu_supports("mmx")) malloc_bitarray_function_p = &malloc_bitarray_MMX; else -#endif #endif malloc_bitarray_function_p = &malloc_bitarray_NOSIMD; @@ -326,19 +324,16 @@ uint32_t *malloc_bitarray_dispatch(uint32_t x) { } void free_bitarray_dispatch(uint32_t *x) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) free_bitarray_function_p = &free_bitarray_AVX512; - else if (__builtin_cpu_supports("avx2")) free_bitarray_function_p = &free_bitarray_AVX2; -#else - if (__builtin_cpu_supports("avx2")) free_bitarray_function_p = &free_bitarray_AVX2; + else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) free_bitarray_function_p = &free_bitarray_AVX2; else if (__builtin_cpu_supports("avx")) free_bitarray_function_p = &free_bitarray_AVX; else if (__builtin_cpu_supports("sse2")) free_bitarray_function_p = &free_bitarray_SSE2; else if (__builtin_cpu_supports("mmx")) free_bitarray_function_p = &free_bitarray_MMX; else -#endif #endif free_bitarray_function_p = &free_bitarray_NOSIMD; @@ -347,19 +342,16 @@ void free_bitarray_dispatch(uint32_t *x) { } uint32_t bitcount_dispatch(uint32_t a) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) bitcount_function_p = &bitcount_AVX512; - else if (__builtin_cpu_supports("avx2")) bitcount_function_p = &bitcount_AVX2; -#else - if (__builtin_cpu_supports("avx2")) bitcount_function_p = &bitcount_AVX2; + else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) bitcount_function_p = &bitcount_AVX2; else if (__builtin_cpu_supports("avx")) bitcount_function_p = &bitcount_AVX; else if (__builtin_cpu_supports("sse2")) bitcount_function_p = &bitcount_SSE2; else if (__builtin_cpu_supports("mmx")) bitcount_function_p = &bitcount_MMX; else -#endif #endif bitcount_function_p = &bitcount_NOSIMD; @@ -368,19 +360,16 @@ uint32_t bitcount_dispatch(uint32_t a) { } uint32_t count_states_dispatch(uint32_t *bitarray) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) count_states_function_p = &count_states_AVX512; - else if (__builtin_cpu_supports("avx2")) count_states_function_p = &count_states_AVX2; -#else - if (__builtin_cpu_supports("avx2")) count_states_function_p = &count_states_AVX2; + else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) count_states_function_p = &count_states_AVX2; else if (__builtin_cpu_supports("avx")) count_states_function_p = &count_states_AVX; else if (__builtin_cpu_supports("sse2")) count_states_function_p = &count_states_SSE2; else if (__builtin_cpu_supports("mmx")) count_states_function_p = &count_states_MMX; else -#endif #endif count_states_function_p = &count_states_NOSIMD; @@ -389,19 +378,16 @@ uint32_t count_states_dispatch(uint32_t *bitarray) { } void bitarray_AND_dispatch(uint32_t *A, uint32_t *B) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) bitarray_AND_function_p = &bitarray_AND_AVX512; - else if (__builtin_cpu_supports("avx2")) bitarray_AND_function_p = &bitarray_AND_AVX2; -#else - if (__builtin_cpu_supports("avx2")) bitarray_AND_function_p = &bitarray_AND_AVX2; + else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) bitarray_AND_function_p = &bitarray_AND_AVX2; else if (__builtin_cpu_supports("avx")) bitarray_AND_function_p = &bitarray_AND_AVX; else if (__builtin_cpu_supports("sse2")) bitarray_AND_function_p = &bitarray_AND_SSE2; else if (__builtin_cpu_supports("mmx")) bitarray_AND_function_p = &bitarray_AND_MMX; else -#endif #endif bitarray_AND_function_p = &bitarray_AND_NOSIMD; @@ -410,19 +396,16 @@ void bitarray_AND_dispatch(uint32_t *A, uint32_t *B) { } void bitarray_low20_AND_dispatch(uint32_t *A, uint32_t *B) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) bitarray_low20_AND_function_p = &bitarray_low20_AND_AVX512; - else if (__builtin_cpu_supports("avx2")) bitarray_low20_AND_function_p = &bitarray_low20_AND_AVX2; -#else - if (__builtin_cpu_supports("avx2")) bitarray_low20_AND_function_p = &bitarray_low20_AND_AVX2; + else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) bitarray_low20_AND_function_p = &bitarray_low20_AND_AVX2; else if (__builtin_cpu_supports("avx")) bitarray_low20_AND_function_p = &bitarray_low20_AND_AVX; else if (__builtin_cpu_supports("sse2")) bitarray_low20_AND_function_p = &bitarray_low20_AND_SSE2; else if (__builtin_cpu_supports("mmx")) bitarray_low20_AND_function_p = &bitarray_low20_AND_MMX; else -#endif #endif bitarray_low20_AND_function_p = &bitarray_low20_AND_NOSIMD; @@ -431,19 +414,16 @@ void bitarray_low20_AND_dispatch(uint32_t *A, uint32_t *B) { } uint32_t count_bitarray_AND_dispatch(uint32_t *A, uint32_t *B) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) count_bitarray_AND_function_p = &count_bitarray_AND_AVX512; - else if (__builtin_cpu_supports("avx2")) count_bitarray_AND_function_p = &count_bitarray_AND_AVX2; -#else - if (__builtin_cpu_supports("avx2")) count_bitarray_AND_function_p = &count_bitarray_AND_AVX2; + else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) count_bitarray_AND_function_p = &count_bitarray_AND_AVX2; else if (__builtin_cpu_supports("avx")) count_bitarray_AND_function_p = &count_bitarray_AND_AVX; else if (__builtin_cpu_supports("sse2")) count_bitarray_AND_function_p = &count_bitarray_AND_SSE2; else if (__builtin_cpu_supports("mmx")) count_bitarray_AND_function_p = &count_bitarray_AND_MMX; else -#endif #endif count_bitarray_AND_function_p = &count_bitarray_AND_NOSIMD; @@ -452,19 +432,16 @@ uint32_t count_bitarray_AND_dispatch(uint32_t *A, uint32_t *B) { } uint32_t count_bitarray_low20_AND_dispatch(uint32_t *A, uint32_t *B) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_AVX512; - else if (__builtin_cpu_supports("avx2")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_AVX2; -#else - if (__builtin_cpu_supports("avx2")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_AVX2; + else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_AVX2; else if (__builtin_cpu_supports("avx")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_AVX; else if (__builtin_cpu_supports("sse2")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_SSE2; else if (__builtin_cpu_supports("mmx")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_MMX; else -#endif #endif count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_NOSIMD; @@ -473,19 +450,16 @@ uint32_t count_bitarray_low20_AND_dispatch(uint32_t *A, uint32_t *B) { } void bitarray_AND4_dispatch(uint32_t *A, uint32_t *B, uint32_t *C, uint32_t *D) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) bitarray_AND4_function_p = &bitarray_AND4_AVX512; - else if (__builtin_cpu_supports("avx2")) bitarray_AND4_function_p = &bitarray_AND4_AVX2; -#else - if (__builtin_cpu_supports("avx2")) bitarray_AND4_function_p = &bitarray_AND4_AVX2; + else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) bitarray_AND4_function_p = &bitarray_AND4_AVX2; else if (__builtin_cpu_supports("avx")) bitarray_AND4_function_p = &bitarray_AND4_AVX; else if (__builtin_cpu_supports("sse2")) bitarray_AND4_function_p = &bitarray_AND4_SSE2; else if (__builtin_cpu_supports("mmx")) bitarray_AND4_function_p = &bitarray_AND4_MMX; else -#endif #endif bitarray_AND4_function_p = &bitarray_AND4_NOSIMD; @@ -494,19 +468,16 @@ void bitarray_AND4_dispatch(uint32_t *A, uint32_t *B, uint32_t *C, uint32_t *D) } void bitarray_OR_dispatch(uint32_t *A, uint32_t *B) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) bitarray_OR_function_p = &bitarray_OR_AVX512; - else if (__builtin_cpu_supports("avx2")) bitarray_OR_function_p = &bitarray_OR_AVX2; -#else - if (__builtin_cpu_supports("avx2")) bitarray_OR_function_p = &bitarray_OR_AVX2; + else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) bitarray_OR_function_p = &bitarray_OR_AVX2; else if (__builtin_cpu_supports("avx")) bitarray_OR_function_p = &bitarray_OR_AVX; else if (__builtin_cpu_supports("sse2")) bitarray_OR_function_p = &bitarray_OR_SSE2; else if (__builtin_cpu_supports("mmx")) bitarray_OR_function_p = &bitarray_OR_MMX; else -#endif #endif bitarray_OR_function_p = &bitarray_OR_NOSIMD; @@ -515,19 +486,16 @@ void bitarray_OR_dispatch(uint32_t *A, uint32_t *B) { } uint32_t count_bitarray_AND2_dispatch(uint32_t *A, uint32_t *B) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) count_bitarray_AND2_function_p = &count_bitarray_AND2_AVX512; - else if (__builtin_cpu_supports("avx2")) count_bitarray_AND2_function_p = &count_bitarray_AND2_AVX2; -#else - if (__builtin_cpu_supports("avx2")) count_bitarray_AND2_function_p = &count_bitarray_AND2_AVX2; + else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) count_bitarray_AND2_function_p = &count_bitarray_AND2_AVX2; else if (__builtin_cpu_supports("avx")) count_bitarray_AND2_function_p = &count_bitarray_AND2_AVX; else if (__builtin_cpu_supports("sse2")) count_bitarray_AND2_function_p = &count_bitarray_AND2_SSE2; else if (__builtin_cpu_supports("mmx")) count_bitarray_AND2_function_p = &count_bitarray_AND2_MMX; else -#endif #endif count_bitarray_AND2_function_p = &count_bitarray_AND2_NOSIMD; @@ -536,19 +504,16 @@ uint32_t count_bitarray_AND2_dispatch(uint32_t *A, uint32_t *B) { } uint32_t count_bitarray_AND3_dispatch(uint32_t *A, uint32_t *B, uint32_t *C) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) count_bitarray_AND3_function_p = &count_bitarray_AND3_AVX512; - else if (__builtin_cpu_supports("avx2")) count_bitarray_AND3_function_p = &count_bitarray_AND3_AVX2; -#else - if (__builtin_cpu_supports("avx2")) count_bitarray_AND3_function_p = &count_bitarray_AND3_AVX2; + else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) count_bitarray_AND3_function_p = &count_bitarray_AND3_AVX2; else if (__builtin_cpu_supports("avx")) count_bitarray_AND3_function_p = &count_bitarray_AND3_AVX; else if (__builtin_cpu_supports("sse2")) count_bitarray_AND3_function_p = &count_bitarray_AND3_SSE2; else if (__builtin_cpu_supports("mmx")) count_bitarray_AND3_function_p = &count_bitarray_AND3_MMX; else -#endif #endif count_bitarray_AND3_function_p = &count_bitarray_AND3_NOSIMD; @@ -557,19 +522,16 @@ uint32_t count_bitarray_AND3_dispatch(uint32_t *A, uint32_t *B, uint32_t *C) { } uint32_t count_bitarray_AND4_dispatch(uint32_t *A, uint32_t *B, uint32_t *C, uint32_t *D) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) count_bitarray_AND4_function_p = &count_bitarray_AND4_AVX512; - else if (__builtin_cpu_supports("avx2")) count_bitarray_AND4_function_p = &count_bitarray_AND4_AVX2; -#else - if (__builtin_cpu_supports("avx2")) count_bitarray_AND4_function_p = &count_bitarray_AND4_AVX2; + else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) count_bitarray_AND4_function_p = &count_bitarray_AND4_AVX2; else if (__builtin_cpu_supports("avx")) count_bitarray_AND4_function_p = &count_bitarray_AND4_AVX; else if (__builtin_cpu_supports("sse2")) count_bitarray_AND4_function_p = &count_bitarray_AND4_SSE2; else if (__builtin_cpu_supports("mmx")) count_bitarray_AND4_function_p = &count_bitarray_AND4_MMX; else -#endif #endif count_bitarray_AND4_function_p = &count_bitarray_AND4_NOSIMD; diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 676fe6505..0a11a8a25 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -163,16 +163,14 @@ static int usage_hf14_hardnested(void) { PrintAndLogEx(NORMAL, " f read/write instead of default name"); PrintAndLogEx(NORMAL, " t tests?"); PrintAndLogEx(NORMAL, " i set type of SIMD instructions. Without this flag programs autodetect it."); -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) PrintAndLogEx(NORMAL, " i 5 = AVX512"); #endif +#if defined(COMPILER_HAS_SIMD) PrintAndLogEx(NORMAL, " i 2 = AVX2"); PrintAndLogEx(NORMAL, " i a = AVX"); PrintAndLogEx(NORMAL, " i s = SSE2"); PrintAndLogEx(NORMAL, " i m = MMX"); -#endif #endif PrintAndLogEx(NORMAL, " i n = none (use CPU regular instruction set)"); PrintAndLogEx(NORMAL, ""); @@ -228,15 +226,13 @@ static int usage_hf14_autopwn(void) { PrintAndLogEx(NORMAL, " * 2 = 2k"); PrintAndLogEx(NORMAL, " * 4 = 4k"); PrintAndLogEx(NORMAL, " i set type of SIMD instructions for hardnested. Default: autodetection."); -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) PrintAndLogEx(NORMAL, " i 5 = AVX512"); #endif +#if defined(COMPILER_HAS_SIMD) PrintAndLogEx(NORMAL, " i 2 = AVX2"); PrintAndLogEx(NORMAL, " i a = AVX"); PrintAndLogEx(NORMAL, " i s = SSE2"); -#endif #endif PrintAndLogEx(NORMAL, " i m = MMX"); PrintAndLogEx(NORMAL, " i n = none (use CPU regular instruction set)"); @@ -1817,13 +1813,12 @@ static int CmdHF14AMfNestedHard(const char *Cmd) { SetSIMDInstr(SIMD_AUTO); ctmp = tolower(param_getchar(Cmd, cmdp + 1)); switch (ctmp) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) case '5': SetSIMDInstr(SIMD_AVX512); break; #endif +#if defined(COMPILER_HAS_SIMD) case '2': SetSIMDInstr(SIMD_AVX2); break; @@ -1836,7 +1831,6 @@ static int CmdHF14AMfNestedHard(const char *Cmd) { case 'm': SetSIMDInstr(SIMD_MMX); break; -#endif #endif case 'n': SetSIMDInstr(SIMD_NONE); @@ -2004,13 +1998,12 @@ static int CmdHF14AMfAutoPWN(const char *Cmd) { SetSIMDInstr(SIMD_AUTO); ctmp = tolower(param_getchar(Cmd, cmdp + 1)); switch (ctmp) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) case '5': SetSIMDInstr(SIMD_AVX512); break; #endif +#if defined(COMPILER_HAS_SIMD) case '2': SetSIMDInstr(SIMD_AVX2); break; @@ -2023,7 +2016,6 @@ static int CmdHF14AMfAutoPWN(const char *Cmd) { case 'm': SetSIMDInstr(SIMD_MMX); break; -#endif #endif case 'n': SetSIMDInstr(SIMD_NONE); diff --git a/client/src/cmdhfmfhard.c b/client/src/cmdhfmfhard.c index 6599a667e..52e3e4108 100644 --- a/client/src/cmdhfmfhard.c +++ b/client/src/cmdhfmfhard.c @@ -75,13 +75,12 @@ static float brute_force_per_second; static void get_SIMD_instruction_set(char *instruction_set) { switch (GetSIMDInstrAuto()) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) case SIMD_AVX512: strcpy(instruction_set, "AVX512F"); break; #endif +#if defined(COMPILER_HAS_SIMD) case SIMD_AVX2: strcpy(instruction_set, "AVX2"); break; @@ -94,7 +93,6 @@ static void get_SIMD_instruction_set(char *instruction_set) { case SIMD_MMX: strcpy(instruction_set, "MMX"); break; -#endif #endif case SIMD_AUTO: case SIMD_NONE: From 1ee8696e474a84839c602377e7225704c1e10dd3 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 13 May 2020 00:36:52 +0200 Subject: [PATCH 185/632] Fix issue #729. Avoid stalling on non-rdv4 when polling for FeliCa without card in proximity --- armsrc/felica.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/armsrc/felica.c b/armsrc/felica.c index 40536fa08..e72051bdc 100644 --- a/armsrc/felica.c +++ b/armsrc/felica.c @@ -431,7 +431,7 @@ bool WaitForFelicaReply(uint16_t maxbytes) { ); if (DBGLEVEL >= DBG_DEBUG) Dbprintf("All bytes received! STATE_FULL"); return true; - } else if (c++ > timeout && FelicaFrame.state == STATE_UNSYNCD) { + } else if (c++ > timeout && (FelicaFrame.state == STATE_UNSYNCD || FelicaFrame.state == STATE_TRYING_SYNC)) { if (DBGLEVEL >= DBG_DEBUG) Dbprintf("Error: Timeout! STATE_UNSYNCD"); return false; } From de47514aecfa7485e6dac8551c33dd84ce338780 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 13 May 2020 01:33:22 +0200 Subject: [PATCH 186/632] Fix for issue #730 --- Makefile.defs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile.defs b/Makefile.defs index be504caa9..88b746e5e 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -51,6 +51,8 @@ DEFCFLAGS += -Wbad-function-cast -Wredundant-decls -Wmissing-prototypes -Wchar-s # Some more warnings we need first to eliminate, so temporarely tolerated: DEFCFLAGS += -Wcast-align -Wno-error=cast-align DEFCFLAGS += -Wswitch-enum -Wno-error=switch-enum +# Termux on-device __BYTE_ORDER and __LITTLE_ENDIAN undef in src/proxendian.h, see #730 +DEFCFLAGS += -Wno-error=undef ifeq ($(platform),Darwin) # their readline has strict-prototype issues From 2c4eda6ab9b83e3d5853408c354d344d0255e0f0 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 13 May 2020 02:09:03 +0200 Subject: [PATCH 187/632] Fix 2 issues in proxendian.h, see details: Only some OSes include endian.h from sys/types.h, not Termux, so let's include endian.h directly. Moreover the past logic defined BYTE_ORDER to an undef macro, so BYTE_ORDER was not undef but def to 0 and BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN was always false as (0!=0 && 0!=0) --- Makefile.defs | 2 -- client/src/proxendian.h | 27 ++++++++++++++++----------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index 88b746e5e..be504caa9 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -51,8 +51,6 @@ DEFCFLAGS += -Wbad-function-cast -Wredundant-decls -Wmissing-prototypes -Wchar-s # Some more warnings we need first to eliminate, so temporarely tolerated: DEFCFLAGS += -Wcast-align -Wno-error=cast-align DEFCFLAGS += -Wswitch-enum -Wno-error=switch-enum -# Termux on-device __BYTE_ORDER and __LITTLE_ENDIAN undef in src/proxendian.h, see #730 -DEFCFLAGS += -Wno-error=undef ifeq ($(platform),Darwin) # their readline has strict-prototype issues diff --git a/client/src/proxendian.h b/client/src/proxendian.h index fde5126b1..3a025b7ac 100644 --- a/client/src/proxendian.h +++ b/client/src/proxendian.h @@ -16,17 +16,22 @@ #ifdef _WIN32 # define HOST_LITTLE_ENDIAN #else -# include -# ifndef BYTE_ORDER -# define BYTE_ORDER __BYTE_ORDER -# define LITTLE_ENDIAN __LITTLE_ENDIAN -# define BIG_ENDIAN __BIG_ENDIAN -# endif -# if !defined(BYTE_ORDER) || (BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN) -# error Define BYTE_ORDER to be equal to either LITTLE_ENDIAN or BIG_ENDIAN -# endif -# if BYTE_ORDER == LITTLE_ENDIAN -# define HOST_LITTLE_ENDIAN +// Only some OSes include endian.h from sys/types.h, not Termux, so let's include endian.h directly +# include +# if !defined(BYTE_ORDER) +# if !defined(__BYTE_ORDER) || (__BYTE_ORDER != __LITTLE_ENDIAN && __BYTE_ORDER != __BIG_ENDIAN) +# error Define BYTE_ORDER to be equal to either LITTLE_ENDIAN or BIG_ENDIAN +# endif +# if __BYTE_ORDER == __LITTLE_ENDIAN +# define HOST_LITTLE_ENDIAN +# endif +# else +# if BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN +# error Define BYTE_ORDER to be equal to either LITTLE_ENDIAN or BIG_ENDIAN +# endif +# if BYTE_ORDER == LITTLE_ENDIAN +# define HOST_LITTLE_ENDIAN +# endif # endif #endif From 97901a761f12c011c09a80eea36817000d2f18f5 Mon Sep 17 00:00:00 2001 From: Jamie Fiedler Date: Wed, 13 May 2020 03:35:38 -0400 Subject: [PATCH 188/632] use machine/endian.h with osx --- client/src/proxendian.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/client/src/proxendian.h b/client/src/proxendian.h index 3a025b7ac..8501858e0 100644 --- a/client/src/proxendian.h +++ b/client/src/proxendian.h @@ -17,7 +17,11 @@ # define HOST_LITTLE_ENDIAN #else // Only some OSes include endian.h from sys/types.h, not Termux, so let's include endian.h directly -# include +# if defined(__APPLE__) +# include +# else +# include +# endif # if !defined(BYTE_ORDER) # if !defined(__BYTE_ORDER) || (__BYTE_ORDER != __LITTLE_ENDIAN && __BYTE_ORDER != __BIG_ENDIAN) # error Define BYTE_ORDER to be equal to either LITTLE_ENDIAN or BIG_ENDIAN From 96108d826ab22d3409c24dfec4db1855bb1511f3 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 13 May 2020 12:24:28 +0200 Subject: [PATCH 189/632] fix coverity 286922 mem leak --- client/src/cmdhfmfdes.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index 5883f1675..7dad78f88 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -2474,7 +2474,11 @@ static int CmdHF14ADesWriteData(const char *Cmd) { PrintAndLogEx(ERR, "failed to allocate memory"); return PM3_EMALLOC; } - CLIGetHexWithReturn(4, data, &dlength); + if (CLIParamHexToBuf(arg_get_str(4), data, sizeof(data), &dlength)) { + free(data); + CLIParserFree(); + return PM3_ESOFT; + } int type = arg_get_int(5); From e2671d5b50c5b19a82a43055119f3475ee898757 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 13 May 2020 12:26:37 +0200 Subject: [PATCH 190/632] fix coverity 286654 wrong sized argument --- client/src/cmdhfmfdes.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index 7dad78f88..f86363638 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -2469,12 +2469,12 @@ static int CmdHF14ADesWriteData(const char *Cmd) { CLIGetHexWithReturn(3, offset, &offsetlength); int dlength = 0xFFFF; - uint8_t *data = (uint8_t *)calloc(0xFFFF, sizeof(uint8_t)); + uint8_t *data = (uint8_t *)calloc(dlength, sizeof(uint8_t)); if (data == NULL) { PrintAndLogEx(ERR, "failed to allocate memory"); return PM3_EMALLOC; } - if (CLIParamHexToBuf(arg_get_str(4), data, sizeof(data), &dlength)) { + if (CLIParamHexToBuf(arg_get_str(4), data, dlength, &dlength)) { free(data); CLIParserFree(); return PM3_ESOFT; From 6e7a8e1bfc5a1e3eadb4eeaa0464da50a507a84b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 13 May 2020 13:26:02 +0200 Subject: [PATCH 191/632] chg: enforce stricter limit checks for available pwds in flash mem --- armsrc/lfops.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/armsrc/lfops.c b/armsrc/lfops.c index 5c3e6973b..985ec3bd9 100644 --- a/armsrc/lfops.c +++ b/armsrc/lfops.c @@ -2030,7 +2030,7 @@ void T55xx_ChkPwds(uint8_t flags) { Dbprintf("[=] Baseline determined [%u]", baseline); uint8_t *pwds = BigBuf_get_EM_addr(); - uint16_t pwdCount = 0; + uint16_t pwd_count = 0; uint32_t candidate = 0; #ifdef WITH_FLASH @@ -2041,20 +2041,27 @@ void T55xx_ChkPwds(uint8_t flags) { if (isok != sizeof(counter)) goto OUT; - pwdCount = (uint16_t)(counter[1] << 8 | counter[0]); + pwd_count = (uint16_t)(counter[1] << 8 | counter[0]); + if (pwd_count == 0) + goto OUT; + + // since flash can report way too many pwds, we need to limit it. + // bigbuff EM size is determined by CARD_MEMORY_SIZE + // a password is 4bytes. + uint16_t pwd_size_available = MIN(CARD_MEMORY_SIZE, pwd_count * 4); + + // adjust available pwd_count + pwd_count = pwd_size_available / 4; - if (pwdCount == 0 || pwdCount == 0xFFFF) + isok = Flash_ReadData(DEFAULT_T55XX_KEYS_OFFSET + 2, pwds, pwd_size_available); + if (isok != pwd_size_available) goto OUT; - isok = Flash_ReadData(DEFAULT_T55XX_KEYS_OFFSET + 2, pwds, pwdCount * 4); - if (isok != pwdCount * 4) - goto OUT; - - Dbprintf("[=] Password dictionary count %d ", pwdCount); + Dbprintf("[=] Password dictionary count %d ", pwd_count); #endif uint32_t pwd = 0, curr = 0, prev = 0; - for (uint16_t i = 0; i < pwdCount; ++i) { + for (uint16_t i = 0; i < pwd_count; ++i) { if (BUTTON_PRESS() && !data_available()) { goto OUT; From b4cc7a9ad38b6db0f5ef8280fea0c48224313841 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 13 May 2020 13:40:52 +0200 Subject: [PATCH 192/632] coverity fix, stricter checks for available memory when checking mifare keys --- armsrc/mifarecmd.c | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index ad0b050c1..fcf69f666 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -1387,15 +1387,21 @@ void MifareChkKeys_fast(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *da keyCount = size[1] << 8 | size[0]; - if (keyCount == 0 || keyCount == 0xFFFF) + if (keyCount == 0) goto OUT; + + // limit size of availlable for keys in bigbuff + // a key is 6bytes + uint16_t key_mem_available = MIN(BIGBUF_SIZE, keyCount * 6); + + keyCount = key_mem_available / 6; - datain = BigBuf_malloc(keyCount * 6); + datain = BigBuf_malloc(key_mem_available); if (datain == NULL) goto OUT; - isok = Flash_ReadData(DEFAULT_MF_KEYS_OFFSET + 2, datain, keyCount * 6); - if (isok != keyCount * 6) + isok = Flash_ReadData(DEFAULT_MF_KEYS_OFFSET + 2, datain, key_mem_available); + if (isok != key_mem_available) goto OUT; } @@ -1702,14 +1708,16 @@ void MifareChkKeys(uint8_t *datain) { bool found; } PACKED keyresult; keyresult.found = false; - uint8_t blockNo, keyType; - uint16_t keyCount; - bool clearTrace, have_uid = false; + bool have_uid = false; - keyType = datain[0]; - blockNo = datain[1]; - clearTrace = datain[2]; - keyCount = (datain[3] << 8) | datain[4]; + uint8_t keyType = datain[0]; + uint8_t blockNo = datain[1]; + bool clearTrace = datain[2]; + uint16_t key_count = (datain[3] << 8) | datain[4]; + + uint16_t key_mem_available = MIN( (PM3_CMD_DATA_SIZE - 5) , key_count * 6); + key_count = key_mem_available / 6; + datain += 5; LEDsoff(); @@ -1725,7 +1733,7 @@ void MifareChkKeys(uint8_t *datain) { set_tracing(false); - for (i = 0; i < keyCount; i++) { + for (i = 0; i < key_count; i++) { // Iceman: use piwi's faster nonce collecting part in hardnested. if (!have_uid) { // need a full select cycle to get the uid first From 9af18071222335122511b86c1537c667f5604ad3 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 13 May 2020 17:29:56 +0200 Subject: [PATCH 193/632] chg: psk demodualtion, lets keep those starting samples to easily find the zero init bit --- client/src/cmdlft55xx.c | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/client/src/cmdlft55xx.c b/client/src/cmdlft55xx.c index 3c0c46077..48ff6dab2 100644 --- a/client/src/cmdlft55xx.c +++ b/client/src/cmdlft55xx.c @@ -960,24 +960,14 @@ bool DecodeT55xxBlock(void) { ans = ASKDemod_ext(cmdStr, false, false, 1, &ST); break; case DEMOD_PSK1: - // skip first 160 samples to allow antenna to settle in (psk gets inverted occasionally otherwise) - save_restoreGB(GRAPH_SAVE); - CmdLtrim("150"); snprintf(cmdStr, sizeof(buf), "%d %d 6", bitRate[config.bitrate], config.inverted); ans = PSKDemod(cmdStr, false); - //undo trim samples - save_restoreGB(GRAPH_RESTORE); break; case DEMOD_PSK2: //inverted won't affect this case DEMOD_PSK3: //not fully implemented - // skip first 160 samples to allow antenna to settle in (psk gets inverted occasionally otherwise) - save_restoreGB(GRAPH_SAVE); - CmdLtrim("150"); snprintf(cmdStr, sizeof(buf), "%d 0 6", bitRate[config.bitrate]); ans = PSKDemod(cmdStr, false); psk1TOpsk2(DemodBuffer, DemodBufferLen); - //undo trim samples - save_restoreGB(GRAPH_RESTORE); break; case DEMOD_NRZ: snprintf(cmdStr, sizeof(buf), "%d %d 1", bitRate[config.bitrate], config.inverted); From cb56ca37ff7b3cb5d6b4a156f1c289b4834e72e8 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 13 May 2020 17:31:50 +0200 Subject: [PATCH 194/632] make cppchecker happier --- common/generator.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/common/generator.c b/common/generator.c index b405fec1a..513806fba 100644 --- a/common/generator.c +++ b/common/generator.c @@ -214,6 +214,7 @@ int mfc_algo_ving_all(uint8_t *uid, uint8_t *keys) { int mfc_algo_yale_one(uint8_t *uid, uint8_t sector, uint8_t keytype, uint64_t *key) { if (sector > 15) return PM3_EINVARG; if (key == NULL) return PM3_EINVARG; + if (keytype > 2) return PM3_EINVARG; *key = 0; return PM3_SUCCESS; } @@ -233,6 +234,7 @@ int mfc_algo_yale_all(uint8_t *uid, uint8_t *keys) { int mfc_algo_saflok_one(uint8_t *uid, uint8_t sector, uint8_t keytype, uint64_t *key) { if (sector > 15) return PM3_EINVARG; if (key == NULL) return PM3_EINVARG; + if (keytype > 2) return PM3_EINVARG; *key = 0; return PM3_SUCCESS; } @@ -253,6 +255,7 @@ int mfc_algo_saflok_all(uint8_t *uid, uint8_t *keys) { int mfc_algo_mizip_one(uint8_t *uid, uint8_t sector, uint8_t keytype, uint64_t *key) { if (sector > 4) return PM3_EINVARG; if (key == NULL) return PM3_EINVARG; + if (keytype > 2) return PM3_EINVARG; if (sector == 0) { // A From af47a3fd347dd5ad85e5267e7b2ae2c21ecca5af Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 13 May 2020 20:16:29 +0200 Subject: [PATCH 195/632] chg: copied from pm3 repo --- tools/hitag2crack/crack5/ht2crack5.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/tools/hitag2crack/crack5/ht2crack5.c b/tools/hitag2crack/crack5/ht2crack5.c index 7f10ccd6b..d07d03b64 100644 --- a/tools/hitag2crack/crack5/ht2crack5.c +++ b/tools/hitag2crack/crack5/ht2crack5.c @@ -93,6 +93,24 @@ const uint64_t unbitslice(const bitslice_t *restrict b, const uint8_t s, const u return result; } + +// determine number of logical CPU cores (use for multithreaded functions) +static int num_CPUs(void) { +#if defined(_WIN32) +#include + SYSTEM_INFO sysinfo; + GetSystemInfo(&sysinfo); + return sysinfo.dwNumberOfProcessors; +#else +#include + int count = sysconf(_SC_NPROCESSORS_ONLN); + if (count < 2) + count = 2; + return count; +#endif +} + + uint32_t uid, nR1, aR1, nR2, aR2; uint64_t candidates[(1 << 20)]; @@ -116,12 +134,7 @@ int main(int argc, char *argv[]) { uint32_t target = 0; -#ifndef __WIN32 - thread_count = sysconf(_SC_NPROCESSORS_CONF); - if (thread_count < 2) - thread_count = 2; -#endif /* _WIN32 */ - + thread_count = num_CPUs(); if (!strncmp(argv[1], "0x", 2) || !strncmp(argv[1], "0X", 2)) { uid = rev32(hexreversetoulong(argv[1] + 2)); From 6a006677ef527d09d49af2bb6e61b3de7ac9835a Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 13 May 2020 23:20:46 +0200 Subject: [PATCH 196/632] fancy timers --- client/src/cmddata.c | 14 ++++++++------ client/src/comms.c | 6 +++--- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 9125184be..d85271c85 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -1671,19 +1671,21 @@ int CmdTuneSamples(const char *Cmd) { RepaintGraphWindow(); int timeout = 0; + int timeout_max = 20; PrintAndLogEx(INFO, "Measuring antenna characteristics, please wait..."); clearCommandBuffer(); SendCommandNG(CMD_MEASURE_ANTENNA_TUNING, NULL, 0); PacketResponseNG resp; - while (!WaitForResponseTimeout(CMD_MEASURE_ANTENNA_TUNING, &resp, 2000)) { - timeout++; - printf("."); + PrintAndLogEx(INPLACE, "% 3i", timeout_max - timeout); + while (!WaitForResponseTimeout(CMD_MEASURE_ANTENNA_TUNING, &resp, 500)) { fflush(stdout); - if (timeout > 7) { + if (timeout >= timeout_max) { PrintAndLogEx(WARNING, "\nNo response from Proxmark3. Aborting..."); return PM3_ETIMEOUT; } + timeout++; + PrintAndLogEx(INPLACE, "% 3i", timeout_max - timeout); } if (resp.status != PM3_SUCCESS) { @@ -1728,7 +1730,7 @@ int CmdTuneSamples(const char *Cmd) { else sprintf(judgement, _GREEN_("OK")); - PrintAndLogEx(NORMAL, "%sLF antenna is %s \n" + PrintAndLogEx(NORMAL, "%s LF antenna is %s \n" , (package->peak_v < LF_UNUSABLE_V) ? _CYAN_("[!]") : _GREEN_("[+]") , judgement ); @@ -1746,7 +1748,7 @@ int CmdTuneSamples(const char *Cmd) { else sprintf(judgement, _GREEN_("OK")); - PrintAndLogEx(NORMAL, "%sHF antenna is %s" + PrintAndLogEx(NORMAL, "%s HF antenna is %s" , (package->v_hf < HF_UNUSABLE_V) ? _CYAN_("[!]") : _GREEN_("[+]") , judgement ); diff --git a/client/src/comms.c b/client/src/comms.c index 4c0a8d990..eb4548ecd 100644 --- a/client/src/comms.c +++ b/client/src/comms.c @@ -547,12 +547,12 @@ bool OpenProxmark(void *port, bool wait_for_port, int timeout, bool flash_mode, PrintAndLogEx(SUCCESS, "Waiting for Proxmark3 to appear on " _YELLOW_("%s"), portname); fflush(stdout); int openCount = 0; - PrintAndLogEx(INPLACE, ""); + PrintAndLogEx(INPLACE, "% 3i", timeout); do { sp = uart_open(portname, speed); msleep(500); - printf("."); - fflush(stdout); + PrintAndLogEx(INPLACE, "% 3i", timeout - openCount -1); + } while (++openCount < timeout && (sp == INVALID_SERIAL_PORT || sp == CLAIMED_SERIAL_PORT)); } From 16f51079155218a61434d05b52fc5b25dad9dbf2 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 13 May 2020 23:30:42 +0200 Subject: [PATCH 197/632] cppcheck mem leak --- client/android/jni_tools.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/client/android/jni_tools.c b/client/android/jni_tools.c index 6e12da2be..5c7558853 100644 --- a/client/android/jni_tools.c +++ b/client/android/jni_tools.c @@ -50,7 +50,10 @@ CMD *parse_command_line(const char *commandStr) { // new memory size is default 20 for char ** int size = 20; cmd->cmd = (char **) malloc(size * sizeof(char **)); - if (!cmd->cmd) return NULL; + if (!cmd->cmd) { + free(cmd); + return NULL; + } // parse char *pStr = strtok(pTmp, " "); cmd->cmd[0] = pStr; From 997567a9d68fa9227a25739c52f992988335f4af Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 13 May 2020 23:31:01 +0200 Subject: [PATCH 198/632] cppcheck out-of-bounds --- client/src/cmdlfnexwatch.c | 53 +++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/client/src/cmdlfnexwatch.c b/client/src/cmdlfnexwatch.c index a8f783ef7..9f825a438 100644 --- a/client/src/cmdlfnexwatch.c +++ b/client/src/cmdlfnexwatch.c @@ -80,9 +80,9 @@ static uint8_t nexwatch_parity_swap(uint8_t parity) { a |= (((parity >> 1 ) & 1) << 1); a |= (((parity >> 2 ) & 1) << 2); a |= ((parity & 1) << 3); - return a; + return a; } -// parity check +// parity check // from 32b hex id, 4b mode, static uint8_t nexwatch_parity(uint8_t hexid[5]) { uint8_t p = 0; @@ -112,7 +112,7 @@ static uint8_t nexwatch_checksum(uint8_t magic, uint32_t id, uint8_t parity) { static int nexwatch_scamble(NexWatchScramble_t action, uint32_t *id, uint32_t *scambled) { // 255 = Not used/Unknown other values are the bit offset in the ID/FC values - uint8_t hex_2_id [] = { + uint8_t hex_2_id [] = { 31, 27, 23, 19, 15, 11, 7, 3, 30, 26, 22, 18, 14, 10, 6, 2, 29, 25, 21, 17, 13, 9, 5, 1, @@ -136,7 +136,7 @@ static int nexwatch_scamble(NexWatchScramble_t action, uint32_t *id, uint32_t *s *scambled = 0; for (uint8_t idx = 0; idx < 32; idx++) { - if (hex_2_id[idx] == 255) + if (hex_2_id[idx] == 255) continue; bool bit_state = (*id >> idx) & 1; @@ -176,16 +176,16 @@ int demodNexWatch(void) { // skip the 4 first bits from the nexwatch preamble identification (we use 4 extra zeros..) idx += 4; - + setDemodBuff(DemodBuffer, size, idx); setClockGrid(g_DemodClock, g_DemodStartIdx + (idx * g_DemodClock)); - + if (invert) { PrintAndLogEx(INFO, "Inverted the demodulated data"); for (size_t i = 0; i < size; i++) DemodBuffer[i] ^= 1; } - + //got a good demod uint32_t raw1 = bytebits_to_byte(DemodBuffer, 32); uint32_t raw2 = bytebits_to_byte(DemodBuffer + 32, 32); @@ -203,12 +203,12 @@ int demodNexWatch(void) { uint32_t cn = 0; uint32_t scambled = bytebits_to_byte(DemodBuffer + 8 + 32, 32); nexwatch_scamble(DESCRAMBLE, &cn, &scambled); - + uint8_t mode = bytebits_to_byte(DemodBuffer + 72, 4); uint8_t parity = bytebits_to_byte(DemodBuffer + 76, 4); uint8_t chk = bytebits_to_byte(DemodBuffer + 80, 8); - - // parity check + + // parity check // from 32b hex id, 4b mode uint8_t hex[5] = {0}; for (uint8_t i = 0; i < 5; i++) { @@ -217,8 +217,8 @@ int demodNexWatch(void) { // mode is only 4 bits. hex[4] &= 0xf0; uint8_t calc_parity = nexwatch_parity(hex); - - // Checksum + + // Checksum typedef struct { uint8_t magic; char desc[10]; @@ -226,9 +226,9 @@ int demodNexWatch(void) { } nexwatch_magic_t; nexwatch_magic_t items[] = { {0xBE, "Quadrakey", 0}, {0x88, "Nexkey", 0} }; - uint8_t m_idx; + uint8_t m_idx; for ( m_idx = 0; m_idx < ARRAYLEN(items); m_idx++) { - + items[m_idx].chk = nexwatch_checksum(items[m_idx].magic, cn, calc_parity); if (items[m_idx].chk == chk) { break; @@ -238,20 +238,20 @@ int demodNexWatch(void) { // output PrintAndLogEx(SUCCESS, " NexWatch raw id : " _YELLOW_("0x%"PRIx32) , rawid); - if (m_idx < 3) { - PrintAndLogEx(SUCCESS, " fingerprint : " _GREEN_("%s"), items[m_idx].desc); + if (m_idx < ARRAYLEN(items)) { + PrintAndLogEx(SUCCESS, " fingerprint : " _GREEN_("%s"), items[m_idx].desc); } PrintAndLogEx(SUCCESS, " 88bit id : " _YELLOW_("%"PRIu32) " (" _YELLOW_("0x%"PRIx32)")", cn, cn); - PrintAndLogEx(SUCCESS, " mode : %x", mode); + PrintAndLogEx(SUCCESS, " mode : %x", mode); if ( parity == calc_parity) { PrintAndLogEx(SUCCESS, " parity : %s (0x%X)", _GREEN_("ok"), parity); } else { - PrintAndLogEx(WARNING, " parity : %s (0x%X != 0x%X)", _RED_("fail"), parity, calc_parity); + PrintAndLogEx(WARNING, " parity : %s (0x%X != 0x%X)", _RED_("fail"), parity, calc_parity); } - if (m_idx < 3) { - PrintAndLogEx(SUCCESS, " checksum : %s (0x%02X)", _GREEN_("ok"), chk); + if (m_idx < ARRAYLEN(items)) { + PrintAndLogEx(SUCCESS, " checksum : %s (0x%02X)", _GREEN_("ok"), chk); } else { - PrintAndLogEx(WARNING, " checksum : %s (0x%02X != 0x%02X)", _RED_("fail"), chk, items[m_idx].chk); + PrintAndLogEx(WARNING, " checksum : %s (0x%02X)", _RED_("fail"), chk); } PrintAndLogEx(INFO, " raw : " _YELLOW_("%"PRIX32"%"PRIX32"%"PRIX32), raw1, raw2, raw3); @@ -281,7 +281,7 @@ static int CmdNexWatchClone(const char *Cmd) { uint8_t magic = 0xBE; uint32_t cn = 0; uint8_t rawhex[16] = {0x56, 0}; - + while (param_getchar(Cmd, cmdp) != 0x00 && !errors) { switch (tolower(param_getchar(Cmd, cmdp))) { case 'h': @@ -319,7 +319,7 @@ static int CmdNexWatchClone(const char *Cmd) { magic = 0xBE; cmdp++; break; - } + } default: PrintAndLogEx(WARNING, "Unknown parameter '%c'", param_getchar(Cmd, cmdp)); errors = true; @@ -331,13 +331,13 @@ static int CmdNexWatchClone(const char *Cmd) { //Nexwatch - compat mode, PSK, data rate 40, 3 data blocks blocks[0] = T55x7_MODULATION_PSK1 | T55x7_BITRATE_RF_32 | 3 << T55x7_MAXBLOCK_SHIFT; - + if (use_raw == false) { uint8_t parity = nexwatch_parity(rawhex + 5) & 0xF; rawhex[9] |= parity; rawhex[10] |= nexwatch_checksum(magic, cn, parity); } - + for (uint8_t i = 1; i < ARRAYLEN(blocks); i++) { blocks[i] = bytes_to_num(rawhex + ((i - 1) * 4), sizeof(uint32_t)); } @@ -360,7 +360,6 @@ static int CmdNexWatchSim(const char *Cmd) { int rawlen = sizeof(rawhex); uint8_t magic = 0xBE; uint32_t cn = 0; - uint8_t bs[128]; memset(bs, 0, sizeof(bs)); @@ -401,7 +400,7 @@ static int CmdNexWatchSim(const char *Cmd) { magic = 0xBE; cmdp++; break; - } + } default: PrintAndLogEx(WARNING, "Unknown parameter '%c'", param_getchar(Cmd, cmdp)); errors = true; From 6cadbbc3e74a35a88552659d00becf1d1a21a5ae Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 13 May 2020 23:31:28 +0200 Subject: [PATCH 199/632] cppcheck ...silly --- common_arm/usb_cdc.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common_arm/usb_cdc.h b/common_arm/usb_cdc.h index b5ec2e8d7..2f6c5b15d 100644 --- a/common_arm/usb_cdc.h +++ b/common_arm/usb_cdc.h @@ -52,9 +52,9 @@ int GetUSBreconnect(void); void SetUSBconfigured(int value); int GetUSBconfigured(void); -void AT91F_USB_SendData(AT91PS_UDP pUdp, const char *pData, uint32_t length); -void AT91F_USB_SendZlp(AT91PS_UDP pUdp); -void AT91F_USB_SendStall(AT91PS_UDP pUdp); +void AT91F_USB_SendData(AT91PS_UDP pudp, const char *pData, uint32_t length); +void AT91F_USB_SendZlp(AT91PS_UDP pudp); +void AT91F_USB_SendStall(AT91PS_UDP pudp); void AT91F_CDC_Enumerate(void); #endif // _USB_CDC_H_ From c43b9085f9e929aa0333bff09cc19bcfe075b34f Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 14 May 2020 00:31:12 +0200 Subject: [PATCH 200/632] fix coverity 274112 unintended sign extension --- armsrc/hitagS.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/armsrc/hitagS.c b/armsrc/hitagS.c index 00d204ce3..2f07a3468 100644 --- a/armsrc/hitagS.c +++ b/armsrc/hitagS.c @@ -889,9 +889,12 @@ void SimulateHitagSTag(bool tag_mem_supplied, uint8_t *data) { } tag.uid = ((tag.pages[0][3]) << 24) | ((tag.pages[0][2]) << 16) | ((tag.pages[0][1]) << 8) | tag.pages[0][0]; - tag.key = ((tag.pages[3][3]) << 24) | ((tag.pages[3][2]) << 16) | ((tag.pages[3][1]) << 8) | tag.pages[3][0]; - tag.key <<= 16; - tag.key += ((tag.pages[2][3]) << 8) + tag.pages[2][2]; + tag.key = (((uint64_t)tag.pages[3][3]) << 40) | + (((uint64_t)tag.pages[3][2]) << 32) | + (((uint64_t)tag.pages[3][1]) << 24) | + (((uint64_t)tag.pages[3][0]) << 16) | + (((uint64_t)tag.pages[2][3]) << 8) | + (((uint64_t)tag.pages[2][2])); tag.pwdl0 = tag.pages[2][0]; tag.pwdl1 = tag.pages[2][1]; tag.pwdh0 = tag.pages[1][3]; From 1c8c1d82eaf28edf3279730f66198529023a69c1 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 14 May 2020 01:01:48 +0200 Subject: [PATCH 201/632] fix coverity 267211 & 267206 logically dead code --- armsrc/hitag2.c | 32 +++++++++++++++++++------------- include/hitag.h | 3 +++ 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/armsrc/hitag2.c b/armsrc/hitag2.c index 4387bdbb0..b58ca1b81 100644 --- a/armsrc/hitag2.c +++ b/armsrc/hitag2.c @@ -1397,21 +1397,23 @@ void ReaderHitag(hitag_function htf, hitag_data *htd) { uint8_t attempt_count = 0; // Tag specific configuration settings (sof, timings, etc.) - if (htf < 10) { +// TODO HTS +/* if (htf <= HTS_LAST_CMD) { // hitagS settings t_wait_1 = 204; t_wait_2 = 128; flipped_bit = 0; tag_size = 8; DBG DbpString("Configured for hitagS reader"); - } else if (htf < 20) { + } else */ + if (htf <= HT1_LAST_CMD) { // hitag1 settings t_wait_1 = 204; t_wait_2 = 128; tag_size = 256; flipped_bit = 0; DBG DbpString("Configured for hitag1 reader"); - } else if (htf < 30) { + } else if (htf <= HT2_LAST_CMD) { // hitag2 settings t_wait_1 = HITAG_T_WAIT_1_MIN; t_wait_2 = HITAG_T_WAIT_2_MIN; @@ -1721,28 +1723,32 @@ void WriterHitag(hitag_function htf, hitag_data *htd, int page) { lf_init(true, false); // Tag specific configuration settings (sof, timings, etc.) - if (htf < 10) { +// TODO HTS +/* if (htf <= HTS_LAST_CMD) { // hitagS settings t_wait_1 = 204; t_wait_2 = 128; - /*tag_size = 256;*/ + //tag_size = 256; flipped_bit = 0; tag_size = 8; DbpString("Configured for hitagS writer"); - } else if (htf < 20) { + } else */ +// TODO HT1 +/* if (htf <= HT1_LAST_CMD) { // hitag1 settings t_wait_1 = 204; t_wait_2 = 128; tag_size = 256; flipped_bit = 0; DbpString("Configured for hitag1 writer"); - } else if (htf < 30) { - // hitag2 settings - t_wait_1 = HITAG_T_WAIT_1_MIN; - t_wait_2 = HITAG_T_WAIT_2_MIN; - tag_size = 48; - DbpString("Configured for hitag2 writer"); - } + } else */ +// if (htf <= HT2_LAST_CMD) { + // hitag2 settings + t_wait_1 = HITAG_T_WAIT_1_MIN; + t_wait_2 = HITAG_T_WAIT_2_MIN; + tag_size = 48; + DbpString("Configured for hitag2 writer"); +// } uint8_t tag_modulation; size_t max_nrzs = (8 * HITAG_FRAME_LEN + 5) * 2; // up to 2 nrzs per bit diff --git a/include/hitag.h b/include/hitag.h index af90c9f88..14231bdeb 100644 --- a/include/hitag.h +++ b/include/hitag.h @@ -21,8 +21,10 @@ typedef enum { RHTSF_KEY = 02, WHTSF_CHALLENGE = 03, WHTSF_KEY = 04, + HTS_LAST_CMD = WHTSF_KEY, RHT1F_PLAIN = 11, RHT1F_AUTHENTICATE = 12, + HT1_LAST_CMD = RHT1F_AUTHENTICATE, RHT2F_PASSWORD = 21, RHT2F_AUTHENTICATE = 22, RHT2F_CRYPTO = 23, @@ -30,6 +32,7 @@ typedef enum { RHT2F_TEST_AUTH_ATTEMPTS = 25, RHT2F_UID_ONLY = 26, WHT2F_PASSWORD = 27, + HT2_LAST_CMD = WHT2F_PASSWORD, } hitag_function; typedef struct { From ffdd338dea860b765fb5fe26bb996c9adc81f911 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 14 May 2020 01:04:26 +0200 Subject: [PATCH 202/632] make style --- armsrc/hitag2.c | 50 +++--- armsrc/lfops.c | 6 +- armsrc/mifarecmd.c | 8 +- client/deps/hardnested/hardnested_bf_core.c | 12 +- .../hardnested/hardnested_bitarray_core.c | 156 +++++++++--------- client/src/cmdlfnexwatch.c | 27 +-- client/src/cmdlft55xx.c | 2 +- client/src/comms.c | 2 +- 8 files changed, 132 insertions(+), 131 deletions(-) diff --git a/armsrc/hitag2.c b/armsrc/hitag2.c index b58ca1b81..03aedc7a1 100644 --- a/armsrc/hitag2.c +++ b/armsrc/hitag2.c @@ -1398,14 +1398,14 @@ void ReaderHitag(hitag_function htf, hitag_data *htd) { // Tag specific configuration settings (sof, timings, etc.) // TODO HTS -/* if (htf <= HTS_LAST_CMD) { - // hitagS settings - t_wait_1 = 204; - t_wait_2 = 128; - flipped_bit = 0; - tag_size = 8; - DBG DbpString("Configured for hitagS reader"); - } else */ + /* if (htf <= HTS_LAST_CMD) { + // hitagS settings + t_wait_1 = 204; + t_wait_2 = 128; + flipped_bit = 0; + tag_size = 8; + DBG DbpString("Configured for hitagS reader"); + } else */ if (htf <= HT1_LAST_CMD) { // hitag1 settings t_wait_1 = 204; @@ -1724,24 +1724,24 @@ void WriterHitag(hitag_function htf, hitag_data *htd, int page) { // Tag specific configuration settings (sof, timings, etc.) // TODO HTS -/* if (htf <= HTS_LAST_CMD) { - // hitagS settings - t_wait_1 = 204; - t_wait_2 = 128; - //tag_size = 256; - flipped_bit = 0; - tag_size = 8; - DbpString("Configured for hitagS writer"); - } else */ + /* if (htf <= HTS_LAST_CMD) { + // hitagS settings + t_wait_1 = 204; + t_wait_2 = 128; + //tag_size = 256; + flipped_bit = 0; + tag_size = 8; + DbpString("Configured for hitagS writer"); + } else */ // TODO HT1 -/* if (htf <= HT1_LAST_CMD) { - // hitag1 settings - t_wait_1 = 204; - t_wait_2 = 128; - tag_size = 256; - flipped_bit = 0; - DbpString("Configured for hitag1 writer"); - } else */ + /* if (htf <= HT1_LAST_CMD) { + // hitag1 settings + t_wait_1 = 204; + t_wait_2 = 128; + tag_size = 256; + flipped_bit = 0; + DbpString("Configured for hitag1 writer"); + } else */ // if (htf <= HT2_LAST_CMD) { // hitag2 settings t_wait_1 = HITAG_T_WAIT_1_MIN; diff --git a/armsrc/lfops.c b/armsrc/lfops.c index 985ec3bd9..7eececdc9 100644 --- a/armsrc/lfops.c +++ b/armsrc/lfops.c @@ -2041,15 +2041,15 @@ void T55xx_ChkPwds(uint8_t flags) { if (isok != sizeof(counter)) goto OUT; - pwd_count = (uint16_t)(counter[1] << 8 | counter[0]); + pwd_count = (uint16_t)(counter[1] << 8 | counter[0]); if (pwd_count == 0) goto OUT; - + // since flash can report way too many pwds, we need to limit it. // bigbuff EM size is determined by CARD_MEMORY_SIZE // a password is 4bytes. uint16_t pwd_size_available = MIN(CARD_MEMORY_SIZE, pwd_count * 4); - + // adjust available pwd_count pwd_count = pwd_size_available / 4; diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index fcf69f666..79efc8b9f 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -1389,11 +1389,11 @@ void MifareChkKeys_fast(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *da if (keyCount == 0) goto OUT; - + // limit size of availlable for keys in bigbuff // a key is 6bytes uint16_t key_mem_available = MIN(BIGBUF_SIZE, keyCount * 6); - + keyCount = key_mem_available / 6; datain = BigBuf_malloc(key_mem_available); @@ -1715,9 +1715,9 @@ void MifareChkKeys(uint8_t *datain) { bool clearTrace = datain[2]; uint16_t key_count = (datain[3] << 8) | datain[4]; - uint16_t key_mem_available = MIN( (PM3_CMD_DATA_SIZE - 5) , key_count * 6); + uint16_t key_mem_available = MIN((PM3_CMD_DATA_SIZE - 5), key_count * 6); key_count = key_mem_available / 6; - + datain += 5; LEDsoff(); diff --git a/client/deps/hardnested/hardnested_bf_core.c b/client/deps/hardnested/hardnested_bf_core.c index a5196be37..b8fd56cf2 100644 --- a/client/deps/hardnested/hardnested_bf_core.c +++ b/client/deps/hardnested/hardnested_bf_core.c @@ -564,13 +564,13 @@ static SIMDExecInstr GetSIMDInstr(void) { else #endif #if defined(COMPILER_HAS_SIMD) - if (__builtin_cpu_supports("avx2")) instr = SIMD_AVX2; - else if (__builtin_cpu_supports("avx")) instr = SIMD_AVX; - else if (__builtin_cpu_supports("sse2")) instr = SIMD_SSE2; - else if (__builtin_cpu_supports("mmx")) instr = SIMD_MMX; - else + if (__builtin_cpu_supports("avx2")) instr = SIMD_AVX2; + else if (__builtin_cpu_supports("avx")) instr = SIMD_AVX; + else if (__builtin_cpu_supports("sse2")) instr = SIMD_SSE2; + else if (__builtin_cpu_supports("mmx")) instr = SIMD_MMX; + else #endif - instr = SIMD_NONE; + instr = SIMD_NONE; return instr; } diff --git a/client/deps/hardnested/hardnested_bitarray_core.c b/client/deps/hardnested/hardnested_bitarray_core.c index 19d1274f9..d62da774c 100644 --- a/client/deps/hardnested/hardnested_bitarray_core.c +++ b/client/deps/hardnested/hardnested_bitarray_core.c @@ -311,13 +311,13 @@ uint32_t *malloc_bitarray_dispatch(uint32_t x) { else #endif #if defined(COMPILER_HAS_SIMD) - if (__builtin_cpu_supports("avx2")) malloc_bitarray_function_p = &malloc_bitarray_AVX2; - else if (__builtin_cpu_supports("avx")) malloc_bitarray_function_p = &malloc_bitarray_AVX; - else if (__builtin_cpu_supports("sse2")) malloc_bitarray_function_p = &malloc_bitarray_SSE2; - else if (__builtin_cpu_supports("mmx")) malloc_bitarray_function_p = &malloc_bitarray_MMX; - else + if (__builtin_cpu_supports("avx2")) malloc_bitarray_function_p = &malloc_bitarray_AVX2; + else if (__builtin_cpu_supports("avx")) malloc_bitarray_function_p = &malloc_bitarray_AVX; + else if (__builtin_cpu_supports("sse2")) malloc_bitarray_function_p = &malloc_bitarray_SSE2; + else if (__builtin_cpu_supports("mmx")) malloc_bitarray_function_p = &malloc_bitarray_MMX; + else #endif - malloc_bitarray_function_p = &malloc_bitarray_NOSIMD; + malloc_bitarray_function_p = &malloc_bitarray_NOSIMD; // call the most optimized function for this CPU return (*malloc_bitarray_function_p)(x); @@ -329,13 +329,13 @@ void free_bitarray_dispatch(uint32_t *x) { else #endif #if defined(COMPILER_HAS_SIMD) - if (__builtin_cpu_supports("avx2")) free_bitarray_function_p = &free_bitarray_AVX2; - else if (__builtin_cpu_supports("avx")) free_bitarray_function_p = &free_bitarray_AVX; - else if (__builtin_cpu_supports("sse2")) free_bitarray_function_p = &free_bitarray_SSE2; - else if (__builtin_cpu_supports("mmx")) free_bitarray_function_p = &free_bitarray_MMX; - else + if (__builtin_cpu_supports("avx2")) free_bitarray_function_p = &free_bitarray_AVX2; + else if (__builtin_cpu_supports("avx")) free_bitarray_function_p = &free_bitarray_AVX; + else if (__builtin_cpu_supports("sse2")) free_bitarray_function_p = &free_bitarray_SSE2; + else if (__builtin_cpu_supports("mmx")) free_bitarray_function_p = &free_bitarray_MMX; + else #endif - free_bitarray_function_p = &free_bitarray_NOSIMD; + free_bitarray_function_p = &free_bitarray_NOSIMD; // call the most optimized function for this CPU (*free_bitarray_function_p)(x); @@ -347,13 +347,13 @@ uint32_t bitcount_dispatch(uint32_t a) { else #endif #if defined(COMPILER_HAS_SIMD) - if (__builtin_cpu_supports("avx2")) bitcount_function_p = &bitcount_AVX2; - else if (__builtin_cpu_supports("avx")) bitcount_function_p = &bitcount_AVX; - else if (__builtin_cpu_supports("sse2")) bitcount_function_p = &bitcount_SSE2; - else if (__builtin_cpu_supports("mmx")) bitcount_function_p = &bitcount_MMX; - else + if (__builtin_cpu_supports("avx2")) bitcount_function_p = &bitcount_AVX2; + else if (__builtin_cpu_supports("avx")) bitcount_function_p = &bitcount_AVX; + else if (__builtin_cpu_supports("sse2")) bitcount_function_p = &bitcount_SSE2; + else if (__builtin_cpu_supports("mmx")) bitcount_function_p = &bitcount_MMX; + else #endif - bitcount_function_p = &bitcount_NOSIMD; + bitcount_function_p = &bitcount_NOSIMD; // call the most optimized function for this CPU return (*bitcount_function_p)(a); @@ -365,13 +365,13 @@ uint32_t count_states_dispatch(uint32_t *bitarray) { else #endif #if defined(COMPILER_HAS_SIMD) - if (__builtin_cpu_supports("avx2")) count_states_function_p = &count_states_AVX2; - else if (__builtin_cpu_supports("avx")) count_states_function_p = &count_states_AVX; - else if (__builtin_cpu_supports("sse2")) count_states_function_p = &count_states_SSE2; - else if (__builtin_cpu_supports("mmx")) count_states_function_p = &count_states_MMX; - else + if (__builtin_cpu_supports("avx2")) count_states_function_p = &count_states_AVX2; + else if (__builtin_cpu_supports("avx")) count_states_function_p = &count_states_AVX; + else if (__builtin_cpu_supports("sse2")) count_states_function_p = &count_states_SSE2; + else if (__builtin_cpu_supports("mmx")) count_states_function_p = &count_states_MMX; + else #endif - count_states_function_p = &count_states_NOSIMD; + count_states_function_p = &count_states_NOSIMD; // call the most optimized function for this CPU return (*count_states_function_p)(bitarray); @@ -383,13 +383,13 @@ void bitarray_AND_dispatch(uint32_t *A, uint32_t *B) { else #endif #if defined(COMPILER_HAS_SIMD) - if (__builtin_cpu_supports("avx2")) bitarray_AND_function_p = &bitarray_AND_AVX2; - else if (__builtin_cpu_supports("avx")) bitarray_AND_function_p = &bitarray_AND_AVX; - else if (__builtin_cpu_supports("sse2")) bitarray_AND_function_p = &bitarray_AND_SSE2; - else if (__builtin_cpu_supports("mmx")) bitarray_AND_function_p = &bitarray_AND_MMX; - else + if (__builtin_cpu_supports("avx2")) bitarray_AND_function_p = &bitarray_AND_AVX2; + else if (__builtin_cpu_supports("avx")) bitarray_AND_function_p = &bitarray_AND_AVX; + else if (__builtin_cpu_supports("sse2")) bitarray_AND_function_p = &bitarray_AND_SSE2; + else if (__builtin_cpu_supports("mmx")) bitarray_AND_function_p = &bitarray_AND_MMX; + else #endif - bitarray_AND_function_p = &bitarray_AND_NOSIMD; + bitarray_AND_function_p = &bitarray_AND_NOSIMD; // call the most optimized function for this CPU (*bitarray_AND_function_p)(A, B); @@ -401,13 +401,13 @@ void bitarray_low20_AND_dispatch(uint32_t *A, uint32_t *B) { else #endif #if defined(COMPILER_HAS_SIMD) - if (__builtin_cpu_supports("avx2")) bitarray_low20_AND_function_p = &bitarray_low20_AND_AVX2; - else if (__builtin_cpu_supports("avx")) bitarray_low20_AND_function_p = &bitarray_low20_AND_AVX; - else if (__builtin_cpu_supports("sse2")) bitarray_low20_AND_function_p = &bitarray_low20_AND_SSE2; - else if (__builtin_cpu_supports("mmx")) bitarray_low20_AND_function_p = &bitarray_low20_AND_MMX; - else + if (__builtin_cpu_supports("avx2")) bitarray_low20_AND_function_p = &bitarray_low20_AND_AVX2; + else if (__builtin_cpu_supports("avx")) bitarray_low20_AND_function_p = &bitarray_low20_AND_AVX; + else if (__builtin_cpu_supports("sse2")) bitarray_low20_AND_function_p = &bitarray_low20_AND_SSE2; + else if (__builtin_cpu_supports("mmx")) bitarray_low20_AND_function_p = &bitarray_low20_AND_MMX; + else #endif - bitarray_low20_AND_function_p = &bitarray_low20_AND_NOSIMD; + bitarray_low20_AND_function_p = &bitarray_low20_AND_NOSIMD; // call the most optimized function for this CPU (*bitarray_low20_AND_function_p)(A, B); @@ -419,13 +419,13 @@ uint32_t count_bitarray_AND_dispatch(uint32_t *A, uint32_t *B) { else #endif #if defined(COMPILER_HAS_SIMD) - if (__builtin_cpu_supports("avx2")) count_bitarray_AND_function_p = &count_bitarray_AND_AVX2; - else if (__builtin_cpu_supports("avx")) count_bitarray_AND_function_p = &count_bitarray_AND_AVX; - else if (__builtin_cpu_supports("sse2")) count_bitarray_AND_function_p = &count_bitarray_AND_SSE2; - else if (__builtin_cpu_supports("mmx")) count_bitarray_AND_function_p = &count_bitarray_AND_MMX; - else + if (__builtin_cpu_supports("avx2")) count_bitarray_AND_function_p = &count_bitarray_AND_AVX2; + else if (__builtin_cpu_supports("avx")) count_bitarray_AND_function_p = &count_bitarray_AND_AVX; + else if (__builtin_cpu_supports("sse2")) count_bitarray_AND_function_p = &count_bitarray_AND_SSE2; + else if (__builtin_cpu_supports("mmx")) count_bitarray_AND_function_p = &count_bitarray_AND_MMX; + else #endif - count_bitarray_AND_function_p = &count_bitarray_AND_NOSIMD; + count_bitarray_AND_function_p = &count_bitarray_AND_NOSIMD; // call the most optimized function for this CPU return (*count_bitarray_AND_function_p)(A, B); @@ -437,13 +437,13 @@ uint32_t count_bitarray_low20_AND_dispatch(uint32_t *A, uint32_t *B) { else #endif #if defined(COMPILER_HAS_SIMD) - if (__builtin_cpu_supports("avx2")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_AVX2; - else if (__builtin_cpu_supports("avx")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_AVX; - else if (__builtin_cpu_supports("sse2")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_SSE2; - else if (__builtin_cpu_supports("mmx")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_MMX; - else + if (__builtin_cpu_supports("avx2")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_AVX2; + else if (__builtin_cpu_supports("avx")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_AVX; + else if (__builtin_cpu_supports("sse2")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_SSE2; + else if (__builtin_cpu_supports("mmx")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_MMX; + else #endif - count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_NOSIMD; + count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_NOSIMD; // call the most optimized function for this CPU return (*count_bitarray_low20_AND_function_p)(A, B); @@ -455,13 +455,13 @@ void bitarray_AND4_dispatch(uint32_t *A, uint32_t *B, uint32_t *C, uint32_t *D) else #endif #if defined(COMPILER_HAS_SIMD) - if (__builtin_cpu_supports("avx2")) bitarray_AND4_function_p = &bitarray_AND4_AVX2; - else if (__builtin_cpu_supports("avx")) bitarray_AND4_function_p = &bitarray_AND4_AVX; - else if (__builtin_cpu_supports("sse2")) bitarray_AND4_function_p = &bitarray_AND4_SSE2; - else if (__builtin_cpu_supports("mmx")) bitarray_AND4_function_p = &bitarray_AND4_MMX; - else + if (__builtin_cpu_supports("avx2")) bitarray_AND4_function_p = &bitarray_AND4_AVX2; + else if (__builtin_cpu_supports("avx")) bitarray_AND4_function_p = &bitarray_AND4_AVX; + else if (__builtin_cpu_supports("sse2")) bitarray_AND4_function_p = &bitarray_AND4_SSE2; + else if (__builtin_cpu_supports("mmx")) bitarray_AND4_function_p = &bitarray_AND4_MMX; + else #endif - bitarray_AND4_function_p = &bitarray_AND4_NOSIMD; + bitarray_AND4_function_p = &bitarray_AND4_NOSIMD; // call the most optimized function for this CPU (*bitarray_AND4_function_p)(A, B, C, D); @@ -473,13 +473,13 @@ void bitarray_OR_dispatch(uint32_t *A, uint32_t *B) { else #endif #if defined(COMPILER_HAS_SIMD) - if (__builtin_cpu_supports("avx2")) bitarray_OR_function_p = &bitarray_OR_AVX2; - else if (__builtin_cpu_supports("avx")) bitarray_OR_function_p = &bitarray_OR_AVX; - else if (__builtin_cpu_supports("sse2")) bitarray_OR_function_p = &bitarray_OR_SSE2; - else if (__builtin_cpu_supports("mmx")) bitarray_OR_function_p = &bitarray_OR_MMX; - else + if (__builtin_cpu_supports("avx2")) bitarray_OR_function_p = &bitarray_OR_AVX2; + else if (__builtin_cpu_supports("avx")) bitarray_OR_function_p = &bitarray_OR_AVX; + else if (__builtin_cpu_supports("sse2")) bitarray_OR_function_p = &bitarray_OR_SSE2; + else if (__builtin_cpu_supports("mmx")) bitarray_OR_function_p = &bitarray_OR_MMX; + else #endif - bitarray_OR_function_p = &bitarray_OR_NOSIMD; + bitarray_OR_function_p = &bitarray_OR_NOSIMD; // call the most optimized function for this CPU (*bitarray_OR_function_p)(A, B); @@ -491,13 +491,13 @@ uint32_t count_bitarray_AND2_dispatch(uint32_t *A, uint32_t *B) { else #endif #if defined(COMPILER_HAS_SIMD) - if (__builtin_cpu_supports("avx2")) count_bitarray_AND2_function_p = &count_bitarray_AND2_AVX2; - else if (__builtin_cpu_supports("avx")) count_bitarray_AND2_function_p = &count_bitarray_AND2_AVX; - else if (__builtin_cpu_supports("sse2")) count_bitarray_AND2_function_p = &count_bitarray_AND2_SSE2; - else if (__builtin_cpu_supports("mmx")) count_bitarray_AND2_function_p = &count_bitarray_AND2_MMX; - else + if (__builtin_cpu_supports("avx2")) count_bitarray_AND2_function_p = &count_bitarray_AND2_AVX2; + else if (__builtin_cpu_supports("avx")) count_bitarray_AND2_function_p = &count_bitarray_AND2_AVX; + else if (__builtin_cpu_supports("sse2")) count_bitarray_AND2_function_p = &count_bitarray_AND2_SSE2; + else if (__builtin_cpu_supports("mmx")) count_bitarray_AND2_function_p = &count_bitarray_AND2_MMX; + else #endif - count_bitarray_AND2_function_p = &count_bitarray_AND2_NOSIMD; + count_bitarray_AND2_function_p = &count_bitarray_AND2_NOSIMD; // call the most optimized function for this CPU return (*count_bitarray_AND2_function_p)(A, B); @@ -509,13 +509,13 @@ uint32_t count_bitarray_AND3_dispatch(uint32_t *A, uint32_t *B, uint32_t *C) { else #endif #if defined(COMPILER_HAS_SIMD) - if (__builtin_cpu_supports("avx2")) count_bitarray_AND3_function_p = &count_bitarray_AND3_AVX2; - else if (__builtin_cpu_supports("avx")) count_bitarray_AND3_function_p = &count_bitarray_AND3_AVX; - else if (__builtin_cpu_supports("sse2")) count_bitarray_AND3_function_p = &count_bitarray_AND3_SSE2; - else if (__builtin_cpu_supports("mmx")) count_bitarray_AND3_function_p = &count_bitarray_AND3_MMX; - else + if (__builtin_cpu_supports("avx2")) count_bitarray_AND3_function_p = &count_bitarray_AND3_AVX2; + else if (__builtin_cpu_supports("avx")) count_bitarray_AND3_function_p = &count_bitarray_AND3_AVX; + else if (__builtin_cpu_supports("sse2")) count_bitarray_AND3_function_p = &count_bitarray_AND3_SSE2; + else if (__builtin_cpu_supports("mmx")) count_bitarray_AND3_function_p = &count_bitarray_AND3_MMX; + else #endif - count_bitarray_AND3_function_p = &count_bitarray_AND3_NOSIMD; + count_bitarray_AND3_function_p = &count_bitarray_AND3_NOSIMD; // call the most optimized function for this CPU return (*count_bitarray_AND3_function_p)(A, B, C); @@ -527,13 +527,13 @@ uint32_t count_bitarray_AND4_dispatch(uint32_t *A, uint32_t *B, uint32_t *C, uin else #endif #if defined(COMPILER_HAS_SIMD) - if (__builtin_cpu_supports("avx2")) count_bitarray_AND4_function_p = &count_bitarray_AND4_AVX2; - else if (__builtin_cpu_supports("avx")) count_bitarray_AND4_function_p = &count_bitarray_AND4_AVX; - else if (__builtin_cpu_supports("sse2")) count_bitarray_AND4_function_p = &count_bitarray_AND4_SSE2; - else if (__builtin_cpu_supports("mmx")) count_bitarray_AND4_function_p = &count_bitarray_AND4_MMX; - else + if (__builtin_cpu_supports("avx2")) count_bitarray_AND4_function_p = &count_bitarray_AND4_AVX2; + else if (__builtin_cpu_supports("avx")) count_bitarray_AND4_function_p = &count_bitarray_AND4_AVX; + else if (__builtin_cpu_supports("sse2")) count_bitarray_AND4_function_p = &count_bitarray_AND4_SSE2; + else if (__builtin_cpu_supports("mmx")) count_bitarray_AND4_function_p = &count_bitarray_AND4_MMX; + else #endif - count_bitarray_AND4_function_p = &count_bitarray_AND4_NOSIMD; + count_bitarray_AND4_function_p = &count_bitarray_AND4_NOSIMD; // call the most optimized function for this CPU return (*count_bitarray_AND4_function_p)(A, B, C, D); diff --git a/client/src/cmdlfnexwatch.c b/client/src/cmdlfnexwatch.c index 9f825a438..f8b75594c 100644 --- a/client/src/cmdlfnexwatch.c +++ b/client/src/cmdlfnexwatch.c @@ -43,7 +43,7 @@ static int usage_lf_nexwatch_clone(void) { PrintAndLogEx(NORMAL, " c : card id (decimal)"); PrintAndLogEx(NORMAL, " m : mode (decimal) (0-15, defaults to 1)"); PrintAndLogEx(NORMAL, " n : Nexkey credential"); - PrintAndLogEx(NORMAL, " q : Quadrakey credential"); + PrintAndLogEx(NORMAL, " q : Quadrakey credential"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); PrintAndLogEx(NORMAL, " lf nexwatch clone r 5600000000213C9F8F150C"); @@ -55,7 +55,7 @@ static int usage_lf_nexwatch_clone(void) { static int usage_lf_nexwatch_sim(void) { PrintAndLogEx(NORMAL, "Enables simulation of Nexwatch card"); PrintAndLogEx(NORMAL, "You can use raw hex values or create a credential based on id, mode"); - PrintAndLogEx(NORMAL, "and type of credential (Nexkey/Quadrakey)"); + PrintAndLogEx(NORMAL, "and type of credential (Nexkey/Quadrakey)"); PrintAndLogEx(NORMAL, "Simulation runs until the button is pressed or another USB command is issued."); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Usage: lf nexwatch sim [h] [c ] [m ] [n|q]"); @@ -65,7 +65,7 @@ static int usage_lf_nexwatch_sim(void) { PrintAndLogEx(NORMAL, " c : card id (decimal)"); PrintAndLogEx(NORMAL, " m : mode (decimal) (0-15, defaults to 1)"); PrintAndLogEx(NORMAL, " n : Nexkey credential"); - PrintAndLogEx(NORMAL, " q : Quadrakey credential"); + PrintAndLogEx(NORMAL, " q : Quadrakey credential"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); PrintAndLogEx(NORMAL, " lf nexwatch sim r 5600000000213C9F8F150C"); @@ -76,10 +76,10 @@ static int usage_lf_nexwatch_sim(void) { // scramble parity (1234) -> (4231) static uint8_t nexwatch_parity_swap(uint8_t parity) { - uint8_t a = (((parity >> 3 ) & 1) ); - a |= (((parity >> 1 ) & 1) << 1); - a |= (((parity >> 2 ) & 1) << 2); - a |= ((parity & 1) << 3); + uint8_t a = (((parity >> 3) & 1)); + a |= (((parity >> 1) & 1) << 1); + a |= (((parity >> 2) & 1) << 2); + a |= ((parity & 1) << 3); return a; } // parity check @@ -119,7 +119,7 @@ static int nexwatch_scamble(NexWatchScramble_t action, uint32_t *id, uint32_t *s 28, 24, 20, 16, 12, 8, 4, 0 }; - switch(action) { + switch (action) { case DESCRAMBLE: { *id = 0; for (uint8_t idx = 0; idx < 32; idx++) { @@ -144,7 +144,8 @@ static int nexwatch_scamble(NexWatchScramble_t action, uint32_t *id, uint32_t *s } break; } - default: break; + default: + break; } return PM3_SUCCESS; } @@ -227,7 +228,7 @@ int demodNexWatch(void) { nexwatch_magic_t items[] = { {0xBE, "Quadrakey", 0}, {0x88, "Nexkey", 0} }; uint8_t m_idx; - for ( m_idx = 0; m_idx < ARRAYLEN(items); m_idx++) { + for (m_idx = 0; m_idx < ARRAYLEN(items); m_idx++) { items[m_idx].chk = nexwatch_checksum(items[m_idx].magic, cn, calc_parity); if (items[m_idx].chk == chk) { @@ -236,14 +237,14 @@ int demodNexWatch(void) { } // output - PrintAndLogEx(SUCCESS, " NexWatch raw id : " _YELLOW_("0x%"PRIx32) , rawid); + PrintAndLogEx(SUCCESS, " NexWatch raw id : " _YELLOW_("0x%"PRIx32), rawid); if (m_idx < ARRAYLEN(items)) { PrintAndLogEx(SUCCESS, " fingerprint : " _GREEN_("%s"), items[m_idx].desc); } PrintAndLogEx(SUCCESS, " 88bit id : " _YELLOW_("%"PRIu32) " (" _YELLOW_("0x%"PRIx32)")", cn, cn); PrintAndLogEx(SUCCESS, " mode : %x", mode); - if ( parity == calc_parity) { + if (parity == calc_parity) { PrintAndLogEx(SUCCESS, " parity : %s (0x%X)", _GREEN_("ok"), parity); } else { PrintAndLogEx(WARNING, " parity : %s (0x%X != 0x%X)", _RED_("fail"), parity, calc_parity); @@ -337,7 +338,7 @@ static int CmdNexWatchClone(const char *Cmd) { rawhex[9] |= parity; rawhex[10] |= nexwatch_checksum(magic, cn, parity); } - + for (uint8_t i = 1; i < ARRAYLEN(blocks); i++) { blocks[i] = bytes_to_num(rawhex + ((i - 1) * 4), sizeof(uint32_t)); } diff --git a/client/src/cmdlft55xx.c b/client/src/cmdlft55xx.c index 48ff6dab2..572a07549 100644 --- a/client/src/cmdlft55xx.c +++ b/client/src/cmdlft55xx.c @@ -1301,7 +1301,7 @@ bool tryDetectModulationEx(uint8_t downlink_mode, bool print_config, uint32_t wa config.Q5 = tests[0].Q5; config.ST = tests[0].ST; config.downlink_mode = downlink_mode; - + if (print_config) printConfiguration(config); diff --git a/client/src/comms.c b/client/src/comms.c index eb4548ecd..d2ba5436f 100644 --- a/client/src/comms.c +++ b/client/src/comms.c @@ -551,7 +551,7 @@ bool OpenProxmark(void *port, bool wait_for_port, int timeout, bool flash_mode, do { sp = uart_open(portname, speed); msleep(500); - PrintAndLogEx(INPLACE, "% 3i", timeout - openCount -1); + PrintAndLogEx(INPLACE, "% 3i", timeout - openCount - 1); } while (++openCount < timeout && (sp == INVALID_SERIAL_PORT || sp == CLAIMED_SERIAL_PORT)); } From 977b198816685059c99989bb57b2282229da2678 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 14 May 2020 09:03:54 +0200 Subject: [PATCH 203/632] cppcheck fix --- client/src/wiegand_formatutils.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/client/src/wiegand_formatutils.c b/client/src/wiegand_formatutils.c index cee0590ac..4fbd8c0d3 100644 --- a/client/src/wiegand_formatutils.c +++ b/client/src/wiegand_formatutils.c @@ -137,9 +137,6 @@ static uint8_t get_length_from_header(wiegand_message_t *data) { printf("a\n"); hfmt = data->Mid & 0x0000001F; len = 32; - } else if (data->Top == 0 && data->Mid == 0) { //< 32 bits - hfmt = data->Bot; - len = 0; } else { hfmt = data->Bot; len = 0; From ed11e4a093b61b58c20d823bec86bca18b44871c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 14 May 2020 09:18:51 +0200 Subject: [PATCH 204/632] cppcheck fix, assign a value --- armsrc/Standalone/hf_msdsal.c | 4 ++-- armsrc/iso14443a.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/armsrc/Standalone/hf_msdsal.c b/armsrc/Standalone/hf_msdsal.c index 85f7edf8e..be66e39a6 100644 --- a/armsrc/Standalone/hf_msdsal.c +++ b/armsrc/Standalone/hf_msdsal.c @@ -183,8 +183,8 @@ void RunMod(void) { uint8_t receivedCmd[MAX_FRAME_SIZE] = { 0x00 }; uint8_t receivedCmdPar[MAX_PARITY_SIZE] = { 0x00 }; - uint8_t dynamic_response_buffer[DYNAMIC_RESPONSE_BUFFER_SIZE]; - uint8_t dynamic_modulation_buffer[DYNAMIC_MODULATION_BUFFER_SIZE]; + uint8_t dynamic_response_buffer[DYNAMIC_RESPONSE_BUFFER_SIZE] = {0}; + uint8_t dynamic_modulation_buffer[DYNAMIC_MODULATION_BUFFER_SIZE] = {0}; // to know the transaction status uint8_t prevCmd = 0; diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index a793664e0..1d2ed655a 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -1150,8 +1150,8 @@ void SimulateIso14443aTag(uint8_t tagType, uint8_t flags, uint8_t *data) { // Such a response is less time critical, so we can prepare them on the fly #define DYNAMIC_RESPONSE_BUFFER_SIZE 64 #define DYNAMIC_MODULATION_BUFFER_SIZE 512 - uint8_t dynamic_response_buffer[DYNAMIC_RESPONSE_BUFFER_SIZE]; - uint8_t dynamic_modulation_buffer[DYNAMIC_MODULATION_BUFFER_SIZE]; + uint8_t dynamic_response_buffer[DYNAMIC_RESPONSE_BUFFER_SIZE] = {0}; + uint8_t dynamic_modulation_buffer[DYNAMIC_MODULATION_BUFFER_SIZE] = {0}; tag_response_info_t dynamic_response_info = { .response = dynamic_response_buffer, .response_n = 0, From a40c2727e6c3797f3edf843737d228e0b752c2ba Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 14 May 2020 09:19:12 +0200 Subject: [PATCH 205/632] cppcheck fix, unused struct --- client/src/cmdhficlass.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 0107372c7..ba1aa2157 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -358,11 +358,11 @@ typedef struct { uint8_t mem_config; //[13] uint8_t eas; //[14] uint8_t fuses; //[15] -} picopass_conf_block; +} picopass_conf_block_t; typedef struct { uint8_t csn[8]; - picopass_conf_block conf; + picopass_conf_block_t conf; uint8_t epurse[8]; uint8_t key_d[8]; uint8_t key_c[8]; @@ -413,6 +413,10 @@ static void fuse_config(const picopass_hdr *hdr) { PrintAndLogEx(SUCCESS, " RA: Read access enabled"); else PrintAndLogEx(WARNING, " RA: Read access not enabled"); + + PrintAndLogEx(INFO, " Block write lock: %02x", hdr->conf.block_writelock); + PrintAndLogEx(INFO, " EAS: %02x", hdr->conf.eas); + } static void getMemConfig(uint8_t mem_cfg, uint8_t chip_cfg, uint8_t *max_blk, uint8_t *app_areas, uint8_t *kb) { From 827439bddfc9f99ee6b10b40ac634402c5121eaa Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 14 May 2020 09:20:27 +0200 Subject: [PATCH 206/632] cppcheck function name mis --- client/src/mifare/mifare4.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/mifare/mifare4.h b/client/src/mifare/mifare4.h index 0c3e08458..994fb16a5 100644 --- a/client/src/mifare/mifare4.h +++ b/client/src/mifare/mifare4.h @@ -50,13 +50,13 @@ typedef struct { void mfpSetVerboseMode(bool verbose); const char *mfpGetErrorDescription(uint8_t errorCode); -int CalculateMAC(mf4Session_t *session, MACType_t mtype, uint8_t blockNum, uint8_t blockCount, uint8_t *data, int datalen, uint8_t *mac, bool verbose); -int MifareAuth4(mf4Session_t *session, uint8_t *keyn, uint8_t *key, bool activateField, bool leaveSignalON, bool dropFieldIfError, bool verbose, bool silentMode); +int CalculateMAC(mf4Session_t *mf4session, MACType_t mtype, uint8_t blockNum, uint8_t blockCount, uint8_t *data, int datalen, uint8_t *mac, bool verbose); +int MifareAuth4(mf4Session_t *mf4session, uint8_t *keyn, uint8_t *key, bool activateField, bool leaveSignalON, bool dropFieldIfError, bool verbose, bool silentMode); int MFPWritePerso(uint8_t *keyNum, uint8_t *key, bool activateField, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen); int MFPCommitPerso(bool activateField, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen); -int MFPReadBlock(mf4Session_t *session, bool plain, uint8_t blockNum, uint8_t blockCount, bool activateField, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen, uint8_t *mac); -int MFPWriteBlock(mf4Session_t *session, uint8_t blockNum, uint8_t *data, bool activateField, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen, uint8_t *mac); +int MFPReadBlock(mf4Session_t *mf4session, bool plain, uint8_t blockNum, uint8_t blockCount, bool activateField, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen, uint8_t *mac); +int MFPWriteBlock(mf4Session_t *mf4session, uint8_t blockNum, uint8_t *data, bool activateField, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen, uint8_t *mac); int mfpReadSector(uint8_t sectorNo, uint8_t keyType, uint8_t *key, uint8_t *dataout, bool verbose); int MFPGetSignature(bool activateField, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen); From 12e942febca7b0a4801762ac58a2b145e889952d Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 14 May 2020 09:59:06 +0200 Subject: [PATCH 207/632] coverity - remove bad shift, (untested) --- armsrc/hitagS.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/armsrc/hitagS.c b/armsrc/hitagS.c index 2f07a3468..ce3667e34 100644 --- a/armsrc/hitagS.c +++ b/armsrc/hitagS.c @@ -446,7 +446,7 @@ static void hitagS_handle_reader_command(uint8_t *rx, const size_t rxlen, _hitag2_byte(&state); //send con2, pwdh0, pwdl0, pwdl1 encrypted as a response - tx[0] = _hitag2_byte(&state) ^ ((tag.pages[0][1] >> 16) & 0xff); + tx[0] = _hitag2_byte(&state) ^ tag.pages[0][1]; tx[1] = _hitag2_byte(&state) ^ tag.pwdh0; tx[2] = _hitag2_byte(&state) ^ tag.pwdl0; tx[3] = _hitag2_byte(&state) ^ tag.pwdl1; @@ -454,7 +454,7 @@ static void hitagS_handle_reader_command(uint8_t *rx, const size_t rxlen, //add crc8 *txlen = 40; crc = CRC_PRESET; - calc_crc(&crc, ((tag.pages[0][1] >> 16) & 0xff), 8); + calc_crc(&crc, tag.pages[0][1], 8); calc_crc(&crc, tag.pwdh0, 8); calc_crc(&crc, tag.pwdl0, 8); calc_crc(&crc, tag.pwdl1, 8); From 6a387c0b1b999ac9180b292f73d3713c45bc39cb Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 14 May 2020 12:58:34 +0200 Subject: [PATCH 208/632] data tune, as suggested by @iceman --- client/src/cmddata.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/client/src/cmddata.c b/client/src/cmddata.c index d85271c85..55fac1d0b 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -1730,10 +1730,7 @@ int CmdTuneSamples(const char *Cmd) { else sprintf(judgement, _GREEN_("OK")); - PrintAndLogEx(NORMAL, "%s LF antenna is %s \n" - , (package->peak_v < LF_UNUSABLE_V) ? _CYAN_("[!]") : _GREEN_("[+]") - , judgement - ); + PrintAndLogEx((package->peak_v < LF_UNUSABLE_V) ? WARNING : SUCCESS, "LF antenna is %s \n", judgement); // HF evaluation if (package->v_hf > NON_VOLTAGE) @@ -1748,10 +1745,7 @@ int CmdTuneSamples(const char *Cmd) { else sprintf(judgement, _GREEN_("OK")); - PrintAndLogEx(NORMAL, "%s HF antenna is %s" - , (package->v_hf < HF_UNUSABLE_V) ? _CYAN_("[!]") : _GREEN_("[+]") - , judgement - ); + PrintAndLogEx((package->v_hf < HF_UNUSABLE_V) ? WARNING : SUCCESS, "HF antenna is %s \n", judgement); // graph LF measurements // even here, these values has 3% error. From e444640068cd389ed03def9270d95d5a5ac9079d Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 14 May 2020 16:59:02 +0200 Subject: [PATCH 209/632] printandlogex --- client/src/cmdhf14a.c | 2 +- client/src/cmdhffelica.c | 2 +- client/src/cmdhficlass.c | 18 ++++++++++-------- client/src/mifare/mifarehost.c | 2 +- client/src/uart/uart_win32.c | 9 +++++---- 5 files changed, 18 insertions(+), 15 deletions(-) diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index 4e4e411e8..d65869144 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -401,7 +401,7 @@ static int CmdHF14ACUIDs(const char *Cmd) { for (int i = 0; i < n; i++) { if (kbd_enter_pressed()) { - PrintAndLogEx(WARNING, "\n[!] aborted via keyboard!\n"); + PrintAndLogEx(WARNING, "aborted via keyboard!\n"); break; } diff --git a/client/src/cmdhffelica.c b/client/src/cmdhffelica.c index 9757e54a3..377b4a0a9 100644 --- a/client/src/cmdhffelica.c +++ b/client/src/cmdhffelica.c @@ -1632,7 +1632,7 @@ static int CmdHFFelicaDumpLite(const char *Cmd) { printf("."); fflush(stdout); if (kbd_enter_pressed()) { - PrintAndLogEx(WARNING, "\n[!] aborted via keyboard!\n"); + PrintAndLogEx(WARNING, "aborted via keyboard!\n"); DropField(); return PM3_EOPABORTED; } diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index ba1aa2157..0d063aaab 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -1324,7 +1324,8 @@ static int CmdHFiClassReader_Dump(const char *Cmd) { printf("."); fflush(stdout); if (kbd_enter_pressed()) { - PrintAndLogEx(WARNING, "\n[!] aborted via keyboard!\n"); + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(WARNING, "aborted via keyboard!\n"); DropField(); return PM3_EOPABORTED; } @@ -2470,7 +2471,7 @@ static int CmdHFiClassCheckKeys(const char *Cmd) { uint8_t timeout = 0; if (kbd_enter_pressed()) { - PrintAndLogEx(WARNING, "\n[!] Aborted via keyboard!\n"); + PrintAndLogEx(WARNING, "Aborted via keyboard!\n"); goto out; } @@ -2497,10 +2498,12 @@ static int CmdHFiClassCheckKeys(const char *Cmd) { printf("."); fflush(stdout); if (timeout > 120) { - PrintAndLogEx(WARNING, "\nNo response from Proxmark3. Aborting..."); + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(WARNING, "No response from Proxmark3. Aborting..."); goto out; } } + PrintAndLogEx(NORMAL, ""); found_offset = resp.oldarg[1] & 0xFF; uint8_t isOK = resp.oldarg[0] & 0xFF; @@ -2509,8 +2512,7 @@ static int CmdHFiClassCheckKeys(const char *Cmd) { switch (isOK) { case 1: { found_debit = true; - - PrintAndLogEx(NORMAL, "\n[-] Chunk [%d/%d]: %.1fs [%s] idx [%u] - found key "_YELLOW_("%s") + PrintAndLogEx(INFO, "Chunk [%d/%d]: %.1fs [%s] idx [%u] - found key "_YELLOW_("%s") , key_offset , keycount , (float)(t2 / 1000.0) @@ -2521,7 +2523,7 @@ static int CmdHFiClassCheckKeys(const char *Cmd) { break; } case 0: { - PrintAndLogEx(NORMAL, "\n[-] Chunk [%d/%d] : %.1fs [%s]" + PrintAndLogEx(INFO, "Chunk [%d/%d] : %.1fs [%s]" , key_offset , keycount , (float)(t2 / 1000.0) @@ -2546,7 +2548,7 @@ static int CmdHFiClassCheckKeys(const char *Cmd) { out: t1 = msclock() - t1; - PrintAndLogEx(SUCCESS, "\nTime in iclass checkkeys: %.0f seconds\n", (float)t1 / 1000.0); + PrintAndLogEx(SUCCESS, "Time in iclass checkkeys: %.0f seconds\n", (float)t1 / 1000.0); DropField(); // add to managekeys @@ -2806,7 +2808,7 @@ static void permute(uint8_t *data, uint8_t len, uint8_t *output) { return; } if (len != KEY_SIZE) { - PrintAndLogEx(NORMAL, "[!] wrong key size\n"); + PrintAndLogEx(WARNING, "wrong key size\n"); return; } for (uint8_t i = 0; i < KEY_SIZE; ++i) { diff --git a/client/src/mifare/mifarehost.c b/client/src/mifare/mifarehost.c index c1982b088..00e26a89e 100644 --- a/client/src/mifare/mifarehost.c +++ b/client/src/mifare/mifarehost.c @@ -1240,7 +1240,7 @@ int mfTraceDecode(uint8_t *data_src, int len, bool wantSaveToEmlFile) { traceCrypto1 = lfsr_recovery64(ks2, ks3); } else { - PrintAndLogEx(NORMAL, "[!] nested key recovery not implemented!\n"); + PrintAndLogEx(WARNING, "nested key recovery not implemented!\n"); //at_enc = bytes_to_num(data, 4); crypto1_destroy(traceCrypto1); traceState = TRACE_ERROR; diff --git a/client/src/uart/uart_win32.c b/client/src/uart/uart_win32.c index bbb5bfcfa..93ee2f126 100644 --- a/client/src/uart/uart_win32.c +++ b/client/src/uart/uart_win32.c @@ -43,6 +43,7 @@ #include #include "comms.h" +#include "ui.h" // The windows serial port implementation #ifdef _WIN32 @@ -90,7 +91,7 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { serial_port_windows *sp = calloc(sizeof(serial_port_windows), sizeof(uint8_t)); if (sp == 0) { - printf("[!] UART failed to allocate memory\n"); + PrintAndLogEx(WARNING, "UART failed to allocate memory\n"); return INVALID_SERIAL_PORT; } // Copy the input "com?" to "\\.\COM?" format @@ -111,14 +112,14 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { sp->dcb.DCBlength = sizeof(DCB); if (!BuildCommDCBA("baud=115200 parity=N data=8 stop=1", &sp->dcb)) { uart_close(sp); - printf("[!] UART error cdc setup\n"); + PrintAndLogEx(WARNING, "UART error cdc setup\n"); return INVALID_SERIAL_PORT; } // Update the active serial port if (!SetCommState(sp->hPort, &sp->dcb)) { uart_close(sp); - printf("[!] UART error while setting com state\n"); + PrintAndLogEx(WARNING, "UART error while setting com state\n"); return INVALID_SERIAL_PORT; } @@ -130,7 +131,7 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { speed = 115200; if (!uart_set_speed(sp, speed)) { uart_close(sp); - printf("[!] UART error while setting baudrate\n"); + PrintAndLogEx(WARNING, "UART error while setting baudrate\n"); return INVALID_SERIAL_PORT; } } From 555d970c7d491e28f6389b5e8409d33876b44440 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 14 May 2020 17:05:51 +0200 Subject: [PATCH 210/632] clock can be negative --- client/src/graph.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/client/src/graph.c b/client/src/graph.c index 2d75f3d30..6ce443155 100644 --- a/client/src/graph.c +++ b/client/src/graph.c @@ -247,7 +247,10 @@ int GetPskClock(const char *str, bool printAns) { size_t firstPhaseShiftLoc = 0; uint8_t curPhase = 0, fc = 0; clock1 = DetectPSKClock(bits, size, 0, &firstPhaseShiftLoc, &curPhase, &fc); - setClockGrid(clock1, firstPhaseShiftLoc); + + if (clock1 >= 0) + setClockGrid(clock1, firstPhaseShiftLoc); + // Only print this message if we're not looping something if (printAns) PrintAndLogEx(SUCCESS, "Auto-detected clock rate: %d", clock1); From 98a254ba6573c7bbfa814b34ecff4aea84d459c4 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 14 May 2020 17:17:23 +0200 Subject: [PATCH 211/632] hitagS, untested --- armsrc/hitagS.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/armsrc/hitagS.c b/armsrc/hitagS.c index ce3667e34..684c83cbb 100644 --- a/armsrc/hitagS.c +++ b/armsrc/hitagS.c @@ -434,8 +434,8 @@ static void hitagS_handle_reader_command(uint8_t *rx, const size_t rxlen, temp2++; *txlen = 32; state = _hitag2_init(REV64(tag.key), - REV32(tag.pages[0][0]), - REV32(((rx[3] << 24) + (rx[2] << 16) + (rx[1] << 8) + rx[0])) + REV32((tag.pages[0][3] << 24) + (tag.pages[0][2] << 16) + (tag.pages[0][1] << 8) + tag.pages[0][0]), + REV32((rx[3] << 24) + (rx[2] << 16) + (rx[1] << 8) + rx[0]) ); Dbprintf(",{0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X}", rx[0], rx[1], rx[2], rx[3], rx[4], rx[5], rx[6], rx[7]); @@ -446,7 +446,7 @@ static void hitagS_handle_reader_command(uint8_t *rx, const size_t rxlen, _hitag2_byte(&state); //send con2, pwdh0, pwdl0, pwdl1 encrypted as a response - tx[0] = _hitag2_byte(&state) ^ tag.pages[0][1]; + tx[0] = _hitag2_byte(&state) ^ tag.pages[1][2]; tx[1] = _hitag2_byte(&state) ^ tag.pwdh0; tx[2] = _hitag2_byte(&state) ^ tag.pwdl0; tx[3] = _hitag2_byte(&state) ^ tag.pwdl1; @@ -454,7 +454,7 @@ static void hitagS_handle_reader_command(uint8_t *rx, const size_t rxlen, //add crc8 *txlen = 40; crc = CRC_PRESET; - calc_crc(&crc, tag.pages[0][1], 8); + calc_crc(&crc, tag.pages[1][2]), 8); calc_crc(&crc, tag.pwdh0, 8); calc_crc(&crc, tag.pwdl0, 8); calc_crc(&crc, tag.pwdl1, 8); @@ -466,10 +466,16 @@ static void hitagS_handle_reader_command(uint8_t *rx, const size_t rxlen, if (temp2 % 2 == 0) { tag.uid = 0x11223344; - tag.pages[0][0] = 0x44332211; + tag.pages[0][0] = 0x11; + tag.pages[0][1] = 0x22; + tag.pages[0][2] = 0x33; + tag.pages[0][3] = 0x44; } else { tag.uid = 0x55667788; - tag.pages[0][0] = 0x88776655; + tag.pages[0][0] = 0x55; + tag.pages[0][1] = 0x66; + tag.pages[0][2] = 0x77; + tag.pages[0][3] = 0x88; } */ } @@ -480,16 +486,20 @@ static void hitagS_handle_reader_command(uint8_t *rx, const size_t rxlen, //data received to be written if (tag.tstate == HT_WRITING_PAGE_DATA) { tag.tstate = HT_NO_OP; - tag.pages[page_to_be_written / 4][page_to_be_written % 4] = (rx[0] - << 0) + (rx[1] << 8) + (rx[2] << 16) + (rx[3] << 24); + tag.pages[page_to_be_written][0] = rx[0]; + tag.pages[page_to_be_written][1] = rx[1]; + tag.pages[page_to_be_written][2] = rx[2]; + tag.pages[page_to_be_written][3] = rx[3]; //send ack *txlen = 2; tx[0] = 0x40; page_to_be_written = 0; hitagS_set_frame_modulation(); } else if (tag.tstate == HT_WRITING_BLOCK_DATA) { - tag.pages[page_to_be_written / 4][page_to_be_written % 4] = (rx[0] - << 24) + (rx[1] << 16) + (rx[2] << 8) + rx[3]; + tag.pages[page_to_be_written][0] = rx[0]; + tag.pages[page_to_be_written][1] = rx[1]; + tag.pages[page_to_be_written][2] = rx[2]; + tag.pages[page_to_be_written][3] = rx[3]; //send ack *txlen = 2; tx[0] = 0x40; From bddd2a9fc11852321d657aac90b386f1c0e84af9 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 14 May 2020 17:17:47 +0200 Subject: [PATCH 212/632] removed printvar --- client/src/cmdhficlass.c | 2 +- client/src/loclass/cipherutils.c | 4 ---- client/src/loclass/cipherutils.h | 1 - client/src/loclass/elite_crack.c | 25 +++++++++++++------------ 4 files changed, 14 insertions(+), 18 deletions(-) diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 0d063aaab..66314e2c6 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -1078,7 +1078,7 @@ static int CmdHFiClassEncryptBlk(const char *Cmd) { } else { iClassEncryptBlkData(blk_data, key); } - printvar("encrypted block", blk_data, 8); + PrintAndLogEx(SUCCESS, "encrypted block %s", sprint_hex(blk_data, 8)); return PM3_SUCCESS; } diff --git a/client/src/loclass/cipherutils.c b/client/src/loclass/cipherutils.c index 95628226d..fa58dfeaa 100644 --- a/client/src/loclass/cipherutils.c +++ b/client/src/loclass/cipherutils.c @@ -164,10 +164,6 @@ void printarr(const char *name, uint8_t *arr, int len) { free(output); } -void printvar(const char *name, uint8_t *arr, int len) { - PrintAndLogEx(INFO, "%s = " _YELLOW_("%s"), name, sprint_hex(arr, len)); -} - void printarr_human_readable(const char *title, uint8_t *arr, int len) { if (arr == NULL) return; diff --git a/client/src/loclass/cipherutils.h b/client/src/loclass/cipherutils.h index 2e6e3dab9..cbe51bb55 100644 --- a/client/src/loclass/cipherutils.h +++ b/client/src/loclass/cipherutils.h @@ -70,6 +70,5 @@ uint8_t reversebytes(uint8_t b); void reverse_arraybytes(uint8_t *arr, size_t len); void reverse_arraycopy(uint8_t *arr, uint8_t *dest, size_t len); void printarr(const char *name, uint8_t *arr, int len); -void printvar(const char *name, uint8_t *arr, int len); void printarr_human_readable(const char *title, uint8_t *arr, int len); #endif // CIPHERUTILS_H diff --git a/client/src/loclass/elite_crack.c b/client/src/loclass/elite_crack.c index 5ef58f01e..4dbac9704 100644 --- a/client/src/loclass/elite_crack.c +++ b/client/src/loclass/elite_crack.c @@ -221,15 +221,16 @@ void hash2(uint8_t *key64, uint8_t *outp_keytable) { // Once again, key is on iclass-format desencrypt_iclass(key64, key64_negated, z[0]); -// PrintAndLogEx(NORMAL, "\n"); PrintAndLogEx(NORMAL, "High security custom key (Kcus):"); -// printvar("z0 ", z[0],8); +// PrintAndLogEx(NORMAL, ""); +// PrintAndLogEx(INFO, "High security custom key (Kcus):"); +// PrintAndLogEx(INFO, "z0 %s", sprint_hex(z[0],8)); uint8_t y[8][8] = {{0}, {0}}; // y[0]=DES_dec(z[0],~key) // Once again, key is on iclass-format desdecrypt_iclass(z[0], key64_negated, y[0]); -// printvar("y0 ", y[0],8); +// PrintAndLogEx(INFO, "y0 %s", sprint_hex(y[0],8)); for (i = 1; i < 8; i++) { // z [i] = DES dec (rk(K cus , i), z [i−1] ) @@ -272,9 +273,9 @@ static int _readFromDump(uint8_t dump[], dumpdata *item, uint8_t i) { memcpy(item, dump + i * itemsize, itemsize); if (true) { - printvar("csn", item->csn, sizeof(item->csn)); - printvar("cc_nr", item->cc_nr, sizeof(item->cc_nr)); - printvar("mac", item->mac, sizeof(item->mac)); + PrintAndLogEx(INFO, "csn %s", sprint_hex(item->csn, sizeof(item->csn))); + PrintAndLogEx(INFO, "cc_nr %s", sprint_hex(item->cc_nr, sizeof(item->cc_nr))); + PrintAndLogEx(INFO, "mac %s", sprint_hex(item->mac, sizeof(item->mac))); } return 0; } @@ -326,8 +327,8 @@ int bruteforceItem(dumpdata item, uint16_t keytable[]) { if (numbytes_to_recover > 3) { PrintAndLogEx(FAILED, "The CSN requires > 3 byte bruteforce, not supported"); - printvar("[-] CSN", item.csn, 8); - printvar("[-] HASH1", key_index, 8); + PrintAndLogEx(INFO, "CSN %s", sprint_hex(item.csn, 8)); + PrintAndLogEx(INFO, "HASH1 %s", sprint_hex(key_index, 8)); PrintAndLogEx(NORMAL, ""); //Before we exit, reset the 'BEING_CRACKED' to zero keytable[bytes_to_recover[0]] &= ~BEING_CRACKED; @@ -400,9 +401,9 @@ int bruteforceItem(dumpdata item, uint16_t keytable[]) { } if (!found) { - PrintAndLogEx(NORMAL, "\n"); + PrintAndLogEx(NORMAL, ""); PrintAndLogEx(WARNING, "Failed to recover %d bytes using the following CSN", numbytes_to_recover); - printvar("[!] CSN", item.csn, 8); + PrintAndLogEx(INFO, "CSN %s", sprint_hex(item.csn, 8)); errors++; //Before we exit, reset the 'BEING_CRACKED' to zero @@ -468,8 +469,8 @@ int calculateMasterKey(uint8_t first16bytes[], uint64_t master_key[]) { mbedtls_des_crypt_ecb(&ctx_e, key64_negated, result); PrintAndLogEx(NORMAL, "\n"); PrintAndLogEx(SUCCESS, "-- High security custom key (Kcus) --"); - printvar("[+] Standard format ", key64_stdformat, 8); - printvar("[+] iClass format ", key64, 8); + PrintAndLogEx(SUCCESS, "Standard format %s", sprint_hex(key64_stdformat, 8)); + PrintAndLogEx(SUCCESS, "iClass format %s", sprint_hex(key64, 8)); if (master_key != NULL) memcpy(master_key, key64, 8); From 3c44ef39f74b35bdb9486fcbcf6da2a909ae38bb Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 14 May 2020 17:52:00 +0200 Subject: [PATCH 213/632] fix REV macros & hitagS --- armsrc/hitagS.c | 2 +- armsrc/util.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/armsrc/hitagS.c b/armsrc/hitagS.c index 684c83cbb..81ed771b4 100644 --- a/armsrc/hitagS.c +++ b/armsrc/hitagS.c @@ -454,7 +454,7 @@ static void hitagS_handle_reader_command(uint8_t *rx, const size_t rxlen, //add crc8 *txlen = 40; crc = CRC_PRESET; - calc_crc(&crc, tag.pages[1][2]), 8); + calc_crc(&crc, tag.pages[1][2], 8); calc_crc(&crc, tag.pwdh0, 8); calc_crc(&crc, tag.pwdl0, 8); calc_crc(&crc, tag.pwdl1, 8); diff --git a/armsrc/util.h b/armsrc/util.h index 40a7c3026..06c4e024e 100644 --- a/armsrc/util.h +++ b/armsrc/util.h @@ -55,15 +55,15 @@ #endif #ifndef REV16 -#define REV16(x) (REV8(x) + (REV8 (x >> 8) << 8)) +#define REV16(x) (REV8(x) + (REV8 ((x) >> 8) << 8)) #endif #ifndef REV32 -#define REV32(x) (REV16(x) + (REV16(x >> 16) << 16)) +#define REV32(x) (REV16(x) + (REV16((x) >> 16) << 16)) #endif #ifndef REV64 -#define REV64(x) (REV32(x) + (REV32(x >> 32) << 32)) +#define REV64(x) (REV32(x) + (REV32((x) >> 32) << 32)) #endif #ifndef BIT32 From 4e2d1e66ab761f311b3bab0ce8ba13db784d6f78 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 14 May 2020 17:59:46 +0200 Subject: [PATCH 214/632] fix coverity 286660 logically dead code --- client/src/cmdhfmfdes.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index f86363638..7ef1689cc 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -3988,9 +3988,6 @@ static int CmdHF14aDesChk(const char *Cmd) { if (endFilePosition) PrintAndLogEx(SUCCESS, "First part of k3kdes dictionary successfully loaded."); endFilePosition = 0; - - if (endFilePosition) - PrintAndLogEx(SUCCESS, "First part of dictionary successfully loaded."); } if (aeskeyListLen == 0) { From 982f4231f7143a9336303d9d93ee312ae06ed1e1 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 14 May 2020 18:01:52 +0200 Subject: [PATCH 215/632] fix coverity 263979 logically dead code --- client/src/cmdhffelica.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/src/cmdhffelica.c b/client/src/cmdhffelica.c index 377b4a0a9..f7b7b00e3 100644 --- a/client/src/cmdhffelica.c +++ b/client/src/cmdhffelica.c @@ -1367,7 +1367,8 @@ static int CmdHFFelicaRequestService(const char *Cmd) { flags |= FELICA_RAW; } - datalen = (datalen > PM3_CMD_DATA_SIZE) ? PM3_CMD_DATA_SIZE : datalen; +// Todo activate once datalen isn't hardcoded anymore... +// datalen = (datalen > PM3_CMD_DATA_SIZE) ? PM3_CMD_DATA_SIZE : datalen; if (!custom_IDm && !check_last_idm(data, datalen)) { return PM3_EINVARG; } From 3f71be870b7c9c356ea072f5e9362a07524bddab Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 14 May 2020 23:26:41 +0200 Subject: [PATCH 216/632] cppcheck on hf_mattyrun --- armsrc/Standalone/hf_mattyrun.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/armsrc/Standalone/hf_mattyrun.c b/armsrc/Standalone/hf_mattyrun.c index b533e9573..ae81eb408 100644 --- a/armsrc/Standalone/hf_mattyrun.c +++ b/armsrc/Standalone/hf_mattyrun.c @@ -53,6 +53,16 @@ uint8_t uid[10]; uint32_t cuid; iso14a_card_select_t p_card; +/* + Pseudo-configuration block. +*/ +bool printKeys = false; // Prints keys +bool transferToEml = true; // Transfer keys to emulator memory +bool ecfill = true; // Fill emulator memory with cards content. +bool simulation = true; // Simulates an exact copy of the target tag +bool fillFromEmulator = false; // Dump emulator memory. +uint8_t stKeyBlock = 20; // Set the quantity of keys in the block. + //----------------------------------------------------------------------------- // Matt's StandAlone mod. // Work with "magic Chinese" card (email him: ouyangweidaxian@live.cn) @@ -232,24 +242,14 @@ void RunMod(void) { // Comment this line below if you want to see debug messages. // usb_disable(); - /* - Pseudo-configuration block. - */ - bool printKeys = false; // Prints keys - bool transferToEml = true; // Transfer keys to emulator memory - bool ecfill = true; // Fill emulator memory with cards content. - bool simulation = true; // Simulates an exact copy of the target tag - bool fillFromEmulator = false; // Dump emulator memory. uint16_t mifare_size = 1024; // Mifare 1k (only 1k supported for now) uint8_t sectorSize = 64; // 1k's sector size is 64 bytes. uint8_t blockNo = 3; // Security block is number 3 for each sector. uint8_t sectorsCnt = (mifare_size / sectorSize); - uint8_t keyType = 2; // Keytype buffer uint64_t key64; // Defines current key uint8_t *keyBlock; // Where the keys will be held in memory. - uint8_t stKeyBlock = 20; // Set the quantity of keys in the block. bool keyFound = false; /* @@ -317,7 +317,7 @@ void RunMod(void) { bool allKeysFound = true; uint32_t size = mfKeysCnt; - for (int type = !keyType; type < 2 && !err; keyType == 2 ? (type++) : (type = 2)) { + for (int type = 0; type < 2 && !err; type++) { int block = blockNo; for (int sec = 0; sec < sectorsCnt && !err; ++sec) { Dbprintf("\tCurrent sector:%3d, block:%3d, key type: %c, key count: %i ", sec, block, type ? 'B' : 'A', mfKeysCnt); From 4dac94c7725883d8fa4057870a257875598560e0 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 15 May 2020 00:00:42 +0200 Subject: [PATCH 217/632] clarify BUTTON macro usages --- armsrc/Standalone/hf_colin.c | 2 +- armsrc/Standalone/hf_msdsal.c | 4 ++-- armsrc/Standalone/hf_young.c | 8 ++++---- armsrc/Standalone/lf_em4100rswb.c | 3 +-- armsrc/Standalone/lf_em4100rwc.c | 16 ++++++++-------- armsrc/Standalone/lf_hidbrute.c | 12 ++++++------ armsrc/Standalone/lf_samyrun.c | 5 ----- armsrc/Standalone/lf_skeleton.c | 2 +- 8 files changed, 23 insertions(+), 29 deletions(-) diff --git a/armsrc/Standalone/hf_colin.c b/armsrc/Standalone/hf_colin.c index b1090a019..9752c66c3 100644 --- a/armsrc/Standalone/hf_colin.c +++ b/armsrc/Standalone/hf_colin.c @@ -501,7 +501,7 @@ failtag: LED_A_INV(); } - if (BUTTON_HELD(10) > 0) { + if (BUTTON_HELD(10) == BUTTON_HOLD) { WDT_HIT(); DbprintfEx(FLAG_NEWLINE, "\t\t\t[ READING FLASH ]"); ReadLastTagFromFlash(); diff --git a/armsrc/Standalone/hf_msdsal.c b/armsrc/Standalone/hf_msdsal.c index be66e39a6..e890818d2 100644 --- a/armsrc/Standalone/hf_msdsal.c +++ b/armsrc/Standalone/hf_msdsal.c @@ -222,9 +222,9 @@ void RunMod(void) { // Was our button held down or pressed? int button_pressed = BUTTON_HELD(1000); - if (button_pressed == 1) //Holding down the button + if (button_pressed == BUTTON_HOLD) //Holding down the button break; - else if (button_pressed == -1) { //Pressing one time change between reading & emulation + else if (button_pressed == BUTTON_SINGLE_CLICK) { //Pressing one time change between reading & emulation if (state == STATE_READ) { if (chktoken == true && token[0] != 0x00) { //Only change to emulation if it saved a track 2 in memory state = STATE_EMU; diff --git a/armsrc/Standalone/hf_young.c b/armsrc/Standalone/hf_young.c index d29aac220..193f124ed 100644 --- a/armsrc/Standalone/hf_young.c +++ b/armsrc/Standalone/hf_young.c @@ -222,8 +222,8 @@ void RunMod(void) { // exit from Standalone Mode, send a usbcommand. if (data_available()) return; - int button_action = BUTTON_HELD(1000); - if (button_action == 0) { // No button action, proceed with sim + int button_pressed = BUTTON_HELD(1000); + if (button_pressed == BUTTON_NO_CLICK) { // No button action, proceed with sim uint8_t flags = FLAG_4B_UID_IN_DATA; uint8_t data[PM3_CMD_DATA_SIZE] = {0}; // in case there is a read command received we shouldn't break @@ -259,12 +259,12 @@ void RunMod(void) { SimulateIso14443aTag(1, flags, data); } - } else if (button_action == BUTTON_SINGLE_CLICK) { + } else if (button_pressed == BUTTON_SINGLE_CLICK) { selected = (selected + 1) % OPTS; Dbprintf("Done playing. Switching to record mode on bank %d", selected); iGotoRecord = 1; break; - } else if (button_action == BUTTON_HOLD) { + } else if (button_pressed == BUTTON_HOLD) { Dbprintf("Playtime over. Begin cloning..."); iGotoClone = 1; break; diff --git a/armsrc/Standalone/lf_em4100rswb.c b/armsrc/Standalone/lf_em4100rswb.c index 559f85fee..dd9fafd6a 100644 --- a/armsrc/Standalone/lf_em4100rswb.c +++ b/armsrc/Standalone/lf_em4100rswb.c @@ -215,13 +215,12 @@ static int ButeEMTag(uint64_t originalCard, int slot) { direction = -1; } - uint64_t currentCard; while (cardnum > 1 && cardnum < 65535) { WDT_HIT(); if (data_available()) break; cardnum = cardnum + direction; - currentCard = PackEmID(originalCard, cardnum); + uint64_t currentCard = PackEmID(originalCard, cardnum); Dbprintf("[=] >> Simulating card id %"PRIx64" <<", currentCard); ConstructEM410xEmulBuf(ReversQuads(currentCard)); SimulateTagLowFrequencyEx(buflen, 0, 1, bruteforceSpeed[bruteforceSpeedCurrent] * 10000); diff --git a/armsrc/Standalone/lf_em4100rwc.c b/armsrc/Standalone/lf_em4100rwc.c index a7364bd81..ce96dd824 100644 --- a/armsrc/Standalone/lf_em4100rwc.c +++ b/armsrc/Standalone/lf_em4100rwc.c @@ -141,12 +141,12 @@ void RunMod(void) { switch (state) { case 0: // Select mode - if (button_pressed == 1) { + if (button_pressed == BUTTON_HOLD) { // Long press - switch to simulate mode SpinUp(100); LED_Slot(selected); state = 2; - } else if (button_pressed < 0) { + } else if (button_pressed == BUTTON_SINGLE_CLICK) { // Click - switch to next slot selected = (selected + 1) % slots_count; LED_Slot(selected); @@ -154,12 +154,12 @@ void RunMod(void) { break; case 1: // Read mode. - if (button_pressed > 0) { + if (button_pressed == BUTTON_HOLD) { // Long press - switch to read mode SpinUp(100); LED_Slot(selected); state = 3; - } else if (button_pressed < 0) { + } else if (button_pressed == BUTTON_SINGLE_CLICK) { // Click - exit to select mode CmdEM410xdemod(1, &high[selected], &low[selected], 0); FlashLEDs(100, 5); @@ -171,12 +171,12 @@ void RunMod(void) { break; case 2: // Simulate mode - if (button_pressed > 0) { + if (button_pressed == BUTTON_HOLD) { // Long press - switch to read mode SpinDown(100); LED_Slot(selected); state = 1; - } else if (button_pressed < 0) { + } else if (button_pressed == BUTTON_SINGLE_CLICK) { // Click - start simulating. Click again to exit from simulate mode LED_Slot(selected); ConstructEM410xEmulBuf(ReversQuads(low[selected])); @@ -188,12 +188,12 @@ void RunMod(void) { break; case 3: // Write tag mode - if (button_pressed > 0) { + if (button_pressed == BUTTON_HOLD) { // Long press - switch to select mode SpinDown(100); LED_Slot(selected); state = 0; - } else if (button_pressed < 0) { + } else if (button_pressed == BUTTON_SINGLE_CLICK) { // Click - write ID to tag WriteEM410x(0, (uint32_t)(low[selected] >> 32), (uint32_t)(low[selected] & 0xffffffff)); LED_Slot(selected); diff --git a/armsrc/Standalone/lf_hidbrute.c b/armsrc/Standalone/lf_hidbrute.c index 2b2b43718..8c4412ebe 100644 --- a/armsrc/Standalone/lf_hidbrute.c +++ b/armsrc/Standalone/lf_hidbrute.c @@ -85,7 +85,7 @@ void RunMod(void) { // so next button push begins playing what we recorded playing = 0; cardRead = 1; - } else if (button_pressed > 0 && cardRead == 1) { + } else if (button_pressed == BUTTON_HOLD && cardRead == 1) { LEDsoff(); LED(selected + 1, 0); LED(LED_A, 0); @@ -109,7 +109,7 @@ void RunMod(void) { } // Change where to record (or begin playing) - else if (button_pressed) { + else if (button_pressed != BUTTON_NO_CLICK) { // Next option if we were previously playing if (playing) selected = (selected + 1) % OPTS; @@ -131,7 +131,7 @@ void RunMod(void) { CmdHIDsimTAG(0, high[selected], low[selected], 0, 0); DbpString("[=] done playing"); - if (BUTTON_HELD(1000) > 0) + if (BUTTON_HELD(1000) == BUTTON_HOLD) goto out; /* We pressed a button so ignore it here with a delay */ @@ -169,7 +169,7 @@ void RunMod(void) { // Needed for exiting from proxbrute when button is pressed if (BUTTON_PRESS()) { - if (BUTTON_HELD(1000) > 0) { + if (BUTTON_HELD(1000) == BUTTON_HOLD) { goto out; } else { while (BUTTON_PRESS()) { @@ -199,7 +199,7 @@ void RunMod(void) { // Needed for exiting from proxbrute when button is pressed if (BUTTON_PRESS()) { - if (BUTTON_HELD(1000) > 0) { + if (BUTTON_HELD(1000) == BUTTON_HOLD) { goto out; } else { while (BUTTON_PRESS()) { WDT_HIT(); } @@ -220,7 +220,7 @@ void RunMod(void) { } DbpString("[=] done bruteforcing"); - if (BUTTON_HELD(1000) > 0) + if (BUTTON_HELD(1000) == BUTTON_HOLD) goto out; /* We pressed a button so ignore it here with a delay */ diff --git a/armsrc/Standalone/lf_samyrun.c b/armsrc/Standalone/lf_samyrun.c index 579a06470..971304918 100644 --- a/armsrc/Standalone/lf_samyrun.c +++ b/armsrc/Standalone/lf_samyrun.c @@ -56,11 +56,6 @@ void RunMod(void) { int button_pressed = BUTTON_HELD(280); if (button_pressed != BUTTON_HOLD) continue; - /* - #define BUTTON_NO_CLICK 0 - #define BUTTON_SINGLE_CLICK -1 - #define BUTTON_DOUBLE_CLICK -2 - */ if (state == STATE_READ) { diff --git a/armsrc/Standalone/lf_skeleton.c b/armsrc/Standalone/lf_skeleton.c index 2f87e92c7..a2d566cb7 100644 --- a/armsrc/Standalone/lf_skeleton.c +++ b/armsrc/Standalone/lf_skeleton.c @@ -35,7 +35,7 @@ void RunMod(void) { Dbprintf("button %d", button_pressed); - if (button_pressed) + if (button_pressed != BUTTON_NO_CLICK) break; } From f7bbf8b59fd694a8022071f258e53821742e633b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 15 May 2020 09:00:44 +0200 Subject: [PATCH 218/632] chg: 'lf indala demod' -more lenient size check --- client/src/cmdlfindala.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdlfindala.c b/client/src/cmdlfindala.c index 7f3c4ee87..d93f152fa 100644 --- a/client/src/cmdlfindala.c +++ b/client/src/cmdlfindala.c @@ -859,7 +859,7 @@ out: *size = found_size; - if (found_size != 224 && found_size != 64) { + if (found_size < 64) { PrintAndLogEx(INFO, "DEBUG: detectindala | %zu", found_size); return -5; } From a739d333982e190566906b61f89364ef8e3ba578 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 15 May 2020 13:07:27 +0200 Subject: [PATCH 219/632] Add mf_nonce_brute from https://github.com/iceman1001/mf_nonce_brute and merge to pm3 Makefile --- .gitignore | 2 +- Makefile.host | 4 +- tools/Makefile | 4 - tools/mf_nonce_brute/Makefile | 20 ++ tools/mf_nonce_brute/README.md | 132 +++++++++ tools/mf_nonce_brute/iso14443crc.c | 46 +++ tools/mf_nonce_brute/iso14443crc.h | 26 ++ tools/mf_nonce_brute/mf_nonce_brute.c | 395 ++++++++++++++++++++++++++ tools/mf_nonce_brute/protocol.h | 20 ++ tools/mf_nonce_brute/sleep.c | 28 ++ tools/mf_nonce_brute/sleep.h | 27 ++ 11 files changed, 698 insertions(+), 6 deletions(-) create mode 100644 tools/mf_nonce_brute/Makefile create mode 100644 tools/mf_nonce_brute/README.md create mode 100644 tools/mf_nonce_brute/iso14443crc.c create mode 100644 tools/mf_nonce_brute/iso14443crc.h create mode 100644 tools/mf_nonce_brute/mf_nonce_brute.c create mode 100644 tools/mf_nonce_brute/protocol.h create mode 100644 tools/mf_nonce_brute/sleep.c create mode 100644 tools/mf_nonce_brute/sleep.h diff --git a/.gitignore b/.gitignore index fd8fe070c..d28933d82 100644 --- a/.gitignore +++ b/.gitignore @@ -87,7 +87,7 @@ client/dumps/* *.ice *.new armsrc/TEMP EMV/* -tools/mf_nonce_brute/* +tools/mf_nonce_brute/mf_nonce_brute tools/andrew/* tools/jtag_openocd/openocd_configuration ppls patches/* diff --git a/Makefile.host b/Makefile.host index c95f4bb4f..07b8c2199 100644 --- a/Makefile.host +++ b/Makefile.host @@ -17,6 +17,8 @@ endif CFLAGS ?= $(DEFCFLAGS) CFLAGS += $(MYDEFS) $(MYCFLAGS) $(MYINCLUDES) +LDFLAGS += $(MYLDFLAGS) +LDLIBS += $(MYLDLIBS) vpath %.c $(MYSRCPATHS) @@ -66,7 +68,7 @@ $(BINDIR)/$(LIB_A): $(MYOBJS) $(BINDIR)/% : $(OBJDIR)/%.o $(MYOBJS) $(MYLIBS) $(info [=] LD $(notdir $@)) - $(Q)$(LD) $(LDFLAGS) $(MYOBJS) $< -o $@ $(MYLIBS) + $(Q)$(LD) $(LDFLAGS) $(MYOBJS) $< -o $@ $(MYLIBS) $(MYLDLIBS) $(OBJDIR)/%.o : %.c | $(OBJDIR) $(info [-] CC $<) diff --git a/tools/Makefile b/tools/Makefile index 5f2355f20..df6a0682f 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -11,10 +11,6 @@ get_crapto1: $(WGET) http://crapto1.netgarage.org/crapto1-v3.3.tar.xz $(TAR) Jxvf crapto1-v3.3.tar.xz -C crapto1-v3.3 -get_nonce_bf: -# $(GIT) https://github.com/J-Run/mf_key_brute.git mf_key_brute - $(GIT) https://github.com/iceman1001/mf_nonce_brute mf_nonce_brute - get_xorsearch: $(MKDIR) xorsearch $(WGET) https://didierstevens.com/files/software/XORSearch_V1_11_2.zip diff --git a/tools/mf_nonce_brute/Makefile b/tools/mf_nonce_brute/Makefile new file mode 100644 index 000000000..7672c89a4 --- /dev/null +++ b/tools/mf_nonce_brute/Makefile @@ -0,0 +1,20 @@ +MYSRCPATHS = ../../common ../../common/crapto1 +MYSRCS = crypto1.c crapto1.c bucketsort.c iso14443crc.c sleep.c +MYINCLUDES = -I../../include -I../../common +MYCFLAGS = +MYDEFS = +MYLDLIBS = -lpthread + +BINS = mf_nonce_brute +INSTALLTOOLS = $(BINS) + +include ../../Makefile.host + +# checking platform can be done only after Makefile.host +ifneq (,$(findstring MINGW,$(platform))) + # Mingw uses by default Microsoft printf, we want the GNU printf (e.g. for %z) + # and setting _ISOC99_SOURCE sets internally __USE_MINGW_ANSI_STDIO=1 + CFLAGS += -D_ISOC99_SOURCE +endif + +mf_nonce_brute : $(OBJDIR)/mf_nonce_brute.o $(MYOBJS) diff --git a/tools/mf_nonce_brute/README.md b/tools/mf_nonce_brute/README.md new file mode 100644 index 000000000..c2e5f3e6f --- /dev/null +++ b/tools/mf_nonce_brute/README.md @@ -0,0 +1,132 @@ +mf_nonce_brute +============== + +Nested authentificated sector key recovery tool +----------------------------------------------- + +Compatible tags: +* Mifare Classic 1k (4k) +* Mifare Plus in SL1 mode + +To recover keys to nested authentificated sectors you need a reader-card communication log. To get it use +hardware tools that able to sniff communication (for example Proxmark3 or HydraNFC). + +This enhanced version: +First 2 bytes should be bruteforced in phase 2 with mf_key_brute tool that interacts with a card. + +Sample trace: +``` + 93 70 fd ac f6 d8 7f 21 4f // select card with UID fdacf6d8 +TAG 08 b6 dd // sak + 60 04 d1 3d // wanna auth block 0x04 with A key +TAG ed 12 9c 74 // 1st auth clear text nt + 55 53 9f cc 41 8d e8 f3 // nr', ar' (nr^ks1, ar^ks2 ) +TAG 05 49 e1 65 // at' ( at^ks3 ) + 03 24 26 56 // wanna read block 0x04 +TAG ac 69 ef 58 45 e1 c2 1d a9 47 a5 94 54 ef 5d c7 1e a9 // block 0x04 content + d4 3e a8 aa +TAG 8e 8e e3 e6 e9 e2 5f dd f6 08 ce fb 02 6a db 75 94 2f + 79 77 68 3c +TAG e0 00 00 80 80 08 cc 80 08 9c 82 e0 68 64 60 30 91 60 // 18 bytes = 16 byte content + 2 bytes crc + ea 88 c3 c2 // 4 byte read cmd +TAG a3 76 dc df c1 42 e0 ee c6 75 a4 ca eb 0c da eb 46 a0 // 18 bytes = 16 byte content + 2 bytes crc ks8 + crc + 2d 27 ab 6f // wanna auth to 0x04 block with key B + +-------Until this line we can recover key or decrypt communication with no troubles (see mfkey64 tool)-------------------------------- + +TAG 52 6e af 8b // nested auth encrypted tag nonce that we dont know + 8e 21 3a 29 a4 80 7e 02 // nr_enc = nr^ks1, ar_enc = ar^ks2 +TAG b9 43 74 8d // at_enc = at^ks3 + e2 25 f8 32 // probably next command (actually is read block cmd, but we dont know it yet) +TAG 1f 26 82 8d 12 21 dd 42 c2 84 3e d0 26 7f 6b 2a 81 a9 // probably data + ba 85 1d 36 // probably read cmd +TAG 62 a8 78 69 ee 36 22 16 1c ff 4b 4e 69 cb 27 c2 e8 7e // probably data + a7 b1 c8 da // probably read cmd +TAG b2 fc 6c 65 60 ec 35 83 87 56 e3 7e 3c bf 38 b8 73 21 // probably data + 99 92 13 55 // probably read cmd +TAG 93 5b 65 a3 1d 8c 75 b8 3a 63 e2 31 f0 d0 a9 24 9a f6 // probably data +``` + + +Phase 1 +------- + +Syntax: +`mf_nonce_brute <{nt}> <{nr}> <{ar}> <{at}> [<{next_command}>]` + +Example: if `nt` in trace is `8c! 42 e6! 4e!`, then `nt` is `8c42e64e` and `nt_par_err` is `1011` + +Example with parity (from this trace http://www.proxmark.org/forum/viewtopic.php?pid=550#p550) : + +``` + + 561882: 1 : 26 + + 64: 2 : TAG 04 00 + + 10217: 2 : 93 20 + + 64: 5 : TAG 9c 59 9b 32 6c UID + + 12313: 9 : 93 70 9c 59 9b 32 6c 6b 30 + + 64: 3 : TAG 08 b6 dd + + 923318: 4 : 60 00 f5 7b AUTH Block 0 + + 112: 4 : TAG 82 a4 16 6c Nonce Tag (NT) + + 6985: 8 : a1 e4! 58 ce! 6e ea! 41 e0! NR , AR + + 64: 4 : TAG 5c! ad f4 39! AT + + 811513: 4 : 8e 0e! 5d! b9 AUTH Block 0 (nested) + + 112: 4 : TAG 5a! 92 0d! 85! Nonce Tag (NT) + + 6946: 8 : 98! d7 6b! 77 d6 c6 e8 70 NR , AR + + 64: 4 : TAG ca 7e! 0b! 63! AT + + 670868: 4 : 3e! 70 9c! 8a + + 112: 4 : TAG 36! 41 24! 79 + + 9505: 8 : 1b! 8c 3a! 48! 83 5a 4a! 27 + + 64: 4 : TAG 40! 6a! 99! 4b + + 905612: 4 : c9 7c 64! 13! !crc + + 112: 4 : TAG b5! ab! 1d! 2b + + 6936: 8 : 7e! d2 5c! ca! 4b! 50! 88! c4 !crc + + 64: 4 : TAG bf dd 01 be! + + 987853: 4 : 56 98 49 d6! !crc +``` +=> +``` +./mf_nonce_brute 9c599b32 82a4166c 0000 a1e458ce 6eea41e0 0101 5cadf439 1001 3e709c8a + | | | | | | | | | + +UID +nt_enc | +nr_enc +ar_enc | +at_enc | +encrypted next cmd + +nt_par_err +at_par_err +at_par_err +``` + +These two taken from above use the plaintext tagnonce `nt`=`82a4166c`, they still find a possible key candidate. +``` +./mf_nonce_brute 9c599b32 82a4166c 0000 a1e458ce 6eea41e0 0101 5cadf439 1001 +./mf_nonce_brute 9c599b32 82a4166c 0000 98d76b77 d6c6e870 0000 ca7e0b63 0111 +``` + +This one uses the encrypted tagnonce `nt`=`5a920d85`, it finds a valid key. +``` +./mf_nonce_brute 9c599b32 5a920d85 1011 98d76b77 d6c6e870 0000 ca7e0b63 0111 +``` + +This one uses the encrypted tagnonce `nt`=`5a920d85` and the encrypted cmd `3e709c8a` to validate , it finds a valid key. +``` +./mf_nonce_brute 9c599b32 5a920d85 1011 98d76b77 d6c6e870 0000 ca7e0b63 0111 3e709c8a +``` +Full output: +``` +$ ./mf_nonce_brute 9c599b32 5a920d85 1011 98d76b77 d6c6e870 0000 ca7e0b63 0111 3e709c8a +Mifare classic nested auth key recovery. Phase 1. +------------------------------------------------- +uid: 9c599b32 +nt encrypted: 5a920d85 +nt parity err: 1011 +nr encrypted: 98d76b77 +ar encrypted: d6c6e870 +ar parity err: 0000 +at encrypted: ca7e0b63 +at parity err: 0111 +next cmd enc: 3e709c8a + + +Starting 4 threads to bruteforce encrypted tag nonce last bytes +CMD enc(3e709c8a) + dec(6000f57b) <-- Valid cmd + +Valid Key found: [ffffffffffff] + +Time in mf_nonce_brute (Phase 1): 1763 ticks 2.0 seconds +``` diff --git a/tools/mf_nonce_brute/iso14443crc.c b/tools/mf_nonce_brute/iso14443crc.c new file mode 100644 index 000000000..60631f4fb --- /dev/null +++ b/tools/mf_nonce_brute/iso14443crc.c @@ -0,0 +1,46 @@ +//----------------------------------------------------------------------------- +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// ISO14443 CRC calculation code. +//----------------------------------------------------------------------------- + +#include "iso14443crc.h" + +static unsigned short UpdateCrc14443(unsigned char ch, unsigned short *lpwCrc) { + ch = (ch ^ (unsigned char)((*lpwCrc) & 0x00FF)); + ch = (ch ^ (ch << 4)); + *lpwCrc = (*lpwCrc >> 8) ^ ((unsigned short) ch << 8) ^ + ((unsigned short) ch << 3) ^ ((unsigned short) ch >> 4); + return (*lpwCrc); +} + +void ComputeCrc14443(int CrcType, + const unsigned char *Data, int Length, + unsigned char *TransmitFirst, + unsigned char *TransmitSecond) { + unsigned char chBlock; + unsigned short wCrc = CrcType; + + do { + chBlock = *Data++; + UpdateCrc14443(chBlock, &wCrc); + } while (--Length); + + if (CrcType == CRC_14443_B) + wCrc = ~wCrc; /* ISO/IEC 13239 (formerly ISO/IEC 3309) */ + + *TransmitFirst = (unsigned char)(wCrc & 0xFF); + *TransmitSecond = (unsigned char)((wCrc >> 8) & 0xFF); + return; +} + +int CheckCrc14443(int CrcType, const unsigned char *Data, int Length) { + unsigned char b1; + unsigned char b2; + if (Length < 3) return 0; + ComputeCrc14443(CrcType, Data, Length - 2, &b1, &b2); + if ((b1 == Data[Length - 2]) && (b2 == Data[Length - 1])) return 1; + return 0; +} diff --git a/tools/mf_nonce_brute/iso14443crc.h b/tools/mf_nonce_brute/iso14443crc.h new file mode 100644 index 000000000..e9a82d521 --- /dev/null +++ b/tools/mf_nonce_brute/iso14443crc.h @@ -0,0 +1,26 @@ +//----------------------------------------------------------------------------- +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// ISO14443 CRC calculation code. +//----------------------------------------------------------------------------- + +#ifndef __ISO14443CRC_H +#define __ISO14443CRC_H + +//----------------------------------------------------------------------------- +// Routines to compute the CRCs (two different flavours, just for confusion) +// required for ISO 14443, swiped directly from the spec. +//----------------------------------------------------------------------------- +#define CRC_14443_A 0x6363 /* ITU-V.41 */ +#define CRC_14443_B 0xFFFF /* ISO/IEC 13239 (formerly ISO/IEC 3309) */ +#define CRC_ICLASS 0xE012 /* ICLASS PREFIX */ + +void ComputeCrc14443(int CrcType, + const unsigned char *Data, int Length, + unsigned char *TransmitFirst, + unsigned char *TransmitSecond); +int CheckCrc14443(int CrcType, const unsigned char *Data, int Length); + +#endif diff --git a/tools/mf_nonce_brute/mf_nonce_brute.c b/tools/mf_nonce_brute/mf_nonce_brute.c new file mode 100644 index 000000000..6bc69c3d9 --- /dev/null +++ b/tools/mf_nonce_brute/mf_nonce_brute.c @@ -0,0 +1,395 @@ +#define __STDC_FORMAT_MACROS +#define _USE_32BIT_TIME_T 1 +#include +#include +#include +#include +#include +#include +#include +#include +#include "crapto1/crapto1.h" +#include "protocol.h" +#include "iso14443crc.h" + +#define odd_parity(i) (( (i) ^ (i)>>1 ^ (i)>>2 ^ (i)>>3 ^ (i)>>4 ^ (i)>>5 ^ (i)>>6 ^ (i)>>7 ^ 1) & 0x01) + +// a global mutex to prevent interlaced printing from different threads +pthread_mutex_t print_lock; + +//--------------------- define options here +uint32_t uid = 0; // serial number +uint32_t nt_enc = 0; // Encrypted tag nonce +uint32_t nr_enc = 0; // encrypted reader challenge +uint32_t ar_enc = 0; // encrypted reader response +uint32_t at_enc = 0; // encrypted tag response +uint32_t cmd_enc = 0; // next encrypted command to sector + +uint32_t nt_par_err = 0; +uint32_t ar_par_err = 0; +uint32_t at_par_err = 0; + +typedef struct thread_args { + uint16_t xored; + int thread; + int idx; + bool ev1; +} targs; + +//------------------------------------------------------------------ +uint8_t cmds[] = { + ISO14443A_CMD_READBLOCK, + ISO14443A_CMD_WRITEBLOCK, + MIFARE_AUTH_KEYA, + MIFARE_AUTH_KEYB, + MIFARE_CMD_INC, + MIFARE_CMD_DEC, + MIFARE_CMD_RESTORE, + MIFARE_CMD_TRANSFER +}; + +int global_counter = 0; +int global_fin_flag = 0; +int global_found = 0; +int global_found_candidate = 0; +size_t thread_count = 4; + +static uint16_t parity_from_err(uint32_t data, uint16_t par_err) { + + uint16_t par = 0; + par |= odd_parity((data >> 24) & 0xFF) ^ ((par_err >> 12) & 1); + par <<= 4; + + par |= odd_parity((data >> 16) & 0xFF) ^ ((par_err >> 8) & 1); + par <<= 4; + + par |= odd_parity((data >> 8) & 0xFF) ^ ((par_err >> 4) & 1); + par <<= 4; + + par |= odd_parity(data & 0xFF) ^ (par_err & 1); + return par; +} + +static uint16_t xored_bits(uint16_t nt_par, uint32_t ntenc, uint16_t ar_par, uint32_t arenc, uint16_t at_par, uint32_t atenc) { + uint16_t xored = 0; + + uint8_t par; + //1st (1st nt) + par = (nt_par >> 12) & 1; + xored |= par ^ ((ntenc >> 16) & 1); + xored <<= 1; + + //2nd (2nd nt) + par = (nt_par >> 8) & 1; + xored |= par ^ ((ntenc >> 8) & 1); + xored <<= 1; + + //3rd (3rd nt) + par = (nt_par >> 4) & 1; + xored |= par ^ (ntenc & 1); + xored <<= 1; + + //4th (1st ar) + par = (ar_par >> 12) & 1; + xored |= par ^ ((arenc >> 16) & 1); + xored <<= 1; + + //5th (2nd ar) + par = (ar_par >> 8) & 1; + xored |= par ^ ((arenc >> 8) & 1); + xored <<= 1; + + //6th (3rd ar) + par = (ar_par >> 4) & 1; + xored |= par ^ (arenc & 1); + xored <<= 1; + + //7th (4th ar) + par = ar_par & 1; + xored |= par ^ ((atenc >> 24) & 1); + xored <<= 1; + + //8th (1st at) + par = (at_par >> 12) & 1; + xored |= par ^ ((atenc >> 16) & 1); + xored <<= 1; + + //9th (2nd at) + par = (at_par >> 8) & 1; + xored |= par ^ ((atenc >> 8) & 1); + xored <<= 1; + + //10th (3rd at) + par = (at_par >> 4) & 1; + xored |= par ^ (atenc & 1); + + return xored; +} + +static bool candidate_nonce(uint32_t xored, uint32_t nt, bool ev1) { + uint8_t byte, check; + + if (!ev1) { + //1st (1st nt) + byte = (nt >> 24) & 0xFF; + check = odd_parity(byte) ^ ((nt >> 16) & 1) ^ ((xored >> 9) & 1); + if (check) return false; + + //2nd (2nd nt) + byte = (nt >> 16) & 0xFF; + check = odd_parity(byte) ^ ((nt >> 8) & 1) ^ ((xored >> 8) & 1); + if (check) return false; + } + + //3rd (3rd nt) + byte = (nt >> 8) & 0xFF; + check = odd_parity(byte) ^ (nt & 1) ^ ((xored >> 7) & 1); + if (check) return false; + + uint32_t ar = prng_successor(nt, 64); + + //4th (1st ar) + byte = (ar >> 24) & 0xFF; + check = odd_parity(byte) ^ ((ar >> 16) & 1) ^ ((xored >> 6) & 1); + if (check) return false; + + //5th (2nd ar) + byte = (ar >> 16) & 0x0FF; + check = odd_parity(byte) ^ ((ar >> 8) & 1) ^ ((xored >> 5) & 1); + if (check) return false; + + //6th (3rd ar) + byte = (ar >> 8) & 0xFF; + check = odd_parity(byte) ^ (ar & 1) ^ ((xored >> 4) & 1); + if (check) return false; + + uint32_t at = prng_successor(nt, 96); + + //7th (4th ar) + byte = ar & 0xFF; + check = odd_parity(byte) ^ ((at >> 24) & 1) ^ ((xored >> 3) & 1); + if (check) return false; + + //8th (1st at) + byte = (at >> 24) & 0xFF; + check = odd_parity(byte) ^ ((at >> 16) & 1) ^ ((xored >> 2) & 1); + if (check) return false; + + //9th (2nd at) + byte = (at >> 16) & 0xFF; + check = odd_parity(byte) ^ ((at >> 8) & 1) ^ ((xored >> 1) & 1) ; + if (check) return false; + + //10th (3rd at) + byte = (at >> 8) & 0xFF; + check = odd_parity(byte) ^ (at & 1) ^ (xored & 1); + if (check) return false; + + return true; +} + +static bool checkValidCmd(uint32_t decrypted) { + uint8_t cmd = (decrypted >> 24) & 0xFF; + for (int i = 0; i < sizeof(cmds); ++i) { + if (cmd == cmds[i]) + return true; + } + return false; +} + +static bool checkCRC(uint32_t decrypted) { + uint8_t data[] = { + (decrypted >> 24) & 0xFF, + (decrypted >> 16) & 0xFF, + (decrypted >> 8) & 0xFF, + decrypted & 0xFF + }; + return CheckCrc14443(CRC_14443_A, data, sizeof(data)); +} + +static void *brute_thread(void *arguments) { + + //int shift = (int)arg; + struct thread_args *args = (struct thread_args *) arguments; + + struct Crypto1State *revstate; + uint64_t key; // recovered key candidate + uint32_t ks2; // keystream used to encrypt reader response + uint32_t ks3; // keystream used to encrypt tag response + uint32_t ks4; // keystream used to encrypt next command + uint32_t nt; // current tag nonce + + uint32_t p64 = 0; + uint32_t count; + int found = 0; + // TC == 4 ( + // threads calls 0 ev1 == false + // threads calls 0,1,2 ev1 == true + for (count = args->idx; count < 0xFFFF; count += thread_count - 1) { + + found = global_found; + if (found) break; + + nt = count << 16 | prng_successor(count, 16); + + if (!candidate_nonce(args->xored, nt, args->ev1)) + continue; + + p64 = prng_successor(nt, 64); + ks2 = ar_enc ^ p64; + ks3 = at_enc ^ prng_successor(p64, 32); + revstate = lfsr_recovery64(ks2, ks3); + ks4 = crypto1_word(revstate, 0, 0); + + if (ks4 != 0) { + + // lock this section to avoid interlacing prints from different threats + pthread_mutex_lock(&print_lock); + if (args->ev1) + printf("\n**** Possible key candidate ****\n"); + +#if 0 + printf("thread #%d idx %d %s\n", args->thread, args->idx, (args->ev1) ? "(Ev1)" : ""); + printf("current nt(%08x) ar_enc(%08x) at_enc(%08x)\n", nt, ar_enc, at_enc); + printf("ks2:%08x\n", ks2); + printf("ks3:%08x\n", ks3); + printf("ks4:%08x\n", ks4); +#endif + if (cmd_enc) { + uint32_t decrypted = ks4 ^ cmd_enc; + printf("CMD enc(%08x)\n", cmd_enc); + printf(" dec(%08x)\t", decrypted); + + uint8_t isOK = 0; + // check if cmd exists + isOK = checkValidCmd(decrypted); + + // Add a crc-check. + isOK = checkCRC(decrypted); + + if (!isOK) { + printf("<-- not a valid cmd\n"); + pthread_mutex_unlock(&print_lock); + continue; + } else { + printf("<-- Valid cmd\n"); + } + } + + lfsr_rollback_word(revstate, 0, 0); + lfsr_rollback_word(revstate, 0, 0); + lfsr_rollback_word(revstate, 0, 0); + lfsr_rollback_word(revstate, nr_enc, 1); + lfsr_rollback_word(revstate, uid ^ nt, 0); + crypto1_get_lfsr(revstate, &key); + free(revstate); + + if (args->ev1) { + printf("\nKey candidate: [%012" PRIx64 "]\n\n", key); + __sync_fetch_and_add(&global_found_candidate, 1); + } else { + printf("\nValid Key found: [%012" PRIx64 "]\n\n", key); + __sync_fetch_and_add(&global_found, 1); + } + //release lock + pthread_mutex_unlock(&print_lock); + } + } + return NULL; +} + +static int usage(void) { + printf(" syntax: mf_nonce_brute []\n\n"); + printf(" example: nt in trace = 8c! 42 e6! 4e!\n"); + printf(" nt = 8c42e64e\n"); + printf(" nt_par_err = 1011\n\n"); + printf("\n expected outcome:\n"); + printf(" KEY 0xFFFFFFFFFFFF == fa247164 fb47c594 0000 71909d28 0c254817 1000 0dc7cfbd 1110\n"); + return 1; +} + +int main(int argc, char *argv[]) { + printf("Mifare classic nested auth key recovery. Phase 1.\n"); + + if (argc < 9) return usage(); + + sscanf(argv[1], "%x", &uid); + sscanf(argv[2], "%x", &nt_enc); + sscanf(argv[3], "%x", &nt_par_err); + sscanf(argv[4], "%x", &nr_enc); + sscanf(argv[5], "%x", &ar_enc); + sscanf(argv[6], "%x", &ar_par_err); + sscanf(argv[7], "%x", &at_enc); + sscanf(argv[8], "%x", &at_par_err); + + if (argc > 9) + sscanf(argv[9], "%x", &cmd_enc); + + printf("-------------------------------------------------\n"); + printf("uid:\t\t%08x\n", uid); + printf("nt encrypted:\t%08x\n", nt_enc); + printf("nt parity err:\t%04x\n", nt_par_err); + printf("nr encrypted:\t%08x\n", nr_enc); + printf("ar encrypted:\t%08x\n", ar_enc); + printf("ar parity err:\t%04x\n", ar_par_err); + printf("at encrypted:\t%08x\n", at_enc); + printf("at parity err:\t%04x\n", at_par_err); + + if (argc > 9) + printf("next cmd enc:\t%08x\n\n", cmd_enc); + + clock_t t1 = clock(); + uint16_t nt_par = parity_from_err(nt_enc, nt_par_err); + uint16_t ar_par = parity_from_err(ar_enc, ar_par_err); + uint16_t at_par = parity_from_err(at_enc, at_par_err); + + //calc (parity XOR corresponding nonce bit encoded with the same keystream bit) + uint16_t xored = xored_bits(nt_par, nt_enc, ar_par, ar_enc, at_par, at_enc); + +#ifndef __WIN32 + thread_count = sysconf(_SC_NPROCESSORS_CONF); + if (thread_count < 2) + thread_count = 2; +#endif /* _WIN32 */ + + printf("\nBruteforce using %zu threads to find encrypted tagnonce last bytes\n", thread_count); + + pthread_t threads[thread_count]; + + // create a mutex to avoid interlacing print commands from our different threads + pthread_mutex_init(&print_lock, NULL); + + // one thread T0 for none EV1. + struct thread_args *a = malloc(sizeof(struct thread_args)); + a->xored = xored; + a->thread = 0; + a->idx = 0; + a->ev1 = false; + pthread_create(&threads[0], NULL, brute_thread, (void *)a); + + // the rest of available threads to EV1 scenario + for (int i = 0; i < thread_count - 1; ++i) { + struct thread_args *b = malloc(sizeof(struct thread_args)); + b->xored = xored; + b->thread = i + 1; + b->idx = i; + b->ev1 = true; + pthread_create(&threads[i + 1], NULL, brute_thread, (void *)b); + } + + // wait for threads to terminate: + for (int i = 0; i < thread_count; ++i) + pthread_join(threads[i], NULL); + + if (!global_found && !global_found_candidate) { + printf("\nFailed to find a key\n\n"); + } + + t1 = clock() - t1; + if (t1 > 0) + printf("Execution time: %.0f ticks\n", (float)t1); + + // clean up mutex + pthread_mutex_destroy(&print_lock); + return 0; +} diff --git a/tools/mf_nonce_brute/protocol.h b/tools/mf_nonce_brute/protocol.h new file mode 100644 index 000000000..4f7f8b7e0 --- /dev/null +++ b/tools/mf_nonce_brute/protocol.h @@ -0,0 +1,20 @@ +#ifndef PROTOCOL_H +#define PROTOCOL_H + +#define ISO14443A_CMD_READBLOCK 0x30 +#define ISO14443A_CMD_WRITEBLOCK 0xA0 + +#define MIFARE_AUTH_KEYA 0x60 +#define MIFARE_AUTH_KEYB 0x61 +#define MIFARE_CMD_INC 0xC0 +#define MIFARE_CMD_DEC 0xC1 +#define MIFARE_CMD_RESTORE 0xC2 +#define MIFARE_CMD_TRANSFER 0xB0 + +// mifare 4bit card answers +#define CARD_ACK 0x0A // 1010 - ACK +#define CARD_NACK_NA 0x04 // 0100 - NACK, not allowed (command not allowed) +#define CARD_NACK_TR 0x05 // 0101 - NACK, transmission error + +#endif +// PROTOCOL_H diff --git a/tools/mf_nonce_brute/sleep.c b/tools/mf_nonce_brute/sleep.c new file mode 100644 index 000000000..0dd4c089d --- /dev/null +++ b/tools/mf_nonce_brute/sleep.c @@ -0,0 +1,28 @@ +//----------------------------------------------------------------------------- +// Copyright (C) 2010 iZsh +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// platform-independant sleep macros +//----------------------------------------------------------------------------- + +#ifndef _WIN32 + +#define _POSIX_C_SOURCE 199309L +#include "sleep.h" +#include +#include +#include +#include + +void nsleep(uint64_t n) { + struct timespec timeout; + timeout.tv_sec = n / 1000000000; + timeout.tv_nsec = n % 1000000000; + while (nanosleep(&timeout, &timeout) && errno == EINTR); +} + +#endif // _WIN32 + diff --git a/tools/mf_nonce_brute/sleep.h b/tools/mf_nonce_brute/sleep.h new file mode 100644 index 000000000..8465b6041 --- /dev/null +++ b/tools/mf_nonce_brute/sleep.h @@ -0,0 +1,27 @@ +//----------------------------------------------------------------------------- +// Copyright (C) 2010 iZsh +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// platform-independant sleep macros +//----------------------------------------------------------------------------- + +#ifndef SLEEP_H__ +#define SLEEP_H__ + +#ifdef _WIN32 +# include +# define sleep(n) Sleep(1000 * n) +# define msleep(n) Sleep(n) +#else +# include +# include +void nsleep(uint64_t n); +# define msleep(n) nsleep(1000000 * n) +# define usleep(n) nsleep(1000 * n) +#endif // _WIN32 + +#endif // SLEEP_H__ + From ddb432ec8f808dcb699b21f0b2d0c13b2e3d2d58 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 15 May 2020 17:00:53 +0200 Subject: [PATCH 220/632] textual --- client/src/loclass/cipher.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/client/src/loclass/cipher.c b/client/src/loclass/cipher.c index 9cc683300..b8d481f1e 100644 --- a/client/src/loclass/cipher.c +++ b/client/src/loclass/cipher.c @@ -247,7 +247,6 @@ static void MAC(uint8_t *k, BitstreamIn input, BitstreamOut out) { void doMAC(uint8_t *cc_nr_p, uint8_t *div_key_p, uint8_t mac[4]) { uint8_t cc_nr[13] = { 0 }; uint8_t div_key[8]; - //cc_nr=(uint8_t*) calloc(length+1, sizeof(uint8_t)); memcpy(cc_nr, cc_nr_p, 12); memcpy(div_key, div_key_p, 8); @@ -260,7 +259,6 @@ void doMAC(uint8_t *cc_nr_p, uint8_t *div_key_p, uint8_t mac[4]) { //The output MAC must also be reversed reverse_arraybytes(dest, sizeof(dest)); memcpy(mac, dest, 4); - //free(cc_nr); } void doMAC_N(uint8_t *address_data_p, uint8_t address_data_size, uint8_t *div_key_p, uint8_t mac[4]) { @@ -296,9 +294,9 @@ int testMAC(void) { doMAC(cc_nr, div_key, calculated_mac); if (memcmp(calculated_mac, correct_MAC, 4) == 0) { - PrintAndLogEx(SUCCESS, "MAC calculation OK!"); + PrintAndLogEx(SUCCESS, " MAC calculation (%s)", _GREEN_("ok")); } else { - PrintAndLogEx(FAILED, "FAILED: MAC calculation failed:"); + PrintAndLogEx(FAILED, " MAC calculation (%s)", _RED_("failed")); printarr(" Calculated_MAC", calculated_mac, 4); printarr(" Correct_MAC ", correct_MAC, 4); return PM3_ESOFT; From f3b4028e8a4ef9ee92573700e42ec5436c1eb0fb Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 15 May 2020 17:02:42 +0200 Subject: [PATCH 221/632] textaul, worked return codes for tests and swaped to printandlog --- client/src/loclass/cipherutils.c | 27 +++--- client/src/loclass/elite_crack.c | 82 ++++++++-------- client/src/loclass/elite_crack.h | 2 +- client/src/loclass/hash1_brute.c | 1 - client/src/loclass/ikeys.c | 154 ++++++++++++++----------------- client/src/loclass/ikeys.h | 2 +- 6 files changed, 130 insertions(+), 138 deletions(-) diff --git a/client/src/loclass/cipherutils.c b/client/src/loclass/cipherutils.c index fa58dfeaa..31ff90e50 100644 --- a/client/src/loclass/cipherutils.c +++ b/client/src/loclass/cipherutils.c @@ -169,12 +169,17 @@ void printarr_human_readable(const char *title, uint8_t *arr, int len) { if (arr == NULL) return; int cx = 0, i; - size_t outsize = 100 + strlen(title) + len * 4; + size_t outsize = 100 + strlen(title) + (len * 4); char *output = calloc(outsize, sizeof(char)); PrintAndLogEx(INFO, "%s", title); for (i = 0; i < len; i++) { - if (i % 16 == 0) - cx += snprintf(output + cx, outsize - cx, "\n%02x| ", i); + if (i % 16 == 0) { + + if (i == 0) + cx += snprintf(output + cx, outsize - cx, "%02x| ", i); + else + cx += snprintf(output + cx, outsize - cx, "\n%02x| ", i); + } cx += snprintf(output + cx, outsize - cx, "%02x ", *(arr + i)); } PrintAndLogEx(INFO, output); @@ -199,9 +204,9 @@ static int testBitStream(void) { } if (memcmp(input, output, sizeof(input)) == 0) { - PrintAndLogEx(SUCCESS, " Bitstream test 1 ok"); + PrintAndLogEx(SUCCESS, " Bitstream test 1 (%s)", _GREEN_("ok") ); } else { - PrintAndLogEx(FAILED, " Bitstream test 1 failed"); + PrintAndLogEx(FAILED, " Bitstream test 1 (%s)", _RED_("failed") ); uint8_t i; for (i = 0 ; i < ARRAYLEN(input) ; i++) { PrintAndLogEx(NORMAL, " IN %02x, OUT %02x", input[i], output[i]); @@ -229,9 +234,9 @@ static int testReversedBitstream(void) { } if (memcmp(input, output, sizeof(input)) == 0) { - PrintAndLogEx(SUCCESS, " Bitstream test 2 ok"); + PrintAndLogEx(SUCCESS, " Bitstream test 2 (%s)", _GREEN_("ok") ); } else { - PrintAndLogEx(FAILED, " Bitstream test 2 failed"); + PrintAndLogEx(FAILED, " Bitstream test 2 (%s)", _RED_("failed") ); uint8_t i; for (i = 0 ; i < ARRAYLEN(input) ; i++) { PrintAndLogEx(NORMAL, " IN %02x, MIDDLE: %02x, OUT %02x", input[i], reverse[i], output[i]); @@ -241,12 +246,12 @@ static int testReversedBitstream(void) { return PM3_SUCCESS; } - int testCipherUtils(void) { PrintAndLogEx(INFO, "Testing some internals..."); - int retval = 0; - retval |= testBitStream(); - retval |= testReversedBitstream(); + int retval = testBitStream(); + if (retval == PM3_SUCCESS) + retval = testReversedBitstream(); + return retval; } #endif diff --git a/client/src/loclass/elite_crack.c b/client/src/loclass/elite_crack.c index 4dbac9704..cc9570351 100644 --- a/client/src/loclass/elite_crack.c +++ b/client/src/loclass/elite_crack.c @@ -293,7 +293,7 @@ static int _readFromDump(uint8_t dump[], dumpdata *item, uint8_t i) { * @return */ int bruteforceItem(dumpdata item, uint16_t keytable[]) { - int errors = 0; + int found = false; uint8_t key_sel_p[8] = {0}; uint8_t div_key[8] = {0}; @@ -334,7 +334,7 @@ int bruteforceItem(dumpdata item, uint16_t keytable[]) { keytable[bytes_to_recover[0]] &= ~BEING_CRACKED; keytable[bytes_to_recover[1]] &= ~BEING_CRACKED; keytable[bytes_to_recover[2]] &= ~BEING_CRACKED; - return 1; + return PM3_ESOFT; } } @@ -400,11 +400,13 @@ int bruteforceItem(dumpdata item, uint16_t keytable[]) { } } + int errors = PM3_SUCCESS; + if (!found) { PrintAndLogEx(NORMAL, ""); PrintAndLogEx(WARNING, "Failed to recover %d bytes using the following CSN", numbytes_to_recover); PrintAndLogEx(INFO, "CSN %s", sprint_hex(item.csn, 8)); - errors++; + errors = PM3_ESOFT; //Before we exit, reset the 'BEING_CRACKED' to zero for (i = 0; i < numbytes_to_recover; i++) { @@ -475,14 +477,14 @@ int calculateMasterKey(uint8_t first16bytes[], uint64_t master_key[]) { if (master_key != NULL) memcpy(master_key, key64, 8); + PrintAndLogEx(NORMAL, "\n"); if (memcmp(z_0, result, 4) != 0) { PrintAndLogEx(WARNING, _RED_("Failed to verify") " calculated master key (k_cus)! Something is wrong."); - return 1; - } else { - PrintAndLogEx(NORMAL, "\n"); - PrintAndLogEx(SUCCESS, _GREEN_("Key verified ok!")); - } - return 0; + return PM3_ESOFT; + } + + PrintAndLogEx(SUCCESS, _GREEN_("Key verified ok!")); + return PM3_SUCCESS; } /** * @brief Same as bruteforcefile, but uses a an array of dumpdata instead @@ -493,27 +495,29 @@ int calculateMasterKey(uint8_t first16bytes[], uint64_t master_key[]) { */ int bruteforceDump(uint8_t dump[], size_t dumpsize, uint16_t keytable[]) { uint8_t i; - int errors = 0; size_t itemsize = sizeof(dumpdata); - uint64_t t1 = msclock(); dumpdata *attack = (dumpdata *) calloc(itemsize, sizeof(uint8_t)); - + if (attack == NULL) { + PrintAndLogEx(WARNING, "failed to allocate memory"); + return PM3_EMALLOC; + } + + int res = 0; for (i = 0 ; i * itemsize < dumpsize ; i++) { memcpy(attack, dump + i * itemsize, itemsize); - errors += bruteforceItem(*attack, keytable); - if (errors) + res += bruteforceItem(*attack, keytable); + if (res != PM3_SUCCESS) break; } free(attack); t1 = msclock() - t1; PrintAndLogEx(SUCCESS, "time: %" PRIu64 " seconds", t1 / 1000); - - if (errors) { + if (res != PM3_SUCCESS) { PrintAndLogEx(ERR, "loclass exiting. Try run " _YELLOW_("`hf iclass sim 2`") " again and collect new data"); - return 1; + return PM3_ESOFT; } // Pick out the first 16 bytes of the keytable. @@ -527,11 +531,10 @@ int bruteforceDump(uint8_t dump[], size_t dumpsize, uint16_t keytable[]) { if (!(keytable[i] & CRACKED)) { PrintAndLogEx(WARNING, "Warning: we are missing byte %d, custom key calculation will fail...", i); - return 1; + return PM3_ESOFT; } } - errors += calculateMasterKey(first16bytes, NULL); - return errors; + return calculateMasterKey(first16bytes, NULL); } /** * Perform a bruteforce against a file which has been saved by pm3 @@ -589,12 +592,11 @@ static int _testBruteforce(void) { **** The 64-bit HS Custom Key Value = 5B7C62C491C11B39 **** **/ uint16_t keytable[128] = {0}; - int errors = bruteforceFile("iclass_dump.bin", keytable); - if (errors) { + int res = bruteforceFile("iclass_dump.bin", keytable); + if (res != PM3_SUCCESS) { PrintAndLogEx(ERR, "Error: The file " _YELLOW_("iclass_dump.bin") "was not found!"); } - - return errors; + return res; } static int _test_iclass_key_permutation(void) { @@ -609,18 +611,18 @@ static int _test_iclass_key_permutation(void) { PrintAndLogEx(ERR, "Error with iclass key permute!"); printarr("testcase_output", testcase_output, 8); printarr("testcase_output_correct", testcase_output_correct, 8); - return 1; + return PM3_ESOFT; } if (memcmp(testcase, testcase_output_rev, 8) != 0) { PrintAndLogEx(ERR, "Error with reverse iclass key permute"); printarr("testcase", testcase, 8); printarr("testcase_output_rev", testcase_output_rev, 8); - return 1; + return PM3_ESOFT; } - PrintAndLogEx(SUCCESS, "Iclass key permutation OK!"); - return 0; + PrintAndLogEx(SUCCESS, "Iclass key permutation (%s)", _GREEN_("OK")); + return PM3_SUCCESS; } static int _testHash1(void) { @@ -633,9 +635,9 @@ static int _testHash1(void) { PrintAndLogEx(ERR, "Error with hash1!"); printarr("calculated", k, 8); printarr("expected", expected, 8); - return 1; + return PM3_ESOFT; } - return 0; + return PM3_SUCCESS; } int testElite(bool slowtests) { @@ -662,15 +664,21 @@ int testElite(bool slowtests) { hash2(k_cus, keytable); printarr_human_readable("Hash2", keytable, 128); if (keytable[3] == 0xA1 && keytable[0x30] == 0xA3 && keytable[0x6F] == 0x95) { - PrintAndLogEx(SUCCESS, "Hash2 looks fine..."); + PrintAndLogEx(SUCCESS, " Hash2 (%s)", _GREEN_("ok")); } - int errors = 0 ; + int res = PM3_SUCCESS; PrintAndLogEx(INFO, "Testing hash1..."); - errors += _testHash1(); - PrintAndLogEx(INFO, "Testing key diversification ..."); - errors += _test_iclass_key_permutation(); + res += _testHash1(); + PrintAndLogEx(INFO, " hash1 (%s)", (res == PM3_SUCCESS) ? _GREEN_("ok") : _RED_("fail") ); + + PrintAndLogEx(INFO, "Testing key diversification..."); + res += _test_iclass_key_permutation(); + if (res == PM3_SUCCESS) + PrintAndLogEx(INFO, " key diversification (%s)", (res == PM3_SUCCESS) ? _GREEN_("ok") : _RED_("fail") ); + if (slowtests) - errors += _testBruteforce(); - return errors; + res += _testBruteforce(); + + return res; } diff --git a/client/src/loclass/elite_crack.h b/client/src/loclass/elite_crack.h index 8b357ac66..a9de5dbd1 100644 --- a/client/src/loclass/elite_crack.h +++ b/client/src/loclass/elite_crack.h @@ -104,7 +104,7 @@ int bruteforceItem(dumpdata item, uint16_t keytable[]); * @param csn the CSN used * @param k output */ -void hash1(uint8_t csn[], uint8_t k[]); +void hash1(uint8_t *csn, uint8_t *k); void hash2(uint8_t *key64, uint8_t *outp_keytable); /** * From dismantling iclass-paper: diff --git a/client/src/loclass/hash1_brute.c b/client/src/loclass/hash1_brute.c index e381c5a3a..1c944b99e 100644 --- a/client/src/loclass/hash1_brute.c +++ b/client/src/loclass/hash1_brute.c @@ -8,7 +8,6 @@ #include #include "elite_crack.h" - static void calc_score(uint8_t *csn, uint8_t *k) { uint8_t score = 0 ; uint8_t i; diff --git a/client/src/loclass/ikeys.c b/client/src/loclass/ikeys.c index 3bbe9fc2b..d828583d7 100644 --- a/client/src/loclass/ikeys.c +++ b/client/src/loclass/ikeys.c @@ -72,13 +72,17 @@ From "Dismantling iclass": #include "cipherutils.h" #include "mbedtls/des.h" -uint8_t pi[35] = {0x0F, 0x17, 0x1B, 0x1D, 0x1E, 0x27, 0x2B, 0x2D, 0x2E, 0x33, 0x35, 0x39, 0x36, 0x3A, 0x3C, 0x47, 0x4B, 0x4D, 0x4E, 0x53, 0x55, 0x56, 0x59, 0x5A, 0x5C, 0x63, 0x65, 0x66, 0x69, 0x6A, 0x6C, 0x71, 0x72, 0x74, 0x78}; +uint8_t pi[35] = { + 0x0F, 0x17, 0x1B, 0x1D, 0x1E, 0x27, 0x2B, 0x2D, + 0x2E, 0x33, 0x35, 0x39, 0x36, 0x3A, 0x3C, 0x47, + 0x4B, 0x4D, 0x4E, 0x53, 0x55, 0x56, 0x59, 0x5A, + 0x5C, 0x63, 0x65, 0x66, 0x69, 0x6A, 0x6C, 0x71, + 0x72, 0x74, 0x78 +}; static mbedtls_des_context ctx_enc; static mbedtls_des_context ctx_dec; -static int debug_print = 0; - /** * @brief The key diversification algorithm uses 6-bit bytes. * This implementation uses 64 bit uint to pack seven of them into one @@ -219,25 +223,19 @@ static void permute(BitstreamIn *p_in, uint64_t z, int l, int r, BitstreamOut *o } } -static void printbegin(void) { - if (debug_print < 2) - return; - - PrintAndLogEx(NORMAL, " | x| y|z0|z1|z2|z3|z4|z5|z6|z7|"); -} - static void printState(const char *desc, uint64_t c) { - if (debug_print < 2) - return; - - printf("%s : ", desc); + char s[60] = {0}; + snprintf(s, sizeof(s), "%s : ", desc); + uint8_t x = (c & 0xFF00000000000000) >> 56; uint8_t y = (c & 0x00FF000000000000) >> 48; - printf(" %02x %02x", x, y); - int i; - for (i = 0; i < 8; i++) - printf(" %02x", getSixBitByte(c, i)); - printf("\n"); + + snprintf(s + strlen(s), sizeof(s) - strlen(s), " %02x %02x", x, y); + + for (uint8_t i = 0; i < 8; i++) + snprintf(s + strlen(s), sizeof(s) - strlen(s), " %02x", getSixBitByte(c, i)); + + PrintAndLogEx(DEBUG, "%s", s); } /** @@ -254,7 +252,7 @@ static void printState(const char *desc, uint64_t c) { void hash0(uint64_t c, uint8_t k[8]) { c = swapZvalues(c); - printbegin(); + PrintAndLogEx(DEBUG, " | x| y|z0|z1|z2|z3|z4|z5|z6|z7|"); printState("origin", c); //These 64 bits are divided as c = x, y, z [0] , . . . , z [7] // x = 8 bits @@ -286,7 +284,7 @@ void hash0(uint64_t c, uint8_t k[8]) { if (x & 1) //Check if x7 is 1 p = ~p; - if (debug_print >= 2) PrintAndLogEx(DEBUG, "p:%02x", p); + PrintAndLogEx(DEBUG, "p: %02x", p); BitstreamIn p_in = { &p, 8, 0 }; uint8_t outbuffer[] = {0, 0, 0, 0, 0, 0, 0, 0}; @@ -297,7 +295,7 @@ void hash0(uint64_t c, uint8_t k[8]) { // if all went well //Shift z-values down onto the lower segment - uint64_t zTilde = x_bytes_to_num(outbuffer, 8); + uint64_t zTilde = x_bytes_to_num(outbuffer, sizeof(outbuffer)); zTilde >>= 16; @@ -353,7 +351,7 @@ void hash0(uint64_t c, uint8_t k[8]) { * @param key * @param div_key */ -void diversifyKey(uint8_t csn[8], uint8_t key[8], uint8_t div_key[8]) { +void diversifyKey(uint8_t* csn, uint8_t* key, uint8_t* div_key) { // Prepare the DES key mbedtls_des_setkey_enc(&ctx_enc, key); @@ -363,10 +361,10 @@ void diversifyKey(uint8_t csn[8], uint8_t key[8], uint8_t div_key[8]) { mbedtls_des_crypt_ecb(&ctx_enc, csn, crypted_csn); //Calculate HASH0(DES)) - uint64_t crypt_csn = x_bytes_to_num(crypted_csn, 8); + uint64_t c_csn = x_bytes_to_num(crypted_csn, sizeof(crypted_csn)); //uint64_t crypted_csn_swapped = swapZvalues(crypt_csn); - hash0(crypt_csn, div_key); + hash0(c_csn, div_key); } /* static void testPermute(void) { @@ -571,58 +569,42 @@ static int testKeyDiversificationWithMasterkeyTestcases(void) { return error; } -static void print64bits(const char *name, uint64_t val) { - printf("%s%08x%08x\n", name, (uint32_t)(val >> 32), (uint32_t)(val & 0xFFFFFFFF)); -} +static int testCryptedCSN(uint64_t crypted_csn, uint64_t expected) { -static uint64_t testCryptedCSN(uint64_t crypted_csn, uint64_t expected) { - int retval = 0; uint8_t result[8] = {0}; - if (debug_print) { - PrintAndLogEx(DEBUG, "debug_print %d", debug_print); - print64bits(" {csn} ", crypted_csn); - } - uint64_t crypted_csn_swapped = swapZvalues(crypted_csn); - - if (debug_print) print64bits(" {csn-revz} ", crypted_csn_swapped); - hash0(crypted_csn, result); uint64_t resultbyte = x_bytes_to_num(result, 8); - if (debug_print) print64bits(" hash0 ", resultbyte); + + PrintAndLogEx(DEBUG, ""); + PrintAndLogEx(DEBUG, " {csn} %"PRIx64, crypted_csn); + PrintAndLogEx(DEBUG, " {csn-revz} %"PRIx64, crypted_csn_swapped); + PrintAndLogEx(DEBUG, " hash0 %"PRIx64 " (%s)", resultbyte, (resultbyte == expected) ? _GREEN_("OK") : _RED_("FAIL") ); if (resultbyte != expected) { - if (debug_print) { - PrintAndLogEx(NORMAL, "\n"); - PrintAndLogEx(FAILED, "FAIL!"); - print64bits(" expected ", expected); - } - retval = 1; - } else { - if (debug_print) PrintAndLogEx(SUCCESS, "[OK]"); + PrintAndLogEx(DEBUG, " expected " _YELLOW_("%"PRIx64), expected); + return PM3_ESOFT; } - return retval; + return PM3_SUCCESS; } static int testDES2(uint64_t csn, uint64_t expected) { uint8_t result[8] = {0}; uint8_t input[8] = {0}; - print64bits(" csn ", csn); + PrintAndLogEx(DEBUG, " csn %"PRIx64, csn); x_num_to_bytes(csn, 8, input); mbedtls_des_crypt_ecb(&ctx_enc, input, result); uint64_t crypt_csn = x_bytes_to_num(result, 8); - print64bits(" {csn} ", crypt_csn); - print64bits(" expected ", expected); - if (expected == crypt_csn) { - PrintAndLogEx(SUCCESS, "OK"); - return 0; - } else { - return 1; - } + PrintAndLogEx(DEBUG, " {csn} %"PRIx64, crypt_csn); + PrintAndLogEx(DEBUG, " expected %"PRIx64 " (%s)", expected, (expected == crypt_csn) ? _GREEN_("OK") : _RED_("FAIL") ); + + if (expected != crypt_csn) + return PM3_ESOFT; + return PM3_SUCCESS; } /** @@ -632,53 +614,52 @@ static int testDES2(uint64_t csn, uint64_t expected) { */ static int doTestsWithKnownInputs(void) { // KSel from http://www.proxmark.org/forum/viewtopic.php?pid=10977#p10977 - int errors = 0; - PrintAndLogEx(SUCCESS, "Testing DES encryption"); + PrintAndLogEx(INFO, "Testing DES encryption"); uint8_t key[8] = {0x6c, 0x8d, 0x44, 0xf9, 0x2a, 0x2d, 0x01, 0xbf}; mbedtls_des_setkey_enc(&ctx_enc, key); testDES2(0xbbbbaaaabbbbeeee, 0xd6ad3ca619659e6b); - PrintAndLogEx(SUCCESS, "Testing hashing algorithm"); + PrintAndLogEx(INFO, "Testing hashing algorithm"); - errors += testCryptedCSN(0x0102030405060708, 0x0bdd6512073c460a); - errors += testCryptedCSN(0x1020304050607080, 0x0208211405f3381f); - errors += testCryptedCSN(0x1122334455667788, 0x2bee256d40ac1f3a); - errors += testCryptedCSN(0xabcdabcdabcdabcd, 0xa91c9ec66f7da592); - errors += testCryptedCSN(0xbcdabcdabcdabcda, 0x79ca5796a474e19b); - errors += testCryptedCSN(0xcdabcdabcdabcdab, 0xa8901b9f7ec76da4); - errors += testCryptedCSN(0xdabcdabcdabcdabc, 0x357aa8e0979a5b8d); - errors += testCryptedCSN(0x21ba6565071f9299, 0x34e80f88d5cf39ea); - errors += testCryptedCSN(0x14e2adfc5bb7e134, 0x6ac90c6508bd9ea3); + int res = PM3_SUCCESS; + res += testCryptedCSN(0x0102030405060708, 0x0bdd6512073c460a); + res += testCryptedCSN(0x1020304050607080, 0x0208211405f3381f); + res += testCryptedCSN(0x1122334455667788, 0x2bee256d40ac1f3a); + res += testCryptedCSN(0xabcdabcdabcdabcd, 0xa91c9ec66f7da592); + res += testCryptedCSN(0xbcdabcdabcdabcda, 0x79ca5796a474e19b); + res += testCryptedCSN(0xcdabcdabcdabcdab, 0xa8901b9f7ec76da4); + res += testCryptedCSN(0xdabcdabcdabcdabc, 0x357aa8e0979a5b8d); + res += testCryptedCSN(0x21ba6565071f9299, 0x34e80f88d5cf39ea); + res += testCryptedCSN(0x14e2adfc5bb7e134, 0x6ac90c6508bd9ea3); - if (errors) - PrintAndLogEx(FAILED, "%d errors occurred (9 testcases)", errors); - else + if (res != PM3_SUCCESS) { + PrintAndLogEx(FAILED, "%d res occurred (9 testcases)", res); + res = PM3_ESOFT; + } else { PrintAndLogEx(SUCCESS, "Hashing seems to work (9 testcases)"); - return errors; + res = PM3_SUCCESS; + } + return res; } - static bool readKeyFile(uint8_t *key, size_t keylen) { + bool retval = false; size_t len = 0; uint8_t *keyptr = NULL; if (loadFile_safe("iclass_key.bin", "", (void **)&keyptr, &len) != PM3_SUCCESS) { - return false; + return retval; } - - if (keylen != len) { - free(keyptr); - return false; + if (keylen == len) { + memcpy(key, keyptr, keylen); + retval = true; } - - memcpy(key, keyptr, keylen); free(keyptr); - return true; + return retval; } -int doKeyTests(uint8_t debuglevel) { - debug_print = debuglevel; +int doKeyTests(void) { PrintAndLogEx(INFO, "Checking if the master key is present (iclass_key.bin)..."); uint8_t key[8] = {0}; @@ -705,9 +686,8 @@ int doKeyTests(uint8_t debuglevel) { testKeyDiversificationWithMasterkeyTestcases(); } } - PrintAndLogEx(SUCCESS, "Testing key diversification with non-sensitive keys..."); - doTestsWithKnownInputs(); - return 0; + PrintAndLogEx(INFO, "Testing key diversification with non-sensitive keys..."); + return doTestsWithKnownInputs(); } /** diff --git a/client/src/loclass/ikeys.h b/client/src/loclass/ikeys.h index ccbc5539b..4fceda95f 100644 --- a/client/src/loclass/ikeys.h +++ b/client/src/loclass/ikeys.h @@ -52,7 +52,7 @@ * @return */ void hash0(uint64_t c, uint8_t k[8]); -int doKeyTests(uint8_t debuglevel); +int doKeyTests(void); /** * @brief Performs Elite-class key diversification * @param csn From 351a8d26affe4eae1eb4e69ebf346853c7bf2a38 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 15 May 2020 17:03:28 +0200 Subject: [PATCH 222/632] adjust tests --- client/src/cmdhficlass.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 66314e2c6..73b9a6b18 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -1938,11 +1938,15 @@ static int CmdHFiClass_loclass(const char *Cmd) { } } else if (opt == 't') { char opt2 = tolower(param_getchar(Cmd, 1)); + int errors = testCipherUtils(); errors += testMAC(); - errors += doKeyTests(0); + errors += doKeyTests(); errors += testElite(opt2 == 'l'); - if (errors) PrintAndLogEx(ERR, "There were errors!!!"); + + if (errors != PM3_SUCCESS) + PrintAndLogEx(ERR, "There were errors!!!"); + return PM3_ESOFT; } return PM3_SUCCESS; @@ -2076,7 +2080,7 @@ void HFiClassCalcDivKey(uint8_t *CSN, uint8_t *KEY, uint8_t *div_key, bool elite hash2(KEY, keytable); hash1(CSN, key_index); for (uint8_t i = 0; i < 8 ; i++) - key_sel[i] = keytable[key_index[i]] & 0xFF; + key_sel[i] = keytable[key_index[i]]; //Permute from iclass format to standard format permutekey_rev(key_sel, key_sel_p); From 8c656492582bff98f0b257bb380c8e63b5f88f27 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 15 May 2020 17:04:33 +0200 Subject: [PATCH 223/632] better fault text --- client/src/proxmark3.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index 08a4686ac..c8d70cb0d 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -241,8 +241,11 @@ check_script: // read script file if (fgets(script_cmd_buf, sizeof(script_cmd_buf), current_cmdscriptfile()) == NULL) { + PrintAndLogEx(ERR, "Unexpected end, [%s]", current_cmdscriptfile()); + if (!pop_cmdscriptfile()) break; + goto check_script; } else { prompt_ctx = PROXPROMPT_CTX_SCRIPTFILE; From 43b5ba4ae2eeb1e05dede8b1c94fd596c6440058 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 15 May 2020 17:05:33 +0200 Subject: [PATCH 224/632] chg: enabled param to swap modulation to test --- client/luascripts/test_t55x7.lua | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/client/luascripts/test_t55x7.lua b/client/luascripts/test_t55x7.lua index b92375520..f6e0e1ca2 100644 --- a/client/luascripts/test_t55x7.lua +++ b/client/luascripts/test_t55x7.lua @@ -9,7 +9,7 @@ local floor = math.floor copyright = '' author = "Iceman" -version = 'v1.0.2' +version = 'v1.0.3' desc =[[ This script will program a T55x7 TAG with a configuration and four blocks of data. It will then try to detect and read back those block data and compare if read data matches the expected data. @@ -31,12 +31,17 @@ testsuit for T55XX commands demodulation ]] example = [[ 1. script run test_t55x7 + 2. script run test_t55x7 -t FSK2A + 3. script run test_t55x7 -t PSK1 ]] usage = [[ -script run test_t55x7 [-h] +script run test_t55x7 [-h] [-t ]] arguments = [[ -h this help + -t (optional, defaults to ASK) 'PSK1', 'PSK2', 'PSK3', + 'FSK1', 'FSK2', 'FSK1A', 'FSK2A', + 'ASK', 'BI' ]] local DEBUG = true -- the debug flag @@ -303,9 +308,11 @@ local function main(args) print( string.rep('--',20) ) print( string.rep('--',20) ) + local modulation_type = 'ASK' -- Arguments for the script - for o, arg in getopt.getopt(args, 'h') do + for o, arg in getopt.getopt(args, 'ht:') do if o == 'h' then return help() end + if o == 't' then modulation_type = arg end end core.clearCommandBuffer() @@ -313,7 +320,8 @@ local function main(args) -- Adjust this table to set which configurations should be tested -- local test_modes = { 'PSK1', 'PSK2', 'PSK3', 'FSK1', 'FSK2', 'FSK1A', 'FSK2A', 'ASK', 'BI' } - local test_modes = { 'ASK' } + --local test_modes = { 'PSK1' } + local test_modes = { modulation_type } for _ = 1, #test_modes do res = WipeCard() From 94e1a9e680b180be8006b6a7d69825ac7b647c5b Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 15 May 2020 17:37:22 +0200 Subject: [PATCH 225/632] Add mf_nonce_brute to main makefile --- Makefile | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 1da96fa2e..2ba15fb0c 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ ifneq (,$(DESTDIR)) endif endif -all clean install uninstall: %: client/% bootrom/% armsrc/% recovery/% mfkey/% nonce2key/% fpga_compress/% +all clean install uninstall: %: client/% bootrom/% armsrc/% recovery/% mfkey/% nonce2key/% mf_nonce_brute/% fpga_compress/% INSTALLTOOLS=pm3_eml2lower.sh pm3_eml2upper.sh pm3_mfdread.py pm3_mfd2eml.py pm3_eml2mfd.py findbits.py rfidtest.pl xorcheck.py INSTALLSIMFW=sim011.bin sim011.sha512.txt @@ -84,6 +84,9 @@ mfkey/%: FORCE nonce2key/%: FORCE $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C tools/nonce2key $(patsubst nonce2key/%,%,$@) DESTDIR=$(MYDESTDIR) +mf_nonce_brute/%: FORCE + $(info [*] MAKE $@) + $(Q)$(MAKE) --no-print-directory -C tools/mf_nonce_brute $(patsubst mf_nonce_brute/%,%,$@) DESTDIR=$(MYDESTDIR) fpga_compress/%: FORCE $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C tools/fpga_compress $(patsubst fpga_compress/%,%,$@) DESTDIR=$(MYDESTDIR) @@ -103,7 +106,7 @@ recovery/%: FORCE cleanifplatformchanged $(Q)$(MAKE) --no-print-directory -C recovery $(patsubst recovery/%,%,$@) DESTDIR=$(MYDESTDIR) FORCE: # Dummy target to force remake in the subdirectories, even if files exist (this Makefile doesn't know about the prerequisites) -.PHONY: all clean install uninstall help _test bootrom fullimage recovery client mfkey nonce2key style checks FORCE udev accessrights cleanifplatformchanged +.PHONY: all clean install uninstall help _test bootrom fullimage recovery client mfkey nonce2key mf_nonce_brute style checks FORCE udev accessrights cleanifplatformchanged help: @echo "Multi-OS Makefile" @@ -122,6 +125,7 @@ help: @echo "+ client - Make only the OS-specific host client" @echo "+ mfkey - Make tools/mfkey" @echo "+ nonce2key - Make tools/nonce2key" + @echo "+ mf_nonce_brute - Make tools/mf_nonce_brute" @echo "+ fpga_compress - Make tools/fpga_compress" @echo @echo "+ style - Apply some automated source code formatting rules" @@ -152,6 +156,8 @@ mfkey: mfkey/all nonce2key: nonce2key/all +mf_nonce_brute: mf_nonce_brute/all + fpga_compress: fpga_compress/all newtarbin: From 5984e1c03ed0dcf9741c28e6c87c42c2235ede97 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 15 May 2020 17:40:59 +0200 Subject: [PATCH 226/632] makefiles: allow to skip pthread (for termux) --- client/Makefile | 5 ++++- tools/mf_nonce_brute/Makefile | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/client/Makefile b/client/Makefile index 54fa3af2c..ad2f5aa75 100644 --- a/client/Makefile +++ b/client/Makefile @@ -22,7 +22,10 @@ vpath %.dic dictionaries OBJDIR = obj LDLIBS ?= -L/usr/local/lib -LDLIBS += -lreadline -lpthread -lm +LDLIBS += -lreadline -lm +ifneq ($(SKIPPTHREAD),1) +LDLIBS += -lpthread +endif # RPi Zero gcc requires -latomic # but MacOSX /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld diff --git a/tools/mf_nonce_brute/Makefile b/tools/mf_nonce_brute/Makefile index 7672c89a4..cf565e72c 100644 --- a/tools/mf_nonce_brute/Makefile +++ b/tools/mf_nonce_brute/Makefile @@ -3,7 +3,10 @@ MYSRCS = crypto1.c crapto1.c bucketsort.c iso14443crc.c sleep.c MYINCLUDES = -I../../include -I../../common MYCFLAGS = MYDEFS = -MYLDLIBS = -lpthread +MYLDLIBS = +ifneq ($(SKIPPTHREAD),1) +MYLDLIBS += -lpthread +endif BINS = mf_nonce_brute INSTALLTOOLS = $(BINS) From 39258fa5c5d5da7ce4172cc5ee29552164773b80 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 15 May 2020 18:00:06 +0200 Subject: [PATCH 227/632] revert... --- client/src/proxmark3.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index c8d70cb0d..abf014e08 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -241,8 +241,6 @@ check_script: // read script file if (fgets(script_cmd_buf, sizeof(script_cmd_buf), current_cmdscriptfile()) == NULL) { - PrintAndLogEx(ERR, "Unexpected end, [%s]", current_cmdscriptfile()); - if (!pop_cmdscriptfile()) break; From c8e281cb6bb5a327a86e9464930cc6e33de7ee5f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 15 May 2020 18:06:06 +0200 Subject: [PATCH 228/632] fix: ok text for iclass loclass test adjusted --- pm3test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pm3test.sh b/pm3test.sh index f96285e7e..5b91c0bdc 100755 --- a/pm3test.sh +++ b/pm3test.sh @@ -136,7 +136,7 @@ while true; do if ! CheckExecute "hf iclass test" "$PM3BIN -c 'hf iclass loclass t l'" "verified ok"; then break; fi if ! CheckExecute "emv test" "$PM3BIN -c 'emv test -l'" "Test(s) \[ OK"; then break; fi else - if ! CheckExecute "hf iclass test" "$PM3BIN -c 'hf iclass loclass t'" "OK!"; then break; fi + if ! CheckExecute "hf iclass test" "$PM3BIN -c 'hf iclass loclass t'" "key diversification (ok)"; then break; fi if ! CheckExecute "emv test" "$PM3BIN -c 'emv test'" "Test(s) \[ OK"; then break; fi fi From 4edea34b6b72a1d27289d7b5325077e0a560799c Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 16 May 2020 14:24:21 +0200 Subject: [PATCH 229/632] pm3 script for linux: alternative if udevadm is not available (termux) --- pm3 | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/pm3 b/pm3 index 4af441c40..82e794d42 100755 --- a/pm3 +++ b/pm3 @@ -31,10 +31,19 @@ function get_pm3_list_Linux { N=$1 PM3LIST=() for DEV in $(find /dev/ttyACM* 2>/dev/null); do - if udevadm info -q property -n "$DEV" | grep -q "ID_VENDOR=proxmark.org"; then - PM3LIST+=("$DEV") - if [ ${#PM3LIST[*]} -ge $N ]; then - return + if which udevadm >/dev/null; then + if udevadm info -q property -n "$DEV" | grep -q "ID_VENDOR=proxmark.org"; then + PM3LIST+=("$DEV") + if [ ${#PM3LIST[*]} -ge $N ]; then + return + fi + fi + else + if grep -q "PRODUCT=9ac4/4b8f" "/sys/class/tty/${DEV#/dev/}/../../uevent" 2>/dev/null; then + PM3LIST+=("$DEV") + if [ ${#PM3LIST[*]} -ge $N ]; then + return + fi fi fi done From eb7957d9942a0bac191c1092b89c7a422de2d919 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 16 May 2020 14:50:43 +0200 Subject: [PATCH 230/632] Add mf_nonce_brute in pm3test --- pm3test.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pm3test.sh b/pm3test.sh index 5b91c0bdc..b65f94a15 100755 --- a/pm3test.sh +++ b/pm3test.sh @@ -151,6 +151,9 @@ while true; do if ! CheckExecute "findbits test" "tools/findbits.py 73 0110010101110011" "Match at bit 9: 011001010"; then break; fi if ! CheckExecute "findbits_test test" "tools/findbits_test.py 2>&1" "OK"; then break; fi if ! CheckExecute "pm3_eml_mfd test" "tools/pm3_eml_mfd_test.py 2>&1" "OK"; then break; fi + if $SLOWTESTS; then + if ! CheckExecute "mf_nonce_brute test" "tools/mf_nonce_brute/mf_nonce_brute 9c599b32 5a920d85 1011 98d76b77 d6c6e870 0000 ca7e0b63 0111 3e709c8a" "Key.*: \[ffffffffffff\]"; then break; fi + fi fi printf "\n${C_GREEN}Tests [OK]${C_NC}\n\n" From bca9326684b29d9c8b3a37398c48c30305c8efce Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 16 May 2020 14:55:33 +0200 Subject: [PATCH 231/632] Document SKIPPTHREAD --- doc/md/Development/Maintainers.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/md/Development/Maintainers.md b/doc/md/Development/Maintainers.md index 705d97707..85fcf8963 100644 --- a/doc/md/Development/Maintainers.md +++ b/doc/md/Development/Maintainers.md @@ -65,6 +65,10 @@ If you're cross-compiling, these ones might be useful: * `make client SKIPREVENGTEST=1` to skip compilation and execution of a consistency test for reveng, which can be problematic in case of cross-compilation * `make client cpu_arch=generic` to skip Intel specialized hardnested components, which is required e.g. if cross-compilation host is Intel but not the target +On some architectures, pthread library is not present: + +* `make client SKIPPTHREAD=1` to skip `-lpthread` at linker stage. + `make install` is actually triggering the following individual targets which can be accessed individually: * `make client/install` From bc767f167f179c396c772a83392245423b8ffac6 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 16 May 2020 15:58:24 +0200 Subject: [PATCH 232/632] pm3 without udev: change detection routine --- pm3 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pm3 b/pm3 index 82e794d42..ddcaa14ee 100755 --- a/pm3 +++ b/pm3 @@ -39,7 +39,7 @@ function get_pm3_list_Linux { fi fi else - if grep -q "PRODUCT=9ac4/4b8f" "/sys/class/tty/${DEV#/dev/}/../../uevent" 2>/dev/null; then + if grep -q "proxmark.org" "/sys/class/tty/${DEV#/dev/}/../../../manufacturer" 2>/dev/null; then PM3LIST+=("$DEV") if [ ${#PM3LIST[*]} -ge $N ]; then return From be1659b1bf99da52e56d2bdf6f26e3b4c0094012 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 17 May 2020 12:06:39 +0200 Subject: [PATCH 233/632] pm3: textual and --list with no device, exit 1 --- pm3 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pm3 b/pm3 index ddcaa14ee..c9c616352 100755 --- a/pm3 +++ b/pm3 @@ -338,7 +338,7 @@ done if [ "$1" == "--list" ]; then shift if [ "$1" != "" ]; then - echo "Option --list must be used alone" + echo "[!!] Option --list must be used alone" exit 1 fi SHOWLIST=true @@ -352,7 +352,7 @@ if [ "$1" == "-n" ]; then N=$1 shift else - echo "Option -n requires a number between 1 and 9, got \"$1\"" + echo "[!!] Option -n requires a number between 1 and 9, got \"$1\"" exit 1 fi fi @@ -363,7 +363,7 @@ if [ "$HOSTOS" = "LINUX" ]; then # Test presence of wmic wmic.exe computersystem get name >/dev/null 2>&1 if [ $? -ne 0 ]; then - echo "[!] Cannot run wmic.exe, are you sure your WSL is authorized to run Windows processes? (cf WSL interop flag)" + echo "[!!] Cannot run wmic.exe, are you sure your WSL is authorized to run Windows processes? (cf WSL interop flag)" exit 1 fi GETPM3LIST=get_pm3_list_WSL @@ -384,7 +384,7 @@ if $SHOWLIST; then $GETPM3LIST 9 if [ ${#PM3LIST} -lt 1 ]; then echo "[!!] No port found" - exit 0 + exit 1 fi n=1 for DEV in ${PM3LIST[@]} From e3180be45c1a4e5d3426c3fce1d2086cc2364021 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 17 May 2020 12:12:13 +0200 Subject: [PATCH 234/632] pm3: err msgs on stderr --- pm3 | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pm3 b/pm3 index c9c616352..5509d1087 100755 --- a/pm3 +++ b/pm3 @@ -148,7 +148,7 @@ function get_pm3_list_WSL { if [ -e "$DEV" ]; then PM3LIST+=("$DEV") if [ ! -w "$DEV" ]; then - echo "[!!] Let's give users read/write access to $DEV" + echo "[!] Let's give users read/write access to $DEV" sudo chmod 666 "$DEV" fi if [ ${#PM3LIST[*]} -ge $N ]; then @@ -167,7 +167,7 @@ function get_pm3_list_WSL { if [ -e "$DEV" ]; then PM3LIST+=("$DEV") if [ ! -w "$DEV" ]; then - echo "[!!] Let's give users read/write access to $DEV" + echo "[!] Let's give users read/write access to $DEV" sudo chmod 666 "$DEV" fi if [ ${#PM3LIST[*]} -ge $N ]; then @@ -185,7 +185,7 @@ function get_pm3_list_WSL { if [ -e "$DEV" ]; then PM3LIST+=("$DEV") if [ ! -w "$DEV" ]; then - echo "[!!] Let's give users read/write access to $DEV" + echo "[!] Let's give users read/write access to $DEV" sudo chmod 666 "$DEV" fi if [ ${#PM3LIST[*]} -ge $N ]; then @@ -319,7 +319,7 @@ Usage: EOF } else - echo "[!!] Script ran under unknown name, abort: $SCRIPT" + echo >&2 "[!!] Script ran under unknown name, abort: $SCRIPT" exit 1 fi if [ "$1" == "-h" ] || [ "$1" == "--help" ]; then @@ -338,7 +338,7 @@ done if [ "$1" == "--list" ]; then shift if [ "$1" != "" ]; then - echo "[!!] Option --list must be used alone" + echo >&2 "[!!] Option --list must be used alone" exit 1 fi SHOWLIST=true @@ -352,7 +352,7 @@ if [ "$1" == "-n" ]; then N=$1 shift else - echo "[!!] Option -n requires a number between 1 and 9, got \"$1\"" + echo >&2 "[!!] Option -n requires a number between 1 and 9, got \"$1\"" exit 1 fi fi @@ -363,7 +363,7 @@ if [ "$HOSTOS" = "LINUX" ]; then # Test presence of wmic wmic.exe computersystem get name >/dev/null 2>&1 if [ $? -ne 0 ]; then - echo "[!!] Cannot run wmic.exe, are you sure your WSL is authorized to run Windows processes? (cf WSL interop flag)" + echo >&2 "[!!] Cannot run wmic.exe, are you sure your WSL is authorized to run Windows processes? (cf WSL interop flag)" exit 1 fi GETPM3LIST=get_pm3_list_WSL @@ -375,7 +375,7 @@ elif [ "$HOSTOS" = "DARWIN" ]; then elif [[ "$HOSTOS" =~ MINGW(32|64)_NT* ]]; then GETPM3LIST=get_pm3_list_Windows else - echo "[!!] Host OS not recognized, abort: $HOSTOS" + echo >&2 "[!!] Host OS not recognized, abort: $HOSTOS" exit 1 fi @@ -383,7 +383,7 @@ if $SHOWLIST; then # Probe for up to 9 devs $GETPM3LIST 9 if [ ${#PM3LIST} -lt 1 ]; then - echo "[!!] No port found" + echo >&2 "[!!] No port found" exit 1 fi n=1 @@ -409,7 +409,7 @@ while true; do done if [ ${#PM3LIST} -lt $N ]; then - echo "[!!] No port found, abort" + echo >&2 "[!!] No port found, abort" exit 1 fi From 227c4e89bd6581bc08cb7cf3d823e3a60af9d385 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 17 May 2020 12:23:03 +0200 Subject: [PATCH 235/632] pm3: shellcheck --- pm3 | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/pm3 b/pm3 index 5509d1087..19399f0bd 100755 --- a/pm3 +++ b/pm3 @@ -34,14 +34,14 @@ function get_pm3_list_Linux { if which udevadm >/dev/null; then if udevadm info -q property -n "$DEV" | grep -q "ID_VENDOR=proxmark.org"; then PM3LIST+=("$DEV") - if [ ${#PM3LIST[*]} -ge $N ]; then + if [ ${#PM3LIST[*]} -ge "$N" ]; then return fi fi else if grep -q "proxmark.org" "/sys/class/tty/${DEV#/dev/}/../../../manufacturer" 2>/dev/null; then PM3LIST+=("$DEV") - if [ ${#PM3LIST[*]} -ge $N ]; then + if [ ${#PM3LIST[*]} -ge "$N" ]; then return fi fi @@ -52,7 +52,7 @@ function get_pm3_list_Linux { for DEV in $(find /dev/ttyUSB* 2>/dev/null); do if udevadm info -q property -n "$DEV" | grep -q "ID_MODEL=CP2104_USB_to_UART_Bridge_Controller"; then PM3LIST+=("$DEV") - if [ ${#PM3LIST[*]} -ge $N ]; then + if [ ${#PM3LIST[*]} -ge "$N" ]; then return fi fi @@ -67,7 +67,7 @@ function get_pm3_list_Linux { # check which are Proxmark3 and, side-effect, if they're actually present if hcitool name "$MAC" | grep -q "PM3"; then PM3LIST+=("/dev/$DEV") - if [ ${#PM3LIST[*]} -ge $N ]; then + if [ ${#PM3LIST[*]} -ge "$N" ]; then return fi fi @@ -75,7 +75,6 @@ function get_pm3_list_Linux { fi if $FINDBTDIRECT; then # check if the MAC of a Proxmark3 was registered in the known devices - MACS=() for MAC in $(dbus-send --system --print-reply --type=method_call --dest='org.bluez' '/' org.freedesktop.DBus.ObjectManager.GetManagedObjects 2>/dev/null|\ awk '/"Address"/{getline;gsub(/"/,"",$3);a=$3}/Name/{getline;if (/PM3_RDV4/) print a}'); do PM3LIST+=("bt:$MAC") @@ -91,7 +90,7 @@ function get_pm3_list_macOS { $2=="USB Vendor Name"{b=($4=="proxmark.org")} b==1 && $2=="IODialinDevice"{print $4}'); do PM3LIST+=("$DEV") - if [ ${#PM3LIST[*]} -ge $N ]; then + if [ ${#PM3LIST[*]} -ge "$N" ]; then return fi done @@ -106,7 +105,7 @@ function get_pm3_list_Windows { for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_PnPEntity | Where-Object Caption -like 'Standard Serial over Bluetooth link (COM*' | Select Name" 2> /dev/null | awk '$0 ~ /COM/{print substr($6,2,4)}'); do DEV=${DEV/ */} PM3LIST+=("$DEV") - if [ ${#PM3LIST[*]} -ge $N ]; then + if [ ${#PM3LIST[*]} -ge "$N" ]; then return fi done @@ -116,7 +115,7 @@ function get_pm3_list_Windows { for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_serialport | Where-Object PNPDeviceID -like '*VID_9AC4&PID_4B8F*' | Select DeviceID" 2>/dev/null | awk '/^COM/{print $1}'); do DEV=${DEV/ */} PM3LIST+=("$DEV") - if [ ${#PM3LIST[*]} -ge $N ]; then + if [ ${#PM3LIST[*]} -ge "$N" ]; then return fi done @@ -126,7 +125,7 @@ function get_pm3_list_Windows { for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_serialport | Where-Object PNPDeviceID -like '*VID_10C4&PID_EA60*' | Select DeviceID" 2>/dev/null | awk '/^COM/{print $1}'); do DEV=${DEV/ */} PM3LIST+=("$DEV") - if [ ${#PM3LIST[*]} -ge $N ]; then + if [ ${#PM3LIST[*]} -ge "$N" ]; then return fi done @@ -151,7 +150,7 @@ function get_pm3_list_WSL { echo "[!] Let's give users read/write access to $DEV" sudo chmod 666 "$DEV" fi - if [ ${#PM3LIST[*]} -ge $N ]; then + if [ ${#PM3LIST[*]} -ge "$N" ]; then return fi fi @@ -170,7 +169,7 @@ function get_pm3_list_WSL { echo "[!] Let's give users read/write access to $DEV" sudo chmod 666 "$DEV" fi - if [ ${#PM3LIST[*]} -ge $N ]; then + if [ ${#PM3LIST[*]} -ge "$N" ]; then return fi fi @@ -188,7 +187,7 @@ function get_pm3_list_WSL { echo "[!] Let's give users read/write access to $DEV" sudo chmod 666 "$DEV" fi - if [ ${#PM3LIST[*]} -ge $N ]; then + if [ ${#PM3LIST[*]} -ge "$N" ]; then return fi fi @@ -235,7 +234,7 @@ elif [ "$SCRIPT" = "pm3-flash" ]; then fi shift; done - $CLIENT ${ARGS[@]}; + $CLIENT "${ARGS[@]}"; } HELP() { cat << EOF @@ -361,8 +360,7 @@ HOSTOS=$(uname | awk '{print toupper($0)}') if [ "$HOSTOS" = "LINUX" ]; then if uname -a|grep -q Microsoft; then # Test presence of wmic - wmic.exe computersystem get name >/dev/null 2>&1 - if [ $? -ne 0 ]; then + if ! wmic.exe computersystem get name >/dev/null 2>&1; then echo >&2 "[!!] Cannot run wmic.exe, are you sure your WSL is authorized to run Windows processes? (cf WSL interop flag)" exit 1 fi @@ -387,7 +385,7 @@ if $SHOWLIST; then exit 1 fi n=1 - for DEV in ${PM3LIST[@]} + for DEV in "${PM3LIST[@]}" do echo "$n: $DEV" n=$((n+1)) @@ -396,19 +394,19 @@ if $SHOWLIST; then fi # Wait till we get at least N proxmark3 devices -$GETPM3LIST $N -if [ ${#PM3LIST} -lt $N ]; then +$GETPM3LIST "$N" +if [ ${#PM3LIST} -lt "$N" ]; then echo >&2 "[=] Waiting for Proxmark3 to appear..." fi while true; do - if [ ${#PM3LIST[*]} -ge $N ]; then + if [ ${#PM3LIST[*]} -ge "$N" ]; then break fi sleep .1 - $GETPM3LIST $N + $GETPM3LIST "$N" done -if [ ${#PM3LIST} -lt $N ]; then +if [ ${#PM3LIST} -lt "$N" ]; then echo >&2 "[!!] No port found, abort" exit 1 fi From 35ec13e7af77d09552913a3b4d2a74f44af74f5e Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 17 May 2020 12:35:12 +0200 Subject: [PATCH 236/632] pm3tests shellcheck --- pm3test.sh | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/pm3test.sh b/pm3test.sh index b65f94a15..bf58b028c 100755 --- a/pm3test.sh +++ b/pm3test.sh @@ -32,7 +32,7 @@ function CheckFileExist() { return 0 fi - if ls $2 1> /dev/null 2>&1; then + if ls "$2" 1> /dev/null 2>&1; then echo -e "$1 ${C_GREEN}[OK]${C_NC}" return 0 fi @@ -44,7 +44,7 @@ function CheckFileExist() { # title, command line, check result, repeat several times if failed, ignore if fail function CheckExecute() { - if [ $4 ]; then + if [ "$4" ]; then local RETRY="1 2 3 e" else local RETRY="e" @@ -61,7 +61,7 @@ function CheckExecute() { done - if [ $5 ]; then + if [ "$5" ]; then echo -e "$1 ${C_YELLOW}[Ignored]${C_NC}" return 0 fi @@ -71,11 +71,11 @@ function CheckExecute() { return 1 } -printf "\n${C_BLUE}RRG/Iceman Proxmark3 test tool ${C_NC}\n\n" +echo -e "\n${C_BLUE}RRG/Iceman Proxmark3 test tool ${C_NC}\n" -printf "work directory: " +echo -n "work directory: " pwd -printf "client ${PM3BIN:="./client/proxmark3"}\n" +echo "client ${PM3BIN:="./client/proxmark3"}" if [ "$TRAVIS_COMMIT" ]; then if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then @@ -85,16 +85,16 @@ if [ "$TRAVIS_COMMIT" ]; then fi fi -printf "git branch: " +echo -n "git branch: " git describe --all -printf "git sha: " +echo -n "git sha: " git rev-parse HEAD echo "" while true; do - printf "\n${C_BLUE}Testing files:${C_NC}\n" + echo -e "\n${C_BLUE}Testing files:${C_NC}" if ! CheckFileExist "proxmark3 exists" "$PM3BIN"; then break; fi - if ! CheckFileExist "hardnested tables exists" "./client/resources/hardnested_tables/*.z"; then break; fi + if ! CheckFileExist "hardnested tables exists" "./client/resources/hardnested_tables/bitflip_0_001_states.bin.z"; then break; fi if ! CheckFileExist "simmodule fw file exists" "./tools/simmodule/sim011.bin"; then break; fi if $TESTDEVICE; then @@ -102,19 +102,19 @@ while true; do if ! CheckFileExist "bootrom exists" "./bootrom/obj/bootrom.elf"; then break; fi fi - printf "\n${C_BLUE}Testing basic help:${C_NC}\n" + echo -e "\n${C_BLUE}Testing basic help:${C_NC}" if ! CheckExecute "proxmark help" "$PM3BIN -h" "wait"; then break; fi if ! CheckExecute "proxmark help text ISO7816" "$PM3BIN -t 2>&1" "ISO7816"; then break; fi if ! CheckExecute "proxmark help text hardnested" "$PM3BIN -t 2>&1" "hardnested"; then break; fi - printf "\n${C_BLUE}Testing data manipulation:${C_NC}\n" + echo -e "\n${C_BLUE}Testing data manipulation:${C_NC}" if ! CheckExecute "reveng readline test" "$PM3BIN -c 'reveng -h;reveng -D'" "CRC-64/GO-ISO"; then break; fi if ! CheckExecute "reveng -g test" "$PM3BIN -c 'reveng -g abda202c'" "CRC-16/ISO-IEC-14443-3-A"; then break; fi if ! CheckExecute "reveng -w test" "$PM3BIN -c 'reveng -w 8 -s 01020304e3 010204039d'" "CRC-8/SMBUS"; then break; fi if ! CheckExecute "mfu pwdgen test" "$PM3BIN -c 'hf mfu pwdgen t'" "Selftest OK"; then break; fi if ! CheckExecute "trace load/list test" "$PM3BIN -c 'trace load traces/hf_mfu.trace; trace list 1;'" "READBLOCK(8)"; then break; fi - printf "\n${C_BLUE}Testing LF:${C_NC}\n" + echo -e "\n${C_BLUE}Testing LF:${C_NC}" if ! CheckExecute "lf EM4x05 test" "$PM3BIN -c 'data load traces/em4x05.pm3;lf search 1'" "FDX-B ID found"; then break; fi if ! CheckExecute "lf EM410x test" "$PM3BIN -c 'data load traces/EM4102-1.pm3;lf search 1'" "EM410x ID found"; then break; fi if ! CheckExecute "lf VISA2000 test" "$PM3BIN -c 'data load traces/visa2000.pm3;lf search 1'" "Visa2000 ID found"; then break; fi @@ -129,7 +129,7 @@ while true; do if ! CheckExecute "lf FDX-B test" "$PM3BIN -c 'data load traces/homeagain1600.pm3;lf search 1'" "FDX-B ID found"; then break; fi if ! CheckExecute "lf INDALA test" "$PM3BIN -c 'data load traces/indala-504278295.pm3;lf search 1'" "Indala ID found"; then break; fi - printf "\n${C_BLUE}Testing HF:${C_NC}\n" + echo -e "\n${C_BLUE}Testing HF:${C_NC}" if ! CheckExecute "hf mf offline text" "$PM3BIN -c 'hf mf'" "at_enc"; then break; fi if $SLOWTESTS; then if ! CheckExecute "hf mf hardnested test" "$PM3BIN -c 'hf mf hardnested t 1 000000000000'" "found:" "repeat" "ignore"; then break; fi @@ -141,7 +141,7 @@ while true; do fi if $TESTTOOLS; then - printf "\n${C_BLUE}Testing tools:${C_NC}\n" + echo -e "\n${C_BLUE}Testing tools:${C_NC}" # Need a decent example for mfkey32... if ! CheckExecute "mfkey32v2 test" "tools/mfkey/mfkey32v2 12345678 1AD8DF2B 1D316024 620EF048 30D6CB07 C52077E2 837AC61A" "Found Key: \[a0a1a2a3a4a5\]"; then break; fi if ! CheckExecute "mfkey64 test" "tools/mfkey/mfkey64 9c599b32 82a4166c a1e458ce 6eea41e0 5cadf439" "Found Key: \[ffffffffffff\]"; then break; fi @@ -156,9 +156,9 @@ while true; do fi fi - printf "\n${C_GREEN}Tests [OK]${C_NC}\n\n" + echo -e "\n${C_GREEN}Tests [OK]${C_NC}\n" exit 0 done -printf "\n${C_RED}Tests [FAIL]${C_NC}\n\n" +echo -e "\n${C_RED}Tests [FAIL]${C_NC}\n" exit 1 From 2ed5f1f6149b5ec79e3dc3d0b5586e4d6225fc2d Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 17 May 2020 14:18:52 +0200 Subject: [PATCH 237/632] iclass bf: avoid slowdown --- client/src/loclass/ikeys.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/src/loclass/ikeys.c b/client/src/loclass/ikeys.c index d828583d7..f50d276dc 100644 --- a/client/src/loclass/ikeys.c +++ b/client/src/loclass/ikeys.c @@ -224,6 +224,8 @@ static void permute(BitstreamIn *p_in, uint64_t z, int l, int r, BitstreamOut *o } static void printState(const char *desc, uint64_t c) { + if (g_debugMode == 0) + return; char s[60] = {0}; snprintf(s, sizeof(s), "%s : ", desc); From 11f02967bcae43f27912e1266e1c82db399268ea Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 18 May 2020 01:05:49 +0200 Subject: [PATCH 238/632] pm3: test access to /dev/ttyXXX files as prerequisite for linux --- pm3 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pm3 b/pm3 index 19399f0bd..7d2c5e5f7 100755 --- a/pm3 +++ b/pm3 @@ -30,6 +30,10 @@ SHOWLIST=false function get_pm3_list_Linux { N=$1 PM3LIST=() + if [ ! -c "/dev/tty0" ]; then + echo >&2 "[!!] Script cannot access /dev/ttyXXX files, insufficient privileges" + exit 1 + fi for DEV in $(find /dev/ttyACM* 2>/dev/null); do if which udevadm >/dev/null; then if udevadm info -q property -n "$DEV" | grep -q "ID_VENDOR=proxmark.org"; then From 6d1beb07c186ebdd14dea5ce8a133543527c8978 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 18 May 2020 01:16:29 +0200 Subject: [PATCH 239/632] pm3: attempt to detect BT dongle when udevadm is not available --- pm3 | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/pm3 b/pm3 index 7d2c5e5f7..31ed0695b 100755 --- a/pm3 +++ b/pm3 @@ -54,10 +54,19 @@ function get_pm3_list_Linux { if $FINDBTDONGLE; then # check if the HC-06-USB white dongle is present (still, that doesn't tell us if it's paired with a Proxmark3...) for DEV in $(find /dev/ttyUSB* 2>/dev/null); do - if udevadm info -q property -n "$DEV" | grep -q "ID_MODEL=CP2104_USB_to_UART_Bridge_Controller"; then - PM3LIST+=("$DEV") - if [ ${#PM3LIST[*]} -ge "$N" ]; then - return + if which udevadm >/dev/null; then + if udevadm info -q property -n "$DEV" | grep -q "ID_MODEL=CP2104_USB_to_UART_Bridge_Controller"; then + PM3LIST+=("$DEV") + if [ ${#PM3LIST[*]} -ge "$N" ]; then + return + fi + fi + else + if grep -q "DRIVER=cp210x" "/sys/class/tty/${DEV#/dev/}/../../uevent" 2>/dev/null; then + PM3LIST+=("$DEV") + if [ ${#PM3LIST[*]} -ge "$N" ]; then + return + fi fi fi done From 837d644b6cd16253dda76e6fb64dbb5a0235823d Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 18 May 2020 23:49:45 +0200 Subject: [PATCH 240/632] chg: first attempt for trace log header --- client/src/cmdtrace.c | 59 +++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 30 deletions(-) diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index 6cbfc2e7a..187ba5a01 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -25,6 +25,16 @@ static int CmdHelp(const char *Cmd); static uint8_t *g_trace; long g_traceLen = 0; +typedef struct { + uint32_t timestamp; + uint16_t duration; + uint16_t data_len; + uint8_t frame[]; +} tracelog_hdr_t; + +// 4 + 2 + 2 +#define TRACELOG_HDR_LEN sizeof(tracelog_hdr_t) + static int usage_trace_list(void) { PrintAndLogEx(NORMAL, "List protocol data in trace buffer."); PrintAndLogEx(NORMAL, "Usage: trace list [f][c| <0|1>"); @@ -120,39 +130,29 @@ static bool merge_topaz_reader_frames(uint32_t timestamp, uint32_t *duration, ui static uint16_t printHexLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trace, uint8_t protocol) { // sanity check - if (tracepos + sizeof(uint32_t) + sizeof(uint16_t) + sizeof(uint16_t) > traceLen) return traceLen; + if (tracepos + TRACELOG_HDR_LEN > traceLen) return traceLen; + + tracelog_hdr_t *hdr = (tracelog_hdr_t *)(trace + tracepos); bool isResponse; - uint16_t data_len, parity_len; - uint32_t timestamp; - - timestamp = *((uint32_t *)(trace + tracepos)); - tracepos += 4; - - - // currently we don't use duration, so we skip it - tracepos += 2; - - data_len = *((uint16_t *)(trace + tracepos)); - tracepos += 2; - - if (data_len & 0x8000) { - data_len &= 0x7fff; + uint16_t parity_len; + + if (hdr->data_len & 0x8000) { + hdr->data_len &= 0x7fff; isResponse = true; } else { isResponse = false; } - parity_len = (data_len - 1) / 8 + 1; + parity_len = (hdr->data_len - 1) / 8 + 1; - if (tracepos + data_len + parity_len > traceLen) { + if (sizeof(tracelog_hdr_t) + hdr->data_len + parity_len > traceLen) { return traceLen; } - uint8_t *frame = trace + tracepos; - tracepos += data_len; - //currently we don't use parity bytes, so we skip it - tracepos += parity_len; - if (data_len == 0) { + //set trace position + tracepos += sizeof(tracelog_hdr_t) + hdr->data_len + parity_len; + + if (hdr->data_len == 0) { PrintAndLogEx(NORMAL, ""); return tracepos; } @@ -167,25 +167,24 @@ static uint16_t printHexLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trac * we use format timestamp, newline, offset (0x000000), pseudo header, data * `text2pcap -t "%S." -l 264 -n ` */ - char line[(data_len * 3) + 1]; + char line[(hdr->data_len * 3) + 1]; char *ptr = &line[0]; - for (int j = 0; j < data_len ; j++) { - ptr += sprintf(ptr, "%02x", frame[j]); - ptr += sprintf(ptr, " "); + for (int i = 0; i < hdr->data_len ; i++) { + ptr += sprintf(ptr, "%02x ", hdr->frame[i]); } char data_len_str[5]; char temp_str1[3] = {0}; char temp_str2[3] = {0}; - - sprintf(data_len_str, "%04x", data_len); + + sprintf(data_len_str, "%04x", hdr->data_len); strncat(temp_str1, data_len_str, 2); temp_str1[2] = '\0'; strncat(temp_str2, data_len_str + 2, 2); temp_str2[2] = '\0'; - PrintAndLogEx(NORMAL, "0.%010u", timestamp); + PrintAndLogEx(NORMAL, "0.%010u", hdr->timestamp); PrintAndLogEx(NORMAL, "000000 00 %s %s %s %s", (isResponse ? "ff" : "fe"), temp_str1, From 97c96385187bebd656bf828984d6b09950c0c965 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 19 May 2020 00:25:40 +0200 Subject: [PATCH 241/632] next attempt for tracelog. simplify --- client/src/cmdtrace.c | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index 187ba5a01..6ef3974e2 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -33,7 +33,8 @@ typedef struct { } tracelog_hdr_t; // 4 + 2 + 2 -#define TRACELOG_HDR_LEN sizeof(tracelog_hdr_t) +#define TRACELOG_HDR_LEN sizeof(tracelog_hdr_t) +#define TRACELOG_NEXT_PARITY_LEN(x) (((x)hdr->data_len - 1) / 8 + 1) static int usage_trace_list(void) { PrintAndLogEx(NORMAL, "List protocol data in trace buffer."); @@ -81,13 +82,13 @@ static int usage_trace_save(void) { return PM3_SUCCESS; } -static bool is_last_record(uint16_t tracepos, uint8_t *trace, uint16_t traceLen) { - return (tracepos + sizeof(uint32_t) + sizeof(uint16_t) + sizeof(uint16_t) >= traceLen); +static bool is_last_record(uint16_t tracepos, uint16_t traceLen) { + return ((tracepos + TRACELOG_HDR_LEN) >= traceLen); } static bool next_record_is_response(uint16_t tracepos, uint8_t *trace) { - uint16_t next_records_datalen = *((uint16_t *)(trace + tracepos + sizeof(uint32_t) + sizeof(uint16_t))); - return ((next_records_datalen & 0x8000) == 0x8000); + tracelog_hdr_t *hdr = (tracelog_hdr_t *)(trace + tracepos); + return ((hdr->data_len & 0x8000) == 0x8000); } static bool merge_topaz_reader_frames(uint32_t timestamp, uint32_t *duration, uint16_t *tracepos, uint16_t traceLen, @@ -101,22 +102,24 @@ static bool merge_topaz_reader_frames(uint32_t timestamp, uint32_t *duration, ui memcpy(topaz_reader_command, frame, *data_len); - while (!is_last_record(*tracepos, trace, traceLen) && !next_record_is_response(*tracepos, trace)) { - uint32_t next_timestamp = *((uint32_t *)(trace + *tracepos)); - *tracepos += sizeof(uint32_t); - uint16_t next_duration = *((uint16_t *)(trace + *tracepos)); - *tracepos += sizeof(uint16_t); - uint16_t next_data_len = *((uint16_t *)(trace + *tracepos)) & 0x7FFF; - *tracepos += sizeof(uint16_t); - uint8_t *next_frame = (trace + *tracepos); - *tracepos += next_data_len; + while (!is_last_record(*tracepos, traceLen) && !next_record_is_response(*tracepos, trace)) { + + tracelog_hdr_t *hdr = (tracelog_hdr_t *)(trace + *tracepos); + + uint32_t next_timestamp = hdr->timestamp; + uint16_t next_duration = hdr->duration; + uint16_t next_data_len = hdr->data_len & 0x7FFF; + uint8_t *next_frame = hdr->frame; + + *tracepos += TRACELOG_HDR_LEN + next_data_len; + if ((next_data_len == 1) && (*data_len + next_data_len <= MAX_TOPAZ_READER_CMD_LEN)) { memcpy(topaz_reader_command + *data_len, next_frame, next_data_len); *data_len += next_data_len; last_timestamp = next_timestamp + next_duration; } else { // rewind and exit - *tracepos = *tracepos - next_data_len - sizeof(uint16_t) - sizeof(uint16_t) - sizeof(uint32_t); + *tracepos = *tracepos - next_data_len - TRACELOG_HDR_LEN; break; } uint16_t next_parity_len = (next_data_len - 1) / 8 + 1; @@ -130,19 +133,20 @@ static bool merge_topaz_reader_frames(uint32_t timestamp, uint32_t *duration, ui static uint16_t printHexLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trace, uint8_t protocol) { // sanity check - if (tracepos + TRACELOG_HDR_LEN > traceLen) return traceLen; + if (is_last_record(tracepos, traceLen)) return traceLen; tracelog_hdr_t *hdr = (tracelog_hdr_t *)(trace + tracepos); bool isResponse; uint16_t parity_len; - if (hdr->data_len & 0x8000) { + if ((hdr->data_len & 0x8000) == 0x8000) { hdr->data_len &= 0x7fff; isResponse = true; } else { isResponse = false; } + parity_len = (hdr->data_len - 1) / 8 + 1; if (sizeof(tracelog_hdr_t) + hdr->data_len + parity_len > traceLen) { @@ -435,7 +439,7 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr explanation); } - if (is_last_record(tracepos, trace, traceLen)) return traceLen; + if (is_last_record(tracepos, traceLen)) return traceLen; if (showWaitCycles && !isResponse && next_record_is_response(tracepos, trace)) { uint32_t next_timestamp = *((uint32_t *)(trace + tracepos)); From d72d8044870599dfe9d1a08b79c1b3b41a7946cd Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 19 May 2020 00:36:30 +0200 Subject: [PATCH 242/632] third part fixing cmdtracelog --- client/src/cmdtrace.c | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index 6ef3974e2..4b923f0a0 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -149,12 +149,12 @@ static uint16_t printHexLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trac parity_len = (hdr->data_len - 1) / 8 + 1; - if (sizeof(tracelog_hdr_t) + hdr->data_len + parity_len > traceLen) { + if (TRACELOG_HDR_LEN + hdr->data_len + parity_len > traceLen) { return traceLen; } //set trace position - tracepos += sizeof(tracelog_hdr_t) + hdr->data_len + parity_len; + tracepos += TRACELOG_HDR_LEN + hdr->data_len + parity_len; if (hdr->data_len == 0) { PrintAndLogEx(NORMAL, ""); @@ -208,7 +208,7 @@ static uint16_t printHexLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trac static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trace, uint8_t protocol, bool showWaitCycles, bool markCRCBytes) { // sanity check - if (tracepos + sizeof(uint32_t) + sizeof(uint16_t) + sizeof(uint16_t) > traceLen) return traceLen; + if (is_last_record(tracepos, traceLen)) return traceLen; bool isResponse; uint16_t data_len, parity_len; @@ -218,16 +218,14 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr uint8_t mfData[32] = {0}; size_t mfDataLen = 0; + tracelog_hdr_t *first_hdr = (tracelog_hdr_t *)(trace); + tracelog_hdr_t *hdr = (tracelog_hdr_t *)(trace + tracepos); - first_timestamp = *((uint32_t *)(trace)); - timestamp = *((uint32_t *)(trace + tracepos)); - tracepos += 4; - - duration = *((uint16_t *)(trace + tracepos)); - tracepos += 2; - - data_len = *((uint16_t *)(trace + tracepos)); - tracepos += 2; + first_timestamp = first_hdr->timestamp; + + timestamp = hdr->timestamp; + duration = hdr->duration; + data_len = hdr->data_len; if (data_len & 0x8000) { data_len &= 0x7fff; @@ -237,13 +235,14 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr } parity_len = (data_len - 1) / 8 + 1; - if (tracepos + data_len + parity_len > traceLen) { + if (tracepos + TRACELOG_HDR_LEN + data_len + parity_len > traceLen) { return traceLen; } - uint8_t *frame = trace + tracepos; - tracepos += data_len; - uint8_t *parityBytes = trace + tracepos; - tracepos += parity_len; + + uint8_t *frame = hdr->frame; + uint8_t *parityBytes = hdr->frame + data_len; + + tracepos += TRACELOG_HDR_LEN + data_len + parity_len; if (protocol == TOPAZ && !isResponse) { // topaz reader commands come in 1 or 9 separate frames with 7 or 8 Bits each. From 00bde060c1b67e4067ff1602f116a4afc49dd78d Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 19 May 2020 00:40:22 +0200 Subject: [PATCH 243/632] fourth, making struct packed --- client/src/cmdtrace.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index 4b923f0a0..1cf8c054e 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -30,7 +30,7 @@ typedef struct { uint16_t duration; uint16_t data_len; uint8_t frame[]; -} tracelog_hdr_t; +} PACKED tracelog_hdr_t; // 4 + 2 + 2 #define TRACELOG_HDR_LEN sizeof(tracelog_hdr_t) @@ -441,6 +441,7 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr if (is_last_record(tracepos, traceLen)) return traceLen; if (showWaitCycles && !isResponse && next_record_is_response(tracepos, trace)) { + uint32_t next_timestamp = *((uint32_t *)(trace + tracepos)); PrintAndLogEx(NORMAL, " %10u | %10u | %s |fdt (Frame Delay Time): %d", (EndOfTransmissionTimestamp - first_timestamp), From e46639ee60710eef79479165c319976e6a9bafb3 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 19 May 2020 00:46:10 +0200 Subject: [PATCH 244/632] fifth adjustment to tracelog --- client/src/cmdtrace.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index 1cf8c054e..5cb61fdf0 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -297,9 +297,14 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr //1 CRC-command, CRC ok //2 Not crc-command - //--- Draw the data column + //--- Draw the data column char line[18][120] = {{0}}; + if (data_len == 0) { + sprintf(line[0], ""); + return tracepos; + } + for (int j = 0; j < data_len && j / 18 < 18; j++) { uint8_t parityBits = parityBytes[j >> 3]; @@ -345,11 +350,6 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr } } - if (data_len == 0) { - sprintf(line[0], ""); - return tracepos; - } - // Draw the CRC column const char *crc = (crcStatus == 0 ? "!crc" : (crcStatus == 1 ? " ok " : " ")); @@ -442,7 +442,9 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr if (showWaitCycles && !isResponse && next_record_is_response(tracepos, trace)) { - uint32_t next_timestamp = *((uint32_t *)(trace + tracepos)); + tracelog_hdr_t *next_hdr = (tracelog_hdr_t *)(trace + tracepos); + + uint32_t next_timestamp = next_hdr->timestamp; PrintAndLogEx(NORMAL, " %10u | %10u | %s |fdt (Frame Delay Time): %d", (EndOfTransmissionTimestamp - first_timestamp), (next_timestamp - first_timestamp), From afafdce3c92f91d79e3f26182bc8ba041eb43825 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 19 May 2020 00:52:11 +0200 Subject: [PATCH 245/632] test for hex output / wireshark --- pm3test.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pm3test.sh b/pm3test.sh index bf58b028c..27a7619b8 100755 --- a/pm3test.sh +++ b/pm3test.sh @@ -112,7 +112,8 @@ while true; do if ! CheckExecute "reveng -g test" "$PM3BIN -c 'reveng -g abda202c'" "CRC-16/ISO-IEC-14443-3-A"; then break; fi if ! CheckExecute "reveng -w test" "$PM3BIN -c 'reveng -w 8 -s 01020304e3 010204039d'" "CRC-8/SMBUS"; then break; fi if ! CheckExecute "mfu pwdgen test" "$PM3BIN -c 'hf mfu pwdgen t'" "Selftest OK"; then break; fi - if ! CheckExecute "trace load/list test" "$PM3BIN -c 'trace load traces/hf_mfu.trace; trace list 1;'" "READBLOCK(8)"; then break; fi + if ! CheckExecute "trace load/list 14a" "$PM3BIN -c 'trace load traces/hf_mfu.trace; trace list 1;'" "READBLOCK(8)"; then break; fi + if ! CheckExecute "trace load/list x" "$PM3BIN -c 'trace load traces/hf_mfu.trace; trace list x 1;'" "0.0101840425"; then break; fi echo -e "\n${C_BLUE}Testing LF:${C_NC}" if ! CheckExecute "lf EM4x05 test" "$PM3BIN -c 'data load traces/em4x05.pm3;lf search 1'" "FDX-B ID found"; then break; fi From 2ba350903a92c6e27b7d7ba389af52904e81b1cb Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 19 May 2020 02:14:43 +0200 Subject: [PATCH 246/632] more tracelog rework --- client/src/cmdtrace.c | 115 ++++++++++++++---------------------------- include/pm3_cmd.h | 14 +++++ 2 files changed, 51 insertions(+), 78 deletions(-) diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index 5cb61fdf0..43d84c3f3 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -18,6 +18,7 @@ #include "comms.h" // for sending cmds to device. GetFromBigBuf #include "fileutils.h" // for saveFile #include "cmdlfhitag.h" // annotate hitag +#include "pm3_cmd.h" // tracelog_hdr_t static int CmdHelp(const char *Cmd); @@ -25,17 +26,6 @@ static int CmdHelp(const char *Cmd); static uint8_t *g_trace; long g_traceLen = 0; -typedef struct { - uint32_t timestamp; - uint16_t duration; - uint16_t data_len; - uint8_t frame[]; -} PACKED tracelog_hdr_t; - -// 4 + 2 + 2 -#define TRACELOG_HDR_LEN sizeof(tracelog_hdr_t) -#define TRACELOG_NEXT_PARITY_LEN(x) (((x)hdr->data_len - 1) / 8 + 1) - static int usage_trace_list(void) { PrintAndLogEx(NORMAL, "List protocol data in trace buffer."); PrintAndLogEx(NORMAL, "Usage: trace list [f][c| <0|1>"); @@ -88,7 +78,7 @@ static bool is_last_record(uint16_t tracepos, uint16_t traceLen) { static bool next_record_is_response(uint16_t tracepos, uint8_t *trace) { tracelog_hdr_t *hdr = (tracelog_hdr_t *)(trace + tracepos); - return ((hdr->data_len & 0x8000) == 0x8000); + return (hdr->isResponse); } static bool merge_topaz_reader_frames(uint32_t timestamp, uint32_t *duration, uint16_t *tracepos, uint16_t traceLen, @@ -106,24 +96,18 @@ static bool merge_topaz_reader_frames(uint32_t timestamp, uint32_t *duration, ui tracelog_hdr_t *hdr = (tracelog_hdr_t *)(trace + *tracepos); - uint32_t next_timestamp = hdr->timestamp; - uint16_t next_duration = hdr->duration; - uint16_t next_data_len = hdr->data_len & 0x7FFF; - uint8_t *next_frame = hdr->frame; - - *tracepos += TRACELOG_HDR_LEN + next_data_len; + *tracepos += TRACELOG_HDR_LEN + hdr->data_len; - if ((next_data_len == 1) && (*data_len + next_data_len <= MAX_TOPAZ_READER_CMD_LEN)) { - memcpy(topaz_reader_command + *data_len, next_frame, next_data_len); - *data_len += next_data_len; - last_timestamp = next_timestamp + next_duration; + if ((hdr->data_len == 1) && (*data_len + hdr->data_len <= MAX_TOPAZ_READER_CMD_LEN)) { + memcpy(topaz_reader_command + *data_len, hdr->frame, hdr->data_len); + *data_len += hdr->data_len; + last_timestamp = hdr->timestamp + hdr->duration; } else { // rewind and exit - *tracepos = *tracepos - next_data_len - TRACELOG_HDR_LEN; + *tracepos = *tracepos - hdr->data_len - TRACELOG_HDR_LEN; break; } - uint16_t next_parity_len = (next_data_len - 1) / 8 + 1; - *tracepos += next_parity_len; + *tracepos += TRACELOG_PARITY_LEN(hdr); } *duration = last_timestamp - timestamp; @@ -137,24 +121,12 @@ static uint16_t printHexLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trac tracelog_hdr_t *hdr = (tracelog_hdr_t *)(trace + tracepos); - bool isResponse; - uint16_t parity_len; - - if ((hdr->data_len & 0x8000) == 0x8000) { - hdr->data_len &= 0x7fff; - isResponse = true; - } else { - isResponse = false; - } - - parity_len = (hdr->data_len - 1) / 8 + 1; - - if (TRACELOG_HDR_LEN + hdr->data_len + parity_len > traceLen) { + if (TRACELOG_HDR_LEN + hdr->data_len + TRACELOG_PARITY_LEN(hdr) > traceLen) { return traceLen; } //set trace position - tracepos += TRACELOG_HDR_LEN + hdr->data_len + parity_len; + tracepos += TRACELOG_HDR_LEN + hdr->data_len + TRACELOG_PARITY_LEN(hdr); if (hdr->data_len == 0) { PrintAndLogEx(NORMAL, ""); @@ -190,7 +162,7 @@ static uint16_t printHexLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trac PrintAndLogEx(NORMAL, "0.%010u", hdr->timestamp); PrintAndLogEx(NORMAL, "000000 00 %s %s %s %s", - (isResponse ? "ff" : "fe"), + (hdr->isResponse ? "ff" : "fe"), temp_str1, temp_str2, line); @@ -210,44 +182,32 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr // sanity check if (is_last_record(tracepos, traceLen)) return traceLen; - bool isResponse; - uint16_t data_len, parity_len; - uint32_t duration, timestamp, first_timestamp, EndOfTransmissionTimestamp; + uint32_t duration; + uint16_t data_len; + uint32_t EndOfTransmissionTimestamp; uint8_t topaz_reader_command[9]; char explanation[40] = {0}; uint8_t mfData[32] = {0}; size_t mfDataLen = 0; - tracelog_hdr_t *first_hdr = (tracelog_hdr_t *)(trace); tracelog_hdr_t *hdr = (tracelog_hdr_t *)(trace + tracepos); - first_timestamp = first_hdr->timestamp; - - timestamp = hdr->timestamp; duration = hdr->duration; data_len = hdr->data_len; - if (data_len & 0x8000) { - data_len &= 0x7fff; - isResponse = true; - } else { - isResponse = false; - } - parity_len = (data_len - 1) / 8 + 1; - - if (tracepos + TRACELOG_HDR_LEN + data_len + parity_len > traceLen) { + if (tracepos + TRACELOG_HDR_LEN + data_len + TRACELOG_PARITY_LEN(hdr) > traceLen) { return traceLen; } uint8_t *frame = hdr->frame; uint8_t *parityBytes = hdr->frame + data_len; - tracepos += TRACELOG_HDR_LEN + data_len + parity_len; + tracepos += TRACELOG_HDR_LEN + data_len + TRACELOG_PARITY_LEN(hdr); - if (protocol == TOPAZ && !isResponse) { + if (protocol == TOPAZ && !hdr->isResponse) { // topaz reader commands come in 1 or 9 separate frames with 7 or 8 Bits each. // merge them: - if (merge_topaz_reader_frames(timestamp, &duration, &tracepos, traceLen, trace, frame, topaz_reader_command, &data_len)) { + if (merge_topaz_reader_frames(hdr->timestamp, &duration, &tracepos, traceLen, trace, frame, topaz_reader_command, &data_len)) { frame = topaz_reader_command; } } @@ -258,7 +218,7 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr if (data_len > 2) { switch (protocol) { case ICLASS: - crcStatus = iclass_CRC_check(isResponse, frame, data_len); + crcStatus = iclass_CRC_check(hdr->isResponse, frame, data_len); break; case ISO_14443B: case TOPAZ: @@ -266,12 +226,12 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr crcStatus = !felica_CRC_check(frame + 2, data_len - 4); break; case PROTO_MIFARE: - crcStatus = mifare_CRC_check(isResponse, frame, data_len); + crcStatus = mifare_CRC_check(hdr->isResponse, frame, data_len); break; case ISO_14443A: case MFDES: case LTO: - crcStatus = iso14443A_CRC_check(isResponse, frame, data_len); + crcStatus = iso14443A_CRC_check(hdr->isResponse, frame, data_len); break; case THINFILM: frame[data_len - 1] ^= frame[data_len - 2]; @@ -319,11 +279,11 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr && protocol != THINFILM && protocol != FELICA && protocol != LTO - && (isResponse || protocol == ISO_14443A) + && (hdr->isResponse || protocol == ISO_14443A) && (oddparity8(frame[j]) != ((parityBits >> (7 - (j & 0x0007))) & 0x01))) { snprintf(line[j / 18] + ((j % 18) * 4), 120, "%02x! ", frame[j]); - } else if (protocol == ICLASS && isResponse == false) { + } else if (protocol == ICLASS && hdr->isResponse == false) { uint8_t parity = 0; for (int i = 0; i < 6; i++) { parity ^= ((frame[0] >> i) & 1); @@ -353,19 +313,19 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr // Draw the CRC column const char *crc = (crcStatus == 0 ? "!crc" : (crcStatus == 1 ? " ok " : " ")); - EndOfTransmissionTimestamp = timestamp + duration; + EndOfTransmissionTimestamp = hdr->timestamp + duration; // Always annotate LEGIC read/tag if (protocol == LEGIC) annotateLegic(explanation, sizeof(explanation), frame, data_len); if (protocol == PROTO_MIFARE) - annotateMifare(explanation, sizeof(explanation), frame, data_len, parityBytes, parity_len, isResponse); + annotateMifare(explanation, sizeof(explanation), frame, data_len, parityBytes, TRACELOG_PARITY_LEN(hdr), hdr->isResponse); if (protocol == FELICA) annotateFelica(explanation, sizeof(explanation), frame, data_len); - if (!isResponse) { + if (!hdr->isResponse) { switch (protocol) { case ICLASS: annotateIclass(explanation, sizeof(explanation), frame, data_len); @@ -412,9 +372,9 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr for (int j = 0; j < num_lines ; j++) { if (j == 0) { PrintAndLogEx(NORMAL, " %10u | %10u | %s |%-72s | %s| %s", - (timestamp - first_timestamp), - (EndOfTransmissionTimestamp - first_timestamp), - (isResponse ? "Tag" : "Rdr"), + (hdr->timestamp - first_hdr->timestamp), + (EndOfTransmissionTimestamp - first_hdr->timestamp), + (hdr->isResponse ? "Tag" : "Rdr"), line[j], (j == num_lines - 1) ? crc : " ", (j == num_lines - 1) ? explanation : ""); @@ -426,12 +386,12 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr } } - if (DecodeMifareData(frame, data_len, parityBytes, isResponse, mfData, &mfDataLen)) { + if (DecodeMifareData(frame, data_len, parityBytes, hdr->isResponse, mfData, &mfDataLen)) { memset(explanation, 0x00, sizeof(explanation)); - if (!isResponse) { + if (!hdr->isResponse) { annotateIso14443a(explanation, sizeof(explanation), mfData, mfDataLen); } - uint8_t crcc = iso14443A_CRC_check(isResponse, mfData, mfDataLen); + uint8_t crcc = iso14443A_CRC_check(hdr->isResponse, mfData, mfDataLen); PrintAndLogEx(NORMAL, " | | * |%-72s | %-4s| %s", sprint_hex_inrow_spaces(mfData, mfDataLen, 2), (crcc == 0 ? "!crc" : (crcc == 1 ? " ok " : " ")), @@ -440,16 +400,15 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr if (is_last_record(tracepos, traceLen)) return traceLen; - if (showWaitCycles && !isResponse && next_record_is_response(tracepos, trace)) { + if (showWaitCycles && !hdr->isResponse && next_record_is_response(tracepos, trace)) { tracelog_hdr_t *next_hdr = (tracelog_hdr_t *)(trace + tracepos); - uint32_t next_timestamp = next_hdr->timestamp; PrintAndLogEx(NORMAL, " %10u | %10u | %s |fdt (Frame Delay Time): %d", - (EndOfTransmissionTimestamp - first_timestamp), - (next_timestamp - first_timestamp), + (EndOfTransmissionTimestamp - first_hdr->timestamp), + (next_hdr->timestamp - first_hdr->timestamp), " ", - (next_timestamp - EndOfTransmissionTimestamp)); + (next_hdr->timestamp - EndOfTransmissionTimestamp)); } return tracepos; diff --git a/include/pm3_cmd.h b/include/pm3_cmd.h index c9125b1aa..b6de6f292 100644 --- a/include/pm3_cmd.h +++ b/include/pm3_cmd.h @@ -121,6 +121,20 @@ typedef struct { int32_t samples_to_skip; bool verbose; } PACKED sample_config; + +typedef struct { + uint32_t timestamp; + uint16_t duration; + uint16_t data_len : 15; + bool isResponse : 1; + uint8_t frame[]; + // data_len bytes of data + // ceil(data_len/8) bytes of parity +} PACKED tracelog_hdr_t; + +#define TRACELOG_HDR_LEN sizeof(tracelog_hdr_t) +#define TRACELOG_PARITY_LEN(x) (((x)->data_len - 1) / 8 + 1) + /* typedef struct { uint16_t start_gap; From a999243a451249e376d993e0e348af5d4367b70d Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 19 May 2020 02:39:39 +0200 Subject: [PATCH 247/632] use tracelog struct in arm too --- armsrc/BigBuf.c | 36 ++++++++++-------------------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/armsrc/BigBuf.c b/armsrc/BigBuf.c index 765d230a5..5f1ace5f8 100644 --- a/armsrc/BigBuf.c +++ b/armsrc/BigBuf.c @@ -12,6 +12,7 @@ #include "string.h" #include "dbprint.h" +#include "pm3_cmd.h" // BigBuf is the large multi-purpose buffer, typically used to hold A/D samples or traces. // Also used to hold various smaller buffers and the Mifare Emulator Memory. @@ -146,40 +147,23 @@ bool RAMFUNC LogTrace(const uint8_t *btBytes, uint16_t iLen, uint32_t timestamp_ if (!tracing) return false; uint8_t *trace = BigBuf_get_addr(); + tracelog_hdr_t *hdr = (tracelog_hdr_t *)(trace + traceLen); uint32_t num_paritybytes = (iLen - 1) / 8 + 1; // number of valid paritybytes in *parity - uint32_t duration = timestamp_end - timestamp_start; // Return when trace is full - if (traceLen + sizeof(iLen) + sizeof(timestamp_start) + sizeof(duration) + num_paritybytes + iLen >= BigBuf_max_traceLen()) { + if (TRACELOG_HDR_LEN + iLen + num_paritybytes >= BigBuf_max_traceLen() - traceLen) { tracing = false; // don't trace any more return false; } - // Traceformat: - // 32 bits timestamp (little endian) - // 16 bits duration (little endian) - // 16 bits data length (little endian, Highest Bit used as readerToTag flag) - // y Bytes data - // x Bytes parity (one byte per 8 bytes data) - - // timestamp (start) - trace[traceLen++] = ((timestamp_start >> 0) & 0xff); - trace[traceLen++] = ((timestamp_start >> 8) & 0xff); - trace[traceLen++] = ((timestamp_start >> 16) & 0xff); - trace[traceLen++] = ((timestamp_start >> 24) & 0xff); - - // duration - trace[traceLen++] = ((duration >> 0) & 0xff); - trace[traceLen++] = ((duration >> 8) & 0xff); - - // data length - trace[traceLen++] = ((iLen >> 0) & 0xff); - trace[traceLen++] = ((iLen >> 8) & 0xff); - - // readerToTag flag - if (!readerToTag) { - trace[traceLen - 1] |= 0x80; + if (timestamp_end - timestamp_start > UINT16_MAX) { + return false; // duration too long } + hdr->timestamp = timestamp_start; + hdr->duration = timestamp_end - timestamp_start; + hdr->data_len = iLen; + hdr->isResponse = !readerToTag; + traceLen += TRACELOG_HDR_LEN; // data bytes if (btBytes != NULL && iLen != 0) { From 23d754c85f6ef5b4dd2246b108b827b007ee4d8d Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 19 May 2020 02:48:03 +0200 Subject: [PATCH 248/632] fix max duration in LogTrace --- armsrc/BigBuf.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/armsrc/BigBuf.c b/armsrc/BigBuf.c index 5f1ace5f8..8ee7cc189 100644 --- a/armsrc/BigBuf.c +++ b/armsrc/BigBuf.c @@ -156,8 +156,8 @@ bool RAMFUNC LogTrace(const uint8_t *btBytes, uint16_t iLen, uint32_t timestamp_ tracing = false; // don't trace any more return false; } - if (timestamp_end - timestamp_start > UINT16_MAX) { - return false; // duration too long + if (timestamp_end - timestamp_start > 0x7FFF) { + return false; // duration too long, must be max 15 bits } hdr->timestamp = timestamp_start; hdr->duration = timestamp_end - timestamp_start; From 966bcc0d2825ae3f411dacb84f8a2f08a20d24f7 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 19 May 2020 09:13:31 +0200 Subject: [PATCH 249/632] chg: adding execute/home/current working directory functions to lua --- client/luascripts/tracetest.lua | 14 +++++----- client/src/preferences.c | 9 ------- client/src/proxmark3.c | 8 ------ client/src/proxmark3.h | 9 +++++++ client/src/scripting.c | 48 ++++++++++++++++++++++++++++++++- 5 files changed, 64 insertions(+), 24 deletions(-) diff --git a/client/luascripts/tracetest.lua b/client/luascripts/tracetest.lua index c1917b401..e45d1ceba 100644 --- a/client/luascripts/tracetest.lua +++ b/client/luascripts/tracetest.lua @@ -7,15 +7,15 @@ local ansicolors = require('ansicolors') copyright = '' author = 'Iceman' -version = 'v1.0.2' +version = 'v1.0.3' desc = [[ -This script will load several traces files in ../traces/ folder and do +This script will load several traces files in current working directory/traces/ folder and do "data load" "lf search 1 u" The following tracefiles will be loaded: em*.pm3 - m*.pm3 + modulation*.pm3 ]] example = [[ 1. script run tracetest @@ -78,8 +78,10 @@ local function main(args) print( string.rep('--',20) ) local cmdDataLoad = 'data load %s'; - local tracesEM = "find '../traces/' -iname 'em*.pm3' -type f" - local tracesMOD = "find '../traces/' -iname 'm*.pm3' -type f" + local cwd = core.cwd(); + + local tracesEM = "find '"..cwd.."/traces/ ' -iname 'em*.pm3' -type f" + local tracesMOD = "find '"..cwd.."/traces/' -iname 'modulation*.pm3' -type f" local write2File = false local outputTemplate = os.date('testtest_%Y-%m-%d_%H%M%S') @@ -100,7 +102,7 @@ local function main(args) end p.close(); - -- Find a set of traces staring with MOD + -- Find a set of traces staring with MODULATION p = assert( io.popen(tracesMOD) ) for file in p:lines() do table.insert(files, file) diff --git a/client/src/preferences.c b/client/src/preferences.c index 0ef715075..4c8fefb77 100644 --- a/client/src/preferences.c +++ b/client/src/preferences.c @@ -29,15 +29,6 @@ static int CmdHelp(const char *Cmd); static int setCmdHelp(const char *Cmd); -// Load all settings into memory (struct) -#ifdef _WIN32 -#include -#define GetCurrentDir _getcwd -#else -#include -#define GetCurrentDir getcwd -#endif - static char *prefGetFilename(void) { char *path; diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index abf014e08..07d777a2c 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -29,14 +29,6 @@ #include "flash.h" #include "preferences.h" -#ifdef _WIN32 -#include -#define GetCurrentDir _getcwd -#else -#include -#define GetCurrentDir getcwd -#endif - // Used to enable/disable use of preferences json file #define USE_PREFERENCE_FILE diff --git a/client/src/proxmark3.h b/client/src/proxmark3.h index 6402baea9..6d7e9dfb4 100644 --- a/client/src/proxmark3.h +++ b/client/src/proxmark3.h @@ -12,6 +12,7 @@ #ifndef PROXMARK3_H__ #define PROXMARK3_H__ +#include #include "common.h" #define PROXPROMPT_MAX_SIZE 255 @@ -36,6 +37,14 @@ extern "C" { #endif +// Load all settings into memory (struct) +#ifdef _WIN32 +#include +#define GetCurrentDir _getcwd +#else +#define GetCurrentDir getcwd +#endif + int push_cmdscriptfile(char *path, bool stayafter); const char *get_my_executable_path(void); const char *get_my_executable_directory(void); diff --git a/client/src/scripting.c b/client/src/scripting.c index 25bda6322..4a3bab49c 100644 --- a/client/src/scripting.c +++ b/client/src/scripting.c @@ -12,9 +12,11 @@ #include #include +#include #include "lauxlib.h" #include "cmdmain.h" +#include "proxmark3.h" #include "comms.h" #include "mifare/mifarehost.h" #include "crc.h" @@ -28,7 +30,7 @@ #include "mifare/ndef.h" // ndef parsing #include "commonutil.h" #include "ui.h" -#include "proxmark3.h" + #include "crc16.h" #include "protocols.h" #include "fileutils.h" // searchfile @@ -912,6 +914,12 @@ static int l_detect_prng(lua_State *L) { * @return */ static int l_keygen_algoD(lua_State *L) { + //Check number of arguments + int n = lua_gettop(L); + if (n != 1) { + return returnToLuaWithError(L, "Only UID"); + } + size_t size; uint32_t tmp; const char *p_uid = luaL_checklstring(L, 1, &size); @@ -1129,6 +1137,9 @@ static int l_remark(lua_State *L) { return 1; } +// 1. filename +// 2. extension +// output: full search path to file static int l_searchfile(lua_State *L) { //Check number of arguments int n = lua_gettop(L); @@ -1154,6 +1165,38 @@ static int l_searchfile(lua_State *L) { return 1; } +static int l_ud(lua_State *L) { + const char *ud = get_my_user_directory(); + lua_pushstring(L, ud); + return 1; +} +static int l_ewd(lua_State *L) { + const char *ewd = get_my_executable_directory(); + lua_pushstring(L, ewd); + return 1; +} +static int l_cwd(lua_State *L) { + + uint16_t path_len = FILENAME_MAX; // should be a good starting point + bool error = false; + char *cwd = NULL; + cwd = (char *)calloc(path_len, sizeof(uint8_t)); + + while (!error && (GetCurrentDir(cwd, path_len) == NULL)) { + if (errno == ERANGE) { // Need bigger buffer + path_len += 10; // if buffer was too small add 10 characters and try again + cwd = realloc(cwd, path_len); + } else { + error = true; + free(cwd); + return returnToLuaWithError(L, "Failed to get current working directory"); + } + } + lua_pushstring(L, cwd); + free(cwd); + return 1; +} + /** * @brief Sets the lua path to include "./lualibs/?.lua", in order for a script to be * able to do "require('foobar')" if foobar.lua is within lualibs folder. @@ -1215,6 +1258,9 @@ int set_pm3_libraries(lua_State *L) { {"ndefparse", l_ndefparse}, {"fast_push_mode", l_fast_push_mode}, {"search_file", l_searchfile}, + {"cwd", l_cwd}, + {"ewd", l_ewd}, + {"ud", l_ud}, {"rem", l_remark}, {NULL, NULL} }; From 339a3ee152ff3c3b4a06a6e4584a9ac776c523b3 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 19 May 2020 09:29:11 +0200 Subject: [PATCH 250/632] update trace log documentation --- doc/trace_notes.md | 51 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 7 deletions(-) diff --git a/doc/trace_notes.md b/doc/trace_notes.md index a126a238f..1cdf8dead 100644 --- a/doc/trace_notes.md +++ b/doc/trace_notes.md @@ -1,10 +1,18 @@ -# Trace command notes +# Notes about the tracelog. + +## Table of Contents + * [Command](#trace-command) + * [File format](#tracelog-format) + * [Wireshark dissector interoperability](#trace-and-wireshark) + + +## Trace command The `trace` command lists the data exchange by the proxmark3 and a tag or a reader in human readable form. With `trace list` a table is shown which gives timing information, the src of the data bytes, the transmitted/received bytes itself, a check if the CRC was correct and some decoding of the command. -## Timing +### Timing The Start and the End coloumn lists timestamps when the transmission of the shown data started (time of first bit) and when it ended (end of last modulation). @@ -20,26 +28,55 @@ The unit for this time information depends on the protocol in use: By specifing the option ```f``` (e.g. ```trace list 14a f```) the frame delay times are shown. (So you don't have to do the math by your own). -## Sources +### Sources If the data is marked as a response the source is shown as Tag. Otherwise it is marked as Reader (Rdr). -## Data +### Data This coloumn show the raw bytes trasmitted over the air. With option ```c``` CRC bytes are marked in square brackets. -## CRC +### CRC Marks if the transmitted CRC matches with the calculated CRC. -## Annotation +### Annotation Annotations provide a rough decoding of the transmitted data. For ISO14443A a more detailed decoding is available with Wireshark (s. next chapter) +-- +## Tracelog format +The binary format for the dynamic tracelog is as following. + +``` + /* + Traceformat: + 32 bits timestamp (little endian) + 16 bits duration (little endian) + 15 bits data length (little endian) (0x7FFF) + 1 bit isResponse (used as readerToTag flag) + y Bytes data + x Bytes parity, where x == ceil(data_len/8) +*/ + +typedef struct { + uint32_t timestamp; + uint16_t duration; + uint16_t data_len : 15; + bool isResponse : 1; + uint8_t frame[]; + // data_len bytes of data + // ceil(data_len/8) bytes of parity +} PACKED tracelog_hdr_t; + +#define TRACELOG_HDR_LEN sizeof(tracelog_hdr_t) +#define TRACELOG_PARITY_LEN(x) (((x)->data_len - 1) / 8 + 1) +``` + -- -# Trace and Wireshark +## Trace and Wireshark To get a more detailed explanation of the transmitted data for ISO14443A traces the output can be converted to a pcapng file to read it with [Wireshark](https://www.wireshark.org/). From 66920e66995fbfc9eeacd427ac00f96597c9f003 Mon Sep 17 00:00:00 2001 From: Iceman Date: Tue, 19 May 2020 09:31:52 +0200 Subject: [PATCH 251/632] Update trace_notes.md --- doc/trace_notes.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/doc/trace_notes.md b/doc/trace_notes.md index 1cdf8dead..8344c6184 100644 --- a/doc/trace_notes.md +++ b/doc/trace_notes.md @@ -1,4 +1,4 @@ -# Notes about the tracelog. +# Notes about the tracelog ## Table of Contents * [Command](#trace-command) @@ -44,7 +44,6 @@ Marks if the transmitted CRC matches with the calculated CRC. Annotations provide a rough decoding of the transmitted data. For ISO14443A a more detailed decoding is available with Wireshark (s. next chapter) --- ## Tracelog format The binary format for the dynamic tracelog is as following. @@ -73,9 +72,6 @@ typedef struct { #define TRACELOG_PARITY_LEN(x) (((x)->data_len - 1) / 8 + 1) ``` - --- - ## Trace and Wireshark To get a more detailed explanation of the transmitted data for ISO14443A traces the output can be converted to a pcapng file to read it with [Wireshark](https://www.wireshark.org/). From 01139ac7e7bdc36762f0354f7a0c8eded05b26c4 Mon Sep 17 00:00:00 2001 From: Iceman Date: Tue, 19 May 2020 09:40:25 +0200 Subject: [PATCH 252/632] Update README.md --- README.md | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index f97017965..d19c187c4 100644 --- a/README.md +++ b/README.md @@ -16,17 +16,24 @@ |[Why didn't you base it on official Proxmark3 Master?](#why-didnt-you-base-it-on-official-proxmark3-master)| **[Homebrew (Mac OS X) & Upgrading HomeBrew Tap Formula](/doc/md/Installation_Instructions/Mac-OS-X-Homebrew-Installation-Instructions.md)** | [First Use and Verification](/doc/md/Use_of_Proxmark/2_Configuration-and-Verification.md)| |[Proxmark3 GUI](#proxmark3-gui)|**[Setup and build for Windows](/doc/md/Installation_Instructions/Windows-Installation-Instructions.md)**|[Commands & Features](/doc/md/Use_of_Proxmark/3_Commands-and-Features.md)| |[Issues](#issues)|[Blue shark manual](/doc/bt_manual_v10.md) || -|[Notes on UART](/doc/uart_notes.md)|[Maintainers](/doc/md/Development/Maintainers.md)|[Command Cheat sheet](/doc/cheatsheet.md)| -|[Notes on frame format](/doc/new_frame_format.md)|[Advanced compilation parameters](/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md)|[More cheat sheets](https://github.com/RfidResearchGroup/proxmark3/wiki/More-cheat-sheets)| -|[Notes on external flash](/doc/ext_flash_notes.md)||[EMV](/doc/emv_notes.md)| -|[Notes on Termux / Android](/doc/termux_notes.md)|**[Troubleshooting](/doc/md/Installation_Instructions/Troubleshooting.md)**|[Complete client command set](/doc/commands.md)| -|[Notes on tracedata / wireshark](/doc/trace_notes.md)|**[JTAG](/doc/jtag_notes.md)**|| -|[Notes on loclass](/doc/loclass_notes.md)||| -|[Notes on paths](/doc/path_notes.md)||| +||[Maintainers](/doc/md/Development/Maintainers.md)|[Command Cheat sheet](/doc/cheatsheet.md)| +||[Advanced compilation parameters](/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md)|[More cheat sheets](https://github.com/RfidResearchGroup/proxmark3/wiki/More-cheat-sheets)| +|||[EMV](/doc/emv_notes.md)| +||**[Troubleshooting](/doc/md/Installation_Instructions/Troubleshooting.md)**|[Complete client command set](/doc/commands.md)| +||**[JTAG](/doc/jtag_notes.md)**|| +|||| +|||| |[Developing standalone mode](/armsrc/Standalone/readme.md)|[Wiki about standalone mode](https://github.com/RfidResearchGroup/proxmark3/wiki/Standalone-mode) || |[Donations](#Donations)||| +| Notes / helpful documents ||| +| ------------------- |:-------------------:| -------------------:| +|[Notes on UART](/doc/uart_notes.md)|[Notes on Termux / Android](/doc/termux_notes.md)|[Notes on paths](/doc/path_notes.md)| +|[Notes on frame format](/doc/new_frame_format.md)|[Notes on tracedata / wireshark](/doc/trace_notes.md)|[Notes on EMV](/doc/emv_notes.md)| +|[Notes on external flash](/doc/ext_flash_notes.md)|[Notes on loclass](/doc/loclass_notes.md)|[Notes on Coverity Scan Config & Run](/doc/md/Development/Coverity-Scan-Config-%26-Run.md)| +|[Notes on file formats used with Proxmark3](/doc/extensions_notes.md)|[Notes on standalone mode](https://github.com/RfidResearchGroup/proxmark3/wiki/Standalone-mode)|| + ## Build for non-RDV4 Proxmark3 platforms In order to build this repo for other Proxmark3 platforms we urge you to read [Advanced compilation parameters](/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md) @@ -60,18 +67,7 @@ The [public roadmap](https://github.com/RfidResearchGroup/proxmark3/wiki/Public- > 👉 **Remember!** If you intend to contribute to the code, please read the [coding style notes](HACKING.md) first. We usually merge your contributions fast since we do like the idea of getting a functionality in the Proxmark3 and weed out the bugs afterwards. -## Notes / helpful documents -- notes on [Coverity Scan Config & Run](/doc/md/Development/Coverity-Scan-Config-%26-Run.md). -- notes on [UART](/doc/uart_notes.md) -- notes on [Frame format](/doc/new_frame_format.md) -- notes on [external flash](/doc/ext_flash_notes.md) -- notes on [standalone mode](https://github.com/RfidResearchGroup/proxmark3/wiki/Standalone-mode) -- notes on [Termux / Android](/doc/termux_notes.md) -- notes on [tracedata / Wireshark](/doc/trace_notes.md) -- notes on [loclass](/doc/loclass_notes.md) -- notes on [EMV](/doc/emv_notes.md) -- notes on [Paths](/doc/path_notes.md) -- notes on [file formats used with Proxmark3](/doc/extensions_notes.md) + ## Cheat sheet Thanks to Alex Dibs, you can enjoy a [command cheat sheet](/doc/cheatsheet.md) From 5e022c4be008eace5ea79a81e587dda3f15e6877 Mon Sep 17 00:00:00 2001 From: Iceman Date: Tue, 19 May 2020 09:40:52 +0200 Subject: [PATCH 253/632] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index d19c187c4..80bf92355 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,6 @@ |||[EMV](/doc/emv_notes.md)| ||**[Troubleshooting](/doc/md/Installation_Instructions/Troubleshooting.md)**|[Complete client command set](/doc/commands.md)| ||**[JTAG](/doc/jtag_notes.md)**|| -|||| -|||| |[Developing standalone mode](/armsrc/Standalone/readme.md)|[Wiki about standalone mode](https://github.com/RfidResearchGroup/proxmark3/wiki/Standalone-mode) || |[Donations](#Donations)||| From eb9a485fe020fa1fc0d9d810dca46878582acd97 Mon Sep 17 00:00:00 2001 From: Iceman Date: Tue, 19 May 2020 09:42:54 +0200 Subject: [PATCH 254/632] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 80bf92355..2897131f6 100644 --- a/README.md +++ b/README.md @@ -18,14 +18,14 @@ |[Issues](#issues)|[Blue shark manual](/doc/bt_manual_v10.md) || ||[Maintainers](/doc/md/Development/Maintainers.md)|[Command Cheat sheet](/doc/cheatsheet.md)| ||[Advanced compilation parameters](/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md)|[More cheat sheets](https://github.com/RfidResearchGroup/proxmark3/wiki/More-cheat-sheets)| -|||[EMV](/doc/emv_notes.md)| ||**[Troubleshooting](/doc/md/Installation_Instructions/Troubleshooting.md)**|[Complete client command set](/doc/commands.md)| ||**[JTAG](/doc/jtag_notes.md)**|| |[Developing standalone mode](/armsrc/Standalone/readme.md)|[Wiki about standalone mode](https://github.com/RfidResearchGroup/proxmark3/wiki/Standalone-mode) || |[Donations](#Donations)||| -| Notes / helpful documents ||| +## Notes / helpful documents +| Notes ||| | ------------------- |:-------------------:| -------------------:| |[Notes on UART](/doc/uart_notes.md)|[Notes on Termux / Android](/doc/termux_notes.md)|[Notes on paths](/doc/path_notes.md)| |[Notes on frame format](/doc/new_frame_format.md)|[Notes on tracedata / wireshark](/doc/trace_notes.md)|[Notes on EMV](/doc/emv_notes.md)| From dcaf7e1ea72ba512875c46eef36dee575d7f56f7 Mon Sep 17 00:00:00 2001 From: Iceman Date: Tue, 19 May 2020 09:46:18 +0200 Subject: [PATCH 255/632] Update README.md --- README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 2897131f6..988274a08 100644 --- a/README.md +++ b/README.md @@ -16,12 +16,10 @@ |[Why didn't you base it on official Proxmark3 Master?](#why-didnt-you-base-it-on-official-proxmark3-master)| **[Homebrew (Mac OS X) & Upgrading HomeBrew Tap Formula](/doc/md/Installation_Instructions/Mac-OS-X-Homebrew-Installation-Instructions.md)** | [First Use and Verification](/doc/md/Use_of_Proxmark/2_Configuration-and-Verification.md)| |[Proxmark3 GUI](#proxmark3-gui)|**[Setup and build for Windows](/doc/md/Installation_Instructions/Windows-Installation-Instructions.md)**|[Commands & Features](/doc/md/Use_of_Proxmark/3_Commands-and-Features.md)| |[Issues](#issues)|[Blue shark manual](/doc/bt_manual_v10.md) || -||[Maintainers](/doc/md/Development/Maintainers.md)|[Command Cheat sheet](/doc/cheatsheet.md)| +|[Donations](#Donations)|[Maintainers](/doc/md/Development/Maintainers.md)|[Command Cheat sheet](/doc/cheatsheet.md)| ||[Advanced compilation parameters](/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md)|[More cheat sheets](https://github.com/RfidResearchGroup/proxmark3/wiki/More-cheat-sheets)| ||**[Troubleshooting](/doc/md/Installation_Instructions/Troubleshooting.md)**|[Complete client command set](/doc/commands.md)| ||**[JTAG](/doc/jtag_notes.md)**|| -|[Developing standalone mode](/armsrc/Standalone/readme.md)|[Wiki about standalone mode](https://github.com/RfidResearchGroup/proxmark3/wiki/Standalone-mode) || -|[Donations](#Donations)||| ## Notes / helpful documents @@ -30,7 +28,8 @@ |[Notes on UART](/doc/uart_notes.md)|[Notes on Termux / Android](/doc/termux_notes.md)|[Notes on paths](/doc/path_notes.md)| |[Notes on frame format](/doc/new_frame_format.md)|[Notes on tracedata / wireshark](/doc/trace_notes.md)|[Notes on EMV](/doc/emv_notes.md)| |[Notes on external flash](/doc/ext_flash_notes.md)|[Notes on loclass](/doc/loclass_notes.md)|[Notes on Coverity Scan Config & Run](/doc/md/Development/Coverity-Scan-Config-%26-Run.md)| -|[Notes on file formats used with Proxmark3](/doc/extensions_notes.md)|[Notes on standalone mode](https://github.com/RfidResearchGroup/proxmark3/wiki/Standalone-mode)|| +|[Notes on file formats used with Proxmark3](/doc/extensions_notes.md)||| +|[Developing standalone mode](/armsrc/Standalone/readme.md)|[Wiki about standalone mode](https://github.com/RfidResearchGroup/proxmark3/wiki/Standalone-mode)|| ## Build for non-RDV4 Proxmark3 platforms From 505cfed5a029cb65021516ceff54c68acffbb7f4 Mon Sep 17 00:00:00 2001 From: Iceman Date: Tue, 19 May 2020 09:49:53 +0200 Subject: [PATCH 256/632] Update README.md --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 988274a08..02eb139b2 100644 --- a/README.md +++ b/README.md @@ -53,9 +53,11 @@ On the software side: quite a lot, see the [Changelog file](CHANGELOG.md). This repo compiles nicely on - Proxspace v3.x - Windows/mingw environment with Qt5.6.1 & GCC 4.8 - - Ubuntu 1604, 1804, 1904 + - Ubuntu 1604, 1804, 1904, 2004 + - ParrotOS, Gentoo, Pentoo, Kali, Nethunter, Archlinux, Fedora, Debian + - Rasbian Pi, Jetson Nano, + - Android / Termux - Mac OS X / Homebrew - - ParrotOS, Gentoo, Pentoo, Kali, Nethunter, Archlinux, Fedora - WSL, WSL2 (Windows subsystem linux) on Windows 10 - Docker container From 3e50a305211f3969cd62c6c433ecb22a228a216a Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 19 May 2020 10:01:49 +0200 Subject: [PATCH 257/632] trace doc: minor --- doc/trace_notes.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/trace_notes.md b/doc/trace_notes.md index 8344c6184..84a692930 100644 --- a/doc/trace_notes.md +++ b/doc/trace_notes.md @@ -53,9 +53,9 @@ The binary format for the dynamic tracelog is as following. 32 bits timestamp (little endian) 16 bits duration (little endian) 15 bits data length (little endian) (0x7FFF) - 1 bit isResponse (used as readerToTag flag) - y Bytes data - x Bytes parity, where x == ceil(data_len/8) + 1 bit isResponse (0=reader to tag, 1=tag to reader) + data length Bytes data + x Bytes parity, where x == ceil(data length/8) */ typedef struct { From e73aab8ed3294546ec8c8f76c95fa8e83181bcd6 Mon Sep 17 00:00:00 2001 From: Iceman Date: Tue, 19 May 2020 10:11:40 +0200 Subject: [PATCH 258/632] Update bt_manual_v10.md --- doc/bt_manual_v10.md | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/doc/bt_manual_v10.md b/doc/bt_manual_v10.md index d54d458c2..b091ef40b 100644 --- a/doc/bt_manual_v10.md +++ b/doc/bt_manual_v10.md @@ -1,4 +1,5 @@ # MANUAL Bluetooth / Battery add-on 'Blue Shark' + _rev. v1.1_ ## Table of Contents @@ -29,6 +30,7 @@ _rev. v1.1_ * [6.5 Get better signals](#65-get-better-signals) ## 1. FEATURES +^[Top](#top) * Built-in Bluetooth 2.0 with EDR Bluetooth module, default baud rate 115200. * Built-in 400 mAh polymer lithium-ion battery, typical standby time up to 3.5 hours. @@ -44,6 +46,7 @@ Built-in battery can support standalone mode, off-line sniffing, off-line readin ## 2. PARAMETERS +^[Top](#top) * Battery capacity: 400 mAh * Standby time: 3.5h @ StandBy; 2.9h @ LF-On; 50min @ HF-On; @@ -56,6 +59,7 @@ Built-in battery can support standalone mode, off-line sniffing, off-line readin ## 3. ASSEMBLY STEPS +^[Top](#top) * Unplug your Proxmark3 RDV4.0 device from any usb cable. * Remove the plastic upper case of Proxmark3 RDV4.0 with opener. @@ -72,8 +76,11 @@ Built-in battery can support standalone mode, off-line sniffing, off-line readin

## 4. COMPILATION / FLASHING +^[Top](#top) #### 4.1 From Source +^[Top](#top) + Please download the latest source code from Rfid Research Group's Github repo: https://github.com/RfidResearchGroup/proxmark3 @@ -91,6 +98,8 @@ You are now ready to run the client with the serial port you got from your BT de See instructions below. #### 4.2 Homebrew (macOS) +^[Top](#top) + From the [homebrew-proxmark3 readme](https://github.com/RfidResearchGroup/homebrew-proxmark3) 1. `brew tap rfidresearchgroup/proxmark3` @@ -98,13 +107,17 @@ From the [homebrew-proxmark3 readme](https://github.com/RfidResearchGroup/homebr ## 5. CONNECT WITH BLUETOOTH +^[Top](#top) You can have both USB cable connect and BT active at the same time and connect to either serial port. You can also switch serial port from inside the proxmark3 client using the new command `hw connect`. ### 5.1 Windows +^[Top](#top) #### 5.1.1 Connecting your RDV4.0 with Bluetooth on mobile phone or computer +^[Top](#top) + * Open Bluetooth and search for a device named PM3_RDV4.0. * Enter the paired password 1234 and establish the connection. * The blue state LED on the add-on will keep blinking after the connection is established. Only when the mobile phone or computer opens the correct COM port, the blue LED turns on solid, indicating that the connection is successful. @@ -130,6 +143,7 @@ You can also switch serial port from inside the proxmark3 client using the new c * done! #### 5.1.2 Fast connection using dedicated USB Bluetooth adapter under Windows +^[Top](#top)

Image of blue shark add-on HC-06 white dongle

@@ -143,8 +157,10 @@ http://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp * look for _CP2104 USB tp UART bridge controller_ under devices in order to get the assigned serial port ### 5.2 Linux +^[Top](#top) #### 5.2.1 Connecting rdv4.0 with Bluetooth on Linux computer via native Bluetooth support in the client +^[Top](#top) This requires to have compiled the client with Bluetooth support. @@ -189,6 +205,7 @@ Discovery started ``` #### 5.2.2 Fast connection using dedicated USB Bluetooth adapter under Linux +^[Top](#top)

Image of blue shark add-on HC-06 white dongle

@@ -212,6 +229,7 @@ turn on solid. ``` #### 5.2.3 (deprecated) Connecting rdv4.0 with Bluetooth on Linux computer via rfcomm +^[Top](#top) rfcomm is a deprecated tool which might be unavailable in your Linux distribution. @@ -245,8 +263,10 @@ connection is successful. See instructions above (method 1) for initial pairing. ### 5.3 MacOS +^[Top](#top) #### 5.3.1 Connecting rdv4.0 with Bluetooth on MacOS +^[Top](#top) With MacOS Mojave 10.14.5 you could experience some continuosly disconnecting and difficult to recconnect the device at the system wakeup, to avoid this problem do a PRAM reset before to add your Proxmark3 RDV4 Blue Shark: @@ -266,17 +286,21 @@ After reboot you can go ahead to pairing your Proxmark3 RDV4 Blue Shark: ./proxmark3 /dev/tty.PM3_RDV40-DevB ``` ### 5.4 Android +^[Top](#top) #### 5.4.1 Fast connection using dedicated Bluetooth (HC-06 Master + CP2102) adapter under Android with Termux - +^[Top](#top) + 1. Make sure you already followed this tutorial https://github.com/RfidResearchGroup/proxmark3/blob/master/doc/termux_notes.md#setup and have Termux with an running Proxmark3 client ready. You need additional the `cp210x` serial usb driver enabled and working, like the `USB_ACM` driver to communicate wireless. 2. Insert the Bluetooth adapter with an fitting USB-C/Micro-USB converter into your Android USB port and a serial port `/dev/ttyUSB0` will be created. To see if it's working, run `tsudo ls /dev/ttyU*` and it should list `/dev/ttyUSB0`. 3. The adapter will search automatically and establish the connection to BlueShark. The adapter will remember the device that was first connected and after that the same device will be connected. After the connection is established, the blue state LED on add-on will turn on solid. 4. If you see this, congratulations, you can run your Proxmark3 client in Termux with `tsudo proxmark3/client/proxmark3 /dev/ttyUSB0` ## 6. OTHER NOTES +^[Top](#top) ### 6.1 Default settings +^[Top](#top) Settings of the Blue Shark add-on and of the white dongle: @@ -287,19 +311,27 @@ Settings of the Blue Shark add-on and of the white dongle: If you bought your Bluetooth adapter dongle somewhere else, make sure to set the baud rate to 115200 `AT+BAUD8`, the name `AT+NAMEPM3_RDV4.0` and PIN `AT+PIN1234` correctly. ### 6.1 UART and LED behavior +^[Top](#top) + Bluetooth is connected to Proxmark3 RDV4.0 via UART. The USB and UART interfaces of RDV4.0 can coexist without conflict, and no special switching is required. The following link has helpful notes on UART usage and baud rates: https://github.com/RfidResearchGroup/proxmark3/blob/master/doc/uart_notes.md ### 6.2 Disassembly +^[Top](#top) + There is a heat conductive double-sided tape inside the add-on, which has strong adhesive force. Therefore, if add-on needs to be removed, it needs to be pulled out from the heat sink end with greater efforts. Each disassembly will reduce the viscidity of double-sided tape. When double-sided tape is well protected, it will not affect the second use. Thermal conductivity will be slightly worse and will therefore have a direct impact on the thermal performance of the heat sink. ### 6.3 Battery charging +^[Top](#top) + The battery charging circuit is turned on by default. Any time a USB cable is inserted, the battery will be automatically charged. The red LED will remain bright when charging. The red LED will be extinguished when charging is completed. ### 6.4 Get better signals +^[Top](#top) + For the better heat dissipation, we have used a cast metal enclosure for the add-on. As a result Bluetooth wireless signals are sacrificed. For example, if the back of add-on is facing the Bluetooth host, the signal is very bad and the distance will be reduced. The best signal strength can be obtained when the front glass faces the Bluetooth host. If the Proxmark3 is not responding, it may be due to a poor Bluetooth connection. To improve performance, try repositioning the Proxmark3 so the glass face is directed toward the host. From ecd709494abf090a3bbd9a9014a806079641bb0a Mon Sep 17 00:00:00 2001 From: Iceman Date: Tue, 19 May 2020 10:13:19 +0200 Subject: [PATCH 259/632] Update bt_manual_v10.md --- doc/bt_manual_v10.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/bt_manual_v10.md b/doc/bt_manual_v10.md index b091ef40b..e474c0ec7 100644 --- a/doc/bt_manual_v10.md +++ b/doc/bt_manual_v10.md @@ -310,7 +310,7 @@ Settings of the Blue Shark add-on and of the white dongle: If you bought your Bluetooth adapter dongle somewhere else, make sure to set the baud rate to 115200 `AT+BAUD8`, the name `AT+NAMEPM3_RDV4.0` and PIN `AT+PIN1234` correctly. -### 6.1 UART and LED behavior +### 6.2 UART and LED behavior ^[Top](#top) Bluetooth is connected to Proxmark3 RDV4.0 via UART. The USB and UART interfaces of RDV4.0 can coexist without conflict, and no special switching is required. @@ -318,18 +318,18 @@ Bluetooth is connected to Proxmark3 RDV4.0 via UART. The USB and UART interfaces The following link has helpful notes on UART usage and baud rates: https://github.com/RfidResearchGroup/proxmark3/blob/master/doc/uart_notes.md -### 6.2 Disassembly +### 6.3 Disassembly ^[Top](#top) There is a heat conductive double-sided tape inside the add-on, which has strong adhesive force. Therefore, if add-on needs to be removed, it needs to be pulled out from the heat sink end with greater efforts. Each disassembly will reduce the viscidity of double-sided tape. When double-sided tape is well protected, it will not affect the second use. Thermal conductivity will be slightly worse and will therefore have a direct impact on the thermal performance of the heat sink. -### 6.3 Battery charging +### 6.4 Battery charging ^[Top](#top) The battery charging circuit is turned on by default. Any time a USB cable is inserted, the battery will be automatically charged. The red LED will remain bright when charging. The red LED will be extinguished when charging is completed. -### 6.4 Get better signals +### 6.5 Get better signals ^[Top](#top) For the better heat dissipation, we have used a cast metal enclosure for the add-on. As a result Bluetooth wireless signals are sacrificed. For example, if the back of add-on is facing the Bluetooth host, the signal is very bad and the distance will be reduced. The best signal strength can be obtained when the front glass faces the Bluetooth host. From 0112346dac818b5cfc59d22a6a069951daedd342 Mon Sep 17 00:00:00 2001 From: Iceman Date: Tue, 19 May 2020 10:14:39 +0200 Subject: [PATCH 260/632] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 02eb139b2..441b060c2 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ | Notes ||| | ------------------- |:-------------------:| -------------------:| |[Notes on UART](/doc/uart_notes.md)|[Notes on Termux / Android](/doc/termux_notes.md)|[Notes on paths](/doc/path_notes.md)| -|[Notes on frame format](/doc/new_frame_format.md)|[Notes on tracedata / wireshark](/doc/trace_notes.md)|[Notes on EMV](/doc/emv_notes.md)| +|[Notes on frame format](/doc/new_frame_format.md)|[Notes on tracelog / wireshark](/doc/trace_notes.md)|[Notes on EMV](/doc/emv_notes.md)| |[Notes on external flash](/doc/ext_flash_notes.md)|[Notes on loclass](/doc/loclass_notes.md)|[Notes on Coverity Scan Config & Run](/doc/md/Development/Coverity-Scan-Config-%26-Run.md)| |[Notes on file formats used with Proxmark3](/doc/extensions_notes.md)||| |[Developing standalone mode](/armsrc/Standalone/readme.md)|[Wiki about standalone mode](https://github.com/RfidResearchGroup/proxmark3/wiki/Standalone-mode)|| From 7e213fcf43584525ae2b87f555d92fdafa547528 Mon Sep 17 00:00:00 2001 From: Iceman Date: Tue, 19 May 2020 10:15:43 +0200 Subject: [PATCH 261/632] Update trace_notes.md --- doc/trace_notes.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/trace_notes.md b/doc/trace_notes.md index 84a692930..ccf9a5e5e 100644 --- a/doc/trace_notes.md +++ b/doc/trace_notes.md @@ -1,4 +1,5 @@ # Notes about the tracelog + ## Table of Contents * [Command](#trace-command) @@ -7,12 +8,14 @@ ## Trace command +^[Top](#top) The `trace` command lists the data exchange by the proxmark3 and a tag or a reader in human readable form. With `trace list` a table is shown which gives timing information, the src of the data bytes, the transmitted/received bytes itself, a check if the CRC was correct and some decoding of the command. ### Timing +^[Top](#top) The Start and the End coloumn lists timestamps when the transmission of the shown data started (time of first bit) and when it ended (end of last modulation). @@ -29,22 +32,28 @@ The unit for this time information depends on the protocol in use: By specifing the option ```f``` (e.g. ```trace list 14a f```) the frame delay times are shown. (So you don't have to do the math by your own). ### Sources +^[Top](#top) If the data is marked as a response the source is shown as Tag. Otherwise it is marked as Reader (Rdr). ### Data +^[Top](#top) This coloumn show the raw bytes trasmitted over the air. With option ```c``` CRC bytes are marked in square brackets. ### CRC +^[Top](#top) Marks if the transmitted CRC matches with the calculated CRC. ### Annotation +^[Top](#top) Annotations provide a rough decoding of the transmitted data. For ISO14443A a more detailed decoding is available with Wireshark (s. next chapter) ## Tracelog format +^[Top](#top) + The binary format for the dynamic tracelog is as following. ``` @@ -73,6 +82,7 @@ typedef struct { ``` ## Trace and Wireshark +^[Top](#top) To get a more detailed explanation of the transmitted data for ISO14443A traces the output can be converted to a pcapng file to read it with [Wireshark](https://www.wireshark.org/). From 2adace964de02ee0281d2524e889dafefcb20b13 Mon Sep 17 00:00:00 2001 From: Iceman Date: Tue, 19 May 2020 10:16:20 +0200 Subject: [PATCH 262/632] Update trace_notes.md --- doc/trace_notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/trace_notes.md b/doc/trace_notes.md index ccf9a5e5e..a95285518 100644 --- a/doc/trace_notes.md +++ b/doc/trace_notes.md @@ -1,5 +1,5 @@ -# Notes about the tracelog +# Notes about the tracelog ## Table of Contents * [Command](#trace-command) From db416483421d168541ec34307929450f824bbfcc Mon Sep 17 00:00:00 2001 From: Iceman Date: Tue, 19 May 2020 10:17:46 +0200 Subject: [PATCH 263/632] Update cheatsheet.md --- doc/cheatsheet.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/cheatsheet.md b/doc/cheatsheet.md index 74a061b10..0ae47b68c 100644 --- a/doc/cheatsheet.md +++ b/doc/cheatsheet.md @@ -1,5 +1,5 @@ -# Command Cheat Sheet +# Command Cheat Sheet |Generic|Low Frequence 125 kHz|High Frequence 13.56 MHz| |---|---|---| From f7534f412081631faf0ab1a174373674d7e1122e Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 19 May 2020 14:00:45 +0200 Subject: [PATCH 264/632] try to update build status logo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 441b060c2..1c4cdaf83 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ | Releases | Linux & OSX CI | Windows CI | Coverity | | ------------------- |:-------------------:| -------------------:| -------------------:| -| [![Latest release](https://img.shields.io/github/release/RfidResearchGroup/proxmark3.svg)](https://github.com/RfidResearchGroup/proxmark3/releases/latest) | [![Build status](https://travis-ci.org/RfidResearchGroup/proxmark3.svg?branch=master)](https://travis-ci.org/RfidResearchGroup/proxmark3) | [![Build status](https://ci.appveyor.com/api/projects/status/b4gwrhq3nc876cuu/branch/master?svg=true)](https://ci.appveyor.com/project/RfidResearchGroup/proxmark3/branch/master) | [![Coverity Status](https://scan.coverity.com/projects/19334/badge.svg)](https://scan.coverity.com/projects/proxmark3-rrg-iceman-repo)| +| [![Latest release](https://img.shields.io/github/release/RfidResearchGroup/proxmark3.svg)](https://github.com/RfidResearchGroup/proxmark3/releases/latest) | [![Build status](https://api.travis-ci.org/RfidResearchGroup/proxmark3.svg?branch=master)](https://travis-ci.org/RfidResearchGroup/proxmark3) | [![Build status](https://ci.appveyor.com/api/projects/status/b4gwrhq3nc876cuu/branch/master?svg=true)](https://ci.appveyor.com/project/RfidResearchGroup/proxmark3/branch/master) | [![Coverity Status](https://scan.coverity.com/projects/19334/badge.svg)](https://scan.coverity.com/projects/proxmark3-rrg-iceman-repo)| From e8f723620ee5f3b76d507947cb657653d122cbac Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 19 May 2020 16:26:08 +0200 Subject: [PATCH 265/632] Fix issue #736, still other errors on armsrc to solve --- common_arm/Makefile.common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common_arm/Makefile.common b/common_arm/Makefile.common index 95b419e8e..81f2b0131 100644 --- a/common_arm/Makefile.common +++ b/common_arm/Makefile.common @@ -39,7 +39,7 @@ VPATH = . ../common_arm ../common ../common/crapto1 ../common/mbedtls ../common/ INCLUDES = ../include/proxmark3_arm.h ../include/at91sam7s512.h ../include/config_gpio.h ../include/pm3_cmd.h -ARMCFLAGS = -mthumb-interwork +ARMCFLAGS = -mthumb-interwork -fno-builtin DEFCFLAGS = -Wall -Werror -Os -pedantic -fstrict-aliasing -pipe # Some more warnings we want as errors: From fbaf634779f91db7cd0ba0336c29fa78c24814d7 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 19 May 2020 16:33:55 +0200 Subject: [PATCH 266/632] legicrf & gcc 10: Remove inline warning --- armsrc/legicrf.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/armsrc/legicrf.c b/armsrc/legicrf.c index 474d0df84..14298a5f1 100644 --- a/armsrc/legicrf.c +++ b/armsrc/legicrf.c @@ -113,7 +113,13 @@ static inline int32_t sample_power(void) { // // Note: The demodulator would be drifting (18.9us * 5 != 100us), rx_frame // has a delay loop that aligns rx_bit calls to the TAG tx timeslots. + +// Note: inlining this function would fail with -Os +#ifdef __OPTIMIZE_SIZE__ +static bool rx_bit(void) { +#else static inline bool rx_bit(void) { +#endif int32_t power; for (size_t i = 0; i < 5; ++i) { From 3e7512a5d5405204aaf899650e92170af4604730 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 19 May 2020 17:05:43 +0200 Subject: [PATCH 267/632] armsrc: clarify static vars vs global vars --- armsrc/appmain.c | 14 +++++++------- armsrc/appmain.h | 5 ++--- armsrc/cmd.c | 34 +++++++++++++++++----------------- armsrc/cmd.h | 8 ++++---- armsrc/dbprint.h | 36 ++++++++++++++++++------------------ armsrc/felica.c | 2 +- armsrc/hitag2.c | 22 +++++++++++----------- armsrc/hitag2crack.c | 6 +++--- armsrc/hitagS.c | 3 +-- armsrc/iclass.c | 4 ++-- armsrc/iso14443a.c | 10 +++++----- armsrc/iso14443b.c | 4 ++-- armsrc/lfadc.c | 19 ++++++++++++------- armsrc/lfadc.h | 2 +- armsrc/lfops.h | 4 ---- armsrc/lfsampling.c | 2 +- armsrc/mifaredesfire.c | 2 +- armsrc/printf.c | 2 +- armsrc/usart.c | 20 ++++++++++---------- armsrc/usart.h | 4 ++-- 20 files changed, 101 insertions(+), 102 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 7cb974cec..87b3dd0df 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -73,7 +73,7 @@ int ToSendMax = -1; static int ToSendBit; struct common_area common_area __attribute__((section(".commonarea"))); int button_status = BUTTON_NO_CLICK; -bool allow_send_wtx = false; +static bool allow_send_wtx = false; inline void send_wtx(uint16_t wtx) { if (allow_send_wtx) { @@ -385,12 +385,12 @@ static void SendStatus(void) { static void SendCapabilities(void) { capabilities_t capabilities; capabilities.version = CAPABILITIES_VERSION; - capabilities.via_fpc = reply_via_fpc; - capabilities.via_usb = reply_via_usb; + capabilities.via_fpc = g_reply_via_fpc; + capabilities.via_usb = g_reply_via_usb; capabilities.baudrate = 0; // no real baudrate for USB-CDC #ifdef WITH_FPC_USART - if (reply_via_fpc) - capabilities.baudrate = usart_baudrate; + if (g_reply_via_fpc) + capabilities.baudrate = g_usart_baudrate; #endif #ifdef WITH_FLASH @@ -701,8 +701,8 @@ static void PacketReceived(PacketCommandNG *packet) { case CMD_BREAK_LOOP: break; case CMD_QUIT_SESSION: { - reply_via_fpc = false; - reply_via_usb = false; + g_reply_via_fpc = false; + g_reply_via_usb = false; break; } // emulator diff --git a/armsrc/appmain.h b/armsrc/appmain.h index 8baff4db1..5aece8388 100644 --- a/armsrc/appmain.h +++ b/armsrc/appmain.h @@ -13,9 +13,8 @@ #include "common.h" -extern int rsamples; // = 0; -extern uint8_t trigger; -extern bool allow_send_wtx; +extern int g_rsamples; // = 0; +extern uint8_t g_trigger; // ADC Vref = 3300mV, and an (10M+1M):1M voltage divider on the HF input can measure voltages up to 36300 mV #define MAX_ADC_HF_VOLTAGE 36300 diff --git a/armsrc/cmd.c b/armsrc/cmd.c index 17534cbf1..b0dc4aef8 100644 --- a/armsrc/cmd.c +++ b/armsrc/cmd.c @@ -36,11 +36,11 @@ #include "string.h" // Flags to tell where to add CRC on sent replies -bool reply_with_crc_on_usb = false; -bool reply_with_crc_on_fpc = true; +bool g_reply_with_crc_on_usb = false; +bool g_reply_with_crc_on_fpc = true; // "Session" flag, to tell via which interface next msgs should be sent: USB or FPC USART -bool reply_via_fpc = false; -bool reply_via_usb = false; +bool g_reply_via_fpc = false; +bool g_reply_via_usb = false; int reply_old(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *data, size_t len) { PacketResponseOLD txcmd = {CMD_UNKNOWN, {0, 0, 0}, {{0}}}; @@ -68,11 +68,11 @@ int reply_old(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *d int resultusb = PM3_EUNDEF; // Send frame and make sure all bytes are transmitted - if (reply_via_usb) { + if (g_reply_via_usb) { resultusb = usb_write((uint8_t *)&txcmd, sizeof(PacketResponseOLD)); } - if (reply_via_fpc) { + if (g_reply_via_fpc) { #ifdef WITH_FPC_USART_HOST resultfpc = usart_writebuffer_sync((uint8_t *)&txcmd, sizeof(PacketResponseOLD)); #else @@ -80,9 +80,9 @@ int reply_old(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *d #endif } // we got two results, let's prioritize the faulty one and USB over FPC. - if (reply_via_usb && (resultusb != PM3_SUCCESS)) return resultusb; + if (g_reply_via_usb && (resultusb != PM3_SUCCESS)) return resultusb; #ifdef WITH_FPC_USART_HOST - if (reply_via_fpc && (resultfpc != PM3_SUCCESS)) return resultfpc; + if (g_reply_via_fpc && (resultfpc != PM3_SUCCESS)) return resultfpc; #endif return PM3_SUCCESS; } @@ -112,7 +112,7 @@ static int reply_ng_internal(uint16_t cmd, int16_t status, uint8_t *data, size_t PacketResponseNGPostamble *tx_post = (PacketResponseNGPostamble *)((uint8_t *)&txBufferNG + sizeof(PacketResponseNGPreamble) + len); // Note: if we send to both FPC & USB, we'll set CRC for both if any of them require CRC - if ((reply_via_fpc && reply_with_crc_on_fpc) || ((reply_via_usb) && reply_with_crc_on_usb)) { + if ((g_reply_via_fpc && g_reply_with_crc_on_fpc) || ((g_reply_via_usb) && g_reply_with_crc_on_usb)) { uint8_t first, second; compute_crc(CRC_14443_A, (uint8_t *)&txBufferNG, sizeof(PacketResponseNGPreamble) + len, &first, &second); tx_post->crc = (first << 8) + second; @@ -127,10 +127,10 @@ static int reply_ng_internal(uint16_t cmd, int16_t status, uint8_t *data, size_t int resultusb = PM3_EUNDEF; // Send frame and make sure all bytes are transmitted - if (reply_via_usb) { + if (g_reply_via_usb) { resultusb = usb_write((uint8_t *)&txBufferNG, txBufferNGLen); } - if (reply_via_fpc) { + if (g_reply_via_fpc) { #ifdef WITH_FPC_USART_HOST resultfpc = usart_writebuffer_sync((uint8_t *)&txBufferNG, txBufferNGLen); #else @@ -138,9 +138,9 @@ static int reply_ng_internal(uint16_t cmd, int16_t status, uint8_t *data, size_t #endif } // we got two results, let's prioritize the faulty one and USB over FPC. - if (reply_via_usb && (resultusb != PM3_SUCCESS)) return resultusb; + if (g_reply_via_usb && (resultusb != PM3_SUCCESS)) return resultusb; #ifdef WITH_FPC_USART_HOST - if (reply_via_fpc && (resultfpc != PM3_SUCCESS)) return resultfpc; + if (g_reply_via_fpc && (resultfpc != PM3_SUCCESS)) return resultfpc; #endif return PM3_SUCCESS; } @@ -216,8 +216,8 @@ static int receive_ng_internal(PacketCommandNG *rx, uint32_t read_ng(uint8_t *da if ((first << 8) + second != rx->crc) return PM3_EIO; } - reply_via_usb = usb; - reply_via_fpc = fpc; + g_reply_via_usb = usb; + g_reply_via_fpc = fpc; } else { // Old style command PacketCommandOLD rx_old; memcpy(&rx_old, &rx_raw.pre, sizeof(PacketCommandNGPreamble)); @@ -225,8 +225,8 @@ static int receive_ng_internal(PacketCommandNG *rx, uint32_t read_ng(uint8_t *da if (bytes != sizeof(PacketCommandOLD) - sizeof(PacketCommandNGPreamble)) return PM3_EIO; - reply_via_usb = usb; - reply_via_fpc = fpc; + g_reply_via_usb = usb; + g_reply_via_fpc = fpc; rx->ng = false; rx->magic = 0; rx->crc = 0; diff --git a/armsrc/cmd.h b/armsrc/cmd.h index e04f397a3..f4ae95ab1 100644 --- a/armsrc/cmd.h +++ b/armsrc/cmd.h @@ -37,11 +37,11 @@ #include "pm3_cmd.h" // Flags to tell where to add CRC on sent replies -extern bool reply_with_crc_on_usb; -extern bool reply_with_crc_on_fpc; +extern bool g_reply_with_crc_on_usb; +extern bool g_reply_with_crc_on_fpc; // "Session" flag, to tell via which interface next msgs should be sent: USB and/or FPC USART -extern bool reply_via_fpc; -extern bool reply_via_usb; +extern bool g_reply_via_fpc; +extern bool g_reply_via_usb; int reply_old(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *data, size_t len); int reply_ng(uint16_t cmd, int16_t status, uint8_t *data, size_t len); diff --git a/armsrc/dbprint.h b/armsrc/dbprint.h index 2a8444ef3..993e06289 100644 --- a/armsrc/dbprint.h +++ b/armsrc/dbprint.h @@ -15,31 +15,31 @@ #include "ansi.h" #define Dbprintf_usb(...) {\ - bool tmpfpc = reply_via_fpc;\ - bool tmpusb = reply_via_usb;\ - reply_via_fpc = false;\ - reply_via_usb = true;\ + bool tmpfpc = g_reply_via_fpc;\ + bool tmpusb = g_reply_via_usb;\ + g_reply_via_fpc = false;\ + g_reply_via_usb = true;\ Dbprintf(__VA_ARGS__);\ - reply_via_fpc = tmpfpc;\ - reply_via_usb = tmpusb;} + g_reply_via_fpc = tmpfpc;\ + g_reply_via_usb = tmpusb;} #define Dbprintf_fpc(...) {\ - bool tmpfpc = reply_via_fpc;\ - bool tmpusb = reply_via_usb;\ - reply_via_fpc = true;\ - reply_via_usb = false;\ + bool tmpfpc = g_reply_via_fpc;\ + bool tmpusb = g_reply_via_usb;\ + g_reply_via_fpc = true;\ + g_reply_via_usb = false;\ Dbprintf(__VA_ARGS__);\ - reply_via_fpc = tmpfpc;\ - reply_via_usb = tmpusb;} + g_reply_via_fpc = tmpfpc;\ + g_reply_via_usb = tmpusb;} #define Dbprintf_all(...) {\ - bool tmpfpc = reply_via_fpc;\ - bool tmpusb = reply_via_usb;\ - reply_via_fpc = true;\ - reply_via_usb = true;\ + bool tmpfpc = g_reply_via_fpc;\ + bool tmpusb = g_reply_via_usb;\ + g_reply_via_fpc = true;\ + g_reply_via_usb = true;\ Dbprintf(__VA_ARGS__);\ - reply_via_fpc = tmpfpc;\ - reply_via_usb = tmpusb;} + g_reply_via_fpc = tmpfpc;\ + g_reply_via_usb = tmpusb;} void DbpString(const char *str); diff --git a/armsrc/felica.c b/armsrc/felica.c index e72051bdc..f8375f0cc 100644 --- a/armsrc/felica.c +++ b/armsrc/felica.c @@ -35,7 +35,7 @@ static uint32_t felica_lasttime_prox2air_start; static void iso18092_setup(uint8_t fpga_minor_mode); static uint8_t felica_select_card(felica_card_select_t *card); static void TransmitFor18092_AsReader(uint8_t *frame, int len, uint32_t *timing, uint8_t power, uint8_t highspeed); -bool WaitForFelicaReply(uint16_t maxbytes); +static bool WaitForFelicaReply(uint16_t maxbytes); static void iso18092_set_timeout(uint32_t timeout) { felica_timeout = timeout + (DELAY_AIR2ARM_AS_READER + DELAY_ARM2AIR_AS_READER) / (16 * 8) + 2; diff --git a/armsrc/hitag2.c b/armsrc/hitag2.c index 03aedc7a1..c22b04e70 100644 --- a/armsrc/hitag2.c +++ b/armsrc/hitag2.c @@ -48,8 +48,8 @@ static bool bCrypto; // Is in auth stage static bool bAuthenticating; // Successful password auth -bool bSelecting; -bool bCollision; +static bool bSelecting; +static bool bCollision; static bool bPwd; static bool bSuccessful; @@ -89,14 +89,14 @@ static uint8_t password[4]; static uint8_t NrAr[8]; static uint8_t key[8]; static uint8_t writedata[4]; -uint8_t logdata_0[4], logdata_1[4]; -uint8_t nonce[4]; -bool key_no; +static uint8_t logdata_0[4], logdata_1[4]; +static uint8_t nonce[4]; +static bool key_no; static uint64_t cipher_state; -int16_t blocknr; -size_t flipped_bit = 0; -uint32_t byte_value = 0; +static int16_t blocknr; +static size_t flipped_bit = 0; +static uint32_t byte_value = 0; static int hitag2_reset(void) { tag.state = TAG_STATE_RESET; @@ -997,7 +997,7 @@ void SniffHitag2(void) { lf_init(false, false); - logging = false; + g_logging = false; size_t periods = 0; uint8_t periods_bytes[4]; @@ -1031,8 +1031,8 @@ void SniffHitag2(void) { // Test if we detected the first reader modulation edge if (periods != 0) { - if (logging == false) { - logging = true; + if (g_logging == false) { + g_logging = true; LED_D_ON(); } } diff --git a/armsrc/hitag2crack.c b/armsrc/hitag2crack.c index faf530897..a79c166d6 100644 --- a/armsrc/hitag2crack.c +++ b/armsrc/hitag2crack.c @@ -17,9 +17,9 @@ #define READP0CMD "1100000111" #define ERROR_RESPONSE "F402889C" -extern const uint8_t Hitag2Sync[5]; -extern bool CryptoActive; -extern Hitag_State Hitag_Crypto_State; +static const uint8_t Hitag2Sync[5]; +static bool CryptoActive; +static Hitag_State Hitag_Crypto_State; // hitag2_crack implements the first crack algorithm described in the paper, // Gone In 360 Seconds by Verdult, Garcia and Balasch. diff --git a/armsrc/hitagS.c b/armsrc/hitagS.c index 81ed771b4..10c889fa7 100644 --- a/armsrc/hitagS.c +++ b/armsrc/hitagS.c @@ -48,8 +48,7 @@ static int temp2 = 0; static int sof_bits; // number of start-of-frame bits static uint8_t pwdh0, pwdl0, pwdl1; // password bytes static uint32_t rnd = 0x74124485; // randomnumber -size_t blocknr; -bool end = false; +static bool end = false; //#define SENDBIT_TEST /* array index 3 2 1 0 // bytes in sim.bin file are 0 1 2 3 diff --git a/armsrc/iclass.c b/armsrc/iclass.c index cca922a29..1e9bb671f 100644 --- a/armsrc/iclass.c +++ b/armsrc/iclass.c @@ -1802,7 +1802,7 @@ static void ReaderTransmitIClass_ext(uint8_t *frame, int len, int wait) { TransmitIClassCommand(ToSend, ToSendMax, &wait); LED_A_ON(); - LogTrace(frame, len, rsamples, rsamples, NULL, true); + LogTrace(frame, len, g_rsamples, g_rsamples, NULL, true); } static void ReaderTransmitIClass(uint8_t *frame, int len) { ReaderTransmitIClass_ext(frame, len, 330); @@ -1867,7 +1867,7 @@ static int ReaderReceiveIClass(uint8_t *receivedAnswer) { if (GetIClassAnswer(receivedAnswer, 0, NULL) == false) return 0; - LogTrace(receivedAnswer, Demod.len, rsamples, rsamples, NULL, false); + LogTrace(receivedAnswer, Demod.len, g_rsamples, g_rsamples, NULL, false); return Demod.len; } diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 1d2ed655a..499932f0a 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -31,9 +31,9 @@ static uint32_t iso14a_timeout; // if iso14443a not active - transmit/receive dont try to execute static bool hf_field_active = false; -uint8_t colpos = 0; -int rsamples = 0; -uint8_t trigger = 0; +static uint8_t colpos = 0; +int g_rsamples = 0; +uint8_t g_trigger = 0; // the block number for the ISO14443-4 PCB static uint8_t iso14_pcb_blocknum = 0; @@ -123,7 +123,7 @@ static uint32_t LastProxToAirDuration; #define SEC_Z 0xc0 void iso14a_set_trigger(bool enable) { - trigger = enable; + g_trigger = enable; } void iso14a_set_timeout(uint32_t timeout) { @@ -2145,7 +2145,7 @@ void ReaderTransmitBitsPar(uint8_t *frame, uint16_t bits, uint8_t *par, uint32_t CodeIso14443aBitsAsReaderPar(frame, bits, par); // Send command to tag TransmitFor14443a(ToSend, ToSendMax, timing); - if (trigger) LED_A_ON(); + if (g_trigger) LED_A_ON(); LogTrace(frame, nbytes(bits), (LastTimeProxToAirStart << 4) + DELAY_ARM2AIR_AS_READER, ((LastTimeProxToAirStart + LastProxToAirDuration) << 4) + DELAY_ARM2AIR_AS_READER, par, true); } diff --git a/armsrc/iso14443b.c b/armsrc/iso14443b.c index 7aa3e981e..b03e84912 100644 --- a/armsrc/iso14443b.c +++ b/armsrc/iso14443b.c @@ -1150,7 +1150,7 @@ static void CodeAndTransmit14443bAsReader(const uint8_t *cmd, int len) { TransmitFor14443b_AsReader(); - if (trigger) LED_A_ON(); + if (g_trigger) LED_A_ON(); LogTrace(cmd, len, time_start, GetCountSspClk() - time_start, NULL, true); } @@ -1578,7 +1578,7 @@ void RAMFUNC SniffIso14443b(void) { } static void iso14b_set_trigger(bool enable) { - trigger = enable; + g_trigger = enable; } /* diff --git a/armsrc/lfadc.c b/armsrc/lfadc.c index 461a74783..078745dd8 100644 --- a/armsrc/lfadc.c +++ b/armsrc/lfadc.c @@ -25,13 +25,18 @@ // T0 = timer/carrier = 1500kHz/125kHz = 1500000/125000 = 6 //#define HITAG_T0 3 +////////////////////////////////////////////////////////////////////////////// +// Exported global variables +////////////////////////////////////////////////////////////////////////////// + +bool g_logging = true; + ////////////////////////////////////////////////////////////////////////////// // Global variables ////////////////////////////////////////////////////////////////////////////// -bool rising_edge = false; -bool logging = true; -bool reader_mode = false; +static bool rising_edge = false; +static bool reader_mode = false; ////////////////////////////////////////////////////////////////////////////// // Auxiliary functions @@ -90,7 +95,7 @@ static size_t lf_count_edge_periods_ex(size_t max, bool wait, bool detect_gap) { adc_val = AT91C_BASE_SSC->SSC_RHR; periods++; - if (logging) logSampleSimple(adc_val); + if (g_logging) logSampleSimple(adc_val); // Only test field changes if state of adc values matter if (wait == false) { @@ -120,7 +125,7 @@ static size_t lf_count_edge_periods_ex(size_t max, bool wait, bool detect_gap) { if (periods >= max) return 0; } } - if (logging) logSampleSimple(0xFF); + if (g_logging) logSampleSimple(0xFF); return 0; } @@ -223,7 +228,7 @@ void lf_init(bool reader, bool simulate) { uint32_t bufsize = 10000; // use malloc - if (logging) initSampleBufferEx(&bufsize, true); + if (g_logging) initSampleBufferEx(&bufsize, true); lf_sample_mean(); } @@ -269,7 +274,7 @@ size_t lf_detect_field_drop(size_t max) { periods++; volatile uint8_t adc_val = AT91C_BASE_SSC->SSC_RHR; - if (logging) logSampleSimple(adc_val); + if (g_logging) logSampleSimple(adc_val); if (adc_val == 0) { rising_edge = false; diff --git a/armsrc/lfadc.h b/armsrc/lfadc.h index 2238e2eb5..1c8a4211f 100644 --- a/armsrc/lfadc.h +++ b/armsrc/lfadc.h @@ -15,7 +15,7 @@ #include "util.h" #include "string.h" -extern bool logging; +extern bool g_logging; void lf_sample_mean(void); bool lf_test_periods(size_t expected, size_t count); diff --git a/armsrc/lfops.h b/armsrc/lfops.h index b697cffd1..eb31e54a6 100644 --- a/armsrc/lfops.h +++ b/armsrc/lfops.h @@ -15,10 +15,6 @@ #include "pm3_cmd.h" // struct -extern uint8_t decimation; -extern uint8_t bits_per_sample ; -extern bool averaging; - void AcquireRawAdcSamples125k(int divisor); void ModThenAcquireRawAdcSamples125k(uint32_t delay_off, uint32_t period_0, uint32_t period_1, uint8_t *command); void ReadTItag(void); diff --git a/armsrc/lfsampling.c b/armsrc/lfsampling.c index cddf9cbbc..feaa45b3d 100644 --- a/armsrc/lfsampling.c +++ b/armsrc/lfsampling.c @@ -27,7 +27,7 @@ Default LF config is set to: samples_to_skip = 0 verbose = YES */ -sample_config config = { 1, 8, 1, LF_DIVISOR_125, 0, 0, 1} ; +static sample_config config = { 1, 8, 1, LF_DIVISOR_125, 0, 0, 1} ; void printConfig(void) { uint32_t d = config.divisor; diff --git a/armsrc/mifaredesfire.c b/armsrc/mifaredesfire.c index 57235ba22..e96d6b3d9 100644 --- a/armsrc/mifaredesfire.c +++ b/armsrc/mifaredesfire.c @@ -25,7 +25,7 @@ #define RECEIVE_SIZE 64 // the block number for the ISO14443-4 PCB -uint8_t pcb_blocknum = 0; +static uint8_t pcb_blocknum = 0; // Deselect card by sending a s-block. the crc is precalced for speed static uint8_t deselect_cmd[] = {0xc2, 0xe0, 0xb4}; diff --git a/armsrc/printf.c b/armsrc/printf.c index 0dffbb037..2d18a9c53 100644 --- a/armsrc/printf.c +++ b/armsrc/printf.c @@ -47,7 +47,7 @@ typedef int ssize_t; #define NBBY 8 /* number of bits in a byte */ -char const hex2ascii_data[] = "0123456789abcdefghijklmnopqrstuvwxyz"; +static char const hex2ascii_data[] = "0123456789abcdefghijklmnopqrstuvwxyz"; #define hex2ascii(hex) (hex2ascii_data[hex]) #define toupper(c) ((c) - 0x20 * (((c) >= 'a') && ((c) <= 'z'))) diff --git a/armsrc/usart.c b/armsrc/usart.c index 2062c9441..203572f90 100644 --- a/armsrc/usart.c +++ b/armsrc/usart.c @@ -15,8 +15,8 @@ volatile AT91PS_USART pUS1 = AT91C_BASE_US1; volatile AT91PS_PIO pPIO = AT91C_BASE_PIOA; volatile AT91PS_PDC pPDC = AT91C_BASE_PDC_US1; -uint32_t usart_baudrate = 0; -uint8_t usart_parity = 0; +uint32_t g_usart_baudrate = 0; +uint8_t g_usart_parity = 0; /* void usart_close(void) { // Reset the USART mode @@ -41,8 +41,8 @@ void usart_close(void) { static uint8_t us_inbuf1[USART_BUFFLEN]; static uint8_t us_inbuf2[USART_BUFFLEN]; -uint8_t *usart_cur_inbuf = NULL; -uint16_t usart_cur_inbuf_off = 0; +static uint8_t *usart_cur_inbuf = NULL; +static uint16_t usart_cur_inbuf_off = 0; static uint8_t us_rxfifo[USART_FIFOLEN]; static size_t us_rxfifo_low = 0; static size_t us_rxfifo_high = 0; @@ -166,9 +166,9 @@ inline int usart_writebuffer_sync(uint8_t *data, size_t len) { void usart_init(uint32_t baudrate, uint8_t parity) { if (baudrate != 0) - usart_baudrate = baudrate; + g_usart_baudrate = baudrate; if ((parity == 'N') || (parity == 'O') || (parity == 'E')) - usart_parity = parity; + g_usart_parity = parity; // For a nice detailed sample, interrupt driven but still relevant. // See https://www.sparkfun.com/datasheets/DevTools/SAM7/at91sam7%20serial%20communications.pdf @@ -197,7 +197,7 @@ void usart_init(uint32_t baudrate, uint8_t parity) { AT91C_US_NBSTOP_1_BIT | // 1 stop bit AT91C_US_CHMODE_NORMAL; // channel mode: normal - switch (usart_parity) { + switch (g_usart_parity) { case 'N': mode |= AT91C_US_PAR_NONE; // parity: none break; @@ -227,9 +227,9 @@ void usart_init(uint32_t baudrate, uint8_t parity) { // OVER = 1, -yes we are oversampling // baudrate == selected clock/8/CD --> this is ours // - uint32_t brgr = MCK / (usart_baudrate << 3); - // doing fp = round((mck / (usart_baudrate << 3) - brgr) * 8) with integers: - uint32_t fp = ((16 * MCK / (usart_baudrate << 3) - 16 * brgr) + 1) / 2; + uint32_t brgr = MCK / (g_usart_baudrate << 3); + // doing fp = round((mck / (g_usart_baudrate << 3) - brgr) * 8) with integers: + uint32_t fp = ((16 * MCK / (g_usart_baudrate << 3) - 16 * brgr) + 1) / 2; pUS1->US_BRGR = (fp << 16) | brgr; diff --git a/armsrc/usart.h b/armsrc/usart.h index 01ca0d809..5a7dea38f 100644 --- a/armsrc/usart.h +++ b/armsrc/usart.h @@ -9,8 +9,8 @@ // Higher baudrates are pointless, only increasing overflow risk -extern uint32_t usart_baudrate; -extern uint8_t usart_parity; +extern uint32_t g_usart_baudrate; +extern uint8_t g_usart_parity; void usart_init(uint32_t baudrate, uint8_t parity); int usart_writebuffer_sync(uint8_t *data, size_t len); From 47634f555037a80266d5634bef7fc59e6501537b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 19 May 2020 17:15:07 +0200 Subject: [PATCH 268/632] change: remove inline directive in armsrc, since we are optimizing for size --- armsrc/desfire_crypto.c | 4 ++-- armsrc/legicrf.c | 13 ++----------- armsrc/legicrfsim.c | 10 +--------- armsrc/nprintf.c | 12 ++++++------ 4 files changed, 11 insertions(+), 28 deletions(-) diff --git a/armsrc/desfire_crypto.c b/armsrc/desfire_crypto.c index db543bbe6..cafa98de1 100644 --- a/armsrc/desfire_crypto.c +++ b/armsrc/desfire_crypto.c @@ -46,9 +46,9 @@ static mbedtls_des_context ctx; static mbedtls_des3_context ctx3; static mbedtls_aes_context actx; -static inline void update_key_schedules(desfirekey_t key); +static void update_key_schedules(desfirekey_t key); -static inline void update_key_schedules(desfirekey_t key) { +static void update_key_schedules(desfirekey_t key) { // DES_set_key ((DES_cblock *)key->data, &(key->ks1)); // DES_set_key ((DES_cblock *)(key->data + 8), &(key->ks2)); // if (T_3K3DES == key->type) { diff --git a/armsrc/legicrf.c b/armsrc/legicrf.c index 14298a5f1..21b0c0a42 100644 --- a/armsrc/legicrf.c +++ b/armsrc/legicrf.c @@ -64,8 +64,7 @@ static uint32_t last_frame_end; /* ts of last bit of previews rx or tx frame */ //----------------------------------------------------------------------------- // I/O interface abstraction (FPGA -> ARM) //----------------------------------------------------------------------------- - -static inline uint8_t rx_byte_from_fpga(void) { +static uint8_t rx_byte_from_fpga(void) { for (;;) { WDT_HIT(); @@ -93,11 +92,7 @@ static inline uint8_t rx_byte_from_fpga(void) { // Note: The SSC receiver is never synchronized the calculation may be performed // on a i/q pair from two subsequent correlations, but does not matter. // Note: inlining this function would fail with -Os -#ifdef __OPTIMIZE_SIZE__ static int32_t sample_power(void) { -#else -static inline int32_t sample_power(void) { -#endif int32_t q = (int8_t)rx_byte_from_fpga(); q = ABS(q); int32_t i = (int8_t)rx_byte_from_fpga(); @@ -115,11 +110,7 @@ static inline int32_t sample_power(void) { // has a delay loop that aligns rx_bit calls to the TAG tx timeslots. // Note: inlining this function would fail with -Os -#ifdef __OPTIMIZE_SIZE__ static bool rx_bit(void) { -#else -static inline bool rx_bit(void) { -#endif int32_t power; for (size_t i = 0; i < 5; ++i) { @@ -138,7 +129,7 @@ static inline bool rx_bit(void) { // be circumvented, but the adventage over bitbang would be little. //----------------------------------------------------------------------------- -static inline void tx_bit(bool bit) { +static void tx_bit(bool bit) { // insert pause LOW(GPIO_SSC_DOUT); last_frame_end += RWD_TIME_PAUSE; diff --git a/armsrc/legicrfsim.c b/armsrc/legicrfsim.c index e2b06ba9b..35eefc56c 100644 --- a/armsrc/legicrfsim.c +++ b/armsrc/legicrfsim.c @@ -66,11 +66,7 @@ static uint32_t last_frame_end; /* ts of last bit of previews rx or tx frame */ // Returns true if a pulse/pause is received within timeout // Note: inlining this function would fail with -Os -#ifdef __OPTIMIZE_SIZE__ static bool wait_for(bool value, const uint32_t timeout) { -#else -static inline bool wait_for(bool value, const uint32_t timeout) { -#endif while ((bool)(AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_DIN) != value) { if (GetCountSspClk() > timeout) { return false; @@ -88,7 +84,7 @@ static inline bool wait_for(bool value, const uint32_t timeout) { // - A bit length >80.2us is a 1 // - A bit length <80.2us is a 0 // - A bit length >148.6us is a code violation -static inline int8_t rx_bit(void) { +static int8_t rx_bit(void) { // backup ts for threshold calculation uint32_t bit_start = last_frame_end; @@ -132,11 +128,7 @@ static inline int8_t rx_bit(void) { // not mandatory but results in a cleaner signal. tx_frame will disable // the subcarrier when the frame is done. // Note: inlining this function would fail with -Os -#ifdef __OPTIMIZE_SIZE__ static void tx_bit(bool bit) { -#else -static inline void tx_bit(bool bit) { -#endif LED_C_ON(); if (bit) { diff --git a/armsrc/nprintf.c b/armsrc/nprintf.c index 645454b4e..1ce3842d3 100644 --- a/armsrc/nprintf.c +++ b/armsrc/nprintf.c @@ -127,7 +127,7 @@ typedef struct { // internal buffer output -static inline void _out_buffer(char character, void *buffer, size_t idx, size_t maxlen) { +static void _out_buffer(char character, void *buffer, size_t idx, size_t maxlen) { if (idx < maxlen) { ((char *)buffer)[idx] = character; } @@ -135,7 +135,7 @@ static inline void _out_buffer(char character, void *buffer, size_t idx, size_t // internal null output -static inline void _out_null(char character, void *buffer, size_t idx, size_t maxlen) { +static void _out_null(char character, void *buffer, size_t idx, size_t maxlen) { (void)character; (void)buffer; (void)idx; @@ -144,7 +144,7 @@ static inline void _out_null(char character, void *buffer, size_t idx, size_t ma // internal _putchar wrapper -static inline void _out_char(char character, void *buffer, size_t idx, size_t maxlen) { +static void _out_char(char character, void *buffer, size_t idx, size_t maxlen) { (void)buffer; (void)idx; (void)maxlen; @@ -155,7 +155,7 @@ static inline void _out_char(char character, void *buffer, size_t idx, size_t ma // internal output function wrapper -static inline void _out_fct(char character, void *buffer, size_t idx, size_t maxlen) { +static void _out_fct(char character, void *buffer, size_t idx, size_t maxlen) { (void)idx; (void)maxlen; if (character) { @@ -167,7 +167,7 @@ static inline void _out_fct(char character, void *buffer, size_t idx, size_t max // internal secure strlen // \return The length of the string (excluding the terminating 0) limited by 'maxsize' -static inline unsigned int _strnlen_s(const char *str, size_t maxsize) { +static unsigned int _strnlen_s(const char *str, size_t maxsize) { const char *s; for (s = str; *s && maxsize--; ++s); return (unsigned int)(s - str); @@ -176,7 +176,7 @@ static inline unsigned int _strnlen_s(const char *str, size_t maxsize) { // internal test if char is a digit (0-9) // \return true if char is a digit -static inline bool _is_digit(char ch) { +static bool _is_digit(char ch) { return (ch >= '0') && (ch <= '9'); } From 4d355192bf5a51829a651104e757f2954d2c12e5 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 19 May 2020 17:16:23 +0200 Subject: [PATCH 269/632] remove inline --- armsrc/Standalone/hf_colin.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/armsrc/Standalone/hf_colin.c b/armsrc/Standalone/hf_colin.c index 9752c66c3..d2075f38f 100644 --- a/armsrc/Standalone/hf_colin.c +++ b/armsrc/Standalone/hf_colin.c @@ -104,12 +104,7 @@ static const uint8_t is_hex[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -// Note: inlining this function would fail with -Os -#ifdef __OPTIMIZE_SIZE__ static uint64_t hex2i(const char *s) { -#else -static inline uint64_t hex2i(const char *s) { -#endif uint64_t val = 0; if (s == NULL || s[0] == 0) return 0; From 9c1cac905b02f2adcd0e3a5591dda2c9bddf2b3b Mon Sep 17 00:00:00 2001 From: FlUxIUS Date: Tue, 19 May 2020 17:23:46 +0200 Subject: [PATCH 270/632] Somes traces --- traces/hf_14a_reader.trace | Bin 0 -> 77 bytes traces/hf_14b_reader.trace | Bin 0 -> 38 bytes traces/hf_mdes_reader.trace | Bin 0 -> 105 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 traces/hf_14a_reader.trace create mode 100644 traces/hf_14b_reader.trace create mode 100644 traces/hf_mdes_reader.trace diff --git a/traces/hf_14a_reader.trace b/traces/hf_14a_reader.trace new file mode 100644 index 0000000000000000000000000000000000000000..6bf0ab7b6f37ebe555216a7c1dc43110a927f988 GIT binary patch literal 77 zcmWHPW?*>0%*YVL(5lS9;K0e$z{22g(Tss%0Vfl~WQB%S7X}6fan^P=2!{Xw literal 0 HcmV?d00001 diff --git a/traces/hf_mdes_reader.trace b/traces/hf_mdes_reader.trace new file mode 100644 index 0000000000000000000000000000000000000000..2410bedefa59046dfa959c8259462f35818871d3 GIT binary patch literal 105 zcmWHPW?*>0%*YVL(5lS9(7?gez{1RM(Tss%0Vfl~WQB%S7X}6fG1i8Kixw|oQMj1O zz@VVX$uPM9%#T0Y$-p|9f#CoTbA!U40*8ysf%=447#=hj7BjT&14>A-HLyf9FbSVy F004tW9cTam literal 0 HcmV?d00001 From b55681077633076e1453ca26758dbec58f0bdbb8 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 19 May 2020 17:25:50 +0200 Subject: [PATCH 271/632] armsrc: clarify static vars vs global vars, part 2 --- armsrc/Standalone/hf_colin.c | 16 ++++++++-------- armsrc/Standalone/hf_mattyrun.c | 18 +++++++++--------- armsrc/Standalone/hf_msdsal.c | 2 +- armsrc/Standalone/lf_em4100emul.c | 8 +++----- armsrc/Standalone/lf_em4100rswb.c | 12 ++++++------ armsrc/Standalone/lf_em4100rwc.c | 8 ++++---- armsrc/appmain.c | 4 +++- armsrc/iso14443a.c | 2 +- armsrc/lfadc.c | 4 ++-- armsrc/lfops.c | 8 ++++---- armsrc/mifarecmd.c | 6 +++--- armsrc/thinfilm.c | 2 +- 12 files changed, 45 insertions(+), 45 deletions(-) diff --git a/armsrc/Standalone/hf_colin.c b/armsrc/Standalone/hf_colin.c index d2075f38f..0656d1186 100644 --- a/armsrc/Standalone/hf_colin.c +++ b/armsrc/Standalone/hf_colin.c @@ -81,12 +81,12 @@ */ -uint8_t cjuid[10]; -uint32_t cjcuid; -iso14a_card_select_t p_card; -int currline; -int currfline; -int curlline; +static uint8_t cjuid[10]; +static uint32_t cjcuid; +static iso14a_card_select_t p_card; +static int currline; +static int currfline; +static int curlline; // TODO : Implement fast read of KEYS like in RFIdea // also http://ext.delaat.net/rp/2015-2016/p04/report.pdf @@ -162,7 +162,7 @@ static void scan_keys(const char *str, int len, uint64_t *user_data) { } } -MFC1KSchema Schemas[MAX_SCHEMAS]; +static MFC1KSchema Schemas[MAX_SCHEMAS]; /*MFC1KSchema Noralsy = { .name = "Noralsy", @@ -196,7 +196,7 @@ MFC1KSchema InfiHexact = {.name = "Infineon/Hexact", 0x8829da9daf76, 0x8829da9daf76, 0x8829da9daf76, 0x8829da9daf76}}; */ -int total_schemas = 0; +static int total_schemas = 0; static void add_schema(MFC1KSchema *p, MFC1KSchema a, int *schemas_counter) { if (*schemas_counter < MAX_SCHEMAS) { diff --git a/armsrc/Standalone/hf_mattyrun.c b/armsrc/Standalone/hf_mattyrun.c index ae81eb408..1ffa321a3 100644 --- a/armsrc/Standalone/hf_mattyrun.c +++ b/armsrc/Standalone/hf_mattyrun.c @@ -49,19 +49,19 @@ on a blank card. #include "mifaresim.h" // mifare1ksim #include "mifareutil.h" -uint8_t uid[10]; -uint32_t cuid; -iso14a_card_select_t p_card; +static uint8_t uid[10]; +static uint32_t cuid; +static iso14a_card_select_t p_card; /* Pseudo-configuration block. */ -bool printKeys = false; // Prints keys -bool transferToEml = true; // Transfer keys to emulator memory -bool ecfill = true; // Fill emulator memory with cards content. -bool simulation = true; // Simulates an exact copy of the target tag -bool fillFromEmulator = false; // Dump emulator memory. -uint8_t stKeyBlock = 20; // Set the quantity of keys in the block. +static bool printKeys = false; // Prints keys +static bool transferToEml = true; // Transfer keys to emulator memory +static bool ecfill = true; // Fill emulator memory with cards content. +static bool simulation = true; // Simulates an exact copy of the target tag +static bool fillFromEmulator = false; // Dump emulator memory. +static uint8_t stKeyBlock = 20; // Set the quantity of keys in the block. //----------------------------------------------------------------------------- // Matt's StandAlone mod. diff --git a/armsrc/Standalone/hf_msdsal.c b/armsrc/Standalone/hf_msdsal.c index e890818d2..e9f700a01 100644 --- a/armsrc/Standalone/hf_msdsal.c +++ b/armsrc/Standalone/hf_msdsal.c @@ -52,7 +52,7 @@ void ModInfo(void) { * technologies. Be brave enough to share your knowledge & inspire others. Salvador Mendoza. */ -uint8_t ppdol [255] = {0x80, 0xA8, 0x00, 0x00, 0x02, 0x83, 0x00}; // Default GET PROCESSING +static uint8_t ppdol [255] = {0x80, 0xA8, 0x00, 0x00, 0x02, 0x83, 0x00}; // Default GET PROCESSING static uint8_t treatPDOL(uint8_t *apdu) { //Generate GET PROCESSING uint8_t plen = 7; diff --git a/armsrc/Standalone/lf_em4100emul.c b/armsrc/Standalone/lf_em4100emul.c index 6ad2580a4..e6ac2f6ff 100644 --- a/armsrc/Standalone/lf_em4100emul.c +++ b/armsrc/Standalone/lf_em4100emul.c @@ -25,11 +25,9 @@ // low & high - array for storage IDs. Its length must be equal. // Predefined IDs must be stored in low[]. -// In high[] must be nulls -uint64_t low[] = {0x565A1140BE, 0x365A398149, 0x5555555555, 0xFFFFFFFFFF}; -uint32_t high[] = {0, 0, 0, 0}; -uint8_t *bba, slots_count; -int buflen; +static uint64_t low[] = {0x565A1140BE, 0x365A398149, 0x5555555555, 0xFFFFFFFFFF}; +static uint8_t *bba, slots_count; +static int buflen; void ModInfo(void) { DbpString(" LF EM4100 simulator standalone mode"); diff --git a/armsrc/Standalone/lf_em4100rswb.c b/armsrc/Standalone/lf_em4100rswb.c index dd9fafd6a..ac470ce29 100644 --- a/armsrc/Standalone/lf_em4100rswb.c +++ b/armsrc/Standalone/lf_em4100rswb.c @@ -68,16 +68,16 @@ // Predefined bruteforce speed // avg: 1s, 1.2s, 1.5s, 2s -int bruteforceSpeedCurrent = 1; -int bruteforceSpeed[] = {10, 12, 14, 16}; +static int bruteforceSpeedCurrent = 1; +static int bruteforceSpeed[] = {10, 12, 14, 16}; // low & high - array for storage IDs. Its length must be equal. // Predefined IDs must be stored in low[]. // In high[] must be nulls -uint64_t low[] = {0, 0, 0, 0}; -uint32_t high[] = {0, 0, 0, 0}; -uint8_t *bba; -int buflen; +static uint64_t low[] = {0, 0, 0, 0}; +static uint32_t high[] = {0, 0, 0, 0}; +static uint8_t *bba; +static int buflen; void ModInfo(void) { DbpString(" LF EM4100 read/sim/write/brute mode"); diff --git a/armsrc/Standalone/lf_em4100rwc.c b/armsrc/Standalone/lf_em4100rwc.c index ce96dd824..f69820513 100644 --- a/armsrc/Standalone/lf_em4100rwc.c +++ b/armsrc/Standalone/lf_em4100rwc.c @@ -39,10 +39,10 @@ // low & high - array for storage IDs. Its length must be equal. // Predefined IDs must be stored in low[]. // In high[] must be nulls -uint64_t low[] = {0x565AF781C7, 0x540053E4E2, 0x1234567890, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -uint32_t high[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -uint8_t *bba, slots_count; -int buflen; +static uint64_t low[] = {0x565AF781C7, 0x540053E4E2, 0x1234567890, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +static uint32_t high[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +static uint8_t *bba, slots_count; +static int buflen; void ModInfo(void) { DbpString(" LF EM4100 read/write/clone mode"); diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 87b3dd0df..fa9aaf0f6 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -70,9 +70,11 @@ #define TOSEND_BUFFER_SIZE (9*MAX_FRAME_SIZE + 1 + 1 + 2) // 8 data bits and 1 parity bit per payload byte, 1 correction bit, 1 SOC bit, 2 EOC bits uint8_t ToSend[TOSEND_BUFFER_SIZE]; int ToSendMax = -1; + + static int ToSendBit; struct common_area common_area __attribute__((section(".commonarea"))); -int button_status = BUTTON_NO_CLICK; +static int button_status = BUTTON_NO_CLICK; static bool allow_send_wtx = false; inline void send_wtx(uint16_t wtx) { diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 499932f0a..c39576c27 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -67,7 +67,7 @@ static uint8_t iso14_pcb_blocknum = 0; #define DELAY_ARM2AIR_AS_READER (4*16 + 8*16 + 8 + 8 + 1) // The FPGA will report its internal sending delay in -uint16_t FpgaSendQueueDelay; +static uint16_t FpgaSendQueueDelay; // the 5 first bits are the number of bits buffered in mod_sig_buf // the last three bits are the remaining ticks/2 after the mod_sig_buf shift #define DELAY_FPGA_QUEUE (FpgaSendQueueDelay<<1) diff --git a/armsrc/lfadc.c b/armsrc/lfadc.c index 078745dd8..cec945b20 100644 --- a/armsrc/lfadc.c +++ b/armsrc/lfadc.c @@ -51,8 +51,8 @@ bool lf_test_periods(size_t expected, size_t count) { ////////////////////////////////////////////////////////////////////////////// // Low frequency (LF) adc passthrough functionality ////////////////////////////////////////////////////////////////////////////// -uint8_t previous_adc_val = 0; -uint8_t adc_avg = 0; +static uint8_t previous_adc_val = 0; +static uint8_t adc_avg = 0; void lf_sample_mean(void) { uint8_t periods = 0; diff --git a/armsrc/lfops.c b/armsrc/lfops.c index 7eececdc9..9ef3a34a8 100644 --- a/armsrc/lfops.c +++ b/armsrc/lfops.c @@ -2289,10 +2289,10 @@ void WriteEM410x(uint32_t card, uint32_t id_hi, uint32_t id_lo) { #define FWD_CMD_READ 0x9 #define FWD_CMD_DISABLE 0x5 -uint8_t forwardLink_data[64]; //array of forwarded bits -uint8_t *forward_ptr; //ptr for forward message preparation -uint8_t fwd_bit_sz; //forwardlink bit counter -uint8_t *fwd_write_ptr; //forwardlink bit pointer +static uint8_t forwardLink_data[64]; //array of forwarded bits +static uint8_t *forward_ptr; //ptr for forward message preparation +static uint8_t fwd_bit_sz; //forwardlink bit counter +static uint8_t *fwd_write_ptr; //forwardlink bit pointer //==================================================================== // prepares command bits diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index 79efc8b9f..b98526726 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -2008,9 +2008,9 @@ out: // bit 6 - wipe tag. //----------------------------------------------------------------------------- // magic uid card generation 1 commands -uint8_t wupC1[] = { MIFARE_MAGICWUPC1 }; -uint8_t wupC2[] = { MIFARE_MAGICWUPC2 }; -uint8_t wipeC[] = { MIFARE_MAGICWIPEC }; +static uint8_t wupC1[] = { MIFARE_MAGICWUPC1 }; +static uint8_t wupC2[] = { MIFARE_MAGICWUPC2 }; +static uint8_t wipeC[] = { MIFARE_MAGICWIPEC }; void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain) { diff --git a/armsrc/thinfilm.c b/armsrc/thinfilm.c index d84c2711a..a77a70744 100644 --- a/armsrc/thinfilm.c +++ b/armsrc/thinfilm.c @@ -49,7 +49,7 @@ void ReadThinFilm(void) { #define SEC_D 0xf0 #define SEC_E 0x0f #define SEC_F 0x00 -uint16_t FpgaSendQueueDelay; +static uint16_t FpgaSendQueueDelay; static uint16_t ReadReaderField(void) { #if defined RDV4 From cb8d589fc4b5ec1a06a9a0d37a5ef029f779ee30 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 19 May 2020 17:43:13 +0200 Subject: [PATCH 272/632] armsrc: clarify static vars vs global vars, part 3 --- armsrc/Makefile | 2 +- armsrc/appmain.c | 6 +++--- armsrc/flashmem.c | 4 ++-- armsrc/flashmem.h | 2 -- armsrc/fpgaloader.c | 4 ++-- armsrc/i2c.c | 2 +- armsrc/iso14443a.c | 6 +++--- armsrc/lfsampling.c | 4 ++-- armsrc/mifaredesfire.c | 2 +- client/src/cmdflashmem.c | 2 -- common/legic_prng.c | 2 +- common/parity.c | 4 ++-- common_arm/usb_cdc.c | 6 +++--- common_fpga/fpga.h | 4 ++-- include/pmflash.h | 3 --- tools/fpga_compress/fpga_compress.c | 4 ++-- 16 files changed, 25 insertions(+), 32 deletions(-) diff --git a/armsrc/Makefile b/armsrc/Makefile index 16c6a7f9e..15cfaddfd 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -157,7 +157,7 @@ version.c: default_version.c $(OBJDIR)/fpga_version_info.o $(OBJDIR)/fpga_all.o $(info [-] GEN $@) $(Q)sh ../tools/mkversion.sh > $@ || perl ../tools/mkversion.pl > $@ || $(CP) $^ $@ -fpga_version_info.c: $(FPGA_BITSTREAMS) | $(FPGA_COMPRESSOR) +fpga_version_info.c: $(FPGA_BITSTREAMS) $(FPGA_COMPRESSOR) $(info [-] GEN $@) $(Q)$(FPGA_COMPRESSOR) -v $(filter %.bit,$^) $@ diff --git a/armsrc/appmain.c b/armsrc/appmain.c index fa9aaf0f6..40f8c0ad1 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -278,9 +278,9 @@ static void SendVersion(void) { strncat(VersionString, "\n [ FPGA ]\n ", sizeof(VersionString) - strlen(VersionString) - 1); - for (int i = 0; i < fpga_bitstream_num; i++) { - strncat(VersionString, fpga_version_information[i], sizeof(VersionString) - strlen(VersionString) - 1); - if (i < fpga_bitstream_num - 1) { + for (int i = 0; i < g_fpga_bitstream_num; i++) { + strncat(VersionString, g_fpga_version_information[i], sizeof(VersionString) - strlen(VersionString) - 1); + if (i < g_fpga_bitstream_num - 1) { strncat(VersionString, "\n ", sizeof(VersionString) - strlen(VersionString) - 1); } } diff --git a/armsrc/flashmem.c b/armsrc/flashmem.c index 80f20e105..66b4813e4 100644 --- a/armsrc/flashmem.c +++ b/armsrc/flashmem.c @@ -16,8 +16,8 @@ /// Calculates the value of the CSR DLYBCT field given the desired delay (in ns) #define SPI_DLYBCT(delay, masterClock) ((uint32_t) ((((masterClock) / 1000000) * (delay)) / 32000) << 24) - -uint32_t FLASHMEM_SPIBAUDRATE = FLASH_BAUD; +static uint32_t FLASHMEM_SPIBAUDRATE = FLASH_BAUD; +#define FASTFLASH (FLASHMEM_SPIBAUDRATE > FLASH_MINFAST) void FlashmemSetSpiBaudrate(uint32_t baudrate) { FLASHMEM_SPIBAUDRATE = baudrate; diff --git a/armsrc/flashmem.h b/armsrc/flashmem.h index e5a4e0459..54a101ea6 100644 --- a/armsrc/flashmem.h +++ b/armsrc/flashmem.h @@ -106,8 +106,6 @@ #define FLASH_FASTBAUD MCK #define FLASH_MINBAUD FLASH_FASTBAUD -#define FASTFLASH (FLASHMEM_SPIBAUDRATE > FLASH_MINFAST) - //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// void FlashmemSetSpiBaudrate(uint32_t baudrate); diff --git a/armsrc/fpgaloader.c b/armsrc/fpgaloader.c index a5ca3f6d1..196364d98 100644 --- a/armsrc/fpgaloader.c +++ b/armsrc/fpgaloader.c @@ -203,7 +203,7 @@ static int get_from_fpga_combined_stream(z_streamp compressed_fpga_stream, uint8 // 288 bytes from FPGA file 1, followed by 288 bytes from FGPA file 2, etc. //---------------------------------------------------------------------------- static int get_from_fpga_stream(int bitstream_version, z_streamp compressed_fpga_stream, uint8_t *output_buffer) { - while ((uncompressed_bytes_cnt / FPGA_INTERLEAVE_SIZE) % fpga_bitstream_num != (bitstream_version - 1)) { + while ((uncompressed_bytes_cnt / FPGA_INTERLEAVE_SIZE) % g_fpga_bitstream_num != (bitstream_version - 1)) { // skip undesired data belonging to other bitstream_versions get_from_fpga_combined_stream(compressed_fpga_stream, output_buffer); } @@ -509,7 +509,7 @@ void SetAdcMuxFor(uint32_t whichGpio) { void Fpga_print_status(void) { DbpString(_BLUE_("Currently loaded FPGA image")); - Dbprintf(" mode....................%s", fpga_version_information[downloaded_bitstream - 1]); + Dbprintf(" mode....................%s", g_fpga_version_information[downloaded_bitstream - 1]); } int FpgaGetCurrent(void) { diff --git a/armsrc/i2c.c b/armsrc/i2c.c index 4a3d0dc08..e3e84690e 100644 --- a/armsrc/i2c.c +++ b/armsrc/i2c.c @@ -32,7 +32,7 @@ #define I2C_ERROR "I2C_WaitAck Error" -volatile unsigned long c; +static volatile unsigned long c; // Direct use the loop to delay. 6 instructions loop, Masterclock 48MHz, // delay=1 is about 200kbps diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index c39576c27..a657dff35 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -184,7 +184,7 @@ static tUart14a Uart; // 0011 - a 2 tick wide pause, or a three tick wide pause shifted left // 0111 - a 2 tick wide pause shifted left // 1001 - a 2 tick wide pause shifted right -const bool Mod_Miller_LUT[] = { +static const bool Mod_Miller_LUT[] = { false, true, false, true, false, false, false, true, false, true, false, false, false, false, false, false }; @@ -351,11 +351,11 @@ RAMFUNC bool MillerDecoding(uint8_t bit, uint32_t non_real_time) { // 8 ticks modulated: A collision. Save the collision position and treat as Sequence D // Note 1: the bitstream may start at any time. We therefore need to sync. // Note 2: parameter offset is used to determine the position of the parity bits (required for the anticollision command only) -tDemod14a Demod; +static tDemod14a Demod; // Lookup-Table to decide if 4 raw bits are a modulation. // We accept three or four "1" in any position -const bool Mod_Manchester_LUT[] = { +static const bool Mod_Manchester_LUT[] = { false, false, false, false, false, false, false, true, false, false, false, true, false, true, true, true }; diff --git a/armsrc/lfsampling.c b/armsrc/lfsampling.c index feaa45b3d..6365a0967 100644 --- a/armsrc/lfsampling.c +++ b/armsrc/lfsampling.c @@ -100,10 +100,10 @@ static void pushBit(BitstreamOut *stream, uint8_t bit) { } // Holds bit packed struct of samples. -BitstreamOut data = {0, 0, 0}; +static BitstreamOut data = {0, 0, 0}; // internal struct to keep track of samples gathered -sampling_t samples = {0, 0, 0, 0}; +static sampling_t samples = {0, 0, 0, 0}; void initSampleBuffer(uint32_t *sample_size) { initSampleBufferEx(sample_size, false); diff --git a/armsrc/mifaredesfire.c b/armsrc/mifaredesfire.c index e96d6b3d9..d578d026b 100644 --- a/armsrc/mifaredesfire.c +++ b/armsrc/mifaredesfire.c @@ -33,7 +33,7 @@ static uint8_t deselect_cmd[] = {0xc2, 0xe0, 0xb4}; /* PCB CID CMD PAYLOAD */ //static uint8_t __res[MAX_FRAME_SIZE]; -struct desfire_key skey = {0}; +static struct desfire_key skey = {0}; static desfirekey_t sessionkey = &skey; bool InitDesfireCard(void) { diff --git a/client/src/cmdflashmem.c b/client/src/cmdflashmem.c index 8d19c3888..debe77089 100644 --- a/client/src/cmdflashmem.c +++ b/client/src/cmdflashmem.c @@ -27,8 +27,6 @@ #define FLASH_FASTBAUD MCK #define FLASH_MINBAUD FLASH_FASTBAUD -#define FASTFLASH (FLASHMEM_SPIBAUDRATE > FLASH_MINFAST) - static int CmdHelp(const char *Cmd); static int usage_flashmem_spibaud(void) { diff --git a/common/legic_prng.c b/common/legic_prng.c index 1447d3b1b..ad16d28b7 100644 --- a/common/legic_prng.c +++ b/common/legic_prng.c @@ -12,7 +12,7 @@ // b is 8bit lsfr // c keeps track on which step the prng is. // legic_prng_get_bit() = gets a bit muxed from a and b. -struct lfsr { +static struct lfsr { uint8_t a; uint8_t b; uint32_t c; diff --git a/common/parity.c b/common/parity.c index ce61ad40a..64e034a6d 100644 --- a/common/parity.c +++ b/common/parity.c @@ -25,7 +25,7 @@ const uint8_t OddByteParity[256] = { 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1 }; - +/* const uint8_t EvenByteParity[256] = { 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, @@ -44,4 +44,4 @@ const uint8_t EvenByteParity[256] = { 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0 }; - +*/ diff --git a/common_arm/usb_cdc.c b/common_arm/usb_cdc.c index c06542252..34400f4d5 100644 --- a/common_arm/usb_cdc.c +++ b/common_arm/usb_cdc.c @@ -130,9 +130,9 @@ AT91SAM7S256 USB Device Port #define SET_CONTROL_LINE_STATE 0x2221 AT91PS_UDP pUdp = AT91C_BASE_UDP; -uint8_t btConfiguration = 0; -uint8_t btConnection = 0; -uint8_t btReceiveBank = AT91C_UDP_RX_DATA_BK0; +static uint8_t btConfiguration = 0; +static uint8_t btConnection = 0; +static uint8_t btReceiveBank = AT91C_UDP_RX_DATA_BK0; static const char devDescriptor[] = { /* Device descriptor */ diff --git a/common_fpga/fpga.h b/common_fpga/fpga.h index 31580d8c9..f1b42ab2b 100644 --- a/common_fpga/fpga.h +++ b/common_fpga/fpga.h @@ -17,7 +17,7 @@ #define FPGA_TRACE_SIZE 3072 static const uint8_t bitparse_fixed_header[] = {0x00, 0x09, 0x0f, 0xf0, 0x0f, 0xf0, 0x0f, 0xf0, 0x0f, 0xf0, 0x00, 0x00, 0x01}; -extern const int fpga_bitstream_num; -extern const char *const fpga_version_information[]; +extern const int g_fpga_bitstream_num; +extern const char *const g_fpga_version_information[]; #endif diff --git a/include/pmflash.h b/include/pmflash.h index d61b5647d..4c970a628 100644 --- a/include/pmflash.h +++ b/include/pmflash.h @@ -14,9 +14,6 @@ #include "common.h" -// Flashmem spi baudrate -extern uint32_t FLASHMEM_SPIBAUDRATE; - // RDV40 Section // 256kb divided into 4k sectors. // diff --git a/tools/fpga_compress/fpga_compress.c b/tools/fpga_compress/fpga_compress.c index 0992c53ca..a99cc3fee 100644 --- a/tools/fpga_compress/fpga_compress.c +++ b/tools/fpga_compress/fpga_compress.c @@ -378,8 +378,8 @@ static void print_version_info_preamble(FILE *outfile, int num_infiles) { fprintf(outfile, "//-----------------------------------------------------------------------------\n"); fprintf(outfile, "\n"); fprintf(outfile, "\n"); - fprintf(outfile, "const int fpga_bitstream_num = %d;\n", num_infiles); - fprintf(outfile, "const char *const fpga_version_information[%d] = {\n", num_infiles); + fprintf(outfile, "const int g_fpga_bitstream_num = %d;\n", num_infiles); + fprintf(outfile, "const char *const g_fpga_version_information[%d] = {\n", num_infiles); } static int generate_fpga_version_info(FILE *infile[], char *infile_names[], int num_infiles, FILE *outfile) { From 37ae102e38853331fa69b2efe6dec546f1a90c00 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 19 May 2020 19:09:25 +0200 Subject: [PATCH 273/632] LogTrace error msg --- armsrc/BigBuf.c | 1 + 1 file changed, 1 insertion(+) diff --git a/armsrc/BigBuf.c b/armsrc/BigBuf.c index 8ee7cc189..755c88d9c 100644 --- a/armsrc/BigBuf.c +++ b/armsrc/BigBuf.c @@ -157,6 +157,7 @@ bool RAMFUNC LogTrace(const uint8_t *btBytes, uint16_t iLen, uint32_t timestamp_ return false; } if (timestamp_end - timestamp_start > 0x7FFF) { + Dbprintf("Error in LogTrace: duration too long for UINT16: 0x%08x", timestamp_end - timestamp_start); return false; // duration too long, must be max 15 bits } hdr->timestamp = timestamp_start; From 8509d233d230c83efb39da2ba4d1daeab2e0d8b9 Mon Sep 17 00:00:00 2001 From: grspy Date: Tue, 19 May 2020 20:49:25 +0300 Subject: [PATCH 274/632] Fix 32-bit time_t compilation error on WIN64 --- client/src/cmdhw.c | 4 ++-- tools/mf_nonce_brute/mf_nonce_brute.c | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/client/src/cmdhw.c b/client/src/cmdhw.c index cb48188a0..3b452b492 100644 --- a/client/src/cmdhw.c +++ b/client/src/cmdhw.c @@ -661,10 +661,10 @@ void pm3_version(bool verbose, bool oneliner) { # define PM3HOSTOS " OS:OpenBSD" #elif defined(__CYGWIN__) # define PM3HOSTOS " OS:Cygwin" -#elif defined(_WIN64) | defined(__WIN64__) +#elif defined(_WIN64) || defined(__WIN64__) // must be tested before _WIN32 # define PM3HOSTOS " OS:Windows (64b)" -#elif defined(_WIN32) | defined(__WIN32__) +#elif defined(_WIN32) || defined(__WIN32__) # define PM3HOSTOS " OS:Windows (32b)" #else # define PM3HOSTOS " OS:unknown" diff --git a/tools/mf_nonce_brute/mf_nonce_brute.c b/tools/mf_nonce_brute/mf_nonce_brute.c index 6bc69c3d9..3aaa5a9f3 100644 --- a/tools/mf_nonce_brute/mf_nonce_brute.c +++ b/tools/mf_nonce_brute/mf_nonce_brute.c @@ -1,5 +1,7 @@ #define __STDC_FORMAT_MACROS -#define _USE_32BIT_TIME_T 1 +#if !defined(_WIN64) +# define _USE_32BIT_TIME_T 1 +#endif #include #include #include From be42995f8a5bd893feea72bbae1ceec1e7e59f77 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 19 May 2020 20:03:27 +0200 Subject: [PATCH 275/632] Less fantasy in the LogTrace usages regarding timestamps --- armsrc/BigBuf.c | 20 ++++++++++++++++---- armsrc/hitag2.c | 2 +- armsrc/hitagS.c | 14 +++++++------- armsrc/iso14443b.c | 2 +- armsrc/iso15693.c | 12 ++++++------ 5 files changed, 31 insertions(+), 19 deletions(-) diff --git a/armsrc/BigBuf.c b/armsrc/BigBuf.c index 755c88d9c..07f32239f 100644 --- a/armsrc/BigBuf.c +++ b/armsrc/BigBuf.c @@ -156,12 +156,24 @@ bool RAMFUNC LogTrace(const uint8_t *btBytes, uint16_t iLen, uint32_t timestamp_ tracing = false; // don't trace any more return false; } - if (timestamp_end - timestamp_start > 0x7FFF) { - Dbprintf("Error in LogTrace: duration too long for UINT16: 0x%08x", timestamp_end - timestamp_start); - return false; // duration too long, must be max 15 bits + + uint32_t duration; + if (timestamp_end > timestamp_start) { + duration = timestamp_end - timestamp_start; + } else { + duration = (UINT32_MAX - timestamp_start) + timestamp_end; } + + if (duration > 0x7FFF) { + if (DBGLEVEL >= DBG_DEBUG) { + Dbprintf("Error in LogTrace: duration too long for 15 bits encoding: 0x%08x start:0x%08x end:0x%08x", duration, timestamp_start, timestamp_end); + Dbprintf("Forcing duration = 0"); + } + duration = 0; + } + hdr->timestamp = timestamp_start; - hdr->duration = timestamp_end - timestamp_start; + hdr->duration = duration; hdr->data_len = iLen; hdr->isResponse = !readerToTag; traceLen += TRACELOG_HDR_LEN; diff --git a/armsrc/hitag2.c b/armsrc/hitag2.c index c22b04e70..cf1aa46c1 100644 --- a/armsrc/hitag2.c +++ b/armsrc/hitag2.c @@ -1238,7 +1238,7 @@ void SimulateHitag2(bool tag_mem_supplied, uint8_t *data) { // Check if frame was captured if (rxlen > 4) { - LogTrace(rx, nbytes(rxlen), response, 0, NULL, true); + LogTrace(rx, nbytes(rxlen), response, response, NULL, true); // Process the incoming frame (rx) and prepare the outgoing frame (tx) hitag2_handle_reader_command(rx, rxlen, tx, &txlen); diff --git a/armsrc/hitagS.c b/armsrc/hitagS.c index 10c889fa7..7a49d65cd 100644 --- a/armsrc/hitagS.c +++ b/armsrc/hitagS.c @@ -1039,7 +1039,7 @@ void SimulateHitagSTag(bool tag_mem_supplied, uint8_t *data) { // Check if frame was captured if (rxlen > 0) { // frame_count++; - LogTrace(rx, nbytes(rxlen), response, 0, NULL, true); + LogTrace(rx, nbytes(rxlen), response, response, NULL, true); // Disable timer 1 with external trigger to avoid triggers during our own modulation AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKDIS; @@ -1281,7 +1281,7 @@ void ReadHitagS(hitag_function htf, hitag_data *htd) { // Check if frame was captured and store it if (rxlen > 0) { // frame_count++; - LogTrace(rx, nbytes(rxlen), response, 0, NULL, false); + LogTrace(rx, nbytes(rxlen), response, response, NULL, false); } // By default reset the transmission buffer @@ -1410,7 +1410,7 @@ void ReadHitagS(hitag_function htf, hitag_data *htd) { // Add transmitted frame to total count if (txlen > 0) { // frame_count++; - LogTrace(tx, nbytes(txlen), HITAG_T_WAIT_2, 0, NULL, true); + LogTrace(tx, nbytes(txlen), HITAG_T_WAIT_2, HITAG_T_WAIT_2, NULL, true); } hitagS_receive_frame(rx, &rxlen, &response); @@ -1538,7 +1538,7 @@ void WritePageHitagS(hitag_function htf, hitag_data *htd, int page) { // Check if frame was captured and store it if (rxlen > 0) { // frame_count++; - LogTrace(rx, nbytes(rxlen), response, 0, NULL, false); + LogTrace(rx, nbytes(rxlen), response, response, NULL, false); } //check for valid input @@ -1625,7 +1625,7 @@ void WritePageHitagS(hitag_function htf, hitag_data *htd, int page) { // Add transmitted frame to total count if (txlen > 0) { // frame_count++; - LogTrace(tx, nbytes(txlen), HITAG_T_WAIT_2, 0, NULL, true); + LogTrace(tx, nbytes(txlen), HITAG_T_WAIT_2, HITAG_T_WAIT_2, NULL, true); } hitagS_receive_frame(rx, &rxlen, &response); @@ -1732,7 +1732,7 @@ void check_challenges(bool file_given, uint8_t *data) { // Check if frame was captured and store it if (rxlen > 0) { // frame_count++; - LogTrace(rx, nbytes(rxlen), response, 0, NULL, false); + LogTrace(rx, nbytes(rxlen), response, response, NULL, false); } uint8_t *tx = txbuf; @@ -1864,7 +1864,7 @@ void check_challenges(bool file_given, uint8_t *data) { // Add transmitted frame to total count if (txlen > 0) { // frame_count++; - LogTrace(tx, nbytes(txlen), HITAG_T_WAIT_2, 0, NULL, true); + LogTrace(tx, nbytes(txlen), HITAG_T_WAIT_2, HITAG_T_WAIT_2, NULL, true); } hitagS_receive_frame(rx, &rxlen, &response); diff --git a/armsrc/iso14443b.c b/armsrc/iso14443b.c index b03e84912..bbca137fc 100644 --- a/armsrc/iso14443b.c +++ b/armsrc/iso14443b.c @@ -1152,7 +1152,7 @@ static void CodeAndTransmit14443bAsReader(const uint8_t *cmd, int len) { if (g_trigger) LED_A_ON(); - LogTrace(cmd, len, time_start, GetCountSspClk() - time_start, NULL, true); + LogTrace(cmd, len, time_start, GetCountSspClk(), NULL, true); } /* Sends an APDU to the tag diff --git a/armsrc/iso15693.c b/armsrc/iso15693.c index d3a0996e6..9dbdd4f94 100644 --- a/armsrc/iso15693.c +++ b/armsrc/iso15693.c @@ -431,7 +431,7 @@ static int GetIso15693AnswerFromTag(uint8_t *received, int *elapsed) { getNext = !getNext; } } - time_stop = GetCountSspClk() - time_0 ; + time_stop = GetCountSspClk(); int len = DemodAnswer(received, buf, counter); LogTrace(received, len, time_0 << 4, time_stop << 4, NULL, false); BigBuf_free(); @@ -478,7 +478,7 @@ static int GetIso15693AnswerFromSniff(uint8_t *received, int *samples, int *elap } } - time_stop = GetCountSspClk() - time_0; + time_stop = GetCountSspClk(); int k = DemodAnswer(received, buf, counter); LogTrace(received, k, time_0 << 4, time_stop << 4, NULL, false); return k; @@ -522,7 +522,7 @@ void AcquireRawAdcSamplesIso15693(void) { } - LogTrace(cmd, CMD_ID_RESP, time_start << 4, (GetCountSspClk() - time_start) << 4, NULL, true); + LogTrace(cmd, CMD_ID_RESP, time_start << 4, GetCountSspClk() << 4, NULL, true); FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR); @@ -723,7 +723,7 @@ static int SendDataTag(uint8_t *send, int sendlen, bool init, int speed, uint8_t uint32_t time_start = GetCountSspClk(); TransmitTo15693Tag(ToSend, ToSendMax, &t_samples, &wait); - LogTrace(send, sendlen, time_start << 4, (GetCountSspClk() - time_start) << 4, NULL, true); + LogTrace(send, sendlen, time_start << 4, GetCountSspClk() << 4, NULL, true); // Now wait for a response if (outdata != NULL) { @@ -825,7 +825,7 @@ void ReaderIso15693(uint32_t parameter) { uint8_t cmd[CMD_ID_RESP] = {0}; BuildIdentifyRequest(cmd); TransmitTo15693Tag(ToSend, ToSendMax, &tsamples, &wait); - LogTrace(cmd, CMD_ID_RESP, time_start << 4, (GetCountSspClk() - time_start) << 4, NULL, true); + LogTrace(cmd, CMD_ID_RESP, time_start << 4, GetCountSspClk() << 4, NULL, true); // Now wait for a response answerLen1 = GetIso15693AnswerFromTag(answer1, &elapsed) ; @@ -906,7 +906,7 @@ void SimTagIso15693(uint32_t parameter, uint8_t *uid) { time_start = GetCountSspClk(); TransmitTo15693Reader(ToSend, ToSendMax, &tsamples, &wait); - LogTrace(cmd, CMD_INV_RESP, time_start << 4, (GetCountSspClk() - time_start) << 4, NULL, true); + LogTrace(cmd, CMD_INV_RESP, time_start << 4, GetCountSspClk() << 4, NULL, true); if (DBGLEVEL >= DBG_EXTENDED) { Dbprintf("[+] %d octets read from reader command: %x %x %x %x %x %x %x %x", ans, From 0c248f76ad34fcb6697ea55a783f6eda8f153b08 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 19 May 2020 20:45:48 +0200 Subject: [PATCH 276/632] chg: hf mfdes info - textual --- client/src/cmdhfmfdes.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index 7ef1689cc..dc285d9cf 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -2972,7 +2972,7 @@ static int CmdHF14ADesInfo(const char *Cmd) { if (major == 1 && minor == 3) PrintAndLogEx(INFO, "\t1.3 - DESFire Ev1 MF3ICD21/41/81, Support extended APDU commands, EAL4+"); if (major == 1 && minor == 4) - PrintAndLogEx(INFO, "\t1.4 - DESFire Ev1 MF3ICD21/41/81, EAL4+, N/A (report to iceman!)"); + PrintAndLogEx(INFO, "\t1.4 - DESFire Ev1 MF3ICD21/41/81, EAL4+"); if (major == 2 && minor == 0) PrintAndLogEx(INFO, "\t2.0 - DESFire Ev2, Originality check, proximity check, EAL5"); // if (major == 3 && minor == 0) From 3dd55e2c04bbad599acd7e1c13e3fc0683cfeca2 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 19 May 2020 20:53:52 +0200 Subject: [PATCH 277/632] simpler define --- tools/mf_nonce_brute/mf_nonce_brute.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/mf_nonce_brute/mf_nonce_brute.c b/tools/mf_nonce_brute/mf_nonce_brute.c index 3aaa5a9f3..3bd2a6f31 100644 --- a/tools/mf_nonce_brute/mf_nonce_brute.c +++ b/tools/mf_nonce_brute/mf_nonce_brute.c @@ -1,7 +1,9 @@ #define __STDC_FORMAT_MACROS -#if !defined(_WIN64) + +#if defined(_WIN32) # define _USE_32BIT_TIME_T 1 #endif + #include #include #include From 8c22ef076b5c3a53bfc8f0039838484caa9fc2ff Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 20 May 2020 08:58:28 +0200 Subject: [PATCH 278/632] expanded from u16 -> u32 for keys to be loaded --- client/src/cmdflashmem.c | 14 +++++++++++++- client/src/cmdhficlass.c | 41 ++++++++++++++++++++-------------------- client/src/cmdhficlass.h | 8 ++++---- client/src/cmdhfmf.c | 8 ++++---- client/src/cmdhfmfdes.c | 30 ++++++++++++++++++----------- client/src/cmdhfmfp.c | 9 +++++---- client/src/cmdlft55xx.c | 4 ++-- client/src/fileutils.c | 10 +++++----- client/src/fileutils.h | 6 +++--- 9 files changed, 76 insertions(+), 54 deletions(-) diff --git a/client/src/cmdflashmem.c b/client/src/cmdflashmem.c index debe77089..e1761a81b 100644 --- a/client/src/cmdflashmem.c +++ b/client/src/cmdflashmem.c @@ -168,7 +168,7 @@ static int CmdFlashMemLoad(const char *Cmd) { return PM3_EINVARG; } size_t datalen = 0; - uint16_t keycount = 0; + uint32_t keycount = 0; int res = 0; uint8_t *data = calloc(FLASH_MEM_MAX_SIZE, sizeof(uint8_t)); @@ -180,6 +180,10 @@ static int CmdFlashMemLoad(const char *Cmd) { free(data); return PM3_EFILE; } + // limited space on flash mem + if (keycount > 0xFFFF) + keycount &= 0xFFFF; + data[0] = (keycount >> 0) & 0xFF; data[1] = (keycount >> 8) & 0xFF; datalen += 2; @@ -191,6 +195,10 @@ static int CmdFlashMemLoad(const char *Cmd) { free(data); return PM3_EFILE; } + // limited space on flash mem + if (keycount > 0xFFFF) + keycount &= 0xFFFF; + data[0] = (keycount >> 0) & 0xFF; data[1] = (keycount >> 8) & 0xFF; datalen += 2; @@ -202,6 +210,10 @@ static int CmdFlashMemLoad(const char *Cmd) { free(data); return PM3_EFILE; } + // limited space on flash mem + if (keycount > 0xFFFF) + keycount &= 0xFFFF; + data[0] = (keycount >> 0) & 0xFF; data[1] = (keycount >> 8) & 0xFF; datalen += 2; diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 73b9a6b18..61aea9de6 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -2411,17 +2411,6 @@ static int CmdHFiClassCheckKeys(const char *Cmd) { } if (errors) return usage_hf_iclass_chk(); - - uint8_t *keyBlock = NULL; - uint16_t keycount = 0; - - // load keys - int res = loadFileDICTIONARY_safe(filename, (void **)&keyBlock, 8, &keycount); - if (res != PM3_SUCCESS || keycount == 0) { - free(keyBlock); - return res; - } - // Get CSN / UID and CCNR PrintAndLogEx(SUCCESS, "Reading tag CSN"); for (uint8_t i = 0; i < ICLASS_AUTH_RETRY && !got_csn; i++) { @@ -2436,6 +2425,16 @@ static int CmdHFiClassCheckKeys(const char *Cmd) { return PM3_ESOFT; } + uint8_t *keyBlock = NULL; + uint32_t keycount = 0; + + // load keys + int res = loadFileDICTIONARY_safe(filename, (void **)&keyBlock, 8, &keycount); + if (res != PM3_SUCCESS || keycount == 0) { + free(keyBlock); + return res; + } + pre = calloc(keycount, sizeof(iclass_premac_t)); if (!pre) { DropField(); @@ -2678,7 +2677,7 @@ static int CmdHFiClassLookUp(const char *Cmd) { PrintAndLogEx(SUCCESS, "MAC_TAG | %s", sprint_hex(MAC_TAG, sizeof(MAC_TAG))); uint8_t *keyBlock = NULL; - uint16_t keycount = 0; + uint32_t keycount = 0; // load keys int res = loadFileDICTIONARY_safe(filename, (void **)&keyBlock, 8, &keycount); @@ -2737,11 +2736,12 @@ static int CmdHFiClassLookUp(const char *Cmd) { } // precalc diversified keys and their MAC -void GenerateMacFrom(uint8_t *CSN, uint8_t *CCNR, bool use_raw, bool use_elite, uint8_t *keys, int keycnt, iclass_premac_t *list) { +void GenerateMacFrom(uint8_t *CSN, uint8_t *CCNR, bool use_raw, bool use_elite, uint8_t *keys, uint32_t keycnt, iclass_premac_t *list) { uint8_t key[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; uint8_t div_key[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - for (int i = 0; i < keycnt; i++) { +//iceman: threading + for (uint32_t i = 0; i < keycnt; i++) { memcpy(key, keys + 8 * i, 8); @@ -2754,11 +2754,12 @@ void GenerateMacFrom(uint8_t *CSN, uint8_t *CCNR, bool use_raw, bool use_elite, } } -void GenerateMacKeyFrom(uint8_t *CSN, uint8_t *CCNR, bool use_raw, bool use_elite, uint8_t *keys, int keycnt, iclass_prekey_t *list) { +void GenerateMacKeyFrom(uint8_t *CSN, uint8_t *CCNR, bool use_raw, bool use_elite, uint8_t *keys, uint32_t keycnt, iclass_prekey_t *list) { uint8_t div_key[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - for (int i = 0; i < keycnt; i++) { +//iceman: threading + for (uint32_t i = 0; i < keycnt; i++) { memcpy(list[i].key, keys + 8 * i, 8); @@ -2774,13 +2775,13 @@ void GenerateMacKeyFrom(uint8_t *CSN, uint8_t *CCNR, bool use_raw, bool use_elit } // print diversified keys -void PrintPreCalcMac(uint8_t *keys, int keycnt, iclass_premac_t *pre_list) { +void PrintPreCalcMac(uint8_t *keys, uint32_t keycnt, iclass_premac_t *pre_list) { - iclass_prekey_t *b = calloc(keycnt, sizeof(iclass_prekey_t)); + iclass_prekey_t *b = calloc(keycnt, sizeof(iclass_prekey_t)); if (!b) return; - for (int i = 0; i < keycnt; i++) { + for (uint32_t i = 0; i < keycnt; i++) { memcpy(b[i].key, keys + 8 * i, 8); memcpy(b[i].mac, pre_list[i].mac, 4); } @@ -2788,7 +2789,7 @@ void PrintPreCalcMac(uint8_t *keys, int keycnt, iclass_premac_t *pre_list) { free(b); } -void PrintPreCalc(iclass_prekey_t *list, int itemcnt) { +void PrintPreCalc(iclass_prekey_t *list, uint32_t itemcnt) { PrintAndLogEx(NORMAL, "-----+------------------+---------"); PrintAndLogEx(NORMAL, "#key | key | mac"); PrintAndLogEx(NORMAL, "-----+------------------+---------"); diff --git a/client/src/cmdhficlass.h b/client/src/cmdhficlass.h index 73304d4d0..53880d647 100644 --- a/client/src/cmdhficlass.h +++ b/client/src/cmdhficlass.h @@ -33,8 +33,8 @@ int readIclass(bool loop, bool verbose); void printIclassDumpContents(uint8_t *iclass_dump, uint8_t startblock, uint8_t endblock, size_t filesize); void HFiClassCalcDivKey(uint8_t *CSN, uint8_t *KEY, uint8_t *div_key, bool elite); -void GenerateMacFrom(uint8_t *CSN, uint8_t *CCNR, bool use_raw, bool use_elite, uint8_t *keys, int keycnt, iclass_premac_t *list); -void GenerateMacKeyFrom(uint8_t *CSN, uint8_t *CCNR, bool use_raw, bool use_elite, uint8_t *keys, int keycnt, iclass_prekey_t *list); -void PrintPreCalcMac(uint8_t *keys, int keycnt, iclass_premac_t *pre_list); -void PrintPreCalc(iclass_prekey_t *list, int itemcnt); +void GenerateMacFrom(uint8_t *CSN, uint8_t *CCNR, bool use_raw, bool use_elite, uint8_t *keys, uint32_t keycnt, iclass_premac_t *list); +void GenerateMacKeyFrom(uint8_t *CSN, uint8_t *CCNR, bool use_raw, bool use_elite, uint8_t *keys, uint32_t keycnt, iclass_prekey_t *list); +void PrintPreCalcMac(uint8_t *keys, uint32_t keycnt, iclass_premac_t *pre_list); +void PrintPreCalc(iclass_prekey_t *list, uint32_t itemcnt); #endif diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 0a11a8a25..560ed0a16 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -1904,7 +1904,7 @@ static int CmdHF14AMfAutoPWN(const char *Cmd) { bool calibrate = true; // Attack key storage variables uint8_t *keyBlock = NULL; - uint16_t key_cnt = 0; + uint32_t key_cnt = 0; sector_t *e_sector; uint8_t sectors_cnt = MIFARE_1K_MAXSECTOR; int block_cnt = MIFARE_1K_MAXBLOCK; @@ -2169,7 +2169,7 @@ static int CmdHF14AMfAutoPWN(const char *Cmd) { for (int j = 0; j < 2; j++) { // Check if the key is known if (e_sector[i].foundKey[j] == 0) { - for (int k = 0; k < key_cnt; k++) { + for (uint32_t k = 0; k < key_cnt; k++) { printf("."); fflush(stdout); if (mfCheckKeys(FirstBlockOfSector(i), j, true, 1, (keyBlock + (6 * k)), &key64) == PM3_SUCCESS) { @@ -2186,13 +2186,13 @@ static int CmdHF14AMfAutoPWN(const char *Cmd) { fflush(stdout); } else { - int chunksize = key_cnt > (PM3_CMD_DATA_SIZE / 6) ? (PM3_CMD_DATA_SIZE / 6) : key_cnt; + uint32_t chunksize = key_cnt > (PM3_CMD_DATA_SIZE / 6) ? (PM3_CMD_DATA_SIZE / 6) : key_cnt; bool firstChunk = true, lastChunk = false; for (uint8_t strategy = 1; strategy < 3; strategy++) { PrintAndLogEx(INFO, "running strategy %u", strategy); // main keychunk loop - for (int i = 0; i < key_cnt; i += chunksize) { + for (uint32_t i = 0; i < key_cnt; i += chunksize) { if (kbd_enter_pressed()) { PrintAndLogEx(WARNING, "\naborted via keyboard!\n"); diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index dc285d9cf..7dd07655b 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -3561,7 +3561,11 @@ static int CmdHF14ADesAuth(const char *Cmd) { return PM3_SUCCESS; } -static void DesFill2bPattern(uint8_t deskeyList[MAX_KEYS_LIST_LEN][8], size_t *deskeyListLen, uint8_t aeskeyList[MAX_KEYS_LIST_LEN][16], size_t *aeskeyListLen, uint8_t k3kkeyList[MAX_KEYS_LIST_LEN][24], size_t *k3kkeyListLen, uint32_t *startPattern) { +static void DesFill2bPattern( + uint8_t deskeyList[MAX_KEYS_LIST_LEN][8], uint32_t *deskeyListLen, + uint8_t aeskeyList[MAX_KEYS_LIST_LEN][16], uint32_t *aeskeyListLen, + uint8_t k3kkeyList[MAX_KEYS_LIST_LEN][24], uint32_t *k3kkeyListLen, uint32_t *startPattern) { + for (uint32_t pt = *startPattern; pt < 0x10000; pt++) { if (*deskeyListLen != MAX_KEYS_LIST_LEN) { deskeyList[*deskeyListLen][0] = (pt >> 8) & 0xff; @@ -3598,7 +3602,11 @@ static void DesFill2bPattern(uint8_t deskeyList[MAX_KEYS_LIST_LEN][8], size_t *d (*startPattern)++; } -static int AuthCheckDesfire(uint8_t *aid, uint8_t deskeyList[MAX_KEYS_LIST_LEN][8], size_t deskeyListLen, uint8_t aeskeyList[MAX_KEYS_LIST_LEN][16], size_t aeskeyListLen, uint8_t k3kkeyList[MAX_KEYS_LIST_LEN][24], size_t k3kkeyListLen, uint8_t foundKeys[4][0xE][24 + 1], bool *result) { +static int AuthCheckDesfire(uint8_t *aid, + uint8_t deskeyList[MAX_KEYS_LIST_LEN][8], uint32_t deskeyListLen, + uint8_t aeskeyList[MAX_KEYS_LIST_LEN][16], uint32_t aeskeyListLen, + uint8_t k3kkeyList[MAX_KEYS_LIST_LEN][24], uint32_t k3kkeyListLen, + uint8_t foundKeys[4][0xE][24 + 1], bool *result) { uint32_t curaid = (aid[0] & 0xFF) + ((aid[1] & 0xFF) << 8) + ((aid[2] & 0xFF) << 16); @@ -3689,7 +3697,7 @@ static int AuthCheckDesfire(uint8_t *aid, uint8_t deskeyList[MAX_KEYS_LIST_LEN][ if (usedkeys[keyno] == 1 && foundKeys[0][keyno][0] == 0) { - for (int curkey = 0; curkey < deskeyListLen; curkey++) { + for (uint32_t curkey = 0; curkey < deskeyListLen; curkey++) { payload.keylen = 8; memcpy(payload.key, deskeyList[curkey], 8); @@ -3728,7 +3736,7 @@ static int AuthCheckDesfire(uint8_t *aid, uint8_t deskeyList[MAX_KEYS_LIST_LEN][ if (usedkeys[keyno] == 1 && foundKeys[1][keyno][0] == 0) { - for (int curkey = 0; curkey < aeskeyListLen; curkey++) { + for (uint32_t curkey = 0; curkey < aeskeyListLen; curkey++) { payload.keylen = 16; memcpy(payload.key, aeskeyList[curkey], 16); @@ -3767,7 +3775,7 @@ static int AuthCheckDesfire(uint8_t *aid, uint8_t deskeyList[MAX_KEYS_LIST_LEN][ if (usedkeys[keyno] == 1 && foundKeys[2][keyno][0] == 0) { - for (int curkey = 0; curkey < aeskeyListLen; curkey++) { + for (uint32_t curkey = 0; curkey < aeskeyListLen; curkey++) { payload.keylen = 16; memcpy(payload.key, aeskeyList[curkey], 16); @@ -3806,7 +3814,7 @@ static int AuthCheckDesfire(uint8_t *aid, uint8_t deskeyList[MAX_KEYS_LIST_LEN][ if (usedkeys[keyno] == 1 && foundKeys[3][keyno][0] == 0) { - for (int curkey = 0; curkey < k3kkeyListLen; curkey++) { + for (uint32_t curkey = 0; curkey < k3kkeyListLen; curkey++) { payload.keylen = 24; memcpy(payload.key, k3kkeyList[curkey], 24); payload.mode = MFDES_AUTH_ISO; @@ -3846,9 +3854,9 @@ static int CmdHF14aDesChk(const char *Cmd) { uint8_t deskeyList[MAX_KEYS_LIST_LEN][8] = {{0}}; uint8_t aeskeyList[MAX_KEYS_LIST_LEN][16] = {{0}}; uint8_t k3kkeyList[MAX_KEYS_LIST_LEN][MAX_KEY_LEN] = {{0}}; - size_t deskeyListLen = 0; - size_t aeskeyListLen = 0; - size_t k3kkeyListLen = 0; + uint32_t deskeyListLen = 0; + uint32_t aeskeyListLen = 0; + uint32_t k3kkeyListLen = 0; uint8_t foundKeys[4][0xE][24 + 1] = {{{0}}}; CLIParserInit("hf mfdes chk", @@ -3972,7 +3980,7 @@ static int CmdHF14aDesChk(const char *Cmd) { // dictionary mode size_t endFilePosition = 0; if (dict_filenamelen) { - uint16_t keycnt = 0; + uint32_t keycnt = 0; res = loadFileDICTIONARYEx((char *)dict_filename, deskeyList, sizeof(deskeyList), NULL, 8, &keycnt, 0, &endFilePosition, true); deskeyListLen = keycnt; if (endFilePosition) @@ -4049,7 +4057,7 @@ static int CmdHF14aDesChk(const char *Cmd) { if (dict_filenamelen && endFilePosition) { if (!verbose) printf("d"); - uint16_t keycnt = 0; + uint32_t keycnt = 0; res = loadFileDICTIONARYEx((char *)dict_filename, deskeyList, sizeof(deskeyList), NULL, 16, &keycnt, endFilePosition, &endFilePosition, false); deskeyListLen = keycnt; keycnt = 0; diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index bc6854b26..27c606203 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -1027,7 +1027,7 @@ static int MFPKeyCheck(uint8_t startSector, uint8_t endSector, uint8_t startKeyA return PM3_SUCCESS; } -static void Fill2bPattern(uint8_t keyList[MAX_KEYS_LIST_LEN][AES_KEY_LEN], size_t *keyListLen, uint32_t *startPattern) { +static void Fill2bPattern(uint8_t keyList[MAX_KEYS_LIST_LEN][AES_KEY_LEN], uint32_t *keyListLen, uint32_t *startPattern) { for (uint32_t pt = *startPattern; pt < 0x10000; pt++) { keyList[*keyListLen][0] = (pt >> 8) & 0xff; keyList[*keyListLen][1] = pt & 0xff; @@ -1045,7 +1045,7 @@ static void Fill2bPattern(uint8_t keyList[MAX_KEYS_LIST_LEN][AES_KEY_LEN], size_ static int CmdHFMFPChk(const char *Cmd) { int res; uint8_t keyList[MAX_KEYS_LIST_LEN][AES_KEY_LEN] = {{0}}; - size_t keyListLen = 0; + uint32_t keyListLen = 0; uint8_t foundKeys[2][64][AES_KEY_LEN + 1] = {{{0}}}; CLIParserInit("hf mfp chk", @@ -1149,6 +1149,7 @@ static int CmdHFMFPChk(const char *Cmd) { uint8_t endKeyAB = 1; if (keyA && !keyB) endKeyAB = 0; + if (!keyA && keyB) startKeyAB = 1; @@ -1170,7 +1171,7 @@ static int CmdHFMFPChk(const char *Cmd) { // dictionary mode size_t endFilePosition = 0; if (dict_filenamelen) { - uint16_t keycnt = 0; + uint32_t keycnt = 0; res = loadFileDICTIONARYEx((char *)dict_filename, keyList, sizeof(keyList), NULL, 16, &keycnt, 0, &endFilePosition, true); keyListLen = keycnt; if (endFilePosition) @@ -1210,7 +1211,7 @@ static int CmdHFMFPChk(const char *Cmd) { if (dict_filenamelen && endFilePosition) { if (!verbose) printf("d"); - uint16_t keycnt = 0; + uint32_t keycnt = 0; res = loadFileDICTIONARYEx((char *)dict_filename, keyList, sizeof(keyList), NULL, 16, &keycnt, endFilePosition, &endFilePosition, false); keyListLen = keycnt; continue; diff --git a/client/src/cmdlft55xx.c b/client/src/cmdlft55xx.c index 572a07549..9b54aef8f 100644 --- a/client/src/cmdlft55xx.c +++ b/client/src/cmdlft55xx.c @@ -3045,7 +3045,7 @@ static int CmdT55xxChkPwds(const char *Cmd) { } if (use_pwd_file) { - uint16_t keycount = 0; + uint32_t keycount = 0; int res = loadFileDICTIONARY_safe(filename, (void **) &keyBlock, 4, &keycount); if (res != PM3_SUCCESS || keycount == 0 || keyBlock == NULL) { @@ -3056,7 +3056,7 @@ static int CmdT55xxChkPwds(const char *Cmd) { return PM3_ESOFT; } - for (uint16_t c = 0; c < keycount; ++c) { + for (uint32_t c = 0; c < keycount; ++c) { if (!session.pm3_present) { PrintAndLogEx(WARNING, "Device offline\n"); diff --git a/client/src/fileutils.c b/client/src/fileutils.c index ac9196e4c..4e5573747 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -996,7 +996,7 @@ out: return retval; } -int loadFileDICTIONARY(const char *preferredName, void *data, size_t *datalen, uint8_t keylen, uint16_t *keycnt) { +int loadFileDICTIONARY(const char *preferredName, void *data, size_t *datalen, uint8_t keylen, uint32_t *keycnt) { // t5577 == 4bytes // mifare == 6 bytes // mf plus == 16 bytes @@ -1009,7 +1009,7 @@ int loadFileDICTIONARY(const char *preferredName, void *data, size_t *datalen, u return loadFileDICTIONARYEx(preferredName, data, 0, datalen, keylen, keycnt, 0, NULL, true); } -int loadFileDICTIONARYEx(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen, uint8_t keylen, uint16_t *keycnt, +int loadFileDICTIONARYEx(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen, uint8_t keylen, uint32_t *keycnt, size_t startFilePosition, size_t *endFilePosition, bool verbose) { if (data == NULL) return PM3_EINVARG; @@ -1025,7 +1025,7 @@ int loadFileDICTIONARYEx(const char *preferredName, void *data, size_t maxdatale keylen <<= 1; char line[255]; - uint16_t vkeycnt = 0; + uint32_t vkeycnt = 0; size_t counter = 0; int retval = PM3_SUCCESS; @@ -1097,7 +1097,7 @@ out: return retval; } -int loadFileDICTIONARY_safe(const char *preferredName, void **pdata, uint8_t keylen, uint16_t *keycnt) { +int loadFileDICTIONARY_safe(const char *preferredName, void **pdata, uint8_t keylen, uint32_t *keycnt) { int retval = PM3_SUCCESS; @@ -1141,7 +1141,7 @@ int loadFileDICTIONARY_safe(const char *preferredName, void **pdata, uint8_t key while (fgets(line, sizeof(line), f)) { // check if we have enough space (if not allocate more) - if ((((size_t)(*keycnt)) * (keylen >> 1)) >= mem_size) { + if ((*keycnt * (keylen >> 1)) >= mem_size) { mem_size += block_size; *pdata = realloc(*pdata, mem_size); diff --git a/client/src/fileutils.h b/client/src/fileutils.h index 2f55a3c1a..603144e67 100644 --- a/client/src/fileutils.h +++ b/client/src/fileutils.h @@ -210,7 +210,7 @@ int loadFileJSON(const char *preferredName, void *data, size_t maxdatalen, size_ * @param keycnt key count that lays in data. may be NULL * @return 0 for ok, 1 for failz */ -int loadFileDICTIONARY(const char *preferredName, void *data, size_t *datalen, uint8_t keylen, uint16_t *keycnt); +int loadFileDICTIONARY(const char *preferredName, void *data, size_t *datalen, uint8_t keylen, uint32_t *keycnt); /** * @brief Utility function to load data from a DICTIONARY textfile. This method takes a preferred name. @@ -228,7 +228,7 @@ int loadFileDICTIONARY(const char *preferredName, void *data, size_t *datalen, u * @param verbose print messages if true * @return 0 for ok, 1 for failz */ -int loadFileDICTIONARYEx(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen, uint8_t keylen, uint16_t *keycnt, +int loadFileDICTIONARYEx(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen, uint8_t keylen, uint32_t *keycnt, size_t startFilePosition, size_t *endFilePosition, bool verbose); /** @@ -240,7 +240,7 @@ int loadFileDICTIONARYEx(const char *preferredName, void *data, size_t maxdatale * @param keylen the number of bytes a key per row is * @return 0 for ok, 1 for failz */ -int loadFileDICTIONARY_safe(const char *preferredName, void **pdata, uint8_t keylen, uint16_t *keycnt); +int loadFileDICTIONARY_safe(const char *preferredName, void **pdata, uint8_t keylen, uint32_t *keycnt); /** * @brief Utility function to check and convert old mfu dump format to new From 97a94903b08cfb3bce2d6b7634b8ad14218ad0fd Mon Sep 17 00:00:00 2001 From: Iceman Date: Wed, 20 May 2020 09:46:49 +0200 Subject: [PATCH 279/632] Update termux_notes.md --- doc/termux_notes.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/doc/termux_notes.md b/doc/termux_notes.md index 6b3eb132c..168e13803 100644 --- a/doc/termux_notes.md +++ b/doc/termux_notes.md @@ -1,6 +1,23 @@ + # Proxmark 3 on Android +## Table of Contents + * [ Requirements ](#requirements) + * [ Notes ](#notes) + * [ Tested setups ](#tested-setups) + * [ Setup ](#setup) + * [ Setting up Termux ](#setting-up-termux) + * [ Install Proxmark3 package ](#install-proxmark3-package) + * [ USB_ACM ](#usb_acm) + * [ Enable the driver ](#enable-the-driver) + * [ Building the kernel ](#building-the-kernel) + * [ Flashing the kernel ](#flashing-the-kernel) + * [ Testing ](#testing) + * [ Troubleshooting ](#troubleshooting) + ## Requirements +^[Top](#top) + - Android phone - Kernel with one of: - USB_ACM driver @@ -10,11 +27,13 @@ - [Termux](https://play.google.com/store/apps/details?id=com.termux) ## Notes +^[Top](#top) From official Proxmark3 wiki: > In any case, you would need a USB-C to A or USB-OTG cable to connect Proxmark3 to your Android device. Some Android devices may not supply enough power (USB-OTG = 100mA), and need a USB Y-cable and external battery, otherwise they will get strange failures. ref : https://github.com/Proxmark/proxmark3/wiki/android ## Tested setups +^[Top](#top) - OnePlus 5 (arm64, USB-C) @@ -45,9 +64,17 @@ ref : https://github.com/Proxmark/proxmark3/wiki/android ## Setup +^[Top](#top) + ### Setting up Termux +^[Top](#top) + Install [Termux](https://play.google.com/store/apps/details?id=com.termux) and start it + + ### Install Proxmark3 package +^[Top](#top) + Run the following commands: ``` pkg install proxmark3 tsu @@ -61,18 +88,28 @@ make clean && make client ``` ### USB_ACM +^[Top](#top) + You need the `USB_ACM` driver enabled and working to communicate with the Proxmark3. To see if it's working, run `tsudo ls /dev/tty*` and it should list `/dev/ttyACM0` (or similar). If you see this, congratulations, skip this step! #### Enable the driver +^[Top](#top) + If your kernel has module loading enabled, you should be able to build the module separately and load it on your system without any changes. Otherwise, grab your kernel sources and edit your build config to include `CONFIG_USB_ACM=y`. On the tested kernel, this was under: `android_kernel_oneplus_msm8998/arch/arm64/configs/omni_oneplus5_defconfig` #### Building the kernel +^[Top](#top) + If using a custom kernel, refer to the build instructions provided by its maintainer. Otherwise, follow the standard Linux kernel build procedure #### Flashing the kernel +^[Top](#top) + You can flash the kernel however it suits you. On the tested device, this was achieved using [TWRP](https://twrp.me/), the most popular custom recovery ### Testing +^[Top](#top) + Open Termux and start the Proxmark3 client: ``` tsudo proxmark3/client/proxmark3 /dev/ttyACM0 @@ -80,5 +117,7 @@ tsudo proxmark3/client/proxmark3 /dev/ttyACM0 Everything should work just like if it was your PC! ### Troubleshooting +^[Top](#top) + - `dmesg | grep usb` - useful debug info - `/proc/config.gz` - contains your kernel's build configuration. Look for `CONFIG_USB_ACM`, which should be enabled From ce0247cf8693f527450d0e55ae0ea56bf79d2b53 Mon Sep 17 00:00:00 2001 From: Iceman Date: Wed, 20 May 2020 09:48:12 +0200 Subject: [PATCH 280/632] Update termux_notes.md --- doc/termux_notes.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/termux_notes.md b/doc/termux_notes.md index 168e13803..1b1ccc75c 100644 --- a/doc/termux_notes.md +++ b/doc/termux_notes.md @@ -1,10 +1,14 @@ # Proxmark 3 on Android - ## Table of Contents * [ Requirements ](#requirements) * [ Notes ](#notes) * [ Tested setups ](#tested-setups) + * OnePlus 5 (arm64, USB-C) + * Nexus 5X (arm64, USB-C) + * Xiaomi Mi Mix 2S (arm64, USB-C) + * OnePlus 5T (arm64, USB-C) + * Samsung Galaxy Tab S2 (arm64, MicroUSB) * [ Setup ](#setup) * [ Setting up Termux ](#setting-up-termux) * [ Install Proxmark3 package ](#install-proxmark3-package) From 1a90fa90d64e051a10d520c83f9e338aa5d45f18 Mon Sep 17 00:00:00 2001 From: dxl <64101226@qq.com> Date: Wed, 20 May 2020 16:05:58 +0800 Subject: [PATCH 281/632] work directory supported. --- client/android/pm3_main.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/client/android/pm3_main.c b/client/android/pm3_main.c index 6855856ab..b1e388cce 100644 --- a/client/android/pm3_main.c +++ b/client/android/pm3_main.c @@ -53,6 +53,14 @@ const char *get_my_executable_path(void) { } const char *get_my_executable_directory(void) { + if (my_executable_directory != NULL) free(my_executable_directory); + char buf[1024]; + // get current work directory + getcwd(buf, sizeof(buf)); + // add / to end. + sprintf(buf, "%s%s", buf, PATHSEP); + // create on global + my_executable_directory = strdup(buf); return my_executable_directory; } @@ -95,7 +103,7 @@ jint sendCMD(JNIEnv *env, jobject instance, jstring cmd_) { } // display on new line PrintAndLogEx(NORMAL, "\n"); - char *cmd = (char *)((*env)->GetStringUTFChars(env, cmd_, 0)); + char *cmd = (char *) ((*env)->GetStringUTFChars(env, cmd_, 0)); int ret = CommandReceived(cmd); if (ret == 99) { // exit / quit @@ -110,7 +118,7 @@ jint sendCMD(JNIEnv *env, jobject instance, jstring cmd_) { * Is client running! * */ jboolean isExecuting(JNIEnv *env, jobject instance) { - return (jboolean)((jboolean) conn.run); + return (jboolean) ((jboolean) conn.run); } /* @@ -123,7 +131,7 @@ jboolean testPm3(JNIEnv *env, jobject instance) { return false; } bool ret2 = TestProxmark() == PM3_SUCCESS; - return (jboolean)(ret1 && ret2); + return (jboolean) (ret1 && ret2); } /* @@ -148,21 +156,21 @@ JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { } jclass clz_test = (*jniEnv)->FindClass(jniEnv, "cn/rrg/devices/Proxmark3RRGRdv4"); JNINativeMethod methods[] = { - {"startExecute", "(Ljava/lang/String;)I", (void *) sendCMD}, - {"stopExecute", "()V", (void *) stopPm3}, - {"isExecuting", "()Z", (void *) isExecuting} + {"startExecute", "(Ljava/lang/String;)I", (void *) sendCMD}, + {"stopExecute", "()V", (void *) stopPm3}, + {"isExecuting", "()Z", (void *) isExecuting} }; JNINativeMethod methods1[] = { - {"testPm3", "()Z", (void *) testPm3}, - {"closePm3", "()V", stopPm3} + {"testPm3", "()Z", (void *) testPm3}, + {"closePm3", "()V", stopPm3} }; if ((*jniEnv)->RegisterNatives(jniEnv, clazz, methods, sizeof(methods) / sizeof(methods[0])) != - JNI_OK) { + JNI_OK) { return -1; } if ((*jniEnv)->RegisterNatives(jniEnv, clz_test, methods1, sizeof(methods1) / sizeof(methods1[0])) != - JNI_OK) { + JNI_OK) { return -1; } (*jniEnv)->DeleteLocalRef(jniEnv, clazz); From 6bb47f355fc963a074ecf375aac5316fb2c026f5 Mon Sep 17 00:00:00 2001 From: Iceman Date: Wed, 20 May 2020 10:24:20 +0200 Subject: [PATCH 282/632] Update README.md --- README.md | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 1c4cdaf83..1c7eb891c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # RRG / Iceman repo - Proxmark3 + + | Releases | Linux & OSX CI | Windows CI | Coverity | | ------------------- |:-------------------:| -------------------:| -------------------:| | [![Latest release](https://img.shields.io/github/release/RfidResearchGroup/proxmark3.svg)](https://github.com/RfidResearchGroup/proxmark3/releases/latest) | [![Build status](https://api.travis-ci.org/RfidResearchGroup/proxmark3.svg?branch=master)](https://travis-ci.org/RfidResearchGroup/proxmark3) | [![Build status](https://ci.appveyor.com/api/projects/status/b4gwrhq3nc876cuu/branch/master?svg=true)](https://ci.appveyor.com/project/RfidResearchGroup/proxmark3/branch/master) | [![Coverity Status](https://scan.coverity.com/projects/19334/badge.svg)](https://scan.coverity.com/projects/proxmark3-rrg-iceman-repo)| @@ -23,6 +25,7 @@ ## Notes / helpful documents + | Notes ||| | ------------------- |:-------------------:| -------------------:| |[Notes on UART](/doc/uart_notes.md)|[Notes on Termux / Android](/doc/termux_notes.md)|[Notes on paths](/doc/path_notes.md)| @@ -31,6 +34,8 @@ |[Notes on file formats used with Proxmark3](/doc/extensions_notes.md)||| |[Developing standalone mode](/armsrc/Standalone/readme.md)|[Wiki about standalone mode](https://github.com/RfidResearchGroup/proxmark3/wiki/Standalone-mode)|| + + ## Build for non-RDV4 Proxmark3 platforms In order to build this repo for other Proxmark3 platforms we urge you to read [Advanced compilation parameters](/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md) @@ -52,14 +57,22 @@ On the software side: quite a lot, see the [Changelog file](CHANGELOG.md). This repo compiles nicely on - Proxspace v3.x - - Windows/mingw environment with Qt5.6.1 & GCC 4.8 - - Ubuntu 1604, 1804, 1904, 2004 + - [latest release v3.4](https://github.com/Gator96100/ProxSpace/releases) + - Windows/mingw environment with Qt5.6.1 & GCC 4.9 + - Ubuntu 1604 -> 2004 - ParrotOS, Gentoo, Pentoo, Kali, Nethunter, Archlinux, Fedora, Debian - - Rasbian Pi, Jetson Nano, - Android / Termux - Mac OS X / Homebrew - WSL, WSL2 (Windows subsystem linux) on Windows 10 - Docker container + - [ RRG / Iceman repo based ubuntu 18.04 container ](https://hub.docker.com/r/secopsconsult/proxmark3) + - [ Iceman fork based container v1.7 ](https://hub.docker.com/r/iceman1001/proxmark3/) + +Hardware to run client on + - PC + - Andriod + - Rasbian Pi + - Jetson Nano The [public roadmap](https://github.com/RfidResearchGroup/proxmark3/wiki/Public-Roadmap) is an excellent start to read if you are interesting in contributing. @@ -67,6 +80,20 @@ The [public roadmap](https://github.com/RfidResearchGroup/proxmark3/wiki/Public- We usually merge your contributions fast since we do like the idea of getting a functionality in the Proxmark3 and weed out the bugs afterwards. +## Issues & Troubleshooting +Please search the [issues](https://github.com/rfidresearchgroup/proxmark3/issues) page here and see if your issue is listed in the first instance. Next place to visit is the [Proxmark Forum](http://www.proxmark.org/forum/index.php). Learn to search it well and finally Google / duckduckgo is your friend :) You will find many blogposts, youtube videos, tweets, reddit + +Read the [Troubleshooting](/doc/md/Installation_Instructions/Troubleshooting.md) guide to weed out most known problems. + +Offical channels + - [Proxmark3 IRC channel](http://webchat.freenode.net/?channels=#proxmark3) + - [Proxmark3 sub reddit](https://www.reddit.com/r/proxmark3/) + - [Twitter](https://twitter.com/proxmark3/) + + _no discord or slack channel_ + +Iceman has quite a few videos on his [youtube channel](https://www.youtube.com/c/ChrisHerrmann1001) + ## Cheat sheet Thanks to Alex Dibs, you can enjoy a [command cheat sheet](/doc/cheatsheet.md) @@ -85,13 +112,6 @@ The separation from official Proxmark3 repo gives us a lot of freedom to create The official PM3-GUI from Gaucho will not work. The new universal GUI will work. [Proxmark3 Universal GUI](https://github.com/burma69/PM3UniversalGUI) Almost, change needed in order to show helptext when client isn't connected to a device. -## Issues - -Please see the [Proxmark Forum](http://www.proxmark.org/forum/index.php) and see if your issue is listed in the first instance Google is your friend :) Questions will be answered via the forum by Iceman and the team. - -Read the [Troubleshooting](/doc/md/Installation_Instructions/Troubleshooting.md) guide to weed out most known problems. - - ## The end - July 2018 [@herrmann1001](https://mobile.twitter.com/herrmann1001) From 04158fddb6e98f5b34c534e131662ce572aacd4b Mon Sep 17 00:00:00 2001 From: Iceman Date: Wed, 20 May 2020 10:25:00 +0200 Subject: [PATCH 283/632] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1c7eb891c..261d65e0b 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,7 @@ Hardware to run client on - Rasbian Pi - Jetson Nano +## Roadmap The [public roadmap](https://github.com/RfidResearchGroup/proxmark3/wiki/Public-Roadmap) is an excellent start to read if you are interesting in contributing. > 👉 **Remember!** If you intend to contribute to the code, please read the [coding style notes](HACKING.md) first. From e9d06e0ec5d128327334be27f76e82dad6489dd2 Mon Sep 17 00:00:00 2001 From: dxl <64101226@qq.com> Date: Wed, 20 May 2020 16:33:21 +0800 Subject: [PATCH 284/632] Follow naming conventions. --- client/android/pm3_main.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/client/android/pm3_main.c b/client/android/pm3_main.c index b1e388cce..d35ae25fc 100644 --- a/client/android/pm3_main.c +++ b/client/android/pm3_main.c @@ -45,23 +45,23 @@ int push_cmdscriptfile(char *path, bool stayafter) { return PM3_SUCCESS; } -static char *my_executable_path = NULL; -static char *my_executable_directory = NULL; +static char *g_android_my_executable_path = NULL; +static char *g_android_my_executable_directory = NULL; const char *get_my_executable_path(void) { - return my_executable_path; + return g_android_my_executable_path; } const char *get_my_executable_directory(void) { - if (my_executable_directory != NULL) free(my_executable_directory); + if (g_android_my_executable_directory != NULL) free(g_android_my_executable_directory); char buf[1024]; // get current work directory getcwd(buf, sizeof(buf)); // add / to end. sprintf(buf, "%s%s", buf, PATHSEP); // create on global - my_executable_directory = strdup(buf); - return my_executable_directory; + g_android_my_executable_directory = strdup(buf); + return g_android_my_executable_directory; } static void set_my_executable_path(void) { From b6d764aec9dd3c89bf9c2c3c3dbaa3145b6802dd Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 20 May 2020 11:13:21 +0200 Subject: [PATCH 285/632] Add: 'lf fdx demod' - decoding of Bio-Thermo lf tag. Thanks to Rosco! See Destron Fearing LifeChip with Bio-Thermo technology and http://www.proxmark.org/forum/viewtopic.php?pid=38984#p38984 --- client/src/cmdlffdx.c | 66 +- traces/lf_fdx_biothermo.pm3 | 10000 ++++++++++++++++++++++++++++++++++ 2 files changed, 10047 insertions(+), 19 deletions(-) create mode 100644 traces/lf_fdx_biothermo.pm3 diff --git a/client/src/cmdlffdx.c b/client/src/cmdlffdx.c index 93420ac28..def872fde 100644 --- a/client/src/cmdlffdx.c +++ b/client/src/cmdlffdx.c @@ -62,6 +62,7 @@ static int usage_lf_fdx_clone(void) { PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); PrintAndLogEx(NORMAL, " lf fdx clone 999 112233"); + PrintAndLogEx(NORMAL, " lf fdx clone 999 112233 16a"); return PM3_SUCCESS; } @@ -78,19 +79,34 @@ static int usage_lf_fdx_sim(void) { PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); PrintAndLogEx(NORMAL, " lf fdx sim 999 112233"); + PrintAndLogEx(NORMAL, " lf fdx sim 999 112233 16a"); return PM3_SUCCESS; } // clearing the topbit needed for the preambl detection. -static void verify_values(uint64_t *animalid, uint32_t *countryid) { +static void verify_values(uint64_t *animalid, uint32_t *countryid, uint32_t *extended) { if ((*animalid & 0x3FFFFFFFFF) != *animalid) { *animalid &= 0x3FFFFFFFFF; - PrintAndLogEx(INFO, "Animal ID Truncated to 38bits: %"PRIx64, *animalid); + PrintAndLogEx(INFO, "Animal ID truncated to 38bits: " _YELLOW_("%"PRIx64), *animalid); } if ((*countryid & 0x3ff) != *countryid) { *countryid &= 0x3ff; - PrintAndLogEx(INFO, "Country ID Truncated to 10bits: %03d", *countryid); + PrintAndLogEx(INFO, "Country ID truncated to 10bits:" _YELLOW_("%03d"), *countryid); } + if ((*extended & 0xfff) != *extended) { + *extended &= 0xfff; + PrintAndLogEx(INFO, "Extended truncated to 24bits: " _YELLOW_("0x%03X"), *extended); + } +} + +static inline uint32_t bitcount(uint32_t a) { +#if defined __GNUC__ + return __builtin_popcountl(a); +#else + a = a - ((a >> 1) & 0x55555555); + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); + return (((a + (a >> 4)) & 0x0f0f0f0f) * 0x01010101) >> 24; +#endif } // FDX-B ISO11784/85 demod (aka animal tag) BIPHASE, inverted, rf/32, with preamble of 00000000001 (128bits) @@ -187,9 +203,7 @@ static int CmdFDXBdemodBI(const char *Cmd) { //see ASKDemod for what args are accepted //almost the same demod as cmddata.c/CmdFDXBdemodBI -static int CmdFdxDemod(const char *Cmd) { - (void)Cmd; // Cmd is not used so far - +int demodFDX(void) { //Differential Biphase / di-phase (inverted biphase) //get binary from ask wave if (ASKbiphaseDemod("0 32 1 100", false) != PM3_SUCCESS) { @@ -234,8 +248,8 @@ static int CmdFdxDemod(const char *Cmd) { num_to_bytes(rawid, 8, raw); PrintAndLogEx(SUCCESS, "\nFDX-B / ISO 11784/5 Animal Tag ID Found: Raw : %s", sprint_hex(raw, 8)); - PrintAndLogEx(SUCCESS, "Animal ID %04u-%012" PRIu64, countryCode, NationalCode); - PrintAndLogEx(SUCCESS, "National Code %012" PRIu64 " (0x%" PRIx64 ")", NationalCode, NationalCode); + PrintAndLogEx(SUCCESS, "Animal ID " _GREEN_("%04u-%012"PRIu64), countryCode, NationalCode); + PrintAndLogEx(SUCCESS, "National Code " _GREEN_("%012" PRIu64) " (0x%" PRIx64 ")", NationalCode, NationalCode); PrintAndLogEx(SUCCESS, "Country Code %04u", countryCode); PrintAndLogEx(SUCCESS, "Reserved/RFU %u (0x04%X)", reservedCode, reservedCode); PrintAndLogEx(SUCCESS, "Animal Tag %s", animalBit ? _YELLOW_("True") : "False"); @@ -243,7 +257,7 @@ static int CmdFdxDemod(const char *Cmd) { uint8_t c[] = {0, 0}; compute_crc(CRC_11784, raw, sizeof(raw), &c[0], &c[1]); - PrintAndLogEx(SUCCESS, "CRC-16 0x%04X [%s] ", crc, (crc == (c[1] << 8 | c[0])) ? _GREEN_("OK") : _RED_("Fail")); + PrintAndLogEx(SUCCESS, "CRC-16 0x%04X (%s) ", crc, (crc == (c[1] << 8 | c[0])) ? _GREEN_("ok") : _RED_("fail")); if (g_debugMode) { PrintAndLogEx(DEBUG, "Start marker %d; Size %zu", preambleIndex, size); @@ -251,12 +265,30 @@ static int CmdFdxDemod(const char *Cmd) { PrintAndLogEx(DEBUG, "DEBUG bin stream:\n%s", bin); } + uint8_t bt_par = (extended & 0x100) >> 8; + uint8_t bt_temperature = extended & 0xff; + uint8_t bt_calc_parity = (bitcount(bt_temperature) & 0x1) ? 0 : 1; + uint8_t is_bt_temperature = (bt_calc_parity == bt_par) && !(extended & 0xe00) ; + + if (is_bt_temperature) { + float bt_F = 74 + bt_temperature * 0.2; + float bt_C = (bt_F - 32) / 1.8; + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(SUCCESS, "Bio-Thermo detected"); + PrintAndLogEx(INFO, " temperature " _GREEN_("%.1f")" F / " _GREEN_("%.1f") " C", bt_F, bt_C); + } + // set block 0 for later //g_DemodConfig = T55x7_MODULATION_DIPHASE | T55x7_BITRATE_RF_32 | 4 << T55x7_MAXBLOCK_SHIFT; return PM3_SUCCESS; } +static int CmdFdxDemod(const char *Cmd) { + (void)Cmd; // Cmd is not used so far + return demodFDX(); +} + static int CmdFdxRead(const char *Cmd) { lf_read(false, 10000); return CmdFdxDemod(Cmd); @@ -272,9 +304,9 @@ static int CmdFdxClone(const char *Cmd) { countryid = param_get32ex(Cmd, 0, 0, 10); animalid = param_get64ex(Cmd, 1, 0, 10); - extended = param_get32ex(Cmd, 2, 0, 10); + extended = param_get32ex(Cmd, 2, 0, 16); - verify_values(&animalid, &countryid); + verify_values(&animalid, &countryid, &extended); uint8_t *bits = calloc(128, sizeof(uint8_t)); @@ -298,7 +330,7 @@ static int CmdFdxClone(const char *Cmd) { free(bits); - PrintAndLogEx(INFO, "Preparing to clone FDX-B to T55x7 with animal ID: %04u-%"PRIu64, countryid, animalid); + PrintAndLogEx(INFO, "Preparing to clone FDX-B to T55x7 with animal ID: " _GREEN_("%04u-%"PRIu64)" (extended 0x%X)", countryid, animalid, extended); print_blocks(blocks, ARRAYLEN(blocks)); int res = clone_t55xx_tag(blocks, ARRAYLEN(blocks)); @@ -316,11 +348,11 @@ static int CmdFdxSim(const char *Cmd) { countryid = param_get32ex(Cmd, 0, 0, 10); animalid = param_get64ex(Cmd, 1, 0, 10); - extended = param_get32ex(Cmd, 2, 0, 10); + extended = param_get32ex(Cmd, 2, 0, 16); - verify_values(&animalid, &countryid); + verify_values(&animalid, &countryid, &extended); - PrintAndLogEx(SUCCESS, "Simulating FDX-B animal ID: %04u-%"PRIu64, countryid, animalid); + PrintAndLogEx(SUCCESS, "Simulating FDX-B animal ID: " _GREEN_("%04u-%"PRIu64)" (extended 0x%X)", countryid, animalid, extended); //getFDXBits(uint64_t national_id, uint16_t country, uint8_t isanimal, uint8_t isextended, uint32_t extended, uint8_t *bits) uint8_t *bits = calloc(128, sizeof(uint8_t)); @@ -389,10 +421,6 @@ int detectFDXB(uint8_t *dest, size_t *size) { return (int)startIdx; } -int demodFDX(void) { - return CmdFdxDemod(""); -} - int getFDXBits(uint64_t national_id, uint16_t country, uint8_t is_animal, uint8_t is_extended, uint32_t extended, uint8_t *bits) { // add preamble ten 0x00 and one 0x01 diff --git a/traces/lf_fdx_biothermo.pm3 b/traces/lf_fdx_biothermo.pm3 new file mode 100644 index 000000000..77f390f2f --- /dev/null +++ b/traces/lf_fdx_biothermo.pm3 @@ -0,0 +1,10000 @@ +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-120 +-111 +-104 +-98 +-91 +-84 +-77 +-71 +-67 +-63 +106 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +120 +110 +102 +94 +89 +84 +77 +70 +-14 +-113 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-122 +-115 +-108 +-100 +-92 +-84 +-79 +-75 +95 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +125 +116 +108 +102 +95 +87 +80 +75 +71 +-13 +-114 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-121 +-114 +-107 +-99 +-91 +-86 +-81 +-75 +96 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +125 +118 +109 +101 +93 +87 +82 +75 +69 +-15 +-114 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-123 +-115 +-108 +-100 +-91 +-84 +-79 +-75 +95 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +115 +-1 +-108 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-9 +112 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +81 +-30 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-18 +105 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +119 +112 +104 +96 +88 +82 +77 +73 +66 +61 +56 +-26 +-126 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-59 +67 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +64 +-47 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-26 +97 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-23 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +76 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-19 +105 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-23 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-122 +-112 +-104 +-98 +-92 +-85 +-78 +-74 +-69 +-64 +107 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +117 +109 +102 +96 +89 +81 +75 +70 +-13 +-114 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-55 +69 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +67 +-44 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-24 +98 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-23 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +76 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-120 +-110 +-103 +-97 +-91 +-84 +-77 +-71 +-68 +-64 +106 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +118 +4 +-103 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-9 +114 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +83 +-29 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +119 +110 +103 +97 +90 +83 +76 +72 +68 +63 +57 +-27 +-126 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-125 +-117 +-109 +-102 +-93 +-86 +-81 +-76 +94 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +120 +110 +101 +94 +88 +80 +74 +69 +-14 +-115 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-58 +67 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +68 +-43 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-124 +-114 +-105 +-99 +-93 +-86 +-79 +-74 +-70 +-65 +105 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +119 +5 +-103 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-10 +113 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +83 +-30 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +105 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +80 +-32 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +118 +112 +104 +96 +88 +82 +78 +72 +66 +61 +58 +-25 +-125 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-125 +-117 +-109 +-101 +-93 +-86 +-81 +-76 +95 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +117 +108 +101 +94 +86 +80 +75 +69 +-16 +-115 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-59 +68 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +70 +-41 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-122 +-114 +-107 +-99 +-91 +-84 +-79 +-75 +-70 +-64 +107 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +118 +4 +-104 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-10 +113 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +123 +113 +105 +98 +93 +86 +79 +73 +67 +64 +59 +-26 +-125 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-61 +66 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +66 +-44 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-123 +-116 +-108 +-99 +-91 +-86 +-80 +-75 +-69 +-63 +106 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +120 +113 +105 +95 +88 +83 +77 +70 +-15 +-114 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-56 +70 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +69 +-40 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-123 +-113 +-105 +-99 +-93 +-86 +-79 +-73 +-69 +-65 +105 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +120 +110 +102 +94 +88 +83 +77 +70 +-15 +-114 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-58 +68 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +69 +-42 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-25 +100 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-23 +100 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-36 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +80 +-32 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-122 +-113 +-103 +-97 +-91 +-85 +-78 +-71 +-66 +-62 +106 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +118 +3 +-105 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-8 +113 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +81 +-30 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-18 +104 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-23 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +118 +110 +103 +96 +88 +82 +77 +72 +66 +61 +57 +-25 +-125 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-60 +68 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +70 +-40 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-24 +98 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +76 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-23 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-23 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +104 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +76 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-120 +-112 +-105 +-98 +-90 +-83 +-78 +-73 +-68 +-62 +106 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +118 +110 +103 +95 +87 +81 +77 +72 +-13 +-115 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-56 +69 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +68 +-41 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-25 +98 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-122 +-113 +-103 +-97 +-91 +-85 +-78 +-72 +-67 +-64 +106 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +118 +3 +-104 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-8 +113 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +122 +112 +104 +98 +90 +83 +77 +73 +67 +62 +58 +-24 +-124 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-117 +-107 +-100 +-94 +-88 +-81 +-74 +95 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +115 +1 +-106 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-12 +112 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +121 +113 +106 +99 +91 +84 +78 +74 +68 +62 +58 +-25 +-124 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-59 +67 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +67 +-42 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-122 +-114 +-105 +-98 +-92 +-86 +-78 +-74 +-70 +-64 +105 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +119 +111 +103 +94 +88 +83 +78 +71 +-15 +-115 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-58 +68 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +67 +-44 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-123 +-115 +-106 +-98 +-92 +-86 +-80 +-72 +-68 +-64 +105 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +119 +110 +101 +94 +89 +84 +77 +70 +-15 +-114 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-57 +70 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +65 +-46 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-121 +-114 +-106 +-99 +-90 +-84 +-79 +-74 +-69 +-63 +106 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +118 +109 +102 +96 +90 +83 +76 +71 +-13 +-112 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-122 +-115 +-108 +-100 +-91 +-85 +-80 +-75 +95 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +113 +-1 +-108 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-9 +113 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +83 +-30 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +104 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-19 +105 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +121 +111 +102 +95 +90 +84 +77 +71 +67 +63 +58 +-27 +-126 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-61 +66 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +67 +-43 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-25 +98 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +76 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +100 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +80 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +100 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-119 +-110 +-104 +-97 +-90 +-82 +-76 +-72 +-68 +-63 +107 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +118 +4 +-103 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-10 +113 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +81 +-32 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-18 +105 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +76 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-23 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-23 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +119 +110 +103 +97 +91 +84 +77 +71 +67 +63 +57 +-27 +-126 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-125 +-117 +-109 +-102 +-93 +-86 +-81 +-76 +94 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +124 +116 +109 +102 +93 +86 +80 +76 +70 +-15 +-116 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-123 +-114 +-106 +-100 +-94 +-86 +-79 +-73 +95 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +115 +0 +-107 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-11 +112 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +80 +-32 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +118 +110 +103 +97 +90 +83 +76 +71 +67 +62 +57 +-27 +-126 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-125 +-117 +-109 +-101 +-93 +-86 +-81 +-76 +94 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +125 +118 +109 +100 +92 +86 +81 +76 +69 +-16 +-116 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-124 +-115 +-106 +-99 +-93 +-87 +-79 +-74 +94 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +124 +118 +110 +101 +93 +86 +81 +76 +70 +-14 +-115 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-124 +-116 +-108 +-98 +-92 +-87 +-80 +-73 +96 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +124 +116 +108 +102 +94 +86 +79 +75 +71 +-14 +-115 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-56 +69 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +65 +-45 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-23 +99 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +76 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-19 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-32 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-122 +-112 +-103 +-97 +-91 +-85 +-78 +-71 +-67 +-64 +105 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +117 +2 +-104 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-9 +113 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +83 +-29 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-23 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +121 +111 +102 +95 +89 +84 +77 +71 +66 +62 +59 +-25 +-126 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-117 +-107 +-100 +-94 +-88 +-81 +-74 +96 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +115 +1 +-106 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-10 +113 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +81 +-32 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +104 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-19 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-19 +104 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +119 +113 +104 +96 +89 +84 +78 +72 +66 +62 +58 +-26 +-126 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-62 +65 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +66 +-44 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-24 +99 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +76 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-120 +-113 +-105 +-97 +-88 +-83 +-78 +-73 +-66 +-61 +106 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +118 +111 +104 +96 +88 +81 +76 +72 +-12 +-114 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-125 +-116 +-107 +-98 +-91 +-86 +-80 +-74 +97 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +116 +2 +-106 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-11 +112 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +120 +113 +106 +98 +90 +84 +79 +73 +67 +62 +59 +-24 +-123 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-59 +65 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +67 +-43 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-26 +98 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-120 +-113 +-105 +-97 +-89 +-83 +-78 +-73 +-67 +-61 +108 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +118 +110 +104 +96 +89 +81 +76 +72 +-12 +-113 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-124 +-115 +-106 +-98 +-92 +-86 +-80 +-74 +97 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +116 +2 +-106 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-11 +111 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +123 +114 +105 +97 +91 +86 +80 +73 +67 +63 +60 +-24 +-125 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-60 +65 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +66 +-44 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-125 +-115 +-106 +-98 +-90 +-83 +-76 +-72 +-68 +-63 +106 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +118 +2 +-105 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-8 +113 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +122 +115 +107 +99 +91 +84 +79 +75 +69 +63 +58 +-24 +-124 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-126 +-118 +-108 +-99 +-93 +-87 +-81 +-76 +96 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +113 +-1 +-108 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-11 +112 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +122 +112 +104 +98 +92 +86 +78 +72 +67 +63 +58 +-27 +-126 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-123 +-115 +-108 +-100 +-93 +-88 +-82 +-75 +94 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +113 +-1 +-108 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-10 +111 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +82 +-30 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-19 +104 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +104 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +76 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +105 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +76 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +76 +-36 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +119 +110 +102 +97 +89 +82 +76 +72 +66 +61 +57 +-26 +-126 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-60 +65 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +67 +-44 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-26 +98 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +100 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +100 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-119 +-111 +-104 +-97 +-89 +-82 +-76 +-72 +-67 +-62 +108 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +119 +4 +-104 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-10 +114 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +80 +-32 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-19 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-19 +104 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +104 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +120 +111 +102 +95 +89 +84 +77 +71 +66 +63 +58 +-27 +-126 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-124 +-116 +-109 +-102 +-95 +-87 +-80 +-75 +93 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +113 +-2 +-109 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-9 +114 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-32 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +118 +110 +104 +95 +87 +82 +77 +71 +65 +61 +58 +-26 +-126 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-62 +64 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +67 +-44 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-124 +-114 +-105 +-98 +-92 +-86 +-79 +-72 +-67 +-64 +105 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +118 +110 +104 +96 +88 +81 +76 +72 +-13 +-114 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-56 +69 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +66 +-44 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-124 +-115 +-106 +-98 +-91 +-86 +-80 +-74 +-67 +-63 +105 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +120 +5 +-102 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-10 +113 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +122 +113 +105 +98 +92 +84 +78 +73 +69 +64 +58 +-26 +-124 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-124 +-116 +-109 +-101 +-92 +-86 +-81 +-76 +94 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +114 +1 +-106 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-11 +112 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +121 +114 +106 +97 +90 +86 +80 +73 +68 +65 +60 +-25 +-124 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-124 +-117 +-109 +-101 +-93 +-86 +-80 +-76 +93 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +115 +1 +-106 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-10 +111 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +120 +113 +106 +98 +90 +84 +78 +74 +69 +63 +58 +-25 +-124 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-126 +-117 +-108 +-99 +-92 +-87 +-81 +-76 +95 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +117 +107 +101 +93 +86 +80 +75 +69 +-16 +-115 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-57 +70 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +66 +-44 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-26 +97 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-32 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-18 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +75 +-37 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +80 +-32 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-120 +-112 +-106 +-98 +-90 +-83 +-77 +-73 +-68 +-62 +107 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +120 +5 +-103 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-8 +114 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +80 +-32 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +80 +-31 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +76 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-19 +105 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-33 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +76 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +100 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-32 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +120 +111 +104 +96 +88 +82 +77 +72 +66 +61 +57 +-26 +-126 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-61 +64 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +67 +-44 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-25 +100 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-32 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-32 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-120 +-111 +-104 +-99 +-92 +-85 +-79 +-75 +-69 +-63 +105 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +120 +110 +101 +94 +88 +83 +77 +70 +-15 +-115 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-122 +-114 +-107 +-100 +-91 +-84 +-78 +-74 +95 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +118 +108 +100 +94 +87 +80 +74 +70 +-14 +-115 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-56 +68 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +68 +-43 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-26 +99 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-120 +-111 +-104 +-98 +-91 +-83 +-76 +-71 +-67 +-63 +107 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +118 +109 +101 +94 +89 +82 +75 +70 +-13 +-113 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-125 +-116 +-107 +-99 +-91 +-85 +-80 +-75 +96 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +125 +117 +110 +101 +93 +86 +81 +76 +70 +-15 +-114 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-122 +-114 +-107 +-100 +-92 +-84 +-78 +-74 +95 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +125 +115 +106 +100 +94 +87 +80 +74 +69 +-14 +-114 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-124 +-116 +-107 +-98 +-91 +-86 +-80 +-75 +96 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +114 +0 +-107 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-11 +111 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +82 +-30 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +104 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +80 +-32 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +79 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +102 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +119 +111 +103 +97 +90 +83 +77 +72 +68 +64 +58 +-26 +-125 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-61 +66 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +65 +-46 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-25 +100 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-32 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-23 +100 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +76 +-36 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-19 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +80 +-32 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-120 +-111 +-104 +-98 +-91 +-84 +-76 +-71 +-67 +-63 +106 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +119 +111 +102 +94 +88 +82 +78 +71 +-15 +-115 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-57 +68 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +67 +-44 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-24 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-121 +-112 +-103 +-96 +-90 +-85 +-79 +-72 +-66 +-62 +106 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +118 +3 +-105 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-7 +114 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +81 +-31 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-18 +104 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +119 +111 +103 +98 +90 +83 +76 +71 +67 +63 +57 +-27 +-126 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-124 +-117 +-109 +-102 +-93 +-86 +-81 +-76 +93 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +125 +118 +109 +100 +92 +86 +81 +76 +69 +-15 +-116 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-59 +67 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +70 +-41 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-123 +-113 +-104 +-98 +-92 +-85 +-78 +-72 +-68 +-64 +105 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +118 +4 +-103 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-6 +117 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +81 +-30 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +104 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +77 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-20 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +118 +109 +102 +96 +89 +82 +75 +72 +67 +61 +56 +-27 +-125 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-125 +-117 +-109 +-101 +-92 +-85 +-80 +-76 +94 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +124 +115 +107 +101 +94 +87 +80 +75 +70 +-13 +-114 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-56 +68 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +66 +-43 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-123 +-115 +-108 +-100 +-91 +-86 +-81 +-75 +-68 +-64 +104 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +117 +2 +-106 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-8 +115 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +121 +113 +106 +99 +91 +84 +78 +74 +69 +64 +58 +-26 +-124 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-61 +66 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +66 +-44 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-124 +-114 +-106 +-100 +-93 +-85 +-79 +-74 +-69 +-64 +106 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +117 +109 +103 +96 +89 +81 +76 +71 +-12 +-114 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-56 +69 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +69 +-41 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-124 +-115 +-105 +-97 +-91 +-86 +-80 +-73 +-67 +-63 +104 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +117 +109 +103 +95 +88 +81 +76 +72 +-13 +-114 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-55 +69 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +68 +-42 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-25 +99 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +78 +-34 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +103 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +76 +-35 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-21 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +76 +-36 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-127 +-22 +101 +126 +126 +126 +126 +126 +126 +126 +126 +126 From bf5604808dbce0829f125f1e2ed135a3d0acc90c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 20 May 2020 11:13:46 +0200 Subject: [PATCH 286/632] add regression test for biothermo --- pm3test.sh | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/pm3test.sh b/pm3test.sh index 27a7619b8..3bd7ae3a8 100755 --- a/pm3test.sh +++ b/pm3test.sh @@ -116,19 +116,21 @@ while true; do if ! CheckExecute "trace load/list x" "$PM3BIN -c 'trace load traces/hf_mfu.trace; trace list x 1;'" "0.0101840425"; then break; fi echo -e "\n${C_BLUE}Testing LF:${C_NC}" - if ! CheckExecute "lf EM4x05 test" "$PM3BIN -c 'data load traces/em4x05.pm3;lf search 1'" "FDX-B ID found"; then break; fi - if ! CheckExecute "lf EM410x test" "$PM3BIN -c 'data load traces/EM4102-1.pm3;lf search 1'" "EM410x ID found"; then break; fi - if ! CheckExecute "lf VISA2000 test" "$PM3BIN -c 'data load traces/visa2000.pm3;lf search 1'" "Visa2000 ID found"; then break; fi - if ! CheckExecute "lf AWID test" "$PM3BIN -c 'data load traces/AWID-15-259.pm3;lf search 1'" "AWID ID found"; then break; fi - if ! CheckExecute "lf SECURAKEY test" "$PM3BIN -c 'data load traces/securakey-64169.pm3;lf search 1 '" "Securakey ID found"; then break; fi - if ! CheckExecute "lf NEXWATCH test" "$PM3BIN -c 'data load traces/quadrakey-521512301.pm3;lf search 1 '" "NexWatch ID found"; then break; fi - if ! CheckExecute "lf KERI test" "$PM3BIN -c 'data load traces/keri.pm3;lf search 1'" "Pyramid ID found"; then break; fi - if ! CheckExecute "lf HID Prox test" "$PM3BIN -c 'data load traces/hid-proxCardII-05512-11432784-1.pm3;lf search 1'" "HID Prox ID found"; then break; fi - if ! CheckExecute "lf PARADOX test" "$PM3BIN -c 'data load traces/Paradox-96_40426-APJN08.pm3;lf search 1'" "Paradox ID found"; then break; fi - if ! CheckExecute "lf PAC test" "$PM3BIN -c 'data load traces/pac-8E4C058E.pm3;lf search 1'" "PAC/Stanley ID found"; then break; fi - if ! CheckExecute "lf VIKING test" "$PM3BIN -c 'data load traces/Transit999-best.pm3;lf search 1'" "Viking ID found"; then break; fi - if ! CheckExecute "lf FDX-B test" "$PM3BIN -c 'data load traces/homeagain1600.pm3;lf search 1'" "FDX-B ID found"; then break; fi - if ! CheckExecute "lf INDALA test" "$PM3BIN -c 'data load traces/indala-504278295.pm3;lf search 1'" "Indala ID found"; then break; fi + if ! CheckExecute "lf EM4x05 test" "$PM3BIN -c 'data load traces/em4x05.pm3;lf search 1'" "FDX-B ID found"; then break; fi + if ! CheckExecute "lf EM410x test" "$PM3BIN -c 'data load traces/EM4102-1.pm3;lf search 1'" "EM410x ID found"; then break; fi + if ! CheckExecute "lf VISA2000 test" "$PM3BIN -c 'data load traces/visa2000.pm3;lf search 1'" "Visa2000 ID found"; then break; fi + if ! CheckExecute "lf AWID test" "$PM3BIN -c 'data load traces/AWID-15-259.pm3;lf search 1'" "AWID ID found"; then break; fi + if ! CheckExecute "lf SECURAKEY test" "$PM3BIN -c 'data load traces/securakey-64169.pm3;lf search 1 '" "Securakey ID found"; then break; fi + if ! CheckExecute "lf NEXWATCH test" "$PM3BIN -c 'data load traces/quadrakey-521512301.pm3;lf search 1 '" "NexWatch ID found"; then break; fi + if ! CheckExecute "lf KERI test" "$PM3BIN -c 'data load traces/keri.pm3;lf search 1'" "Pyramid ID found"; then break; fi + if ! CheckExecute "lf HID Prox test" "$PM3BIN -c 'data load traces/hid-proxCardII-05512-11432784-1.pm3;lf search 1'" "HID Prox ID found"; then break; fi + if ! CheckExecute "lf PARADOX test" "$PM3BIN -c 'data load traces/Paradox-96_40426-APJN08.pm3;lf search 1'" "Paradox ID found"; then break; fi + if ! CheckExecute "lf PAC test" "$PM3BIN -c 'data load traces/pac-8E4C058E.pm3;lf search 1'" "PAC/Stanley ID found"; then break; fi + if ! CheckExecute "lf VIKING test" "$PM3BIN -c 'data load traces/Transit999-best.pm3;lf search 1'" "Viking ID found"; then break; fi + if ! CheckExecute "lf FDX-B test" "$PM3BIN -c 'data load traces/homeagain1600.pm3;lf search 1'" "FDX-B ID found"; then break; fi + if ! CheckExecute "lf INDALA test" "$PM3BIN -c 'data load traces/indala-504278295.pm3;lf search 1'" "Indala ID found"; then break; fi + if ! CheckExecute "lf FDX/BioThermo test" "$PM3BIN -c 'data load traces/lf_fdx_biothermo.pm3; lf fdx demo'" "95.2 F / 35.1 C"; then break; fi + echo -e "\n${C_BLUE}Testing HF:${C_NC}" if ! CheckExecute "hf mf offline text" "$PM3BIN -c 'hf mf'" "at_enc"; then break; fi From a31c20753f7d33980860dfd799b659f5854d622a Mon Sep 17 00:00:00 2001 From: Iceman Date: Wed, 20 May 2020 11:19:50 +0200 Subject: [PATCH 287/632] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 261d65e0b..8222032f2 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,7 @@ This repo compiles nicely on - Windows/mingw environment with Qt5.6.1 & GCC 4.9 - Ubuntu 1604 -> 2004 - ParrotOS, Gentoo, Pentoo, Kali, Nethunter, Archlinux, Fedora, Debian + - Rasbian - Android / Termux - Mac OS X / Homebrew - WSL, WSL2 (Windows subsystem linux) on Windows 10 @@ -70,8 +71,8 @@ This repo compiles nicely on Hardware to run client on - PC - - Andriod - - Rasbian Pi + - Android + - Raspberry Pi & Raspberry Pi Zero - Jetson Nano ## Roadmap From 56bde131109e3aa228127febb78158fefd78971f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 20 May 2020 14:15:35 +0200 Subject: [PATCH 288/632] format string --- client/src/cmdhfmfdes.c | 6 +++--- client/src/cmdhfmfp.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index 7dd07655b..c8bf75424 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -4002,21 +4002,21 @@ static int CmdHF14aDesChk(const char *Cmd) { PrintAndLogEx(ERR, "Aes key list is empty. Nothing to check."); return PM3_EINVARG; } else { - PrintAndLogEx(INFO, "Loaded " _YELLOW_("%zu") " aes keys", aeskeyListLen); + PrintAndLogEx(INFO, "Loaded " _YELLOW_("%"PRIu32) " aes keys", aeskeyListLen); } if (deskeyListLen == 0) { PrintAndLogEx(ERR, "Des key list is empty. Nothing to check."); return PM3_EINVARG; } else { - PrintAndLogEx(INFO, "Loaded " _YELLOW_("%zu") " des keys", deskeyListLen); + PrintAndLogEx(INFO, "Loaded " _YELLOW_("%"PRIu32) " des keys", deskeyListLen); } if (k3kkeyListLen == 0) { PrintAndLogEx(ERR, "K3k key list is empty. Nothing to check."); return PM3_EINVARG; } else { - PrintAndLogEx(INFO, "Loaded " _YELLOW_("%zu") " k3kdes keys", k3kkeyListLen); + PrintAndLogEx(INFO, "Loaded " _YELLOW_("%"PRIu32) " k3kdes keys", k3kkeyListLen); } if (!verbose) diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index 27c606203..b3c8e5c22 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -1191,7 +1191,7 @@ static int CmdHFMFPChk(const char *Cmd) { PrintAndLogEx(ERR, "Key list is empty. Nothing to check."); return PM3_EINVARG; } else { - PrintAndLogEx(INFO, "Loaded " _YELLOW_("%zu") " keys", keyListLen); + PrintAndLogEx(INFO, "Loaded " _YELLOW_("%"PRIu32) " keys", keyListLen); } if (!verbose) From 8792314609fd1d71b83e4caf54f0de47afba0ba2 Mon Sep 17 00:00:00 2001 From: FlUxIUS Date: Wed, 20 May 2020 15:59:06 +0200 Subject: [PATCH 289/632] Oyster MDES trace --- traces/hf_mdes_oyster_reader.trace | Bin 0 -> 203 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 traces/hf_mdes_oyster_reader.trace diff --git a/traces/hf_mdes_oyster_reader.trace b/traces/hf_mdes_oyster_reader.trace new file mode 100644 index 0000000000000000000000000000000000000000..ef42bf4d69272fcb8036143a982663bc945f5fdc GIT binary patch literal 203 zcmWHPW?*>0%*YVLaM29L3Jij=F6P2mft@f`>qG_y2TrC27v=*OmoP9a;ACQ$tkBT9 ziGhJZoVB5YrB_9D!^K)g1_ez{hRFqBe%7wF46Lge84mC=H>lh&dvI|dBUs;5puRJV zV0}jF)(z_%F1~~4n_2+opZYS9fmMcyfq{>?LE%q3*X QI2zbW%Nv;*m_BR-0MgDlU;qFB literal 0 HcmV?d00001 From f79df08f26a6afd04f17a96341c9b3a67f4516ae Mon Sep 17 00:00:00 2001 From: FlUxIUS Date: Wed, 20 May 2020 16:09:05 +0200 Subject: [PATCH 290/632] Adding HF 15 traces --- traces/hf_15_reader.trace | Bin 0 -> 36 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 traces/hf_15_reader.trace diff --git a/traces/hf_15_reader.trace b/traces/hf_15_reader.trace new file mode 100644 index 0000000000000000000000000000000000000000..e3ea16c2b2bbc2d2e5b2ccb115b9873efc33fce5 GIT binary patch literal 36 qcmXreWMC-ZWo1xfWcbF#u)&N02zVM87@HF+?PfHvKe%GdzyJVun+O&F literal 0 HcmV?d00001 From b22ea6f8469a6772163cdc8de520d8ad4b219079 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 20 May 2020 18:28:10 +0200 Subject: [PATCH 291/632] fix: matty_run eloadcard --- armsrc/Standalone/hf_mattyrun.c | 266 +++++++++++++++++++++++--------- 1 file changed, 189 insertions(+), 77 deletions(-) diff --git a/armsrc/Standalone/hf_mattyrun.c b/armsrc/Standalone/hf_mattyrun.c index 1ffa321a3..e6e099d7c 100644 --- a/armsrc/Standalone/hf_mattyrun.c +++ b/armsrc/Standalone/hf_mattyrun.c @@ -53,15 +53,12 @@ static uint8_t uid[10]; static uint32_t cuid; static iso14a_card_select_t p_card; -/* - Pseudo-configuration block. -*/ +// Pseudo-configuration block. static bool printKeys = false; // Prints keys static bool transferToEml = true; // Transfer keys to emulator memory static bool ecfill = true; // Fill emulator memory with cards content. static bool simulation = true; // Simulates an exact copy of the target tag static bool fillFromEmulator = false; // Dump emulator memory. -static uint8_t stKeyBlock = 20; // Set the quantity of keys in the block. //----------------------------------------------------------------------------- // Matt's StandAlone mod. @@ -179,7 +176,8 @@ static int saMifareCSetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_ /* the chk function is a piwi’ed(tm) check that will try all keys for a particular sector. also no tracing no dbg */ -static int saMifareChkKeys(uint8_t blockNo, uint8_t keyType, bool clearTrace, uint8_t keyCount, uint8_t *datain, uint64_t *key) { +static int saMifareChkKeys(uint8_t blockNo, uint8_t keyType, bool clearTrace, + uint8_t keyCount, uint8_t *datain, uint64_t *key) { DBGLEVEL = DBG_NONE; iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); set_tracing(false); @@ -188,13 +186,15 @@ static int saMifareChkKeys(uint8_t blockNo, uint8_t keyType, bool clearTrace, ui struct Crypto1State *pcs; pcs = &mpcs; - for (int i = 0; i < keyCount; ++i) { + int retval = -1; + + for (uint8_t i = 0; i < keyCount; i++) { /* no need for anticollision. just verify tag is still here */ // if (!iso14443a_fast_select_card(cjuid, 0)) { if (!iso14443a_select_card(uid, &p_card, &cuid, true, 0, true)) { DbprintfEx(FLAG_NEWLINE, "FATAL : E_MF_LOSTTAG"); - return -1; + break; } uint64_t ui64Key = bytes_to_num(datain + i * 6, 6); @@ -205,45 +205,111 @@ static int saMifareChkKeys(uint8_t blockNo, uint8_t keyType, bool clearTrace, ui SpinDelayUs(AUTHENTICATION_TIMEOUT); continue; } - crypto1_deinit(pcs); - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); *key = ui64Key; - return i; + retval = i; + break; } crypto1_deinit(pcs); FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - - return -1; + return retval; } +/* Abusive microgain on original MifareECardLoad : + * - *datain used as error return + * - tracing is falsed + */ +static int saMifareECardLoad(uint32_t numofsectors, uint8_t keytype) { + DBGLEVEL = DBG_NONE; + + uint8_t numSectors = numofsectors; + uint8_t keyType = keytype; + + struct Crypto1State mpcs = {0, 0}; + struct Crypto1State *pcs; + pcs = &mpcs; + + uint8_t dataoutbuf[16]; + uint8_t dataoutbuf2[16]; + + iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); + clear_trace(); + set_tracing(false); + + int retval = PM3_SUCCESS; + + if (!iso14443a_select_card(uid, &p_card, &cuid, true, 0, true)) { + retval = PM3_ESOFT; + DbprintfEx(FLAG_RAWPRINT, "Can't select card"); + goto out; + } + + for (uint8_t s = 0; s < numSectors; s++) { + uint64_t ui64Key = emlGetKey(s, keyType); + if (s == 0) { + if (mifare_classic_auth(pcs, cuid, FirstBlockOfSector(s), keyType, ui64Key, AUTH_FIRST)) { + retval = PM3_ESOFT; + break; + } + } else { + if (mifare_classic_auth(pcs, cuid, FirstBlockOfSector(s), keyType, ui64Key, AUTH_NESTED)) { + retval = PM3_ESOFT; + break; + } + } + + // failure to read one block, skips to next sector. + for (uint8_t blockNo = 0; blockNo < NumBlocksPerSector(s); blockNo++) { + if (mifare_classic_readblock(pcs, cuid, FirstBlockOfSector(s) + blockNo, dataoutbuf)) { + retval = PM3_ESOFT; + break; + }; + + if (blockNo < NumBlocksPerSector(s) - 1) { + emlSetMem(dataoutbuf, FirstBlockOfSector(s) + blockNo, 1); + } else { + // sector trailer, keep the keys, set only the AC + emlGetMem(dataoutbuf2, FirstBlockOfSector(s) + blockNo, 1); + memcpy(&dataoutbuf2[6], &dataoutbuf[6], 4); + emlSetMem(dataoutbuf2, FirstBlockOfSector(s) + blockNo, 1); + } + } + } + + int res = mifare_classic_halt(pcs, cuid); + (void)res; + +out: + crypto1_deinit(pcs); + FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); + return retval; +} + + void ModInfo(void) { DbpString(" HF Mifare sniff/clone - aka MattyRun (Matías A. Ré Medina)"); } +/* + It will check if the keys from the attacked tag are a subset from + the hardcoded set of keys inside of the ARM. If this is the case + then it will load the keys into the emulator memory and also the + content of the victim tag, to finally simulate it. + + Alternatively, it can be dumped into a blank card. + + This source code has been tested only in Mifare 1k. + + If you're using the proxmark connected to a device that has an OS, and you're not using the proxmark3 client to see the debug + messages, you MUST uncomment usb_disable(). +*/ void RunMod(void) { StandAloneMode(); - Dbprintf(">> Matty mifare chk/dump/sim a.k.a MattyRun Started <<"); FpgaDownloadAndGo(FPGA_BITSTREAM_HF); - - /* - It will check if the keys from the attacked tag are a subset from - the hardcoded set of keys inside of the ARM. If this is the case - then it will load the keys into the emulator memory and also the - content of the victim tag, to finally simulate it. - - Alternatively, it can be dumped into a blank card. - - This source code has been tested only in Mifare 1k. - - If you're using the proxmark connected to a device that has an OS, and you're not using the proxmark3 client to see the debug - messages, you MUST uncomment usb_disable(). - */ + Dbprintf(">> Matty mifare chk/dump/sim a.k.a MattyRun Started <<"); // Comment this line below if you want to see debug messages. // usb_disable(); - - uint16_t mifare_size = 1024; // Mifare 1k (only 1k supported for now) uint8_t sectorSize = 64; // 1k's sector size is 64 bytes. uint8_t blockNo = 3; // Security block is number 3 for each sector. @@ -252,9 +318,7 @@ void RunMod(void) { uint8_t *keyBlock; // Where the keys will be held in memory. bool keyFound = false; - /* - Set of keys to be used. - */ + // Set of keys to be used. uint64_t mfKeys[] = { 0xffffffffffff, // Default key 0x000000000000, // Blank key @@ -269,22 +333,73 @@ void RunMod(void) { 0xa0478cc39091, 0x533cb6c723f6, 0x8fd0a4f256e9, + 0x484558414354, // INFINEONON A / 0F SEC B / INTRATONE / HEXACT... + 0x414c41524f4e, // ALARON NORALSY + 0x424c41524f4e, // BLARON NORALSY + 0x4a6352684677, // COMELIT A General Key / 08 [2] 004 + 0x536653644c65, // COMELIT B General Key / 08 [2] 004 + 0x8829da9daf76, // URMET CAPTIV IF A => ALL A/B / BTICINO + 0x314B49474956, // "1KIGIV" VIGIK'S SERVICE BADGE A KEY + 0x021209197591, // BTCINO UNDETERMINED SPREAKD 0x01->0x13 key + 0x010203040506, // VIGIK's B Derivative + 0xa22ae129c013, // INFINEON B 00 + 0x49fae4e3849f, // INFINEON B 01 + 0x38fcf33072e0, // INFINEON B 02 + 0x8ad5517b4b18, // INFINEON B 03 + 0x509359f131b1, // INFINEON B 04 + 0x6c78928e1317, // INFINEON B 05 + 0xaa0720018738, // INFINEON B 06 + 0xa6cac2886412, // INFINEON B 07 + 0x62d0c424ed8e, // INFINEON B 08 + 0xe64a986a5d94, // INFINEON B 09 + 0x8fa1d601d0a2, // INFINEON B 0A + 0x89347350bd36, // INFINEON B 0B + 0x66d2b7dc39ef, // INFINEON B 0C + 0x6bc1e1ae547d, // INFINEON B 0D + 0x22729a9bd40f, // INFINEON B 0E + 0xd2ece8b9395e, // lib / Nat Bieb + 0x1494E81663D7, // # NSCP default key + 0x569369c5a0e5, // # kiev + 0x632193be1c3c, // # kiev + 0x644672bd4afe, // # kiev + 0x8fe644038790, // # kiev + 0x9de89e070277, // # kiev + 0xb5ff67cba951, // # kiev / ov-chipkaart + 0xeff603e1efe9, // # kiev + 0xf14ee7cae863, // # kiev + 0xfc00018778f7, // # Västtrafiken KeyA, RKF ÖstgötaTrafiken KeyA + 0x0297927c0f77, // # Västtrafiken KeyA + 0x54726176656c, // # Västtrafiken KeyA + 0x00000ffe2488, // # Västtrafiken KeyB + 0x776974687573, // # Västtrafiken KeyB + 0xee0042f88840, // # Västtrafiken KeyB + 0x26940b21ff5d, // # RKF SLKeyA + 0xa64598a77478, // # RKF SLKeyA + 0x5c598c9c58b5, // # RKF SLKeyB + 0xe4d2770a89be, // # RKF SLKeyB + 0x722bfcc5375f, // # RKF RejskortDanmark KeyA + 0xf1d83f964314, // # RKF RejskortDanmark KeyB + 0x505249564141, // # RKF JOJOPRIVAKeyA + 0x505249564142, // # RKF JOJOPRIVAKeyB + 0x47524f555041, // # RKF JOJOGROUPKeyA + 0x47524f555042, // # RKF JOJOGROUPKeyB + 0x434f4d4d4f41, // # RKF JOJOGROUPKeyA + 0x434f4d4d4f42, // # RKF JOJOGROUPKeyB + 0x4b0b20107ccb, // # TNP3xxx }; /* This part allocates the byte representation of the keys in keyBlock's memory space . */ - keyBlock = BigBuf_malloc(stKeyBlock * 6); + keyBlock = BigBuf_malloc(ARRAYLEN(mfKeys) * 6); int mfKeysCnt = ARRAYLEN(mfKeys); for (int mfKeyCounter = 0; mfKeyCounter < mfKeysCnt; mfKeyCounter++) { num_to_bytes(mfKeys[mfKeyCounter], 6, (uint8_t *)(keyBlock + mfKeyCounter * 6)); } - /* - Pretty print of the keys to be checked. - */ + // Pretty print of the keys to be checked. if (printKeys) { Dbprintf("[+] Printing mf keys"); for (uint8_t keycnt = 0; keycnt < mfKeysCnt; keycnt++) @@ -301,18 +416,19 @@ void RunMod(void) { */ bool validKey[2][40]; uint8_t foundKey[2][40][6]; - for (uint16_t t = 0; t < 2; t++) { + for (uint8_t i = 0; i < 2; i++) { for (uint16_t sectorNo = 0; sectorNo < sectorsCnt; sectorNo++) { - validKey[t][sectorNo] = false; - for (uint16_t i = 0; i < 6; i++) { - foundKey[t][sectorNo][i] = 0xff; - } + validKey[i][sectorNo] = false; + foundKey[i][sectorNo][0] = 0xFF; + foundKey[i][sectorNo][1] = 0xFF; + foundKey[i][sectorNo][2] = 0xFF; + foundKey[i][sectorNo][3] = 0xFF; + foundKey[i][sectorNo][4] = 0xFF; + foundKey[i][sectorNo][5] = 0xFF; } } - /* - Iterates through each sector checking if there is a correct key. - */ + // Iterates through each sector checking if there is a correct key. bool err = 0; bool allKeysFound = true; uint32_t size = mfKeysCnt; @@ -324,7 +440,7 @@ void RunMod(void) { int key = saMifareChkKeys(block, type, true, size, &keyBlock[0], &key64); if (key == -1) { LED(LED_RED, 50); - Dbprintf("\t✕ Key not found for this sector!"); + Dbprintf("\t [✕] Key not found for this sector!"); allKeysFound = false; // break; } else if (key == -2) { @@ -334,7 +450,7 @@ void RunMod(void) { num_to_bytes(key64, 6, foundKey[type][sec]); validKey[type][sec] = true; keyFound = true; - Dbprintf("\t✓ Found valid key: [%02x%02x%02x%02x%02x%02x]\n", + Dbprintf("\t [✓] Found valid key: [%02x%02x%02x%02x%02x%02x]\n", (keyBlock + 6 * key)[0], (keyBlock + 6 * key)[1], (keyBlock + 6 * key)[2], (keyBlock + 6 * key)[3], (keyBlock + 6 * key)[4], (keyBlock + 6 * key)[5] ); @@ -371,8 +487,9 @@ void RunMod(void) { emlClearMem(); uint8_t mblock[16]; - for (uint16_t sectorNo = 0; sectorNo < sectorsCnt; sectorNo++) { + for (uint8_t sectorNo = 0; sectorNo < sectorsCnt; sectorNo++) { if (validKey[0][sectorNo] || validKey[1][sectorNo]) { + emlGetMem(mblock, FirstBlockOfSector(sectorNo) + NumBlocksPerSector(sectorNo) - 1, 1); // data, block num, blocks count (max 4) for (uint16_t t = 0; t < 2; t++) { if (validKey[t][sectorNo]) { @@ -382,47 +499,40 @@ void RunMod(void) { emlSetMem(mblock, FirstBlockOfSector(sectorNo) + NumBlocksPerSector(sectorNo) - 1, 1); } } - Dbprintf("\t✓ Found keys have been transferred to the emulator memory."); + + Dbprintf("\t [✓] Found keys have been transferred to the emulator memory."); + if (ecfill) { int filled; Dbprintf("\tFilling in with key A."); - filled = MifareECardLoad(sectorsCnt, 0); + + filled = saMifareECardLoad(sectorsCnt, 0); if (filled != PM3_SUCCESS) { - Dbprintf("\t✕ Failed filling with A."); - } - - Dbprintf("\tFilling in with key B."); - filled = MifareECardLoad(sectorsCnt, 1); - if (filled != PM3_SUCCESS) { - Dbprintf("\t✕ Failed filling with B."); + + Dbprintf("\t [✕] Failed filling with A."); + Dbprintf("\tFilling in with key B."); + filled = saMifareECardLoad(sectorsCnt, 1); + if (filled != PM3_SUCCESS) { + Dbprintf("\t [✕] Failed filling with B."); + } } if ((filled == PM3_SUCCESS) && simulation) { - Dbprintf("\t✓ Emulator memory filled, simulation started."); + Dbprintf("\t [✓] Emulator memory filled, simulation started."); // This will tell the fpga to emulate using previous keys and current target tag content. Dbprintf("\t Press button to abort simulation at anytime."); LED_B_ON(); // green - // assuming arg0==0, use hardcoded uid 0xdeadbeaf - uint16_t simflags; - switch (p_card.uidlen) { - case 10: - simflags = FLAG_10B_UID_IN_DATA; - break; - case 7: - simflags = FLAG_7B_UID_IN_DATA; - break; - default: - simflags = FLAG_4B_UID_IN_DATA; - break; - } - Mifare1ksim(simflags | FLAG_MF_1K, 0, uid, 0, 0); - LED_B_OFF(); - /* - Needs further testing. - */ + uint16_t simflags = FLAG_UID_IN_EMUL | FLAG_MF_1K; + + SpinOff(1000); + Mifare1ksim(simflags, 0, uid, 0, 0); + LED_B_OFF(); + Dbprintf("\t [✓] Simulation ended"); + + // Needs further testing. if (fillFromEmulator) { uint8_t retry = 5; Dbprintf("\t Trying to dump into blank card."); @@ -457,8 +567,10 @@ void RunMod(void) { } } - } else if (filled != PM3_SUCCESS) { - Dbprintf("\t✕ Emulator memory could not be filled due to errors."); + } + + if (filled != PM3_SUCCESS) { + Dbprintf("\t [✕] Emulator memory could not be filled due to errors."); LED_C_ON(); } } From 30be05ec3f0269fb45ad8d5e400a6887704d97e8 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 20 May 2020 18:28:43 +0200 Subject: [PATCH 292/632] chg: removed debugstatements, the code doesnt use them --- armsrc/Standalone/hf_colin.c | 125 +++++++++++++---------------------- 1 file changed, 45 insertions(+), 80 deletions(-) diff --git a/armsrc/Standalone/hf_colin.c b/armsrc/Standalone/hf_colin.c index 0656d1186..ba5c21cab 100644 --- a/armsrc/Standalone/hf_colin.c +++ b/armsrc/Standalone/hf_colin.c @@ -232,14 +232,6 @@ static void cjSetCursLeft(void) { static void cjTabulize(void) { DbprintfEx(FLAG_RAWPRINT, "\t\t\t"); } -/* -void cjPrintKey(uint64_t key, uint8_t *foundKey, uint16_t sectorNo, uint8_t type) { - char tosendkey[13]; - sprintf(tosendkey, "%02x%02x%02x%02x%02x%02x", foundKey[0], foundKey[1], foundKey[2], foundKey[3], foundKey[4], -foundKey[5]); cjSetCursRight(); DbprintfEx(FLAG_NEWLINE, "SEC: %02x | KEY : %s | TYP: %d", sectorNo, tosendkey, type); -} -*/ - static char *ReadSchemasFromSPIFFS(char *filename) { SpinOff(0); @@ -292,6 +284,7 @@ static void ReadLastTagFromFlash(void) { // this one will handle filetype (symlink or not) and resolving by itself rdv40_spiffs_read_as_filetype((char *)HFCOLIN_LASTTAG_SYMLINK, (uint8_t *)mem, len, RDV40_SPIFFS_SAFETY_SAFE); + // copy 64blocks (16bytes) starting w block0, to emulator mem. emlSetMem(mem, 0, 64); DbprintfEx(FLAG_NEWLINE, "[OK] Last tag recovered from FLASHMEM set to emulator"); @@ -330,16 +323,22 @@ void WriteTagToFlash(uint32_t uid, size_t size) { return; } -void ModInfo(void) { DbpString(" HF Mifare ultra fast sniff/sim/clone - aka VIGIKPWN (Colin Brigato)"); } +void ModInfo(void) { + DbpString(" HF Mifare ultra fast sniff/sim/clone - aka VIGIKPWN (Colin Brigato)"); +} void RunMod(void) { StandAloneMode(); + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); + Dbprintf(">> HF Mifare ultra fast sniff/sim/clone a.k.a VIGIKPWN Started <<"); + // turn off all debugging. + DBGLEVEL = DBG_NONE; + // add_schema(Schemas, Noralsy, &total_schemas); // add_schema(Schemas, InfiHexact, &total_schemas); // add_schema_from_json_in_spiffs((char *)HFCOLIN_URMETCAPTIVE_JSON); // add_schema(Schemas, UrmetCaptive, &total_schemas); - FpgaDownloadAndGo(FPGA_BITSTREAM_HF); currline = 20; curlline = 20; @@ -386,11 +385,11 @@ void RunMod(void) { ACCBITS : 796788[00]+VALUE */ -//---------------------------- +// ---------------------------- // Set of keys to be used. // This should cover ~98% of // French VIGIK system @2017 -//---------------------------- +// ---------------------------- const uint64_t mfKeys[] = { 0xffffffffffff, // TRANSPORTS @@ -459,7 +458,6 @@ void RunMod(void) { bool err = 0; bool trapped = 0; bool allKeysFound = true; - uint32_t size = mfKeysCnt; // banner: @@ -487,7 +485,7 @@ failtag: SpinOff(50); LED_A_ON(); uint8_t ticker = 0; - // while (!BUTTON_PRESS() && !iso14443a_select_card(cjuid, NULL, &cjcuid, true, 0, true)) + while (!iso14443a_select_card(cjuid, &p_card, &cjcuid, true, 0, true)) { WDT_HIT(); @@ -505,8 +503,8 @@ failtag: } SpinOff(50); - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); + vtsend_cursor_position_restore(NULL); DbprintfEx(FLAG_NEWLINE, "\t\t\t%s[ GOT a Tag ! ]%s", _XGREEN_, _XWHITE_); cjSetCursLeft(); @@ -534,7 +532,7 @@ failtag: uint32_t start_time = GetTickCount(); uint32_t delta_time = 0; - //--------------------------------------------------------------------------- + // --------------------------------------------------------------------------- // WE SHOULD FIND A WAY TO GET UID TO AVOID THIS "TESTRUN" // -------------------------------------------------------- // + HERE IS TO BE THOUGHT AS ONLY A KEY SHOULD BE CHECK @@ -544,7 +542,7 @@ failtag: // `-+ THEN FILL EMULATOR WITH B KEEY // `-+ THEN EMULATOR WITH CARD WITH B KEY // `-+ IF IT HAS FAILED OF ANY OF SORT THEN WE ARE MARRON LIKE POMALO. - //---------------------------------------------------------------------------- + // ---------------------------------------------------------------------------- // AN EVEN BETTER IMPLEMENTATION IS TO CHECK EVERY KEY FOR SECTOR 0 KEY A // THEN IF FOUND CHECK THE SAME KEY FOR NEXT SECTOR ONLY KEY A // THEN IF FAIL CHECK EVERY SECTOR A KEY FOR EVERY OTHER KEY BUT NOT THE BLOCK @@ -558,7 +556,7 @@ failtag: // DERIVATION // THEN IF B KEY IS NOT OF THIS SCHEME CHECK EVERY REMAINING B KEYED SECTOR // WITH EVERY REMAINING KEYS, BUT DISCARDING ANY DEFAULT TRANSPORT KEYS. - //----------------------------------------------------------------------------- + // ----------------------------------------------------------------------------- // also we could avoid first UID check for every block // then let's expose this optimal case of well known vigik schemes : @@ -625,7 +623,6 @@ failtag: break; } } - /* etc etc for testing schemes quick schemes */ } } @@ -641,7 +638,7 @@ failtag: return; } - /* Settings keys to emulator */ + // Settings keys to emulator emlClearMem(); uint8_t mblock[16]; for (uint8_t sectorNo = 0; sectorNo < sectorsCnt; sectorNo++) { @@ -655,7 +652,7 @@ failtag: DbprintfEx(FLAG_NEWLINE, "%s>>%s Setting Keys->Emulator MEM...[%sOK%s]", _XYELLOW_, _XWHITE_, _XGREEN_, _XWHITE_); - /* filling TAG to emulator */ + // filling TAG to emulator int filled; cjSetCursLeft(); @@ -666,11 +663,10 @@ failtag: DbprintfEx(FLAG_NEWLINE, "%s>>%s W_FAILURE ! %sTrying fallback B keys....", _XRED_, _XORANGE_, _XWHITE_); - /* no trace, no dbg */ + // no trace, no dbg filled = e_MifareECardLoad(sectorsCnt, 1); if (filled != PM3_SUCCESS) { cjSetCursLeft(); - DbprintfEx(FLAG_NEWLINE, "FATAL:EML_FALLBACKFILL_B"); SpinErr(LED_C, 100, 8); SpinOff(100); @@ -717,10 +713,9 @@ readysim: SpinOff(100); LED_C_ON(); - DBGLEVEL = DBG_NONE; - - //uint16_t flags=0; - /*switch (p_card.uidlen) { + /* + uint16_t flags = 0; + switch (p_card.uidlen) { case 10: flags = FLAG_10B_UID_IN_DATA; break; @@ -733,19 +728,18 @@ readysim: default: flags = FLAG_UID_IN_EMUL; break; - }*/ - + } // Use UID, SAK, ATQA from EMUL, if uid not defined - // if ((flags & (FLAG_4B_UID_IN_DATA | FLAG_7B_UID_IN_DATA | FLAG_10B_UID_IN_DATA)) == 0) { - //flags |= FLAG_UID_IN_EMUL; - //} - //flags |= FLAG_MF_1K; - //if ((flags & (FLAG_4B_UID_IN_DATA | FLAG_7B_UID_IN_DATA | FLAG_10B_UID_IN_DATA)) == 0) { - // flags |= FLAG_UID_IN_EMUL; - //} - //flags = 0x10; - uint16_t flags = 0; - flags = 16; + if ((flags & (FLAG_4B_UID_IN_DATA | FLAG_7B_UID_IN_DATA | FLAG_10B_UID_IN_DATA)) == 0) { + flags |= FLAG_UID_IN_EMUL; + } + flags |= FLAG_MF_1K; + if ((flags & (FLAG_4B_UID_IN_DATA | FLAG_7B_UID_IN_DATA | FLAG_10B_UID_IN_DATA)) == 0) { + flags |= FLAG_UID_IN_EMUL; + } + flags = 0x10; + */ + uint16_t flags = FLAG_UID_IN_EMUL; DbprintfEx(FLAG_NEWLINE, "\n\n\n\n\n\n\n\nn\n\nn\n\n\nflags: %d (0x%02x)", flags, flags); cjSetCursLeft(); SpinOff(1000); @@ -789,8 +783,6 @@ readysim: * - tracing is falsed */ int e_MifareECardLoad(uint32_t numofsectors, uint8_t keytype) { - DBGLEVEL = DBG_NONE; - uint8_t numSectors = numofsectors; uint8_t keyType = keytype; @@ -802,7 +794,6 @@ int e_MifareECardLoad(uint32_t numofsectors, uint8_t keytype) { uint8_t dataoutbuf2[16]; iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); - clear_trace(); set_tracing(false); @@ -810,24 +801,17 @@ int e_MifareECardLoad(uint32_t numofsectors, uint8_t keytype) { if (!iso14443a_select_card(cjuid, &p_card, &cjcuid, true, 0, true)) { isOK = false; - if (DBGLEVEL >= 1) - DbprintfEx(FLAG_RAWPRINT, "Can't select card"); } for (uint8_t s = 0; isOK && s < numSectors; s++) { uint64_t ui64Key = emlGetKey(s, keyType); if (s == 0) { if (isOK && mifare_classic_auth(pcs, cjcuid, FirstBlockOfSector(s), keyType, ui64Key, AUTH_FIRST)) { - - if (DBGLEVEL >= 1) - DbprintfEx(FLAG_NEWLINE, "Sector[%2d]. Auth error", s); break; } } else { if (isOK && mifare_classic_auth(pcs, cjcuid, FirstBlockOfSector(s), keyType, ui64Key, AUTH_NESTED)) { isOK = false; - if (DBGLEVEL >= 1) - DbprintfEx(FLAG_NEWLINE, "Sector[%2d]. Auth nested error", s); break; } } @@ -835,8 +819,6 @@ int e_MifareECardLoad(uint32_t numofsectors, uint8_t keytype) { for (uint8_t blockNo = 0; isOK && blockNo < NumBlocksPerSector(s); blockNo++) { if (isOK && mifare_classic_readblock(pcs, cjcuid, FirstBlockOfSector(s) + blockNo, dataoutbuf)) { isOK = false; - if (DBGLEVEL >= 1) - DbprintfEx(FLAG_NEWLINE, "Error reading sector %2d block %2d", s, blockNo); break; }; if (isOK) { @@ -852,23 +834,18 @@ int e_MifareECardLoad(uint32_t numofsectors, uint8_t keytype) { } } - if (mifare_classic_halt(pcs, cjcuid)) { - if (DBGLEVEL >= 1) - DbprintfEx(FLAG_NEWLINE, "Halt error"); - }; + int res = mifare_classic_halt(pcs, cjcuid); + (void)res; crypto1_deinit(pcs); - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - return (isOK) ? PM3_SUCCESS : PM3_EUNDEF; } /* the chk function is a piwi'ed(tm) check that will try all keys for a particular sector. also no tracing no dbg */ -int cjat91_saMifareChkKeys(uint8_t blockNo, uint8_t keyType, bool clearTrace, uint8_t keyCount, uint8_t *datain, - uint64_t *key) { - DBGLEVEL = DBG_NONE; +int cjat91_saMifareChkKeys(uint8_t blockNo, uint8_t keyType, bool clearTrace, + uint8_t keyCount, uint8_t *datain, uint64_t *key) { iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); set_tracing(false); @@ -876,14 +853,16 @@ int cjat91_saMifareChkKeys(uint8_t blockNo, uint8_t keyType, bool clearTrace, ui struct Crypto1State *pcs; pcs = &mpcs; - for (int i = 0; i < keyCount; ++i) { + int retval = -1; + + for (uint8_t i = 0; i < keyCount; i++) { /* no need for anticollision. just verify tag is still here */ // if (!iso14443a_fast_select_card(cjuid, 0)) { if (!iso14443a_select_card(cjuid, &p_card, &cjcuid, true, 0, true)) { cjSetCursLeft(); DbprintfEx(FLAG_NEWLINE, "%sFATAL%s : E_MF_LOSTTAG", _XRED_, _XWHITE_); - return -1; + break; } uint64_t ui64Key = bytes_to_num(datain + i * 6, 6); @@ -894,15 +873,13 @@ int cjat91_saMifareChkKeys(uint8_t blockNo, uint8_t keyType, bool clearTrace, ui SpinDelayUs(AUTHENTICATION_TIMEOUT); continue; } - crypto1_deinit(pcs); - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); *key = ui64Key; - return i; + retval = i; + break; } crypto1_deinit(pcs); FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - - return -1; + return retval; } void saMifareMakeTag(void) { @@ -920,7 +897,6 @@ void saMifareMakeTag(void) { int flags = 0; for (int blockNum = 0; blockNum < 16 * 4; blockNum++) { uint8_t mblock[16]; - // cnt = 0; emlGetMem(mblock, blockNum, 1); // switch on field and send magic sequence if (blockNum == 0) @@ -935,21 +911,15 @@ void saMifareMakeTag(void) { flags = 0x04 + 0x10; if (saMifareCSetBlock(0, flags & 0xFE, blockNum, mblock)) { - //&& cnt <= retry) { - // cnt++; cjSetCursFRight(); if (currfline > 53) { currfline = 54; } DbprintfEx(FLAG_NEWLINE, "Block :%02x %sOK%s", blockNum, _XGREEN_, _XWHITE_); - // DbprintfEx(FLAG_RAWPRINT,"FATAL:E_MF_CHINESECOOK_NORICE"); - // cfail=1; - // return; continue; } else { cjSetCursLeft(); cjSetCursLeft(); - DbprintfEx(FLAG_NEWLINE, "`--> %sFAIL%s : CHN_FAIL_BLK_%02x_NOK", _XRED_, _XWHITE_, blockNum); cjSetCursFRight(); DbprintfEx(FLAG_NEWLINE, "%s>>>>%s STOP AT %02x", _XRED_, _XWHITE_, blockNum); @@ -957,14 +927,9 @@ void saMifareMakeTag(void) { break; } cjSetCursFRight(); - DbprintfEx(FLAG_NEWLINE, "%s>>>>>>>> END <<<<<<<<%s", _XYELLOW_, _XWHITE_); - // break; - /*if (cfail == 1) { - DbprintfEx(FLAG_RAWPRINT,"FATAL: E_MF_HARA_KIRI_\r\n"); - break; - } */ } + if (cfail == 0) { SpinUp(50); SpinUp(50); From 35886fab91b5fa6a87a1ef2e81badb6bc5cf2fdc Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 20 May 2020 18:30:41 +0200 Subject: [PATCH 293/632] chg: must have a default return value --- armsrc/mifarecmd.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index b98526726..ef1a15864 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -1940,7 +1940,7 @@ int MifareECardLoad(uint8_t sectorcnt, uint8_t keytype) { clear_trace(); set_tracing(true); - int retval; + int retval = PM3_SUCCESS; if (!iso14443a_select_card(uid, NULL, &cuid, true, 0, true)) { retval = PM3_ESOFT; @@ -1952,8 +1952,9 @@ int MifareECardLoad(uint8_t sectorcnt, uint8_t keytype) { uint64_t ui64Key = emlGetKey(sectorNo, keytype); if (sectorNo == 0) { if (mifare_classic_auth(pcs, cuid, FirstBlockOfSector(sectorNo), keytype, ui64Key, AUTH_FIRST)) { + retval = PM3_ESOFT; if (DBGLEVEL > DBG_ERROR) Dbprintf("Sector[%2d]. Auth error", sectorNo); - break; + goto out; } } else { if (mifare_classic_auth(pcs, cuid, FirstBlockOfSector(sectorNo), keytype, ui64Key, AUTH_NESTED)) { @@ -1979,10 +1980,8 @@ int MifareECardLoad(uint8_t sectorcnt, uint8_t keytype) { } } - if (mifare_classic_halt(pcs, cuid)) { - if (DBGLEVEL > DBG_ERROR) - Dbprintf("Halt error"); - } + int res = mifare_classic_halt(pcs, cuid); + (void)res; if (DBGLEVEL >= DBG_INFO) DbpString("Emulator fill sectors finished"); From 15ccb34535b0aa9603124506cf4c4d1ff4dc433b Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 20 May 2020 13:28:37 +0200 Subject: [PATCH 294/632] Add -Wconversion in EXTRACFLAGS --- Makefile.defs | 1 + client/deps/tinycbor/Makefile | 2 +- common_arm/Makefile.common | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile.defs b/Makefile.defs index be504caa9..8ad2e319f 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -63,6 +63,7 @@ endif EXTRACFLAGS = EXTRACFLAGS += -Wunused-parameter -Wno-error=unused-parameter EXTRACFLAGS += -Wsign-compare -Wno-error=sign-compare +EXTRACFLAGS += -Wconversion -Wno-error=conversion -Wno-error=sign-conversion -Wno-error=float-conversion # unknown to clang or old gcc: # First we activate Wextra then we explicitly list those we know about diff --git a/client/deps/tinycbor/Makefile b/client/deps/tinycbor/Makefile index 4de65aa7f..b50c1584f 100644 --- a/client/deps/tinycbor/Makefile +++ b/client/deps/tinycbor/Makefile @@ -1,7 +1,7 @@ MYSRCPATHS = MYINCLUDES = # Strange errors on Mingw when compiling with C99 -MYCFLAGS = -Wno-bad-function-cast -Wno-redundant-decls -Wno-incompatible-pointer-types-discards-qualifiers -Wno-discarded-qualifiers -Wno-unknown-warning-option -Wno-maybe-uninitialized +MYCFLAGS = -Wno-bad-function-cast -Wno-redundant-decls -Wno-incompatible-pointer-types-discards-qualifiers -Wno-discarded-qualifiers -Wno-unknown-warning-option -Wno-maybe-uninitialized -Wno-conversion MYDEFS = MYSRCS = \ cborencoder.c \ diff --git a/common_arm/Makefile.common b/common_arm/Makefile.common index 81f2b0131..8b5836e73 100644 --- a/common_arm/Makefile.common +++ b/common_arm/Makefile.common @@ -61,6 +61,7 @@ EXTRACFLAGS += -Wunused-parameter -Wno-error=unused-parameter EXTRACFLAGS += -Wswitch-enum -Wno-error=switch-enum EXTRACFLAGS += -Wsign-compare -Wno-error=sign-compare EXTRACFLAGS += -Wold-style-definition -Wno-error=old-style-definition +EXTRACFLAGS += -Wconversion -Wno-error=conversion -Wno-error=sign-conversion -Wno-error=float-conversion # unknown to clang or old gcc: # First we activate Wextra then we explicitly list those we know about From c87afd0b7d3881a468a5809aeba7ef7b366c5691 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 20 May 2020 13:38:39 +0200 Subject: [PATCH 295/632] trace load: err if offline mode --- client/src/cmdtrace.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index 43d84c3f3..4df4ee0c0 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -33,7 +33,7 @@ static int usage_trace_list(void) { PrintAndLogEx(NORMAL, " c - mark CRC bytes"); PrintAndLogEx(NORMAL, " x - show hexdump to convert to pcap(ng) or to import into Wireshark using encapsulation type \"ISO 14443\""); PrintAndLogEx(NORMAL, " syntax to use: `text2pcap -t \"%%S.\" -l 264 -n `"); - PrintAndLogEx(NORMAL, " <0|1> - use data from Tracebuffer, if not set, try reading data from tag."); + PrintAndLogEx(NORMAL, " <0|1> - use data from Tracebuffer, if not set, try to collect a trace from Proxmark3 device."); PrintAndLogEx(NORMAL, "Supported values:"); PrintAndLogEx(NORMAL, " raw - just show raw data without annotations"); PrintAndLogEx(NORMAL, " 14a - interpret data as iso14443a communications"); @@ -593,6 +593,10 @@ int CmdTraceList(const char *Cmd) { if (isOnline) { + if (!IfPm3Present()) { + PrintAndLogEx(FAILED, "You requested a trace upload in offline mode, consider using parameter '1' for working from Tracebuffer"); + return PM3_EINVARG; + } // reserve some space. if (g_trace) free(g_trace); From b770cfd51c9fea5fb88caa30681c9db19d020f43 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 20 May 2020 19:22:17 +0200 Subject: [PATCH 296/632] le24toh is uint32_t --- client/src/cmdhfmfdes.c | 22 ++++++++++++---------- common/commonutil.c | 2 +- common/commonutil.h | 2 +- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index c8bf75424..a39bd85c0 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -1482,8 +1482,8 @@ static int handler_desfire_writedata(mfdes_data_t *data, MFDES_FILE_TYPE_T type) */ if (data->fileno > 0x1F) return PM3_EINVARG; - int datatowrite = le24toh(data->length); - int offset = le24toh(data->offset); + uint32_t datatowrite = le24toh(data->length); + uint32_t offset = le24toh(data->offset); int datasize; int pos = 0; int recvlen = 0; @@ -1496,7 +1496,8 @@ static int handler_desfire_writedata(mfdes_data_t *data, MFDES_FILE_TYPE_T type) apdu.data = tmp; if (type == MFDES_RECORD_FILE) apdu.INS = MFDES_WRITE_RECORD; - while (datatowrite > 0) { + while (datatowrite) { + if (datatowrite > 52) datasize = 52; else @@ -2319,7 +2320,8 @@ static int CmdHF14ADesReadData(const char *Cmd) { memcpy(ft.length, filesize, 3); ft.fileno = _fileno[0]; - int bytestoread = le24toh(filesize); + uint32_t bytestoread = le24toh(filesize); + bytestoread &= 0xFFFFFF; if (bytestoread == 0) bytestoread = 0xFFFFFF; @@ -2332,8 +2334,8 @@ static int CmdHF14ADesReadData(const char *Cmd) { PrintAndLogEx(SUCCESS, "Successfully read data from file %d:", ft.fileno); PrintAndLogEx(NORMAL, "\nOffset | Data | Ascii"); PrintAndLogEx(NORMAL, "----------------------------------------------------------------------------"); - int len = le24toh(ft.length); - for (int i = 0; i < len; i += 16) { + uint32_t len = le24toh(ft.length); + for (uint32_t i = 0; i < len; i += 16) { PrintAndLogEx(NORMAL, "%02d/0x%02X | %s| %s", i, i, sprint_hex(&ft.data[i], len > 16 ? 16 : len), sprint_ascii(&ft.data[i], len > 16 ? 16 : len)); } } else { @@ -3246,8 +3248,8 @@ static int CmdHF14ADesDump(const char *Cmd) { if (res == PM3_SUCCESS) { PrintAndLogEx(NORMAL, "\nOffset | Data | Ascii"); PrintAndLogEx(NORMAL, "----------------------------------------------------------------------------"); - int len = le24toh(fdata.length); - for (int n = 0; n < len; n += 16) { + uint32_t len = le24toh(fdata.length); + for (uint32_t n = 0; n < len; n += 16) { PrintAndLogEx(NORMAL, "%02d/0x%02X | %s| %s", n, n, sprint_hex(&fdata.data[n], len > 16 ? 16 : len), sprint_ascii(&fdata.data[n], len > 16 ? 16 : len)); } } else { @@ -3299,8 +3301,8 @@ static int CmdHF14ADesDump(const char *Cmd) { if (res == PM3_SUCCESS) { PrintAndLogEx(NORMAL, "\nOffset | Data | Ascii"); PrintAndLogEx(NORMAL, "----------------------------------------------------------------------------"); - int len = le24toh(fdata.length); - for (int n = 0; n < len; n += 16) { + uint32_t len = le24toh(fdata.length); + for (uint32_t n = 0; n < len; n += 16) { PrintAndLogEx(NORMAL, "%02d/0x%02X | %s| %s", n, n, sprint_hex(&fdata.data[n], len > 16 ? 16 : len), sprint_ascii(&fdata.data[n], len > 16 ? 16 : len)); } } else { diff --git a/common/commonutil.c b/common/commonutil.c index 3ff2b4eb4..f831d744d 100644 --- a/common/commonutil.c +++ b/common/commonutil.c @@ -83,7 +83,7 @@ void lsl(uint8_t *data, size_t len) { data[len - 1] <<= 1; } -int32_t le24toh(uint8_t data[3]) { +uint32_t le24toh(uint8_t data[3]) { return (data[2] << 16) | (data[1] << 8) | data[0]; } diff --git a/common/commonutil.h b/common/commonutil.h index a22486fff..0f3dc0065 100644 --- a/common/commonutil.h +++ b/common/commonutil.h @@ -50,7 +50,7 @@ uint64_t bytes_to_num(uint8_t *src, size_t len); void rol(uint8_t *data, const size_t len); void lsl(uint8_t *data, size_t len); -int32_t le24toh(uint8_t data[3]); +uint32_t le24toh(uint8_t data[3]); void htole24(uint32_t val, uint8_t data[3]); #endif From eb7ef65f22f46c1a270fc332bc19bd8f8e041aa8 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 20 May 2020 19:52:22 +0200 Subject: [PATCH 297/632] chg: 'lf nexwatch clone' - only use 12bytes --- client/src/cmdlfnexwatch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdlfnexwatch.c b/client/src/cmdlfnexwatch.c index f8b75594c..fbf2d55eb 100644 --- a/client/src/cmdlfnexwatch.c +++ b/client/src/cmdlfnexwatch.c @@ -281,7 +281,7 @@ static int CmdNexWatchClone(const char *Cmd) { int datalen = 0; uint8_t magic = 0xBE; uint32_t cn = 0; - uint8_t rawhex[16] = {0x56, 0}; + uint8_t rawhex[12] = {0x56, 0}; while (param_getchar(Cmd, cmdp) != 0x00 && !errors) { switch (tolower(param_getchar(Cmd, cmdp))) { From 86ba6c8330a3847d35bca14f8ea5c35191c847a6 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 20 May 2020 14:02:47 +0200 Subject: [PATCH 298/632] Add "make release" --- Makefile | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Makefile b/Makefile index 2ba15fb0c..9f77d3d30 100644 --- a/Makefile +++ b/Makefile @@ -236,5 +236,22 @@ endif # @find . \( -name "*.[ch]" -or \( -name "*.cpp" -and -not -name "*.moc.cpp" \) -or -name "*.lua" -or -name "*.py" -or -name "*.pl" -or -name "*.md" -or -name "*.txt" -or -name "*.awk" -or -name "*.v" \) \ # -exec grep -lP '\\t' {} \; +release: VERSION="v4.$(shell git log --oneline master | wc -l)" +release: + # Preparing a commit for release tagging, to be reverted after tagging. + @echo "# - Tag: $(VERSION)" + # - Removing -Werror... + @find . \( -path "./Makefile.defs" -or -path "./client/Makefile" -or -path "./common_arm/Makefile.common" -or -path "./tools/hitag2crack/*/Makefile" \) -exec sed -i 's/ -Werror//' {} \; + @find . \( -path "./client/deps/*.cmake" -or -path "./client/CMakeLists.txt" \) -exec sed -i 's/ -Werror//' {} \; + # - Changing banner... + @sed -i "s/^#define BANNERMSG3 .*/#define BANNERMSG3 \"Release $(VERSION)\"/" client/src/proxmark3.c + @echo -n "# ";grep "^#define BANNERMSG3" client/src/proxmark3.c + # - Committing... + @git commit -a -m "Release $(VERSION)" + # - Tagging... + @git tag -a -m "Release $(VERSION)" $(VERSION) + # - Reverting... + @git revert --no-edit HEAD + # Dummy target to test for GNU make availability _test: From ef586c2a41fac3a151eb5e157e30b41dcea3f136 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 20 May 2020 15:53:47 +0200 Subject: [PATCH 299/632] version info also for client, still cmake to do --- armsrc/appmain.c | 5 ++-- armsrc/util.c | 34 ------------------------ armsrc/util.h | 1 - client/Makefile | 10 +++++-- client/src/cmdhw.c | 9 +++++-- common/commonutil.c | 34 ++++++++++++++++++++++++ common/commonutil.h | 3 +++ {common_arm => common}/default_version.c | 2 +- include/common.h | 10 +++++++ include/proxmark3_arm.h | 10 +------ tools/mkversion.pl | 2 +- tools/mkversion.sh | 2 +- 12 files changed, 69 insertions(+), 53 deletions(-) rename {common_arm => common}/default_version.c (93%) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 40f8c0ad1..a3d5c3d2f 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -244,8 +244,7 @@ void ReadMem(int addr) { Dbprintf("%x: %02x %02x %02x %02x %02x %02x %02x %02x", addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]); } -/* osimage version information is linked in */ -extern struct version_information version_information; +/* osimage version information is linked in, cf commonutil.h */ /* bootrom version information is pointed to from _bootphase1_version_pointer */ extern char *_bootphase1_version_pointer, _flash_start, _flash_end, __data_src_start__; static void SendVersion(void) { @@ -265,10 +264,12 @@ static void SendVersion(void) { } else { FormatVersionInformation(temp, sizeof(temp), " bootrom: ", bootrom_version); strncat(VersionString, temp, sizeof(VersionString) - strlen(VersionString) - 1); + strncat(VersionString, "\n", sizeof(VersionString) - strlen(VersionString) - 1); } FormatVersionInformation(temp, sizeof(temp), " os: ", &version_information); strncat(VersionString, temp, sizeof(VersionString) - strlen(VersionString) - 1); + strncat(VersionString, "\n", sizeof(VersionString) - strlen(VersionString) - 1); #if defined(__clang__) strncat(VersionString, " compiled with Clang/LLVM "__VERSION__"\n", sizeof(VersionString) - strlen(VersionString) - 1); diff --git a/armsrc/util.c b/armsrc/util.c index ccff567eb..443c9e5f4 100644 --- a/armsrc/util.c +++ b/armsrc/util.c @@ -289,40 +289,6 @@ int BUTTON_HELD(int ms) { return BUTTON_ERROR; } -/* Similar to FpgaGatherVersion this formats stored version information - * into a string representation. It takes a pointer to the struct version_information, - * verifies the magic properties, then stores a formatted string, prefixed by - * prefix in dst. - */ -void FormatVersionInformation(char *dst, int len, const char *prefix, void *version_information) { - struct version_information *v = (struct version_information *)version_information; - dst[0] = 0; - strncat(dst, prefix, len - 1); - if (v->magic != VERSION_INFORMATION_MAGIC) { - strncat(dst, "Missing/Invalid version information\n", len - strlen(dst) - 1); - return; - } - if (v->versionversion != 1) { - strncat(dst, "Version information not understood\n", len - strlen(dst) - 1); - return; - } - if (!v->present) { - strncat(dst, "Version information not available\n", len - strlen(dst) - 1); - return; - } - - strncat(dst, v->gitversion, len - strlen(dst) - 1); - if (v->clean == 0) { - strncat(dst, "-unclean", len - strlen(dst) - 1); - } else if (v->clean == 2) { - strncat(dst, "-suspect", len - strlen(dst) - 1); - } - - strncat(dst, " ", len - strlen(dst) - 1); - strncat(dst, v->buildtime, len - strlen(dst) - 1); - strncat(dst, "\n", len - strlen(dst) - 1); -} - bool data_available(void) { #ifdef WITH_FPC_USART_HOST return usb_poll_validate_length() || (usart_rxdata_available() > 0); diff --git a/armsrc/util.h b/armsrc/util.h index 06c4e024e..c6523a813 100644 --- a/armsrc/util.h +++ b/armsrc/util.h @@ -91,7 +91,6 @@ void SpinUp(uint32_t speed); int BUTTON_CLICKED(int ms); int BUTTON_HELD(int ms); -void FormatVersionInformation(char *dst, int len, const char *prefix, void *version_information); bool data_available(void); #endif diff --git a/client/Makefile b/client/Makefile index ad2f5aa75..59685656b 100644 --- a/client/Makefile +++ b/client/Makefile @@ -179,7 +179,8 @@ CORESRCS = uart/uart_posix.c \ scandir.c \ crc16.c \ crc32.c \ - comms.c + comms.c \ + version.c CMDSRCS = crapto1/crapto1.c \ crapto1/crypto1.c \ @@ -308,7 +309,7 @@ CMDOBJS = $(CMDSRCS:%.c=$(OBJDIR)/%.o) OBJCOBJS = $(OBJCSRCS:%.m=$(OBJDIR)/%.o) BINS = proxmark3 -CLEAN = $(BINS) src/*.moc.cpp src/ui/ui_overlays.h lualibs/pm3_cmd.lua lualibs/mfc_default_keys.lua +CLEAN = $(BINS) src/version.c src/*.moc.cpp src/ui/ui_overlays.h lualibs/pm3_cmd.lua lualibs/mfc_default_keys.lua # transition: cleaning also old path stuff CLEAN += flasher *.moc.cpp ui/ui_overlays.h @@ -426,6 +427,11 @@ zlib: .PHONY: all clean install uninstall tarbin liblua jansson tinycbor reveng hardnested amiibo cliparser whereami mbedtls zlib +# version.c should be remade on every compilation +src/version.c: default_version.c + $(info [=] GEN $@) + $(Q)sh ../tools/mkversion.sh > $@ || perl ../tools/mkversion.pl > $@ || $(CP) $^ $@ + # easy printing of MAKE VARIABLES print-%: ; @echo $* = $($*) diff --git a/client/src/cmdhw.c b/client/src/cmdhw.c index 3b452b492..45e56ba49 100644 --- a/client/src/cmdhw.c +++ b/client/src/cmdhw.c @@ -20,6 +20,7 @@ #include "ui.h" #include "cmdhw.h" #include "cmddata.h" +#include "commonutil.h" static int CmdHelp(const char *Cmd); @@ -688,7 +689,9 @@ void pm3_version(bool verbose, bool oneliner) { if (oneliner) { // For "proxmark3 -v", simple printf, avoid logging - printf("Client: RRG/Iceman compiled with " PM3CLIENTCOMPILER __VERSION__ PM3HOSTOS PM3HOSTARCH "\n"); + char temp[PM3_CMD_DATA_SIZE - 12]; // same limit as for ARM image + FormatVersionInformation(temp, sizeof(temp), "Client: ", &version_information); + printf("%s compiled with " PM3CLIENTCOMPILER __VERSION__ PM3HOSTOS PM3HOSTARCH "\n", temp); return; } @@ -701,9 +704,11 @@ void pm3_version(bool verbose, bool oneliner) { SendCommandNG(CMD_VERSION, NULL, 0); if (WaitForResponseTimeout(CMD_VERSION, &resp, 1000)) { + char temp[PM3_CMD_DATA_SIZE - 12]; // same limit as for ARM image PrintAndLogEx(NORMAL, "\n " _YELLOW_("[ Proxmark3 RFID instrument ]")); PrintAndLogEx(NORMAL, "\n " _YELLOW_("[ CLIENT ]")); - PrintAndLogEx(NORMAL, " client: RRG/Iceman"); // TODO version info? + FormatVersionInformation(temp, sizeof(temp), " client: ", &version_information); + PrintAndLogEx(NORMAL, "%s", temp); PrintAndLogEx(NORMAL, " compiled with " PM3CLIENTCOMPILER __VERSION__ PM3HOSTOS PM3HOSTARCH); if (IfPm3Flash() == false && IfPm3Smartcard() == false && IfPm3FpcUsartHost() == false) { diff --git a/common/commonutil.c b/common/commonutil.c index f831d744d..14f2d58e5 100644 --- a/common/commonutil.c +++ b/common/commonutil.c @@ -8,6 +8,40 @@ // Utility functions used in many places, not specific to any piece of code. //----------------------------------------------------------------------------- #include "commonutil.h" +#include + +/* Similar to FpgaGatherVersion this formats stored version information + * into a string representation. It takes a pointer to the struct version_information, + * verifies the magic properties, then stores a formatted string, prefixed by + * prefix in dst. + */ +void FormatVersionInformation(char *dst, int len, const char *prefix, void *version_info) { + struct version_information *v = (struct version_information *)version_info; + dst[0] = 0; + strncat(dst, prefix, len - 1); + if (v->magic != VERSION_INFORMATION_MAGIC) { + strncat(dst, "Missing/Invalid version information", len - strlen(dst) - 1); + return; + } + if (v->versionversion != 1) { + strncat(dst, "Version information not understood", len - strlen(dst) - 1); + return; + } + if (!v->present) { + strncat(dst, "Version information not available", len - strlen(dst) - 1); + return; + } + + strncat(dst, v->gitversion, len - strlen(dst) - 1); + if (v->clean == 0) { + strncat(dst, "-unclean", len - strlen(dst) - 1); + } else if (v->clean == 2) { + strncat(dst, "-suspect", len - strlen(dst) - 1); + } + + strncat(dst, " ", len - strlen(dst) - 1); + strncat(dst, v->buildtime, len - strlen(dst) - 1); +} /* ref http://www.csm.ornl.gov/~dunigan/crc.html diff --git a/common/commonutil.h b/common/commonutil.h index 0f3dc0065..fdd2ac065 100644 --- a/common/commonutil.h +++ b/common/commonutil.h @@ -41,6 +41,9 @@ # define NTIME(n) for (int _index = 0; _index < n; _index++) #endif +extern struct version_information version_information; +void FormatVersionInformation(char *dst, int len, const char *prefix, void *version_info); + uint32_t reflect(uint32_t v, int b); // used in crc.c ... uint8_t reflect8(uint8_t b); // dedicated 8bit reversal uint16_t reflect16(uint16_t b); // dedicated 16bit reversal diff --git a/common_arm/default_version.c b/common/default_version.c similarity index 93% rename from common_arm/default_version.c rename to common/default_version.c index b4b8ae17d..e04c88d2a 100644 --- a/common_arm/default_version.c +++ b/common/default_version.c @@ -1,4 +1,4 @@ -#include "proxmark3_arm.h" +#include "common.h" /* This is the default version.c file that Makefile.common falls back to if neither sh nor perl are available */ const struct version_information __attribute__((section(".version_information"))) version_information = { VERSION_INFORMATION_MAGIC, diff --git a/include/common.h b/include/common.h index e7d6bba90..d52e40f10 100644 --- a/include/common.h +++ b/include/common.h @@ -36,6 +36,16 @@ #define PACKED __attribute__((packed)) +#define VERSION_INFORMATION_MAGIC 0x56334d50 // "PM3V" +struct version_information { + int magic; /* Magic sequence to identify this as a correct version information structure. Must be VERSION_INFORMATION_MAGIC */ + char versionversion; /* Must be 1 */ + char present; /* 1 if the version information could be created at compile time, otherwise 0 and the remaining fields (except for magic) are empty */ + char clean; /* 1: Tree was clean, no local changes. 0: Tree was unclean. 2: Couldn't be determined */ + char gitversion[50]; /* String with the git revision */ + char buildtime[30]; /* string with the build time */ +} PACKED; + // debug #define DBG_NONE 0 // no messages #define DBG_ERROR 1 // errors only diff --git a/include/proxmark3_arm.h b/include/proxmark3_arm.h index 3ea80da9d..de3ae9caa 100644 --- a/include/proxmark3_arm.h +++ b/include/proxmark3_arm.h @@ -115,15 +115,7 @@ //NVDD goes LOW when USB is attached. #define USB_ATTACHED() !((AT91C_BASE_PIOA->PIO_PDSR & GPIO_NVDD_ON) == GPIO_NVDD_ON) -#define VERSION_INFORMATION_MAGIC 0x56334d50 // "PM3V" -struct version_information { - int magic; /* Magic sequence to identify this as a correct version information structure. Must be VERSION_INFORMATION_MAGIC */ - char versionversion; /* Must be 1 */ - char present; /* 1 if the version information could be created at compile time, otherwise 0 and the remaining fields (except for magic) are empty */ - char clean; /* 1: Tree was clean, no local changes. 0: Tree was unclean. 2: Couldn't be determined */ - char gitversion[50]; /* String with the git revision */ - char buildtime[30]; /* string with the build time */ -} PACKED; +// VERSION_INFORMATION is now in common.h #define COMMON_AREA_MAGIC 0x43334d50 // "PM3C" #define COMMON_AREA_COMMAND_NONE 0 diff --git a/tools/mkversion.pl b/tools/mkversion.pl index 95a794697..eecacbd72 100644 --- a/tools/mkversion.pl +++ b/tools/mkversion.pl @@ -64,7 +64,7 @@ $fullgitinfo =~ s/(\s)//g; $fullgitinfo = substr $fullgitinfo, 0, 49; print < Date: Wed, 20 May 2020 18:12:41 +0200 Subject: [PATCH 300/632] Makefile: wrap sh and perl calls --- Makefile.defs | 2 ++ armsrc/Makefile | 2 +- bootrom/Makefile | 2 +- client/Makefile | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index 8ad2e319f..d206611d3 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -24,6 +24,8 @@ CROSS ?= arm-none-eabi- CC = gcc CXX = g++ LD = g++ +SH = sh +PERL = perl PATHSEP=/ PREFIX ?= /usr/local diff --git a/armsrc/Makefile b/armsrc/Makefile index 15cfaddfd..bc0fbc74b 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -155,7 +155,7 @@ showinfo: # version.c should be remade on every time fullimage.stage1.elf should be remade version.c: default_version.c $(OBJDIR)/fpga_version_info.o $(OBJDIR)/fpga_all.o $(THUMBOBJ) $(ARMOBJ) $(info [-] GEN $@) - $(Q)sh ../tools/mkversion.sh > $@ || perl ../tools/mkversion.pl > $@ || $(CP) $^ $@ + $(Q)$(SH) ../tools/mkversion.sh > $@ || $(PERL) ../tools/mkversion.pl > $@ || $(CP) $^ $@ fpga_version_info.c: $(FPGA_BITSTREAMS) $(FPGA_COMPRESSOR) $(info [-] GEN $@) diff --git a/bootrom/Makefile b/bootrom/Makefile index 676bd9a05..f6cf18174 100644 --- a/bootrom/Makefile +++ b/bootrom/Makefile @@ -39,7 +39,7 @@ OBJS = $(OBJDIR)/bootrom.s19 # version.c should be remade on every compilation version.c: default_version.c $(info [=] GEN $@) - $(Q)sh ../tools/mkversion.sh > $@ || perl ../tools/mkversion.pl > $@ || $(CP) $^ $@ + $(Q)$(SH) ../tools/mkversion.sh > $@ || $(PERL) ../tools/mkversion.pl > $@ || $(CP) $^ $@ all: showinfo $(OBJS) diff --git a/client/Makefile b/client/Makefile index 59685656b..33810b09b 100644 --- a/client/Makefile +++ b/client/Makefile @@ -430,7 +430,7 @@ zlib: # version.c should be remade on every compilation src/version.c: default_version.c $(info [=] GEN $@) - $(Q)sh ../tools/mkversion.sh > $@ || perl ../tools/mkversion.pl > $@ || $(CP) $^ $@ + $(Q)$(SH) ../tools/mkversion.sh > $@ || $(PERL) ../tools/mkversion.pl > $@ # easy printing of MAKE VARIABLES print-%: ; @echo $* = $($*) From 88ae955673353fe92f8d1425712fcb1423278477 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 20 May 2020 19:07:46 +0200 Subject: [PATCH 301/632] version.c in cmake --- client/CMakeLists.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 07d2abb40..a56ea5a9a 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -176,8 +176,15 @@ set (TARGET_SOURCES src/util.c src/wiegand_formats.c src/wiegand_formatutils.c + ${CMAKE_BINARY_DIR}/version.c ) +add_custom_command( + OUTPUT ${CMAKE_BINARY_DIR}/version.c + COMMAND sh ${CMAKE_SOURCE_DIR}/../tools/mkversion.sh > ${CMAKE_BINARY_DIR}/version.c || perl ${CMAKE_SOURCE_DIR}/../tools/mkversion.pl > ${CMAKE_BINARY_DIR}/version.c || ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../common/default_version.c ${CMAKE_BINARY_DIR}/version.c + DEPENDS ${CMAKE_SOURCE_DIR}/../common/default_version.c +) + set(ADDITIONAL_SRC "") set(ADDITIONAL_LNK "") From 7033927176259b15393412fd7d0e4f3bd9bd0c02 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 20 May 2020 19:37:05 +0200 Subject: [PATCH 302/632] Add RELEASE_NAME --- Makefile | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 9f77d3d30..6b0a6cb76 100644 --- a/Makefile +++ b/Makefile @@ -170,7 +170,7 @@ tarbin: newtarbin client/tarbin armsrc/tarbin bootrom/tarbin # detect if there were changes in the platform definitions, requiring a clean cleanifplatformchanged: -ifeq ($(PLATFORM_CHANGED), true) +ifeq ($(PLATFORM_CHANGED),true) $(info [!] Platform definitions changed, cleaning bootrom/armsrc/recovery first...) $(Q)$(MAKE) --no-print-directory -C bootrom clean $(Q)$(MAKE) --no-print-directory -C armsrc clean @@ -239,17 +239,21 @@ endif release: VERSION="v4.$(shell git log --oneline master | wc -l)" release: # Preparing a commit for release tagging, to be reverted after tagging. - @echo "# - Tag: $(VERSION)" + @echo "# - Release Tag: $(VERSION)" +ifeq ($(RELEASE_NAME),) + $(error "!!! missing RELEASE_NAME") +endif + @echo "# - Release Name: $(RELEASE_NAME)" # - Removing -Werror... @find . \( -path "./Makefile.defs" -or -path "./client/Makefile" -or -path "./common_arm/Makefile.common" -or -path "./tools/hitag2crack/*/Makefile" \) -exec sed -i 's/ -Werror//' {} \; @find . \( -path "./client/deps/*.cmake" -or -path "./client/CMakeLists.txt" \) -exec sed -i 's/ -Werror//' {} \; # - Changing banner... - @sed -i "s/^#define BANNERMSG3 .*/#define BANNERMSG3 \"Release $(VERSION)\"/" client/src/proxmark3.c + @sed -i "s/^#define BANNERMSG3 .*/#define BANNERMSG3 \"Release $(VERSION) - $(RELEASE_NAME)\"/" client/src/proxmark3.c @echo -n "# ";grep "^#define BANNERMSG3" client/src/proxmark3.c # - Committing... - @git commit -a -m "Release $(VERSION)" + @git commit -a -m "Release $(VERSION) - $(RELEASE_NAME)" # - Tagging... - @git tag -a -m "Release $(VERSION)" $(VERSION) + @git tag -a -m "Release $(VERSION) - $(RELEASE_NAME)" $(VERSION) # - Reverting... @git revert --no-edit HEAD From 577380ae48c3261d36b79763df80974915248c77 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 20 May 2020 19:48:39 +0200 Subject: [PATCH 303/632] color ARM/FPGA version sections --- armsrc/appmain.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index a3d5c3d2f..3793182ce 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -257,7 +257,7 @@ static void SendVersion(void) { */ char *bootrom_version = *(char **)&_bootphase1_version_pointer; - strncat(VersionString, " [ ARM ]\n", sizeof(VersionString) - strlen(VersionString) - 1); + strncat(VersionString, " "_YELLOW_("[ ARM ]")"\n", sizeof(VersionString) - strlen(VersionString) - 1); if (bootrom_version < &_flash_start || bootrom_version >= &_flash_end) { strcat(VersionString, "bootrom version information appears invalid\n"); @@ -277,7 +277,7 @@ static void SendVersion(void) { strncat(VersionString, " compiled with GCC "__VERSION__"\n", sizeof(VersionString) - strlen(VersionString) - 1); #endif - strncat(VersionString, "\n [ FPGA ]\n ", sizeof(VersionString) - strlen(VersionString) - 1); + strncat(VersionString, "\n "_YELLOW_("[ FPGA ]")"\n ", sizeof(VersionString) - strlen(VersionString) - 1); for (int i = 0; i < g_fpga_bitstream_num; i++) { strncat(VersionString, g_fpga_version_information[i], sizeof(VersionString) - strlen(VersionString) - 1); From e2a20631c7e016a3fe86f99aea9942c33423efee Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 20 May 2020 20:54:37 +0200 Subject: [PATCH 304/632] remove section version_information for client --- armsrc/Makefile | 1 - common/default_version.c | 8 +++++++- common_arm/Makefile.common | 2 +- tools/mkversion.pl | 8 +++++++- tools/mkversion.sh | 8 +++++++- 5 files changed, 22 insertions(+), 5 deletions(-) diff --git a/armsrc/Makefile b/armsrc/Makefile index bc0fbc74b..60b23c9f7 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -20,7 +20,6 @@ endif #in the next section to remove that particular feature from compilation. # NO space,TABs after the "\" sign. APP_CFLAGS = $(PLATFORM_DEFS) \ - -DON_DEVICE \ -fno-strict-aliasing -ffunction-sections -fdata-sections SRC_LF = lfops.c lfsampling.c pcf7931.c lfdemod.c lfadc.c diff --git a/common/default_version.c b/common/default_version.c index e04c88d2a..0f42590e8 100644 --- a/common/default_version.c +++ b/common/default_version.c @@ -1,6 +1,12 @@ #include "common.h" /* This is the default version.c file that Makefile.common falls back to if neither sh nor perl are available */ -const struct version_information __attribute__((section(".version_information"))) version_information = { +#ifndef ON_DEVICE +#define SECTVERSINFO +#else +#define SECTVERSINFO __attribute__((section(".version_information"))) +#endif + +const struct version_information SECTVERSINFO version_information = { VERSION_INFORMATION_MAGIC, 1, /* version 1 */ 0, /* version information not present */ diff --git a/common_arm/Makefile.common b/common_arm/Makefile.common index 8b5836e73..e2c3ae3bc 100644 --- a/common_arm/Makefile.common +++ b/common_arm/Makefile.common @@ -90,7 +90,7 @@ ifeq ($(NOERROR),1) endif CFLAGS ?= $(DEFCFLAGS) -CFLAGS += $(ARMCFLAGS) -c $(INCLUDE) -std=c99 $(APP_CFLAGS) +CFLAGS += $(ARMCFLAGS) -c $(INCLUDE) -std=c99 -DON_DEVICE $(APP_CFLAGS) LDFLAGS += -nostartfiles -nodefaultlibs -Wl,-gc-sections -Wl,--build-id=none -n LIBS = -lgcc diff --git a/tools/mkversion.pl b/tools/mkversion.pl index eecacbd72..0d8b9de29 100644 --- a/tools/mkversion.pl +++ b/tools/mkversion.pl @@ -66,7 +66,13 @@ $fullgitinfo = substr $fullgitinfo, 0, 49; print < Date: Wed, 20 May 2020 21:39:49 +0200 Subject: [PATCH 305/632] Remove coffee to prepare release --- client/src/proxmark3.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index 07d777a2c..1e2be44ba 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -32,7 +32,7 @@ // Used to enable/disable use of preferences json file #define USE_PREFERENCE_FILE -#define BANNERMSG1 " :snowflake: iceman@icesql.net :coffee:" +#define BANNERMSG1 " :snowflake: iceman@icesql.net" #define BANNERMSG2 " https://github.com/rfidresearchgroup/proxmark3/" #define BANNERMSG3 "pre-release v4.0" From c956314a99180aac8b20ab02fb84ba9fa7834ae8 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 20 May 2020 21:53:47 +0200 Subject: [PATCH 306/632] fix mistake --- client/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/Makefile b/client/Makefile index 33810b09b..79943d8fa 100644 --- a/client/Makefile +++ b/client/Makefile @@ -430,7 +430,7 @@ zlib: # version.c should be remade on every compilation src/version.c: default_version.c $(info [=] GEN $@) - $(Q)$(SH) ../tools/mkversion.sh > $@ || $(PERL) ../tools/mkversion.pl > $@ + $(Q)$(SH) ../tools/mkversion.sh > $@ || $(PERL) ../tools/mkversion.pl > $@ || $(CP) $^ $@ # easy printing of MAKE VARIABLES print-%: ; @echo $* = $($*) From d74ad9d0ea073b033e3e033b8a8110fdfe9909a9 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 21 May 2020 09:04:46 +0200 Subject: [PATCH 307/632] changelog updates --- CHANGELOG.md | 122 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 115 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d67785eb2..90c6dccb3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,13 +3,120 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + +## [ice coffee.4.][2020-05-21] + - Updated documentation (@doegox, @iceman1001) + - Change `pm3test.sh` - more regression tests to (@doegox, @iceman1001) + - Change `hf 15 dump` - now supports basic json format (@iceman1001) + - Change Test and fix many `-Wxxxxxx` warnings [compiler trials] (@doegox) + - Fix COVERITY warnings [compiler trials] (@doegox, @iceman1001) + - Fix CPPCHECKER warnings [compiler trials] (@doegox, @iceman1001) + - Fix CLANG warnings [compiler trials] (@doegox) + - Change, stricter warnings [compiler trials] (@doegox) + - Change, remove section version_information for client (@doegox) + - Change, Add RELEASE_NAME (@doegox) + - Change, version info also for client (@doegox) + - Added `make release` (@doegox) + - Change `trace load` - err if offline mode (@doegox) + - Fix `standalone mode matty_run` eloadcard (@iceman1001) + - Added, HF 15 traces (@FlUxIUS) + - Fix, follow naming conventions [android] (@dxl) + - Change, work directory supported [android] (@dxl) + - Added `lf fdx demod` - decoding of Bio-Thermo lf tag. Thanks to Rosco! (@iceman1001) + - Fix, 32-bit time_t compilation error on [WIN64] (@grspy) + - Change, LogTrace error msg (@doegox) + - Change, remove inline [compiler trials] (@iceman1001) + - Change, adding execute/home/current working directory functions to lua (<@iceman1001) + - Change, fix max duration in LogTrace (@doegox) + - Change, first attempt for trace log header (@iceman1001) + - Change, pm3.sh, attempt to detect BT dongle when udevadm is not available (@doegox) + - Change, pm3.sh, test access to /dev/ttyXXX files as prerequisite for [linux] (@doegox) + - iclass bf: avoid slowdown (@doegox) + - Change, pm3tests.sh, shellcheck (@doegox) + - Change, pm3.sh, shellcheck (@doegox) + - Change, pm3.sh, err msgs on stderr (@doegox) + - Change, pm3.sh, textual and --list with no device, exit 1 (@doegox) + - Change, pm3.sh, without udev: change detection routine (@doegox) + - Change, pm3.sh, alternative if udevadm is not available [termux] (@doegox) + - Change `makefiles` - allow to skip pthread [termux] (@doegox) + - Change `script run test_t55x7` - enabled param to swap modulation to test (@iceman1001) + - Add mf_nonce_brute from https://github.com/@iceman1001/mf_nonce_brute and merge to pm3 Makefile (@doegox) + - Change `lf indala demod` - more lenient size check (@iceman1001) + - Change clarify BUTTON macro usages (@doegox) + - Change fix REV macros & hitagS (@doegox) + - Change, `hf iclass loclass` -removed printvar function (@iceman1001) + - Change, clock can be negative (@iceman1001) + - Change `data tune` (@doegox) + - fancy timers (@doegox) + - Change, copied from pm3 repo (@iceman1001) + - Change psk demodualtion, keep starting samples to easily find the zero init bit (@iceman1001) + - Change use machine/endian.h with osx (Jamie Fiedler) + - Fix 2 issues in proxendian.h (@doegox) + - Fix issue #729. Avoid stalling on non-rdv4 when polling for FeliCa without card in proximity (@doegox) + - Change `lf nexwatch demod` - lenient demod sizes (@iceman1001) + - Change `lf nexwath sim/clone` - now supports 88bit format direct. (@iceman1001) + - Rewrited `standalone mode lf_em4100rwc `, added card bruteforce mode. (Dmitriy Loginoov) + - Change `data load` - color (@iceman1001) + - Change appveyor verbose (@doegox) + - Change `lf nexwatch demod` - now detects type, and show parity /chksum (@iceman1001) + - Change `lfsampling` - interruptible only when logging not yet triggered (@doegox) + - Change `lf keri demod - more leanient when it comes to bits (@iceman1001) + - fix, proper filtering of RL markers (@doegox) + - Change, clean deps [compiler trials] (@doegox) + - Change, remove c99 restrictions [compiler trials] (@doegox) + - Added tracelog file for hf mfu sniff or a ntag (@iceman1001) + - Change `trace list` - different alloc (@iceman1001) + - Change, convert OLD -> MIX (@iceman1001) + - Change `trace list` - adjust messages (@iceman1001) + - Fix a mem corruption in `trace load/list` (@doegox) + - Change, rework banners (@doegox) + - Change, Let's see if the prompt suffixed spaces are still needed.(@doegox) + - Fix colored readline prompt bug (@doegox) + - Change, simpler ul_print_type (@doegox) + - Fix cmake for reveng [compiler trials] (@doegox) + - Change, hook reveng outputs to pm3 machinery, add regression test (@doegox) + - Change, cmake android: add backslashes for host compatibility [compiler trials](@doegox) + - Change, Translation some comments from Chinese to English. [android] (@dxl) + - Change, cmake android: use common cmake files for deps [android] (@doegox) + - Fix, proper way to fix reveng getopt bug(@doegox) + - Change, cmake deps: add prefix pm3rrg_rdv4_ [compiler trials] (@doegox) + - Change, cmake deps: add -fPIC so they can be integrated in a pm3 shared lib [compiler trials] (@doegox) + - Change, platform adaptation [android] (@dxl) + - Change, don't mix ifdef and defined [android] (@dxl) + - fix `trace list`- too short array for explanation (@iceman1001) + - Change, check for sim module fw file (@iceman1001) + - Change, rpi aling warning [compiler trials] (@iceman1001) + - Change, more LF demodulation tests (@iceman1001) + - Change, update whereami and avoid compiling unnneded troublesome parts [compiler trials] (@doegox) + - Change, rework C includes in C++ [compiler trials] (@doegox) + - Change, leanient parsing of tcp:/bt:/socket: vars (@iceman1001) + - Change, add bluetooth group to `make accessrights` (@iceman1001) + - Change, `Makefile` - fix PKG_CONFIG_ENV (@uli) + - Change, `f sim` - now only fills until bigbuffer is full (@iceman1001) + - Change, `hf mf hardnested` - don't drop field when in test mode (@doegox) + - Change, `lf sim` - better to return err on faulty offset, thanks @iceman (@doegox) + - Change, `lf sim` - fix offset of last packet (@doegox) + - Change, `client Makefile` - make sure to rebuild deps when needed [compiler trials](@doegox) + - Change, silent err if dbus absent [linux] (@doegox) + - Change, `pm3.sh` - for direct bt devices (@doegox) + - Change, `pm3.sh` - moved WSL/PS3.x bt native to be tested first. Since call to Win32_serialport crashes it. (@iceman1001) + - Change, `pm3.sh` - Bt dongle, bt direct listing of serial ports on WSL and PS3.x, now using powershell.exe since wmic is deprecated (@iceman1001) + - Change, remove libsndfile (@doegox) + - Change, enforce PACKED structs [compiler trials] (@iceman1001) + - Change, adjust number of threads according to cpu (@iceman1001) + - Change, `hitag2crack` compile flags(@doegox) + - Change, msdsal fix bug after var de-shadowing (@doegox) + - Change, lighter msg for loading prefs, json will anyway always tell the filename (@doegox) + - Change, make sure colors and emoji are disabled when not on TTY (@doegox) + - Added `pref` command. PM3 client now support user preferences saved to a json file. (@mwalker33) + - Added native support for Bluetooth in client [linux] (@doegox) - Added `LF_EM4100RSWB` (based on `LF_EM4100RWC`) standalone mode to read/sim/clone/brute EM4100 cards (@Monster1024) - Added `HF_MSDSAL` standalone mode which read and emulate Visa EMV cards (@Netxing) - - Added Mifare Ultralight tear off experiment (@cintainfinita and @fukmar) + - Added `hf mfu tear` - Mifare Ultralight tear off experiment (@cintainfinitam, @fukmar) - Added Mifare Desfire Read/Write/Create files/records/values functionality and several fixes to `hf mfdes` (@bkerler) - Added CreateStdFile command to Mifare `hf mfdes` (@bkerler) - Rework des/3des/3k3des/aes auth. Port to mbedtls crypto library on device (@bkerler) - - Port 'hf mfdes' Authentification to CommandNG structure, fix auth session key (@bkerler) + - Port `hf mfdes` Authentification to CommandNG structure, fix auth session key (@bkerler) - Updates `hf mfdes` functions, improved logging and added new commands (@bkerler) - Updated 'legic.lua' and 'legic_clone.lua' script - works with current command set (@Pizza_4u) - Rewrote `hf mfdes` functions and added apdu debugging (@bkerler) @@ -18,10 +125,11 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Improved `hf 14a info` - card detection handling (@bkerler) - Updated helptext layout in all luascripts (@iceman1001) - Change `hf mfdes info` - output and logging (@bkerler) - - Updated texts in legic commands (@ikarus23) + - Updated texts in `hf legic` commands (@ikarus23) - Fix timing bug inside 40x5 (@mwalker33) - Refactored all Hitag2 attacks (@doegox) - Added two new Hitag2 attacks (@doegox) + - Change `hf iclass decrypt` - limit amount of data to read if wrong app limit (@iceman1001) - Change `hf search` - now continue to search in case of dual tech cards (@iceman1001) Thanks to @ikarus23 for the suggestion! - Added `hf topas info` - old reader command, now also prints NDEF (@iceman1001) - Change `hf topaz reader` - now only prints lighter info, like UID. (@iceman1001) @@ -40,14 +148,14 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Change - NDEF supports more signatures now (@iceman1001) - OSX Makefile now supports `make style` and `make checks` (@Pizza_4u) - Added `HF_LEGIC` standalone mode to read and simulate a Legic prime tag (@Pizza_4u) - - Added keri MS decode/encode and update 'lf keri clone' to support MS fc/cid cloning. (@mwalker33) - - Fix 'hf mfdes enum' - now actually manages to enumerate files under all AID's. :smiley: (@iceman1001) - - Fix 'hf mfdes info' - now detects DESFire light and work properly Wrapped commands :+1: (@iceman1001) + - Added keri MS decode/encode and update `lf keri clone` to support MS fc/cid cloning. (@mwalker33) + - Fix `hf mfdes enum` - now actually manages to enumerate files under all AID's. :smiley: (@iceman1001) + - Fix `hf mfdes info` - now detects DESFire light and work properly Wrapped commands :+1: (@iceman1001) - :smiling_imp: support (@doegox) - Additional colour changes as recommended by @iceman (@dunderhay) - Change type colour for `hf 14a` card types (@dunderhay) - Add colour to `hf mfdes` command (@dunderhay) - - Add 'HINTS' command. Will turn off / on hint messages. Default mode is OFF. (@iceman1001) + - Add `HINTS` command. Will turn off / on hint messages. Default mode is OFF. (@iceman1001) - Add colour to `hf 14a` and `hf mfu` commands (@dunderhay) - Add colour to `lf hid` commands (@dunderhay) - Change `script run hf_bruteforce -s start_id -e end_id -t timeout -x mifare_card_type` - The hf_bruteforce card script now requires Mifare type (mfc or mfu) (@dunderhay) From a5aeadc339421c6bf5e5d18fe8b68ac83842980c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 21 May 2020 09:23:32 +0200 Subject: [PATCH 308/632] Release v4.9222 - Ice Coffee :coffee: --- Makefile.defs | 2 +- client/CMakeLists.txt | 2 +- client/Makefile | 2 +- client/deps/amiibo.cmake | 2 +- client/deps/cliparser.cmake | 2 +- client/deps/hardnested.cmake | 12 ++++++------ client/deps/jansson.cmake | 2 +- client/deps/lua.cmake | 2 +- client/deps/mbedtls.cmake | 2 +- client/deps/reveng.cmake | 2 +- client/deps/tinycbor.cmake | 2 +- client/deps/whereami.cmake | 2 +- client/deps/zlib.cmake | 2 +- client/src/proxmark3.c | 2 +- common_arm/Makefile.common | 2 +- tools/hitag2crack/crack2/Makefile | 2 +- tools/hitag2crack/crack3/Makefile | 2 +- tools/hitag2crack/crack4/Makefile | 2 +- tools/hitag2crack/crack5/Makefile | 2 +- 19 files changed, 24 insertions(+), 24 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index d206611d3..477743d69 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -47,7 +47,7 @@ else RANLIB= ranlib endif -DEFCFLAGS = -Wall -Werror -O3 -fstrict-aliasing -pipe +DEFCFLAGS = -Wall -O3 -fstrict-aliasing -pipe # Some more warnings we want as errors: DEFCFLAGS += -Wbad-function-cast -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wshadow -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits -Wold-style-definition # Some more warnings we need first to eliminate, so temporarely tolerated: diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index a56ea5a9a..ce58a4449 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -229,7 +229,7 @@ add_executable( ${ADDITIONAL_SRC} ) -target_compile_options(proxmark3 PUBLIC -Wall -Werror -O3) +target_compile_options(proxmark3 PUBLIC -Wall -O3) if (MINGW) # Mingw uses by default Microsoft printf, we want the GNU printf (e.g. for %z) diff --git a/client/Makefile b/client/Makefile index 79943d8fa..260f72751 100644 --- a/client/Makefile +++ b/client/Makefile @@ -75,7 +75,7 @@ ifneq (,$(findstring MINGW,$(platform))) PM3CFLAGS += -D_ISOC99_SOURCE PM3CFLAGS += -mno-ms-bitfields -fexec-charset=cp850 endif -CXXFLAGS ?= -Wall -Werror -O3 +CXXFLAGS ?= -Wall -O3 PM3CXXFLAGS = $(CXXFLAGS) -I../include LUAPLATFORM = generic diff --git a/client/deps/amiibo.cmake b/client/deps/amiibo.cmake index 34780f597..fbf2a6f74 100644 --- a/client/deps/amiibo.cmake +++ b/client/deps/amiibo.cmake @@ -13,5 +13,5 @@ add_library(pm3rrg_rdv4_amiibo STATIC target_include_directories(pm3rrg_rdv4_amiibo PRIVATE ../../include ../../common) target_include_directories(pm3rrg_rdv4_amiibo INTERFACE amiitool) -target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_amiibo PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/cliparser.cmake b/client/deps/cliparser.cmake index b16451c07..69b639a84 100644 --- a/client/deps/cliparser.cmake +++ b/client/deps/cliparser.cmake @@ -8,5 +8,5 @@ target_include_directories(pm3rrg_rdv4_cliparser PRIVATE ../../include ../src) target_include_directories(pm3rrg_rdv4_cliparser INTERFACE cliparser) -target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_cliparser PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/hardnested.cmake b/client/deps/hardnested.cmake index 9efff1445..612265de0 100644 --- a/client/deps/hardnested.cmake +++ b/client/deps/hardnested.cmake @@ -2,7 +2,7 @@ add_library(pm3rrg_rdv4_hardnested_nosimd OBJECT hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) -target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_hardnested_nosimd PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_hardnested_nosimd PRIVATE @@ -27,7 +27,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_mmx BEFORE PRIVATE -mmmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_mmx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -41,7 +41,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_sse2 BEFORE PRIVATE -mmmx -msse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_sse2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -55,7 +55,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx BEFORE PRIVATE -mmmx -msse2 -mavx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -69,7 +69,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx2 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -83,7 +83,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx512 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mavx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx512 PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/jansson.cmake b/client/deps/jansson.cmake index a95ff0baf..1a55b7fa5 100644 --- a/client/deps/jansson.cmake +++ b/client/deps/jansson.cmake @@ -15,5 +15,5 @@ add_library(pm3rrg_rdv4_jansson STATIC target_compile_definitions(pm3rrg_rdv4_jansson PRIVATE HAVE_STDINT_H) target_include_directories(pm3rrg_rdv4_jansson INTERFACE jansson) -target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Werror -Wno-unused-function -O3) +target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Wno-unused-function -O3) set_property(TARGET pm3rrg_rdv4_jansson PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/lua.cmake b/client/deps/lua.cmake index 679147124..94c184906 100644 --- a/client/deps/lua.cmake +++ b/client/deps/lua.cmake @@ -45,5 +45,5 @@ if (NOT MINGW) endif (NOT MINGW) target_include_directories(pm3rrg_rdv4_lua INTERFACE liblua) -target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_lua PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/mbedtls.cmake b/client/deps/mbedtls.cmake index 63e706889..93a646e0d 100644 --- a/client/deps/mbedtls.cmake +++ b/client/deps/mbedtls.cmake @@ -45,5 +45,5 @@ add_library(pm3rrg_rdv4_mbedtls STATIC ) target_include_directories(pm3rrg_rdv4_mbedtls PRIVATE ../../common) -target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_mbedtls PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/reveng.cmake b/client/deps/reveng.cmake index d7e3cfd8a..1040730f1 100644 --- a/client/deps/reveng.cmake +++ b/client/deps/reveng.cmake @@ -13,5 +13,5 @@ target_include_directories(pm3rrg_rdv4_reveng PRIVATE ../src ../../include) target_include_directories(pm3rrg_rdv4_reveng INTERFACE reveng) -target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_reveng PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/tinycbor.cmake b/client/deps/tinycbor.cmake index 5a6abda25..c74618149 100644 --- a/client/deps/tinycbor.cmake +++ b/client/deps/tinycbor.cmake @@ -11,5 +11,5 @@ add_library(pm3rrg_rdv4_tinycbor STATIC target_include_directories(pm3rrg_rdv4_tinycbor INTERFACE tinycbor) # Strange errors on Mingw when compiling with -O3 -target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -Werror -O2) +target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -O2) set_property(TARGET pm3rrg_rdv4_tinycbor PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/whereami.cmake b/client/deps/whereami.cmake index d2d6a5b2a..721873066 100644 --- a/client/deps/whereami.cmake +++ b/client/deps/whereami.cmake @@ -2,5 +2,5 @@ add_library(pm3rrg_rdv4_whereami STATIC whereami/whereami.c) target_compile_definitions(pm3rrg_rdv4_whereami PRIVATE WAI_PM3_TUNED) target_include_directories(pm3rrg_rdv4_whereami INTERFACE whereami) -target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_whereami PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/zlib.cmake b/client/deps/zlib.cmake index 645cbc88d..563508633 100644 --- a/client/deps/zlib.cmake +++ b/client/deps/zlib.cmake @@ -9,5 +9,5 @@ add_library(pm3rrg_rdv4_z STATIC ) target_compile_definitions(pm3rrg_rdv4_z PRIVATE Z_SOLO NO_GZIP ZLIB_PM3_TUNED) -target_compile_options(pm3rrg_rdv4_z PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_z PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_z PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index 1e2be44ba..b1aca3534 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -34,7 +34,7 @@ #define BANNERMSG1 " :snowflake: iceman@icesql.net" #define BANNERMSG2 " https://github.com/rfidresearchgroup/proxmark3/" -#define BANNERMSG3 "pre-release v4.0" +#define BANNERMSG3 "Release v4.9222 - Ice Coffee :coffee:" typedef enum LogoMode { UTF8, ANSI, ASCII } LogoMode; diff --git a/common_arm/Makefile.common b/common_arm/Makefile.common index e2c3ae3bc..8f2a90b3b 100644 --- a/common_arm/Makefile.common +++ b/common_arm/Makefile.common @@ -40,7 +40,7 @@ VPATH = . ../common_arm ../common ../common/crapto1 ../common/mbedtls ../common/ INCLUDES = ../include/proxmark3_arm.h ../include/at91sam7s512.h ../include/config_gpio.h ../include/pm3_cmd.h ARMCFLAGS = -mthumb-interwork -fno-builtin -DEFCFLAGS = -Wall -Werror -Os -pedantic -fstrict-aliasing -pipe +DEFCFLAGS = -Wall -Os -pedantic -fstrict-aliasing -pipe # Some more warnings we want as errors: DEFCFLAGS += -Wbad-function-cast -Wchar-subscripts -Wundef -Wunused -Wuninitialized -Wpointer-arith -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits diff --git a/tools/hitag2crack/crack2/Makefile b/tools/hitag2crack/crack2/Makefile index 4794d6ec4..318034f51 100644 --- a/tools/hitag2crack/crack2/Makefile +++ b/tools/hitag2crack/crack2/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -Werror -O3 +CFLAGS?=-Wall -O3 # Linux libs LIBS=-pthread -D_GNU_SOURCE # Mac libs diff --git a/tools/hitag2crack/crack3/Makefile b/tools/hitag2crack/crack3/Makefile index 318b5db78..1e157eef6 100644 --- a/tools/hitag2crack/crack3/Makefile +++ b/tools/hitag2crack/crack3/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -Werror -O3 +CFLAGS?=-Wall -O3 LIBS= VPATH=../common INC=-I ../common diff --git a/tools/hitag2crack/crack4/Makefile b/tools/hitag2crack/crack4/Makefile index b560577bd..30083c56d 100644 --- a/tools/hitag2crack/crack4/Makefile +++ b/tools/hitag2crack/crack4/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -Werror -O3 +CFLAGS?=-Wall -O3 LIBS=-lpthread VPATH=../common INC=-I ../common diff --git a/tools/hitag2crack/crack5/Makefile b/tools/hitag2crack/crack5/Makefile index 9d19b63ee..8e2b38f82 100644 --- a/tools/hitag2crack/crack5/Makefile +++ b/tools/hitag2crack/crack5/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -Werror -O3 +CFLAGS?=-Wall -O3 LIBS=-lpthread VPATH=../common INC=-I ../common From 521a76d3c2a5e68a063ab514972846e182701be1 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 21 May 2020 09:24:38 +0200 Subject: [PATCH 309/632] Revert "Release v4.9222 - Ice Coffee :coffee:" This reverts commit a5aeadc339421c6bf5e5d18fe8b68ac83842980c. --- Makefile.defs | 2 +- client/CMakeLists.txt | 2 +- client/Makefile | 2 +- client/deps/amiibo.cmake | 2 +- client/deps/cliparser.cmake | 2 +- client/deps/hardnested.cmake | 12 ++++++------ client/deps/jansson.cmake | 2 +- client/deps/lua.cmake | 2 +- client/deps/mbedtls.cmake | 2 +- client/deps/reveng.cmake | 2 +- client/deps/tinycbor.cmake | 2 +- client/deps/whereami.cmake | 2 +- client/deps/zlib.cmake | 2 +- client/src/proxmark3.c | 2 +- common_arm/Makefile.common | 2 +- tools/hitag2crack/crack2/Makefile | 2 +- tools/hitag2crack/crack3/Makefile | 2 +- tools/hitag2crack/crack4/Makefile | 2 +- tools/hitag2crack/crack5/Makefile | 2 +- 19 files changed, 24 insertions(+), 24 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index 477743d69..d206611d3 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -47,7 +47,7 @@ else RANLIB= ranlib endif -DEFCFLAGS = -Wall -O3 -fstrict-aliasing -pipe +DEFCFLAGS = -Wall -Werror -O3 -fstrict-aliasing -pipe # Some more warnings we want as errors: DEFCFLAGS += -Wbad-function-cast -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wshadow -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits -Wold-style-definition # Some more warnings we need first to eliminate, so temporarely tolerated: diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index ce58a4449..a56ea5a9a 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -229,7 +229,7 @@ add_executable( ${ADDITIONAL_SRC} ) -target_compile_options(proxmark3 PUBLIC -Wall -O3) +target_compile_options(proxmark3 PUBLIC -Wall -Werror -O3) if (MINGW) # Mingw uses by default Microsoft printf, we want the GNU printf (e.g. for %z) diff --git a/client/Makefile b/client/Makefile index 260f72751..79943d8fa 100644 --- a/client/Makefile +++ b/client/Makefile @@ -75,7 +75,7 @@ ifneq (,$(findstring MINGW,$(platform))) PM3CFLAGS += -D_ISOC99_SOURCE PM3CFLAGS += -mno-ms-bitfields -fexec-charset=cp850 endif -CXXFLAGS ?= -Wall -O3 +CXXFLAGS ?= -Wall -Werror -O3 PM3CXXFLAGS = $(CXXFLAGS) -I../include LUAPLATFORM = generic diff --git a/client/deps/amiibo.cmake b/client/deps/amiibo.cmake index fbf2a6f74..34780f597 100644 --- a/client/deps/amiibo.cmake +++ b/client/deps/amiibo.cmake @@ -13,5 +13,5 @@ add_library(pm3rrg_rdv4_amiibo STATIC target_include_directories(pm3rrg_rdv4_amiibo PRIVATE ../../include ../../common) target_include_directories(pm3rrg_rdv4_amiibo INTERFACE amiitool) -target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_amiibo PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/cliparser.cmake b/client/deps/cliparser.cmake index 69b639a84..b16451c07 100644 --- a/client/deps/cliparser.cmake +++ b/client/deps/cliparser.cmake @@ -8,5 +8,5 @@ target_include_directories(pm3rrg_rdv4_cliparser PRIVATE ../../include ../src) target_include_directories(pm3rrg_rdv4_cliparser INTERFACE cliparser) -target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_cliparser PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/hardnested.cmake b/client/deps/hardnested.cmake index 612265de0..9efff1445 100644 --- a/client/deps/hardnested.cmake +++ b/client/deps/hardnested.cmake @@ -2,7 +2,7 @@ add_library(pm3rrg_rdv4_hardnested_nosimd OBJECT hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) -target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_hardnested_nosimd PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_hardnested_nosimd PRIVATE @@ -27,7 +27,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_mmx BEFORE PRIVATE -mmmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_mmx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -41,7 +41,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_sse2 BEFORE PRIVATE -mmmx -msse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_sse2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -55,7 +55,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx BEFORE PRIVATE -mmmx -msse2 -mavx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -69,7 +69,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx2 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -83,7 +83,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx512 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mavx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx512 PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/jansson.cmake b/client/deps/jansson.cmake index 1a55b7fa5..a95ff0baf 100644 --- a/client/deps/jansson.cmake +++ b/client/deps/jansson.cmake @@ -15,5 +15,5 @@ add_library(pm3rrg_rdv4_jansson STATIC target_compile_definitions(pm3rrg_rdv4_jansson PRIVATE HAVE_STDINT_H) target_include_directories(pm3rrg_rdv4_jansson INTERFACE jansson) -target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Wno-unused-function -O3) +target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Werror -Wno-unused-function -O3) set_property(TARGET pm3rrg_rdv4_jansson PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/lua.cmake b/client/deps/lua.cmake index 94c184906..679147124 100644 --- a/client/deps/lua.cmake +++ b/client/deps/lua.cmake @@ -45,5 +45,5 @@ if (NOT MINGW) endif (NOT MINGW) target_include_directories(pm3rrg_rdv4_lua INTERFACE liblua) -target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_lua PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/mbedtls.cmake b/client/deps/mbedtls.cmake index 93a646e0d..63e706889 100644 --- a/client/deps/mbedtls.cmake +++ b/client/deps/mbedtls.cmake @@ -45,5 +45,5 @@ add_library(pm3rrg_rdv4_mbedtls STATIC ) target_include_directories(pm3rrg_rdv4_mbedtls PRIVATE ../../common) -target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_mbedtls PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/reveng.cmake b/client/deps/reveng.cmake index 1040730f1..d7e3cfd8a 100644 --- a/client/deps/reveng.cmake +++ b/client/deps/reveng.cmake @@ -13,5 +13,5 @@ target_include_directories(pm3rrg_rdv4_reveng PRIVATE ../src ../../include) target_include_directories(pm3rrg_rdv4_reveng INTERFACE reveng) -target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_reveng PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/tinycbor.cmake b/client/deps/tinycbor.cmake index c74618149..5a6abda25 100644 --- a/client/deps/tinycbor.cmake +++ b/client/deps/tinycbor.cmake @@ -11,5 +11,5 @@ add_library(pm3rrg_rdv4_tinycbor STATIC target_include_directories(pm3rrg_rdv4_tinycbor INTERFACE tinycbor) # Strange errors on Mingw when compiling with -O3 -target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -O2) +target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -Werror -O2) set_property(TARGET pm3rrg_rdv4_tinycbor PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/whereami.cmake b/client/deps/whereami.cmake index 721873066..d2d6a5b2a 100644 --- a/client/deps/whereami.cmake +++ b/client/deps/whereami.cmake @@ -2,5 +2,5 @@ add_library(pm3rrg_rdv4_whereami STATIC whereami/whereami.c) target_compile_definitions(pm3rrg_rdv4_whereami PRIVATE WAI_PM3_TUNED) target_include_directories(pm3rrg_rdv4_whereami INTERFACE whereami) -target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_whereami PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/zlib.cmake b/client/deps/zlib.cmake index 563508633..645cbc88d 100644 --- a/client/deps/zlib.cmake +++ b/client/deps/zlib.cmake @@ -9,5 +9,5 @@ add_library(pm3rrg_rdv4_z STATIC ) target_compile_definitions(pm3rrg_rdv4_z PRIVATE Z_SOLO NO_GZIP ZLIB_PM3_TUNED) -target_compile_options(pm3rrg_rdv4_z PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_z PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_z PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index b1aca3534..1e2be44ba 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -34,7 +34,7 @@ #define BANNERMSG1 " :snowflake: iceman@icesql.net" #define BANNERMSG2 " https://github.com/rfidresearchgroup/proxmark3/" -#define BANNERMSG3 "Release v4.9222 - Ice Coffee :coffee:" +#define BANNERMSG3 "pre-release v4.0" typedef enum LogoMode { UTF8, ANSI, ASCII } LogoMode; diff --git a/common_arm/Makefile.common b/common_arm/Makefile.common index 8f2a90b3b..e2c3ae3bc 100644 --- a/common_arm/Makefile.common +++ b/common_arm/Makefile.common @@ -40,7 +40,7 @@ VPATH = . ../common_arm ../common ../common/crapto1 ../common/mbedtls ../common/ INCLUDES = ../include/proxmark3_arm.h ../include/at91sam7s512.h ../include/config_gpio.h ../include/pm3_cmd.h ARMCFLAGS = -mthumb-interwork -fno-builtin -DEFCFLAGS = -Wall -Os -pedantic -fstrict-aliasing -pipe +DEFCFLAGS = -Wall -Werror -Os -pedantic -fstrict-aliasing -pipe # Some more warnings we want as errors: DEFCFLAGS += -Wbad-function-cast -Wchar-subscripts -Wundef -Wunused -Wuninitialized -Wpointer-arith -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits diff --git a/tools/hitag2crack/crack2/Makefile b/tools/hitag2crack/crack2/Makefile index 318034f51..4794d6ec4 100644 --- a/tools/hitag2crack/crack2/Makefile +++ b/tools/hitag2crack/crack2/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -O3 +CFLAGS?=-Wall -Werror -O3 # Linux libs LIBS=-pthread -D_GNU_SOURCE # Mac libs diff --git a/tools/hitag2crack/crack3/Makefile b/tools/hitag2crack/crack3/Makefile index 1e157eef6..318b5db78 100644 --- a/tools/hitag2crack/crack3/Makefile +++ b/tools/hitag2crack/crack3/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -O3 +CFLAGS?=-Wall -Werror -O3 LIBS= VPATH=../common INC=-I ../common diff --git a/tools/hitag2crack/crack4/Makefile b/tools/hitag2crack/crack4/Makefile index 30083c56d..b560577bd 100644 --- a/tools/hitag2crack/crack4/Makefile +++ b/tools/hitag2crack/crack4/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -O3 +CFLAGS?=-Wall -Werror -O3 LIBS=-lpthread VPATH=../common INC=-I ../common diff --git a/tools/hitag2crack/crack5/Makefile b/tools/hitag2crack/crack5/Makefile index 8e2b38f82..9d19b63ee 100644 --- a/tools/hitag2crack/crack5/Makefile +++ b/tools/hitag2crack/crack5/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -O3 +CFLAGS?=-Wall -Werror -O3 LIBS=-lpthread VPATH=../common INC=-I ../common From 9cec93fd5477a5f1513d9c805ae885a017e88813 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 21 May 2020 09:25:32 +0200 Subject: [PATCH 310/632] Release v4.9224 - Ice Coffee :coffee: --- Makefile.defs | 2 +- client/CMakeLists.txt | 2 +- client/Makefile | 2 +- client/deps/amiibo.cmake | 2 +- client/deps/cliparser.cmake | 2 +- client/deps/hardnested.cmake | 12 ++++++------ client/deps/jansson.cmake | 2 +- client/deps/lua.cmake | 2 +- client/deps/mbedtls.cmake | 2 +- client/deps/reveng.cmake | 2 +- client/deps/tinycbor.cmake | 2 +- client/deps/whereami.cmake | 2 +- client/deps/zlib.cmake | 2 +- client/src/proxmark3.c | 2 +- common_arm/Makefile.common | 2 +- tools/hitag2crack/crack2/Makefile | 2 +- tools/hitag2crack/crack3/Makefile | 2 +- tools/hitag2crack/crack4/Makefile | 2 +- tools/hitag2crack/crack5/Makefile | 2 +- 19 files changed, 24 insertions(+), 24 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index d206611d3..477743d69 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -47,7 +47,7 @@ else RANLIB= ranlib endif -DEFCFLAGS = -Wall -Werror -O3 -fstrict-aliasing -pipe +DEFCFLAGS = -Wall -O3 -fstrict-aliasing -pipe # Some more warnings we want as errors: DEFCFLAGS += -Wbad-function-cast -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wshadow -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits -Wold-style-definition # Some more warnings we need first to eliminate, so temporarely tolerated: diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index a56ea5a9a..ce58a4449 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -229,7 +229,7 @@ add_executable( ${ADDITIONAL_SRC} ) -target_compile_options(proxmark3 PUBLIC -Wall -Werror -O3) +target_compile_options(proxmark3 PUBLIC -Wall -O3) if (MINGW) # Mingw uses by default Microsoft printf, we want the GNU printf (e.g. for %z) diff --git a/client/Makefile b/client/Makefile index 79943d8fa..260f72751 100644 --- a/client/Makefile +++ b/client/Makefile @@ -75,7 +75,7 @@ ifneq (,$(findstring MINGW,$(platform))) PM3CFLAGS += -D_ISOC99_SOURCE PM3CFLAGS += -mno-ms-bitfields -fexec-charset=cp850 endif -CXXFLAGS ?= -Wall -Werror -O3 +CXXFLAGS ?= -Wall -O3 PM3CXXFLAGS = $(CXXFLAGS) -I../include LUAPLATFORM = generic diff --git a/client/deps/amiibo.cmake b/client/deps/amiibo.cmake index 34780f597..fbf2a6f74 100644 --- a/client/deps/amiibo.cmake +++ b/client/deps/amiibo.cmake @@ -13,5 +13,5 @@ add_library(pm3rrg_rdv4_amiibo STATIC target_include_directories(pm3rrg_rdv4_amiibo PRIVATE ../../include ../../common) target_include_directories(pm3rrg_rdv4_amiibo INTERFACE amiitool) -target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_amiibo PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/cliparser.cmake b/client/deps/cliparser.cmake index b16451c07..69b639a84 100644 --- a/client/deps/cliparser.cmake +++ b/client/deps/cliparser.cmake @@ -8,5 +8,5 @@ target_include_directories(pm3rrg_rdv4_cliparser PRIVATE ../../include ../src) target_include_directories(pm3rrg_rdv4_cliparser INTERFACE cliparser) -target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_cliparser PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/hardnested.cmake b/client/deps/hardnested.cmake index 9efff1445..612265de0 100644 --- a/client/deps/hardnested.cmake +++ b/client/deps/hardnested.cmake @@ -2,7 +2,7 @@ add_library(pm3rrg_rdv4_hardnested_nosimd OBJECT hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) -target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_hardnested_nosimd PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_hardnested_nosimd PRIVATE @@ -27,7 +27,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_mmx BEFORE PRIVATE -mmmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_mmx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -41,7 +41,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_sse2 BEFORE PRIVATE -mmmx -msse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_sse2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -55,7 +55,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx BEFORE PRIVATE -mmmx -msse2 -mavx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -69,7 +69,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx2 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -83,7 +83,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx512 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mavx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx512 PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/jansson.cmake b/client/deps/jansson.cmake index a95ff0baf..1a55b7fa5 100644 --- a/client/deps/jansson.cmake +++ b/client/deps/jansson.cmake @@ -15,5 +15,5 @@ add_library(pm3rrg_rdv4_jansson STATIC target_compile_definitions(pm3rrg_rdv4_jansson PRIVATE HAVE_STDINT_H) target_include_directories(pm3rrg_rdv4_jansson INTERFACE jansson) -target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Werror -Wno-unused-function -O3) +target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Wno-unused-function -O3) set_property(TARGET pm3rrg_rdv4_jansson PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/lua.cmake b/client/deps/lua.cmake index 679147124..94c184906 100644 --- a/client/deps/lua.cmake +++ b/client/deps/lua.cmake @@ -45,5 +45,5 @@ if (NOT MINGW) endif (NOT MINGW) target_include_directories(pm3rrg_rdv4_lua INTERFACE liblua) -target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_lua PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/mbedtls.cmake b/client/deps/mbedtls.cmake index 63e706889..93a646e0d 100644 --- a/client/deps/mbedtls.cmake +++ b/client/deps/mbedtls.cmake @@ -45,5 +45,5 @@ add_library(pm3rrg_rdv4_mbedtls STATIC ) target_include_directories(pm3rrg_rdv4_mbedtls PRIVATE ../../common) -target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_mbedtls PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/reveng.cmake b/client/deps/reveng.cmake index d7e3cfd8a..1040730f1 100644 --- a/client/deps/reveng.cmake +++ b/client/deps/reveng.cmake @@ -13,5 +13,5 @@ target_include_directories(pm3rrg_rdv4_reveng PRIVATE ../src ../../include) target_include_directories(pm3rrg_rdv4_reveng INTERFACE reveng) -target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_reveng PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/tinycbor.cmake b/client/deps/tinycbor.cmake index 5a6abda25..c74618149 100644 --- a/client/deps/tinycbor.cmake +++ b/client/deps/tinycbor.cmake @@ -11,5 +11,5 @@ add_library(pm3rrg_rdv4_tinycbor STATIC target_include_directories(pm3rrg_rdv4_tinycbor INTERFACE tinycbor) # Strange errors on Mingw when compiling with -O3 -target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -Werror -O2) +target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -O2) set_property(TARGET pm3rrg_rdv4_tinycbor PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/whereami.cmake b/client/deps/whereami.cmake index d2d6a5b2a..721873066 100644 --- a/client/deps/whereami.cmake +++ b/client/deps/whereami.cmake @@ -2,5 +2,5 @@ add_library(pm3rrg_rdv4_whereami STATIC whereami/whereami.c) target_compile_definitions(pm3rrg_rdv4_whereami PRIVATE WAI_PM3_TUNED) target_include_directories(pm3rrg_rdv4_whereami INTERFACE whereami) -target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_whereami PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/zlib.cmake b/client/deps/zlib.cmake index 645cbc88d..563508633 100644 --- a/client/deps/zlib.cmake +++ b/client/deps/zlib.cmake @@ -9,5 +9,5 @@ add_library(pm3rrg_rdv4_z STATIC ) target_compile_definitions(pm3rrg_rdv4_z PRIVATE Z_SOLO NO_GZIP ZLIB_PM3_TUNED) -target_compile_options(pm3rrg_rdv4_z PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_z PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_z PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index 1e2be44ba..806213d94 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -34,7 +34,7 @@ #define BANNERMSG1 " :snowflake: iceman@icesql.net" #define BANNERMSG2 " https://github.com/rfidresearchgroup/proxmark3/" -#define BANNERMSG3 "pre-release v4.0" +#define BANNERMSG3 "Release v4.9224 - Ice Coffee :coffee:" typedef enum LogoMode { UTF8, ANSI, ASCII } LogoMode; diff --git a/common_arm/Makefile.common b/common_arm/Makefile.common index e2c3ae3bc..8f2a90b3b 100644 --- a/common_arm/Makefile.common +++ b/common_arm/Makefile.common @@ -40,7 +40,7 @@ VPATH = . ../common_arm ../common ../common/crapto1 ../common/mbedtls ../common/ INCLUDES = ../include/proxmark3_arm.h ../include/at91sam7s512.h ../include/config_gpio.h ../include/pm3_cmd.h ARMCFLAGS = -mthumb-interwork -fno-builtin -DEFCFLAGS = -Wall -Werror -Os -pedantic -fstrict-aliasing -pipe +DEFCFLAGS = -Wall -Os -pedantic -fstrict-aliasing -pipe # Some more warnings we want as errors: DEFCFLAGS += -Wbad-function-cast -Wchar-subscripts -Wundef -Wunused -Wuninitialized -Wpointer-arith -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits diff --git a/tools/hitag2crack/crack2/Makefile b/tools/hitag2crack/crack2/Makefile index 4794d6ec4..318034f51 100644 --- a/tools/hitag2crack/crack2/Makefile +++ b/tools/hitag2crack/crack2/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -Werror -O3 +CFLAGS?=-Wall -O3 # Linux libs LIBS=-pthread -D_GNU_SOURCE # Mac libs diff --git a/tools/hitag2crack/crack3/Makefile b/tools/hitag2crack/crack3/Makefile index 318b5db78..1e157eef6 100644 --- a/tools/hitag2crack/crack3/Makefile +++ b/tools/hitag2crack/crack3/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -Werror -O3 +CFLAGS?=-Wall -O3 LIBS= VPATH=../common INC=-I ../common diff --git a/tools/hitag2crack/crack4/Makefile b/tools/hitag2crack/crack4/Makefile index b560577bd..30083c56d 100644 --- a/tools/hitag2crack/crack4/Makefile +++ b/tools/hitag2crack/crack4/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -Werror -O3 +CFLAGS?=-Wall -O3 LIBS=-lpthread VPATH=../common INC=-I ../common diff --git a/tools/hitag2crack/crack5/Makefile b/tools/hitag2crack/crack5/Makefile index 9d19b63ee..8e2b38f82 100644 --- a/tools/hitag2crack/crack5/Makefile +++ b/tools/hitag2crack/crack5/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -Werror -O3 +CFLAGS?=-Wall -O3 LIBS=-lpthread VPATH=../common INC=-I ../common From 3e389c6e075861e2e712bf202527b7b3a62881e6 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 21 May 2020 09:25:32 +0200 Subject: [PATCH 311/632] Revert "Release v4.9224 - Ice Coffee :coffee:" This reverts commit 9cec93fd5477a5f1513d9c805ae885a017e88813. --- Makefile.defs | 2 +- client/CMakeLists.txt | 2 +- client/Makefile | 2 +- client/deps/amiibo.cmake | 2 +- client/deps/cliparser.cmake | 2 +- client/deps/hardnested.cmake | 12 ++++++------ client/deps/jansson.cmake | 2 +- client/deps/lua.cmake | 2 +- client/deps/mbedtls.cmake | 2 +- client/deps/reveng.cmake | 2 +- client/deps/tinycbor.cmake | 2 +- client/deps/whereami.cmake | 2 +- client/deps/zlib.cmake | 2 +- client/src/proxmark3.c | 2 +- common_arm/Makefile.common | 2 +- tools/hitag2crack/crack2/Makefile | 2 +- tools/hitag2crack/crack3/Makefile | 2 +- tools/hitag2crack/crack4/Makefile | 2 +- tools/hitag2crack/crack5/Makefile | 2 +- 19 files changed, 24 insertions(+), 24 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index 477743d69..d206611d3 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -47,7 +47,7 @@ else RANLIB= ranlib endif -DEFCFLAGS = -Wall -O3 -fstrict-aliasing -pipe +DEFCFLAGS = -Wall -Werror -O3 -fstrict-aliasing -pipe # Some more warnings we want as errors: DEFCFLAGS += -Wbad-function-cast -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wshadow -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits -Wold-style-definition # Some more warnings we need first to eliminate, so temporarely tolerated: diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index ce58a4449..a56ea5a9a 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -229,7 +229,7 @@ add_executable( ${ADDITIONAL_SRC} ) -target_compile_options(proxmark3 PUBLIC -Wall -O3) +target_compile_options(proxmark3 PUBLIC -Wall -Werror -O3) if (MINGW) # Mingw uses by default Microsoft printf, we want the GNU printf (e.g. for %z) diff --git a/client/Makefile b/client/Makefile index 260f72751..79943d8fa 100644 --- a/client/Makefile +++ b/client/Makefile @@ -75,7 +75,7 @@ ifneq (,$(findstring MINGW,$(platform))) PM3CFLAGS += -D_ISOC99_SOURCE PM3CFLAGS += -mno-ms-bitfields -fexec-charset=cp850 endif -CXXFLAGS ?= -Wall -O3 +CXXFLAGS ?= -Wall -Werror -O3 PM3CXXFLAGS = $(CXXFLAGS) -I../include LUAPLATFORM = generic diff --git a/client/deps/amiibo.cmake b/client/deps/amiibo.cmake index fbf2a6f74..34780f597 100644 --- a/client/deps/amiibo.cmake +++ b/client/deps/amiibo.cmake @@ -13,5 +13,5 @@ add_library(pm3rrg_rdv4_amiibo STATIC target_include_directories(pm3rrg_rdv4_amiibo PRIVATE ../../include ../../common) target_include_directories(pm3rrg_rdv4_amiibo INTERFACE amiitool) -target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_amiibo PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/cliparser.cmake b/client/deps/cliparser.cmake index 69b639a84..b16451c07 100644 --- a/client/deps/cliparser.cmake +++ b/client/deps/cliparser.cmake @@ -8,5 +8,5 @@ target_include_directories(pm3rrg_rdv4_cliparser PRIVATE ../../include ../src) target_include_directories(pm3rrg_rdv4_cliparser INTERFACE cliparser) -target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_cliparser PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/hardnested.cmake b/client/deps/hardnested.cmake index 612265de0..9efff1445 100644 --- a/client/deps/hardnested.cmake +++ b/client/deps/hardnested.cmake @@ -2,7 +2,7 @@ add_library(pm3rrg_rdv4_hardnested_nosimd OBJECT hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) -target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_hardnested_nosimd PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_hardnested_nosimd PRIVATE @@ -27,7 +27,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_mmx BEFORE PRIVATE -mmmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_mmx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -41,7 +41,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_sse2 BEFORE PRIVATE -mmmx -msse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_sse2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -55,7 +55,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx BEFORE PRIVATE -mmmx -msse2 -mavx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -69,7 +69,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx2 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -83,7 +83,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx512 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mavx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx512 PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/jansson.cmake b/client/deps/jansson.cmake index 1a55b7fa5..a95ff0baf 100644 --- a/client/deps/jansson.cmake +++ b/client/deps/jansson.cmake @@ -15,5 +15,5 @@ add_library(pm3rrg_rdv4_jansson STATIC target_compile_definitions(pm3rrg_rdv4_jansson PRIVATE HAVE_STDINT_H) target_include_directories(pm3rrg_rdv4_jansson INTERFACE jansson) -target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Wno-unused-function -O3) +target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Werror -Wno-unused-function -O3) set_property(TARGET pm3rrg_rdv4_jansson PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/lua.cmake b/client/deps/lua.cmake index 94c184906..679147124 100644 --- a/client/deps/lua.cmake +++ b/client/deps/lua.cmake @@ -45,5 +45,5 @@ if (NOT MINGW) endif (NOT MINGW) target_include_directories(pm3rrg_rdv4_lua INTERFACE liblua) -target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_lua PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/mbedtls.cmake b/client/deps/mbedtls.cmake index 93a646e0d..63e706889 100644 --- a/client/deps/mbedtls.cmake +++ b/client/deps/mbedtls.cmake @@ -45,5 +45,5 @@ add_library(pm3rrg_rdv4_mbedtls STATIC ) target_include_directories(pm3rrg_rdv4_mbedtls PRIVATE ../../common) -target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_mbedtls PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/reveng.cmake b/client/deps/reveng.cmake index 1040730f1..d7e3cfd8a 100644 --- a/client/deps/reveng.cmake +++ b/client/deps/reveng.cmake @@ -13,5 +13,5 @@ target_include_directories(pm3rrg_rdv4_reveng PRIVATE ../src ../../include) target_include_directories(pm3rrg_rdv4_reveng INTERFACE reveng) -target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_reveng PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/tinycbor.cmake b/client/deps/tinycbor.cmake index c74618149..5a6abda25 100644 --- a/client/deps/tinycbor.cmake +++ b/client/deps/tinycbor.cmake @@ -11,5 +11,5 @@ add_library(pm3rrg_rdv4_tinycbor STATIC target_include_directories(pm3rrg_rdv4_tinycbor INTERFACE tinycbor) # Strange errors on Mingw when compiling with -O3 -target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -O2) +target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -Werror -O2) set_property(TARGET pm3rrg_rdv4_tinycbor PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/whereami.cmake b/client/deps/whereami.cmake index 721873066..d2d6a5b2a 100644 --- a/client/deps/whereami.cmake +++ b/client/deps/whereami.cmake @@ -2,5 +2,5 @@ add_library(pm3rrg_rdv4_whereami STATIC whereami/whereami.c) target_compile_definitions(pm3rrg_rdv4_whereami PRIVATE WAI_PM3_TUNED) target_include_directories(pm3rrg_rdv4_whereami INTERFACE whereami) -target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_whereami PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/zlib.cmake b/client/deps/zlib.cmake index 563508633..645cbc88d 100644 --- a/client/deps/zlib.cmake +++ b/client/deps/zlib.cmake @@ -9,5 +9,5 @@ add_library(pm3rrg_rdv4_z STATIC ) target_compile_definitions(pm3rrg_rdv4_z PRIVATE Z_SOLO NO_GZIP ZLIB_PM3_TUNED) -target_compile_options(pm3rrg_rdv4_z PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_z PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_z PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index 806213d94..1e2be44ba 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -34,7 +34,7 @@ #define BANNERMSG1 " :snowflake: iceman@icesql.net" #define BANNERMSG2 " https://github.com/rfidresearchgroup/proxmark3/" -#define BANNERMSG3 "Release v4.9224 - Ice Coffee :coffee:" +#define BANNERMSG3 "pre-release v4.0" typedef enum LogoMode { UTF8, ANSI, ASCII } LogoMode; diff --git a/common_arm/Makefile.common b/common_arm/Makefile.common index 8f2a90b3b..e2c3ae3bc 100644 --- a/common_arm/Makefile.common +++ b/common_arm/Makefile.common @@ -40,7 +40,7 @@ VPATH = . ../common_arm ../common ../common/crapto1 ../common/mbedtls ../common/ INCLUDES = ../include/proxmark3_arm.h ../include/at91sam7s512.h ../include/config_gpio.h ../include/pm3_cmd.h ARMCFLAGS = -mthumb-interwork -fno-builtin -DEFCFLAGS = -Wall -Os -pedantic -fstrict-aliasing -pipe +DEFCFLAGS = -Wall -Werror -Os -pedantic -fstrict-aliasing -pipe # Some more warnings we want as errors: DEFCFLAGS += -Wbad-function-cast -Wchar-subscripts -Wundef -Wunused -Wuninitialized -Wpointer-arith -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits diff --git a/tools/hitag2crack/crack2/Makefile b/tools/hitag2crack/crack2/Makefile index 318034f51..4794d6ec4 100644 --- a/tools/hitag2crack/crack2/Makefile +++ b/tools/hitag2crack/crack2/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -O3 +CFLAGS?=-Wall -Werror -O3 # Linux libs LIBS=-pthread -D_GNU_SOURCE # Mac libs diff --git a/tools/hitag2crack/crack3/Makefile b/tools/hitag2crack/crack3/Makefile index 1e157eef6..318b5db78 100644 --- a/tools/hitag2crack/crack3/Makefile +++ b/tools/hitag2crack/crack3/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -O3 +CFLAGS?=-Wall -Werror -O3 LIBS= VPATH=../common INC=-I ../common diff --git a/tools/hitag2crack/crack4/Makefile b/tools/hitag2crack/crack4/Makefile index 30083c56d..b560577bd 100644 --- a/tools/hitag2crack/crack4/Makefile +++ b/tools/hitag2crack/crack4/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -O3 +CFLAGS?=-Wall -Werror -O3 LIBS=-lpthread VPATH=../common INC=-I ../common diff --git a/tools/hitag2crack/crack5/Makefile b/tools/hitag2crack/crack5/Makefile index 8e2b38f82..9d19b63ee 100644 --- a/tools/hitag2crack/crack5/Makefile +++ b/tools/hitag2crack/crack5/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -O3 +CFLAGS?=-Wall -Werror -O3 LIBS=-lpthread VPATH=../common INC=-I ../common From 53cb36447f0973242314ecd8592a5b172a6ceac0 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 21 May 2020 11:05:09 +0200 Subject: [PATCH 312/632] make release: make sure it's executed from a clean master --- Makefile | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 6b0a6cb76..71d61f091 100644 --- a/Makefile +++ b/Makefile @@ -238,11 +238,17 @@ endif release: VERSION="v4.$(shell git log --oneline master | wc -l)" release: +ifneq ($(shell git rev-parse --abbrev-ref HEAD),master) + $(error "!!! you are not on master branch, aborting") +endif +ifeq ($(shell git describe --dirty --always|grep -o dirty),dirty) + $(error "!!! you have pending changes, aborting") +endif +ifeq ($(RELEASE_NAME),) + $(error "!!! missing RELEASE_NAME, aborting") +endif # Preparing a commit for release tagging, to be reverted after tagging. @echo "# - Release Tag: $(VERSION)" -ifeq ($(RELEASE_NAME),) - $(error "!!! missing RELEASE_NAME") -endif @echo "# - Release Name: $(RELEASE_NAME)" # - Removing -Werror... @find . \( -path "./Makefile.defs" -or -path "./client/Makefile" -or -path "./common_arm/Makefile.common" -or -path "./tools/hitag2crack/*/Makefile" \) -exec sed -i 's/ -Werror//' {} \; From 4382f8c9bee8c89ae1d14b558b10e8695428ea85 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 21 May 2020 11:50:03 +0200 Subject: [PATCH 313/632] mkversion: add --undecided --- tools/mkversion.pl | 7 ++++--- tools/mkversion.sh | 10 ++++++---- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/tools/mkversion.pl b/tools/mkversion.pl index 0d8b9de29..ea3b9940a 100644 --- a/tools/mkversion.pl +++ b/tools/mkversion.pl @@ -18,7 +18,7 @@ my $fullgitinfo = 'RRG/Iceman'; my $ctime; # GIT status 0 = dirty, 1 = clean , 2 = undecided my $clean = 2; - +my $undecided = (defined $ARGV[0]) && ($ARGV[0] =~ '--undecided'); # Do we have acces to git command? ####### # solves some bug on macos i.e: @@ -37,8 +37,9 @@ if ( defined($commandGIT) ) { # now avoiding the "fatal: No names found, cannot describe anything." error by fallbacking to abbrev hash in such case my $gitversion = `git describe --dirty --always`; my $gitbranch = `git rev-parse --abbrev-ref HEAD`; - $clean = $gitversion =~ '-dirty' ? 0 : 1; - + if (not $undecided) { + $clean = $gitversion =~ '-dirty' ? 0 : 1; + } if ( defined($gitbranch) and defined($gitversion) ) { $fullgitinfo = $fullgitinfo.'/'. $gitbranch . '/' . $gitversion; diff --git a/tools/mkversion.sh b/tools/mkversion.sh index cc713d635..850ef2101 100755 --- a/tools/mkversion.sh +++ b/tools/mkversion.sh @@ -21,10 +21,12 @@ if [ "$commandGIT" != "" ]; then # now avoiding the "fatal: No names found, cannot describe anything." error by fallbacking to abbrev hash in such case gitversion=$(git describe --dirty --always) gitbranch=$(git rev-parse --abbrev-ref HEAD) - if [ "$gitversion" != "${gitversion%-dirty}" ]; then - clean=0 - else - clean=1 + if [ "$1" != "--undecided" ]; then + if [ "$gitversion" != "${gitversion%-dirty}" ]; then + clean=0 + else + clean=1 + fi fi if [ "$gitbranch" != "" ] && [ "$gitversion" != "" ]; then fullgitinfo="${fullgitinfo}/${gitbranch}/${gitversion}" From 7848d751c515accec05dc3b4cdd1ab358b37f1d7 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 21 May 2020 12:05:15 +0200 Subject: [PATCH 314/632] make release: hardcode default version --- Makefile | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 71d61f091..8f92c4152 100644 --- a/Makefile +++ b/Makefile @@ -256,11 +256,19 @@ endif # - Changing banner... @sed -i "s/^#define BANNERMSG3 .*/#define BANNERMSG3 \"Release $(VERSION) - $(RELEASE_NAME)\"/" client/src/proxmark3.c @echo -n "# ";grep "^#define BANNERMSG3" client/src/proxmark3.c - # - Committing... + # - Committing temporarily... @git commit -a -m "Release $(VERSION) - $(RELEASE_NAME)" - # - Tagging... + # - Tagging temporarily... @git tag -a -m "Release $(VERSION) - $(RELEASE_NAME)" $(VERSION) - # - Reverting... + # - Changing default version information based on new tag + @$(SH) tools/mkversion.sh --undecided > common/default_version.c.tmp && $(MV) common/default_version.c.tmp common/default_version.c + # - Deleting tag... + @git tag -d $(VERSION) + # - Amending commit... + @git commit -a --amend -m "Release $(VERSION) - $(RELEASE_NAME)" + # - Tagging again... + @git tag -a -m "Release $(VERSION) - $(RELEASE_NAME)" $(VERSION) + # - Reverting tagged commit... @git revert --no-edit HEAD # Dummy target to test for GNU make availability From b79ccc12ae29ed1d4a14d9f1190bb022381c7eae Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 21 May 2020 12:24:54 +0200 Subject: [PATCH 315/632] make release: document next step --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index 8f92c4152..c681320ba 100644 --- a/Makefile +++ b/Makefile @@ -270,6 +270,8 @@ endif @git tag -a -m "Release $(VERSION) - $(RELEASE_NAME)" $(VERSION) # - Reverting tagged commit... @git revert --no-edit HEAD + @echo "===================================================================" + @echo "Done! You can now execute 'git push --follow-tags'" # Dummy target to test for GNU make availability _test: From db2e97c8601686e200fb71fa113962aff031add7 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 21 May 2020 12:51:35 +0200 Subject: [PATCH 316/632] Release v4.9230 - Ice Coffee :coffee: --- Makefile.defs | 2 +- client/CMakeLists.txt | 2 +- client/Makefile | 2 +- client/deps/amiibo.cmake | 2 +- client/deps/cliparser.cmake | 2 +- client/deps/hardnested.cmake | 12 ++++++------ client/deps/jansson.cmake | 2 +- client/deps/lua.cmake | 2 +- client/deps/mbedtls.cmake | 2 +- client/deps/reveng.cmake | 2 +- client/deps/tinycbor.cmake | 2 +- client/deps/whereami.cmake | 2 +- client/deps/zlib.cmake | 2 +- client/src/proxmark3.c | 2 +- common/default_version.c | 11 ++++++----- common_arm/Makefile.common | 2 +- tools/hitag2crack/crack2/Makefile | 2 +- tools/hitag2crack/crack3/Makefile | 2 +- tools/hitag2crack/crack4/Makefile | 2 +- tools/hitag2crack/crack5/Makefile | 2 +- 20 files changed, 30 insertions(+), 29 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index d206611d3..477743d69 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -47,7 +47,7 @@ else RANLIB= ranlib endif -DEFCFLAGS = -Wall -Werror -O3 -fstrict-aliasing -pipe +DEFCFLAGS = -Wall -O3 -fstrict-aliasing -pipe # Some more warnings we want as errors: DEFCFLAGS += -Wbad-function-cast -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wshadow -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits -Wold-style-definition # Some more warnings we need first to eliminate, so temporarely tolerated: diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index a56ea5a9a..ce58a4449 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -229,7 +229,7 @@ add_executable( ${ADDITIONAL_SRC} ) -target_compile_options(proxmark3 PUBLIC -Wall -Werror -O3) +target_compile_options(proxmark3 PUBLIC -Wall -O3) if (MINGW) # Mingw uses by default Microsoft printf, we want the GNU printf (e.g. for %z) diff --git a/client/Makefile b/client/Makefile index 79943d8fa..260f72751 100644 --- a/client/Makefile +++ b/client/Makefile @@ -75,7 +75,7 @@ ifneq (,$(findstring MINGW,$(platform))) PM3CFLAGS += -D_ISOC99_SOURCE PM3CFLAGS += -mno-ms-bitfields -fexec-charset=cp850 endif -CXXFLAGS ?= -Wall -Werror -O3 +CXXFLAGS ?= -Wall -O3 PM3CXXFLAGS = $(CXXFLAGS) -I../include LUAPLATFORM = generic diff --git a/client/deps/amiibo.cmake b/client/deps/amiibo.cmake index 34780f597..fbf2a6f74 100644 --- a/client/deps/amiibo.cmake +++ b/client/deps/amiibo.cmake @@ -13,5 +13,5 @@ add_library(pm3rrg_rdv4_amiibo STATIC target_include_directories(pm3rrg_rdv4_amiibo PRIVATE ../../include ../../common) target_include_directories(pm3rrg_rdv4_amiibo INTERFACE amiitool) -target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_amiibo PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/cliparser.cmake b/client/deps/cliparser.cmake index b16451c07..69b639a84 100644 --- a/client/deps/cliparser.cmake +++ b/client/deps/cliparser.cmake @@ -8,5 +8,5 @@ target_include_directories(pm3rrg_rdv4_cliparser PRIVATE ../../include ../src) target_include_directories(pm3rrg_rdv4_cliparser INTERFACE cliparser) -target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_cliparser PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/hardnested.cmake b/client/deps/hardnested.cmake index 9efff1445..612265de0 100644 --- a/client/deps/hardnested.cmake +++ b/client/deps/hardnested.cmake @@ -2,7 +2,7 @@ add_library(pm3rrg_rdv4_hardnested_nosimd OBJECT hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) -target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_hardnested_nosimd PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_hardnested_nosimd PRIVATE @@ -27,7 +27,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_mmx BEFORE PRIVATE -mmmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_mmx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -41,7 +41,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_sse2 BEFORE PRIVATE -mmmx -msse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_sse2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -55,7 +55,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx BEFORE PRIVATE -mmmx -msse2 -mavx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -69,7 +69,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx2 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -83,7 +83,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx512 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mavx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx512 PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/jansson.cmake b/client/deps/jansson.cmake index a95ff0baf..1a55b7fa5 100644 --- a/client/deps/jansson.cmake +++ b/client/deps/jansson.cmake @@ -15,5 +15,5 @@ add_library(pm3rrg_rdv4_jansson STATIC target_compile_definitions(pm3rrg_rdv4_jansson PRIVATE HAVE_STDINT_H) target_include_directories(pm3rrg_rdv4_jansson INTERFACE jansson) -target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Werror -Wno-unused-function -O3) +target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Wno-unused-function -O3) set_property(TARGET pm3rrg_rdv4_jansson PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/lua.cmake b/client/deps/lua.cmake index 679147124..94c184906 100644 --- a/client/deps/lua.cmake +++ b/client/deps/lua.cmake @@ -45,5 +45,5 @@ if (NOT MINGW) endif (NOT MINGW) target_include_directories(pm3rrg_rdv4_lua INTERFACE liblua) -target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_lua PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/mbedtls.cmake b/client/deps/mbedtls.cmake index 63e706889..93a646e0d 100644 --- a/client/deps/mbedtls.cmake +++ b/client/deps/mbedtls.cmake @@ -45,5 +45,5 @@ add_library(pm3rrg_rdv4_mbedtls STATIC ) target_include_directories(pm3rrg_rdv4_mbedtls PRIVATE ../../common) -target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_mbedtls PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/reveng.cmake b/client/deps/reveng.cmake index d7e3cfd8a..1040730f1 100644 --- a/client/deps/reveng.cmake +++ b/client/deps/reveng.cmake @@ -13,5 +13,5 @@ target_include_directories(pm3rrg_rdv4_reveng PRIVATE ../src ../../include) target_include_directories(pm3rrg_rdv4_reveng INTERFACE reveng) -target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_reveng PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/tinycbor.cmake b/client/deps/tinycbor.cmake index 5a6abda25..c74618149 100644 --- a/client/deps/tinycbor.cmake +++ b/client/deps/tinycbor.cmake @@ -11,5 +11,5 @@ add_library(pm3rrg_rdv4_tinycbor STATIC target_include_directories(pm3rrg_rdv4_tinycbor INTERFACE tinycbor) # Strange errors on Mingw when compiling with -O3 -target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -Werror -O2) +target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -O2) set_property(TARGET pm3rrg_rdv4_tinycbor PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/whereami.cmake b/client/deps/whereami.cmake index d2d6a5b2a..721873066 100644 --- a/client/deps/whereami.cmake +++ b/client/deps/whereami.cmake @@ -2,5 +2,5 @@ add_library(pm3rrg_rdv4_whereami STATIC whereami/whereami.c) target_compile_definitions(pm3rrg_rdv4_whereami PRIVATE WAI_PM3_TUNED) target_include_directories(pm3rrg_rdv4_whereami INTERFACE whereami) -target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_whereami PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/zlib.cmake b/client/deps/zlib.cmake index 645cbc88d..563508633 100644 --- a/client/deps/zlib.cmake +++ b/client/deps/zlib.cmake @@ -9,5 +9,5 @@ add_library(pm3rrg_rdv4_z STATIC ) target_compile_definitions(pm3rrg_rdv4_z PRIVATE Z_SOLO NO_GZIP ZLIB_PM3_TUNED) -target_compile_options(pm3rrg_rdv4_z PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_z PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_z PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index 1e2be44ba..e21b04306 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -34,7 +34,7 @@ #define BANNERMSG1 " :snowflake: iceman@icesql.net" #define BANNERMSG2 " https://github.com/rfidresearchgroup/proxmark3/" -#define BANNERMSG3 "pre-release v4.0" +#define BANNERMSG3 "Release v4.9230 - Ice Coffee :coffee:" typedef enum LogoMode { UTF8, ANSI, ASCII } LogoMode; diff --git a/common/default_version.c b/common/default_version.c index 0f42590e8..c89691759 100644 --- a/common/default_version.c +++ b/common/default_version.c @@ -1,5 +1,5 @@ #include "common.h" -/* This is the default version.c file that Makefile.common falls back to if neither sh nor perl are available */ +/* Generated file, do not edit */ #ifndef ON_DEVICE #define SECTVERSINFO #else @@ -8,8 +8,9 @@ const struct version_information SECTVERSINFO version_information = { VERSION_INFORMATION_MAGIC, - 1, /* version 1 */ - 0, /* version information not present */ - 2, /* cleanliness couldn't be determined */ - /* Remaining fields: zero */ + 1, + 1, + 2, + "RRG/Iceman/master/v4.9230", + "2020-05-21 12:51:35", }; diff --git a/common_arm/Makefile.common b/common_arm/Makefile.common index e2c3ae3bc..8f2a90b3b 100644 --- a/common_arm/Makefile.common +++ b/common_arm/Makefile.common @@ -40,7 +40,7 @@ VPATH = . ../common_arm ../common ../common/crapto1 ../common/mbedtls ../common/ INCLUDES = ../include/proxmark3_arm.h ../include/at91sam7s512.h ../include/config_gpio.h ../include/pm3_cmd.h ARMCFLAGS = -mthumb-interwork -fno-builtin -DEFCFLAGS = -Wall -Werror -Os -pedantic -fstrict-aliasing -pipe +DEFCFLAGS = -Wall -Os -pedantic -fstrict-aliasing -pipe # Some more warnings we want as errors: DEFCFLAGS += -Wbad-function-cast -Wchar-subscripts -Wundef -Wunused -Wuninitialized -Wpointer-arith -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits diff --git a/tools/hitag2crack/crack2/Makefile b/tools/hitag2crack/crack2/Makefile index 4794d6ec4..318034f51 100644 --- a/tools/hitag2crack/crack2/Makefile +++ b/tools/hitag2crack/crack2/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -Werror -O3 +CFLAGS?=-Wall -O3 # Linux libs LIBS=-pthread -D_GNU_SOURCE # Mac libs diff --git a/tools/hitag2crack/crack3/Makefile b/tools/hitag2crack/crack3/Makefile index 318b5db78..1e157eef6 100644 --- a/tools/hitag2crack/crack3/Makefile +++ b/tools/hitag2crack/crack3/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -Werror -O3 +CFLAGS?=-Wall -O3 LIBS= VPATH=../common INC=-I ../common diff --git a/tools/hitag2crack/crack4/Makefile b/tools/hitag2crack/crack4/Makefile index b560577bd..30083c56d 100644 --- a/tools/hitag2crack/crack4/Makefile +++ b/tools/hitag2crack/crack4/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -Werror -O3 +CFLAGS?=-Wall -O3 LIBS=-lpthread VPATH=../common INC=-I ../common diff --git a/tools/hitag2crack/crack5/Makefile b/tools/hitag2crack/crack5/Makefile index 9d19b63ee..8e2b38f82 100644 --- a/tools/hitag2crack/crack5/Makefile +++ b/tools/hitag2crack/crack5/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -Werror -O3 +CFLAGS?=-Wall -O3 LIBS=-lpthread VPATH=../common INC=-I ../common From bf5c054414178499731bf35c2da59b83544ca560 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 21 May 2020 12:51:35 +0200 Subject: [PATCH 317/632] Revert "Release v4.9230 - Ice Coffee :coffee:" This reverts commit db2e97c8601686e200fb71fa113962aff031add7. --- Makefile.defs | 2 +- client/CMakeLists.txt | 2 +- client/Makefile | 2 +- client/deps/amiibo.cmake | 2 +- client/deps/cliparser.cmake | 2 +- client/deps/hardnested.cmake | 12 ++++++------ client/deps/jansson.cmake | 2 +- client/deps/lua.cmake | 2 +- client/deps/mbedtls.cmake | 2 +- client/deps/reveng.cmake | 2 +- client/deps/tinycbor.cmake | 2 +- client/deps/whereami.cmake | 2 +- client/deps/zlib.cmake | 2 +- client/src/proxmark3.c | 2 +- common/default_version.c | 11 +++++------ common_arm/Makefile.common | 2 +- tools/hitag2crack/crack2/Makefile | 2 +- tools/hitag2crack/crack3/Makefile | 2 +- tools/hitag2crack/crack4/Makefile | 2 +- tools/hitag2crack/crack5/Makefile | 2 +- 20 files changed, 29 insertions(+), 30 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index 477743d69..d206611d3 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -47,7 +47,7 @@ else RANLIB= ranlib endif -DEFCFLAGS = -Wall -O3 -fstrict-aliasing -pipe +DEFCFLAGS = -Wall -Werror -O3 -fstrict-aliasing -pipe # Some more warnings we want as errors: DEFCFLAGS += -Wbad-function-cast -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wshadow -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits -Wold-style-definition # Some more warnings we need first to eliminate, so temporarely tolerated: diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index ce58a4449..a56ea5a9a 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -229,7 +229,7 @@ add_executable( ${ADDITIONAL_SRC} ) -target_compile_options(proxmark3 PUBLIC -Wall -O3) +target_compile_options(proxmark3 PUBLIC -Wall -Werror -O3) if (MINGW) # Mingw uses by default Microsoft printf, we want the GNU printf (e.g. for %z) diff --git a/client/Makefile b/client/Makefile index 260f72751..79943d8fa 100644 --- a/client/Makefile +++ b/client/Makefile @@ -75,7 +75,7 @@ ifneq (,$(findstring MINGW,$(platform))) PM3CFLAGS += -D_ISOC99_SOURCE PM3CFLAGS += -mno-ms-bitfields -fexec-charset=cp850 endif -CXXFLAGS ?= -Wall -O3 +CXXFLAGS ?= -Wall -Werror -O3 PM3CXXFLAGS = $(CXXFLAGS) -I../include LUAPLATFORM = generic diff --git a/client/deps/amiibo.cmake b/client/deps/amiibo.cmake index fbf2a6f74..34780f597 100644 --- a/client/deps/amiibo.cmake +++ b/client/deps/amiibo.cmake @@ -13,5 +13,5 @@ add_library(pm3rrg_rdv4_amiibo STATIC target_include_directories(pm3rrg_rdv4_amiibo PRIVATE ../../include ../../common) target_include_directories(pm3rrg_rdv4_amiibo INTERFACE amiitool) -target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_amiibo PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/cliparser.cmake b/client/deps/cliparser.cmake index 69b639a84..b16451c07 100644 --- a/client/deps/cliparser.cmake +++ b/client/deps/cliparser.cmake @@ -8,5 +8,5 @@ target_include_directories(pm3rrg_rdv4_cliparser PRIVATE ../../include ../src) target_include_directories(pm3rrg_rdv4_cliparser INTERFACE cliparser) -target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_cliparser PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/hardnested.cmake b/client/deps/hardnested.cmake index 612265de0..9efff1445 100644 --- a/client/deps/hardnested.cmake +++ b/client/deps/hardnested.cmake @@ -2,7 +2,7 @@ add_library(pm3rrg_rdv4_hardnested_nosimd OBJECT hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) -target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_hardnested_nosimd PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_hardnested_nosimd PRIVATE @@ -27,7 +27,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_mmx BEFORE PRIVATE -mmmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_mmx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -41,7 +41,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_sse2 BEFORE PRIVATE -mmmx -msse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_sse2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -55,7 +55,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx BEFORE PRIVATE -mmmx -msse2 -mavx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -69,7 +69,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx2 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -83,7 +83,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx512 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mavx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx512 PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/jansson.cmake b/client/deps/jansson.cmake index 1a55b7fa5..a95ff0baf 100644 --- a/client/deps/jansson.cmake +++ b/client/deps/jansson.cmake @@ -15,5 +15,5 @@ add_library(pm3rrg_rdv4_jansson STATIC target_compile_definitions(pm3rrg_rdv4_jansson PRIVATE HAVE_STDINT_H) target_include_directories(pm3rrg_rdv4_jansson INTERFACE jansson) -target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Wno-unused-function -O3) +target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Werror -Wno-unused-function -O3) set_property(TARGET pm3rrg_rdv4_jansson PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/lua.cmake b/client/deps/lua.cmake index 94c184906..679147124 100644 --- a/client/deps/lua.cmake +++ b/client/deps/lua.cmake @@ -45,5 +45,5 @@ if (NOT MINGW) endif (NOT MINGW) target_include_directories(pm3rrg_rdv4_lua INTERFACE liblua) -target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_lua PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/mbedtls.cmake b/client/deps/mbedtls.cmake index 93a646e0d..63e706889 100644 --- a/client/deps/mbedtls.cmake +++ b/client/deps/mbedtls.cmake @@ -45,5 +45,5 @@ add_library(pm3rrg_rdv4_mbedtls STATIC ) target_include_directories(pm3rrg_rdv4_mbedtls PRIVATE ../../common) -target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_mbedtls PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/reveng.cmake b/client/deps/reveng.cmake index 1040730f1..d7e3cfd8a 100644 --- a/client/deps/reveng.cmake +++ b/client/deps/reveng.cmake @@ -13,5 +13,5 @@ target_include_directories(pm3rrg_rdv4_reveng PRIVATE ../src ../../include) target_include_directories(pm3rrg_rdv4_reveng INTERFACE reveng) -target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_reveng PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/tinycbor.cmake b/client/deps/tinycbor.cmake index c74618149..5a6abda25 100644 --- a/client/deps/tinycbor.cmake +++ b/client/deps/tinycbor.cmake @@ -11,5 +11,5 @@ add_library(pm3rrg_rdv4_tinycbor STATIC target_include_directories(pm3rrg_rdv4_tinycbor INTERFACE tinycbor) # Strange errors on Mingw when compiling with -O3 -target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -O2) +target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -Werror -O2) set_property(TARGET pm3rrg_rdv4_tinycbor PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/whereami.cmake b/client/deps/whereami.cmake index 721873066..d2d6a5b2a 100644 --- a/client/deps/whereami.cmake +++ b/client/deps/whereami.cmake @@ -2,5 +2,5 @@ add_library(pm3rrg_rdv4_whereami STATIC whereami/whereami.c) target_compile_definitions(pm3rrg_rdv4_whereami PRIVATE WAI_PM3_TUNED) target_include_directories(pm3rrg_rdv4_whereami INTERFACE whereami) -target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_whereami PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/zlib.cmake b/client/deps/zlib.cmake index 563508633..645cbc88d 100644 --- a/client/deps/zlib.cmake +++ b/client/deps/zlib.cmake @@ -9,5 +9,5 @@ add_library(pm3rrg_rdv4_z STATIC ) target_compile_definitions(pm3rrg_rdv4_z PRIVATE Z_SOLO NO_GZIP ZLIB_PM3_TUNED) -target_compile_options(pm3rrg_rdv4_z PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_z PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_z PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index e21b04306..1e2be44ba 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -34,7 +34,7 @@ #define BANNERMSG1 " :snowflake: iceman@icesql.net" #define BANNERMSG2 " https://github.com/rfidresearchgroup/proxmark3/" -#define BANNERMSG3 "Release v4.9230 - Ice Coffee :coffee:" +#define BANNERMSG3 "pre-release v4.0" typedef enum LogoMode { UTF8, ANSI, ASCII } LogoMode; diff --git a/common/default_version.c b/common/default_version.c index c89691759..0f42590e8 100644 --- a/common/default_version.c +++ b/common/default_version.c @@ -1,5 +1,5 @@ #include "common.h" -/* Generated file, do not edit */ +/* This is the default version.c file that Makefile.common falls back to if neither sh nor perl are available */ #ifndef ON_DEVICE #define SECTVERSINFO #else @@ -8,9 +8,8 @@ const struct version_information SECTVERSINFO version_information = { VERSION_INFORMATION_MAGIC, - 1, - 1, - 2, - "RRG/Iceman/master/v4.9230", - "2020-05-21 12:51:35", + 1, /* version 1 */ + 0, /* version information not present */ + 2, /* cleanliness couldn't be determined */ + /* Remaining fields: zero */ }; diff --git a/common_arm/Makefile.common b/common_arm/Makefile.common index 8f2a90b3b..e2c3ae3bc 100644 --- a/common_arm/Makefile.common +++ b/common_arm/Makefile.common @@ -40,7 +40,7 @@ VPATH = . ../common_arm ../common ../common/crapto1 ../common/mbedtls ../common/ INCLUDES = ../include/proxmark3_arm.h ../include/at91sam7s512.h ../include/config_gpio.h ../include/pm3_cmd.h ARMCFLAGS = -mthumb-interwork -fno-builtin -DEFCFLAGS = -Wall -Os -pedantic -fstrict-aliasing -pipe +DEFCFLAGS = -Wall -Werror -Os -pedantic -fstrict-aliasing -pipe # Some more warnings we want as errors: DEFCFLAGS += -Wbad-function-cast -Wchar-subscripts -Wundef -Wunused -Wuninitialized -Wpointer-arith -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits diff --git a/tools/hitag2crack/crack2/Makefile b/tools/hitag2crack/crack2/Makefile index 318034f51..4794d6ec4 100644 --- a/tools/hitag2crack/crack2/Makefile +++ b/tools/hitag2crack/crack2/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -O3 +CFLAGS?=-Wall -Werror -O3 # Linux libs LIBS=-pthread -D_GNU_SOURCE # Mac libs diff --git a/tools/hitag2crack/crack3/Makefile b/tools/hitag2crack/crack3/Makefile index 1e157eef6..318b5db78 100644 --- a/tools/hitag2crack/crack3/Makefile +++ b/tools/hitag2crack/crack3/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -O3 +CFLAGS?=-Wall -Werror -O3 LIBS= VPATH=../common INC=-I ../common diff --git a/tools/hitag2crack/crack4/Makefile b/tools/hitag2crack/crack4/Makefile index 30083c56d..b560577bd 100644 --- a/tools/hitag2crack/crack4/Makefile +++ b/tools/hitag2crack/crack4/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -O3 +CFLAGS?=-Wall -Werror -O3 LIBS=-lpthread VPATH=../common INC=-I ../common diff --git a/tools/hitag2crack/crack5/Makefile b/tools/hitag2crack/crack5/Makefile index 8e2b38f82..9d19b63ee 100644 --- a/tools/hitag2crack/crack5/Makefile +++ b/tools/hitag2crack/crack5/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -O3 +CFLAGS?=-Wall -Werror -O3 LIBS=-lpthread VPATH=../common INC=-I ../common From 321080de71693788700a10adc05fee122963c646 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 21 May 2020 13:00:56 +0200 Subject: [PATCH 318/632] make release doc: push latest tag --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index c681320ba..63ca7bf53 100644 --- a/Makefile +++ b/Makefile @@ -271,7 +271,7 @@ endif # - Reverting tagged commit... @git revert --no-edit HEAD @echo "===================================================================" - @echo "Done! You can now execute 'git push --follow-tags'" + @echo "Done! You can now execute 'git push origin $(VERSION)'" # Dummy target to test for GNU make availability _test: From 8e12285f665b0fdc3e2af61dc6023b4cf468732b Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 21 May 2020 19:28:42 +0200 Subject: [PATCH 319/632] introduce CROSS_*FLAGS for cross-compilation --- armsrc/Makefile | 6 ++---- bootrom/Makefile | 2 +- common_arm/Makefile.common | 16 ++++++++-------- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/armsrc/Makefile b/armsrc/Makefile index 60b23c9f7..18d36a1b7 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -132,8 +132,6 @@ VERSIONSRC = version.c \ # Do not move this inclusion before the definition of {THUMB,ASM,ARM}SRC include ../common_arm/Makefile.common -COMMON_FLAGS = -Os - INSTALLFW = $(OBJDIR)/fullimage.elf ifneq (,$(FWTAG)) INSTALLFWTAG = $(notdir $(INSTALLFW:%.elf=%-$(FWTAG).elf)) @@ -178,7 +176,7 @@ $(FPGA_COMPRESSOR): $(OBJDIR)/fullimage.stage1.elf: $(VERSIONOBJ) $(OBJDIR)/fpga_all.o $(THUMBOBJ) $(ARMOBJ) $(info [=] LD $@) - $(Q)$(CC) $(LDFLAGS) -Wl,-T,ldscript,-Map,$(patsubst %.elf,%.map,$@) -o $@ $^ $(LIBS) + $(Q)$(CC) $(CROSS_LDFLAGS) -Wl,-T,ldscript,-Map,$(patsubst %.elf,%.map,$@) -o $@ $^ $(LIBS) $(OBJDIR)/fullimage.nodata.bin: $(OBJDIR)/fullimage.stage1.elf $(info [-] GEN $@) @@ -206,7 +204,7 @@ $(OBJDIR)/fullimage.data.o: $(OBJDIR)/fullimage.data.bin.z $(OBJDIR)/fullimage.elf: $(OBJDIR)/fullimage.nodata.o $(OBJDIR)/fullimage.data.o $(info [=] LD $@) - $(Q)$(CC) $(LDFLAGS) -Wl,-T,ldscript,-e,_osimage_entry,-Map,$(patsubst %.elf,%.map,$@) -o $@ $^ + $(Q)$(CC) $(CROSS_LDFLAGS) -Wl,-T,ldscript,-e,_osimage_entry,-Map,$(patsubst %.elf,%.map,$@) -o $@ $^ tarbin: $(OBJS) $(info TAR $@) diff --git a/bootrom/Makefile b/bootrom/Makefile index f6cf18174..68597aa22 100644 --- a/bootrom/Makefile +++ b/bootrom/Makefile @@ -52,7 +52,7 @@ tarbin: $(OBJS) $(OBJDIR)/bootrom.elf: $(VERSIONOBJ) $(ASMOBJ) $(ARMOBJ) $(THUMBOBJ) $(info [=] LD $@) - $(Q)$(CC) $(LDFLAGS) -Wl,-T,ldscript-flash,-Map,$(patsubst %.elf,%.map,$@) -o $@ $^ $(LIBS) + $(Q)$(CC) $(CROSS_LDFLAGS) -Wl,-T,ldscript-flash,-Map,$(patsubst %.elf,%.map,$@) -o $@ $^ $(LIBS) clean: $(Q)$(RM) $(OBJDIR)$(PATHSEP)*.o diff --git a/common_arm/Makefile.common b/common_arm/Makefile.common index e2c3ae3bc..c8dceead5 100644 --- a/common_arm/Makefile.common +++ b/common_arm/Makefile.common @@ -89,10 +89,10 @@ ifeq ($(NOERROR),1) DEFCFLAGS += -Wno-error endif -CFLAGS ?= $(DEFCFLAGS) -CFLAGS += $(ARMCFLAGS) -c $(INCLUDE) -std=c99 -DON_DEVICE $(APP_CFLAGS) +CROSS_CFLAGS ?= $(DEFCFLAGS) +CROSS_CFLAGS += $(ARMCFLAGS) -c $(INCLUDE) -std=c99 -DON_DEVICE $(APP_CFLAGS) -LDFLAGS += -nostartfiles -nodefaultlibs -Wl,-gc-sections -Wl,--build-id=none -n +CROSS_LDFLAGS += -nostartfiles -nodefaultlibs -Wl,-gc-sections -Wl,--build-id=none -n LIBS = -lgcc # Flags to generate temporary dependency files @@ -107,21 +107,21 @@ VERSIONOBJ = $(patsubst %.c,$(OBJDIR)/%.o,$(notdir $(VERSIONSRC))) $(THUMBOBJ): $(OBJDIR)/%.o: %.c $(INCLUDES) $(info [-] CC $<) - $(Q)$(CC) $(CFLAGS) $(DEPFLAGS) -mthumb -o $@ $< + $(Q)$(CC) $(CROSS_CFLAGS) $(DEPFLAGS) -mthumb -o $@ $< $(Q)$(POSTCOMPILE) $(ARMOBJ): $(OBJDIR)/%.o: %.c $(INCLUDES) $(info [-] CC $<) - $(Q)$(CC) $(CFLAGS) $(DEPFLAGS) -o $@ $< + $(Q)$(CC) $(CROSS_CFLAGS) $(DEPFLAGS) -o $@ $< $(Q)$(POSTCOMPILE) $(ASMOBJ): $(OBJDIR)/%.o: %.s $(info [-] CC $<) - $(Q)$(CC) $(CFLAGS) -o $@ $< + $(Q)$(CC) $(CROSS_CFLAGS) -o $@ $< $(VERSIONOBJ): $(OBJDIR)/%.o: %.c $(INCLUDES) $(info [-] CC $<) - $(Q)$(CC) $(CFLAGS) -mthumb -o $@ $< + $(Q)$(CC) $(CROSS_CFLAGS) -mthumb -o $@ $< # This objcopy call translates physical flash addresses to logical addresses # without touching start address or RAM addresses (.bss and .data sections) @@ -135,7 +135,7 @@ $(OBJDIR)/%.s19: $(OBJDIR)/%.elf $(Q)$(OBJCOPY) -Osrec --srec-forceS3 --strip-debug $(OBJCOPY_TRANSLATIONS) $^ $@ # easy printing of MAKE VARIABLES -print-%: ; @echo $* = $($*) +print-%: ; @echo $* = $($*) # Automatic dependency generation DEPENDENCY_FILES = $(patsubst %.c,$(OBJDIR)/%.d,$(notdir $(THUMBSRC))) \ From 4092effe93b3f3e084389cd1d1316764d1981aa1 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 21 May 2020 19:38:20 +0200 Subject: [PATCH 320/632] Document CROSS_*FLAGS --- doc/md/Development/Maintainers.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/md/Development/Maintainers.md b/doc/md/Development/Maintainers.md index 85fcf8963..2a49343fd 100644 --- a/doc/md/Development/Maintainers.md +++ b/doc/md/Development/Maintainers.md @@ -49,7 +49,9 @@ and it will be added along the other firmware as: For verbose usage and see the actual commands being executed, add `V=1`. -`CFLAGS` and `LDFLAGS` can be overriden by environment variables. +`CFLAGS` and `LDFLAGS` can be overriden by environment variables for client-side components. + +`CROSS_CFLAGS` and `CROSS_LDFLAGS` can be overriden by environment variables for ARM-side components. Default compiler is gcc but you can use clang for the non-ARM parts with e.g. `make client CC=clang CXX=clang++ LD=clang++`. From c07a8aeba374f651a9c19e111ca282f47d874cb7 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 21 May 2020 20:15:46 +0200 Subject: [PATCH 321/632] textual --- Makefile.platform.sample | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.platform.sample b/Makefile.platform.sample index 8d587e3b7..8a31a0e9c 100644 --- a/Makefile.platform.sample +++ b/Makefile.platform.sample @@ -2,7 +2,7 @@ # Run 'make PLATFORM=' to get an exhaustive list of possible parameters for this file. PLATFORM=PM3RDV4 +#PLATFORM=PM3OTHER # If you want more than one PLATFORM_EXTRAS option, separate them by spaces: #PLATFORM_EXTRAS=BTADDON -#STANDALONE=LF_SAMYRUN -STANDALONE=LF_ICEHID +#STANDALONE=HF_MSDSAL From a19ba257af631b770ac6fb0989b2984eac4ac7c9 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 21 May 2020 21:45:54 +0200 Subject: [PATCH 322/632] fix: #746 - ProxSpace 64b seem to report both _WIN32 and _WIN64 --- tools/mf_nonce_brute/mf_nonce_brute.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tools/mf_nonce_brute/mf_nonce_brute.c b/tools/mf_nonce_brute/mf_nonce_brute.c index 3bd2a6f31..7edcf4824 100644 --- a/tools/mf_nonce_brute/mf_nonce_brute.c +++ b/tools/mf_nonce_brute/mf_nonce_brute.c @@ -1,7 +1,9 @@ #define __STDC_FORMAT_MACROS -#if defined(_WIN32) -# define _USE_32BIT_TIME_T 1 +#if !defined(_WIN64) + #if defined(_WIN32) || defined(__WIN32__) + # define _USE_32BIT_TIME_T 1 + #endif #endif #include @@ -56,7 +58,7 @@ int global_counter = 0; int global_fin_flag = 0; int global_found = 0; int global_found_candidate = 0; -size_t thread_count = 4; +size_t thread_count = 2; static uint16_t parity_from_err(uint32_t data, uint16_t par_err) { @@ -350,7 +352,7 @@ int main(int argc, char *argv[]) { //calc (parity XOR corresponding nonce bit encoded with the same keystream bit) uint16_t xored = xored_bits(nt_par, nt_enc, ar_par, ar_enc, at_par, at_enc); -#ifndef __WIN32 +#if !defined(_WIN32) || !defined(__WIN32__) thread_count = sysconf(_SC_NPROCESSORS_CONF); if (thread_count < 2) thread_count = 2; From 833bc4d9a3f2c1dcef4a72393663f75e0ba0fbd1 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 21 May 2020 21:55:15 +0200 Subject: [PATCH 323/632] Release v4.9237 - Ice Coffee :coffee: --- Makefile.defs | 2 +- client/CMakeLists.txt | 2 +- client/Makefile | 2 +- client/deps/amiibo.cmake | 2 +- client/deps/cliparser.cmake | 2 +- client/deps/hardnested.cmake | 12 ++++++------ client/deps/jansson.cmake | 2 +- client/deps/lua.cmake | 2 +- client/deps/mbedtls.cmake | 2 +- client/deps/reveng.cmake | 2 +- client/deps/tinycbor.cmake | 2 +- client/deps/whereami.cmake | 2 +- client/deps/zlib.cmake | 2 +- client/src/proxmark3.c | 2 +- common/default_version.c | 11 ++++++----- common_arm/Makefile.common | 2 +- tools/hitag2crack/crack2/Makefile | 2 +- tools/hitag2crack/crack3/Makefile | 2 +- tools/hitag2crack/crack4/Makefile | 2 +- tools/hitag2crack/crack5/Makefile | 2 +- 20 files changed, 30 insertions(+), 29 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index d206611d3..477743d69 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -47,7 +47,7 @@ else RANLIB= ranlib endif -DEFCFLAGS = -Wall -Werror -O3 -fstrict-aliasing -pipe +DEFCFLAGS = -Wall -O3 -fstrict-aliasing -pipe # Some more warnings we want as errors: DEFCFLAGS += -Wbad-function-cast -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wshadow -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits -Wold-style-definition # Some more warnings we need first to eliminate, so temporarely tolerated: diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index a56ea5a9a..ce58a4449 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -229,7 +229,7 @@ add_executable( ${ADDITIONAL_SRC} ) -target_compile_options(proxmark3 PUBLIC -Wall -Werror -O3) +target_compile_options(proxmark3 PUBLIC -Wall -O3) if (MINGW) # Mingw uses by default Microsoft printf, we want the GNU printf (e.g. for %z) diff --git a/client/Makefile b/client/Makefile index 79943d8fa..260f72751 100644 --- a/client/Makefile +++ b/client/Makefile @@ -75,7 +75,7 @@ ifneq (,$(findstring MINGW,$(platform))) PM3CFLAGS += -D_ISOC99_SOURCE PM3CFLAGS += -mno-ms-bitfields -fexec-charset=cp850 endif -CXXFLAGS ?= -Wall -Werror -O3 +CXXFLAGS ?= -Wall -O3 PM3CXXFLAGS = $(CXXFLAGS) -I../include LUAPLATFORM = generic diff --git a/client/deps/amiibo.cmake b/client/deps/amiibo.cmake index 34780f597..fbf2a6f74 100644 --- a/client/deps/amiibo.cmake +++ b/client/deps/amiibo.cmake @@ -13,5 +13,5 @@ add_library(pm3rrg_rdv4_amiibo STATIC target_include_directories(pm3rrg_rdv4_amiibo PRIVATE ../../include ../../common) target_include_directories(pm3rrg_rdv4_amiibo INTERFACE amiitool) -target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_amiibo PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/cliparser.cmake b/client/deps/cliparser.cmake index b16451c07..69b639a84 100644 --- a/client/deps/cliparser.cmake +++ b/client/deps/cliparser.cmake @@ -8,5 +8,5 @@ target_include_directories(pm3rrg_rdv4_cliparser PRIVATE ../../include ../src) target_include_directories(pm3rrg_rdv4_cliparser INTERFACE cliparser) -target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_cliparser PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/hardnested.cmake b/client/deps/hardnested.cmake index 9efff1445..612265de0 100644 --- a/client/deps/hardnested.cmake +++ b/client/deps/hardnested.cmake @@ -2,7 +2,7 @@ add_library(pm3rrg_rdv4_hardnested_nosimd OBJECT hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) -target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_hardnested_nosimd PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_hardnested_nosimd PRIVATE @@ -27,7 +27,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_mmx BEFORE PRIVATE -mmmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_mmx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -41,7 +41,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_sse2 BEFORE PRIVATE -mmmx -msse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_sse2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -55,7 +55,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx BEFORE PRIVATE -mmmx -msse2 -mavx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -69,7 +69,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx2 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -83,7 +83,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx512 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mavx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx512 PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/jansson.cmake b/client/deps/jansson.cmake index a95ff0baf..1a55b7fa5 100644 --- a/client/deps/jansson.cmake +++ b/client/deps/jansson.cmake @@ -15,5 +15,5 @@ add_library(pm3rrg_rdv4_jansson STATIC target_compile_definitions(pm3rrg_rdv4_jansson PRIVATE HAVE_STDINT_H) target_include_directories(pm3rrg_rdv4_jansson INTERFACE jansson) -target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Werror -Wno-unused-function -O3) +target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Wno-unused-function -O3) set_property(TARGET pm3rrg_rdv4_jansson PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/lua.cmake b/client/deps/lua.cmake index 679147124..94c184906 100644 --- a/client/deps/lua.cmake +++ b/client/deps/lua.cmake @@ -45,5 +45,5 @@ if (NOT MINGW) endif (NOT MINGW) target_include_directories(pm3rrg_rdv4_lua INTERFACE liblua) -target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_lua PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/mbedtls.cmake b/client/deps/mbedtls.cmake index 63e706889..93a646e0d 100644 --- a/client/deps/mbedtls.cmake +++ b/client/deps/mbedtls.cmake @@ -45,5 +45,5 @@ add_library(pm3rrg_rdv4_mbedtls STATIC ) target_include_directories(pm3rrg_rdv4_mbedtls PRIVATE ../../common) -target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_mbedtls PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/reveng.cmake b/client/deps/reveng.cmake index d7e3cfd8a..1040730f1 100644 --- a/client/deps/reveng.cmake +++ b/client/deps/reveng.cmake @@ -13,5 +13,5 @@ target_include_directories(pm3rrg_rdv4_reveng PRIVATE ../src ../../include) target_include_directories(pm3rrg_rdv4_reveng INTERFACE reveng) -target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_reveng PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/tinycbor.cmake b/client/deps/tinycbor.cmake index 5a6abda25..c74618149 100644 --- a/client/deps/tinycbor.cmake +++ b/client/deps/tinycbor.cmake @@ -11,5 +11,5 @@ add_library(pm3rrg_rdv4_tinycbor STATIC target_include_directories(pm3rrg_rdv4_tinycbor INTERFACE tinycbor) # Strange errors on Mingw when compiling with -O3 -target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -Werror -O2) +target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -O2) set_property(TARGET pm3rrg_rdv4_tinycbor PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/whereami.cmake b/client/deps/whereami.cmake index d2d6a5b2a..721873066 100644 --- a/client/deps/whereami.cmake +++ b/client/deps/whereami.cmake @@ -2,5 +2,5 @@ add_library(pm3rrg_rdv4_whereami STATIC whereami/whereami.c) target_compile_definitions(pm3rrg_rdv4_whereami PRIVATE WAI_PM3_TUNED) target_include_directories(pm3rrg_rdv4_whereami INTERFACE whereami) -target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_whereami PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/zlib.cmake b/client/deps/zlib.cmake index 645cbc88d..563508633 100644 --- a/client/deps/zlib.cmake +++ b/client/deps/zlib.cmake @@ -9,5 +9,5 @@ add_library(pm3rrg_rdv4_z STATIC ) target_compile_definitions(pm3rrg_rdv4_z PRIVATE Z_SOLO NO_GZIP ZLIB_PM3_TUNED) -target_compile_options(pm3rrg_rdv4_z PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_z PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_z PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index 1e2be44ba..cc91e1aaf 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -34,7 +34,7 @@ #define BANNERMSG1 " :snowflake: iceman@icesql.net" #define BANNERMSG2 " https://github.com/rfidresearchgroup/proxmark3/" -#define BANNERMSG3 "pre-release v4.0" +#define BANNERMSG3 "Release v4.9237 - Ice Coffee :coffee:" typedef enum LogoMode { UTF8, ANSI, ASCII } LogoMode; diff --git a/common/default_version.c b/common/default_version.c index 0f42590e8..86ba9f9ab 100644 --- a/common/default_version.c +++ b/common/default_version.c @@ -1,5 +1,5 @@ #include "common.h" -/* This is the default version.c file that Makefile.common falls back to if neither sh nor perl are available */ +/* Generated file, do not edit */ #ifndef ON_DEVICE #define SECTVERSINFO #else @@ -8,8 +8,9 @@ const struct version_information SECTVERSINFO version_information = { VERSION_INFORMATION_MAGIC, - 1, /* version 1 */ - 0, /* version information not present */ - 2, /* cleanliness couldn't be determined */ - /* Remaining fields: zero */ + 1, + 1, + 2, + "RRG/Iceman/master/v4.9237", + "2020-05-21 21:55:15", }; diff --git a/common_arm/Makefile.common b/common_arm/Makefile.common index c8dceead5..d5b2c0557 100644 --- a/common_arm/Makefile.common +++ b/common_arm/Makefile.common @@ -40,7 +40,7 @@ VPATH = . ../common_arm ../common ../common/crapto1 ../common/mbedtls ../common/ INCLUDES = ../include/proxmark3_arm.h ../include/at91sam7s512.h ../include/config_gpio.h ../include/pm3_cmd.h ARMCFLAGS = -mthumb-interwork -fno-builtin -DEFCFLAGS = -Wall -Werror -Os -pedantic -fstrict-aliasing -pipe +DEFCFLAGS = -Wall -Os -pedantic -fstrict-aliasing -pipe # Some more warnings we want as errors: DEFCFLAGS += -Wbad-function-cast -Wchar-subscripts -Wundef -Wunused -Wuninitialized -Wpointer-arith -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits diff --git a/tools/hitag2crack/crack2/Makefile b/tools/hitag2crack/crack2/Makefile index 4794d6ec4..318034f51 100644 --- a/tools/hitag2crack/crack2/Makefile +++ b/tools/hitag2crack/crack2/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -Werror -O3 +CFLAGS?=-Wall -O3 # Linux libs LIBS=-pthread -D_GNU_SOURCE # Mac libs diff --git a/tools/hitag2crack/crack3/Makefile b/tools/hitag2crack/crack3/Makefile index 318b5db78..1e157eef6 100644 --- a/tools/hitag2crack/crack3/Makefile +++ b/tools/hitag2crack/crack3/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -Werror -O3 +CFLAGS?=-Wall -O3 LIBS= VPATH=../common INC=-I ../common diff --git a/tools/hitag2crack/crack4/Makefile b/tools/hitag2crack/crack4/Makefile index b560577bd..30083c56d 100644 --- a/tools/hitag2crack/crack4/Makefile +++ b/tools/hitag2crack/crack4/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -Werror -O3 +CFLAGS?=-Wall -O3 LIBS=-lpthread VPATH=../common INC=-I ../common diff --git a/tools/hitag2crack/crack5/Makefile b/tools/hitag2crack/crack5/Makefile index 9d19b63ee..8e2b38f82 100644 --- a/tools/hitag2crack/crack5/Makefile +++ b/tools/hitag2crack/crack5/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -Werror -O3 +CFLAGS?=-Wall -O3 LIBS=-lpthread VPATH=../common INC=-I ../common From d40251ff0be75f97ed88b6c8fa6e61674e190edd Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 21 May 2020 21:55:15 +0200 Subject: [PATCH 324/632] Revert "Release v4.9237 - Ice Coffee :coffee:" This reverts commit 833bc4d9a3f2c1dcef4a72393663f75e0ba0fbd1. --- Makefile.defs | 2 +- client/CMakeLists.txt | 2 +- client/Makefile | 2 +- client/deps/amiibo.cmake | 2 +- client/deps/cliparser.cmake | 2 +- client/deps/hardnested.cmake | 12 ++++++------ client/deps/jansson.cmake | 2 +- client/deps/lua.cmake | 2 +- client/deps/mbedtls.cmake | 2 +- client/deps/reveng.cmake | 2 +- client/deps/tinycbor.cmake | 2 +- client/deps/whereami.cmake | 2 +- client/deps/zlib.cmake | 2 +- client/src/proxmark3.c | 2 +- common/default_version.c | 11 +++++------ common_arm/Makefile.common | 2 +- tools/hitag2crack/crack2/Makefile | 2 +- tools/hitag2crack/crack3/Makefile | 2 +- tools/hitag2crack/crack4/Makefile | 2 +- tools/hitag2crack/crack5/Makefile | 2 +- 20 files changed, 29 insertions(+), 30 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index 477743d69..d206611d3 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -47,7 +47,7 @@ else RANLIB= ranlib endif -DEFCFLAGS = -Wall -O3 -fstrict-aliasing -pipe +DEFCFLAGS = -Wall -Werror -O3 -fstrict-aliasing -pipe # Some more warnings we want as errors: DEFCFLAGS += -Wbad-function-cast -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wshadow -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits -Wold-style-definition # Some more warnings we need first to eliminate, so temporarely tolerated: diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index ce58a4449..a56ea5a9a 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -229,7 +229,7 @@ add_executable( ${ADDITIONAL_SRC} ) -target_compile_options(proxmark3 PUBLIC -Wall -O3) +target_compile_options(proxmark3 PUBLIC -Wall -Werror -O3) if (MINGW) # Mingw uses by default Microsoft printf, we want the GNU printf (e.g. for %z) diff --git a/client/Makefile b/client/Makefile index 260f72751..79943d8fa 100644 --- a/client/Makefile +++ b/client/Makefile @@ -75,7 +75,7 @@ ifneq (,$(findstring MINGW,$(platform))) PM3CFLAGS += -D_ISOC99_SOURCE PM3CFLAGS += -mno-ms-bitfields -fexec-charset=cp850 endif -CXXFLAGS ?= -Wall -O3 +CXXFLAGS ?= -Wall -Werror -O3 PM3CXXFLAGS = $(CXXFLAGS) -I../include LUAPLATFORM = generic diff --git a/client/deps/amiibo.cmake b/client/deps/amiibo.cmake index fbf2a6f74..34780f597 100644 --- a/client/deps/amiibo.cmake +++ b/client/deps/amiibo.cmake @@ -13,5 +13,5 @@ add_library(pm3rrg_rdv4_amiibo STATIC target_include_directories(pm3rrg_rdv4_amiibo PRIVATE ../../include ../../common) target_include_directories(pm3rrg_rdv4_amiibo INTERFACE amiitool) -target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_amiibo PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/cliparser.cmake b/client/deps/cliparser.cmake index 69b639a84..b16451c07 100644 --- a/client/deps/cliparser.cmake +++ b/client/deps/cliparser.cmake @@ -8,5 +8,5 @@ target_include_directories(pm3rrg_rdv4_cliparser PRIVATE ../../include ../src) target_include_directories(pm3rrg_rdv4_cliparser INTERFACE cliparser) -target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_cliparser PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/hardnested.cmake b/client/deps/hardnested.cmake index 612265de0..9efff1445 100644 --- a/client/deps/hardnested.cmake +++ b/client/deps/hardnested.cmake @@ -2,7 +2,7 @@ add_library(pm3rrg_rdv4_hardnested_nosimd OBJECT hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) -target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_hardnested_nosimd PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_hardnested_nosimd PRIVATE @@ -27,7 +27,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_mmx BEFORE PRIVATE -mmmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_mmx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -41,7 +41,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_sse2 BEFORE PRIVATE -mmmx -msse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_sse2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -55,7 +55,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx BEFORE PRIVATE -mmmx -msse2 -mavx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -69,7 +69,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx2 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -83,7 +83,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx512 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mavx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx512 PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/jansson.cmake b/client/deps/jansson.cmake index 1a55b7fa5..a95ff0baf 100644 --- a/client/deps/jansson.cmake +++ b/client/deps/jansson.cmake @@ -15,5 +15,5 @@ add_library(pm3rrg_rdv4_jansson STATIC target_compile_definitions(pm3rrg_rdv4_jansson PRIVATE HAVE_STDINT_H) target_include_directories(pm3rrg_rdv4_jansson INTERFACE jansson) -target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Wno-unused-function -O3) +target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Werror -Wno-unused-function -O3) set_property(TARGET pm3rrg_rdv4_jansson PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/lua.cmake b/client/deps/lua.cmake index 94c184906..679147124 100644 --- a/client/deps/lua.cmake +++ b/client/deps/lua.cmake @@ -45,5 +45,5 @@ if (NOT MINGW) endif (NOT MINGW) target_include_directories(pm3rrg_rdv4_lua INTERFACE liblua) -target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_lua PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/mbedtls.cmake b/client/deps/mbedtls.cmake index 93a646e0d..63e706889 100644 --- a/client/deps/mbedtls.cmake +++ b/client/deps/mbedtls.cmake @@ -45,5 +45,5 @@ add_library(pm3rrg_rdv4_mbedtls STATIC ) target_include_directories(pm3rrg_rdv4_mbedtls PRIVATE ../../common) -target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_mbedtls PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/reveng.cmake b/client/deps/reveng.cmake index 1040730f1..d7e3cfd8a 100644 --- a/client/deps/reveng.cmake +++ b/client/deps/reveng.cmake @@ -13,5 +13,5 @@ target_include_directories(pm3rrg_rdv4_reveng PRIVATE ../src ../../include) target_include_directories(pm3rrg_rdv4_reveng INTERFACE reveng) -target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_reveng PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/tinycbor.cmake b/client/deps/tinycbor.cmake index c74618149..5a6abda25 100644 --- a/client/deps/tinycbor.cmake +++ b/client/deps/tinycbor.cmake @@ -11,5 +11,5 @@ add_library(pm3rrg_rdv4_tinycbor STATIC target_include_directories(pm3rrg_rdv4_tinycbor INTERFACE tinycbor) # Strange errors on Mingw when compiling with -O3 -target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -O2) +target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -Werror -O2) set_property(TARGET pm3rrg_rdv4_tinycbor PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/whereami.cmake b/client/deps/whereami.cmake index 721873066..d2d6a5b2a 100644 --- a/client/deps/whereami.cmake +++ b/client/deps/whereami.cmake @@ -2,5 +2,5 @@ add_library(pm3rrg_rdv4_whereami STATIC whereami/whereami.c) target_compile_definitions(pm3rrg_rdv4_whereami PRIVATE WAI_PM3_TUNED) target_include_directories(pm3rrg_rdv4_whereami INTERFACE whereami) -target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_whereami PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/zlib.cmake b/client/deps/zlib.cmake index 563508633..645cbc88d 100644 --- a/client/deps/zlib.cmake +++ b/client/deps/zlib.cmake @@ -9,5 +9,5 @@ add_library(pm3rrg_rdv4_z STATIC ) target_compile_definitions(pm3rrg_rdv4_z PRIVATE Z_SOLO NO_GZIP ZLIB_PM3_TUNED) -target_compile_options(pm3rrg_rdv4_z PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_z PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_z PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index cc91e1aaf..1e2be44ba 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -34,7 +34,7 @@ #define BANNERMSG1 " :snowflake: iceman@icesql.net" #define BANNERMSG2 " https://github.com/rfidresearchgroup/proxmark3/" -#define BANNERMSG3 "Release v4.9237 - Ice Coffee :coffee:" +#define BANNERMSG3 "pre-release v4.0" typedef enum LogoMode { UTF8, ANSI, ASCII } LogoMode; diff --git a/common/default_version.c b/common/default_version.c index 86ba9f9ab..0f42590e8 100644 --- a/common/default_version.c +++ b/common/default_version.c @@ -1,5 +1,5 @@ #include "common.h" -/* Generated file, do not edit */ +/* This is the default version.c file that Makefile.common falls back to if neither sh nor perl are available */ #ifndef ON_DEVICE #define SECTVERSINFO #else @@ -8,9 +8,8 @@ const struct version_information SECTVERSINFO version_information = { VERSION_INFORMATION_MAGIC, - 1, - 1, - 2, - "RRG/Iceman/master/v4.9237", - "2020-05-21 21:55:15", + 1, /* version 1 */ + 0, /* version information not present */ + 2, /* cleanliness couldn't be determined */ + /* Remaining fields: zero */ }; diff --git a/common_arm/Makefile.common b/common_arm/Makefile.common index d5b2c0557..c8dceead5 100644 --- a/common_arm/Makefile.common +++ b/common_arm/Makefile.common @@ -40,7 +40,7 @@ VPATH = . ../common_arm ../common ../common/crapto1 ../common/mbedtls ../common/ INCLUDES = ../include/proxmark3_arm.h ../include/at91sam7s512.h ../include/config_gpio.h ../include/pm3_cmd.h ARMCFLAGS = -mthumb-interwork -fno-builtin -DEFCFLAGS = -Wall -Os -pedantic -fstrict-aliasing -pipe +DEFCFLAGS = -Wall -Werror -Os -pedantic -fstrict-aliasing -pipe # Some more warnings we want as errors: DEFCFLAGS += -Wbad-function-cast -Wchar-subscripts -Wundef -Wunused -Wuninitialized -Wpointer-arith -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits diff --git a/tools/hitag2crack/crack2/Makefile b/tools/hitag2crack/crack2/Makefile index 318034f51..4794d6ec4 100644 --- a/tools/hitag2crack/crack2/Makefile +++ b/tools/hitag2crack/crack2/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -O3 +CFLAGS?=-Wall -Werror -O3 # Linux libs LIBS=-pthread -D_GNU_SOURCE # Mac libs diff --git a/tools/hitag2crack/crack3/Makefile b/tools/hitag2crack/crack3/Makefile index 1e157eef6..318b5db78 100644 --- a/tools/hitag2crack/crack3/Makefile +++ b/tools/hitag2crack/crack3/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -O3 +CFLAGS?=-Wall -Werror -O3 LIBS= VPATH=../common INC=-I ../common diff --git a/tools/hitag2crack/crack4/Makefile b/tools/hitag2crack/crack4/Makefile index 30083c56d..b560577bd 100644 --- a/tools/hitag2crack/crack4/Makefile +++ b/tools/hitag2crack/crack4/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -O3 +CFLAGS?=-Wall -Werror -O3 LIBS=-lpthread VPATH=../common INC=-I ../common diff --git a/tools/hitag2crack/crack5/Makefile b/tools/hitag2crack/crack5/Makefile index 8e2b38f82..9d19b63ee 100644 --- a/tools/hitag2crack/crack5/Makefile +++ b/tools/hitag2crack/crack5/Makefile @@ -1,4 +1,4 @@ -CFLAGS?=-Wall -O3 +CFLAGS?=-Wall -Werror -O3 LIBS=-lpthread VPATH=../common INC=-I ../common From 2cb198743ac0eee76c726471862ced2c951e0d78 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 21 May 2020 22:04:21 +0200 Subject: [PATCH 325/632] minor release doc fix --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 63ca7bf53..d39183105 100644 --- a/Makefile +++ b/Makefile @@ -271,7 +271,7 @@ endif # - Reverting tagged commit... @git revert --no-edit HEAD @echo "===================================================================" - @echo "Done! You can now execute 'git push origin $(VERSION)'" + @echo "Done! You can now execute 'git push && git push origin $(VERSION)'" # Dummy target to test for GNU make availability _test: From 4eecf9a83c45f6a890bc53f41e6cf29c13f0bd06 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 21 May 2020 22:23:12 +0200 Subject: [PATCH 326/632] textual --- doc/md/Use_of_Proxmark/1_Validation.md | 36 ++++++++++++++------------ 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/doc/md/Use_of_Proxmark/1_Validation.md b/doc/md/Use_of_Proxmark/1_Validation.md index 507648e64..09432b067 100644 --- a/doc/md/Use_of_Proxmark/1_Validation.md +++ b/doc/md/Use_of_Proxmark/1_Validation.md @@ -3,26 +3,27 @@ If all went well you should get some information about the firmware and memory usage as well as the prompt, something like this. ``` +[=] Session log /home/iceman/.proxmark3/log_20200521.txt +[=] Loading Preferences... +[+] loaded from JSON file /home/iceman/.proxmark3/preferences.json +[=] Using UART port /dev/ttyS7 +[=] Communicating with PM3 over USB-CDC -██████╗ ███╗ ███╗ ████╗ ...iceman fork -██╔══██╗████╗ ████║ ══█║ ...dedicated to RDV40 + +██████╗ ███╗ ███╗ ████╗ +██╔══██╗████╗ ████║ ══█║ ██████╔╝██╔████╔██║ ████╔╝ -██╔═══╝ ██║╚██╔╝██║ ══█║ iceman@icesql.net +██╔═══╝ ██║╚██╔╝██║ ══█║ :snowflake: iceman@icesql.net ██║ ██║ ╚═╝ ██║ ████╔╝ https://github.com/rfidresearchgroup/proxmark3/ -╚═╝ ╚═╝ ╚═╝ ╚═══╝ pre-release v4.0 +╚═╝ ╚═╝ ╚═╝ ╚═══╝ Release v4.9237 - Ice Coffee :coffee: -Support iceman on patreon, https://www.patreon.com/iceman1001/ - - -[=] Using UART port /dev/pm3-0 -[=] Communicating with PM3 over USB-CDC [ Proxmark3 RFID instrument ] - [ CLIENT ] - client: RRG/Iceman - + client: RRG/Iceman/master/v4.9237-2-g2cb19874 2020-05-21 22:00:00 + compiled with GCC 9.3.0 OS:Linux ARCH:x86_64 + [ PROXMARK RDV4 ] external flash: present smartcard reader: present @@ -31,17 +32,18 @@ Support iceman on patreon, https://www.patreon.com/iceman1001/ FPC USART for BT add-on support: absent [ ARM ] - bootrom: RRG/Iceman/master/5ab9716e 2019-05-01 11:02:08 - os: RRG/Iceman/master/6b5a0f83 2019-05-04 23:57:47 + bootrom: RRG/Iceman/master/v4.9237-2-g2cb19874 2020-05-21 22:00:10 + os: RRG/Iceman/master/v4.9237-2-g2cb19874 2019-05-21 22:00:26 + compiled with GCC 8.3.1 20190703 (release) [gcc-8-branch revision 273027] [ FPGA ] - LF image built for 2s30vq100 on 2019/ 4/18 at 9:35:32 - HF image built for 2s30vq100 on 2018/ 9/ 3 at 21:40:23 + LF image built for 2s30vq100 on 2020/02/22 at 12:51:14 + HF image built for 2s30vq100 on 2020/01/12 at 15:31:16 [ Hardware ] --= uC: AT91SAM7S512 Rev B --= Embedded Processor: ARM7TDMI - --= Nonvolatile Program Memory Size: 512K bytes, Used: 250913 bytes (48%) Free: 273375 bytes (52%) + --= Nonvolatile Program Memory Size: 512K bytes, Used: 291382 bytes (56%) Free: 232906 bytes (44%) --= Second Nonvolatile Program Memory Size: None --= Internal SRAM Size: 64K bytes --= Architecture Identifier: AT91SAM7Sxx Series From de8710f854c5483cb8a75396ae5b1528ffd4dc4a Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 21 May 2020 22:24:00 +0200 Subject: [PATCH 327/632] bleeding edge bae! --- client/src/proxmark3.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index 1e2be44ba..f50a15b7f 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -34,7 +34,7 @@ #define BANNERMSG1 " :snowflake: iceman@icesql.net" #define BANNERMSG2 " https://github.com/rfidresearchgroup/proxmark3/" -#define BANNERMSG3 "pre-release v4.0" +#define BANNERMSG3 " bleeding edge" typedef enum LogoMode { UTF8, ANSI, ASCII } LogoMode; From 8847bed0230105d5cd24827b1fe0e7b8e168d9ef Mon Sep 17 00:00:00 2001 From: Iceman Date: Thu, 21 May 2020 22:28:01 +0200 Subject: [PATCH 328/632] Update 1_Validation.md --- doc/md/Use_of_Proxmark/1_Validation.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/doc/md/Use_of_Proxmark/1_Validation.md b/doc/md/Use_of_Proxmark/1_Validation.md index 09432b067..9bb93c453 100644 --- a/doc/md/Use_of_Proxmark/1_Validation.md +++ b/doc/md/Use_of_Proxmark/1_Validation.md @@ -13,9 +13,9 @@ If all went well you should get some information about the firmware and memory u ██████╗ ███╗ ███╗ ████╗ ██╔══██╗████╗ ████║ ══█║ ██████╔╝██╔████╔██║ ████╔╝ -██╔═══╝ ██║╚██╔╝██║ ══█║ :snowflake: iceman@icesql.net +██╔═══╝ ██║╚██╔╝██║ ══█║ iceman@icesql.net ██║ ██║ ╚═╝ ██║ ████╔╝ https://github.com/rfidresearchgroup/proxmark3/ -╚═╝ ╚═╝ ╚═╝ ╚═══╝ Release v4.9237 - Ice Coffee :coffee: +╚═╝ ╚═╝ ╚═╝ ╚═══╝ Release v4.9237 - Ice Coffee [ Proxmark3 RFID instrument ] @@ -50,10 +50,10 @@ If all went well you should get some information about the firmware and memory u --= Nonvolatile Program Memory Type: Embedded Flash Memory -pm3 --> +[usb] pm3 --> ``` -This `pm3 --> ` is the Proxmark3 interactive prompt. +This `[usb] pm3 --> ` is the Proxmark3 interactive prompt. ### To get interactive help @@ -64,16 +64,16 @@ For basic help type `help`. Or for help on a set of sub commands type the comman These commands will return some info about your Proxmark software and hardware status. ``` -pm3 --> hw status -pm3 --> hw version -pm3 --> hw tune +[usb] pm3 --> hw status +[usb] pm3 --> hw version +[usb] pm3 --> hw tune ``` You are now ready to use your newly flashed proxmark3 device. Many commands uses the `h` parameter to show a help text. ### To quit the client ``` -pm3 --> quit +[usb] pm3 --> quit ``` or simple press `CTRL-D`. From ebfd18a8f16e96b862060c3346e5989ea3235f32 Mon Sep 17 00:00:00 2001 From: Iceman Date: Thu, 21 May 2020 22:28:55 +0200 Subject: [PATCH 329/632] Update 2_Configuration-and-Verification.md --- .../2_Configuration-and-Verification.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/doc/md/Use_of_Proxmark/2_Configuration-and-Verification.md b/doc/md/Use_of_Proxmark/2_Configuration-and-Verification.md index 8b88115c6..fe87ec633 100644 --- a/doc/md/Use_of_Proxmark/2_Configuration-and-Verification.md +++ b/doc/md/Use_of_Proxmark/2_Configuration-and-Verification.md @@ -1,16 +1,16 @@ ### First things on your RDV40 You will need to run these commands to make sure your rdv4 is prepared ``` -pm3 --> mem load f mfc_default_keys m -pm3 --> mem load f t55xx_default_pwds t -pm3 --> mem load f iclass_default_keys i -pm3 --> lf t55xx deviceconfig a 29 b 17 c 15 d 47 e 15 p -pm3 --> lf t55xx deviceconfig r 1 a 31 b 20 c 18 d 50 e 15 p -pm3 --> lf t55xx deviceconfig r 2 a 31 b 20 c 18 d 40 e 15 p -pm3 --> lf t55xx deviceconfig r 3 a 29 b 17 c 15 d 31 e 15 f 47 g 63 p +[usb] pm3 --> mem load f mfc_default_keys m +[usb] pm3 --> mem load f t55xx_default_pwds t +[usb] pm3 --> mem load f iclass_default_keys i +[usb] pm3 --> lf t55xx deviceconfig a 29 b 17 c 15 d 47 e 15 p +[usb] pm3 --> lf t55xx deviceconfig r 1 a 31 b 20 c 18 d 50 e 15 p +[usb] pm3 --> lf t55xx deviceconfig r 2 a 31 b 20 c 18 d 40 e 15 p +[usb] pm3 --> lf t55xx deviceconfig r 3 a 29 b 17 c 15 d 31 e 15 f 47 g 63 p Set all t55xx settings to defaults (will set all 4 at once) -pm3 --> lf t55xx deviceconfig z p +[usb] pm3 --> lf t55xx deviceconfig z p ``` ### Verify sim module firmware version @@ -20,7 +20,7 @@ To make sure you got the latest sim module firmware. _Lastest version is v3.11_ ``` -pm3 --> hw status +[usb] pm3 --> hw status ``` Find version in the long output, look for these two lines @@ -46,9 +46,9 @@ Don't not turn off your device during the execution of this command!! Even its a quite fast command you should be warned. You may brick it if you interrupt it. ``` -pm3 --> sc upgrade f /usr/local/share/proxmark3/firmware/sim011.bin +[usb] pm3 --> sc upgrade f /usr/local/share/proxmark3/firmware/sim011.bin # or if from local repo -pm3 --> sc upgrade f tools/simmodule/sim011.bin +[usb] pm3 --> sc upgrade f tools/simmodule/sim011.bin ``` You get the following output if the execution was successful: @@ -71,7 +71,7 @@ You get the following output if the execution was successful: Run hw status command to verify that the upgrade went well. ``` -pm3 --> hw status +[usb] pm3 --> hw status ``` ## Next steps From d8c2479e6090fdd633f21b08b4767160f9f85725 Mon Sep 17 00:00:00 2001 From: Iceman Date: Thu, 21 May 2020 22:29:18 +0200 Subject: [PATCH 330/632] Update 3_Commands-and-Features.md --- doc/md/Use_of_Proxmark/3_Commands-and-Features.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/md/Use_of_Proxmark/3_Commands-and-Features.md b/doc/md/Use_of_Proxmark/3_Commands-and-Features.md index deb7036d7..195468002 100644 --- a/doc/md/Use_of_Proxmark/3_Commands-and-Features.md +++ b/doc/md/Use_of_Proxmark/3_Commands-and-Features.md @@ -21,17 +21,17 @@ Here are some commands to start off with. To get an overview of the available commands for LF RFID and HF RFID: ``` -pm3 --> lf -pm3 --> hf +[usb] pm3 --> lf +[usb] pm3 --> hf ``` To search quickly for known LF or HF tags: ``` -pm3 --> lf search -pm3 --> hf search +[usb] pm3 --> lf search +[usb] pm3 --> hf search ``` To get info on a ISO14443-A tag: ``` -pm3 --> hf 14a info +[usb] pm3 --> hf 14a info ``` From f27760afd69be0844a05a8348ca74cc962a7fbdd Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 22 May 2020 00:24:08 +0200 Subject: [PATCH 331/632] text --- client/src/proxmark3.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index f50a15b7f..60f3b5be8 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -34,7 +34,7 @@ #define BANNERMSG1 " :snowflake: iceman@icesql.net" #define BANNERMSG2 " https://github.com/rfidresearchgroup/proxmark3/" -#define BANNERMSG3 " bleeding edge" +#define BANNERMSG3 " bleeding edge :coffee:" typedef enum LogoMode { UTF8, ANSI, ASCII } LogoMode; From 888235cd74a3e768068ba5f6c2d1d38b9d73a878 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 22 May 2020 01:02:00 +0200 Subject: [PATCH 332/632] gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index d28933d82..bdd98d374 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ Makefile.platform # cmake client/build/ +client/android/build/ # Coverity cov-int/ From 0a2eb6783c204ebfc4416a8435446da7685db00f Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 22 May 2020 12:41:19 +0200 Subject: [PATCH 333/632] chmod perl scripts --- tools/mkversion.pl | 0 tools/rfidtest.pl | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 tools/mkversion.pl mode change 100644 => 100755 tools/rfidtest.pl diff --git a/tools/mkversion.pl b/tools/mkversion.pl old mode 100644 new mode 100755 diff --git a/tools/rfidtest.pl b/tools/rfidtest.pl old mode 100644 new mode 100755 From 0a263b353bba2b1c72699027c1775ea88f98bd2e Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 22 May 2020 13:02:52 +0200 Subject: [PATCH 334/632] make release: remove mkversion calls --- Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Makefile b/Makefile index d39183105..f78964b94 100644 --- a/Makefile +++ b/Makefile @@ -262,6 +262,9 @@ endif @git tag -a -m "Release $(VERSION) - $(RELEASE_NAME)" $(VERSION) # - Changing default version information based on new tag @$(SH) tools/mkversion.sh --undecided > common/default_version.c.tmp && $(MV) common/default_version.c.tmp common/default_version.c + # - Removing mkversion calls + @sed -i 's#^.*\.\./tools/mkversion.sh.*|| #\t$$(Q)#' client/Makefile bootrom/Makefile armsrc/Makefile + @sed -i '/COMMAND/s/sh .*|| //' client/CMakeLists.txt # - Deleting tag... @git tag -d $(VERSION) # - Amending commit... From 5dc1b6cc6fbe85629b014020d0244cfa19851af3 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 22 May 2020 13:33:03 +0200 Subject: [PATCH 335/632] make release: trigger git calls only on recipe --- Makefile | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index f78964b94..44db7c01d 100644 --- a/Makefile +++ b/Makefile @@ -238,15 +238,9 @@ endif release: VERSION="v4.$(shell git log --oneline master | wc -l)" release: -ifneq ($(shell git rev-parse --abbrev-ref HEAD),master) - $(error "!!! you are not on master branch, aborting") -endif -ifeq ($(shell git describe --dirty --always|grep -o dirty),dirty) - $(error "!!! you have pending changes, aborting") -endif -ifeq ($(RELEASE_NAME),) - $(error "!!! missing RELEASE_NAME, aborting") -endif + $(if $(findstring master,$(shell git rev-parse --abbrev-ref HEAD)),,$(error "!!! you are not on master branch, aborting")) + $(if $(findstring dirty,$(shell git describe --dirty --always)),$(error "!!! you have pending changes, aborting")) + $(if $(RELEASE_NAME),,$(error "!!! missing RELEASE_NAME, aborting")) # Preparing a commit for release tagging, to be reverted after tagging. @echo "# - Release Tag: $(VERSION)" @echo "# - Release Name: $(RELEASE_NAME)" From f30ccd0f5184af677451b14452812f592c8e8c1c Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 22 May 2020 13:34:43 +0200 Subject: [PATCH 336/632] Makefile: fix cp version for armsrc --- armsrc/Makefile | 2 +- bootrom/Makefile | 2 +- client/Makefile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/armsrc/Makefile b/armsrc/Makefile index 18d36a1b7..f9e33f5e5 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -152,7 +152,7 @@ showinfo: # version.c should be remade on every time fullimage.stage1.elf should be remade version.c: default_version.c $(OBJDIR)/fpga_version_info.o $(OBJDIR)/fpga_all.o $(THUMBOBJ) $(ARMOBJ) $(info [-] GEN $@) - $(Q)$(SH) ../tools/mkversion.sh > $@ || $(PERL) ../tools/mkversion.pl > $@ || $(CP) $^ $@ + $(Q)$(SH) ../tools/mkversion.sh > $@ || $(PERL) ../tools/mkversion.pl > $@ || $(CP) $< $@ fpga_version_info.c: $(FPGA_BITSTREAMS) $(FPGA_COMPRESSOR) $(info [-] GEN $@) diff --git a/bootrom/Makefile b/bootrom/Makefile index 68597aa22..785293ca6 100644 --- a/bootrom/Makefile +++ b/bootrom/Makefile @@ -39,7 +39,7 @@ OBJS = $(OBJDIR)/bootrom.s19 # version.c should be remade on every compilation version.c: default_version.c $(info [=] GEN $@) - $(Q)$(SH) ../tools/mkversion.sh > $@ || $(PERL) ../tools/mkversion.pl > $@ || $(CP) $^ $@ + $(Q)$(SH) ../tools/mkversion.sh > $@ || $(PERL) ../tools/mkversion.pl > $@ || $(CP) $< $@ all: showinfo $(OBJS) diff --git a/client/Makefile b/client/Makefile index 79943d8fa..71d6a6d88 100644 --- a/client/Makefile +++ b/client/Makefile @@ -430,7 +430,7 @@ zlib: # version.c should be remade on every compilation src/version.c: default_version.c $(info [=] GEN $@) - $(Q)$(SH) ../tools/mkversion.sh > $@ || $(PERL) ../tools/mkversion.pl > $@ || $(CP) $^ $@ + $(Q)$(SH) ../tools/mkversion.sh > $@ || $(PERL) ../tools/mkversion.pl > $@ || $(CP) $< $@ # easy printing of MAKE VARIABLES print-%: ; @echo $* = $($*) From 3d4d90eac581e04941744d83198f480d3f85caf4 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 22 May 2020 13:44:35 +0200 Subject: [PATCH 337/632] make release : remove undecided/suspect --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 44db7c01d..958fe65a2 100644 --- a/Makefile +++ b/Makefile @@ -255,7 +255,7 @@ release: # - Tagging temporarily... @git tag -a -m "Release $(VERSION) - $(RELEASE_NAME)" $(VERSION) # - Changing default version information based on new tag - @$(SH) tools/mkversion.sh --undecided > common/default_version.c.tmp && $(MV) common/default_version.c.tmp common/default_version.c + @$(SH) tools/mkversion.sh > common/default_version.c.tmp && $(MV) common/default_version.c.tmp common/default_version.c # - Removing mkversion calls @sed -i 's#^.*\.\./tools/mkversion.sh.*|| #\t$$(Q)#' client/Makefile bootrom/Makefile armsrc/Makefile @sed -i '/COMMAND/s/sh .*|| //' client/CMakeLists.txt From d7cfaae17f03f92a4a6d7f2ba77bfbf6c06050a0 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 22 May 2020 13:59:30 +0200 Subject: [PATCH 338/632] Load prefs only after parsing of options, don't clutter -v --- client/src/proxmark3.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index 60f3b5be8..427619e75 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -691,6 +691,7 @@ int main(int argc, char *argv[]) { bool flash_mode = false; bool flash_can_write_bl = false; + bool debug_mode_forced = false; int flash_num_files = 0; char *flash_filenames[FLASH_MAX_FILES]; @@ -698,16 +699,6 @@ int main(int argc, char *argv[]) { set_my_executable_path(); set_my_user_directory(); -#ifdef USE_PREFERENCE_FILE - // Load Settings and assign - // This will allow the command line to override the settings.json values - preferences_load(); - // quick patch for debug level - g_debugMode = session.client_debug_level; - // settings_save (); - // End Settings -#endif - for (int i = 1; i < argc; i++) { if (argv[i][0] != '-') { @@ -779,6 +770,7 @@ int main(int argc, char *argv[]) { return 1; } g_debugMode = demod; + debug_mode_forced = true; i++; continue; } @@ -886,6 +878,17 @@ int main(int argc, char *argv[]) { return 1; } +#ifdef USE_PREFERENCE_FILE + // Load Settings and assign + // This will allow the command line to override the settings.json values + preferences_load(); + // quick patch for debug level + if (! debug_mode_forced) + g_debugMode = session.client_debug_level; + // settings_save (); + // End Settings +#endif + #ifndef USE_PREFERENCE_FILE // comment next 2 lines to use session values set from settings_load session.supports_colors = DetectWindowsAnsiSupport(); From aef6d7e5f21ac6e47bef20290cc2be26a95ec3c2 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 21 May 2020 02:20:02 +0200 Subject: [PATCH 339/632] Detect and use system Lua. Makefile. Cmake todo --- client/Makefile | 114 +++++++++++++++++++----------- doc/md/Development/Maintainers.md | 1 + 2 files changed, 73 insertions(+), 42 deletions(-) diff --git a/client/Makefile b/client/Makefile index 71d6a6d88..363ff0089 100644 --- a/client/Makefile +++ b/client/Makefile @@ -36,74 +36,63 @@ endif # local libraries LUALIBPATH = ./deps/liblua +LUALIBINC = -I$(LUALIBPATH) LUALIB = $(LUALIBPATH)/liblua.a JANSSONLIBPATH = ./deps/jansson +JANSSONLIBINC = -I$(JANSSONLIBPATH) JANSSONLIB = $(JANSSONLIBPATH)/libjansson.a CBORLIBPATH = ./deps/tinycbor +CBORLIBINC = -I$(CBORLIBPATH) CBORLIB = $(CBORLIBPATH)/tinycbor.a REVENGLIBPATH = ./deps/reveng +REVENGLIBINC = -I$(REVENGLIBPATH) REVENGLIB = $(REVENGLIBPATH)/libreveng.a AMIIBOLIBPATH = ./deps/amiitool +AMIIBOLIBINC = -I$(AMIIBOLIBPATH) AMIIBOLIB = $(AMIIBOLIBPATH)/libamiibo.a HARDNESTEDLIBPATH = ./deps/hardnested +HARDNESTEDLIBINC = -I$(HARDNESTEDLIBPATH) HARDNESTEDLIB = $(HARDNESTEDLIBPATH)/libhardnested.a CLIPARSERLIBPATH = ./deps/cliparser +CLIPARSERLIBINC = -I$(CLIPARSERLIBPATH) CLIPARSERLIB = $(CLIPARSERLIBPATH)/libcliparser.a WAILIBPATH = ./deps/whereami +WAILIBINC = -I$(WAILIBPATH) WAILIB = $(WAILIBPATH)/libwhereami.a +LUAPLATFORM = generic +ifneq (,$(findstring MINGW,$(platform))) + LUAPLATFORM = mingw +else + ifeq ($(platform),Darwin) + LUAPLATFORM = macosx + else + LUALIB += -ldl + LUAPLATFORM = linux + endif +endif + # common libraries MBEDTLSLIBPATH = ../common/mbedtls MBEDTLSLIB = $(OBJDIR)/libmbedtls.a ZLIBPATH = ../common/zlib ZLIB = $(OBJDIR)/libz.a -LIBS = -I$(LUALIBPATH) -I$(MBEDTLSLIBPATH) -I$(JANSSONLIBPATH) -I$(CBORLIBPATH) -I$(ZLIBPATH) -I$(REVENGLIBPATH) -I$(AMIIBOLIBPATH) -I$(HARDNESTEDLIBPATH) -I$(CLIPARSERLIBPATH) -I$(WAILIBPATH) -INCLUDES_CLIENT += -I./src -I../include -I../common -I../common_fpga $(LIBS) -CFLAGS ?= $(DEFCFLAGS) - -# We cannot just use CFLAGS+=... because it has impact on sub-makes if CFLAGS is defined in env: -PM3CFLAGS = $(CFLAGS) $(INCLUDES_CLIENT) -# WIP Testing -#PM3CFLAGS = $(CFLAGS) -std=c11 -pedantic $(INCLUDES_CLIENT) -PREFIX ?= /usr/local -ifneq (,$(findstring MINGW,$(platform))) - # Mingw uses by default Microsoft printf, we want the GNU printf (e.g. for %z) - # and setting _ISOC99_SOURCE sets internally __USE_MINGW_ANSI_STDIO=1 - # FTR __USE_MINGW_ANSI_STDIO seems deprecated in Mingw32 - # but not Mingw64 https://fr.osdn.net/projects/mingw/lists/archive/users/2019-January/000199.html - PM3CFLAGS += -D_ISOC99_SOURCE - PM3CFLAGS += -mno-ms-bitfields -fexec-charset=cp850 -endif -CXXFLAGS ?= -Wall -Werror -O3 -PM3CXXFLAGS = $(CXXFLAGS) -I../include - -LUAPLATFORM = generic -ifneq (,$(findstring MINGW,$(platform))) - LUAPLATFORM = mingw -else - ifeq ($(platform),Darwin) - LUAPLATFORM = macosx - OBJCSRCS = util_darwin.m - LDFLAGS += -framework Foundation -framework AppKit - LDLIBS := -L/usr/local/opt/readline/lib $(LDLIBS) - LIBS := -I/usr/local/opt/readline/include $(LIBS) - # cf brew info qt: qt not symlinked anymore - PKG_CONFIG_ENV := PKG_CONFIG_PATH=/usr/local/opt/qt/lib/pkgconfig -else - LUALIB += -ldl - LUAPLATFORM = linux -endif +# system libraries +ifneq ($(SKIPLUASYSTEM),1) + LUAINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags lua5.2 2>/dev/null) + LUALDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs lua5.2 2>/dev/null) + ifneq ($(LUAINCLUDES),) + LUALIB = $(LUALDLIBS) + LUALIBINC = $(LUAINCLUDES) + LUASYSTEM = 1 + endif endif ifneq ($(SKIPBT),1) BTLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs bluez 2>/dev/null) endif -ifneq ($(BTLDLIBS),) - PM3CFLAGS += -DHAVE_BLUEZ -endif - ifneq ($(SKIPQT),1) # Check for correctly configured Qt5 QTINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags Qt5Core Qt5Widgets 2>/dev/null) @@ -118,7 +107,7 @@ ifneq ($(SKIPQT),1) UIC = $(shell $(PKG_CONFIG_ENV) pkg-config --variable=uic_location QtCore) else # On OSX Qt5 is claiming for a C++11 compiler (gnu++14 works too, but if nothing it fails) - PM3CXXFLAGS += -fPIC -std=c++11 + QT5FOUND = 1 endif ifeq ($(QTINCLUDES), ) # if both pkg-config commands failed, search in common places @@ -128,7 +117,7 @@ ifneq ($(SKIPQT),1) ifneq ($(wildcard $(QTDIR)/include/QtWidgets),) QTINCLUDES += -I$(QTDIR)/include/QtWidgets QTLDLIBS = -L$(QTDIR)/lib -lQt5Widgets -lQt5Gui -lQt5Core - PM3CXXFLAGS += -fPIC -std=c++11 + QT5FOUND = 1 endif MOC = $(QTDIR)/bin/moc UIC = $(QTDIR)/bin/uic @@ -136,11 +125,47 @@ ifneq ($(SKIPQT),1) endif endif +LIBS = $(LUALIBINC) $(MBEDTLSLIBINC) $(JANSSONLIBINC) $(CBORLIBINC) $(ZLIBINC) $(REVENGLIBINC) $(AMIIBOLIBINC) $(HARDNESTEDLIBINC) $(CLIPARSERLIBINC) $(WAILIBINC) +INCLUDES_CLIENT += -I./src -I../include -I../common -I../common_fpga $(LIBS) +CFLAGS ?= $(DEFCFLAGS) + +# We cannot just use CFLAGS+=... because it has impact on sub-makes if CFLAGS is defined in env: +PM3CFLAGS = $(CFLAGS) $(INCLUDES_CLIENT) +# WIP Testing +#PM3CFLAGS = $(CFLAGS) -std=c11 -pedantic $(INCLUDES_CLIENT) +PREFIX ?= /usr/local +ifneq (,$(findstring MINGW,$(platform))) + # Mingw uses by default Microsoft printf, we want the GNU printf (e.g. for %z) + # and setting _ISOC99_SOURCE sets internally __USE_MINGW_ANSI_STDIO=1 + # FTR __USE_MINGW_ANSI_STDIO seems deprecated in Mingw32 + # but not Mingw64 https://fr.osdn.net/projects/mingw/lists/archive/users/2019-January/000199.html + PM3CFLAGS += -D_ISOC99_SOURCE + PM3CFLAGS += -mno-ms-bitfields -fexec-charset=cp850 +endif +ifeq ($(platform),Darwin) + OBJCSRCS = util_darwin.m + LDFLAGS += -framework Foundation -framework AppKit + LDLIBS := -L/usr/local/opt/readline/lib $(LDLIBS) + LIBS := -I/usr/local/opt/readline/include $(LIBS) + # cf brew info qt: qt not symlinked anymore + PKG_CONFIG_ENV := PKG_CONFIG_PATH=/usr/local/opt/qt/lib/pkgconfig +endif + +CXXFLAGS ?= -Wall -Werror -O3 +PM3CXXFLAGS = $(CXXFLAGS) -I../include + +ifneq ($(BTLDLIBS),) + PM3CFLAGS += -DHAVE_BLUEZ +endif + ifneq ($(QTLDLIBS),) QTGUISRCS = proxgui.cpp proxguiqt.cpp proxguiqt.moc.cpp QTGUIOBJS = $(OBJDIR)/proxgui.o $(OBJDIR)/proxguiqt.o $(OBJDIR)/proxguiqt.moc.o PM3CFLAGS += -DHAVE_GUI PM3CXXFLAGS += -DQT_NO_DEBUG + ifeq ($(QT5FOUND),1) + PM3CXXFLAGS += -fPIC -std=c++11 + endif else QTGUISRCS = guidummy.cpp QTGUIOBJS = $(OBJDIR)/guidummy.o @@ -162,6 +187,9 @@ $(info native BT support: Bluez found, enabled) else $(info native BT support: Bluez not found, disabled) endif +ifeq ($(LUASYSTEM),1) +$(info system LUA: Lua5.2 found) +endif $(info compiler version: $(shell $(CC) --version|head -n 1)) $(info ===================================================================) @@ -385,8 +413,10 @@ tarbin: $(BINS) # local libraries: liblua: +ifneq ($(LUASYSTEM),1) $(info [*] MAKE $@ for $(LUAPLATFORM)) $(Q)$(MAKE) --no-print-directory -C $(LUALIBPATH) $(LUAPLATFORM) +endif jansson: $(info [*] MAKE $@) diff --git a/doc/md/Development/Maintainers.md b/doc/md/Development/Maintainers.md index 2a49343fd..c3d0e4e29 100644 --- a/doc/md/Development/Maintainers.md +++ b/doc/md/Development/Maintainers.md @@ -61,6 +61,7 @@ It's also possible to skip parts even if libraries are present in the compilatio * `make client SKIPQT=1` to skip GUI even if Qt is present * `make client SKIPBT=1` to skip native Bluetooth support even if libbluetooth is present +* `make client SKIPLUASYSTEM=1` to skip system Lua lib even if liblua5.2 is present, use embedded Lua lib instead If you're cross-compiling, these ones might be useful: From 278db15f5aa62d30ef09aa900c70a2c2a57c6264 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 22 May 2020 17:47:30 +0200 Subject: [PATCH 340/632] Move tests to tools/pm3_tests.sh and add "make check" to call it --- .travis.yml | 4 +- Makefile | 41 ++++++- Makefile.defs | 1 + covbuild.sh | 2 +- pm3test.sh | 167 --------------------------- tools/pm3_tests.sh | 276 +++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 317 insertions(+), 174 deletions(-) delete mode 100755 pm3test.sh create mode 100755 tools/pm3_tests.sh diff --git a/.travis.yml b/.travis.yml index f8cf8228f..ad23bf6f8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -54,9 +54,9 @@ install: script: - if [ "$TO_TEST" = "MAKEFILE" ]; then make clean && make V=1 "$MAKE_PARAMS"; - ./pm3test.sh; + make check; fi - if [ "$TO_TEST" = "CMAKE" ]; then mkdir -p client/build && ( cd client/build && cmake .. && make VERBOSE=1 ); - PM3BIN=./client/build/proxmark3 ./pm3test.sh client; + make client/check CHECKARGS="--clientbin ./client/build/proxmark3"; fi diff --git a/Makefile b/Makefile index 958fe65a2..d111d01fc 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ ifneq (,$(DESTDIR)) endif endif -all clean install uninstall: %: client/% bootrom/% armsrc/% recovery/% mfkey/% nonce2key/% mf_nonce_brute/% fpga_compress/% +all clean install uninstall check: %: client/% bootrom/% armsrc/% recovery/% mfkey/% nonce2key/% mf_nonce_brute/% fpga_compress/% INSTALLTOOLS=pm3_eml2lower.sh pm3_eml2upper.sh pm3_mfdread.py pm3_mfd2eml.py pm3_eml2mfd.py findbits.py rfidtest.pl xorcheck.py INSTALLSIMFW=sim011.bin sim011.sha512.txt @@ -78,6 +78,37 @@ ifeq ($(platform),Linux) endif $(Q)$(RMDIR_SOFT) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLSHARERELPATH) +# tests +mfkey/check: FORCE + $(info [*] CHECK $(patsubst %/check,%,$@)) + $(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@) +nonce2key/check: FORCE + $(info [*] CHECK $(patsubst %/check,%,$@)) + $(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@) +mf_nonce_brute/check: FORCE + $(info [*] CHECK $(patsubst %/check,%,$@)) + $(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@) +fpga_compress/check: FORCE + $(info [*] CHECK $(patsubst %/check,%,$@)) + $(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@) +bootrom/check: FORCE + $(info [*] CHECK $(patsubst %/check,%,$@)) + $(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@) +armsrc/check: FORCE + $(info [*] CHECK $(patsubst %/check,%,$@)) + $(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@) +client/check: FORCE + $(info [*] CHECK $(patsubst %/check,%,$@)) + $(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@) +recovery/check: FORCE + $(info [*] CHECK $(patsubst %/check,%,$@)) + $(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@) +common/check: FORCE + $(info [*] CHECK $(patsubst %/check,%,$@)) + $(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@) +check: common/check + $(info [*] ALL CHECKS DONE) + mfkey/%: FORCE $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C tools/mfkey $(patsubst mfkey/%,%,$@) DESTDIR=$(MYDESTDIR) @@ -106,7 +137,7 @@ recovery/%: FORCE cleanifplatformchanged $(Q)$(MAKE) --no-print-directory -C recovery $(patsubst recovery/%,%,$@) DESTDIR=$(MYDESTDIR) FORCE: # Dummy target to force remake in the subdirectories, even if files exist (this Makefile doesn't know about the prerequisites) -.PHONY: all clean install uninstall help _test bootrom fullimage recovery client mfkey nonce2key mf_nonce_brute style checks FORCE udev accessrights cleanifplatformchanged +.PHONY: all clean install uninstall help _test bootrom fullimage recovery client mfkey nonce2key mf_nonce_brute style miscchecks release FORCE udev accessrights cleanifplatformchanged help: @echo "Multi-OS Makefile" @@ -129,7 +160,9 @@ help: @echo "+ fpga_compress - Make tools/fpga_compress" @echo @echo "+ style - Apply some automated source code formatting rules" - @echo "+ checks - Detect various encoding issues in source code" + @echo "+ check - Run offline tests. Set CHECKARGS to pass arguments to the test script" + @echo "+ .../check - Run offline tests against specific target. See above." + @echo "+ miscchecks - Detect various encoding issues in source code" @echo @echo "Possible platforms: try \"make PLATFORM=\" for more info, default is PM3RDV4" @echo "To activate verbose mode, use make V=1" @@ -217,7 +250,7 @@ style: --align-pointer=name {} \; # Detecting weird codepages and tabs. -checks: +miscchecks: # Make sure recode is installed @which recode >/dev/null || ( echo "Please install 'recode' package first" ; exit 1 ) @echo "Files with suspicious chars:" diff --git a/Makefile.defs b/Makefile.defs index d206611d3..fb8a7a45b 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -25,6 +25,7 @@ CC = gcc CXX = g++ LD = g++ SH = sh +BASH = bash PERL = perl PATHSEP=/ diff --git a/covbuild.sh b/covbuild.sh index 2e18e677f..73c9a4441 100755 --- a/covbuild.sh +++ b/covbuild.sh @@ -32,7 +32,7 @@ cov-build --dir "$COVDIR" --c-coverage=gcov --no-network-coverage --no-generate- ######################################### # Run tests # ######################################### -cov-build --dir "$COVDIR" --c-coverage=gcov --no-network-coverage --test-capture ./pm3test.sh long +cov-build --dir "$COVDIR" --c-coverage=gcov --no-network-coverage --test-capture tools/pm3_tests.sh --long #cov-manage-emit --dir "$COVDIR" list-coverage-known ######################################### diff --git a/pm3test.sh b/pm3test.sh deleted file mode 100755 index 3bd7ae3a8..000000000 --- a/pm3test.sh +++ /dev/null @@ -1,167 +0,0 @@ -#!/usr/bin/env bash - -PM3PATH=$(dirname "$0") -cd "$PM3PATH" || exit 1 - -if [ "$1" == "client" ]; then - shift - TESTDEVICE=false - TESTTOOLS=false -else - TESTDEVICE=true - TESTTOOLS=true -fi -if [ "$1" == "long" ]; then - shift - SLOWTESTS=true -else - SLOWTESTS=false -fi - -C_RED='\033[0;31m' -C_GREEN='\033[0;32m' -C_YELLOW='\033[0;33m' -C_BLUE='\033[0;34m' -C_NC='\033[0m' # No Color - -# title, file name or file wildcard to check -function CheckFileExist() { - - if [ -f "$2" ]; then - echo -e "$1 ${C_GREEN}[OK]${C_NC}" - return 0 - fi - - if ls "$2" 1> /dev/null 2>&1; then - echo -e "$1 ${C_GREEN}[OK]${C_NC}" - return 0 - fi - - echo -e "$1 ${C_RED}[Fail]${C_NC}" - return 1 -} - -# title, command line, check result, repeat several times if failed, ignore if fail -function CheckExecute() { - - if [ "$4" ]; then - local RETRY="1 2 3 e" - else - local RETRY="e" - fi - - for I in $RETRY - do - RES=$(eval "$2") - if echo "$RES" | grep -q "$3"; then - echo -e "$1 ${C_GREEN}[OK]${C_NC}" - return 0 - fi - if [ ! $I == "e" ]; then echo "retry $I"; fi - done - - - if [ "$5" ]; then - echo -e "$1 ${C_YELLOW}[Ignored]${C_NC}" - return 0 - fi - - echo -e "$1 ${C_RED}[Fail]${C_NC}" - echo -e "Execution trace:\n$RES" - return 1 -} - -echo -e "\n${C_BLUE}RRG/Iceman Proxmark3 test tool ${C_NC}\n" - -echo -n "work directory: " -pwd -echo "client ${PM3BIN:="./client/proxmark3"}" - -if [ "$TRAVIS_COMMIT" ]; then - if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then - echo "Travis branch: $TRAVIS_BRANCH slug: $TRAVIS_REPO_SLUG commit: $TRAVIS_COMMIT" - else - echo "Travis pull request: $TRAVIS_PULL_REQUEST branch: $TRAVIS_BRANCH slug: $TRAVIS_PULL_REQUEST_SLUG commit: $TRAVIS_COMMIT" - fi -fi - -echo -n "git branch: " -git describe --all -echo -n "git sha: " -git rev-parse HEAD -echo "" - -while true; do - echo -e "\n${C_BLUE}Testing files:${C_NC}" - if ! CheckFileExist "proxmark3 exists" "$PM3BIN"; then break; fi - if ! CheckFileExist "hardnested tables exists" "./client/resources/hardnested_tables/bitflip_0_001_states.bin.z"; then break; fi - if ! CheckFileExist "simmodule fw file exists" "./tools/simmodule/sim011.bin"; then break; fi - - if $TESTDEVICE; then - if ! CheckFileExist "arm image exists" "./armsrc/obj/fullimage.elf"; then break; fi - if ! CheckFileExist "bootrom exists" "./bootrom/obj/bootrom.elf"; then break; fi - fi - - echo -e "\n${C_BLUE}Testing basic help:${C_NC}" - if ! CheckExecute "proxmark help" "$PM3BIN -h" "wait"; then break; fi - if ! CheckExecute "proxmark help text ISO7816" "$PM3BIN -t 2>&1" "ISO7816"; then break; fi - if ! CheckExecute "proxmark help text hardnested" "$PM3BIN -t 2>&1" "hardnested"; then break; fi - - echo -e "\n${C_BLUE}Testing data manipulation:${C_NC}" - if ! CheckExecute "reveng readline test" "$PM3BIN -c 'reveng -h;reveng -D'" "CRC-64/GO-ISO"; then break; fi - if ! CheckExecute "reveng -g test" "$PM3BIN -c 'reveng -g abda202c'" "CRC-16/ISO-IEC-14443-3-A"; then break; fi - if ! CheckExecute "reveng -w test" "$PM3BIN -c 'reveng -w 8 -s 01020304e3 010204039d'" "CRC-8/SMBUS"; then break; fi - if ! CheckExecute "mfu pwdgen test" "$PM3BIN -c 'hf mfu pwdgen t'" "Selftest OK"; then break; fi - if ! CheckExecute "trace load/list 14a" "$PM3BIN -c 'trace load traces/hf_mfu.trace; trace list 1;'" "READBLOCK(8)"; then break; fi - if ! CheckExecute "trace load/list x" "$PM3BIN -c 'trace load traces/hf_mfu.trace; trace list x 1;'" "0.0101840425"; then break; fi - - echo -e "\n${C_BLUE}Testing LF:${C_NC}" - if ! CheckExecute "lf EM4x05 test" "$PM3BIN -c 'data load traces/em4x05.pm3;lf search 1'" "FDX-B ID found"; then break; fi - if ! CheckExecute "lf EM410x test" "$PM3BIN -c 'data load traces/EM4102-1.pm3;lf search 1'" "EM410x ID found"; then break; fi - if ! CheckExecute "lf VISA2000 test" "$PM3BIN -c 'data load traces/visa2000.pm3;lf search 1'" "Visa2000 ID found"; then break; fi - if ! CheckExecute "lf AWID test" "$PM3BIN -c 'data load traces/AWID-15-259.pm3;lf search 1'" "AWID ID found"; then break; fi - if ! CheckExecute "lf SECURAKEY test" "$PM3BIN -c 'data load traces/securakey-64169.pm3;lf search 1 '" "Securakey ID found"; then break; fi - if ! CheckExecute "lf NEXWATCH test" "$PM3BIN -c 'data load traces/quadrakey-521512301.pm3;lf search 1 '" "NexWatch ID found"; then break; fi - if ! CheckExecute "lf KERI test" "$PM3BIN -c 'data load traces/keri.pm3;lf search 1'" "Pyramid ID found"; then break; fi - if ! CheckExecute "lf HID Prox test" "$PM3BIN -c 'data load traces/hid-proxCardII-05512-11432784-1.pm3;lf search 1'" "HID Prox ID found"; then break; fi - if ! CheckExecute "lf PARADOX test" "$PM3BIN -c 'data load traces/Paradox-96_40426-APJN08.pm3;lf search 1'" "Paradox ID found"; then break; fi - if ! CheckExecute "lf PAC test" "$PM3BIN -c 'data load traces/pac-8E4C058E.pm3;lf search 1'" "PAC/Stanley ID found"; then break; fi - if ! CheckExecute "lf VIKING test" "$PM3BIN -c 'data load traces/Transit999-best.pm3;lf search 1'" "Viking ID found"; then break; fi - if ! CheckExecute "lf FDX-B test" "$PM3BIN -c 'data load traces/homeagain1600.pm3;lf search 1'" "FDX-B ID found"; then break; fi - if ! CheckExecute "lf INDALA test" "$PM3BIN -c 'data load traces/indala-504278295.pm3;lf search 1'" "Indala ID found"; then break; fi - if ! CheckExecute "lf FDX/BioThermo test" "$PM3BIN -c 'data load traces/lf_fdx_biothermo.pm3; lf fdx demo'" "95.2 F / 35.1 C"; then break; fi - - - echo -e "\n${C_BLUE}Testing HF:${C_NC}" - if ! CheckExecute "hf mf offline text" "$PM3BIN -c 'hf mf'" "at_enc"; then break; fi - if $SLOWTESTS; then - if ! CheckExecute "hf mf hardnested test" "$PM3BIN -c 'hf mf hardnested t 1 000000000000'" "found:" "repeat" "ignore"; then break; fi - if ! CheckExecute "hf iclass test" "$PM3BIN -c 'hf iclass loclass t l'" "verified ok"; then break; fi - if ! CheckExecute "emv test" "$PM3BIN -c 'emv test -l'" "Test(s) \[ OK"; then break; fi - else - if ! CheckExecute "hf iclass test" "$PM3BIN -c 'hf iclass loclass t'" "key diversification (ok)"; then break; fi - if ! CheckExecute "emv test" "$PM3BIN -c 'emv test'" "Test(s) \[ OK"; then break; fi - fi - - if $TESTTOOLS; then - echo -e "\n${C_BLUE}Testing tools:${C_NC}" - # Need a decent example for mfkey32... - if ! CheckExecute "mfkey32v2 test" "tools/mfkey/mfkey32v2 12345678 1AD8DF2B 1D316024 620EF048 30D6CB07 C52077E2 837AC61A" "Found Key: \[a0a1a2a3a4a5\]"; then break; fi - if ! CheckExecute "mfkey64 test" "tools/mfkey/mfkey64 9c599b32 82a4166c a1e458ce 6eea41e0 5cadf439" "Found Key: \[ffffffffffff\]"; then break; fi - if ! CheckExecute "mfkey64 long trace test" "tools/mfkey/./mfkey64 14579f69 ce844261 f8049ccb 0525c84f 9431cc40 7093df99 9972428ce2e8523f456b99c831e769dced09 8ca6827b ab797fd369e8b93a86776b40dae3ef686efd c3c381ba 49e2c9def4868d1777670e584c27230286f4 fbdcd7c1 4abd964b07d3563aa066ed0a2eac7f6312bf 9f9149ea" "Found Key: \[091e639cb715\]"; then break; fi - if ! CheckExecute "nonce2key test" "tools/nonce2key/nonce2key e9cadd9c a8bf4a12 a020a8285858b090 050f010607060e07 5693be6c00000000" "key recovered: fc00018778f7"; then break; fi - if ! CheckExecute "xorcheck test" "tools/xorcheck.py 04 00 80 64 ba" "final LRC XOR byte value: 5A"; then break; fi - if ! CheckExecute "findbits test" "tools/findbits.py 73 0110010101110011" "Match at bit 9: 011001010"; then break; fi - if ! CheckExecute "findbits_test test" "tools/findbits_test.py 2>&1" "OK"; then break; fi - if ! CheckExecute "pm3_eml_mfd test" "tools/pm3_eml_mfd_test.py 2>&1" "OK"; then break; fi - if $SLOWTESTS; then - if ! CheckExecute "mf_nonce_brute test" "tools/mf_nonce_brute/mf_nonce_brute 9c599b32 5a920d85 1011 98d76b77 d6c6e870 0000 ca7e0b63 0111 3e709c8a" "Key.*: \[ffffffffffff\]"; then break; fi - fi - fi - - echo -e "\n${C_GREEN}Tests [OK]${C_NC}\n" - exit 0 -done - -echo -e "\n${C_RED}Tests [FAIL]${C_NC}\n" -exit 1 diff --git a/tools/pm3_tests.sh b/tools/pm3_tests.sh new file mode 100755 index 000000000..8aaf82d58 --- /dev/null +++ b/tools/pm3_tests.sh @@ -0,0 +1,276 @@ +#!/usr/bin/env bash + +PM3PATH="$(dirname "$0")/.." +cd "$PM3PATH" || exit 1 + +SLOWTESTS=false +TESTALL=true +TESTMFKEY=false +TESTNONCE2KEY=false +TESTMFNONCEBRUTE=false +TESTFPGACOMPRESS=false +TESTBOOTROM=false +TESTARMSRC=false +TESTCLIENT=false +TESTRECOVERY=false +TESTCOMMON=false + +# https://medium.com/@Drew_Stokes/bash-argument-parsing-54f3b81a6a8f +PARAMS="" +while (( "$#" )); do + case "$1" in + -h|--help) + echo """ +Usage: $0 [--long] [--clientbin /path/to/proxmark3] [mfkey|nonce2key|mf_nonce_brute|fpga_compress|bootrom|armsrc|client|recovery|common] + --long: Enable slow tests + --clientbin ...: Specify path to proxmark3 binary to test + If no target given, all targets will be tested +""" + exit 0 + ;; + -l|--long) + SLOWTESTS=true + shift + ;; + --clientbin) + if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then + CLIENTBIN=$2 + shift 2 + else + echo "Error: Argument for $1 is missing" >&2 + exit 1 + fi + ;; + mfkey) + TESTALL=false + TESTMFKEY=true + shift + ;; + nonce2key) + TESTALL=false + TESTNONCE2KEY=true + shift + ;; + mf_nonce_brute) + TESTALL=false + TESTMFNONCEBRUTE=true + shift + ;; + fpga_compress) + TESTALL=false + TESTFPGACOMPRESS=true + shift + ;; + bootrom) + TESTALL=false + TESTBOOTROM=true + shift + ;; + armsrc) + TESTALL=false + TESTARMSRC=true + shift + ;; + client) + TESTALL=false + TESTCLIENT=true + shift + ;; + recovery) + TESTALL=false + TESTRECOVERY=true + shift + ;; + common) + TESTALL=false + TESTCOMMON=true + shift + ;; + -*|--*=) # unsupported flags + echo "Error: Unsupported flag $1" >&2 + exit 1 + ;; + *) # preserve positional arguments + PARAMS="$PARAMS $1" + shift + ;; + esac +done +# set positional arguments in their proper place +eval set -- "$PARAMS" + +C_RED='\033[0;31m' +C_GREEN='\033[0;32m' +C_YELLOW='\033[0;33m' +C_BLUE='\033[0;34m' +C_NC='\033[0m' # No Color + +# title, file name or file wildcard to check +function CheckFileExist() { + + if [ -f "$2" ]; then + echo -e "$1 ${C_GREEN}[OK]${C_NC}" + return 0 + fi + + if ls "$2" 1> /dev/null 2>&1; then + echo -e "$1 ${C_GREEN}[OK]${C_NC}" + return 0 + fi + + echo -e "$1 ${C_RED}[Fail]${C_NC}" + return 1 +} + +# title, command line, check result, repeat several times if failed, ignore if fail +function CheckExecute() { + if [ "$1" == "slow" ]; then + SLOWTEST=true + shift + else + SLOWTEST=false + fi + if [ "$4" ]; then + local RETRY="1 2 3 e" + else + local RETRY="e" + fi + + if $SLOWTEST && ! $SLOWTESTS; then + echo -e "$1 ${C_YELLOW}[SKIPPED]${C_NC} (slow)\n" + return 0 + fi + + for I in $RETRY + do + RES=$(eval "$2") + if echo "$RES" | grep -q "$3"; then + echo -e "$1 ${C_GREEN}[OK]${C_NC}" + return 0 + fi + if [ ! $I == "e" ]; then echo "retry $I"; fi + done + + if [ "$5" ]; then + echo -e "$1 ${C_YELLOW}[Ignored]${C_NC}" + return 0 + fi + + echo -e "$1 ${C_RED}[Fail]${C_NC}" + echo -e "Execution trace:\n$RES" + return 1 +} + +echo -e "\n${C_BLUE}RRG/Iceman Proxmark3 test tool ${C_NC}\n" + +echo -n "work directory: " +pwd + +if [ "$TRAVIS_COMMIT" ]; then + if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then + echo "Travis branch: $TRAVIS_BRANCH slug: $TRAVIS_REPO_SLUG commit: $TRAVIS_COMMIT" + else + echo "Travis pull request: $TRAVIS_PULL_REQUEST branch: $TRAVIS_BRANCH slug: $TRAVIS_PULL_REQUEST_SLUG commit: $TRAVIS_COMMIT" + fi +fi + +echo -n "git branch: " +git describe --all +echo -n "git sha: " +git rev-parse HEAD +echo "" + +while true; do + if $TESTALL || $TESTCOMMON; then + echo -e "\n${C_BLUE}Testing common:${C_NC}" + if ! CheckFileExist "hardnested tables exists" "./client/resources/hardnested_tables/bitflip_0_001_states.bin.z"; then break; fi + if ! CheckFileExist "simmodule fw file exists" "./tools/simmodule/sim011.bin"; then break; fi + echo -e "\n${C_BLUE}Testing tools:${C_NC}" + if ! CheckExecute "xorcheck test" "tools/xorcheck.py 04 00 80 64 ba" "final LRC XOR byte value: 5A"; then break; fi + if ! CheckExecute "findbits test" "tools/findbits.py 73 0110010101110011" "Match at bit 9: 011001010"; then break; fi + if ! CheckExecute "findbits_test test" "tools/findbits_test.py 2>&1" "OK"; then break; fi + if ! CheckExecute "pm3_eml_mfd test" "tools/pm3_eml_mfd_test.py 2>&1" "OK"; then break; fi + fi + if $TESTALL || $TESTBOOTROM; then + echo -e "\n${C_BLUE}Testing bootrom:${C_NC}" + if ! CheckFileExist "bootrom exists" "./bootrom/obj/bootrom.elf"; then break; fi + fi + if $TESTALL || $TESTARMSRC; then + echo -e "\n${C_BLUE}Testing armsrc:${C_NC}" + if ! CheckFileExist "arm image exists" "./armsrc/obj/fullimage.elf"; then break; fi + fi + if $TESTALL || $TESTRECOVERY; then + echo -e "\n${C_BLUE}Testing recovery:${C_NC}" + if ! CheckFileExist "recovery image exists" "./recovery/proxmark3_recovery.bin"; then break; fi + + fi + if $TESTALL || $TESTFPGACOMPRESS; then + echo -e "\n${C_BLUE}Testing fpgacompress:${C_NC} ${FPGACPMPRESSBIN:=./tools/fpga_compress/fpga_compress}" + if ! CheckFileExist "fpgacompress exists" "$FPGACPMPRESSBIN"; then break; fi + fi + if $TESTALL || $TESTMFKEY; then + echo -e "\n${C_BLUE}Testing mfkey:${C_NC} ${MFKEY32V2BIN:=./tools/mfkey/mfkey32v2} ${MFKEY64BIN:=./tools/mfkey/mfkey64}" + if ! CheckFileExist "mfkey32v2 exists" "$MFKEY32V2BIN"; then break; fi + if ! CheckFileExist "mfkey64 exists" "$MFKEY64BIN"; then break; fi + # Need a decent example for mfkey32... + if ! CheckExecute "mfkey32v2 test" "$MFKEY32V2BIN 12345678 1AD8DF2B 1D316024 620EF048 30D6CB07 C52077E2 837AC61A" "Found Key: \[a0a1a2a3a4a5\]"; then break; fi + if ! CheckExecute "mfkey64 test" "$MFKEY64BIN 9c599b32 82a4166c a1e458ce 6eea41e0 5cadf439" "Found Key: \[ffffffffffff\]"; then break; fi + if ! CheckExecute "mfkey64 long trace test" "$MFKEY64BIN 14579f69 ce844261 f8049ccb 0525c84f 9431cc40 7093df99 9972428ce2e8523f456b99c831e769dced09 8ca6827b ab797fd369e8b93a86776b40dae3ef686efd c3c381ba 49e2c9def4868d1777670e584c27230286f4 fbdcd7c1 4abd964b07d3563aa066ed0a2eac7f6312bf 9f9149ea" "Found Key: \[091e639cb715\]"; then break; fi + fi + if $TESTALL || $TESTNONCE2KEY; then + echo -e "\n${C_BLUE}Testing nonce2key:${C_NC} ${NONCE2KEYBIN:=./tools/nonce2key/nonce2key}" + if ! CheckFileExist "nonce2key exists" "$NONCE2KEYBIN"; then break; fi + if ! CheckExecute "nonce2key test" "$NONCE2KEYBIN e9cadd9c a8bf4a12 a020a8285858b090 050f010607060e07 5693be6c00000000" "key recovered: fc00018778f7"; then break; fi + fi + if $TESTALL || $TESTMFNONCEBRUTE; then + echo -e "\n${C_BLUE}Testing mf_nonce_brute:${C_NC} ${MFNONCEBRUTEBIN:=./tools/mf_nonce_brute/mf_nonce_brute}" + if ! CheckFileExist "mf_nonce_brute exists" "$MFNONCEBRUTEBIN"; then break; fi + if ! CheckExecute slow "mf_nonce_brute test" "$MFNONCEBRUTEBIN 9c599b32 5a920d85 1011 98d76b77 d6c6e870 0000 ca7e0b63 0111 3e709c8a" "Key.*: \[ffffffffffff\]"; then break; fi + fi + if $TESTALL || $TESTCLIENT; then + echo -e "\n${C_BLUE}Testing client:${C_NC} ${CLIENTBIN:=./client/proxmark3}" + if ! CheckFileExist "proxmark3 exists" "$CLIENTBIN"; then break; fi + echo -e "\n${C_BLUE}Testing basic help:${C_NC}" + if ! CheckExecute "proxmark help" "$CLIENTBIN -h" "wait"; then break; fi + if ! CheckExecute "proxmark help text ISO7816" "$CLIENTBIN -t 2>&1" "ISO7816"; then break; fi + if ! CheckExecute "proxmark help text hardnested" "$CLIENTBIN -t 2>&1" "hardnested"; then break; fi + + echo -e "\n${C_BLUE}Testing data manipulation:${C_NC}" + if ! CheckExecute "reveng readline test" "$CLIENTBIN -c 'reveng -h;reveng -D'" "CRC-64/GO-ISO"; then break; fi + if ! CheckExecute "reveng -g test" "$CLIENTBIN -c 'reveng -g abda202c'" "CRC-16/ISO-IEC-14443-3-A"; then break; fi + if ! CheckExecute "reveng -w test" "$CLIENTBIN -c 'reveng -w 8 -s 01020304e3 010204039d'" "CRC-8/SMBUS"; then break; fi + if ! CheckExecute "mfu pwdgen test" "$CLIENTBIN -c 'hf mfu pwdgen t'" "Selftest OK"; then break; fi + if ! CheckExecute "trace load/list 14a" "$CLIENTBIN -c 'trace load traces/hf_mfu.trace; trace list 1;'" "READBLOCK(8)"; then break; fi + if ! CheckExecute "trace load/list x" "$CLIENTBIN -c 'trace load traces/hf_mfu.trace; trace list x 1;'" "0.0101840425"; then break; fi + + echo -e "\n${C_BLUE}Testing LF:${C_NC}" + if ! CheckExecute "lf EM4x05 test" "$CLIENTBIN -c 'data load traces/em4x05.pm3;lf search 1'" "FDX-B ID found"; then break; fi + if ! CheckExecute "lf EM410x test" "$CLIENTBIN -c 'data load traces/EM4102-1.pm3;lf search 1'" "EM410x ID found"; then break; fi + if ! CheckExecute "lf VISA2000 test" "$CLIENTBIN -c 'data load traces/visa2000.pm3;lf search 1'" "Visa2000 ID found"; then break; fi + if ! CheckExecute "lf AWID test" "$CLIENTBIN -c 'data load traces/AWID-15-259.pm3;lf search 1'" "AWID ID found"; then break; fi + if ! CheckExecute "lf SECURAKEY test" "$CLIENTBIN -c 'data load traces/securakey-64169.pm3;lf search 1 '" "Securakey ID found"; then break; fi + if ! CheckExecute "lf NEXWATCH test" "$CLIENTBIN -c 'data load traces/quadrakey-521512301.pm3;lf search 1 '" "NexWatch ID found"; then break; fi + if ! CheckExecute "lf KERI test" "$CLIENTBIN -c 'data load traces/keri.pm3;lf search 1'" "Pyramid ID found"; then break; fi + if ! CheckExecute "lf HID Prox test" "$CLIENTBIN -c 'data load traces/hid-proxCardII-05512-11432784-1.pm3;lf search 1'" "HID Prox ID found"; then break; fi + if ! CheckExecute "lf PARADOX test" "$CLIENTBIN -c 'data load traces/Paradox-96_40426-APJN08.pm3;lf search 1'" "Paradox ID found"; then break; fi + if ! CheckExecute "lf PAC test" "$CLIENTBIN -c 'data load traces/pac-8E4C058E.pm3;lf search 1'" "PAC/Stanley ID found"; then break; fi + if ! CheckExecute "lf VIKING test" "$CLIENTBIN -c 'data load traces/Transit999-best.pm3;lf search 1'" "Viking ID found"; then break; fi + if ! CheckExecute "lf FDX-B test" "$CLIENTBIN -c 'data load traces/homeagain1600.pm3;lf search 1'" "FDX-B ID found"; then break; fi + if ! CheckExecute "lf INDALA test" "$CLIENTBIN -c 'data load traces/indala-504278295.pm3;lf search 1'" "Indala ID found"; then break; fi + if ! CheckExecute "lf FDX/BioThermo test" "$CLIENTBIN -c 'data load traces/lf_fdx_biothermo.pm3; lf fdx demo'" "95.2 F / 35.1 C"; then break; fi + + echo -e "\n${C_BLUE}Testing HF:${C_NC}" + if ! CheckExecute "hf mf offline text" "$CLIENTBIN -c 'hf mf'" "at_enc"; then break; fi + if ! CheckExecute slow "hf mf hardnested long test" "$CLIENTBIN -c 'hf mf hardnested t 1 000000000000'" "found:" "repeat" "ignore"; then break; fi + if ! CheckExecute slow "hf iclass long test" "$CLIENTBIN -c 'hf iclass loclass t l'" "verified ok"; then break; fi + if ! CheckExecute slow "emv long test" "$CLIENTBIN -c 'emv test -l'" "Test(s) \[ OK"; then break; fi + if ! $SLOWTESTS; then + if ! CheckExecute "hf iclass test" "$CLIENTBIN -c 'hf iclass loclass t'" "key diversification (ok)"; then break; fi + if ! CheckExecute "emv test" "$CLIENTBIN -c 'emv test'" "Test(s) \[ OK"; then break; fi + fi + fi + echo -e "\n${C_GREEN}Tests [OK]${C_NC}\n" + exit 0 +done +echo -e "\n${C_RED}Tests [FAIL]${C_NC}\n" +exit 1 From bcb0e5db4d0a80de456289a33df0287c3f46fb66 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 22 May 2020 18:40:12 +0200 Subject: [PATCH 341/632] document make check --- doc/md/Development/Maintainers.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/md/Development/Maintainers.md b/doc/md/Development/Maintainers.md index c3d0e4e29..af36dbbe2 100644 --- a/doc/md/Development/Maintainers.md +++ b/doc/md/Development/Maintainers.md @@ -72,6 +72,8 @@ On some architectures, pthread library is not present: * `make client SKIPPTHREAD=1` to skip `-lpthread` at linker stage. +Some unittests are available via `make check`, which is actually triggering individual targets as for `make install`. + `make install` is actually triggering the following individual targets which can be accessed individually: * `make client/install` @@ -89,4 +91,4 @@ On some architectures, pthread library is not present: * SIM firmware * udev rule on Linux -Same logic for `make all`, `make clean`, `make uninstall` +Same logic for `make all`, `make clean`, `make uninstall` and `make check`. From 9e756c5957d8c1806abd492b0d5b959b407f5040 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 23 May 2020 12:26:33 +0200 Subject: [PATCH 342/632] chg: hf mf eload - made messages more clear.\n added color to hf mf helptext --- client/src/cmdhfmf.c | 160 ++++++++++++++++++++----------------------- 1 file changed, 76 insertions(+), 84 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 560ed0a16..08a4f1781 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -48,8 +48,8 @@ static int usage_hf14_ice(void) { PrintAndLogEx(NORMAL, " f save nonces to instead of hf-mf--nonces.bin"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf mf ice"); - PrintAndLogEx(NORMAL, " hf mf ice f nonces.bin"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf ice")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf ice f nonces.bin")); return PM3_SUCCESS; } @@ -60,8 +60,8 @@ static int usage_hf14_dump(void) { PrintAndLogEx(NORMAL, " f : data filename, if no given, UID will be used as filename"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf mf dump"); - PrintAndLogEx(NORMAL, " hf mf dump 4"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf dump")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf dump 4")); return PM3_SUCCESS; } @@ -72,9 +72,9 @@ static int usage_hf14_mifare(void) { PrintAndLogEx(NORMAL, " (Optional) target other block"); PrintAndLogEx(NORMAL, " (optional) target key type"); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf mf darkside"); - PrintAndLogEx(NORMAL, " hf mf darkside 16"); - PrintAndLogEx(NORMAL, " hf mf darkside 16 B"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf darkside")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf darkside 16")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf darkside 16 B")); return PM3_SUCCESS; } static int usage_hf14_mfsim(void) { @@ -95,10 +95,10 @@ static int usage_hf14_mfsim(void) { PrintAndLogEx(NORMAL, " e (Optional) Fill simulator keys from found keys"); PrintAndLogEx(NORMAL, " v (Optional) Verbose"); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf mf sim u 0a0a0a0a"); - PrintAndLogEx(NORMAL, " hf mf sim u 11223344556677"); - PrintAndLogEx(NORMAL, " hf mf sim u 112233445566778899AA"); - PrintAndLogEx(NORMAL, " hf mf sim u 11223344 i x"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf sim u 0a0a0a0a")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf sim u 11223344556677")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf sim u 112233445566778899AA")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf sim u 11223344 i x")); return PM3_SUCCESS; } /* @@ -112,7 +112,7 @@ static int usage_hf14_mfsim(void) { // PrintAndLogEx(NORMAL, " n/a e decrypt sequence, collect read and write commands and save the result of the sequence to emulator memory"); PrintAndLogEx(NORMAL, " f decrypt sequence, collect read and write commands and save the result of the sequence to emulator dump file `uid.eml`"); PrintAndLogEx(NORMAL, "Example:"); - PrintAndLogEx(NORMAL, " hf mf sniff l d f"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf sniff l d f")); return PM3_SUCCESS; } */ @@ -127,10 +127,10 @@ static int usage_hf14_nested(void) { PrintAndLogEx(NORMAL, " d write keys to binary file `hf-mf--key.bin`"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf mf nested 1 0 A FFFFFFFFFFFF -- key recovery against 1K, block 0, Key A using key FFFFFFFFFFFF"); - PrintAndLogEx(NORMAL, " hf mf nested 1 0 A FFFFFFFFFFFF t -- and transfer keys into emulator memory"); - PrintAndLogEx(NORMAL, " hf mf nested 1 0 A FFFFFFFFFFFF d -- or write keys to binary file "); - PrintAndLogEx(NORMAL, " hf mf nested o 0 A FFFFFFFFFFFF 4 A -- one sector key recovery. Use block 0 Key A to find block 4 Key A"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf nested 1 0 A FFFFFFFFFFFF")" -- key recovery against 1K, block 0, Key A using key FFFFFFFFFFFF"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf nested 1 0 A FFFFFFFFFFFF t")" -- and transfer keys into emulator memory"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf nested 1 0 A FFFFFFFFFFFF d")" -- or write keys to binary file "); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf nested o 0 A FFFFFFFFFFFF 4 A")" -- one sector key recovery. Use block 0 Key A to find block 4 Key A"); return PM3_SUCCESS; } static int usage_hf14_staticnested(void) { @@ -143,9 +143,9 @@ static int usage_hf14_staticnested(void) { PrintAndLogEx(NORMAL, " d write keys to binary file `hf-mf--key.bin`"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf mf staticnested 1 0 A FFFFFFFFFFFF -- key recovery against 1K, block 0, Key A using key FFFFFFFFFFFF"); - PrintAndLogEx(NORMAL, " hf mf staticnested 1 0 A FFFFFFFFFFFF t -- and transfer keys into emulator memory"); - PrintAndLogEx(NORMAL, " hf mf staticnested 1 0 A FFFFFFFFFFFF d -- or write keys to binary file "); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf staticnested 1 0 A FFFFFFFFFFFF")" -- key recovery against 1K, block 0, Key A using key FFFFFFFFFFFF"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf staticnested 1 0 A FFFFFFFFFFFF t")" -- and transfer keys into emulator memory"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf staticnested 1 0 A FFFFFFFFFFFF d")" -- or write keys to binary file "); return PM3_SUCCESS; } static int usage_hf14_hardnested(void) { @@ -175,35 +175,17 @@ static int usage_hf14_hardnested(void) { PrintAndLogEx(NORMAL, " i n = none (use CPU regular instruction set)"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf mf hardnested 0 A FFFFFFFFFFFF 4 A"); - PrintAndLogEx(NORMAL, " hf mf hardnested 0 A FFFFFFFFFFFF 4 A w"); - PrintAndLogEx(NORMAL, " hf mf hardnested 0 A FFFFFFFFFFFF 4 A f nonces.bin w s"); - PrintAndLogEx(NORMAL, " hf mf hardnested r"); - PrintAndLogEx(NORMAL, " hf mf hardnested r a0a1a2a3a4a5"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf hardnested 0 A FFFFFFFFFFFF 4 A")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf hardnested 0 A FFFFFFFFFFFF 4 A w")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf hardnested 0 A FFFFFFFFFFFF 4 A f nonces.bin w s")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf hardnested r")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf hardnested r a0a1a2a3a4a5")); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Add the known target key to check if it is present in the remaining key space:"); - PrintAndLogEx(NORMAL, " hf mf hardnested 0 A A0A1A2A3A4A5 4 A FFFFFFFFFFFF"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf hardnested 0 A A0A1A2A3A4A5 4 A FFFFFFFFFFFF")); return PM3_SUCCESS; } -/* -static int usage_hf14_fixednested(void) { - PrintAndLogEx(NORMAL, "Usage:"); - PrintAndLogEx(NORMAL, " all sectors: hf mf fixed [t,d]"); - PrintAndLogEx(NORMAL, " one sector: hf mf fixed o [t]"); - PrintAndLogEx(NORMAL, "Options:"); - PrintAndLogEx(NORMAL, " h this help"); - PrintAndLogEx(NORMAL, " card memory - 0 - MINI(320 bytes), 1 - 1K, 2 - 2K, 4 - 4K, - 1K"); - PrintAndLogEx(NORMAL, " t transfer keys into emulator memory"); - PrintAndLogEx(NORMAL, " d write keys to binary file `hf-mf--key.bin`"); - PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf mf fixed 1 0 A FFFFFFFFFFFF -- key recovery against 1K, block 0, Key A using key FFFFFFFFFFFF"); - PrintAndLogEx(NORMAL, " hf mf fixed 1 0 A FFFFFFFFFFFF t -- and transfer keys into emulator memory"); - PrintAndLogEx(NORMAL, " hf mf fixed 1 0 A FFFFFFFFFFFF d -- or write keys to binary file "); - PrintAndLogEx(NORMAL, " hf mf fixed o 0 A FFFFFFFFFFFF 4 A -- one sector key recovery. Use block 0 Key A to find block 4 Key A"); - return PM3_SUCCESS; -} -*/ + static int usage_hf14_autopwn(void) { PrintAndLogEx(NORMAL, "Usage:"); PrintAndLogEx(NORMAL, " hf mf autopwn [k] "); @@ -238,10 +220,10 @@ static int usage_hf14_autopwn(void) { PrintAndLogEx(NORMAL, " i n = none (use CPU regular instruction set)"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf mf autopwn -- target Mifare classic card with default keys"); - PrintAndLogEx(NORMAL, " hf mf autopwn * 1 f mfc_default_keys -- target Mifare classic card (size 1k) with default dictionary"); - PrintAndLogEx(NORMAL, " hf mf autopwn k 0 A FFFFFFFFFFFF -- target Mifare classic card with Sector0 typeA with known key 'FFFFFFFFFFFF'"); - PrintAndLogEx(NORMAL, " hf mf autopwn k 0 A FFFFFFFFFFFF * 1 f mfc_default_keys -- this command combines the two above (reduce the need for nested / hardnested attacks, by using a dictionary)"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf autopwn")" -- target Mifare classic card with default keys"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf autopwn * 1 f mfc_default_keys")" -- target Mifare classic card (size 1k) with default dictionary"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf autopwn k 0 A FFFFFFFFFFFF")" -- target Mifare classic card with Sector0 typeA with known key 'FFFFFFFFFFFF'"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf autopwn k 0 A FFFFFFFFFFFF * 1 f mfc_default_keys")" -- this command combines the two above (reduce the need for nested / hardnested attacks, by using a dictionary)"); return PM3_SUCCESS; } static int usage_hf14_chk(void) { @@ -301,7 +283,7 @@ static int usage_hf14_keybrute(void) { PrintAndLogEx(NORMAL, " target key type"); PrintAndLogEx(NORMAL, " candidate key from mf_nonce_brute tool"); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf mf keybrute 1 A 000011223344"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf keybrute 1 A 000011223344")); return 0; } */ @@ -314,10 +296,10 @@ static int usage_hf14_restore(void) { PrintAndLogEx(NORMAL, " f : data filename, specific the full filename of data file"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf mf restore -- read the UID from tag first, then restore from hf-mf--key.bin and and hf-mf--dump.bin"); - PrintAndLogEx(NORMAL, " hf mf restore 1 u 12345678 -- restore from hf-mf-12345678-key.bin and hf-mf-12345678-dump.bin"); - PrintAndLogEx(NORMAL, " hf mf restore 1 u 12345678 k dumpkey.bin -- restore from dumpkey.bin and hf-mf-12345678-dump.bin"); - PrintAndLogEx(NORMAL, " hf mf restore 4 -- read the UID from tag with 4K memory first, then restore from hf-mf--key.bin and and hf-mf--dump.bin"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf restore") " -- read the UID from tag first, then restore from hf-mf--key.bin and and hf-mf--dump.bin"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf restore 1 u 12345678") " -- restore from hf-mf-12345678-key.bin and hf-mf-12345678-dump.bin"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf restore 1 u 12345678 k dumpkey.bin") " -- restore from dumpkey.bin and hf-mf-12345678-dump.bin"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf restore 4") " -- read the UID from tag with 4K memory first, then restore from hf-mf--key.bin and and hf-mf--dump.bin"); return PM3_SUCCESS; } static int usage_hf14_decryptbytes(void) { @@ -330,26 +312,28 @@ static int usage_hf14_decryptbytes(void) { PrintAndLogEx(NORMAL, " encrypted tag response"); PrintAndLogEx(NORMAL, " encrypted data, taken directly after at_enc and forward"); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf mf decrypt b830049b 9248314a 9280e203 41e586f9\n"); - PrintAndLogEx(NORMAL, " this sample decrypts 41e586f9 -> 3003999a Annotated: 30 03 [99 9a] auth block 3 [crc]"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf decrypt b830049b 9248314a 9280e203 41e586f9")); + PrintAndLogEx(NORMAL, "\n this sample decrypts 41e586f9 -> 3003999a Annotated: 30 03 [99 9a] auth block 3 [crc]"); return PM3_SUCCESS; } static int usage_hf14_eget(void) { PrintAndLogEx(NORMAL, "Usage: hf mf eget "); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf mf eget 0 "); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf eget 0")); return PM3_SUCCESS; } static int usage_hf14_eclr(void) { PrintAndLogEx(NORMAL, "It set card emulator memory to empty data blocks and key A/B FFFFFFFFFFFF \n"); PrintAndLogEx(NORMAL, "Usage: hf mf eclr"); + PrintAndLogEx(NORMAL, "Examples:"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf eclr")); return PM3_SUCCESS; } static int usage_hf14_eset(void) { PrintAndLogEx(NORMAL, "Usage: hf mf eset "); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf mf eset 1 000102030405060708090a0b0c0d0e0f "); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf eset 1 000102030405060708090a0b0c0d0e0f")); return PM3_SUCCESS; } static int usage_hf14_eload(void) { @@ -358,8 +342,8 @@ static int usage_hf14_eload(void) { PrintAndLogEx(NORMAL, " [card memory]: 0 = 320 bytes (Mifare Mini), 1 = 1K (default), 2 = 2K, 4 = 4K, u = UL"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf mf eload filename"); - PrintAndLogEx(NORMAL, " hf mf eload 4 filename"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf eload filename")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf eload 4 filename")); return PM3_SUCCESS; } static int usage_hf14_esave(void) { @@ -368,9 +352,9 @@ static int usage_hf14_esave(void) { PrintAndLogEx(NORMAL, " [card memory]: 0 = 320 bytes (Mifare Mini), 1 = 1K (default), 2 = 2K, 4 = 4K"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf mf esave "); - PrintAndLogEx(NORMAL, " hf mf esave 4"); - PrintAndLogEx(NORMAL, " hf mf esave 4 filename"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf esave")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf esave 4")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf esave 4 filename")); return PM3_SUCCESS; } static int usage_hf14_ecfill(void) { @@ -380,8 +364,8 @@ static int usage_hf14_ecfill(void) { PrintAndLogEx(NORMAL, " [card memory]: 0 = 320 bytes (Mifare Mini), 1 = 1K (default), 2 = 2K, 4 = 4K"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf mf ecfill A"); - PrintAndLogEx(NORMAL, " hf mf ecfill A 4"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf ecfill A")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf ecfill A 4")); return PM3_SUCCESS; } static int usage_hf14_ekeyprn(void) { @@ -393,8 +377,8 @@ static int usage_hf14_ekeyprn(void) { PrintAndLogEx(NORMAL, " d write keys to binary file `hf-mf--key.bin`"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf mf ekeyprn 1"); - PrintAndLogEx(NORMAL, " hf mf ekeyprn d"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf ekeyprn 1")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf ekeyprn d")); return PM3_SUCCESS; } @@ -409,8 +393,8 @@ static int usage_hf14_csetuid(void) { PrintAndLogEx(NORMAL, " ATQA 4 hex symbols"); PrintAndLogEx(NORMAL, " SAK 2 hex symbols"); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf mf csetuid 01020304"); - PrintAndLogEx(NORMAL, " hf mf csetuid 01020304 0004 08 w"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf csetuid 01020304")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf csetuid 01020304 0004 08 w")); return PM3_SUCCESS; } static int usage_hf14_csetblk(void) { @@ -423,8 +407,8 @@ static int usage_hf14_csetblk(void) { PrintAndLogEx(NORMAL, " block number"); PrintAndLogEx(NORMAL, " block data to write (32 hex symbols)"); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf mf csetblk 1 01020304050607080910111213141516"); - PrintAndLogEx(NORMAL, " hf mf csetblk 1 01020304050607080910111213141516 w"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf csetblk 1 01020304050607080910111213141516")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf csetblk 1 01020304050607080910111213141516 w")); return PM3_SUCCESS; } static int usage_hf14_cload(void) { @@ -439,8 +423,8 @@ static int usage_hf14_cload(void) { PrintAndLogEx(NORMAL, " b load card with data from binary file"); PrintAndLogEx(NORMAL, " load card with data from eml file"); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf mf cload mydump"); - PrintAndLogEx(NORMAL, " hf mf cload e"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf cload mydump")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf cload e")); return PM3_SUCCESS; } static int usage_hf14_cgetblk(void) { @@ -451,7 +435,7 @@ static int usage_hf14_cgetblk(void) { PrintAndLogEx(NORMAL, " h this help"); PrintAndLogEx(NORMAL, " block number"); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf mf cgetblk 1"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf cgetblk 1")); return PM3_SUCCESS; } static int usage_hf14_cgetsc(void) { @@ -462,7 +446,7 @@ static int usage_hf14_cgetsc(void) { PrintAndLogEx(NORMAL, " h this help"); PrintAndLogEx(NORMAL, " sector number"); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf mf cgetsc 0"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf cgetsc 0")); return PM3_SUCCESS; } static int usage_hf14_csave(void) { @@ -478,9 +462,9 @@ static int usage_hf14_csave(void) { PrintAndLogEx(NORMAL, " o save data to file"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf mf csave u 1"); - PrintAndLogEx(NORMAL, " hf mf csave e 1"); - PrintAndLogEx(NORMAL, " hf mf csave 4 o filename"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf csave u 1")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf csave e 1")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf csave 4 o filename")); return PM3_SUCCESS; } static int usage_hf14_nack(void) { @@ -491,7 +475,7 @@ static int usage_hf14_nack(void) { PrintAndLogEx(NORMAL, " h this help"); PrintAndLogEx(NORMAL, " v verbose"); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf mf nack"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf mf nack")); return PM3_SUCCESS; } @@ -3727,6 +3711,11 @@ int CmdHF14AMfELoad(const char *Cmd) { free(data); return res; } + + // update expected blocks to match converted data. + if (numBlocks != datalen / 4) { + numBlocks = datalen / 4; + } } PrintAndLogEx(INFO, "Uploading to emulator memory"); @@ -3752,24 +3741,27 @@ int CmdHF14AMfELoad(const char *Cmd) { counter += blockWidth; datalen -= blockWidth; } + free(data); PrintAndLogEx(NORMAL, "\n"); - // Ultralight /Ntag if (blockWidth == 4) { + PrintAndLogEx(HINT, "You are ready to simulate. See " _YELLOW_("`hf mfu sim h`")); + // MFU / NTAG if ((blockNum != numBlocks)) { - PrintAndLogEx(FAILED, "Warning, Ultralight/Ntag file content, Loaded %d blocks into emulator memory", blockNum); - free(data); + PrintAndLogEx(WARNING, "Warning, Ultralight/Ntag file content, Loaded %d blocks of expected %d blocks into emulator memory", blockNum, numBlocks); return PM3_SUCCESS; } } else { + PrintAndLogEx(HINT, "You are ready to simulate. See " _YELLOW_("`hf mf sim h`")); + // MFC if ((blockNum != numBlocks)) { - PrintAndLogEx(FAILED, "Error, file content, Only loaded %d blocks, must be %d blocks into emulator memory", blockNum, numBlocks); - free(data); + PrintAndLogEx(WARNING, "Error, file content, Only loaded %d blocks, must be %d blocks into emulator memory", blockNum, numBlocks); + return PM3_SUCCESS; } + } PrintAndLogEx(SUCCESS, "Done"); - free(data); return PM3_SUCCESS; } From 6d33c0b784e33b344f31217423d97f9c528b9d37 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 22 May 2020 19:20:44 +0200 Subject: [PATCH 343/632] Bring hitag2crack tools in main Makefiles --- Makefile | 13 +- doc/md/Development/Maintainers.md | 4 + tools/hitag2crack/Makefile | 33 +++++ tools/hitag2crack/common/ht2crackutils.h | 5 + tools/hitag2crack/crack2/Makefile | 37 +++--- .../hitag2crack/crack2/ht2crack2buildtable.c | 50 ++++---- tools/hitag2crack/crack2/ht2crack2gentest.c | 4 +- tools/hitag2crack/crack2/ht2crack2search.c | 16 +-- tools/hitag2crack/crack3/.gitignore | 5 +- tools/hitag2crack/crack3/Makefile | 32 ++--- tools/hitag2crack/crack3/README.md | 4 +- tools/hitag2crack/crack3/ht2crack3.c | 12 +- .../crack3/{ht2test.c => ht2crack3test.c} | 2 +- tools/hitag2crack/crack4/Makefile | 30 ++--- tools/hitag2crack/crack4/ht2crack4.c | 57 +++++---- tools/hitag2crack/crack5/Makefile | 29 +++-- tools/hitag2crack/crack5/ht2crack5.c | 10 +- tools/hitag2crack/crack5gpu/Makefile | 42 ++++--- .../crack5gpu/{ht2crack5.c => ht2crack5gpu.c} | 6 +- tools/hitag2crack/hitag2_gen_nRaR.py | 118 ++++++++++++++++++ tools/pm3_tests.sh | 92 +++++++++++++- 21 files changed, 433 insertions(+), 168 deletions(-) create mode 100644 tools/hitag2crack/Makefile rename tools/hitag2crack/crack3/{ht2test.c => ht2crack3test.c} (96%) rename tools/hitag2crack/crack5gpu/{ht2crack5.c => ht2crack5gpu.c} (98%) create mode 100755 tools/hitag2crack/hitag2_gen_nRaR.py diff --git a/Makefile b/Makefile index d111d01fc..f7a434d3b 100644 --- a/Makefile +++ b/Makefile @@ -15,6 +15,8 @@ ifneq (,$(DESTDIR)) endif all clean install uninstall check: %: client/% bootrom/% armsrc/% recovery/% mfkey/% nonce2key/% mf_nonce_brute/% fpga_compress/% +# hitag2crack toolsuite is not yet integrated in "all", it must be called explicitly: "make hitag2crack" +#all clean install uninstall check: %: hitag2crack/% INSTALLTOOLS=pm3_eml2lower.sh pm3_eml2upper.sh pm3_mfdread.py pm3_mfd2eml.py pm3_eml2mfd.py findbits.py rfidtest.pl xorcheck.py INSTALLSIMFW=sim011.bin sim011.sha512.txt @@ -103,6 +105,9 @@ client/check: FORCE recovery/check: FORCE $(info [*] CHECK $(patsubst %/check,%,$@)) $(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@) +hitag2crack/check: FORCE + $(info [*] CHECK $(patsubst %/check,%,$@)) + $(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@) common/check: FORCE $(info [*] CHECK $(patsubst %/check,%,$@)) $(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@) @@ -135,9 +140,12 @@ recovery/install: bootrom/all armsrc/all recovery/%: FORCE cleanifplatformchanged $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C recovery $(patsubst recovery/%,%,$@) DESTDIR=$(MYDESTDIR) +hitag2crack/%: FORCE + $(info [*] MAKE $@) + $(Q)$(MAKE) --no-print-directory -C tools/hitag2crack $(patsubst hitag2crack/%,%,$@) DESTDIR=$(MYDESTDIR) FORCE: # Dummy target to force remake in the subdirectories, even if files exist (this Makefile doesn't know about the prerequisites) -.PHONY: all clean install uninstall help _test bootrom fullimage recovery client mfkey nonce2key mf_nonce_brute style miscchecks release FORCE udev accessrights cleanifplatformchanged +.PHONY: all clean install uninstall help _test bootrom fullimage recovery client mfkey nonce2key mf_nonce_brute hitag2crack style miscchecks release FORCE udev accessrights cleanifplatformchanged help: @echo "Multi-OS Makefile" @@ -157,6 +165,7 @@ help: @echo "+ mfkey - Make tools/mfkey" @echo "+ nonce2key - Make tools/nonce2key" @echo "+ mf_nonce_brute - Make tools/mf_nonce_brute" + @echo "+ hitag2crack - Make tools/hitag2crack" @echo "+ fpga_compress - Make tools/fpga_compress" @echo @echo "+ style - Apply some automated source code formatting rules" @@ -193,6 +202,8 @@ mf_nonce_brute: mf_nonce_brute/all fpga_compress: fpga_compress/all +hitag2crack: hitag2crack/all + newtarbin: $(RM) proxmark3-$(platform)-bin.tar proxmark3-$(platform)-bin.tar.gz @touch proxmark3-$(platform)-bin.tar diff --git a/doc/md/Development/Maintainers.md b/doc/md/Development/Maintainers.md index af36dbbe2..09cddede7 100644 --- a/doc/md/Development/Maintainers.md +++ b/doc/md/Development/Maintainers.md @@ -72,6 +72,10 @@ On some architectures, pthread library is not present: * `make client SKIPPTHREAD=1` to skip `-lpthread` at linker stage. +One tool requires a CUDA compilation environment, it can be skipped as well: + +* `make hitag2crack SKIPGPU=1` to skip ht2crack5gpu tool when compiling the hitag2crack toolsuite. + Some unittests are available via `make check`, which is actually triggering individual targets as for `make install`. `make install` is actually triggering the following individual targets which can be accessed individually: diff --git a/tools/hitag2crack/Makefile b/tools/hitag2crack/Makefile new file mode 100644 index 000000000..c36d18b30 --- /dev/null +++ b/tools/hitag2crack/Makefile @@ -0,0 +1,33 @@ +# Must be called before any Makefile include +ROOT_DIR:=$(dir $(realpath $(lastword $(MAKEFILE_LIST)))) + +include ../../Makefile.defs + +all clean install uninstall check: %: crack2/% crack3/% crack4/% crack5/% +ifneq ($(SKIPGPU),1) +all clean install uninstall check: %: crack5gpu/% +endif + +crack2/%: FORCE + $(info [*] MAKE $@) + $(Q)$(MAKE) --no-print-directory -C crack2 $(patsubst crack2/%,%,$@) DESTDIR=$(MYDESTDIR) + +crack3/%: FORCE + $(info [*] MAKE $@) + $(Q)$(MAKE) --no-print-directory -C crack3 $(patsubst crack3/%,%,$@) DESTDIR=$(MYDESTDIR) + +crack4/%: FORCE + $(info [*] MAKE $@) + $(Q)$(MAKE) --no-print-directory -C crack4 $(patsubst crack4/%,%,$@) DESTDIR=$(MYDESTDIR) + +crack5/%: FORCE + $(info [*] MAKE $@) + $(Q)$(MAKE) --no-print-directory -C crack5 $(patsubst crack5/%,%,$@) DESTDIR=$(MYDESTDIR) + +crack5gpu/%: FORCE + $(info [*] MAKE $@) + $(Q)$(MAKE) --no-print-directory -C crack5gpu $(patsubst crack5gpu/%,%,$@) DESTDIR=$(MYDESTDIR) + +FORCE: # Dummy target to force remake in the subdirectories, even if files exist (this Makefile doesn't know about the prerequisites) + +.phony: crack2 crack3 crack4 crack5 crack5gpu FORCE diff --git a/tools/hitag2crack/common/ht2crackutils.h b/tools/hitag2crack/common/ht2crackutils.h index 41c3a07c2..16f4fab5b 100644 --- a/tools/hitag2crack/common/ht2crackutils.h +++ b/tools/hitag2crack/common/ht2crackutils.h @@ -1,3 +1,6 @@ +#ifndef HT2CRACKUTILS_H +#define HT2CRACKUTILS_H + #include #include #include @@ -41,3 +44,5 @@ void buildlfsr(Hitag_State *hstate); #define rev64(X) (rev32(X) + (rev32(X >> 32) << 32)) unsigned long hexreversetoulong(char *hex); unsigned long long hexreversetoulonglong(char *hex); + +#endif /* HT2CRACKUTILS_H */ diff --git a/tools/hitag2crack/crack2/Makefile b/tools/hitag2crack/crack2/Makefile index 4794d6ec4..e8dbc4bac 100644 --- a/tools/hitag2crack/crack2/Makefile +++ b/tools/hitag2crack/crack2/Makefile @@ -1,23 +1,22 @@ -CFLAGS?=-Wall -Werror -O3 -# Linux libs -LIBS=-pthread -D_GNU_SOURCE -# Mac libs -# LIBS= -VPATH=../common -INC=-I ../common +MYSRCPATHS = ../common +MYSRCS = ht2crackutils.c hitagcrypto.c +MYINCLUDES =-I ../common +MYCFLAGS = -D_GNU_SOURCE +MYDEFS = +MYLDLIBS = -lpthread -all: ht2crack2buildtable.c ht2crack2search.c ht2crack2gentest.c hitagcrypto.o ht2crackutils.o - $(CC) $(CFLAGS) $(INC) -o ht2crack2buildtable ht2crack2buildtable.c hitagcrypto.o ht2crackutils.o $(LIBS) - $(CC) $(CFLAGS) $(INC) -o ht2crack2search ht2crack2search.c hitagcrypto.o ht2crackutils.o $(LIBS) - $(CC) $(CFLAGS) $(INC) -o ht2crack2gentest ht2crack2gentest.c hitagcrypto.o ht2crackutils.o $(LIBS) +BINS = ht2crack2buildtable ht2crack2search ht2crack2gentest +INSTALLTOOLS = $(BINS) -ht2crackutils.o: ht2crackutils.c ht2crackutils.h - $(CC) $(CFLAGS) -c $< +include ../../../Makefile.host -hitagcrypto.o: hitagcrypto.c hitagcrypto.h - $(CC) $(CFLAGS) -c $< +# checking platform can be done only after Makefile.host +ifneq (,$(findstring MINGW,$(platform))) + # Mingw uses by default Microsoft printf, we want the GNU printf (e.g. for %z) + # and setting _ISOC99_SOURCE sets internally __USE_MINGW_ANSI_STDIO=1 + CFLAGS += -D_ISOC99_SOURCE +endif -clean: - rm -rf *.o ht2crack2buildtable ht2crack2search ht2crack2gentest - -fresh: clean all +ht2crack2buildtable : $(OBJDIR)/ht2crack2buildtable.o $(MYOBJS) +ht2crack2search : $(OBJDIR)/ht2crack2search.o $(MYOBJS) +ht2crack2gentest : $(OBJDIR)/ht2crack2gentest.o $(MYOBJS) diff --git a/tools/hitag2crack/crack2/ht2crack2buildtable.c b/tools/hitag2crack/crack2/ht2crack2buildtable.c index 8bf67a8ac..c45768998 100644 --- a/tools/hitag2crack/crack2/ht2crack2buildtable.c +++ b/tools/hitag2crack/crack2/ht2crack2buildtable.c @@ -4,7 +4,7 @@ */ #include "ht2crackutils.h" - +#include // DATAMAX is the size of each bucket (bytes). There are 65536 buckets so choose a value such that // DATAMAX * 65536 < RAM available. For ex, if you want to use 12GB of RAM (for a 16GB machine @@ -53,63 +53,63 @@ uint64_t d2[48]; int nsteps2; // create table entry -void create_table(struct table *t, int d1, int d2) { - if (!t) { +static void create_table(struct table *tt, int d_1, int d_2) { + if (!tt) { printf("create_table: t is NULL\n"); exit(1); } // create some space - t->data = (unsigned char *)malloc(DATAMAX); - if (!(t->data)) { + tt->data = (unsigned char *)malloc(DATAMAX); + if (!(tt->data)) { printf("create_table: cannot malloc data\n"); exit(1); } // set data ptr to start of data table - t->ptr = t->data; + tt->ptr = tt->data; // init the mutex - if (pthread_mutex_init(&(t->mutex), NULL)) { + if (pthread_mutex_init(&(tt->mutex), NULL)) { printf("create_table: cannot init mutex\n"); exit(1); } // create the path -// sprintf(t->path, "/Volumes/2tb/%02X/%02X.bin", d1 & 0xff, d2 & 0xff); - sprintf(t->path, "table/%02x/%02x.bin", d1 & 0xff, d2 & 0xff); +// sprintf(tt->path, "/Volumes/2tb/%02X/%02X.bin", d_1 & 0xff, d_2 & 0xff); + sprintf(tt->path, "table/%02x/%02x.bin", d_1 & 0xff, d_2 & 0xff); } // create all table entries -void create_tables(struct table *t) { +static void create_tables(struct table *tt) { int i, j; - if (!t) { + if (!tt) { printf("create_tables: t is NULL\n"); exit(1); } for (i = 0; i < 0x100; i++) { for (j = 0; j < 0x100; j++) { - create_table(t + ((i * 0x100) + j), i, j); + create_table(tt + ((i * 0x100) + j), i, j); } } } // free the table memory -void free_tables(struct table *t) { +static void free_tables(struct table *tt) { int i; struct table *ttmp; - if (!t) { + if (!tt) { printf("free_tables: t is NULL\n"); exit(1); } for (i = 0; i < 0x10000; i++) { - ttmp = t + i; + ttmp = tt + i; free(ttmp->data); } } @@ -117,7 +117,7 @@ void free_tables(struct table *t) { // write (partial) table to file -void writetable(struct table *t1) { +static void writetable(struct table *t1) { int fd; if (debug) printf("writetable %s\n", t1->path); @@ -142,7 +142,7 @@ void writetable(struct table *t1) { // store value in table -void store(unsigned char *data) { +static void store(unsigned char *data) { unsigned char d_1, d_2; int offset; struct table *t1; @@ -194,7 +194,7 @@ void store(unsigned char *data) { } // writes the ks (keystream) and s (state) -void write_ks_s(uint32_t ks1, uint32_t ks2, uint64_t shiftreg) { +static void write_ks_s(uint32_t ks1, uint32_t ks2, uint64_t shiftreg) { unsigned char buf[16]; // create buffer @@ -209,7 +209,7 @@ void write_ks_s(uint32_t ks1, uint32_t ks2, uint64_t shiftreg) { // builds the di table for jumping -void builddi(int steps, int table) { +static void builddi(int steps, int table) { uint64_t statemask; int i; Hitag_State mystate; @@ -241,7 +241,7 @@ void builddi(int steps, int table) { } // jump function - quickly jumps a load of steps -void jumpnsteps(Hitag_State *hstate, int table) { +static void jumpnsteps(Hitag_State *hstate, int table) { uint64_t output = 0; uint64_t bitmask; int i; @@ -277,14 +277,14 @@ void jumpnsteps(Hitag_State *hstate, int table) { // thread to build a part of the table -void *buildtable(void *d) { +static void *buildtable(void *dd) { Hitag_State hstate; Hitag_State hstate2; unsigned long i; unsigned long maxentries = 1; uint32_t ks1; uint32_t ks2; - int index = (int)(long)d; + int index = (int)(long)dd; int tnum = NUM_BUILD_THREADS; /* set random state */ @@ -334,7 +334,7 @@ void *buildtable(void *d) { // make 'table/' (unsorted) and 'sorted/' dir structures -void makedirs() { +static void makedirs(void) { char path[32]; int i; @@ -368,7 +368,7 @@ static int datacmp(const void *p1, const void *p2, void *dummy) { return memcmp(d_1, d_2, DATASIZE); } -void *sorttable(void *d) { +static void *sorttable(void *dd) { int i, j; int fdin; int fdout; @@ -378,7 +378,7 @@ void *sorttable(void *d) { struct stat filestat; unsigned char *table = NULL; uint64_t numentries = 0; - int index = (int)(long)d; + int index = (int)(long)dd; int space = 0x100 / NUM_SORT_THREADS; // create table - 50MB should be enough diff --git a/tools/hitag2crack/crack2/ht2crack2gentest.c b/tools/hitag2crack/crack2/ht2crack2gentest.c index 0f255a5b6..cc8d1e94e 100644 --- a/tools/hitag2crack/crack2/ht2crack2gentest.c +++ b/tools/hitag2crack/crack2/ht2crack2gentest.c @@ -5,7 +5,7 @@ #include "ht2crackutils.h" -int makerandom(char *hex, unsigned int len, int fd) { +static int makerandom(char *hex, unsigned int len, int fd) { unsigned char raw[32]; int i; @@ -43,7 +43,7 @@ int main(int argc, char *argv[]) { int urandomfd; if (argc < 2) { - printf("ht2crack2gentest number\n"); + printf("%s number\n", argv[0]); exit(1); } diff --git a/tools/hitag2crack/crack2/ht2crack2search.c b/tools/hitag2crack/crack2/ht2crack2search.c index 16a2e00b8..d339f878f 100644 --- a/tools/hitag2crack/crack2/ht2crack2search.c +++ b/tools/hitag2crack/crack2/ht2crack2search.c @@ -23,7 +23,7 @@ static int datacmp(const void *p1, const void *p2) { return memcmp(d1, d2, DATASIZE - 6); } -int loadrngdata(struct rngdata *r, char *file) { +static int loadrngdata(struct rngdata *r, char *file) { int fd; int i, j; int nibble; @@ -90,7 +90,7 @@ int loadrngdata(struct rngdata *r, char *file) { return 1; } -int makecand(unsigned char *c, struct rngdata *r, int bitoffset) { +static int makecand(unsigned char *c, struct rngdata *r, int bitoffset) { int bytenum; int bitnum; int i; @@ -116,7 +116,7 @@ int makecand(unsigned char *c, struct rngdata *r, int bitoffset) { // test the candidate against the next or previous rng data -int testcand(unsigned char *f, unsigned char *rt, int fwd) { +static int testcand(unsigned char *f, unsigned char *rt, int fwd) { Hitag_State hstate; int i; uint32_t ks1; @@ -154,7 +154,7 @@ int testcand(unsigned char *f, unsigned char *rt, int fwd) { } } -int searchcand(unsigned char *c, unsigned char *rt, int fwd, unsigned char *m, unsigned char *s) { +static int searchcand(unsigned char *c, unsigned char *rt, int fwd, unsigned char *m, unsigned char *s) { int fd; struct stat filestat; char file[64]; @@ -222,7 +222,7 @@ int searchcand(unsigned char *c, unsigned char *rt, int fwd, unsigned char *m, u } -int findmatch(struct rngdata *r, unsigned char *outmatch, unsigned char *outstate, int *bitoffset) { +static int findmatch(struct rngdata *r, unsigned char *outmatch, unsigned char *outstate, int *bitoffset) { int i; int bitlen; unsigned char cand[6]; @@ -276,7 +276,7 @@ int findmatch(struct rngdata *r, unsigned char *outmatch, unsigned char *outstat -void rollbackrng(Hitag_State *hstate, unsigned char *s, int offset) { +static void rollbackrng(Hitag_State *hstate, unsigned char *s, int offset) { int i; if (!s) { @@ -305,7 +305,7 @@ void rollbackrng(Hitag_State *hstate, unsigned char *s, int offset) { } -uint64_t recoverkey(Hitag_State *hstate, char *uidstr, char *nRstr) { +static uint64_t recoverkey(Hitag_State *hstate, char *uidstr, char *nRstr) { uint64_t key; uint64_t keyupper; uint32_t uid; @@ -368,7 +368,7 @@ int main(int argc, char *argv[]) { int i; if (argc < 4) { - printf("ht2crack2search rngdatafile UID nR\n"); + printf("%s rngdatafile UID nR\n", argv[0]); exit(1); } diff --git a/tools/hitag2crack/crack3/.gitignore b/tools/hitag2crack/crack3/.gitignore index c993f2fe3..adf433d08 100644 --- a/tools/hitag2crack/crack3/.gitignore +++ b/tools/hitag2crack/crack3/.gitignore @@ -1,6 +1,5 @@ ht2crack3 -ht2test +ht2crack3test ht2crack3.exe -ht2test.exe - +ht2crack3test.exe diff --git a/tools/hitag2crack/crack3/Makefile b/tools/hitag2crack/crack3/Makefile index 318b5db78..010b6151c 100644 --- a/tools/hitag2crack/crack3/Makefile +++ b/tools/hitag2crack/crack3/Makefile @@ -1,19 +1,21 @@ -CFLAGS?=-Wall -Werror -O3 -LIBS= -VPATH=../common -INC=-I ../common +MYSRCPATHS = ../common +MYSRCS = ht2crackutils.c hitagcrypto.c +MYINCLUDES =-I ../common +MYCFLAGS = -D_GNU_SOURCE +MYDEFS = +MYLDLIBS = -lpthread -all: ht2crack3.c ht2test.c hitagcrypto.o ht2crackutils.o - $(CC) $(CFLAGS) $(INC) -o ht2crack3 $< hitagcrypto.o ht2crackutils.o -lpthread $(LIBS) - $(CC) $(CFLAGS) $(INC) -o ht2test ht2test.c hitagcrypto.o ht2crackutils.o $(LIBS) +BINS = ht2crack3 ht2crack3test +INSTALLTOOLS = $(BINS) -ht2crackutils.o: ht2crackutils.c ht2crackutils.h - $(CC) $(CFLAGS) -c $< +include ../../../Makefile.host -hitagcrypto.o: hitagcrypto.c hitagcrypto.h - $(CC) $(CFLAGS) -c $< +# checking platform can be done only after Makefile.host +ifneq (,$(findstring MINGW,$(platform))) + # Mingw uses by default Microsoft printf, we want the GNU printf (e.g. for %z) + # and setting _ISOC99_SOURCE sets internally __USE_MINGW_ANSI_STDIO=1 + CFLAGS += -D_ISOC99_SOURCE +endif -clean: - rm -rf *.o ht2crack3 ht2test - -fresh: clean all +ht2crack3 : $(OBJDIR)/ht2crack3.o $(MYOBJS) +ht2crack3test : $(OBJDIR)/ht2crack3test.o $(MYOBJS) diff --git a/tools/hitag2crack/crack3/README.md b/tools/hitag2crack/crack3/README.md index 57d5d2aa8..955775a62 100644 --- a/tools/hitag2crack/crack3/README.md +++ b/tools/hitag2crack/crack3/README.md @@ -31,9 +31,9 @@ Tests If you happen to know the key and want to check that all your nR aR values are valid (for high-powered demonstrations only, really) then you can use -the ht2test program to check them. It's otherwise massively pointless and a +the ht2crack3test program to check them. It's otherwise massively pointless and a complete waste of space. ``` -./ht2test NRARFILE KEY UID +./ht2crack3test NRARFILE KEY UID ``` diff --git a/tools/hitag2crack/crack3/ht2crack3.c b/tools/hitag2crack/crack3/ht2crack3.c index 4f481fbf7..b54c7b000 100644 --- a/tools/hitag2crack/crack3/ht2crack3.c +++ b/tools/hitag2crack/crack3/ht2crack3.c @@ -65,7 +65,7 @@ static uint32_t hitag2_crypt(uint64_t s) { // this function is a modification of the filter function f, based heavily // on the hitag2_crypt function in Rfidler -int fnP(uint64_t klowery) { +static int fnP(uint64_t klowery) { const uint32_t ht2_function4a = 0x2C79; // 0010 1100 0111 1001 const uint32_t ht2_function4b = 0x6671; // 0110 0110 0111 0001 const uint32_t ht2_function4p = 0xAE83; // 1010 1110 1000 0011 @@ -84,7 +84,7 @@ int fnP(uint64_t klowery) { } // comparison function for sorting/searching Tklower entries -int Tk_cmp(const void *v1, const void *v2) { +static int Tk_cmp(const void *v1, const void *v2) { const struct Tklower *Tk1 = (struct Tklower *)v1; const struct Tklower *Tk2 = (struct Tklower *)v2; @@ -98,7 +98,7 @@ int Tk_cmp(const void *v1, const void *v2) { } // test for bad guesses of kmiddle -int is_kmiddle_badguess(uint64_t z, struct Tklower *Tk, int max, int aR0) { +static int is_kmiddle_badguess(uint64_t z, struct Tklower *Tk, int max, int aR0) { struct Tklower *result, target; @@ -122,7 +122,7 @@ int is_kmiddle_badguess(uint64_t z, struct Tklower *Tk, int max, int aR0) { } // function to test if a partial key is valid -int testkey(uint64_t *out, uint64_t uid, uint64_t pkey, uint64_t nR, uint64_t aR) { +static int testkey(uint64_t *out, uint64_t uid, uint64_t pkey, uint64_t nR, uint64_t aR) { uint64_t kupper; uint64_t key; Hitag_State hstate; @@ -178,7 +178,7 @@ int testkey(uint64_t *out, uint64_t uid, uint64_t pkey, uint64_t nR, uint64_t aR // effectively work out candidates for the lower 34 bits of the key. -void *crack(void *d) { +static void *crack(void *d) { struct threaddata *data = (struct threaddata *)d; uint64_t uid; struct nRaR *TnRaR; @@ -321,7 +321,7 @@ int main(int argc, char *argv[]) { struct threaddata *tdata = NULL; if (argc < 3) { - printf("ht2crack3 uid nRaRfile\n"); + printf("%s uid nRaRfile\n", argv[0]); exit(1); } diff --git a/tools/hitag2crack/crack3/ht2test.c b/tools/hitag2crack/crack3/ht2crack3test.c similarity index 96% rename from tools/hitag2crack/crack3/ht2test.c rename to tools/hitag2crack/crack3/ht2crack3test.c index 53d47cfca..8d48cc914 100644 --- a/tools/hitag2crack/crack3/ht2test.c +++ b/tools/hitag2crack/crack3/ht2crack3test.c @@ -19,7 +19,7 @@ int main(int argc, char *argv[]) { char *uid; if (argc < 4) { - printf("ht2test nRaRfile KEY UID\n"); + printf("%s nRaRfile KEY UID\n", argv[0]); exit(1); } diff --git a/tools/hitag2crack/crack4/Makefile b/tools/hitag2crack/crack4/Makefile index b560577bd..1c7298840 100644 --- a/tools/hitag2crack/crack4/Makefile +++ b/tools/hitag2crack/crack4/Makefile @@ -1,18 +1,20 @@ -CFLAGS?=-Wall -Werror -O3 -LIBS=-lpthread -VPATH=../common -INC=-I ../common +MYSRCPATHS = ../common +MYSRCS = ht2crackutils.c hitagcrypto.c +MYINCLUDES =-I ../common +MYCFLAGS = -D_GNU_SOURCE +MYDEFS = +MYLDLIBS = -lpthread -all: ht2crack4.c hitagcrypto.o ht2crackutils.o - $(CC) $(CFLAGS) $(INC) -o ht2crack4 $< hitagcrypto.o ht2crackutils.o $(LIBS) +BINS = ht2crack4 +INSTALLTOOLS = $(BINS) -hitagcrypto.o: hitagcrypto.c hitagcrypto.h - $(CC) $(CFLAGS) -c $< +include ../../../Makefile.host -ht2crackutils.o: ht2crackutils.c ht2crackutils.h - $(CC) $(CFLAGS) -c $< +# checking platform can be done only after Makefile.host +ifneq (,$(findstring MINGW,$(platform))) + # Mingw uses by default Microsoft printf, we want the GNU printf (e.g. for %z) + # and setting _ISOC99_SOURCE sets internally __USE_MINGW_ANSI_STDIO=1 + CFLAGS += -D_ISOC99_SOURCE +endif -clean: - rm -rf *.o ht2crack4 - -fresh: clean all +ht2crack4 : $(OBJDIR)/ht2crack4.o $(MYOBJS) diff --git a/tools/hitag2crack/crack4/ht2crack4.c b/tools/hitag2crack/crack4/ht2crack4.c index 4c923737f..e630a956f 100644 --- a/tools/hitag2crack/crack4/ht2crack4.c +++ b/tools/hitag2crack/crack4/ht2crack4.c @@ -93,7 +93,7 @@ uint64_t uid; int maxtablesize = 800000; uint64_t supplied_testkey = 0; -void usage() { +static void usage(void) { printf("ht2crack4 - K Sheldrake, based on the work of Garcia et al\n\n"); printf("Cracks a HiTag2 key using a small number (4 to 16) of encrypted\n"); printf("nonce and challenge response pairs, using a fast correlation\n"); @@ -147,6 +147,7 @@ double pfnc[][16] = { /* hitag2_crypt works on the post-shifted form of the lfsr; this is the ref in rfidler code */ +/* static uint32_t hitag2_crypt(uint64_t s) { uint32_t bitindex; @@ -158,9 +159,10 @@ static uint32_t hitag2_crypt(uint64_t s) { return (ht2_function5c >> bitindex) & 1; } +*/ /* ht2crypt works on the pre-shifted form of the lfsr; this is the ref in the paper */ -uint64_t ht2crypt(uint64_t s) { +static uint64_t ht2crypt(uint64_t s) { uint64_t bitindex; bitindex = (ht2_function4a >> pickbits2_2(s, 2, 5)) & 1; @@ -174,12 +176,13 @@ uint64_t ht2crypt(uint64_t s) { /* fnL is the feedback function for the reference code */ -uint64_t fnL(uint64_t x) { +/* +static uint64_t fnL(uint64_t x) { return (bitn(x, 0) ^ bitn(x, 2) ^ bitn(x, 3) ^ bitn(x, 6) ^ bitn(x, 7) ^ bitn(x, 8) ^ bitn(x, 16) ^ bitn(x, 22) ^ bitn(x, 23) ^ bitn(x, 26) ^ bitn(x, 30) ^ bitn(x, 41) ^ bitn(x, 42) ^ bitn(x, 43) ^ bitn(x, 46) ^ bitn(x, 47)); } - +*/ /* packed_size is an array that maps the number of confirmed bits in a state to * the number of relevant bits. @@ -193,7 +196,7 @@ unsigned int packed_size[] = { 0, 0, 0, 1, 2, 2, 3, 4, 4, 5, 5, 5, 5 /* f20 is the same as hitag2_crypt except it works on the packed version * of the state where all 20 relevant bits are squashed together */ -uint64_t f20(uint64_t y) { +static uint64_t f20(uint64_t y) { uint64_t bitindex; bitindex = (ht2_function4a >> (y & 0xf)) & 1; @@ -207,7 +210,7 @@ uint64_t f20(uint64_t y) { /* packstate packs the relevant bits from LFSR state into 20 bits for pre-shifted lfsr */ -uint64_t packstate(uint64_t s) { +static uint64_t packstate(uint64_t s) { uint64_t packed; packed = pickbits2_2(s, 2, 5); @@ -221,7 +224,7 @@ uint64_t packstate(uint64_t s) { /* create_guess_table mallocs the tables */ -void create_guess_table() { +static void create_guess_table(void) { guesses = (struct guess *)malloc(sizeof(struct guess) * maxtablesize); if (!guesses) { printf("cannot malloc guess table\n"); @@ -232,7 +235,7 @@ void create_guess_table() { /* init the guess table by reading in the encrypted nR,aR values and * setting the first 2^16 key guesses */ -void init_guess_table(char *filename, char *uidstr) { +static void init_guess_table(char *filename, char *uidstr) { unsigned int i, j; FILE *fp; char *buf = NULL; @@ -313,7 +316,7 @@ void init_guess_table(char *filename, char *uidstr) { /* bit_score calculates the ratio of partial states that could generate * the resulting bit b to all possible states * size is the number of confirmed bits in the state */ -double bit_score(uint64_t s, uint64_t size, uint64_t b) { +static double bit_score(uint64_t s, uint64_t size, uint64_t b) { uint64_t packed; uint64_t chopped; unsigned int n; @@ -396,7 +399,7 @@ double bit_score(uint64_t s, uint64_t size, uint64_t b) { * bit_scores together until no bits remain. bit_scores are * multiplied by the number of relevant bits in the scored state * to give weight to more complete states. */ -double score(uint64_t s, unsigned int size, uint64_t ks, unsigned int kssize) { +static double score(uint64_t s, unsigned int size, uint64_t ks, unsigned int kssize) { double sc, sc2; if ((size == 1) || (kssize == 1)) { @@ -427,7 +430,7 @@ double score(uint64_t s, unsigned int size, uint64_t ks, unsigned int kssize) { /* score_traces runs score for each encrypted nonce */ -void score_traces(struct guess *g, unsigned int size) { +static void score_traces(struct guess *g, unsigned int size) { uint64_t lfsr; unsigned int i; double sc; @@ -481,7 +484,7 @@ void score_all_traces(unsigned int size) */ /* score_some_traces runs score_traces for every key guess in a section of the table */ -void *score_some_traces(void *data) { +static void *score_some_traces(void *data) { unsigned int i; struct thread_data *tdata = (struct thread_data *)data; @@ -494,7 +497,7 @@ void *score_some_traces(void *data) { /* score_all_traces runs score_traces for every key guess in the table */ -void score_all_traces(unsigned int size) { +static void score_all_traces(unsigned int size) { pthread_t threads[NUM_THREADS]; void *status; struct thread_data tdata[NUM_THREADS]; @@ -535,7 +538,7 @@ void score_all_traces(unsigned int size) { /* cmp_guess is the comparison function for qsorting the guess table */ -int cmp_guess(const void *a, const void *b) { +static int cmp_guess(const void *a, const void *b) { struct guess *a1 = (struct guess *)a; struct guess *b1 = (struct guess *)b; @@ -552,7 +555,7 @@ int cmp_guess(const void *a, const void *b) { /* expand all guesses in first half of (sorted) table by * copying them into the second half and extending the copied * ones with an extra 1, leaving the first half with an extra 0 */ -void expand_guesses(unsigned int halfsize, unsigned int size) { +static void expand_guesses(unsigned int halfsize, unsigned int size) { unsigned int i, j; for (i = 0; i < halfsize; i++) { @@ -567,7 +570,7 @@ void expand_guesses(unsigned int halfsize, unsigned int size) { /* checks if the supplied test key is still in the table, which * is useful when testing different scoring methods */ -void check_supplied_testkey(unsigned int size) { +static void check_supplied_testkey(unsigned int size) { uint64_t partkey; unsigned int i; @@ -586,7 +589,7 @@ void check_supplied_testkey(unsigned int size) { /* execute_round scores the guesses, sorts them and expands the good half */ -void execute_round(unsigned int size) { +static void execute_round(unsigned int size) { unsigned int halfsize; // score all the current guesses @@ -614,7 +617,7 @@ void execute_round(unsigned int size) { /* crack is the main cracking algo; it executes the rounds */ -void crack() { +static void crack(void) { unsigned int i; uint64_t revkey; uint64_t foundkey; @@ -630,9 +633,9 @@ void crack() { } } - /* test function to make sure I know how the LFSR works */ -void testkey(uint64_t key) { +/* +static void testkey(uint64_t key) { uint64_t i; uint64_t b0to31 = 0; uint64_t ks = 0; @@ -689,10 +692,11 @@ void testkey(uint64_t key) { printbin2(lfsr, 48); printf("\n\n"); } - +*/ /* test function to generate test data */ -void gen_bitstreams_testks(struct guess *g, uint64_t key) { +/* +static void gen_bitstreams_testks(struct guess *g, uint64_t key) { unsigned int i, j; uint64_t nRxorkey, lfsr, ks; @@ -730,10 +734,11 @@ void gen_bitstreams_testks(struct guess *g, uint64_t key) { } } } - +*/ /* test function */ -void test() { +/* +static void test(void) { uint64_t lfsr; uint64_t packed; @@ -751,10 +756,10 @@ void test() { printf("test done\n"); } - +*/ /* check_key tests the potential key against an encrypted nonce, ks pair */ -int check_key(uint64_t key, uint64_t enc_nR, uint64_t ks) { +static int check_key(uint64_t key, uint64_t enc_nR, uint64_t ks) { Hitag_State hstate; uint64_t bits; int i; diff --git a/tools/hitag2crack/crack5/Makefile b/tools/hitag2crack/crack5/Makefile index 9d19b63ee..8fc46e838 100644 --- a/tools/hitag2crack/crack5/Makefile +++ b/tools/hitag2crack/crack5/Makefile @@ -1,17 +1,20 @@ -CFLAGS?=-Wall -Werror -O3 -LIBS=-lpthread -VPATH=../common -INC=-I ../common +MYSRCPATHS = ../common +MYSRCS = ht2crackutils.c hitagcrypto.c +MYINCLUDES =-I ../common +MYCFLAGS = +MYDEFS = +MYLDLIBS = -lpthread -all: ht2crack5.c ht2crackutils.o hitagcrypto.o - $(CC) $(CFLAGS) $(INC) -O3 $< -o ht2crack5 ht2crackutils.o hitagcrypto.o $(LIBS) +BINS = ht2crack5 +INSTALLTOOLS = $(BINS) -hitagcrypto.o: hitagcrypto.c hitagcrypto.h - $(CC) $(CFLAGS) -c $< +include ../../../Makefile.host -ht2crackutils.o: ht2crackutils.c ht2crackutils.h - $(CC) $(CFLAGS) -c $< +# checking platform can be done only after Makefile.host +ifneq (,$(findstring MINGW,$(platform))) + # Mingw uses by default Microsoft printf, we want the GNU printf (e.g. for %z) + # and setting _ISOC99_SOURCE sets internally __USE_MINGW_ANSI_STDIO=1 + CFLAGS += -D_ISOC99_SOURCE +endif -clean: - rm -f *.o ht2crack5 -fresh: clean all +ht2crack5 : $(OBJDIR)/ht2crack5.o $(MYOBJS) diff --git a/tools/hitag2crack/crack5/ht2crack5.c b/tools/hitag2crack/crack5/ht2crack5.c index d07d03b64..a92afc854 100644 --- a/tools/hitag2crack/crack5/ht2crack5.c +++ b/tools/hitag2crack/crack5/ht2crack5.c @@ -55,7 +55,7 @@ bitslice_t bs_zeroes, bs_ones; #define get_bit(n, word) ((word >> (n)) & 1) #define get_vector_bit(slice, value) get_bit(slice&0x3f, value.bytes64[slice>>6]) -const uint64_t expand(uint64_t mask, uint64_t value) { +static uint64_t expand(uint64_t mask, uint64_t value) { uint64_t fill = 0; for (uint64_t bit_index = 0; bit_index < 48; bit_index++) { if (mask & 1) { @@ -67,7 +67,7 @@ const uint64_t expand(uint64_t mask, uint64_t value) { return fill; } -void bitslice(const uint64_t value, bitslice_t *restrict bitsliced_value, const size_t bit_len, bool reverse) { +static void bitslice(const uint64_t value, bitslice_t *restrict bitsliced_value, const size_t bit_len, bool reverse) { size_t bit_idx; for (bit_idx = 0; bit_idx < bit_len; bit_idx++) { bool bit; @@ -84,7 +84,7 @@ void bitslice(const uint64_t value, bitslice_t *restrict bitsliced_value, const } } -const uint64_t unbitslice(const bitslice_t *restrict b, const uint8_t s, const uint8_t n) { +static uint64_t unbitslice(const bitslice_t *restrict b, const uint8_t s, const uint8_t n) { uint64_t result = 0; for (uint8_t i = 0; i < n; ++i) { result <<= 1; @@ -118,7 +118,7 @@ bitslice_t initial_bitslices[48]; size_t filter_pos[20] = {4, 7, 9, 13, 16, 18, 22, 24, 27, 30, 32, 35, 45, 47 }; size_t thread_count = 8; uint64_t layer_0_found; -void *find_state(void *thread_d); +static void *find_state(void *thread_d); static void try_state(uint64_t s); int main(int argc, char *argv[]) { @@ -201,7 +201,7 @@ int main(int argc, char *argv[]) { exit(1); } -void *find_state(void *thread_d) { +static void *find_state(void *thread_d) { uint64_t thread = (uint64_t)thread_d; for (uint64_t index = thread; index < layer_0_found; index += thread_count) { diff --git a/tools/hitag2crack/crack5gpu/Makefile b/tools/hitag2crack/crack5gpu/Makefile index b88fa00e8..57e44641f 100644 --- a/tools/hitag2crack/crack5gpu/Makefile +++ b/tools/hitag2crack/crack5gpu/Makefile @@ -1,23 +1,27 @@ -CFLAGS?=-Wall -#INCLUDE=-I/usr/local/cuda-7.5/include -INCLUDE=-I/opt/nvidia/cuda/include -#Linux -#LIBS=-L/usr/local/cuda-7.5/lib64 -lOpenCL -LIBS=-L/opt/nvidia/cuda/lib64 -lOpenCL -#Mac -#LIBS=-framework OpenCL -VPATH=../common -INC=-I ../common +MYSRCPATHS = ../common +MYSRCS = ht2crackutils.c hitagcrypto.c +MYCFLAGS = +MYDEFS = +ifeq ($(platform),Darwin) + MYLDLIBS ?= -framework OpenCL +else + #MYINCLUDES ?=-I/usr/local/cuda-7.5/include + #MYINCLUDES ?=-I/opt/nvidia/cuda/include + #MYLDLIBS ?= -L/usr/local/cuda-7.5/lib64 -lOpenCL + MYLDLIBS ?= -L/opt/nvidia/cuda/lib64 -lOpenCL +endif +MYINCLUDES +=-I ../common -all: ht2crack5.c ht2crackutils.o hitagcrypto.o - $(CC) $(CFLAGS) $(INC) -o ht2crack5gpu $< ht2crackutils.o hitagcrypto.o $(LIBS) -lpthread +BINS = ht2crack5gpu +INSTALLTOOLS = $(BINS) -hitagcrypto.o: hitagcrypto.c hitagcrypto.h - $(CC) $(CFLAGS) $(INCLUDE) -c $< +include ../../../Makefile.host -ht2crackutils.o: ht2crackutils.c ht2crackutils.h - $(CC) $(CFLAGS) $(INCLUDE) -c $< +# checking platform can be done only after Makefile.host +ifneq (,$(findstring MINGW,$(platform))) + # Mingw uses by default Microsoft printf, we want the GNU printf (e.g. for %z) + # and setting _ISOC99_SOURCE sets internally __USE_MINGW_ANSI_STDIO=1 + CFLAGS += -D_ISOC99_SOURCE +endif -clean: - rm -f *.o ht2crack5gpu -fresh: clean all +ht2crack5gpu : $(OBJDIR)/ht2crack5gpu.o $(MYOBJS) diff --git a/tools/hitag2crack/crack5gpu/ht2crack5.c b/tools/hitag2crack/crack5gpu/ht2crack5gpu.c similarity index 98% rename from tools/hitag2crack/crack5gpu/ht2crack5.c rename to tools/hitag2crack/crack5gpu/ht2crack5gpu.c index cfacecc98..8cb720540 100644 --- a/tools/hitag2crack/crack5gpu/ht2crack5.c +++ b/tools/hitag2crack/crack5gpu/ht2crack5gpu.c @@ -65,7 +65,7 @@ bitslice_t bs_zeroes, bs_ones; state[-2+i+42].value ^ state[-2+i+43].value ^ state[-2+i+46].value ^ state[-2+i+47].value); #define get_bit(n, word) ((word >> (n)) & 1) -const uint64_t expand(uint64_t mask, uint64_t value) { +static uint64_t expand(uint64_t mask, uint64_t value) { uint64_t fill = 0; for (uint64_t bit_index = 0; bit_index < 48; bit_index++) { if (mask & 1) { @@ -77,7 +77,7 @@ const uint64_t expand(uint64_t mask, uint64_t value) { return fill; } -void bitslice(const uint64_t value, bitslice_t *restrict bitsliced_value, const size_t bit_len, bool reverse) { +static void bitslice(const uint64_t value, bitslice_t *restrict bitsliced_value, const size_t bit_len, bool reverse) { size_t bit_idx; for (bit_idx = 0; bit_idx < bit_len; bit_idx++) { bool bit; @@ -123,7 +123,7 @@ struct context { }; -void runKernel(struct context *ctx, uint32_t cand_base, uint64_t *matches, uint32_t *matches_found) { +static void runKernel(struct context *ctx, uint32_t cand_base, uint64_t *matches, uint32_t *matches_found) { int err; size_t global[2]; diff --git a/tools/hitag2crack/hitag2_gen_nRaR.py b/tools/hitag2crack/hitag2_gen_nRaR.py new file mode 100755 index 000000000..14f48a26d --- /dev/null +++ b/tools/hitag2crack/hitag2_gen_nRaR.py @@ -0,0 +1,118 @@ +#!/usr/bin/env python3 + +""" +HITAG2 cipher +Implemented by Aram Verstegen +""" +import random + +def i4(x, a, b, c, d): + return (((x >> a) & 1)*8)+((x >> b) & 1)*4+((x >> c) & 1)*2+((x >> d) & 1) + + +def f20_4(state): + return ((0x3c65 >> i4(state,34,43,44,46)) & 1) + +def f20_3(state): + return (( 0xee5 >> i4(state,28,29,31,33)) & 1) + +def f20_2(state): + return (( 0xee5 >> i4(state,17,21,23,26)) & 1) + +def f20_1(state): + return (( 0xee5 >> i4(state, 8,12,14,15)) & 1) + +def f20_0(state): + return ((0x3c65 >> i4(state, 2, 3, 5, 6)) & 1) + +def f20_last(s0,s1,s2,s3,s4): + return (0xdd3929b >> ((s0 * 16) + + (s1 * 8) + + (s2 * 4) + + (s3 * 2) + + (s4 * 1))) & 1 + +def f20(state): + return f20_last(f20_0(state), f20_1(state), f20_2(state), f20_3(state), f20_4(state)) + +def lfsr_bs(state, i): + return (state[i+ 0] ^ state[i+ 2] ^ state[i+ 3] ^ state[i+ 6] ^ + state[i+ 7] ^ state[i+ 8] ^ state[i+16] ^ state[i+22] ^ + state[i+23] ^ state[i+26] ^ state[i+30] ^ state[i+41] ^ + state[i+42] ^ state[i+43] ^ state[i+46] ^ state[i+47]) + +def f20a_bs(a,b,c,d): + return (~(((a|b)&c)^(a|d)^b)) # 6 ops +def f20b_bs(a,b,c,d): + return (~(((d|c)&(a^b))^(d|a|b))) # 7 ops +def f20c_bs(a,b,c,d,e): + return (~((((((c^e)|d)&a)^b)&(c^b))^(((d^e)|a)&((d^b)|c)))) # 13 ops + +def filter_bs(state, i): + return (f20c_bs( f20a_bs(state[i+ 2],state[i+ 3],state[i+ 5],state[i+ 6]), + f20b_bs(state[i+ 8],state[i+12],state[i+14],state[i+15]), + f20b_bs(state[i+17],state[i+21],state[i+23],state[i+26]), + f20b_bs(state[i+28],state[i+29],state[i+31],state[i+33]), + f20a_bs(state[i+34],state[i+43],state[i+44],state[i+46]))) + +def unbitslice(s, n): + return int(''.join(map(str,map(int,map(bool,s[n:n+48])))[::-1]),2) + +def hitag2_init(key, uid, nonce): + state = 0 + for i in range(32, 48): + state = (state << 1) | ((key >> i) & 1) + for i in range(0, 32): + state = (state << 1) | ((uid >> i) & 1) + #print '%012x' % state + #print '%012x' % (int("{0:048b}".format(state)[::-1],2)) + for i in range(0, 32): + nonce_bit = (f20(state) ^ ((nonce >> (31-i)) & 1)) + #print nonce_bit + state = (state >> 1) | (((nonce_bit ^ (key >> (31-i))) & 1) << 47) + #print '%012x' % state + #print '%012x' % (int("{0:048b}".format(state)[::-1],2)) + return state + +def lfsr_feedback(state): + return (((state >> 0) ^ (state >> 2) ^ (state >> 3) + ^ (state >> 6) ^ (state >> 7) ^ (state >> 8) + ^ (state >> 16) ^ (state >> 22) ^ (state >> 23) + ^ (state >> 26) ^ (state >> 30) ^ (state >> 41) + ^ (state >> 42) ^ (state >> 43) ^ (state >> 46) + ^ (state >> 47)) & 1) +def lfsr(state): + return (state >> 1) + (lfsr_feedback(state) << 47) + +def lfsr_feedback_inv(state): + return (((state >> 47) ^ (state >> 1) ^ (state >> 2) + ^ (state >> 5) ^ (state >> 6) ^ (state >> 7) + ^ (state >> 15) ^ (state >> 21) ^ (state >> 22) + ^ (state >> 25) ^ (state >> 29) ^ (state >> 40) + ^ (state >> 41) ^ (state >> 42) ^ (state >> 45) + ^ (state >> 46)) & 1) + +def lfsr_inv(state): + return ((state << 1) + (lfsr_feedback_inv(state))) & ((1<<48)-1) + +def hitag2(state, length=48): + c = 0 + for i in range(0, length): + c = (c << 1) | f20(state) + #print '%012x' % state + #print '%012x' % (int("{0:048b}".format(state)[::-1],2)) + state = lfsr(state) + return c + +if __name__ == "__main__": + import sys + if len(sys.argv) == 4: + key = int(sys.argv[1], 16) + uid = int(sys.argv[2], 16) + n = int(sys.argv[3]) + for i in range(n): + nonce = random.randrange(2**32) + state = hitag2_init(key, uid, nonce) + print('%08X %08X' % (nonce, hitag2(state, 32)^0xffffffff)) + else: + print("Usage: python %s " % sys.argv[0]) diff --git a/tools/pm3_tests.sh b/tools/pm3_tests.sh index 8aaf82d58..89850e8bd 100755 --- a/tools/pm3_tests.sh +++ b/tools/pm3_tests.sh @@ -4,10 +4,12 @@ PM3PATH="$(dirname "$0")/.." cd "$PM3PATH" || exit 1 SLOWTESTS=false +GPUTESTS=false TESTALL=true TESTMFKEY=false TESTNONCE2KEY=false TESTMFNONCEBRUTE=false +TESTHITAG2CRACK=false TESTFPGACOMPRESS=false TESTBOOTROM=false TESTARMSRC=false @@ -32,6 +34,10 @@ Usage: $0 [--long] [--clientbin /path/to/proxmark3] [mfkey|nonce2key|mf_nonce_br SLOWTESTS=true shift ;; + --gpu) + GPUTESTS=true + shift + ;; --clientbin) if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then CLIENTBIN=$2 @@ -61,6 +67,11 @@ Usage: $0 [--long] [--clientbin /path/to/proxmark3] [mfkey|nonce2key|mf_nonce_br TESTFPGACOMPRESS=true shift ;; + hitag2crack) + TESTALL=false + TESTHITAG2CRACK=true + shift + ;; bootrom) TESTALL=false TESTBOOTROM=true @@ -122,24 +133,45 @@ function CheckFileExist() { return 1 } -# title, command line, check result, repeat several times if failed, ignore if fail +# [slow] [gpu] [retry] [ignore] <command_line> <check_result_regex> +# slow: test takes more than ~5s +# gpu: test requires GPU presence +# retry: test repeated up to 3 times in case of failure +# ignore: test failure is not fatal function CheckExecute() { if [ "$1" == "slow" ]; then - SLOWTEST=true + local SLOWTEST=true shift else - SLOWTEST=false + local SLOWTEST=false fi - if [ "$4" ]; then + if [ "$1" == "gpu" ]; then + local GPUTEST=true + shift + else + local GPUTEST=false + fi + if [ "$1" == "retry" ]; then local RETRY="1 2 3 e" + shift else local RETRY="e" fi + if [ "$1" == "ignore" ]; then + local IGNOREFAILURE=true + shift + else + local IGNOREFAILURE=false + fi if $SLOWTEST && ! $SLOWTESTS; then echo -e "$1 ${C_YELLOW}[SKIPPED]${C_NC} (slow)\n" return 0 fi + if $GPUTEST && ! $GPUTESTS; then + echo -e "$1 ${C_YELLOW}[SKIPPED]${C_NC} (gpu)\n" + return 0 + fi for I in $RETRY do @@ -151,7 +183,7 @@ function CheckExecute() { if [ ! $I == "e" ]; then echo "retry $I"; fi done - if [ "$5" ]; then + if $IGNOREFAILURE; then echo -e "$1 ${C_YELLOW}[Ignored]${C_NC}" return 0 fi @@ -227,6 +259,54 @@ while true; do if ! CheckFileExist "mf_nonce_brute exists" "$MFNONCEBRUTEBIN"; then break; fi if ! CheckExecute slow "mf_nonce_brute test" "$MFNONCEBRUTEBIN 9c599b32 5a920d85 1011 98d76b77 d6c6e870 0000 ca7e0b63 0111 3e709c8a" "Key.*: \[ffffffffffff\]"; then break; fi fi + # hitag2crack not yet part of "all" + # if $TESTALL || $TESTHITAG2CRACK; then + if $TESTHITAG2CRACK; then + echo -e "\n${C_BLUE}Testing ht2crack2:${C_NC} ${HT2CRACK2PATH:=./tools/hitag2crack/crack2/}" + if ! CheckFileExist "ht2crack2buildtable exists" "$HT2CRACK2PATH/ht2crack2buildtable"; then break; fi + if ! CheckFileExist "ht2crack2gentest exists" "$HT2CRACK2PATH/ht2crack2gentest"; then break; fi + if ! CheckFileExist "ht2crack2search exists" "$HT2CRACK2PATH/ht2crack2search"; then break; fi + # 1.5Tb tables are supposed to be absent, so it's just a fast check without real cracking + if ! CheckExecute "ht2crack2 quick test" "cd $HT2CRACK2PATH; ./ht2crack2gentest 1 && ./runalltests.sh; rm keystream*" "searching on bit"; then break; fi + + echo -e "\n${C_BLUE}Testing ht2crack3:${C_NC} ${HT2CRACK3PATH:=./tools/hitag2crack/crack3/}" + if ! CheckFileExist "ht2crack3 exists" "$HT2CRACK3PATH/ht2crack3"; then break; fi + if ! CheckFileExist "ht2crack3test exists" "$HT2CRACK3PATH/ht2crack3test"; then break; fi + HT2CRACK3UID=AABBCCDD + # Test fast only for HT2CRACK3KEY in begin of keyspace! + HT2CRACK3KEY=000102030405 + HT2CRACK3N=32 + HT2CRACK3NRAR=hitag2_${HT2CRACK3UID}_nrar_${HT2CRACK3N}emul.txt + if ! CheckExecute "ht2crack3 gen testfile" "cd $HT2CRACK3PATH; python3 ../hitag2_gen_nRaR.py $HT2CRACK3KEY $HT2CRACK3UID $HT2CRACK3N > $HT2CRACK3NRAR && echo SUCCESS" "SUCCESS"; then break; fi + if ! CheckExecute "ht2crack3test test" "cd $HT2CRACK3PATH; ./ht2crack3test $HT2CRACK3NRAR $HT2CRACK3KEY $HT2CRACK3UID|grep -v SUCCESS||echo SUCCESS" "SUCCESS"; then break; fi + if ! CheckExecute "ht2crack3 test" "cd $HT2CRACK3PATH; ./ht2crack3 $HT2CRACK3UID $HT2CRACK3NRAR |egrep -v '(trying|partial)'" "key = $HT2CRACK3KEY"; then break; fi + if ! CheckExecute "ht2crack3 rm testfile" "cd $HT2CRACK3PATH; rm $HT2CRACK3NRAR && echo SUCCESS" "SUCCESS"; then break; fi + + echo -e "\n${C_BLUE}Testing ht2crack4:${C_NC} ${HT2CRACK4PATH:=./tools/hitag2crack/crack4/}" + if ! CheckFileExist "ht2crack4 exists" "$HT2CRACK4PATH/ht2crack4"; then break; fi + HT2CRACK4UID=12345678 + HT2CRACK4KEY=AABBCCDDEEFF + HT2CRACK4N=32 + HT2CRACK4NRAR=hitag2_${HT2CRACK4UID}_nrar_${HT2CRACK4N}emul.txt + # The success is probabilistic: a fresh random nRaR file is required for each run + # Order of magnitude to crack it: ~15s -> tagged as "slow" + if ! CheckExecute slow retry ignore "ht2crack4 test" "cd $HT2CRACK4PATH; \ + python3 ../hitag2_gen_nRaR.py $HT2CRACK4KEY $HT2CRACK4UID $HT2CRACK4N > $HT2CRACK4NRAR; \ + ./ht2crack4 -u $HT2CRACK4UID -n $HT2CRACK4NRAR -N 16 -t 500000 2>&1; \ + rm $HT2CRACK4NRAR" "key = $HT2CRACK4KEY"; then break; fi + + echo -e "\n${C_BLUE}Testing ht2crack5:${C_NC} ${HT2CRACK5PATH:=./tools/hitag2crack/crack5/}" + if ! CheckFileExist "ht2crack5 exists" "$HT2CRACK5PATH/ht2crack5"; then break; fi + + echo -e "\n${C_BLUE}Testing ht2crack5gpu:${C_NC} ${HT2CRACK5GPUPATH:=./tools/hitag2crack/crack5gpu/}" + if ! CheckFileExist "ht2crack5gpu exists" "$HT2CRACK5GPUPATH/ht2crack5gpu"; then break; fi + HT2CRACK5GPUUID=12345678 + HT2CRACK5GPUKEY=AABBCCDDEEFF + # The speed depends on the nRaR so we'll use two pairs known to work fast + HT2CRACK5GPUNRAR="B438220C 944FFD74 942C59E3 3D450B34" + # Order of magnitude to crack it: ~15s -> tagged as "slow" + if ! CheckExecute slow gpu "ht2crack5gpu test" "cd $HT2CRACK5GPUPATH; ./ht2crack5gpu $HT2CRACK5GPUUID $HT2CRACK5GPUNRAR" "Key: $HT2CRACK5GPUKEY"; then break; fi + fi if $TESTALL || $TESTCLIENT; then echo -e "\n${C_BLUE}Testing client:${C_NC} ${CLIENTBIN:=./client/proxmark3}" if ! CheckFileExist "proxmark3 exists" "$CLIENTBIN"; then break; fi @@ -261,7 +341,7 @@ while true; do echo -e "\n${C_BLUE}Testing HF:${C_NC}" if ! CheckExecute "hf mf offline text" "$CLIENTBIN -c 'hf mf'" "at_enc"; then break; fi - if ! CheckExecute slow "hf mf hardnested long test" "$CLIENTBIN -c 'hf mf hardnested t 1 000000000000'" "found:" "repeat" "ignore"; then break; fi + if ! CheckExecute slow retry ignore "hf mf hardnested long test" "$CLIENTBIN -c 'hf mf hardnested t 1 000000000000'" "found:"; then break; fi if ! CheckExecute slow "hf iclass long test" "$CLIENTBIN -c 'hf iclass loclass t l'" "verified ok"; then break; fi if ! CheckExecute slow "emv long test" "$CLIENTBIN -c 'emv test -l'" "Test(s) \[ OK"; then break; fi if ! $SLOWTESTS; then From 077b156b2f7614a8b2a0020126ee797b8cb8e350 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Sat, 23 May 2020 17:07:14 +0200 Subject: [PATCH 344/632] add ht2crack5 test --- tools/pm3_tests.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tools/pm3_tests.sh b/tools/pm3_tests.sh index 89850e8bd..71a754080 100755 --- a/tools/pm3_tests.sh +++ b/tools/pm3_tests.sh @@ -297,6 +297,12 @@ while true; do echo -e "\n${C_BLUE}Testing ht2crack5:${C_NC} ${HT2CRACK5PATH:=./tools/hitag2crack/crack5/}" if ! CheckFileExist "ht2crack5 exists" "$HT2CRACK5PATH/ht2crack5"; then break; fi + HT2CRACK5UID=12345678 + HT2CRACK5KEY=AABBCCDDEEFF + # The speed depends on the nRaR so we'll use two pairs known to work fast + HT2CRACK5NRAR="6F901EE0 3AC77442 E5F99B3C 055B29BE" + # Order of magnitude to crack it: ~45s -> tagged as "slow" + if ! CheckExecute slow "ht2crack5 test" "cd $HT2CRACK5PATH; ./ht2crack5 $HT2CRACK5UID $HT2CRACK5NRAR" "Key: $HT2CRACK5KEY"; then break; fi echo -e "\n${C_BLUE}Testing ht2crack5gpu:${C_NC} ${HT2CRACK5GPUPATH:=./tools/hitag2crack/crack5gpu/}" if ! CheckFileExist "ht2crack5gpu exists" "$HT2CRACK5GPUPATH/ht2crack5gpu"; then break; fi @@ -305,7 +311,7 @@ while true; do # The speed depends on the nRaR so we'll use two pairs known to work fast HT2CRACK5GPUNRAR="B438220C 944FFD74 942C59E3 3D450B34" # Order of magnitude to crack it: ~15s -> tagged as "slow" - if ! CheckExecute slow gpu "ht2crack5gpu test" "cd $HT2CRACK5GPUPATH; ./ht2crack5gpu $HT2CRACK5GPUUID $HT2CRACK5GPUNRAR" "Key: $HT2CRACK5GPUKEY"; then break; fi + if ! CheckExecute slow gpu "ht2crack5gpu test" "cd $HT2CRACK5GPUPATH; ./ht2crack5gpu $HT2CRACK5GPUUID $HT2CRACK5GPUNRAR" "Key: $HT2CRACK5GPUKEY"; then break; fi fi if $TESTALL || $TESTCLIENT; then echo -e "\n${C_BLUE}Testing client:${C_NC} ${CLIENTBIN:=./client/proxmark3}" From 4df2727ab768906745bbd6f2df3d47a4445e5e5f Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Sat, 23 May 2020 23:47:33 +0200 Subject: [PATCH 345/632] ht2crack5: faster test --- tools/pm3_tests.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/pm3_tests.sh b/tools/pm3_tests.sh index 71a754080..ee554b01b 100755 --- a/tools/pm3_tests.sh +++ b/tools/pm3_tests.sh @@ -300,8 +300,8 @@ while true; do HT2CRACK5UID=12345678 HT2CRACK5KEY=AABBCCDDEEFF # The speed depends on the nRaR so we'll use two pairs known to work fast - HT2CRACK5NRAR="6F901EE0 3AC77442 E5F99B3C 055B29BE" - # Order of magnitude to crack it: ~45s -> tagged as "slow" + HT2CRACK5NRAR="71DA20AA 7EFDF3FA 2A4265F9 59653B07" + # Order of magnitude to crack it: ~12s on 1 core, ~3s on 4 cores -> tagged as "slow" if ! CheckExecute slow "ht2crack5 test" "cd $HT2CRACK5PATH; ./ht2crack5 $HT2CRACK5UID $HT2CRACK5NRAR" "Key: $HT2CRACK5KEY"; then break; fi echo -e "\n${C_BLUE}Testing ht2crack5gpu:${C_NC} ${HT2CRACK5GPUPATH:=./tools/hitag2crack/crack5gpu/}" From 6e5de1090a0ec8fa4321dec55f0477bb5d657dc7 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Sat, 23 May 2020 23:59:10 +0200 Subject: [PATCH 346/632] pm3_tests: cosmetic --- tools/pm3_tests.sh | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/tools/pm3_tests.sh b/tools/pm3_tests.sh index ee554b01b..d5b88f446 100755 --- a/tools/pm3_tests.sh +++ b/tools/pm3_tests.sh @@ -23,8 +23,9 @@ while (( "$#" )); do case "$1" in -h|--help) echo """ -Usage: $0 [--long] [--clientbin /path/to/proxmark3] [mfkey|nonce2key|mf_nonce_brute|fpga_compress|bootrom|armsrc|client|recovery|common] +Usage: $0 [--long] [--gpu] [--clientbin /path/to/proxmark3] [mfkey|nonce2key|mf_nonce_brute|fpga_compress|bootrom|armsrc|client|recovery|common] --long: Enable slow tests + --gpu: Enable tests requiring GPU --clientbin ...: Specify path to proxmark3 binary to test If no target given, all targets will be tested """ @@ -119,17 +120,19 @@ C_NC='\033[0m' # No Color # title, file name or file wildcard to check function CheckFileExist() { + printf "%-40s" "$1 " + if [ -f "$2" ]; then - echo -e "$1 ${C_GREEN}[OK]${C_NC}" + echo -e "${C_GREEN}[OK]${C_NC}" return 0 fi if ls "$2" 1> /dev/null 2>&1; then - echo -e "$1 ${C_GREEN}[OK]${C_NC}" + echo -e "${C_GREEN}[OK]${C_NC}" return 0 fi - echo -e "$1 ${C_RED}[Fail]${C_NC}" + echo -e "${C_RED}[FAIL]${C_NC}" return 1 } @@ -164,12 +167,14 @@ function CheckExecute() { local IGNOREFAILURE=false fi + printf "%-40s" "$1 " + if $SLOWTEST && ! $SLOWTESTS; then - echo -e "$1 ${C_YELLOW}[SKIPPED]${C_NC} (slow)\n" + echo -e "${C_YELLOW}[SKIPPED]${C_NC} (slow)\n" return 0 fi if $GPUTEST && ! $GPUTESTS; then - echo -e "$1 ${C_YELLOW}[SKIPPED]${C_NC} (gpu)\n" + echo -e "${C_YELLOW}[SKIPPED]${C_NC} (gpu)\n" return 0 fi @@ -177,18 +182,18 @@ function CheckExecute() { do RES=$(eval "$2") if echo "$RES" | grep -q "$3"; then - echo -e "$1 ${C_GREEN}[OK]${C_NC}" + echo -e "${C_GREEN}[OK]${C_NC}" return 0 fi if [ ! $I == "e" ]; then echo "retry $I"; fi done if $IGNOREFAILURE; then - echo -e "$1 ${C_YELLOW}[Ignored]${C_NC}" + echo -e "${C_YELLOW}[IGNORED]${C_NC}" return 0 fi - echo -e "$1 ${C_RED}[Fail]${C_NC}" + echo -e "${C_RED}[FAIL]${C_NC}" echo -e "Execution trace:\n$RES" return 1 } From f54f8103ace2c37b21657fd149e40ff625f6813e Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Sun, 24 May 2020 01:03:23 +0200 Subject: [PATCH 347/632] fix pathsep in subdirs --- include/common.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/common.h b/include/common.h index d52e40f10..a66ddabd5 100644 --- a/include/common.h +++ b/include/common.h @@ -31,8 +31,8 @@ #define RESOURCES_SUBDIR "resources" PATHSEP #define TRACES_SUBDIR "traces" PATHSEP #define FIRMWARES_SUBDIR "firmware" PATHSEP -#define BOOTROM_SUBDIR "bootrom/obj" PATHSEP -#define FULLIMAGE_SUBDIR "armsrc/obj" PATHSEP +#define BOOTROM_SUBDIR "bootrom" PATHSEP "obj" PATHSEP +#define FULLIMAGE_SUBDIR "armsrc" PATHSEP "obj" PATHSEP #define PACKED __attribute__((packed)) From a6f76444de2ef26c5380fb1a347e2da6aac83790 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Sun, 24 May 2020 01:20:43 +0200 Subject: [PATCH 348/632] Put logfiles in subdir --- client/src/preferences.c | 2 +- client/src/proxmark3.c | 2 +- client/src/ui.c | 46 ++++++++++++++++++++++++++++++++++++---- client/src/ui.h | 2 +- include/common.h | 1 + 5 files changed, 46 insertions(+), 7 deletions(-) diff --git a/client/src/preferences.c b/client/src/preferences.c index 4c8fefb77..89d9cc188 100644 --- a/client/src/preferences.c +++ b/client/src/preferences.c @@ -32,7 +32,7 @@ static int setCmdHelp(const char *Cmd); static char *prefGetFilename(void) { char *path; - if (searchHomeFilePath(&path, preferencesFilename, false) == PM3_SUCCESS) + if (searchHomeFilePath(&path, NULL, preferencesFilename, false) == PM3_SUCCESS) return path; else return strdup(preferencesFilename); diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index 427619e75..a461d4c95 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -206,7 +206,7 @@ main_loop(char *script_cmds_file, char *script_cmd, bool stayInCommandLoop) { } char *my_history_path = NULL; - if (searchHomeFilePath(&my_history_path, PROXHISTORY, true) != PM3_SUCCESS) { + if (searchHomeFilePath(&my_history_path, NULL, PROXHISTORY, true) != PM3_SUCCESS) { PrintAndLogEx(ERR, "No history will be recorded"); my_history_path = NULL; } else { diff --git a/client/src/ui.c b/client/src/ui.c index 9414fbb34..798ed165a 100644 --- a/client/src/ui.c +++ b/client/src/ui.c @@ -54,7 +54,7 @@ pthread_mutex_t print_lock = PTHREAD_MUTEX_INITIALIZER; static void fPrintAndLog(FILE *stream, const char *fmt, ...); // needed by flasher, so let's put it here instead of fileutils.c -int searchHomeFilePath(char **foundpath, const char *filename, bool create_home) { +int searchHomeFilePath(char **foundpath, const char *subdir, const char *filename, bool create_home) { if (foundpath == NULL) return PM3_EINVARG; const char *user_path = get_my_user_directory(); @@ -62,7 +62,8 @@ int searchHomeFilePath(char **foundpath, const char *filename, bool create_home) fprintf(stderr, "Could not retrieve $HOME from the environment\n"); return PM3_EFILE; } - char *path = calloc(strlen(user_path) + strlen(PM3_USER_DIRECTORY) + 1, sizeof(char)); + size_t pathlen = strlen(user_path) + strlen(PM3_USER_DIRECTORY) + 1; + char *path = calloc(pathlen, sizeof(char)); if (path == NULL) return PM3_EMALLOC; strcpy(path, user_path); @@ -96,11 +97,48 @@ int searchHomeFilePath(char **foundpath, const char *filename, bool create_home) return PM3_EFILE; } } + if (subdir != NULL) { + pathlen += strlen(subdir); + path = realloc(path, pathlen * sizeof(char)); + if (path == NULL) + return PM3_EMALLOC; + strcat(path, subdir); + +#ifdef _WIN32 + // Mingw _stat fails if path ends with /, so let's use a stripped path + if (path[strlen(path) - 1] == '/') { + path[strlen(path) - 1] = '\0'; + result = _stat(path, &st); + path[strlen(path)] = '/'; + } else { + result = _stat(path, &st); + } +#else + result = stat(path, &st); +#endif + if ((result != 0) && create_home) { + +#ifdef _WIN32 + if (_mkdir(path)) +#else + if (mkdir(path, 0700)) +#endif + { + fprintf(stderr, "Could not create user directory %s\n", path); + free(path); + return PM3_EFILE; + } + } + } + if (filename == NULL) { *foundpath = path; return PM3_SUCCESS; } - path = realloc(path, (strlen(user_path) + strlen(PM3_USER_DIRECTORY) + strlen(filename) + 1) * sizeof(char)); + pathlen += strlen(filename); + path = realloc(path, pathlen * sizeof(char)); + if (path == NULL) + return PM3_EMALLOC; strcat(path, filename); *foundpath = path; return PM3_SUCCESS; @@ -266,7 +304,7 @@ static void fPrintAndLog(FILE *stream, const char *fmt, ...) { time_t now = time(NULL); timenow = gmtime(&now); strftime(filename, sizeof(filename), PROXLOG, timenow); - if (searchHomeFilePath(&my_logfile_path, filename, true) != PM3_SUCCESS) { + if (searchHomeFilePath(&my_logfile_path, LOGS_SUBDIR, filename, true) != PM3_SUCCESS) { fprintf(stderr, "[-] Logging disabled!\n\n"); my_logfile_path = NULL; logging = 0; diff --git a/client/src/ui.h b/client/src/ui.h index 20b5a3619..60064c0aa 100644 --- a/client/src/ui.h +++ b/client/src/ui.h @@ -59,7 +59,7 @@ void memcpy_filter_ansi(void *dest, const void *src, size_t n, bool filter); void memcpy_filter_rlmarkers(void *dest, const void *src, size_t n); void memcpy_filter_emoji(void *dest, const void *src, size_t n, emojiMode_t mode); -int searchHomeFilePath(char **foundpath, const char *filename, bool create_home); +int searchHomeFilePath(char **foundpath, const char *subdir, const char *filename, bool create_home); extern pthread_mutex_t print_lock; diff --git a/include/common.h b/include/common.h index a66ddabd5..4d6efcce2 100644 --- a/include/common.h +++ b/include/common.h @@ -30,6 +30,7 @@ #define LUA_SCRIPTS_SUBDIR "luascripts" PATHSEP #define RESOURCES_SUBDIR "resources" PATHSEP #define TRACES_SUBDIR "traces" PATHSEP +#define LOGS_SUBDIR "logs" PATHSEP #define FIRMWARES_SUBDIR "firmware" PATHSEP #define BOOTROM_SUBDIR "bootrom" PATHSEP "obj" PATHSEP #define FULLIMAGE_SUBDIR "armsrc" PATHSEP "obj" PATHSEP From e7585b59445d780c312abe3a85c778baba458483 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Sun, 24 May 2020 11:17:11 +0200 Subject: [PATCH 349/632] fix #747, 'hf mfu eload' - now detects and converts between plain/old/new mfu binary format --- CHANGELOG.md | 3 + client/src/cmdhfmf.c | 29 +++++++- client/src/cmdhfmfu.c | 9 ++- client/src/cmdhfmfu.h | 5 +- client/src/fileutils.c | 161 +++++++++++++++++++++++++++++++++++------ client/src/fileutils.h | 20 ++++- 6 files changed, 188 insertions(+), 39 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 90c6dccb3..8edd91099 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,9 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac ## [unreleased][unreleased] ## [ice coffee.4.][2020-05-21] + - Fix `hf mfu eload` - now detects and converts between plain/old/new mfu binary format (@iceman1001) + - Change log files moved to subfolders (@doegex) + - Change lib lua unbundled. (@doegex) - Updated documentation (@doegox, @iceman1001) - Change `pm3test.sh` - more regression tests to (@doegox, @iceman1001) - Change `hf 15 dump` - now supports basic json format (@iceman1001) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 08a4f1781..4940e96a2 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -3688,10 +3688,15 @@ int CmdHF14AMfELoad(const char *Cmd) { return usage_hf14_eload(); uint8_t *data = calloc(4096, sizeof(uint8_t)); + if (data == NULL) { + PrintAndLogEx(WARNING, "Fail, cannot allocate memory"); + return PM3_EMALLOC; + } + size_t datalen = 0; //int res = loadFile(filename, ".bin", data, maxdatalen, &datalen); int res = loadFileEML(filename, data, &datalen); - if (res) { + if (res != PM3_SUCCESS) { free(data); return PM3_EFILE; } @@ -3703,15 +3708,31 @@ int CmdHF14AMfELoad(const char *Cmd) { return PM3_ESOFT; } - // convert old mfu format to new + // convert plain or old mfu format to new format if (blockWidth == 4) { - res = convertOldMfuDump(&data, &datalen); - if (res) { + + res = convert_mfu_dump_format(&data, &datalen, true); + if (res != PM3_SUCCESS) { PrintAndLogEx(FAILED, "Failed convert on load to new Ultralight/NTAG format"); free(data); return res; } + mfu_dump_t *mfu_dump = (mfu_dump_t *)data; + + PrintAndLogEx(INFO, _CYAN_("MFU dump file information")); + PrintAndLogEx(INFO, " version %s", sprint_hex(mfu_dump->version, sizeof(mfu_dump->version))); + PrintAndLogEx(INFO, " tb 0 %s", sprint_hex(mfu_dump->tbo, sizeof(mfu_dump->tbo))); + PrintAndLogEx(INFO, " tb 1 %s", sprint_hex(mfu_dump->tbo1, sizeof(mfu_dump->tbo1))); + for(uint8_t m = 0; m < 3; m++) { + PrintAndLogEx(INFO, " counter %d %s - tearing 0x%02x", m + 1, sprint_hex(mfu_dump->counter_tearing[m], 3), mfu_dump->counter_tearing[m][3]); + } + PrintAndLogEx(INFO, " signature %s", sprint_hex(mfu_dump->signature, sizeof(mfu_dump->signature))); + PrintAndLogEx(INFO, " data %s... (only first 8 bytes showing)", sprint_hex(mfu_dump->data, 8)); + PrintAndLogEx(INFO, " max data page %d, data len %d bytes", mfu_dump->pages, (mfu_dump->pages + 1) * 4); + PrintAndLogEx(INFO, " file header size %d", MFU_DUMP_PREFIX_LENGTH); + PrintAndLogEx(INFO, "----------------------------------------------"); + // update expected blocks to match converted data. if (numBlocks != datalen / 4) { numBlocks = datalen / 4; diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index 9dc739417..75afa7641 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -2039,6 +2039,7 @@ static int CmdHF14AMfURestore(const char *Cmd) { bool write_special = false; bool write_extra = false; bool read_key = false; + bool verbose = false; size_t filelen = 0; FILE *f; @@ -2087,6 +2088,9 @@ static int CmdHF14AMfURestore(const char *Cmd) { cmdp++; read_key = true; break; + case 'v': + cmdp++; + verbose = true; default: PrintAndLogEx(WARNING, "Unknown parameter: " _RED_("'%c'"), param_getchar(Cmd, cmdp)); errors = true; @@ -2128,10 +2132,9 @@ static int CmdHF14AMfURestore(const char *Cmd) { return 1; } - // convert old format to new format, if need - int res = convertOldMfuDump(&dump, &bytes_read); + int res = convert_mfu_dump_format(&dump, &bytes_read, verbose); if (res != PM3_SUCCESS) { - PrintAndLogEx(WARNING, "Failed convert on load to new Ultralight/NTAG format"); + PrintAndLogEx(FAILED, "Failed convert on load to new Ultralight/NTAG format"); free(dump); return res; } diff --git a/client/src/cmdhfmfu.h b/client/src/cmdhfmfu.h index 0f87cb3f6..eb81c8dea 100644 --- a/client/src/cmdhfmfu.h +++ b/client/src/cmdhfmfu.h @@ -18,19 +18,16 @@ typedef struct { uint8_t signature[32]; //uint8_t counter[3]; uint8_t data[1024]; -} old_mfu_dump_t; - +} PACKED old_mfu_dump_t; uint32_t GetHF14AMfU_Type(void); int ul_print_type(uint32_t tagtype, uint8_t spaces); - void printMFUdump(mfu_dump_t *card); void printMFUdumpEx(mfu_dump_t *card, uint16_t pages, uint8_t startpage); int CmdHFMFUltra(const char *Cmd); uint16_t ul_ev1_packgen_VCNEW(uint8_t *uid, uint32_t pwd); - uint32_t ul_ev1_otpgenA(uint8_t *uid); typedef enum TAGTYPE_UL { diff --git a/client/src/fileutils.c b/client/src/fileutils.c index 4e5573747..a650e3929 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -313,6 +313,9 @@ out: } int saveFileJSON(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen) { + return saveFileJSONex(preferredName, ftype, data, datalen, true); +} +int saveFileJSONex(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen, bool verbose) { if (data == NULL) return PM3_EINVARG; @@ -559,7 +562,9 @@ int saveFileJSON(const char *preferredName, JSONFileType ftype, uint8_t *data, s retval = 200; goto out; } - PrintAndLogEx(SUCCESS, "saved to json file " _YELLOW_("%s"), fileName); + if (verbose) + PrintAndLogEx(SUCCESS, "saved to json file " _YELLOW_("%s"), fileName); + json_decref(root); out: @@ -678,7 +683,6 @@ int createMfcKeyDump(const char *preferredName, uint8_t sectorsCnt, sector_t *e_ return PM3_SUCCESS; } - int loadFile(const char *preferredName, const char *suffix, void *data, size_t maxdatalen, size_t *datalen) { if (data == NULL) return 1; @@ -820,6 +824,7 @@ int loadFileEML(const char *preferredName, void *data, size_t *datalen) { if (fgets(line, sizeof(line), f) == NULL) { if (feof(f)) break; + fclose(f); PrintAndLogEx(FAILED, "File reading error."); retval = PM3_EFILE; @@ -829,10 +834,14 @@ int loadFileEML(const char *preferredName, void *data, size_t *datalen) { if (line[0] == '#') continue; + strcleanrn(line, sizeof(line)); + int res = param_gethex_to_eol(line, 0, buf, sizeof(buf), &hexlen); - if (res == 0 || res == 1) { + if (res == 0) { memcpy(udata + counter, buf, hexlen); counter += hexlen; + } else { + retval = PM3_ESOFT; } } fclose(f); @@ -847,6 +856,9 @@ out: } int loadFileJSON(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen) { + return loadFileJSONex(preferredName, data, maxdatalen, datalen, true); +} +int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen, bool verbose) { if (data == NULL) return PM3_EINVARG; char *fileName = filenamemcopy(preferredName, ".json"); @@ -986,7 +998,9 @@ int loadFileJSON(const char *preferredName, void *data, size_t maxdatalen, size_ } *datalen = sptr; } - PrintAndLogEx(SUCCESS, "loaded from JSON file " _YELLOW_("%s"), fileName); + if (verbose) + PrintAndLogEx(SUCCESS, "loaded from JSON file " _YELLOW_("%s"), fileName); + if (!strcmp(ctype, "settings")) { preferences_load_callback(root); } @@ -1185,38 +1199,137 @@ out: return retval; } -int convertOldMfuDump(uint8_t **dump, size_t *dumplen) { - if (!dump || !dumplen || *dumplen < OLD_MFU_DUMP_PREFIX_LENGTH) - return 1; - // try to check new file format - mfu_dump_t *mfu_dump = (mfu_dump_t *) *dump; - if ((*dumplen - MFU_DUMP_PREFIX_LENGTH) / 4 - 1 == mfu_dump->pages) - return 0; +mfu_df_e detect_mfu_dump_format(uint8_t **dump, size_t *dumplen, bool verbose) { + + mfu_df_e retval = MFU_DF_UNKNOWN; + uint8_t bcc0, bcc1; + uint8_t ct = 0x88; + + // detect new + mfu_dump_t *new = (mfu_dump_t *)*dump; + bcc0 = ct ^ new->data[0] ^ new->data[1] ^ new->data[2]; + bcc1 = new->data[4] ^ new->data[5] ^ new->data[6] ^ new->data[7]; + if (bcc0 == new->data[3] && bcc1 == new->data[8]) { + retval = MFU_DF_NEWBIN; + } + + // detect old + if (retval == MFU_DF_UNKNOWN) { + old_mfu_dump_t *old = (old_mfu_dump_t *)*dump; + bcc0 = ct ^ old->data[0] ^ old->data[1] ^ old->data[2]; + bcc1 = old->data[4] ^ old->data[5] ^ old->data[6] ^ old->data[7]; + if (bcc0 == old->data[3] && bcc1 == old->data[8]) { + retval = MFU_DF_OLDBIN; + } + } + + // detect plain + if (retval == MFU_DF_UNKNOWN) { + uint8_t *plain = *dump; + bcc0 = ct ^ plain[0] ^ plain[1] ^ plain[2]; + bcc1 = plain[4] ^ plain[5] ^ plain[6] ^ plain[7]; + if ((bcc0 == plain[3]) && (bcc1 == plain[8])) { + retval = MFU_DF_PLAINBIN; + } + } + + if (verbose) { + switch(retval) { + case MFU_DF_NEWBIN: + PrintAndLogEx(INFO, "detected " _GREEN_("new") " mfu dump format"); + break; + case MFU_DF_OLDBIN: + PrintAndLogEx(INFO, "detected " _GREEN_("old") " mfu dump format"); + break; + case MFU_DF_PLAINBIN: + PrintAndLogEx(INFO, "detected " _GREEN_("plain") " mfu dump format"); + break; + case MFU_DF_UNKNOWN: + PrintAndLogEx(WARNING, "failed to detected mfu dump format"); + break; + } + } + return retval; +} + +static int convert_plain_mfu_dump(uint8_t **dump, size_t *dumplen, bool verbose) { + + mfu_dump_t *mfu = (mfu_dump_t *) calloc( sizeof(mfu_dump_t), sizeof(uint8_t)); + if (mfu == NULL) { + return PM3_EMALLOC; + } + + memcpy(mfu->data, *dump, *dumplen); + + mfu->pages = *dumplen / 4 - 1; + + if (verbose) { + PrintAndLogEx(SUCCESS, "plain mfu dump format was converted to " _GREEN_("%d") " blocks", mfu->pages + 1); + } + + *dump = (uint8_t *)mfu; + *dumplen += MFU_DUMP_PREFIX_LENGTH ; + return PM3_SUCCESS; +} + +static int convert_old_mfu_dump(uint8_t **dump, size_t *dumplen, bool verbose) { + // convert old format - old_mfu_dump_t *old_mfu_dump = (old_mfu_dump_t *) *dump; + old_mfu_dump_t *old_mfu_dump = (old_mfu_dump_t *)*dump; size_t old_data_len = *dumplen - OLD_MFU_DUMP_PREFIX_LENGTH; size_t new_dump_len = old_data_len + MFU_DUMP_PREFIX_LENGTH; + + mfu_dump_t *mfu_dump = (mfu_dump_t *) calloc( sizeof(mfu_dump_t), sizeof(uint8_t)); + if (mfu_dump == NULL) { + return PM3_EMALLOC; + } - mfu_dump = (mfu_dump_t *) calloc(new_dump_len, sizeof(uint8_t)); - - memcpy(mfu_dump->version, old_mfu_dump->version, 8); - memcpy(mfu_dump->tbo, old_mfu_dump->tbo, 2); + memcpy(mfu_dump->version, old_mfu_dump->version, sizeof(mfu_dump->version)); + memcpy(mfu_dump->tbo, old_mfu_dump->tbo, sizeof(mfu_dump->tbo)); + memcpy(mfu_dump->signature, old_mfu_dump->signature, sizeof(mfu_dump->signature)); + mfu_dump->tbo1[0] = old_mfu_dump->tbo1[0]; - memcpy(mfu_dump->signature, old_mfu_dump->signature, 32); - for (int i = 0; i < 3; i++) - mfu_dump->counter_tearing[i][3] = old_mfu_dump->tearing[i]; - memcpy(mfu_dump->data, old_mfu_dump->data, old_data_len); + for (int i = 0; i < 3; i++) { + mfu_dump->counter_tearing[i][3] = old_mfu_dump->tearing[i]; + } + + memcpy(mfu_dump->data, old_mfu_dump->data, sizeof(mfu_dump->data)); + mfu_dump->pages = old_data_len / 4 - 1; - // free old buffer, return new buffer - *dumplen = new_dump_len; + + if (verbose) { + PrintAndLogEx(SUCCESS, "old mfu dump format was converted to " _GREEN_("%d") " blocks", mfu_dump->pages + 1); + } + free(*dump); - *dump = (uint8_t *) mfu_dump; - PrintAndLogEx(SUCCESS, "old mfu dump format, was converted on load to " _GREEN_("%d") " pages", mfu_dump->pages + 1); + *dump = (uint8_t *)mfu_dump; + *dumplen = new_dump_len; return PM3_SUCCESS; } +int convert_mfu_dump_format(uint8_t **dump, size_t *dumplen, bool verbose) { + + if (!dump || !dumplen || *dumplen < OLD_MFU_DUMP_PREFIX_LENGTH) { + return PM3_EINVARG; + } + + mfu_df_e res = detect_mfu_dump_format(dump, dumplen, verbose); + + switch(res) { + case MFU_DF_NEWBIN: + return PM3_SUCCESS; + case MFU_DF_OLDBIN: + return convert_old_mfu_dump(dump, dumplen, verbose); + case MFU_DF_PLAINBIN: + return convert_plain_mfu_dump(dump, dumplen, verbose); + case MFU_DF_UNKNOWN: + default: + return PM3_ESOFT; + } +} + static int filelist(const char *path, const char *ext, bool last, bool tentative) { struct dirent **namelist; int n; diff --git a/client/src/fileutils.h b/client/src/fileutils.h index 603144e67..cf00efb03 100644 --- a/client/src/fileutils.h +++ b/client/src/fileutils.h @@ -116,6 +116,7 @@ int saveFileEML(const char *preferredName, uint8_t *data, size_t datalen, size_t * @return 0 for ok, 1 for failz */ int saveFileJSON(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen); +int saveFileJSONex(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen, bool verbose); /** STUB * @brief Utility function to save WAVE data to a file. This method takes a preferred name, but if that @@ -198,6 +199,8 @@ int loadFileEML(const char *preferredName, void *data, size_t *datalen); * @return 0 for ok, 1 for failz */ int loadFileJSON(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen); +int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen, bool verbose); + /** * @brief Utility function to load data from a DICTIONARY textfile. This method takes a preferred name. @@ -242,14 +245,23 @@ int loadFileDICTIONARYEx(const char *preferredName, void *data, size_t maxdatale */ int loadFileDICTIONARY_safe(const char *preferredName, void **pdata, uint8_t keylen, uint32_t *keycnt); + +typedef enum { + MFU_DF_UNKNOWN, + MFU_DF_PLAINBIN, + MFU_DF_OLDBIN, + MFU_DF_NEWBIN +} mfu_df_e; /** - * @brief Utility function to check and convert old mfu dump format to new - * + * @brief Utility function to check and convert plain mfu dump format to new mfu binary format. + * plain dumps doesn't have any extra data, like version, signature etc. * @param dump pointer to loaded dump to check and convert format * @param dumplen the number of bytes loaded dump and converted - * @return 0 for ok, 1 for fails + * @param verbose - extra debug output + * @return PM3_SUCCESS for ok, PM3_ESOFT for fails */ -int convertOldMfuDump(uint8_t **dump, size_t *dumplen); +int convert_mfu_dump_format(uint8_t **dump, size_t *dumplen, bool verbose); +mfu_df_e detect_mfu_dump_format(uint8_t **dump, size_t *dumplen, bool verbose); int searchAndList(const char *pm3dir, const char *ext); int searchFile(char **foundpath, const char *pm3dir, const char *searchname, const char *suffix, bool silent); From bde4198184d369a68bb88db281bc5430e9e9f1bb Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Sun, 24 May 2020 12:51:51 +0200 Subject: [PATCH 350/632] fix hf mfu --- client/src/cmdhfmfu.c | 69 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 59 insertions(+), 10 deletions(-) diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index 75afa7641..b9dc8d3a2 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -541,7 +541,7 @@ static int ul_print_default(uint8_t *data) { sprint_bin(data + 10, 2) ); - PrintAndLogEx(SUCCESS, "OneTimePad: %s - %s\n", + PrintAndLogEx(SUCCESS, "OneTimePad: %s - %s", sprint_hex(data + 12, 4), sprint_bin(data + 12, 4) ); @@ -748,11 +748,13 @@ static int ulev1_print_configuration(uint32_t tagtype, uint8_t *data, uint8_t st PrintAndLogEx(INFO, "--- " _CYAN_("Tag Configuration")); bool strg_mod_en = (data[0] & 2); + uint8_t authlim = (data[4] & 0x07); - bool nfc_cnf_en = (data[4] & 0x08); - bool nfc_cnf_prot_pwd = (data[4] & 0x10); - bool cfglck = (data[4] & 0x40); - bool prot = (data[4] & 0x80); + bool nfc_cnf_prot_pwd = ((data[4] & 0x08) == 0x08); + bool nfc_cnf_en = ((data[4] & 0x10) == 0x10); + bool cfglck = ((data[4] & 0x40) == 0x40); + bool prot = ((data[4] & 0x80) == 0x80); + uint8_t vctid = data[5]; PrintAndLogEx(INFO, " cfg0 [%u/0x%02X]: %s", startPage, startPage, sprint_hex(data, 4)); @@ -838,7 +840,7 @@ static int ulev1_print_configuration(uint32_t tagtype, uint8_t *data, uint8_t st PrintAndLogEx(INFO, " - Max number of password attempts is " _YELLOW_("%d"), authlim); PrintAndLogEx(INFO, " - NFC counter %s", (nfc_cnf_en) ? "enabled" : "disabled"); - PrintAndLogEx(INFO, " - NFC counter %s", (nfc_cnf_prot_pwd) ? "not protected" : "password protection enabled"); + PrintAndLogEx(INFO, " - NFC counter %s", (nfc_cnf_prot_pwd) ? "password protection enabled" : "not protected"); PrintAndLogEx(INFO, " - user configuration %s", cfglck ? "permanently locked" : "writeable"); PrintAndLogEx(INFO, " - %s access is protected with password", prot ? "read and write" : "write"); @@ -850,6 +852,7 @@ static int ulev1_print_configuration(uint32_t tagtype, uint8_t *data, uint8_t st } static int ulev1_print_counters(void) { + PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "--- " _CYAN_("Tag Counters")); uint8_t tear[1] = {0}; uint8_t counter[3] = {0, 0, 0}; @@ -859,7 +862,7 @@ static int ulev1_print_counters(void) { len = ulev1_readCounter(i, counter, sizeof(counter)); if (len == 3) { PrintAndLogEx(INFO, " [%0d]: %s", i, sprint_hex(counter, 3)); - PrintAndLogEx(SUCCESS, " - %02X tearing %s", tear[0], (tear[0] == 0xBD) ? "Ok" : "failure"); + PrintAndLogEx(SUCCESS, " - %02X tearing (" _GREEN_("%s") ")", tear[0], (tear[0] == 0xBD) ? "ok" : "failure"); } } return len; @@ -971,6 +974,20 @@ static int ulev1_print_version(uint8_t *data) { return PM3_SUCCESS; } +static int ntag_print_counter(void) { + // NTAG has one counter/tearing. At address 0x02. + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "--- " _CYAN_("Tag Counter")); + uint8_t tear[1] = {0}; + uint8_t counter[3] = {0, 0, 0}; + uint16_t len; + len = ulev1_readTearing(0x02, tear, sizeof(tear)); + len = ulev1_readCounter(0x02, counter, sizeof(counter)); + PrintAndLogEx(INFO, " [02]: %s", sprint_hex(counter, 3)); + PrintAndLogEx(SUCCESS, " - %02X tearing (" _GREEN_("%s")")", tear[0], (tear[0] == 0xBD) ? "ok" : "failure"); + return len; +} + /* static int ulc_magic_test(){ // Magic Ultralight test @@ -1271,6 +1288,12 @@ static int CmdHF14AMfUInfo(const char *Cmd) { } // NTAG counters? + if ((tagtype & (NTAG_213 | NTAG_213_F | NTAG_215 | NTAG_216))) { + if (ntag_print_counter()) { + // failed - re-select + if (ul_auth_select(&card, tagtype, hasAuthKey, authkeyptr, pack, sizeof(pack)) == PM3_ESOFT) return PM3_ESOFT; + } + } // Read signature if ((tagtype & (UL_EV1_48 | UL_EV1_128 | UL_EV1 | UL_NANO_40 | NTAG_213 | NTAG_213_F | NTAG_215 | NTAG_216 | NTAG_216_F | NTAG_I2C_1K | NTAG_I2C_2K | NTAG_I2C_1K_PLUS | NTAG_I2C_2K_PLUS))) { @@ -1942,16 +1965,42 @@ static int CmdHF14AMfUDump(const char *Cmd) { if (hasAuthKey) { uint8_t dummy_pack[] = {0, 0}; ul_auth_select(&card, tagtype, hasAuthKey, authKeyPtr, dummy_pack, sizeof(dummy_pack)); - } else + } else { ul_select(&card); + } ulev1_getVersion(get_version, sizeof(get_version)); - for (uint8_t n = 0; n < 3; ++n) { - ulev1_readTearing(n, &get_counter_tearing[n][3], 1); + + // ULEV-1 has 3 counters + uint8_t n = 0; + + // NTAG has 1 counter, at 0x02 + if ((tagtype & (NTAG_213 | NTAG_213_F | NTAG_215 | NTAG_216))) { + n = 2; + } + + // NTAG can have nfc counter pwd protection enabled + for (; n < 3; n++) { + + if (hasAuthKey) { + uint8_t dummy_pack[] = {0, 0}; + ul_auth_select(&card, tagtype, hasAuthKey, authKeyPtr, dummy_pack, sizeof(dummy_pack)); + } else { + ul_select(&card); + } ulev1_readCounter(n, &get_counter_tearing[n][0], 3); + + if (hasAuthKey) { + uint8_t dummy_pack[] = {0, 0}; + ul_auth_select(&card, tagtype, hasAuthKey, authKeyPtr, dummy_pack, sizeof(dummy_pack)); + } else { + ul_select(&card); + } + ulev1_readTearing(n, &get_counter_tearing[n][3], 1); } DropField(); + if (hasAuthKey) { uint8_t dummy_pack[] = {0, 0}; ul_auth_select(&card, tagtype, hasAuthKey, authKeyPtr, dummy_pack, sizeof(dummy_pack)); From 8a72370f509d5338d7b7192491b1bf32a3bcc2e7 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Sun, 24 May 2020 12:52:02 +0200 Subject: [PATCH 351/632] add document --- doc/mfu_binary_format_notes.md | 101 +++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 doc/mfu_binary_format_notes.md diff --git a/doc/mfu_binary_format_notes.md b/doc/mfu_binary_format_notes.md new file mode 100644 index 000000000..dfde0da7a --- /dev/null +++ b/doc/mfu_binary_format_notes.md @@ -0,0 +1,101 @@ +# Notes on MFU binary formats + + - new mfu format + - old mfu format + - plain mfu format + - future mfu format + +## New mfu format +The new mfu binary format was created to compensate for different manufactures tag functions. +Like UL-Ev1 has three counter and tearing bytes, while NTAG only has one counter and tearing byte. +PACK was removed from header, since its just normally part of the tag memory, unreadable, but when +a proxmark3 dumps a tag and we have pwd/pack, we add those to their normal location in memory. +This makes memory not a exact memory dump from a tag, but a "what it should have looked like" if we could read all memory + +``` +// New Ultralight/NTAG dump file format +// Length must be aligned to 4 bytes (UL/NTAG page) +#define MFU_DUMP_PREFIX_LENGTH 56 + +typedef struct { + uint8_t version[8]; + uint8_t tbo[2]; + uint8_t tbo1[1]; + uint8_t pages; // max page number in dump + uint8_t signature[32]; + uint8_t counter_tearing[3][4]; // 3 bytes counter, 1 byte tearing flag + uint8_t data[1024]; +} PACKED mfu_dump_t; +``` + +## Old mfu format +The old binary format saved the extra data on tag in order for the Proxmark3 to able to simulate a real tag. + +``` +// Old Ultralight/NTAG dump file format +#define OLD_MFU_DUMP_PREFIX_LENGTH 48 + +typedef struct { + uint8_t version[8]; + uint8_t tbo[2]; + uint8_t tearing[3]; + uint8_t pack[2]; + uint8_t tbo1[1]; + uint8_t signature[32]; + uint8_t data[1024]; +} old_mfu_dump_t; +``` + +## Plain mfu format +The first binary format for MFU was just a memory dump from the tag block 0 to end. +No extra data was saved. +``` + uint8_t data[1024]; +``` + +## future mfu format +For developers of apps and other tools, like libnfc, we don't recommend using binary formats. +We decided to adopt a JSON based format, which is much more flexible to changes of new tag functionality. + +Example +``` +{ + "Created": "proxmark3", + "FileType": "mfu", + "Card": { + "UID": "04F654CAFC388", + "Version": "0004030101000B0", + "TBO_0": "000", + "TBO_1": "0", + "Signature": "BC9BFD4B550C16B2B5A5ABA10B644A027B4CB03DDB46F94D992DC0FB02E0C3F", + "Counter0": "00000", + "Tearing0": "BD", + "Counter1": "00000", + "Tearing1": "BD", + "Counter2": "00000", + "Tearing2": "BD" + }, + "blocks": { + "0": "04F6542", + "1": "CAFC388", + "2": "8E48000", + "3": "E110120", + "4": "0103A00", + "5": "340300F", + "6": "0000000", + "7": "0000000", + "8": "0000000", + "9": "0000000", + "10": "0000000", + "11": "0000000", + "12": "1122334", + "13": "0000000", + "14": "0000000", + "15": "0000000", + "16": "000000F", + "17": "0005000", + "18": "0000000", + "19": "0000000" + } +} +``` From 8aebb8ef8ebf1f6301d8992c9054c87995cf4a01 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Sun, 24 May 2020 12:52:11 +0200 Subject: [PATCH 352/632] textual --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8edd91099..8fd7150b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,9 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac ## [unreleased][unreleased] ## [ice coffee.4.][2020-05-21] + - Add doc/mfu_binary_format_notes.md (@iceman1001) + - Fix `hf mfu dump` - now reads Ulev1 3counter vs NTAG 1 counters (@iceman1001) + - Fix `hf mfu info` - now print correct cfg1 - nfc protection (@iceman1001) - Fix `hf mfu eload` - now detects and converts between plain/old/new mfu binary format (@iceman1001) - Change log files moved to subfolders (@doegex) - Change lib lua unbundled. (@doegex) From acce16f6487abebb8adc96f1fab135eed743cd84 Mon Sep 17 00:00:00 2001 From: Iceman <iceman@iuse.se> Date: Sun, 24 May 2020 12:56:08 +0200 Subject: [PATCH 353/632] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8222032f2..ba17074d3 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ |[Notes on UART](/doc/uart_notes.md)|[Notes on Termux / Android](/doc/termux_notes.md)|[Notes on paths](/doc/path_notes.md)| |[Notes on frame format](/doc/new_frame_format.md)|[Notes on tracelog / wireshark](/doc/trace_notes.md)|[Notes on EMV](/doc/emv_notes.md)| |[Notes on external flash](/doc/ext_flash_notes.md)|[Notes on loclass](/doc/loclass_notes.md)|[Notes on Coverity Scan Config & Run](/doc/md/Development/Coverity-Scan-Config-%26-Run.md)| -|[Notes on file formats used with Proxmark3](/doc/extensions_notes.md)||| +|[Notes on file formats used with Proxmark3](/doc/extensions_notes.md)|[Notes on MFU binary format](/doc/mfu_binary_format_notes.md)|| |[Developing standalone mode](/armsrc/Standalone/readme.md)|[Wiki about standalone mode](https://github.com/RfidResearchGroup/proxmark3/wiki/Standalone-mode)|| From 243771fa3d51d0e7fa728d654e5b3fe19d59f0f6 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Sun, 24 May 2020 16:07:17 +0200 Subject: [PATCH 354/632] changelog --- CHANGELOG.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8fd7150b2..be3956739 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,14 +3,17 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] - -## [ice coffee.4.][2020-05-21] - Add doc/mfu_binary_format_notes.md (@iceman1001) - Fix `hf mfu dump` - now reads Ulev1 3counter vs NTAG 1 counters (@iceman1001) - Fix `hf mfu info` - now print correct cfg1 - nfc protection (@iceman1001) - Fix `hf mfu eload` - now detects and converts between plain/old/new mfu binary format (@iceman1001) - - Change log files moved to subfolders (@doegex) - - Change lib lua unbundled. (@doegex) + - Change, hitag2crack now integrated into main Makefile, tests added (@doegox) + - Add `make check` mechanics (@doegox) + - Change, log files moved to subfolders (@doegox) + - Change, use system Lua library if available (@doegox) + - Fix release version information (@doegox) + +## [ice coffee.4.9237][2020-05-21] - Updated documentation (@doegox, @iceman1001) - Change `pm3test.sh` - more regression tests to (@doegox, @iceman1001) - Change `hf 15 dump` - now supports basic json format (@iceman1001) From 0653feaec85d8256ebd8543ce0c499742caa871d Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Sun, 24 May 2020 20:35:09 +0200 Subject: [PATCH 355/632] Use system whereami if available --- client/Makefile | 15 ++++++++++++++- doc/md/Development/Maintainers.md | 1 + 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/client/Makefile b/client/Makefile index 363ff0089..f919a9388 100644 --- a/client/Makefile +++ b/client/Makefile @@ -89,6 +89,14 @@ ifneq ($(SKIPLUASYSTEM),1) endif endif +ifneq ($(SKIPWHEREAMISYSTEM),1) + ifneq (,$(wildcard /usr/include/whereami.h)) + WAILIBINC = + WAILIB = -lwhereami + WAISYSTEM = 1 + endif +endif + ifneq ($(SKIPBT),1) BTLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs bluez 2>/dev/null) endif @@ -188,7 +196,10 @@ else $(info native BT support: Bluez not found, disabled) endif ifeq ($(LUASYSTEM),1) -$(info system LUA: Lua5.2 found) +$(info Lua library: system library found) +endif +ifeq ($(WAISYSTEM),1) +$(info Whereami library: system library found) endif $(info compiler version: $(shell $(CC) --version|head -n 1)) $(info ===================================================================) @@ -443,8 +454,10 @@ cliparser: $(Q)$(MAKE) --no-print-directory -C $(CLIPARSERLIBPATH) all whereami: +ifneq ($(WAISYSTEM),1) $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C $(WAILIBPATH) all +endif # common libraries: mbedtls: diff --git a/doc/md/Development/Maintainers.md b/doc/md/Development/Maintainers.md index 09cddede7..5d1400a7f 100644 --- a/doc/md/Development/Maintainers.md +++ b/doc/md/Development/Maintainers.md @@ -62,6 +62,7 @@ It's also possible to skip parts even if libraries are present in the compilatio * `make client SKIPQT=1` to skip GUI even if Qt is present * `make client SKIPBT=1` to skip native Bluetooth support even if libbluetooth is present * `make client SKIPLUASYSTEM=1` to skip system Lua lib even if liblua5.2 is present, use embedded Lua lib instead +* `make client SKIPWHEREAMISYSTEM=1` to skip system Whereami lib even if libwhereami is present, use embedded whereami lib instead If you're cross-compiling, these ones might be useful: From 9d97962759e089e46c3087e92ed3a4e594ea81d3 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Sun, 24 May 2020 21:51:39 +0200 Subject: [PATCH 356/632] use system jansson if available --- CHANGELOG.md | 2 + client/CMakeLists.txt | 1 + client/Makefile | 24 +++- client/android/CMakeLists.txt | 1 + client/deps/jansson.cmake | 1 - client/deps/jansson/Makefile | 1 - client/deps/jansson/jansson.h | 8 -- client/src/emv/emvjson.h | 1 + .../jansson/path.c => src/jansson_path.c} | 105 +++++++++++++++++- client/src/jansson_path.h | 30 +++++ 10 files changed, 158 insertions(+), 16 deletions(-) rename client/{deps/jansson/path.c => src/jansson_path.c} (71%) create mode 100644 client/src/jansson_path.h diff --git a/CHANGELOG.md b/CHANGELOG.md index be3956739..d9d62254f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Add `make check` mechanics (@doegox) - Change, log files moved to subfolders (@doegox) - Change, use system Lua library if available (@doegox) + - Change, use system Jansson library if available (@doegox) + - Change, use system Whereami library if available (@doegox) - Fix release version information (@doegox) ## [ice coffee.4.9237][2020-05-21] diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index a56ea5a9a..64cfca623 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -165,6 +165,7 @@ set (TARGET_SOURCES src/fileutils.c src/flash.c src/graph.c + src/jansson_path.c src/preferences.c src/pm3_binlib.c src/pm3_bitlib.c diff --git a/client/Makefile b/client/Makefile index f919a9388..d3c969b9c 100644 --- a/client/Makefile +++ b/client/Makefile @@ -82,17 +82,27 @@ ZLIB = $(OBJDIR)/libz.a ifneq ($(SKIPLUASYSTEM),1) LUAINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags lua5.2 2>/dev/null) LUALDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs lua5.2 2>/dev/null) - ifneq ($(LUAINCLUDES),) + ifneq ($(LUALDLIBS),) LUALIB = $(LUALDLIBS) LUALIBINC = $(LUAINCLUDES) LUASYSTEM = 1 endif endif +ifneq ($(SKIPJANSSONSYSTEM),1) + JANSSONINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags jansson 2>/dev/null) + JANSSONLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs jansson 2>/dev/null) + ifneq ($(JANSSONLDLIBS),) + JANSSONLIB = $(JANSSONLDLIBS) + JANSSONLIBINC = $(JANSSONINCLUDES) + JANSSONSYSTEM = 1 + endif +endif + ifneq ($(SKIPWHEREAMISYSTEM),1) ifneq (,$(wildcard /usr/include/whereami.h)) - WAILIBINC = WAILIB = -lwhereami + WAILIBINC = WAISYSTEM = 1 endif endif @@ -195,6 +205,9 @@ $(info native BT support: Bluez found, enabled) else $(info native BT support: Bluez not found, disabled) endif +ifeq ($(JANSSONSYSTEM),1) +$(info Jansson library: system library found) +endif ifeq ($(LUASYSTEM),1) $(info Lua library: system library found) endif @@ -339,9 +352,8 @@ CMDSRCS = crapto1/crapto1.c \ wiegand_formats.c \ wiegand_formatutils.c \ cardhelper.c \ - preferences.c - - + preferences.c \ + jansson_path.c COREOBJS = $(CORESRCS:%.c=$(OBJDIR)/%.o) CMDOBJS = $(CMDSRCS:%.c=$(OBJDIR)/%.o) @@ -430,8 +442,10 @@ ifneq ($(LUASYSTEM),1) endif jansson: +ifneq ($(JANSSONSYSTEM),1) $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C $(JANSSONLIBPATH) all +endif tinycbor: $(info [*] MAKE $@) diff --git a/client/android/CMakeLists.txt b/client/android/CMakeLists.txt index 5b417ff63..ddaae2cd2 100644 --- a/client/android/CMakeLists.txt +++ b/client/android/CMakeLists.txt @@ -145,6 +145,7 @@ add_library(pm3rrg_rdv4 SHARED ${PM3_ROOT}/client/src/cmdlfpcf7931.c ${PM3_ROOT}/client/src/cmdhfmfhard.c ${PM3_ROOT}/client/src/cmdusart.c + ${PM3_ROOT}/client/src/jansson_path.c # android resources jni_tools.c pm3_main.c diff --git a/client/deps/jansson.cmake b/client/deps/jansson.cmake index a95ff0baf..c91a47047 100644 --- a/client/deps/jansson.cmake +++ b/client/deps/jansson.cmake @@ -9,7 +9,6 @@ add_library(pm3rrg_rdv4_jansson STATIC jansson/strbuffer.c jansson/strconv.c jansson/utf.c - jansson/path.c jansson/value.c ) diff --git a/client/deps/jansson/Makefile b/client/deps/jansson/Makefile index 5073b78a1..b51c4a77c 100644 --- a/client/deps/jansson/Makefile +++ b/client/deps/jansson/Makefile @@ -13,7 +13,6 @@ MYSRCS = \ strbuffer.c \ strconv.c \ utf.c \ - path.c \ value.c LIB_A = libjansson.a diff --git a/client/deps/jansson/jansson.h b/client/deps/jansson/jansson.h index 0f868c2f2..75cbb5d51 100644 --- a/client/deps/jansson/jansson.h +++ b/client/deps/jansson/jansson.h @@ -302,14 +302,6 @@ int json_equal(const json_t *json1, const json_t *json2); json_t *json_copy(json_t *json) JANSSON_ATTRS(warn_unused_result); json_t *json_deep_copy(const json_t *json) JANSSON_ATTRS(warn_unused_result); -json_t *json_path_get(const json_t *json, const char *path); -int json_path_set_new(json_t *json, const char *path, json_t *value, size_t flags, json_error_t *error); - -static JSON_INLINE -int json_path_set(json_t *json, const char *path, json_t *value, size_t flags, json_error_t *error) { - return json_path_set_new(json, path, json_incref(value), flags, error); -} - /* decoding */ #define JSON_REJECT_DUPLICATES 0x1 diff --git a/client/src/emv/emvjson.h b/client/src/emv/emvjson.h index f4f3d4fb4..e90aa42d8 100644 --- a/client/src/emv/emvjson.h +++ b/client/src/emv/emvjson.h @@ -13,6 +13,7 @@ #include "common.h" #include "jansson.h" +#include "jansson_path.h" #include "tlv.h" typedef struct { diff --git a/client/deps/jansson/path.c b/client/src/jansson_path.c similarity index 71% rename from client/deps/jansson/path.c rename to client/src/jansson_path.c index 11964ec6e..0c0d76a05 100644 --- a/client/deps/jansson/path.c +++ b/client/src/jansson_path.c @@ -11,7 +11,110 @@ #include <assert.h> #include "jansson.h" -#include "jansson_private.h" +#include "jansson_path.h" + +////// memory.c private functions + +/* C89 allows these to be macros */ +#undef malloc +#undef free + +/* memory function pointers */ +static json_malloc_t do_malloc = malloc; +static json_free_t do_free = free; + +static void *jsonp_malloc(size_t size) { + if (!size) + return NULL; + + return (*do_malloc)(size); +} + +static void jsonp_free(void *ptr) { + if (!ptr) + return; + + (*do_free)(ptr); +} + +static char *jsonp_strndup(const char *str, size_t len) { + char *new_str; + + new_str = jsonp_malloc(len + 1); + if (!new_str) + return NULL; + + memcpy(new_str, str, len); + new_str[len] = '\0'; + return new_str; +} + +static char *jsonp_strdup(const char *str) { + return jsonp_strndup(str, strlen(str)); +} + +////// error.c private functions + +static void jsonp_error_set_source(json_error_t *error, const char *source) { + size_t length; + + if (!error || !source) + return; + + length = strlen(source); + if (length < JSON_ERROR_SOURCE_LENGTH) { + strncpy(error->source, source, JSON_ERROR_SOURCE_LENGTH - 1); + } else { + size_t extra = length - JSON_ERROR_SOURCE_LENGTH + 4; + memcpy(error->source, "...", 3); + strncpy(error->source + 3, source + extra, length - extra + 1); + } +} + +static void jsonp_error_init(json_error_t *error, const char *source) { + if (error) { + error->text[0] = '\0'; + error->line = -1; + error->column = -1; + error->position = 0; + if (source) + jsonp_error_set_source(error, source); + else + error->source[0] = '\0'; + } +} + +static void jsonp_error_vset(json_error_t *error, int line, int column, + size_t position, enum json_error_code code, + const char *msg, va_list ap) { + if (!error) + return; + + if (error->text[0] != '\0') { + /* error already set */ + return; + } + + error->line = line; + error->column = column; + error->position = (int)position; + + vsnprintf(error->text, JSON_ERROR_TEXT_LENGTH - 1, msg, ap); + error->text[JSON_ERROR_TEXT_LENGTH - 2] = '\0'; + error->text[JSON_ERROR_TEXT_LENGTH - 1] = code; +} + +static void jsonp_error_set(json_error_t *error, int line, int column, + size_t position, enum json_error_code code, + const char *msg, ...) { + va_list ap; + va_start(ap, msg); + jsonp_error_vset(error, line, column, position, code, msg, ap); + va_end(ap); +} + + +// original path.c from jansson fork json_t *json_path_get(const json_t *json, const char *path) { static const char root_chr = '$', array_open = '['; diff --git a/client/src/jansson_path.h b/client/src/jansson_path.h new file mode 100644 index 000000000..7737c1634 --- /dev/null +++ b/client/src/jansson_path.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2009-2016 Petri Lehtinen <petri@digip.org> + * + * Jansson is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See LICENSE for details. + */ + +#ifndef JANSSON_PATH_H +#define JANSSON_PATH_H + +//#include <stdio.h> +#include <stdlib.h> /* for size_t */ +//#include <stdarg.h> + +#ifdef __cplusplus +extern "C" { +#endif + +json_t *json_path_get(const json_t *json, const char *path); +int json_path_set_new(json_t *json, const char *path, json_t *value, size_t flags, json_error_t *error); + +static JSON_INLINE +int json_path_set(json_t *json, const char *path, json_t *value, size_t flags, json_error_t *error) { + return json_path_set_new(json, path, json_incref(value), flags, error); +} + +#ifdef __cplusplus +} +#endif +#endif From 72acec580637862917466a832730c8430a2051d8 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Sun, 24 May 2020 23:23:55 +0200 Subject: [PATCH 357/632] Makefile & CMake rework --- client/Makefile | 634 ++++++++++++++++----------- client/deps/CMakeLists.txt | 40 +- client/deps/amiibo.cmake | 8 + client/deps/amiitool/Makefile | 2 +- client/deps/amiitool/amiibo.c | 4 +- client/deps/amiitool/drbg.c | 2 +- client/deps/mbedtls.cmake | 1 + client/deps/zlib.cmake | 1 + client/src/cmdflashmem.c | 4 +- client/src/cmdhffelica.c | 2 +- client/src/cmdhficlass.c | 2 +- client/src/cmdhfmfdes.c | 2 +- client/src/cmdhfmfdesfire_disabled.c | 4 +- client/src/cmdhfmfhard.c | 4 +- client/src/cmdhfmfu.c | 2 +- client/src/emv/crypto_polarssl.c | 4 +- client/src/emv/emv_roca.c | 2 +- client/src/emv/test/cryptotest.c | 26 +- client/src/fido/fidocore.c | 2 +- client/src/loclass/elite_crack.c | 2 +- client/src/loclass/ikeys.c | 2 +- client/src/mifare/desfire_crypto.c | 4 +- client/src/scripting.c | 4 +- 23 files changed, 467 insertions(+), 291 deletions(-) diff --git a/client/Makefile b/client/Makefile index d3c969b9c..59c08f144 100644 --- a/client/Makefile +++ b/client/Makefile @@ -4,11 +4,6 @@ # the license. #----------------------------------------------------------------------------- -# reveng will compile without macros, but these may be useful: -# Add -DBMPMACRO to use bitmap size constant macros (edit config.h) -# Add -DNOFORCE to disable the -F switch -# Add -DPRESETS to compile with preset models (edit config.h) - # Must be called before any Makefile include ROOT_DIR:=$(dir $(realpath $(lastword $(MAKEFILE_LIST)))) @@ -22,44 +17,45 @@ vpath %.dic dictionaries OBJDIR = obj LDLIBS ?= -L/usr/local/lib -LDLIBS += -lreadline -lm -ifneq ($(SKIPPTHREAD),1) -LDLIBS += -lpthread + +ifeq ($(platform),Darwin) + # cf brew info qt: qt not symlinked anymore + PKG_CONFIG_ENV := PKG_CONFIG_PATH=/usr/local/opt/qt/lib/pkgconfig endif -# RPi Zero gcc requires -latomic -# but MacOSX /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld -# doesn't recognize option --as-needed -ifneq ($(platform),Darwin) - LDLIBS += -Wl,--as-needed -latomic -Wl,--no-as-needed -endif +################### +# local libraries # +################### -# local libraries -LUALIBPATH = ./deps/liblua -LUALIBINC = -I$(LUALIBPATH) -LUALIB = $(LUALIBPATH)/liblua.a -JANSSONLIBPATH = ./deps/jansson -JANSSONLIBINC = -I$(JANSSONLIBPATH) -JANSSONLIB = $(JANSSONLIBPATH)/libjansson.a -CBORLIBPATH = ./deps/tinycbor -CBORLIBINC = -I$(CBORLIBPATH) -CBORLIB = $(CBORLIBPATH)/tinycbor.a -REVENGLIBPATH = ./deps/reveng -REVENGLIBINC = -I$(REVENGLIBPATH) -REVENGLIB = $(REVENGLIBPATH)/libreveng.a +## Amiibo AMIIBOLIBPATH = ./deps/amiitool AMIIBOLIBINC = -I$(AMIIBOLIBPATH) AMIIBOLIB = $(AMIIBOLIBPATH)/libamiibo.a -HARDNESTEDLIBPATH = ./deps/hardnested -HARDNESTEDLIBINC = -I$(HARDNESTEDLIBPATH) -HARDNESTEDLIB = $(HARDNESTEDLIBPATH)/libhardnested.a + +## Tinycbor +CBORLIBPATH = ./deps/tinycbor +CBORLIBINC = -I$(CBORLIBPATH) +CBORLIB = $(CBORLIBPATH)/tinycbor.a + +## Cliparser / Argtable3 CLIPARSERLIBPATH = ./deps/cliparser CLIPARSERLIBINC = -I$(CLIPARSERLIBPATH) CLIPARSERLIB = $(CLIPARSERLIBPATH)/libcliparser.a -WAILIBPATH = ./deps/whereami -WAILIBINC = -I$(WAILIBPATH) -WAILIB = $(WAILIBPATH)/libwhereami.a +## Hardnested +HARDNESTEDLIBPATH = ./deps/hardnested +HARDNESTEDLIBINC = -I$(HARDNESTEDLIBPATH) +HARDNESTEDLIB = $(HARDNESTEDLIBPATH)/libhardnested.a + +## Jansson +JANSSONLIBPATH = ./deps/jansson +JANSSONLIBINC = -I$(JANSSONLIBPATH) +JANSSONLIB = $(JANSSONLIBPATH)/libjansson.a + +## Lua +LUALIBPATH = ./deps/liblua +LUALIBINC = -I$(LUALIBPATH) +LUALIB = $(LUALIBPATH)/liblua.a LUAPLATFORM = generic ifneq (,$(findstring MINGW,$(platform))) LUAPLATFORM = mingw @@ -72,85 +68,195 @@ else endif endif -# common libraries +## Reveng +REVENGLIBPATH = ./deps/reveng +REVENGLIBINC = -I$(REVENGLIBPATH) +REVENGLIB = $(REVENGLIBPATH)/libreveng.a + +## Whereami +WAILIBPATH = ./deps/whereami +WAILIBINC = -I$(WAILIBPATH) +WAILIB = $(WAILIBPATH)/libwhereami.a + +########################## +# common local libraries # +########################## + +## mbed TLS MBEDTLSLIBPATH = ../common/mbedtls +MBEDTLSLIBINC = -I$(MBEDTLSLIBPATH) MBEDTLSLIB = $(OBJDIR)/libmbedtls.a + +## Zlib ZLIBPATH = ../common/zlib +ZLIBINC = -I$(ZLIBPATH) ZLIB = $(OBJDIR)/libz.a -# system libraries -ifneq ($(SKIPLUASYSTEM),1) - LUAINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags lua5.2 2>/dev/null) - LUALDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs lua5.2 2>/dev/null) - ifneq ($(LUALDLIBS),) - LUALIB = $(LUALDLIBS) - LUALIBINC = $(LUAINCLUDES) - LUASYSTEM = 1 - endif -endif +######################################################## +# optional system libraries to replace local libraries # +######################################################## +## Amiibo +# not distributed as system library +LDLIBS += $(AMIIBOLIB) +INCLUDES += $(AMIIBOLIBINC) + +## Tinycbor +# not distributed as system library +LDLIBS += $(CBORLIB) +INCLUDES += $(CBORLIBINC) + +## Cliparser / Argtable3 +# not distributed as system library +LDLIBS += $(CLIPARSERLIB) +INCLUDES += $(CLIPARSERLIBINC) + +## Hardnested +# not distributed as system library +LDLIBS += $(HARDNESTEDLIB) +INCLUDES += $(HARDNESTEDLIBINC) + +## Jansson ifneq ($(SKIPJANSSONSYSTEM),1) JANSSONINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags jansson 2>/dev/null) JANSSONLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs jansson 2>/dev/null) ifneq ($(JANSSONLDLIBS),) JANSSONLIB = $(JANSSONLDLIBS) JANSSONLIBINC = $(JANSSONINCLUDES) - JANSSONSYSTEM = 1 + JANSSON_FOUND = 1 endif endif +LDLIBS += $(JANSSONLIB) +INCLUDES += $(JANSSONLIBINC) +## Lua +ifneq ($(SKIPLUASYSTEM),1) + LUAINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags lua5.2 2>/dev/null) + LUALDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs lua5.2 2>/dev/null) + ifneq ($(LUALDLIBS),) + LUALIB = $(LUALDLIBS) + LUALIBINC = $(LUAINCLUDES) + LUA_FOUND = 1 + endif +endif +LDLIBS += $(LUALIB) +INCLUDES += $(LUALIBINC) + +## mbed TLS +# system library cannot be used because it is compiled by default without CMAC support +LDLIBS +=$(MBEDTLSLIB) +INCLUDES += $(MBEDTLSLIBINC) + +## Reveng +# not distributed as system library +LDLIBS += $(REVENGLIB) +INCLUDES += $(REVENGLIBINC) + +## Whereami ifneq ($(SKIPWHEREAMISYSTEM),1) ifneq (,$(wildcard /usr/include/whereami.h)) WAILIB = -lwhereami WAILIBINC = - WAISYSTEM = 1 + WAI_FOUND = 1 endif endif +LDLIBS += $(WAILIB) +INCLUDES += $(WAILIBINC) -ifneq ($(SKIPBT),1) - BTLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs bluez 2>/dev/null) +## Zlib +# system library useable? Need to recompress hardnested tables? +LDLIBS +=$(ZLIB) +INCLUDES += $(ZLIBINC) + +#################### +# system libraries # +#################### + +## Atomic +# RPi Zero gcc requires -latomic +# but MacOSX /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld +# doesn't recognize option --as-needed +ifneq ($(platform),Darwin) + LDLIBS += -Wl,--as-needed -latomic -Wl,--no-as-needed endif +## Bluez (optional) +ifneq ($(SKIPBT),1) + BTINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags bluez 2>/dev/null) + BTLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs bluez 2>/dev/null) + ifneq ($(BTLDLIBS),) + BTLIB = $(BTLDLIBS) + BTLIBINC = $(BTINCLUDES) + BT_FOUND = 1 + endif +endif +LDLIBS += $(BTLIB) +INCLUDES += $(BTLIBINC) + +## Readline +ifeq ($(platform),Darwin) + LDLIBS += -L/usr/local/opt/readline/lib + INCLUDES += -I/usr/local/opt/readline/include +endif +LDLIBS += -lreadline + +## Math +LDLIBS += -lm + +## Pthread +# Some have no pthread, e.g. termux +ifneq ($(SKIPPTHREAD),1) + LDLIBS += -lpthread +endif + +## QT5 (or QT4 fallback) (optional) ifneq ($(SKIPQT),1) # Check for correctly configured Qt5 QTINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags Qt5Core Qt5Widgets 2>/dev/null) QTLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs Qt5Core Qt5Widgets 2>/dev/null) MOC = $(shell $(PKG_CONFIG_ENV) pkg-config --variable=host_bins Qt5Core)/moc UIC = $(shell $(PKG_CONFIG_ENV) pkg-config --variable=host_bins Qt5Core)/uic - ifeq ($(QTINCLUDES), ) - # if Qt5 not found check for correctly configured Qt4 + ifneq ($(QTLDLIBS),) + QT5_FOUND = 1 + else + # if Qt5 not found check for correctly configured Qt4 QTINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags QtCore QtGui 2>/dev/null) QTLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs QtCore QtGui 2>/dev/null) MOC = $(shell $(PKG_CONFIG_ENV) pkg-config --variable=moc_location QtCore) UIC = $(shell $(PKG_CONFIG_ENV) pkg-config --variable=uic_location QtCore) - else - # On OSX Qt5 is claiming for a C++11 compiler (gnu++14 works too, but if nothing it fails) - QT5FOUND = 1 endif - ifeq ($(QTINCLUDES), ) - # if both pkg-config commands failed, search in common places - ifneq ($(QTDIR), ) - QTINCLUDES = -I$(QTDIR)/include -I$(QTDIR)/include/QtCore -I$(QTDIR)/include/QtGui - QTLDLIBS = -L$(QTDIR)/lib -lQtCore4 -lQtGui4 + ifeq ($(QTLDLIBS),) + # if both pkg-config commands failed, search in common places + ifneq ($(QTDIR),) ifneq ($(wildcard $(QTDIR)/include/QtWidgets),) - QTINCLUDES += -I$(QTDIR)/include/QtWidgets - QTLDLIBS = -L$(QTDIR)/lib -lQt5Widgets -lQt5Gui -lQt5Core - QT5FOUND = 1 + # QT5 + QTINCLUDES = -I$(QTDIR)/include -I$(QTDIR)/include/QtCore -I$(QTDIR)/include/QtGui -I$(QTDIR)/include/QtWidgets + QTLDLIBS = -L$(QTDIR)/lib -lQt5Core -lQt5Gui -lQt5Widgets + QT5_FOUND = 1 + else + # QT4 + QTINCLUDES = -I$(QTDIR)/include -I$(QTDIR)/include/QtCore -I$(QTDIR)/include/QtGui + QTLDLIBS = -L$(QTDIR)/lib -lQtCore4 -lQtGui4 endif MOC = $(QTDIR)/bin/moc UIC = $(QTDIR)/bin/uic endif endif + ifneq ($(QTLDLIBS),) + QT_FOUND = 1 + endif endif +LDLIBS += $(QTLDLIBS) +CXXINCLUDES += $(QTINCLUDES) -LIBS = $(LUALIBINC) $(MBEDTLSLIBINC) $(JANSSONLIBINC) $(CBORLIBINC) $(ZLIBINC) $(REVENGLIBINC) $(AMIIBOLIBINC) $(HARDNESTEDLIBINC) $(CLIPARSERLIBINC) $(WAILIBINC) -INCLUDES_CLIENT += -I./src -I../include -I../common -I../common_fpga $(LIBS) +####################################################################################################### CFLAGS ?= $(DEFCFLAGS) - # We cannot just use CFLAGS+=... because it has impact on sub-makes if CFLAGS is defined in env: -PM3CFLAGS = $(CFLAGS) $(INCLUDES_CLIENT) +PM3CFLAGS = $(CFLAGS) +PM3CFLAGS += -I./src -I../include -I../common -I../common_fpga $(INCLUDES) # WIP Testing -#PM3CFLAGS = $(CFLAGS) -std=c11 -pedantic $(INCLUDES_CLIENT) +#PM3CFLAGS += -std=c11 -pedantic + PREFIX ?= /usr/local ifneq (,$(findstring MINGW,$(platform))) # Mingw uses by default Microsoft printf, we want the GNU printf (e.g. for %z) @@ -160,220 +266,254 @@ ifneq (,$(findstring MINGW,$(platform))) PM3CFLAGS += -D_ISOC99_SOURCE PM3CFLAGS += -mno-ms-bitfields -fexec-charset=cp850 endif -ifeq ($(platform),Darwin) - OBJCSRCS = util_darwin.m - LDFLAGS += -framework Foundation -framework AppKit - LDLIBS := -L/usr/local/opt/readline/lib $(LDLIBS) - LIBS := -I/usr/local/opt/readline/include $(LIBS) - # cf brew info qt: qt not symlinked anymore - PKG_CONFIG_ENV := PKG_CONFIG_PATH=/usr/local/opt/qt/lib/pkgconfig -endif -CXXFLAGS ?= -Wall -Werror -O3 -PM3CXXFLAGS = $(CXXFLAGS) -I../include - -ifneq ($(BTLDLIBS),) +ifeq ($(BT_FOUND),1) PM3CFLAGS += -DHAVE_BLUEZ endif -ifneq ($(QTLDLIBS),) - QTGUISRCS = proxgui.cpp proxguiqt.cpp proxguiqt.moc.cpp - QTGUIOBJS = $(OBJDIR)/proxgui.o $(OBJDIR)/proxguiqt.o $(OBJDIR)/proxguiqt.moc.o +CXXFLAGS ?= -Wall -Werror -O3 +PM3CXXFLAGS = $(CXXFLAGS) +PM3CXXFLAGS += -I../include + +ifeq ($(QT_FOUND),1) PM3CFLAGS += -DHAVE_GUI PM3CXXFLAGS += -DQT_NO_DEBUG - ifeq ($(QT5FOUND),1) + ifeq ($(QT5_FOUND),1) + # On OSX Qt5 is claiming for a C++11 compiler (gnu++14 works too, but if nothing it fails) PM3CXXFLAGS += -fPIC -std=c++11 endif -else - QTGUISRCS = guidummy.cpp - QTGUIOBJS = $(OBJDIR)/guidummy.o endif +PM3LDFLAGS = $(LDFLAGS) +ifeq ($(platform),Darwin) + PM3LDFLAGS += -framework Foundation -framework AppKit +endif + +################### +# printing status # +################### + $(info ===================================================================) $(info Client platform: $(platform)) + ifeq ($(SKIPQT),1) -$(info GUI support: skipped) -else ifneq ($(QTLDLIBS),) -$(info GUI support: QT found, enabled) + $(info GUI support: skipped) +else ifeq ($(QT_FOUND),1) + ifeq ($(QT5_FOUND),1) + $(info GUI support: QT5 found, enabled) + else + $(info GUI support: QT4 found, enabled) + endif else -$(info GUI support: QT not found, disabled) + $(info GUI support: QT not found, disabled) endif + ifeq ($(SKIPBT),1) -$(info native BT support: skipped) + $(info native BT support: skipped) else ifneq ($(BTLDLIBS),) -$(info native BT support: Bluez found, enabled) + $(info native BT support: Bluez found, enabled) else -$(info native BT support: Bluez not found, disabled) + $(info native BT support: Bluez not found, disabled) endif -ifeq ($(JANSSONSYSTEM),1) -$(info Jansson library: system library found) + +ifeq ($(JANSSON_FOUND),1) + $(info Jansson library: system library found) endif -ifeq ($(LUASYSTEM),1) -$(info Lua library: system library found) + +ifeq ($(LUA_FOUND),1) + $(info Lua library: system library found) endif -ifeq ($(WAISYSTEM),1) -$(info Whereami library: system library found) + +ifeq ($(WAI_FOUND),1) + $(info Whereami library: system library found) endif + $(info compiler version: $(shell $(CC) --version|head -n 1)) $(info ===================================================================) +################ +# dependencies # +################ + # Flags to generate temporary dependency files DEPFLAGS = -MT $@ -MMD -MP -MF $(OBJDIR)/$*.Td # make temporary to final dependency files after successful compilation POSTCOMPILE = $(MV) -f $(OBJDIR)/$*.Td $(OBJDIR)/$*.d && $(TOUCH) $@ -CORESRCS = uart/uart_posix.c \ - uart/uart_win32.c \ - ui.c \ - commonutil.c \ - util.c \ - util_posix.c \ - scandir.c \ - crc16.c \ - crc32.c \ - comms.c \ - version.c +################ +# enumerations # +################ -CMDSRCS = crapto1/crapto1.c \ - crapto1/crypto1.c \ - mifare/mifaredefault.c \ - mifare/mfkey.c \ - tea.c \ - fido/additional_ca.c \ - fido/cose.c \ - fido/cbortools.c \ - fido/fidocore.c \ - crypto/asn1dump.c \ - crypto/libpcrypto.c\ - crypto/asn1utils.c\ - loclass/cipher.c \ - loclass/cipherutils.c \ - loclass/ikeys.c \ - loclass/elite_crack.c \ - fileutils.c \ - mifare/mifarehost.c \ - parity.c \ - crc.c \ - crc64.c \ - legic_prng.c \ - iso15693tools.c \ - prng.c \ - generator.c \ - graph.c \ - cmddata.c \ - lfdemod.c \ - emv/crypto_polarssl.c\ - emv/crypto.c\ - emv/emv_pk.c\ - emv/emv_pki.c\ - emv/emv_pki_priv.c\ - emv/test/cryptotest.c\ - emv/apduinfo.c \ - emv/dump.c \ - emv/tlv.c \ - emv/emv_tags.c \ - emv/dol.c \ - emv/emvjson.c\ - emv/emvcore.c \ - emv/test/crypto_test.c\ - emv/test/sda_test.c\ - emv/test/dda_test.c\ - emv/test/cda_test.c\ - emv/cmdemv.c \ - emv/emv_roca.c \ - mifare/mifare4.c \ - mifare/mad.c \ - mifare/ndef.c \ - mifare/desfire_crypto.c \ - cmdanalyse.c \ - cmdhf.c \ - cmdhflist.c \ - aidsearch.c \ - cmdhf14a.c \ - cmdhf14b.c \ - cmdhf15.c \ - cmdhfepa.c \ - cmdhflegic.c \ - cmdhficlass.c \ - cmdhfmf.c \ - cmdhfmfu.c \ - cmdhfmfp.c \ - cmdhfmfhard.c \ - cmdhfmfdes.c \ - cmdhftopaz.c \ - cmdhffido.c \ - cmdhffelica.c \ - cmdhfthinfilm.c \ - cmdhfcryptorf.c \ - cmdhflto.c \ - cmdhw.c \ - cmdlf.c \ - cmdlfawid.c \ - cmdlfcotag.c \ - cmdlfem4x.c \ - cmdlffdx.c \ - cmdlfguard.c \ - cmdlfgallagher.c \ - cmdlfhid.c \ - cmdlfhitag.c \ - cmdlfio.c \ - cmdlfindala.c \ - cmdlfjablotron.c \ - cmdlfkeri.c \ - cmdlfnexwatch.c \ - cmdlfnedap.c \ - cmdlfnoralsy.c \ - cmdlfpac.c \ - cmdlfparadox.c \ - cmdlfpcf7931.c \ - cmdlfpresco.c \ - cmdlfpyramid.c \ - cmdlfsecurakey.c \ - cmdlft55xx.c \ - cmdlfti.c \ - cmdlfviking.c \ - cmdlfvisa2000.c \ - cmdlfmotorola.c \ - cmdtrace.c \ - cmdflashmem.c \ - cmdflashmemspiffs.c \ - cmdsmartcard.c \ - cmdusart.c \ - cmdwiegand.c \ - cmdparser.c \ - cmdmain.c \ - pm3_binlib.c \ - scripting.c \ - cmdscript.c \ - pm3_bitlib.c \ - cmdcrc.c \ - bucketsort.c \ - flash.c \ - wiegand_formats.c \ - wiegand_formatutils.c \ - cardhelper.c \ - preferences.c \ - jansson_path.c +SRCS = aidsearch.c \ + cmdanalyse.c \ + cmdcrc.c \ + cmddata.c \ + cmdflashmem.c \ + cmdflashmemspiffs.c \ + cmdhf.c \ + cmdhf14a.c \ + cmdhf14b.c \ + cmdhf15.c \ + cmdhfcryptorf.c \ + cmdhfepa.c \ + cmdhffelica.c \ + cmdhffido.c \ + cmdhficlass.c \ + cmdhflegic.c \ + cmdhflist.c \ + cmdhflto.c \ + cmdhfmf.c \ + cmdhfmfdes.c \ + cmdhfmfhard.c \ + cmdhfmfu.c \ + cmdhfmfp.c \ + cmdhfthinfilm.c \ + cmdhftopaz.c \ + cmdhw.c \ + cmdlf.c \ + cmdlfawid.c \ + cmdlfcotag.c \ + cmdlfem4x.c \ + cmdlffdx.c \ + cmdlfguard.c \ + cmdlfgallagher.c \ + cmdlfhid.c \ + cmdlfhitag.c \ + cmdlfindala.c \ + cmdlfio.c \ + cmdlfjablotron.c \ + cmdlfkeri.c \ + cmdlfmotorola.c \ + cmdlfnedap.c \ + cmdlfnexwatch.c \ + cmdlfnoralsy.c \ + cmdlfpac.c \ + cmdlfparadox.c \ + cmdlfpcf7931.c \ + cmdlfpresco.c \ + cmdlfpyramid.c \ + cmdlfsecurakey.c \ + cmdlft55xx.c \ + cmdlfti.c \ + cmdlfviking.c \ + cmdlfvisa2000.c \ + cmdmain.c \ + cmdparser.c \ + cmdscript.c \ + cmdsmartcard.c \ + cmdtrace.c \ + cmdusart.c \ + cmdwiegand.c \ + comms.c \ + crypto/asn1dump.c \ + crypto/asn1utils.c\ + crypto/libpcrypto.c\ + emv/apduinfo.c \ + emv/cmdemv.c \ + emv/crypto.c\ + emv/crypto_polarssl.c\ + emv/dol.c \ + emv/dump.c \ + emv/emv_pk.c\ + emv/emv_pki.c\ + emv/emv_pki_priv.c\ + emv/emv_roca.c \ + emv/emv_tags.c \ + emv/emvcore.c \ + emv/emvjson.c\ + emv/tlv.c \ + emv/test/crypto_test.c\ + emv/test/cryptotest.c\ + emv/test/cda_test.c\ + emv/test/dda_test.c\ + emv/test/sda_test.c\ + fido/additional_ca.c \ + fido/cose.c \ + fido/cbortools.c \ + fido/fidocore.c \ + fileutils.c \ + flash.c \ + generator.c \ + graph.c \ + jansson_path.c \ + loclass/cipher.c \ + loclass/cipherutils.c \ + loclass/elite_crack.c \ + loclass/ikeys.c \ + mifare/desfire_crypto.c \ + mifare/mad.c \ + mifare/mfkey.c \ + mifare/mifare4.c \ + mifare/mifaredefault.c \ + mifare/mifarehost.c \ + mifare/ndef.c \ + pm3_binlib.c \ + pm3_bitlib.c \ + preferences.c \ + prng.c \ + proxmark3.c \ + scandir.c \ + uart/uart_posix.c \ + uart/uart_win32.c \ + scripting.c \ + tea.c \ + ui.c \ + util.c \ + version.c \ + wiegand_formats.c \ + wiegand_formatutils.c -COREOBJS = $(CORESRCS:%.c=$(OBJDIR)/%.o) -CMDOBJS = $(CMDSRCS:%.c=$(OBJDIR)/%.o) -OBJCOBJS = $(OBJCSRCS:%.m=$(OBJDIR)/%.o) +# common +SRCS += bucketsort.c \ + cardhelper.c \ + crapto1/crapto1.c \ + crapto1/crypto1.c \ + crc.c \ + crc16.c \ + crc32.c \ + crc64.c \ + commonutil.c \ + iso15693tools.c \ + legic_prng.c \ + lfdemod.c \ + parity.c \ + util_posix.c + +# gui +ifeq ($(QT_FOUND),1) + CXXSRCS = proxgui.cpp proxguiqt.cpp proxguiqt.moc.cpp +else + CXXSRCS = guidummy.cpp +endif + +# OS X +ifeq ($(platform),Darwin) + OBJCSRCS = util_darwin.m +endif + +OBJS = $(SRCS:%.c=$(OBJDIR)/%.o) +OBJS += $(CXXSRCS:%.cpp=$(OBJDIR)/%.o) +OBJS += $(OBJCSRCS:%.m=$(OBJDIR)/%.o) BINS = proxmark3 + CLEAN = $(BINS) src/version.c src/*.moc.cpp src/ui/ui_overlays.h lualibs/pm3_cmd.lua lualibs/mfc_default_keys.lua # transition: cleaning also old path stuff CLEAN += flasher *.moc.cpp ui/ui_overlays.h +########### +# targets # +########### + # need to assign dependancies to build these first... all: $(BINS) all-static: LDLIBS:=-static $(LDLIBS) all-static: $(BINS) -proxmark3: LDLIBS+=$(LUALIB) $(JANSSONLIB) $(MBEDTLSLIB) $(CBORLIB) $(ZLIB) $(REVENGLIB) $(AMIIBOLIB) $(HARDNESTEDLIB) $(CLIPARSERLIB) $(WAILIB) $(BTLDLIBS) $(QTLDLIBS) -proxmark3: $(OBJDIR)/proxmark3.o $(COREOBJS) $(CMDOBJS) $(OBJCOBJS) $(QTGUIOBJS) liblua jansson tinycbor reveng mbedtls zlib amiibo hardnested cliparser whereami lualibs/pm3_cmd.lua lualibs/mfc_default_keys.lua +proxmark3: $(OBJS) liblua jansson tinycbor reveng mbedtls zlib amiibo hardnested cliparser whereami lualibs/pm3_cmd.lua lualibs/mfc_default_keys.lua $(info [=] LD $@) - $(Q)$(LD) $(LDFLAGS) $(OBJDIR)/proxmark3.o $(COREOBJS) $(CMDOBJS) $(OBJCOBJS) $(QTGUIOBJS) $(LDLIBS) -o $@ + $(Q)$(LD) $(PM3LDFLAGS) $(OBJS) $(LDLIBS) -o $@ src/proxgui.cpp: src/ui/ui_overlays.h @@ -434,15 +574,18 @@ tarbin: $(BINS) $(info [=] TAR ../proxmark3-$(platform)-bin.tar) $(Q)$(TAR) $(TARFLAGS) ../proxmark3-$(platform)-bin.tar $(BINS:%=client/%) $(WINBINS:%=client/%) -# local libraries: +########################### +# local libraries targets # +########################### + liblua: -ifneq ($(LUASYSTEM),1) +ifneq ($(LUA_FOUND),1) $(info [*] MAKE $@ for $(LUAPLATFORM)) $(Q)$(MAKE) --no-print-directory -C $(LUALIBPATH) $(LUAPLATFORM) endif jansson: -ifneq ($(JANSSONSYSTEM),1) +ifneq ($(JANSSON_FOUND),1) $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C $(JANSSONLIBPATH) all endif @@ -468,7 +611,7 @@ cliparser: $(Q)$(MAKE) --no-print-directory -C $(CLIPARSERLIBPATH) all whereami: -ifneq ($(WAISYSTEM),1) +ifneq ($(WAI_FOUND),1) $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C $(WAILIBPATH) all endif @@ -482,6 +625,10 @@ zlib: $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C $(ZLIBPATH) OBJDIR=$(ROOT_DIR)$(OBJDIR) BINDIR=$(ROOT_DIR)$(OBJDIR) all +######## +# misc # +######## + .PHONY: all clean install uninstall tarbin liblua jansson tinycbor reveng hardnested amiibo cliparser whereami mbedtls zlib # version.c should be remade on every compilation @@ -503,7 +650,7 @@ $(OBJDIR)/%.o : %.c $(OBJDIR)/%.d $(OBJDIR)/%.o : %.cpp $(OBJDIR)/%.d $(info [-] CXX $<) $(Q)$(MKDIR) $(dir $@) - $(Q)$(CXX) $(DEPFLAGS) $(PM3CXXFLAGS) $(QTINCLUDES) -c -o $@ $< + $(Q)$(CXX) $(DEPFLAGS) $(PM3CXXFLAGS) $(CXXINCLUDES) -c -o $@ $< $(Q)$(POSTCOMPILE) %.o: %.m @@ -513,10 +660,9 @@ $(OBJDIR)/%.o : %.m $(OBJDIR)/%.d $(Q)$(CC) $(DEPFLAGS) $(PM3CFLAGS) -c -o $@ $< $(Q)$(POSTCOMPILE) -DEPENDENCY_FILES = $(patsubst %.c, $(OBJDIR)/%.d, $(CORESRCS) $(CMDSRCS)) \ - $(patsubst %.cpp, $(OBJDIR)/%.d, $(QTGUISRCS)) \ - $(patsubst %.m, $(OBJDIR)/%.d, $(OBJCSRCS)) \ - $(OBJDIR)/proxmark3.d +DEPENDENCY_FILES = $(patsubst %.c, $(OBJDIR)/%.d, $(SRCS)) \ + $(patsubst %.cpp, $(OBJDIR)/%.d, $(CXXSRCS)) \ + $(patsubst %.m, $(OBJDIR)/%.d, $(OBJCSRCS)) $(DEPENDENCY_FILES): ; .PRECIOUS: $(DEPENDENCY_FILES) diff --git a/client/deps/CMakeLists.txt b/client/deps/CMakeLists.txt index ac42065bf..a3908ec26 100644 --- a/client/deps/CMakeLists.txt +++ b/client/deps/CMakeLists.txt @@ -1,10 +1,30 @@ -include(cliparser.cmake) -include(tinycbor.cmake) -include(jansson.cmake) -include(lua.cmake) -include(mbedtls.cmake) -include(amiibo.cmake) -include(reveng.cmake) -include(zlib.cmake) -include(hardnested.cmake) -include(whereami.cmake) +if (NOT TARGET pm3rrg_rdv4_amiibo) + include(amiibo.cmake) +endif() +if (NOT TARGET pm3rrg_rdv4_cliparser) + include(cliparser.cmake) +endif() +if (NOT TARGET pm3rrg_rdv4_hardnested) + include(hardnested.cmake) +endif() +if (NOT TARGET pm3rrg_rdv4_jansson) + include(jansson.cmake) +endif() +if (NOT TARGET pm3rrg_rdv4_lua) + include(lua.cmake) +endif() +if (NOT TARGET pm3rrg_rdv4_mbedtls) + include(mbedtls.cmake) +endif() +if (NOT TARGET pm3rrg_rdv4_reveng) + include(reveng.cmake) +endif() +if (NOT TARGET pm3rrg_rdv4_tinycbor) + include(tinycbor.cmake) +endif() +if (NOT TARGET pm3rrg_rdv4_whereami) + include(whereami.cmake) +endif() +if (NOT TARGET pm3rrg_rdv4_z) + include(zlib.cmake) +endif() diff --git a/client/deps/amiibo.cmake b/client/deps/amiibo.cmake index 34780f597..23c7a7b57 100644 --- a/client/deps/amiibo.cmake +++ b/client/deps/amiibo.cmake @@ -11,6 +11,14 @@ add_library(pm3rrg_rdv4_amiibo STATIC amiitool/keygen.c ) +if (NOT TARGET pm3rrg_rdv4_mbedtls) + include(mbedtls.cmake) +endif() +find_library(pm3rrg_rdv4_mbedtls REQUIRED) +target_link_libraries(pm3rrg_rdv4_amiibo PRIVATE + readline + m + pm3rrg_rdv4_mbedtls) target_include_directories(pm3rrg_rdv4_amiibo PRIVATE ../../include ../../common) target_include_directories(pm3rrg_rdv4_amiibo INTERFACE amiitool) target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -Werror -O3) diff --git a/client/deps/amiitool/Makefile b/client/deps/amiitool/Makefile index 7fe532878..dd064227e 100644 --- a/client/deps/amiitool/Makefile +++ b/client/deps/amiitool/Makefile @@ -1,5 +1,5 @@ MYSRCPATHS = -MYINCLUDES = -I. -I.. -I../jansson -I../../../common -I../../../include +MYINCLUDES = -I. -I.. -I../jansson -I../../../common -I../../../common/mbedtls -I../../../include MYCFLAGS = MYDEFS = MYSRCS = \ diff --git a/client/deps/amiitool/amiibo.c b/client/deps/amiitool/amiibo.c index ad41220bb..cbe3a0ba0 100644 --- a/client/deps/amiitool/amiibo.c +++ b/client/deps/amiitool/amiibo.c @@ -6,8 +6,8 @@ */ #include "amiibo.h" -#include "mbedtls/md.h" -#include "mbedtls/aes.h" +#include "md.h" +#include "aes.h" #include "commonutil.h" #define HMAC_POS_DATA 0x008 diff --git a/client/deps/amiitool/drbg.c b/client/deps/amiitool/drbg.c index c1297920f..1aaba0a7f 100644 --- a/client/deps/amiitool/drbg.c +++ b/client/deps/amiitool/drbg.c @@ -8,7 +8,7 @@ #include "drbg.h" #include <assert.h> #include <string.h> -#include "mbedtls/md.h" +#include "md.h" void nfc3d_drbg_init(nfc3d_drbg_ctx *ctx, const uint8_t *hmacKey, size_t hmacKeySize, const uint8_t *seed, size_t seedSize) { assert(ctx != NULL); diff --git a/client/deps/mbedtls.cmake b/client/deps/mbedtls.cmake index 63e706889..b18537c84 100644 --- a/client/deps/mbedtls.cmake +++ b/client/deps/mbedtls.cmake @@ -45,5 +45,6 @@ add_library(pm3rrg_rdv4_mbedtls STATIC ) target_include_directories(pm3rrg_rdv4_mbedtls PRIVATE ../../common) +target_include_directories(pm3rrg_rdv4_mbedtls INTERFACE ../../common/mbedtls) target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_mbedtls PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/zlib.cmake b/client/deps/zlib.cmake index 645cbc88d..3a77c35aa 100644 --- a/client/deps/zlib.cmake +++ b/client/deps/zlib.cmake @@ -9,5 +9,6 @@ add_library(pm3rrg_rdv4_z STATIC ) target_compile_definitions(pm3rrg_rdv4_z PRIVATE Z_SOLO NO_GZIP ZLIB_PM3_TUNED) +target_include_directories(pm3rrg_rdv4_z INTERFACE ../../common/zlib) target_compile_options(pm3rrg_rdv4_z PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_z PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/src/cmdflashmem.c b/client/src/cmdflashmem.c index e1761a81b..e90e6025c 100644 --- a/client/src/cmdflashmem.c +++ b/client/src/cmdflashmem.c @@ -18,8 +18,8 @@ #include "comms.h" //getfromdevice #include "cmdflashmemspiffs.h" // spiffs commands -#include "mbedtls/rsa.h" -#include "mbedtls/sha1.h" +#include "rsa.h" +#include "sha1.h" #define MCK 48000000 #define FLASH_MINFAST 24000000 //33000000 diff --git a/client/src/cmdhffelica.c b/client/src/cmdhffelica.c index f7b7b00e3..1fcf23fa3 100644 --- a/client/src/cmdhffelica.c +++ b/client/src/cmdhffelica.c @@ -22,7 +22,7 @@ #include "util.h" #include "ui.h" #include "mifare.h" // felica_card_select_t struct -#include "mbedtls/des.h" +#include "des.h" #define AddCrc(data, len) compute_crc(CRC_FELICA, (data), (len), (data)+(len)+1, (data)+(len)) static int CmdHelp(const char *Cmd); diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 61aea9de6..3026f3964 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -18,7 +18,7 @@ #include "cmdtrace.h" #include "util_posix.h" #include "comms.h" -#include "mbedtls/des.h" +#include "des.h" #include "loclass/cipherutils.h" #include "loclass/cipher.h" #include "loclass/ikeys.h" diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index a39bd85c0..5e9a49c26 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -17,7 +17,7 @@ #include "comms.h" #include "ui.h" #include "cmdhf14a.h" -#include "mbedtls/aes.h" +#include "aes.h" #include "crypto/libpcrypto.h" #include "protocols.h" #include "cmdtrace.h" diff --git a/client/src/cmdhfmfdesfire_disabled.c b/client/src/cmdhfmfdesfire_disabled.c index e2d43630f..e2de33485 100644 --- a/client/src/cmdhfmfdesfire_disabled.c +++ b/client/src/cmdhfmfdesfire_disabled.c @@ -14,8 +14,8 @@ #include "cmdhfmf.h" #include "util.h" -#include "mbedtls/des.h" -#include "mbedtls/aes.h" +#include "des.h" +#include "aes.h" static int CmdHelp(const char *Cmd); diff --git a/client/src/cmdhfmfhard.c b/client/src/cmdhfmfhard.c index 52e3e4108..383a9676f 100644 --- a/client/src/cmdhfmfhard.c +++ b/client/src/cmdhfmfhard.c @@ -35,7 +35,7 @@ #include "hardnested_bruteforce.h" #include "hardnested_bf_core.h" #include "hardnested_bitarray_core.h" -#include "zlib/zlib.h" +#include "zlib.h" #include "fileutils.h" #define NUM_CHECK_BITFLIPS_THREADS (num_CPUs()) @@ -220,7 +220,7 @@ static void inflate_free(voidpf opaque, voidpf address) { #define INPUT_BUFFER_LEN 80 //---------------------------------------------------------------------------- -// Initialize decompression of the respective (HF or LF) FPGA stream +// Initialize decompression of the respective bitflip_bitarray stream //---------------------------------------------------------------------------- static void init_inflate(z_streamp compressed_stream, uint8_t *input_buffer, uint32_t insize, uint8_t *output_buffer, uint32_t outsize) { diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index b9dc8d3a2..efd10210d 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -12,7 +12,7 @@ #include "cmdparser.h" #include "commonutil.h" #include "crypto/libpcrypto.h" -#include "mbedtls/des.h" +#include "des.h" #include "cmdhfmf.h" #include "cmdhf14a.h" #include "comms.h" diff --git a/client/src/emv/crypto_polarssl.c b/client/src/emv/crypto_polarssl.c index 9d18a370b..0d582c7b3 100644 --- a/client/src/emv/crypto_polarssl.c +++ b/client/src/emv/crypto_polarssl.c @@ -23,8 +23,8 @@ #include <stdlib.h> #include <string.h> -#include "mbedtls/rsa.h" -#include "mbedtls/sha1.h" +#include "rsa.h" +#include "sha1.h" struct crypto_hash_polarssl { struct crypto_hash ch; diff --git a/client/src/emv/emv_roca.c b/client/src/emv/emv_roca.c index 521120b05..1bebcacbf 100644 --- a/client/src/emv/emv_roca.c +++ b/client/src/emv/emv_roca.c @@ -24,7 +24,7 @@ #include "emv_roca.h" #include "ui.h" // Print... -#include "mbedtls/bignum.h" +#include "bignum.h" static uint8_t g_primes[ROCA_PRINTS_LENGTH] = { 11, 13, 17, 19, 37, 53, 61, 71, 73, 79, 97, 103, 107, 109, 127, 151, 157 diff --git a/client/src/emv/test/cryptotest.c b/client/src/emv/test/cryptotest.c index f343ebbea..bb59de7fa 100644 --- a/client/src/emv/test/cryptotest.c +++ b/client/src/emv/test/cryptotest.c @@ -12,19 +12,19 @@ #include "util.h" #include "ui.h" -#include "mbedtls/bignum.h" -#include "mbedtls/aes.h" -#include "mbedtls/cmac.h" -#include "mbedtls/des.h" -#include "mbedtls/ecp.h" -#include "mbedtls/rsa.h" -#include "mbedtls/sha1.h" -#include "mbedtls/md5.h" -#include "mbedtls/x509.h" -#include "mbedtls/base64.h" -#include "mbedtls/ctr_drbg.h" -#include "mbedtls/entropy.h" -#include "mbedtls/timing.h" +#include "bignum.h" +#include "aes.h" +#include "cmac.h" +#include "des.h" +#include "ecp.h" +#include "rsa.h" +#include "sha1.h" +#include "md5.h" +#include "x509.h" +#include "base64.h" +#include "ctr_drbg.h" +#include "entropy.h" +#include "timing.h" #include "crypto_test.h" #include "sda_test.h" diff --git a/client/src/fido/fidocore.c b/client/src/fido/fidocore.c index 32d7c9ff0..3cddbc5a9 100644 --- a/client/src/fido/fidocore.c +++ b/client/src/fido/fidocore.c @@ -17,7 +17,7 @@ #include "emv/emvcore.h" #include "emv/emvjson.h" #include "cbortools.h" -#include "mbedtls/x509_crt.h" +#include "x509_crt.h" #include "crypto/asn1utils.h" #include "crypto/libpcrypto.h" #include "additional_ca.h" diff --git a/client/src/loclass/elite_crack.c b/client/src/loclass/elite_crack.c index cc9570351..83e2a9146 100644 --- a/client/src/loclass/elite_crack.c +++ b/client/src/loclass/elite_crack.c @@ -45,7 +45,7 @@ #include "ikeys.h" #include "elite_crack.h" #include "fileutils.h" -#include "mbedtls/des.h" +#include "des.h" #include "util_posix.h" /** diff --git a/client/src/loclass/ikeys.c b/client/src/loclass/ikeys.c index f50d276dc..cf14450bd 100644 --- a/client/src/loclass/ikeys.c +++ b/client/src/loclass/ikeys.c @@ -70,7 +70,7 @@ From "Dismantling iclass": #include "fileutils.h" #include "cipherutils.h" -#include "mbedtls/des.h" +#include "des.h" uint8_t pi[35] = { 0x0F, 0x17, 0x1B, 0x1D, 0x1E, 0x27, 0x2B, 0x2D, diff --git a/client/src/mifare/desfire_crypto.c b/client/src/mifare/desfire_crypto.c index 2cb9d7c3a..6dd2de26d 100644 --- a/client/src/mifare/desfire_crypto.c +++ b/client/src/mifare/desfire_crypto.c @@ -29,8 +29,8 @@ #include <stdlib.h> #include <string.h> #include "commonutil.h" -#include "mbedtls/aes.h" -#include "mbedtls/des.h" +#include "aes.h" +#include "des.h" #include "ui.h" #include "crc.h" #include "crc16.h" // crc16 ccitt diff --git a/client/src/scripting.c b/client/src/scripting.c index 4a3bab49c..a5c466ea4 100644 --- a/client/src/scripting.c +++ b/client/src/scripting.c @@ -21,8 +21,8 @@ #include "mifare/mifarehost.h" #include "crc.h" #include "crc64.h" -#include "mbedtls/sha1.h" -#include "mbedtls/aes.h" +#include "sha1.h" +#include "aes.h" #include "cmdcrc.h" #include "cmdhfmfhard.h" #include "cmdhfmfu.h" From b4716f78a82bc50394f1b55a51ab8d5867e1975e Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Mon, 25 May 2020 02:18:16 +0200 Subject: [PATCH 358/632] remove unused polarssl file --- client/src/polarssl_config.h | 2179 ---------------------------------- 1 file changed, 2179 deletions(-) delete mode 100644 client/src/polarssl_config.h diff --git a/client/src/polarssl_config.h b/client/src/polarssl_config.h deleted file mode 100644 index 5bd88fc07..000000000 --- a/client/src/polarssl_config.h +++ /dev/null @@ -1,2179 +0,0 @@ -/** - * \file config.h - * - * \brief Configuration options (set of defines) - * - * Copyright (C) 2006-2014, Brainspark B.V. - * - * This file is part of PolarSSL (http://www.polarssl.org) - * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org> - * - * All rights reserved. - * - * This program 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. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * This set of compile-time options may be used to enable - * or disable features selectively, and reduce the global - * memory footprint. - */ -#ifndef POLARSSL_CONFIG_H -#define POLARSSL_CONFIG_H - -#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) -#define _CRT_SECURE_NO_DEPRECATE 1 -#endif - -/** - * \name SECTION: System support - * - * This section sets system specific settings. - * \{ - */ - -/** - * \def POLARSSL_HAVE_INT8 - * - * The system uses 8-bit wide native integers. - * - * Uncomment if native integers are 8-bit wide. - */ -//#define POLARSSL_HAVE_INT8 - -/** - * \def POLARSSL_HAVE_INT16 - * - * The system uses 16-bit wide native integers. - * - * Uncomment if native integers are 16-bit wide. - */ -//#define POLARSSL_HAVE_INT16 - -/** - * \def POLARSSL_HAVE_LONGLONG - * - * The compiler supports the 'long long' type. - * (Only used on 32-bit platforms) - */ -#define POLARSSL_HAVE_LONGLONG - -/** - * \def POLARSSL_HAVE_ASM - * - * The compiler has support for asm(). - * - * Requires support for asm() in compiler. - * - * Used in: - * library/timing.c - * library/padlock.c - * include/polarssl/bn_mul.h - * - * Comment to disable the use of assembly code. - */ -#define POLARSSL_HAVE_ASM - -/** - * \def POLARSSL_HAVE_SSE2 - * - * CPU supports SSE2 instruction set. - * - * Uncomment if the CPU supports SSE2 (IA-32 specific). - */ -//#define POLARSSL_HAVE_SSE2 - -/** - * \def POLARSSL_HAVE_TIME - * - * System has time.h and time() / localtime() / gettimeofday(). - * - * Comment if your system does not support time functions - */ -#define POLARSSL_HAVE_TIME - -/** - * \def POLARSSL_HAVE_IPV6 - * - * System supports the basic socket interface for IPv6 (RFC 3493), - * specifically getaddrinfo(), freeaddrinfo() and struct sockaddr_storage. - * - * Note: on Windows/MingW, XP or higher is required. - * - * Comment if your system does not support the IPv6 socket interface - */ -#define POLARSSL_HAVE_IPV6 - -/** - * \def POLARSSL_PLATFORM_MEMORY - * - * Enable the memory allocation layer. - * - * By default PolarSSL uses the system-provided malloc() and free(). - * This allows different allocators (self-implemented or provided) to be - * provided to the platform abstraction layer. - * - * Enabling POLARSSL_PLATFORM_MEMORY will provide "platform_set_malloc_free()" - * to allow you to set an alternative malloc() and free() function pointer. - * - * Requires: POLARSSL_PLATFORM_C - * - * Enable this layer to allow use of alternative memory allocators. - */ -//#define POLARSSL_PLATFORM_MEMORY - -/** - * \def POLARSSL_PLATFORM_NO_STD_FUNCTIONS - * - * Do not assign standard functions in the platform layer (e.g. malloc() to - * POLARSSL_PLATFORM_STD_MALLOC and printf() to POLARSSL_PLATFORM_STD_PRINTF) - * - * This makes sure there are no linking errors on platforms that do not support - * these functions. You will HAVE to provide alternatives, either at runtime - * via the platform_set_xxx() functions or at compile time by setting - * the POLARSSL_PLATFORM_STD_XXX defines. - * - * Requires: POLARSSL_PLATFORM_C - * - * Uncomment to prevent default assignment of standard functions in the - * platform layer. - */ -//#define POLARSSL_PLATFORM_NO_STD_FUNCTIONS - -/** - * \def POLARSSL_PLATFORM_XXX_ALT - * - * Uncomment a macro to let PolarSSL support the function in the platform - * abstraction layer. - * - * Example: In case you uncomment POLARSSL_PLATFORM_PRINTF_ALT, PolarSSL will - * provide a function "platform_set_printf()" that allows you to set an - * alternative printf function pointer. - * - * All these define require POLARSSL_PLATFORM_C to be defined! - * - * Uncomment a macro to enable alternate implementation of specific base - * platform function - */ -//#define POLARSSL_PLATFORM_PRINTF_ALT -//#define POLARSSL_PLATFORM_FPRINTF_ALT -/* \} name SECTION: System support */ - -/** - * \name SECTION: PolarSSL feature support - * - * This section sets support for features that are or are not needed - * within the modules that are enabled. - * \{ - */ - -/** - * \def POLARSSL_TIMING_ALT - * - * Uncomment to provide your own alternate implementation for hardclock(), - * get_timer(), set_alarm() and m_sleep(). - * - * Only works if you have POLARSSL_TIMING_C enabled. - * - * You will need to provide a header "timing_alt.h" and an implementation at - * compile time. - */ -//#define POLARSSL_TIMING_ALT - -/** - * \def POLARSSL_XXX_ALT - * - * Uncomment a macro to let PolarSSL use your alternate core implementation of - * a symmetric or hash algorithm (e.g. platform specific assembly optimized - * implementations). Keep in mind that the function prototypes should remain - * the same. - * - * Example: In case you uncomment POLARSSL_AES_ALT, PolarSSL will no longer - * provide the "struct aes_context" definition and omit the base function - * declarations and implementations. "aes_alt.h" will be included from - * "aes.h" to include the new function definitions. - * - * Uncomment a macro to enable alternate implementation for core algorithm - * functions - */ -//#define POLARSSL_AES_ALT -//#define POLARSSL_ARC4_ALT -//#define POLARSSL_BLOWFISH_ALT -//#define POLARSSL_CAMELLIA_ALT -//#define POLARSSL_DES_ALT -//#define POLARSSL_XTEA_ALT -//#define POLARSSL_MD2_ALT -//#define POLARSSL_MD4_ALT -//#define POLARSSL_MD5_ALT -//#define POLARSSL_RIPEMD160_ALT -//#define POLARSSL_SHA1_ALT -//#define POLARSSL_SHA256_ALT -//#define POLARSSL_SHA512_ALT - -/** - * \def POLARSSL_AES_ROM_TABLES - * - * Store the AES tables in ROM. - * - * Uncomment this macro to store the AES tables in ROM. - * - */ -//#define POLARSSL_AES_ROM_TABLES - -/** - * \def POLARSSL_CIPHER_MODE_CBC - * - * Enable Cipher Block Chaining mode (CBC) for symmetric ciphers. - */ -#define POLARSSL_CIPHER_MODE_CBC - -/** - * \def POLARSSL_CIPHER_MODE_CFB - * - * Enable Cipher Feedback mode (CFB) for symmetric ciphers. - */ -#define POLARSSL_CIPHER_MODE_CFB - -/** - * \def POLARSSL_CIPHER_MODE_CTR - * - * Enable Counter Block Cipher mode (CTR) for symmetric ciphers. - */ -#define POLARSSL_CIPHER_MODE_CTR - -/** - * \def POLARSSL_CIPHER_NULL_CIPHER - * - * Enable NULL cipher. - * Warning: Only do so when you know what you are doing. This allows for - * encryption or channels without any security! - * - * Requires POLARSSL_ENABLE_WEAK_CIPHERSUITES as well to enable - * the following ciphersuites: - * TLS_ECDH_ECDSA_WITH_NULL_SHA - * TLS_ECDH_RSA_WITH_NULL_SHA - * TLS_ECDHE_ECDSA_WITH_NULL_SHA - * TLS_ECDHE_RSA_WITH_NULL_SHA - * TLS_ECDHE_PSK_WITH_NULL_SHA384 - * TLS_ECDHE_PSK_WITH_NULL_SHA256 - * TLS_ECDHE_PSK_WITH_NULL_SHA - * TLS_DHE_PSK_WITH_NULL_SHA384 - * TLS_DHE_PSK_WITH_NULL_SHA256 - * TLS_DHE_PSK_WITH_NULL_SHA - * TLS_RSA_WITH_NULL_SHA256 - * TLS_RSA_WITH_NULL_SHA - * TLS_RSA_WITH_NULL_MD5 - * TLS_RSA_PSK_WITH_NULL_SHA384 - * TLS_RSA_PSK_WITH_NULL_SHA256 - * TLS_RSA_PSK_WITH_NULL_SHA - * TLS_PSK_WITH_NULL_SHA384 - * TLS_PSK_WITH_NULL_SHA256 - * TLS_PSK_WITH_NULL_SHA - * - * Uncomment this macro to enable the NULL cipher and ciphersuites - */ -//#define POLARSSL_CIPHER_NULL_CIPHER - -/** - * \def POLARSSL_CIPHER_PADDING_XXX - * - * Uncomment or comment macros to add support for specific padding modes - * in the cipher layer with cipher modes that support padding (e.g. CBC) - * - * If you disable all padding modes, only full blocks can be used with CBC. - * - * Enable padding modes in the cipher layer. - */ -#define POLARSSL_CIPHER_PADDING_PKCS7 -#define POLARSSL_CIPHER_PADDING_ONE_AND_ZEROS -#define POLARSSL_CIPHER_PADDING_ZEROS_AND_LEN -#define POLARSSL_CIPHER_PADDING_ZEROS - -/** - * \def POLARSSL_ENABLE_WEAK_CIPHERSUITES - * - * Enable weak ciphersuites in SSL / TLS. - * Warning: Only do so when you know what you are doing. This allows for - * channels with virtually no security at all! - * - * This enables the following ciphersuites: - * TLS_RSA_WITH_DES_CBC_SHA - * TLS_DHE_RSA_WITH_DES_CBC_SHA - * - * Uncomment this macro to enable weak ciphersuites - */ -//#define POLARSSL_ENABLE_WEAK_CIPHERSUITES - -/** - * \def POLARSSL_REMOVE_ARC4_CIPHERSUITES - * - * Remove RC4 ciphersuites by default in SSL / TLS. - * This flag removes the ciphersuites based on RC4 from the default list as - * returned by ssl_list_ciphersuites(). However, it is still possible to - * enable (some of) them with ssl_set_ciphersuites() by including them - * explicitly. - * - * Uncomment this macro to remove RC4 ciphersuites by default. - */ -//#define POLARSSL_REMOVE_ARC4_CIPHERSUITES - -/** - * \def POLARSSL_ECP_XXXX_ENABLED - * - * Enables specific curves within the Elliptic Curve module. - * By default all supported curves are enabled. - * - * Comment macros to disable the curve and functions for it - */ -#define POLARSSL_ECP_DP_SECP192R1_ENABLED -#define POLARSSL_ECP_DP_SECP224R1_ENABLED -#define POLARSSL_ECP_DP_SECP256R1_ENABLED -#define POLARSSL_ECP_DP_SECP384R1_ENABLED -#define POLARSSL_ECP_DP_SECP521R1_ENABLED -#define POLARSSL_ECP_DP_SECP192K1_ENABLED -#define POLARSSL_ECP_DP_SECP224K1_ENABLED -#define POLARSSL_ECP_DP_SECP256K1_ENABLED -#define POLARSSL_ECP_DP_BP256R1_ENABLED -#define POLARSSL_ECP_DP_BP384R1_ENABLED -#define POLARSSL_ECP_DP_BP512R1_ENABLED -//#define POLARSSL_ECP_DP_M221_ENABLED // Not implemented yet! -#define POLARSSL_ECP_DP_M255_ENABLED -//#define POLARSSL_ECP_DP_M383_ENABLED // Not implemented yet! -//#define POLARSSL_ECP_DP_M511_ENABLED // Not implemented yet! - -/** - * \def POLARSSL_ECP_NIST_OPTIM - * - * Enable specific 'modulo p' routines for each NIST prime. - * Depending on the prime and architecture, makes operations 4 to 8 times - * faster on the corresponding curve. - * - * Comment this macro to disable NIST curves optimisation. - */ -#define POLARSSL_ECP_NIST_OPTIM - -/** - * \def POLARSSL_ECDSA_DETERMINISTIC - * - * Enable deterministic ECDSA (RFC 6979). - * Standard ECDSA is "fragile" in the sense that lack of entropy when signing - * may result in a compromise of the long-term signing key. This is avoided by - * the deterministic variant. - * - * Requires: POLARSSL_HMAC_DRBG_C - * - * Comment this macro to disable deterministic ECDSA. - */ -#define POLARSSL_ECDSA_DETERMINISTIC - -/** - * \def POLARSSL_KEY_EXCHANGE_PSK_ENABLED - * - * Enable the PSK based ciphersuite modes in SSL / TLS. - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * TLS_PSK_WITH_AES_256_GCM_SHA384 - * TLS_PSK_WITH_AES_256_CBC_SHA384 - * TLS_PSK_WITH_AES_256_CBC_SHA - * TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 - * TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 - * TLS_PSK_WITH_AES_128_GCM_SHA256 - * TLS_PSK_WITH_AES_128_CBC_SHA256 - * TLS_PSK_WITH_AES_128_CBC_SHA - * TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 - * TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 - * TLS_PSK_WITH_3DES_EDE_CBC_SHA - * TLS_PSK_WITH_RC4_128_SHA - */ -#define POLARSSL_KEY_EXCHANGE_PSK_ENABLED - -/** - * \def POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED - * - * Enable the DHE-PSK based ciphersuite modes in SSL / TLS. - * - * Requires: POLARSSL_DHM_C - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 - * TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 - * TLS_DHE_PSK_WITH_AES_256_CBC_SHA - * TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 - * TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 - * TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 - * TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 - * TLS_DHE_PSK_WITH_AES_128_CBC_SHA - * TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 - * TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 - * TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA - * TLS_DHE_PSK_WITH_RC4_128_SHA - */ -#define POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED - -/** - * \def POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED - * - * Enable the ECDHE-PSK based ciphersuite modes in SSL / TLS. - * - * Requires: POLARSSL_ECDH_C - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 - * TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA - * TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 - * TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 - * TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA - * TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 - * TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA - * TLS_ECDHE_PSK_WITH_RC4_128_SHA - */ -#define POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED - -/** - * \def POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED - * - * Enable the RSA-PSK based ciphersuite modes in SSL / TLS. - * - * Requires: POLARSSL_RSA_C, POLARSSL_PKCS1_V15, - * POLARSSL_X509_CRT_PARSE_C - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 - * TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 - * TLS_RSA_PSK_WITH_AES_256_CBC_SHA - * TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 - * TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 - * TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 - * TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 - * TLS_RSA_PSK_WITH_AES_128_CBC_SHA - * TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 - * TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 - * TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA - * TLS_RSA_PSK_WITH_RC4_128_SHA - */ -#define POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED - -/** - * \def POLARSSL_KEY_EXCHANGE_RSA_ENABLED - * - * Enable the RSA-only based ciphersuite modes in SSL / TLS. - * - * Requires: POLARSSL_RSA_C, POLARSSL_PKCS1_V15, - * POLARSSL_X509_CRT_PARSE_C - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * TLS_RSA_WITH_AES_256_GCM_SHA384 - * TLS_RSA_WITH_AES_256_CBC_SHA256 - * TLS_RSA_WITH_AES_256_CBC_SHA - * TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 - * TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 - * TLS_RSA_WITH_CAMELLIA_256_CBC_SHA - * TLS_RSA_WITH_AES_128_GCM_SHA256 - * TLS_RSA_WITH_AES_128_CBC_SHA256 - * TLS_RSA_WITH_AES_128_CBC_SHA - * TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 - * TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 - * TLS_RSA_WITH_CAMELLIA_128_CBC_SHA - * TLS_RSA_WITH_3DES_EDE_CBC_SHA - * TLS_RSA_WITH_RC4_128_SHA - * TLS_RSA_WITH_RC4_128_MD5 - */ -#define POLARSSL_KEY_EXCHANGE_RSA_ENABLED - -/** - * \def POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED - * - * Enable the DHE-RSA based ciphersuite modes in SSL / TLS. - * - * Requires: POLARSSL_DHM_C, POLARSSL_RSA_C, POLARSSL_PKCS1_V15, - * POLARSSL_X509_CRT_PARSE_C - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 - * TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 - * TLS_DHE_RSA_WITH_AES_256_CBC_SHA - * TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 - * TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 - * TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA - * TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 - * TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 - * TLS_DHE_RSA_WITH_AES_128_CBC_SHA - * TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 - * TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 - * TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA - * TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - */ -#define POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED - -/** - * \def POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED - * - * Enable the ECDHE-RSA based ciphersuite modes in SSL / TLS. - * - * Requires: POLARSSL_ECDH_C, POLARSSL_RSA_C, POLARSSL_PKCS1_V15, - * POLARSSL_X509_CRT_PARSE_C - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 - * TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 - * TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - * TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 - * TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 - * TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - * TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 - * TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - * TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 - * TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 - * TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA - * TLS_ECDHE_RSA_WITH_RC4_128_SHA - */ -#define POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED - -/** - * \def POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED - * - * Enable the ECDHE-ECDSA based ciphersuite modes in SSL / TLS. - * - * Requires: POLARSSL_ECDH_C, POLARSSL_ECDSA_C, POLARSSL_X509_CRT_PARSE_C, - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - * TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 - * TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA - * TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 - * TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 - * TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 - * TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 - * TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA - * TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 - * TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 - * TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA - * TLS_ECDHE_ECDSA_WITH_RC4_128_SHA - */ -#define POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED - -/** - * \def POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED - * - * Enable the ECDH-ECDSA based ciphersuite modes in SSL / TLS. - * - * Requires: POLARSSL_ECDH_C, POLARSSL_X509_CRT_PARSE_C - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * TLS_ECDH_ECDSA_WITH_RC4_128_SHA - * TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA - * TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA - * TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA - * TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 - * TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 - * TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 - * TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 - * TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 - * TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 - * TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 - * TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 - */ -#define POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED - -/** - * \def POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED - * - * Enable the ECDH-RSA based ciphersuite modes in SSL / TLS. - * - * Requires: POLARSSL_ECDH_C, POLARSSL_X509_CRT_PARSE_C - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * TLS_ECDH_RSA_WITH_RC4_128_SHA - * TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA - * TLS_ECDH_RSA_WITH_AES_128_CBC_SHA - * TLS_ECDH_RSA_WITH_AES_256_CBC_SHA - * TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 - * TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 - * TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 - * TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 - * TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 - * TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 - * TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 - * TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 - */ -#define POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED - -/** - * \def POLARSSL_PK_PARSE_EC_EXTENDED - * - * Enhance support for reading EC keys using variants of SEC1 not allowed by - * RFC 5915 and RFC 5480. - * - * Currently this means parsing the SpecifiedECDomain choice of EC - * parameters (only known groups are supported, not arbitrary domains, to - * avoid validation issues). - * - * Disable if you only need to support RFC 5915 + 5480 key formats. - */ -#define POLARSSL_PK_PARSE_EC_EXTENDED - -/** - * \def POLARSSL_ERROR_STRERROR_BC - * - * Make available the backward compatible error_strerror() next to the - * current polarssl_strerror(). - * - * For new code, it is recommended to use polarssl_strerror() instead and - * disable this. - * - * Disable if you run into name conflicts and want to really remove the - * error_strerror() - */ -#define POLARSSL_ERROR_STRERROR_BC - -/** - * \def POLARSSL_ERROR_STRERROR_DUMMY - * - * Enable a dummy error function to make use of polarssl_strerror() in - * third party libraries easier when POLARSSL_ERROR_C is disabled - * (no effect when POLARSSL_ERROR_C is enabled). - * - * You can safely disable this if POLARSSL_ERROR_C is enabled, or if you're - * not using polarssl_strerror() or error_strerror() in your application. - * - * Disable if you run into name conflicts and want to really remove the - * polarssl_strerror() - */ -#define POLARSSL_ERROR_STRERROR_DUMMY - -/** - * \def POLARSSL_GENPRIME - * - * Enable the prime-number generation code. - * - * Requires: POLARSSL_BIGNUM_C - */ -#define POLARSSL_GENPRIME - -/** - * \def POLARSSL_FS_IO - * - * Enable functions that use the filesystem. - */ -#define POLARSSL_FS_IO - -/** - * \def POLARSSL_NO_DEFAULT_ENTROPY_SOURCES - * - * Do not add default entropy sources. These are the platform specific, - * hardclock and HAVEGE based poll functions. - * - * This is useful to have more control over the added entropy sources in an - * application. - * - * Uncomment this macro to prevent loading of default entropy functions. - */ -//#define POLARSSL_NO_DEFAULT_ENTROPY_SOURCES - -/** - * \def POLARSSL_NO_PLATFORM_ENTROPY - * - * Do not use built-in platform entropy functions. - * This is useful if your platform does not support - * standards like the /dev/urandom or Windows CryptoAPI. - * - * Uncomment this macro to disable the built-in platform entropy functions. - */ -//#define POLARSSL_NO_PLATFORM_ENTROPY - -/** - * \def POLARSSL_ENTROPY_FORCE_SHA256 - * - * Force the entropy accumulator to use a SHA-256 accumulator instead of the - * default SHA-512 based one (if both are available). - * - * Requires: POLARSSL_SHA256_C - * - * On 32-bit systems SHA-256 can be much faster than SHA-512. Use this option - * if you have performance concerns. - * - * This option is only useful if both POLARSSL_SHA256_C and - * POLARSSL_SHA512_C are defined. Otherwise the available hash module is used. - */ -//#define POLARSSL_ENTROPY_FORCE_SHA256 - -/** - * \def POLARSSL_MEMORY_DEBUG - * - * Enable debugging of buffer allocator memory issues. Automatically prints - * (to stderr) all (fatal) messages on memory allocation issues. Enables - * function for 'debug output' of allocated memory. - * - * Requires: POLARSSL_MEMORY_BUFFER_ALLOC_C - * - * Uncomment this macro to let the buffer allocator print out error messages. - */ -//#define POLARSSL_MEMORY_DEBUG - -/** - * \def POLARSSL_MEMORY_BACKTRACE - * - * Include backtrace information with each allocated block. - * - * Requires: POLARSSL_MEMORY_BUFFER_ALLOC_C - * GLIBC-compatible backtrace() an backtrace_symbols() support - * - * Uncomment this macro to include backtrace information - */ -//#define POLARSSL_MEMORY_BACKTRACE - -/** - * \def POLARSSL_PKCS1_V15 - * - * Enable support for PKCS#1 v1.5 encoding. - * - * Requires: POLARSSL_RSA_C - * - * This enables support for PKCS#1 v1.5 operations. - */ -#define POLARSSL_PKCS1_V15 - -/** - * \def POLARSSL_PKCS1_V21 - * - * Enable support for PKCS#1 v2.1 encoding. - * - * Requires: POLARSSL_MD_C, POLARSSL_RSA_C - * - * This enables support for RSAES-OAEP and RSASSA-PSS operations. - */ -#define POLARSSL_PKCS1_V21 - -/** - * \def POLARSSL_RSA_NO_CRT - * - * Do not use the Chinese Remainder Theorem for the RSA private operation. - * - * Uncomment this macro to disable the use of CRT in RSA. - * - */ -//#define POLARSSL_RSA_NO_CRT - -/** - * \def POLARSSL_SELF_TEST - * - * Enable the checkup functions (*_self_test). - */ -#define POLARSSL_SELF_TEST - -/** - * \def POLARSSL_SSL_ALL_ALERT_MESSAGES - * - * Enable sending of alert messages in case of encountered errors as per RFC. - * If you choose not to send the alert messages, PolarSSL can still communicate - * with other servers, only debugging of failures is harder. - * - * The advantage of not sending alert messages, is that no information is given - * about reasons for failures thus preventing adversaries of gaining intel. - * - * Enable sending of all alert messages - */ -#define POLARSSL_SSL_ALERT_MESSAGES - -/** - * \def POLARSSL_SSL_DEBUG_ALL - * - * Enable the debug messages in SSL module for all issues. - * Debug messages have been disabled in some places to prevent timing - * attacks due to (unbalanced) debugging function calls. - * - * If you need all error reporting you should enable this during debugging, - * but remove this for production servers that should log as well. - * - * Uncomment this macro to report all debug messages on errors introducing - * a timing side-channel. - * - */ -//#define POLARSSL_SSL_DEBUG_ALL - -/** - * \def POLARSSL_SSL_HW_RECORD_ACCEL - * - * Enable hooking functions in SSL module for hardware acceleration of - * individual records. - * - * Uncomment this macro to enable hooking functions. - */ -//#define POLARSSL_SSL_HW_RECORD_ACCEL - -/** - * \def POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO - * - * Enable support for receiving and parsing SSLv2 Client Hello messages for the - * SSL Server module (POLARSSL_SSL_SRV_C). - * - * Comment this macro to disable support for SSLv2 Client Hello messages. - */ -#define POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO - -/** - * \def POLARSSL_SSL_SRV_RESPECT_CLIENT_PREFERENCE - * - * Pick the ciphersuite according to the client's preferences rather than ours - * in the SSL Server module (POLARSSL_SSL_SRV_C). - * - * Uncomment this macro to respect client's ciphersuite order - */ -//#define POLARSSL_SSL_SRV_RESPECT_CLIENT_PREFERENCE - -/** - * \def POLARSSL_SSL_MAX_FRAGMENT_LENGTH - * - * Enable support for RFC 6066 max_fragment_length extension in SSL. - * - * Comment this macro to disable support for the max_fragment_length extension - */ -#define POLARSSL_SSL_MAX_FRAGMENT_LENGTH - -/** - * \def POLARSSL_SSL_PROTO_SSL3 - * - * Enable support for SSL 3.0. - * - * Requires: POLARSSL_MD5_C - * POLARSSL_SHA1_C - * - * Comment this macro to disable support for SSL 3.0 - */ -#define POLARSSL_SSL_PROTO_SSL3 - -/** - * \def POLARSSL_SSL_PROTO_TLS1 - * - * Enable support for TLS 1.0. - * - * Requires: POLARSSL_MD5_C - * POLARSSL_SHA1_C - * - * Comment this macro to disable support for TLS 1.0 - */ -#define POLARSSL_SSL_PROTO_TLS1 - -/** - * \def POLARSSL_SSL_PROTO_TLS1_1 - * - * Enable support for TLS 1.1. - * - * Requires: POLARSSL_MD5_C - * POLARSSL_SHA1_C - * - * Comment this macro to disable support for TLS 1.1 - */ -#define POLARSSL_SSL_PROTO_TLS1_1 - -/** - * \def POLARSSL_SSL_PROTO_TLS1_2 - * - * Enable support for TLS 1.2. - * - * Requires: POLARSSL_SHA1_C or POLARSSL_SHA256_C or POLARSSL_SHA512_C - * (Depends on ciphersuites) - * - * Comment this macro to disable support for TLS 1.2 - */ -#define POLARSSL_SSL_PROTO_TLS1_2 - -/** - * \def POLARSSL_SSL_ALPN - * - * Enable support for Application Layer Protocol Negotiation. - * draft-ietf-tls-applayerprotoneg-05 - * - * Comment this macro to disable support for ALPN. - */ -#define POLARSSL_SSL_ALPN - -/** - * \def POLARSSL_SSL_SESSION_TICKETS - * - * Enable support for RFC 5077 session tickets in SSL. - * - * Requires: POLARSSL_AES_C - * POLARSSL_SHA256_C - * POLARSSL_CIPHER_MODE_CBC - * - * Comment this macro to disable support for SSL session tickets - */ -#define POLARSSL_SSL_SESSION_TICKETS - -/** - * \def POLARSSL_SSL_SERVER_NAME_INDICATION - * - * Enable support for RFC 6066 server name indication (SNI) in SSL. - * - * Comment this macro to disable support for server name indication in SSL - */ -#define POLARSSL_SSL_SERVER_NAME_INDICATION - -/** - * \def POLARSSL_SSL_TRUNCATED_HMAC - * - * Enable support for RFC 6066 truncated HMAC in SSL. - * - * Comment this macro to disable support for truncated HMAC in SSL - */ -#define POLARSSL_SSL_TRUNCATED_HMAC - -/** - * \def POLARSSL_SSL_SET_CURVES - * - * Enable ssl_set_curves(). - * - * This is disabled by default since it breaks binary compatibility with the - * 1.3.x line. If you choose to enable it, you will need to rebuild your - * application against the new header files, relinking will not be enough. - * It will be enabled by default, or no longer an option, in the 1.4 branch. - * - * Uncomment to make ssl_set_curves() available. - */ -//#define POLARSSL_SSL_SET_CURVES - -/** - * \def POLARSSL_THREADING_ALT - * - * Provide your own alternate threading implementation. - * - * Requires: POLARSSL_THREADING_C - * - * Uncomment this to allow your own alternate threading implementation. - */ -//#define POLARSSL_THREADING_ALT - -/** - * \def POLARSSL_THREADING_PTHREAD - * - * Enable the pthread wrapper layer for the threading layer. - * - * Requires: POLARSSL_THREADING_C - * - * Uncomment this to enable pthread mutexes. - */ -//#define POLARSSL_THREADING_PTHREAD - -/** - * \def POLARSSL_VERSION_FEATURES - * - * Allow run-time checking of compile-time enabled features. Thus allowing users - * to check at run-time if the library is for instance compiled with threading - * support via version_check_feature(). - * - * Requires: POLARSSL_VERSION_C - * - * Comment this to disable run-time checking and save ROM space - */ -#define POLARSSL_VERSION_FEATURES - -/** - * \def POLARSSL_X509_ALLOW_EXTENSIONS_NON_V3 - * - * If set, the X509 parser will not break-off when parsing an X509 certificate - * and encountering an extension in a v1 or v2 certificate. - * - * Uncomment to prevent an error. - */ -//#define POLARSSL_X509_ALLOW_EXTENSIONS_NON_V3 - -/** - * \def POLARSSL_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION - * - * If set, the X509 parser will not break-off when parsing an X509 certificate - * and encountering an unknown critical extension. - * - * Uncomment to prevent an error. - */ -//#define POLARSSL_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION - -/** - * \def POLARSSL_X509_CHECK_KEY_USAGE - * - * Enable verification of the keyUsage extension (CA and leaf certificates). - * - * Disabling this avoids problems with mis-issued and/or misused - * (intermediate) CA and leaf certificates. - * - * \warning Depending on your PKI use, disabling this can be a security risk! - * - * Comment to skip keyUsage checking for both CA and leaf certificates. - */ -#define POLARSSL_X509_CHECK_KEY_USAGE - -/** - * \def POLARSSL_X509_CHECK_EXTENDED_KEY_USAGE - * - * Enable verification of the extendedKeyUsage extension (leaf certificates). - * - * Disabling this avoids problems with mis-issued and/or misused certificates. - * - * \warning Depending on your PKI use, disabling this can be a security risk! - * - * Comment to skip extendedKeyUsage checking for certificates. - */ -#define POLARSSL_X509_CHECK_EXTENDED_KEY_USAGE - -/** - * \def POLARSSL_X509_RSASSA_PSS_SUPPORT - * - * Enable parsing and verification of X.509 certificates, CRLs and CSRS - * signed with RSASSA-PSS (aka PKCS#1 v2.1). - * - * Comment this macro to disallow using RSASSA-PSS in certificates. - */ -#define POLARSSL_X509_RSASSA_PSS_SUPPORT - -/** - * \def POLARSSL_ZLIB_SUPPORT - * - * If set, the SSL/TLS module uses ZLIB to support compression and - * decompression of packet data. - * - * \warning TLS-level compression MAY REDUCE SECURITY! See for example the - * CRIME attack. Before enabling this option, you should examine with care if - * CRIME or similar exploits may be a applicable to your use case. - * - * Used in: library/ssl_tls.c - * library/ssl_cli.c - * library/ssl_srv.c - * - * This feature requires zlib library and headers to be present. - * - * Uncomment to enable use of ZLIB - */ -//#define POLARSSL_ZLIB_SUPPORT -/* \} name SECTION: PolarSSL feature support */ - -/** - * \name SECTION: PolarSSL modules - * - * This section enables or disables entire modules in PolarSSL - * \{ - */ - -/** - * \def POLARSSL_AESNI_C - * - * Enable AES-NI support on x86-64. - * - * Module: library/aesni.c - * Caller: library/aes.c - * - * Requires: POLARSSL_HAVE_ASM - * - * This modules adds support for the AES-NI instructions on x86-64 - */ -//#define POLARSSL_AESNI_C - -/** - * \def POLARSSL_AES_C - * - * Enable the AES block cipher. - * - * Module: library/aes.c - * Caller: library/ssl_tls.c - * library/pem.c - * library/ctr_drbg.c - * - * This module enables the following ciphersuites (if other requisites are - * enabled as well): - * TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA - * TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA - * TLS_ECDH_RSA_WITH_AES_128_CBC_SHA - * TLS_ECDH_RSA_WITH_AES_256_CBC_SHA - * TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 - * TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 - * TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 - * TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 - * TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 - * TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 - * TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 - * TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 - * TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - * TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 - * TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 - * TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 - * TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 - * TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 - * TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA - * TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - * TLS_DHE_RSA_WITH_AES_256_CBC_SHA - * TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 - * TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - * TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 - * TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 - * TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 - * TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 - * TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA - * TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - * TLS_DHE_RSA_WITH_AES_128_CBC_SHA - * TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 - * TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 - * TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 - * TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA - * TLS_DHE_PSK_WITH_AES_256_CBC_SHA - * TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 - * TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 - * TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 - * TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA - * TLS_DHE_PSK_WITH_AES_128_CBC_SHA - * TLS_RSA_WITH_AES_256_GCM_SHA384 - * TLS_RSA_WITH_AES_256_CBC_SHA256 - * TLS_RSA_WITH_AES_256_CBC_SHA - * TLS_RSA_WITH_AES_128_GCM_SHA256 - * TLS_RSA_WITH_AES_128_CBC_SHA256 - * TLS_RSA_WITH_AES_128_CBC_SHA - * TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 - * TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 - * TLS_RSA_PSK_WITH_AES_256_CBC_SHA - * TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 - * TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 - * TLS_RSA_PSK_WITH_AES_128_CBC_SHA - * TLS_PSK_WITH_AES_256_GCM_SHA384 - * TLS_PSK_WITH_AES_256_CBC_SHA384 - * TLS_PSK_WITH_AES_256_CBC_SHA - * TLS_PSK_WITH_AES_128_GCM_SHA256 - * TLS_PSK_WITH_AES_128_CBC_SHA256 - * TLS_PSK_WITH_AES_128_CBC_SHA - * - * PEM_PARSE uses AES for decrypting encrypted keys. - */ -#define POLARSSL_AES_C - -/** - * \def POLARSSL_ARC4_C - * - * Enable the ARCFOUR stream cipher. - * - * Module: library/arc4.c - * Caller: library/ssl_tls.c - * - * This module enables the following ciphersuites (if other requisites are - * enabled as well): - * TLS_ECDH_ECDSA_WITH_RC4_128_SHA - * TLS_ECDH_RSA_WITH_RC4_128_SHA - * TLS_ECDHE_ECDSA_WITH_RC4_128_SHA - * TLS_ECDHE_RSA_WITH_RC4_128_SHA - * TLS_ECDHE_PSK_WITH_RC4_128_SHA - * TLS_DHE_PSK_WITH_RC4_128_SHA - * TLS_RSA_WITH_RC4_128_SHA - * TLS_RSA_WITH_RC4_128_MD5 - * TLS_RSA_PSK_WITH_RC4_128_SHA - * TLS_PSK_WITH_RC4_128_SHA - */ -#define POLARSSL_ARC4_C - -/** - * \def POLARSSL_ASN1_PARSE_C - * - * Enable the generic ASN1 parser. - * - * Module: library/asn1.c - * Caller: library/x509.c - * library/dhm.c - * library/pkcs12.c - * library/pkcs5.c - * library/pkparse.c - */ -#define POLARSSL_ASN1_PARSE_C - -/** - * \def POLARSSL_ASN1_WRITE_C - * - * Enable the generic ASN1 writer. - * - * Module: library/asn1write.c - * Caller: library/ecdsa.c - * library/pkwrite.c - * library/x509_create.c - * library/x509write_crt.c - * library/x509write_csr.c - */ -#define POLARSSL_ASN1_WRITE_C - -/** - * \def POLARSSL_BASE64_C - * - * Enable the Base64 module. - * - * Module: library/base64.c - * Caller: library/pem.c - * - * This module is required for PEM support (required by X.509). - */ -#define POLARSSL_BASE64_C - -/** - * \def POLARSSL_BIGNUM_C - * - * Enable the multi-precision integer library. - * - * Module: library/bignum.c - * Caller: library/dhm.c - * library/ecp.c - * library/ecdsa.c - * library/rsa.c - * library/ssl_tls.c - * - * This module is required for RSA, DHM and ECC (ECDH, ECDSA) support. - */ -#define POLARSSL_BIGNUM_C - -/** - * \def POLARSSL_BLOWFISH_C - * - * Enable the Blowfish block cipher. - * - * Module: library/blowfish.c - */ -#define POLARSSL_BLOWFISH_C - -/** - * \def POLARSSL_CAMELLIA_C - * - * Enable the Camellia block cipher. - * - * Module: library/camellia.c - * Caller: library/ssl_tls.c - * - * This module enables the following ciphersuites (if other requisites are - * enabled as well): - * TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 - * TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 - * TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 - * TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 - * TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 - * TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 - * TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 - * TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 - * TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 - * TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 - * TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 - * TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 - * TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 - * TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 - * TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA - * TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 - * TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 - * TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 - * TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 - * TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 - * TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 - * TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA - * TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 - * TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 - * TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 - * TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 - * TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 - * TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 - * TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 - * TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 - * TLS_RSA_WITH_CAMELLIA_256_CBC_SHA - * TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 - * TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 - * TLS_RSA_WITH_CAMELLIA_128_CBC_SHA - * TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 - * TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 - * TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 - * TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 - * TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 - * TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 - * TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 - * TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 - */ -#define POLARSSL_CAMELLIA_C - -/** - * \def POLARSSL_CCM_C - * - * Enable the Counter with CBC-MAC (CCM) mode for 128-bit block cipher. - * - * Module: library/ccm.c - * - * Requires: POLARSSL_AES_C or POLARSSL_CAMELLIA_C - * - * This module enables the AES-CCM ciphersuites, if other requisites are - * enabled as well. - */ -#define POLARSSL_CCM_C - -/** - * \def POLARSSL_CERTS_C - * - * Enable the test certificates. - * - * Module: library/certs.c - * Caller: - * - * Requires: POLARSSL_PEM_PARSE_C - * - * This module is used for testing (ssl_client/server). - */ -#define POLARSSL_CERTS_C - -/** - * \def POLARSSL_CIPHER_C - * - * Enable the generic cipher layer. - * - * Module: library/cipher.c - * Caller: library/ssl_tls.c - * - * Uncomment to enable generic cipher wrappers. - */ -#define POLARSSL_CIPHER_C - -/** - * \def POLARSSL_CTR_DRBG_C - * - * Enable the CTR_DRBG AES-256-based random generator. - * - * Module: library/ctr_drbg.c - * Caller: - * - * Requires: POLARSSL_AES_C - * - * This module provides the CTR_DRBG AES-256 random number generator. - */ -#define POLARSSL_CTR_DRBG_C - -/** - * \def POLARSSL_DEBUG_C - * - * Enable the debug functions. - * - * Module: library/debug.c - * Caller: library/ssl_cli.c - * library/ssl_srv.c - * library/ssl_tls.c - * - * This module provides debugging functions. - */ -#define POLARSSL_DEBUG_C - -/** - * \def POLARSSL_DES_C - * - * Enable the DES block cipher. - * - * Module: library/des.c - * Caller: library/pem.c - * library/ssl_tls.c - * - * This module enables the following ciphersuites (if other requisites are - * enabled as well): - * TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA - * TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA - * TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA - * TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA - * TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - * TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA - * TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA - * TLS_RSA_WITH_3DES_EDE_CBC_SHA - * TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA - * TLS_PSK_WITH_3DES_EDE_CBC_SHA - * - * PEM_PARSE uses DES/3DES for decrypting encrypted keys. - */ -#define POLARSSL_DES_C - -/** - * \def POLARSSL_DHM_C - * - * Enable the Diffie-Hellman-Merkle module. - * - * Module: library/dhm.c - * Caller: library/ssl_cli.c - * library/ssl_srv.c - * - * This module is used by the following key exchanges: - * DHE-RSA, DHE-PSK - */ -#define POLARSSL_DHM_C - -/** - * \def POLARSSL_ECDH_C - * - * Enable the elliptic curve Diffie-Hellman library. - * - * Module: library/ecdh.c - * Caller: library/ssl_cli.c - * library/ssl_srv.c - * - * This module is used by the following key exchanges: - * ECDHE-ECDSA, ECDHE-RSA, DHE-PSK - * - * Requires: POLARSSL_ECP_C - */ -#define POLARSSL_ECDH_C - -/** - * \def POLARSSL_ECDSA_C - * - * Enable the elliptic curve DSA library. - * - * Module: library/ecdsa.c - * Caller: - * - * This module is used by the following key exchanges: - * ECDHE-ECDSA - * - * Requires: POLARSSL_ECP_C, POLARSSL_ASN1_WRITE_C, POLARSSL_ASN1_PARSE_C - */ -#define POLARSSL_ECDSA_C - -/** - * \def POLARSSL_ECP_C - * - * Enable the elliptic curve over GF(p) library. - * - * Module: library/ecp.c - * Caller: library/ecdh.c - * library/ecdsa.c - * - * Requires: POLARSSL_BIGNUM_C and at least one POLARSSL_ECP_DP_XXX_ENABLED - */ -#define POLARSSL_ECP_C - -/** - * \def POLARSSL_ENTROPY_C - * - * Enable the platform-specific entropy code. - * - * Module: library/entropy.c - * Caller: - * - * Requires: POLARSSL_SHA512_C or POLARSSL_SHA256_C - * - * This module provides a generic entropy pool - */ -#define POLARSSL_ENTROPY_C - -/** - * \def POLARSSL_ERROR_C - * - * Enable error code to error string conversion. - * - * Module: library/error.c - * Caller: - * - * This module enables polarssl_strerror(). - */ -#define POLARSSL_ERROR_C - -/** - * \def POLARSSL_GCM_C - * - * Enable the Galois/Counter Mode (GCM) for AES. - * - * Module: library/gcm.c - * - * Requires: POLARSSL_AES_C or POLARSSL_CAMELLIA_C - * - * This module enables the AES-GCM and CAMELLIA-GCM ciphersuites, if other - * requisites are enabled as well. - */ -#define POLARSSL_GCM_C - -/** - * \def POLARSSL_HAVEGE_C - * - * Enable the HAVEGE random generator. - * - * Warning: the HAVEGE random generator is not suitable for virtualized - * environments - * - * Warning: the HAVEGE random generator is dependent on timing and specific - * processor traits. It is therefore not advised to use HAVEGE as - * your applications primary random generator or primary entropy pool - * input. As a secondary input to your entropy pool, it IS able add - * the (limited) extra entropy it provides. - * - * Module: library/havege.c - * Caller: - * - * Requires: POLARSSL_TIMING_C - * - * Uncomment to enable the HAVEGE random generator. - */ -//#define POLARSSL_HAVEGE_C - -/** - * \def POLARSSL_HMAC_DRBG_C - * - * Enable the HMAC_DRBG random generator. - * - * Module: library/hmac_drbg.c - * Caller: - * - * Requires: POLARSSL_MD_C - * - * Uncomment to enable the HMAC_DRBG random number geerator. - */ -#define POLARSSL_HMAC_DRBG_C - -/** - * \def POLARSSL_MD_C - * - * Enable the generic message digest layer. - * - * Module: library/md.c - * Caller: - * - * Uncomment to enable generic message digest wrappers. - */ -#define POLARSSL_MD_C - -/** - * \def POLARSSL_MD2_C - * - * Enable the MD2 hash algorithm. - * - * Module: library/md2.c - * Caller: - * - * Uncomment to enable support for (rare) MD2-signed X.509 certs. - */ -//#define POLARSSL_MD2_C - -/** - * \def POLARSSL_MD4_C - * - * Enable the MD4 hash algorithm. - * - * Module: library/md4.c - * Caller: - * - * Uncomment to enable support for (rare) MD4-signed X.509 certs. - */ -//#define POLARSSL_MD4_C - -/** - * \def POLARSSL_MD5_C - * - * Enable the MD5 hash algorithm. - * - * Module: library/md5.c - * Caller: library/md.c - * library/pem.c - * library/ssl_tls.c - * - * This module is required for SSL/TLS and X.509. - * PEM_PARSE uses MD5 for decrypting encrypted keys. - */ -#define POLARSSL_MD5_C - -/** - * \def POLARSSL_MEMORY_C - * Deprecated since 1.3.5. Please use POLARSSL_PLATFORM_MEMORY instead. - */ -//#define POLARSSL_MEMORY_C - -/** - * \def POLARSSL_MEMORY_BUFFER_ALLOC_C - * - * Enable the buffer allocator implementation that makes use of a (stack) - * based buffer to 'allocate' dynamic memory. (replaces malloc() and free() - * calls) - * - * Module: library/memory_buffer_alloc.c - * - * Requires: POLARSSL_PLATFORM_C - * POLARSSL_PLATFORM_MEMORY (to use it within PolarSSL) - * - * Enable this module to enable the buffer memory allocator. - */ -//#define POLARSSL_MEMORY_BUFFER_ALLOC_C - -/** - * \def POLARSSL_NET_C - * - * Enable the TCP/IP networking routines. - * - * Module: library/net.c - * - * This module provides TCP/IP networking routines. - */ -#define POLARSSL_NET_C - -/** - * \def POLARSSL_OID_C - * - * Enable the OID database. - * - * Module: library/oid.c - * Caller: library/asn1write.c - * library/pkcs5.c - * library/pkparse.c - * library/pkwrite.c - * library/rsa.c - * library/x509.c - * library/x509_create.c - * library/x509_crl.c - * library/x509_crt.c - * library/x509_csr.c - * library/x509write_crt.c - * library/x509write_csr.c - * - * This modules translates between OIDs and internal values. - */ -#define POLARSSL_OID_C - -/** - * \def POLARSSL_PADLOCK_C - * - * Enable VIA Padlock support on x86. - * - * Module: library/padlock.c - * Caller: library/aes.c - * - * Requires: POLARSSL_HAVE_ASM - * - * This modules adds support for the VIA PadLock on x86. - */ -//#define POLARSSL_PADLOCK_C - -/** - * \def POLARSSL_PBKDF2_C - * - * Enable PKCS#5 PBKDF2 key derivation function. - * DEPRECATED: Use POLARSSL_PKCS5_C instead - * - * Module: library/pbkdf2.c - * - * Requires: POLARSSL_PKCS5_C - * - * This module adds support for the PKCS#5 PBKDF2 key derivation function. - */ -#define POLARSSL_PBKDF2_C - -/** - * \def POLARSSL_PEM_PARSE_C - * - * Enable PEM decoding / parsing. - * - * Module: library/pem.c - * Caller: library/dhm.c - * library/pkparse.c - * library/x509_crl.c - * library/x509_crt.c - * library/x509_csr.c - * - * Requires: POLARSSL_BASE64_C - * - * This modules adds support for decoding / parsing PEM files. - */ -#define POLARSSL_PEM_PARSE_C - -/** - * \def POLARSSL_PEM_WRITE_C - * - * Enable PEM encoding / writing. - * - * Module: library/pem.c - * Caller: library/pkwrite.c - * library/x509write_crt.c - * library/x509write_csr.c - * - * Requires: POLARSSL_BASE64_C - * - * This modules adds support for encoding / writing PEM files. - */ -#define POLARSSL_PEM_WRITE_C - -/** - * \def POLARSSL_PK_C - * - * Enable the generic public (asymetric) key layer. - * - * Module: library/pk.c - * Caller: library/ssl_tls.c - * library/ssl_cli.c - * library/ssl_srv.c - * - * Requires: POLARSSL_RSA_C or POLARSSL_ECP_C - * - * Uncomment to enable generic public key wrappers. - */ -#define POLARSSL_PK_C - -/** - * \def POLARSSL_PK_PARSE_C - * - * Enable the generic public (asymetric) key parser. - * - * Module: library/pkparse.c - * Caller: library/x509_crt.c - * library/x509_csr.c - * - * Requires: POLARSSL_PK_C - * - * Uncomment to enable generic public key parse functions. - */ -#define POLARSSL_PK_PARSE_C - -/** - * \def POLARSSL_PK_WRITE_C - * - * Enable the generic public (asymetric) key writer. - * - * Module: library/pkwrite.c - * Caller: library/x509write.c - * - * Requires: POLARSSL_PK_C - * - * Uncomment to enable generic public key write functions. - */ -#define POLARSSL_PK_WRITE_C - -/** - * \def POLARSSL_PKCS5_C - * - * Enable PKCS#5 functions. - * - * Module: library/pkcs5.c - * - * Requires: POLARSSL_MD_C - * - * This module adds support for the PKCS#5 functions. - */ -#define POLARSSL_PKCS5_C - -/** - * \def POLARSSL_PKCS11_C - * - * Enable wrapper for PKCS#11 smartcard support. - * - * Module: library/pkcs11.c - * Caller: library/pk.c - * - * Requires: POLARSSL_PK_C - * - * This module enables SSL/TLS PKCS #11 smartcard support. - * Requires the presence of the PKCS#11 helper library (libpkcs11-helper) - */ -//#define POLARSSL_PKCS11_C - -/** - * \def POLARSSL_PKCS12_C - * - * Enable PKCS#12 PBE functions. - * Adds algorithms for parsing PKCS#8 encrypted private keys - * - * Module: library/pkcs12.c - * Caller: library/pkparse.c - * - * Requires: POLARSSL_ASN1_PARSE_C, POLARSSL_CIPHER_C, POLARSSL_MD_C - * Can use: POLARSSL_ARC4_C - * - * This module enables PKCS#12 functions. - */ -#define POLARSSL_PKCS12_C - -/** - * \def POLARSSL_PLATFORM_C - * - * Enable the platform abstraction layer that allows you to re-assign - * functions like malloc(), free(), printf(), fprintf() - * - * Module: library/platform.c - * Caller: Most other .c files - * - * This module enables abstraction of common (libc) functions. - */ -//#define POLARSSL_PLATFORM_C - -/** - * \def POLARSSL_RIPEMD160_C - * - * Enable the RIPEMD-160 hash algorithm. - * - * Module: library/ripemd160.c - * Caller: library/md.c - * - */ -#define POLARSSL_RIPEMD160_C - -/** - * \def POLARSSL_RSA_C - * - * Enable the RSA public-key cryptosystem. - * - * Module: library/rsa.c - * Caller: library/ssl_cli.c - * library/ssl_srv.c - * library/ssl_tls.c - * library/x509.c - * - * This module is used by the following key exchanges: - * RSA, DHE-RSA, ECDHE-RSA, RSA-PSK - * - * Requires: POLARSSL_BIGNUM_C, POLARSSL_OID_C - */ -#define POLARSSL_RSA_C - -/** - * \def POLARSSL_SHA1_C - * - * Enable the SHA1 cryptographic hash algorithm. - * - * Module: library/sha1.c - * Caller: library/md.c - * library/ssl_cli.c - * library/ssl_srv.c - * library/ssl_tls.c - * library/x509write_crt.c - * - * This module is required for SSL/TLS and SHA1-signed certificates. - */ -#define POLARSSL_SHA1_C - -/** - * \def POLARSSL_SHA256_C - * - * Enable the SHA-224 and SHA-256 cryptographic hash algorithms. - * (Used to be POLARSSL_SHA2_C) - * - * Module: library/sha256.c - * Caller: library/entropy.c - * library/md.c - * library/ssl_cli.c - * library/ssl_srv.c - * library/ssl_tls.c - * - * This module adds support for SHA-224 and SHA-256. - * This module is required for the SSL/TLS 1.2 PRF function. - */ -#define POLARSSL_SHA256_C - -/** - * \def POLARSSL_SHA512_C - * - * Enable the SHA-384 and SHA-512 cryptographic hash algorithms. - * (Used to be POLARSSL_SHA4_C) - * - * Module: library/sha512.c - * Caller: library/entropy.c - * library/md.c - * library/ssl_cli.c - * library/ssl_srv.c - * - * This module adds support for SHA-384 and SHA-512. - */ -#define POLARSSL_SHA512_C - -/** - * \def POLARSSL_SSL_CACHE_C - * - * Enable simple SSL cache implementation. - * - * Module: library/ssl_cache.c - * Caller: - * - * Requires: POLARSSL_SSL_CACHE_C - */ -#define POLARSSL_SSL_CACHE_C - -/** - * \def POLARSSL_SSL_CLI_C - * - * Enable the SSL/TLS client code. - * - * Module: library/ssl_cli.c - * Caller: - * - * Requires: POLARSSL_SSL_TLS_C - * - * This module is required for SSL/TLS client support. - */ -#define POLARSSL_SSL_CLI_C - -/** - * \def POLARSSL_SSL_SRV_C - * - * Enable the SSL/TLS server code. - * - * Module: library/ssl_srv.c - * Caller: - * - * Requires: POLARSSL_SSL_TLS_C - * - * This module is required for SSL/TLS server support. - */ -#define POLARSSL_SSL_SRV_C - -/** - * \def POLARSSL_SSL_TLS_C - * - * Enable the generic SSL/TLS code. - * - * Module: library/ssl_tls.c - * Caller: library/ssl_cli.c - * library/ssl_srv.c - * - * Requires: POLARSSL_CIPHER_C, POLARSSL_MD_C - * and at least one of the POLARSSL_SSL_PROTO_* defines - * - * This module is required for SSL/TLS. - */ -#define POLARSSL_SSL_TLS_C - -/** - * \def POLARSSL_THREADING_C - * - * Enable the threading abstraction layer. - * By default PolarSSL assumes it is used in a non-threaded environment or that - * contexts are not shared between threads. If you do intend to use contexts - * between threads, you will need to enable this layer to prevent race - * conditions. - * - * Module: library/threading.c - * - * This allows different threading implementations (self-implemented or - * provided). - * - * You will have to enable either POLARSSL_THREADING_ALT or - * POLARSSL_THREADING_PTHREAD. - * - * Enable this layer to allow use of mutexes within PolarSSL - */ -//#define POLARSSL_THREADING_C - -/** - * \def POLARSSL_TIMING_C - * - * Enable the portable timing interface. - * - * Module: library/timing.c - * Caller: library/havege.c - * - * This module is used by the HAVEGE random number generator. - */ -#define POLARSSL_TIMING_C - -/** - * \def POLARSSL_VERSION_C - * - * Enable run-time version information. - * - * Module: library/version.c - * - * This module provides run-time version information. - */ -#define POLARSSL_VERSION_C - -/** - * \def POLARSSL_X509_USE_C - * - * Enable X.509 core for using certificates. - * - * Module: library/x509.c - * Caller: library/x509_crl.c - * library/x509_crt.c - * library/x509_csr.c - * - * Requires: POLARSSL_ASN1_PARSE_C, POLARSSL_BIGNUM_C, POLARSSL_OID_C, - * POLARSSL_PK_PARSE_C - * - * This module is required for the X.509 parsing modules. - */ -#define POLARSSL_X509_USE_C - -/** - * \def POLARSSL_X509_CRT_PARSE_C - * - * Enable X.509 certificate parsing. - * - * Module: library/x509_crt.c - * Caller: library/ssl_cli.c - * library/ssl_srv.c - * library/ssl_tls.c - * - * Requires: POLARSSL_X509_USE_C - * - * This module is required for X.509 certificate parsing. - */ -#define POLARSSL_X509_CRT_PARSE_C - -/** - * \def POLARSSL_X509_CRL_PARSE_C - * - * Enable X.509 CRL parsing. - * - * Module: library/x509_crl.c - * Caller: library/x509_crt.c - * - * Requires: POLARSSL_X509_USE_C - * - * This module is required for X.509 CRL parsing. - */ -#define POLARSSL_X509_CRL_PARSE_C - -/** - * \def POLARSSL_X509_CSR_PARSE_C - * - * Enable X.509 Certificate Signing Request (CSR) parsing. - * - * Module: library/x509_csr.c - * Caller: library/x509_crt_write.c - * - * Requires: POLARSSL_X509_USE_C - * - * This module is used for reading X.509 certificate request. - */ -#define POLARSSL_X509_CSR_PARSE_C - -/** - * \def POLARSSL_X509_CREATE_C - * - * Enable X.509 core for creating certificates. - * - * Module: library/x509_create.c - * - * Requires: POLARSSL_BIGNUM_C, POLARSSL_OID_C, POLARSSL_PK_WRITE_C - * - * This module is the basis for creating X.509 certificates and CSRs. - */ -#define POLARSSL_X509_CREATE_C - -/** - * \def POLARSSL_X509_CRT_WRITE_C - * - * Enable creating X.509 certificates. - * - * Module: library/x509_crt_write.c - * - * Requires: POLARSSL_CREATE_C - * - * This module is required for X.509 certificate creation. - */ -#define POLARSSL_X509_CRT_WRITE_C - -/** - * \def POLARSSL_X509_CSR_WRITE_C - * - * Enable creating X.509 Certificate Signing Requests (CSR). - * - * Module: library/x509_csr_write.c - * - * Requires: POLARSSL_CREATE_C - * - * This module is required for X.509 certificate request writing. - */ -#define POLARSSL_X509_CSR_WRITE_C - -/** - * \def POLARSSL_XTEA_C - * - * Enable the XTEA block cipher. - * - * Module: library/xtea.c - * Caller: - */ -#define POLARSSL_XTEA_C - -/* \} name SECTION: PolarSSL modules */ - -/** - * \name SECTION: Module configuration options - * - * This section allows for the setting of module specific sizes and - * configuration options. The default values are already present in the - * relevant header files and should suffice for the regular use cases. - * - * Our advice is to enable options and change their values here - * only if you have a good reason and know the consequences. - * - * Please check the respective header file for documentation on these - * parameters (to prevent duplicate documentation). - * \{ - */ - -/* MPI / BIGNUM options */ -//#define POLARSSL_MPI_WINDOW_SIZE 6 /**< Maximum windows size used. */ -//#define POLARSSL_MPI_MAX_SIZE 1024 /**< Maximum number of bytes for usable MPIs. */ - -/* CTR_DRBG options */ -//#define CTR_DRBG_ENTROPY_LEN 48 /**< Amount of entropy used per seed by default (48 with SHA-512, 32 with SHA-256) */ -//#define CTR_DRBG_RESEED_INTERVAL 10000 /**< Interval before reseed is performed by default */ -//#define CTR_DRBG_MAX_INPUT 256 /**< Maximum number of additional input bytes */ -//#define CTR_DRBG_MAX_REQUEST 1024 /**< Maximum number of requested bytes per call */ -//#define CTR_DRBG_MAX_SEED_INPUT 384 /**< Maximum size of (re)seed buffer */ - -/* HMAC_DRBG options */ -//#define POLARSSL_HMAC_DRBG_RESEED_INTERVAL 10000 /**< Interval before reseed is performed by default */ -//#define POLARSSL_HMAC_DRBG_MAX_INPUT 256 /**< Maximum number of additional input bytes */ -//#define POLARSSL_HMAC_DRBG_MAX_REQUEST 1024 /**< Maximum number of requested bytes per call */ -//#define POLARSSL_HMAC_DRBG_MAX_SEED_INPUT 384 /**< Maximum size of (re)seed buffer */ - -/* ECP options */ -//#define POLARSSL_ECP_MAX_BITS 521 /**< Maximum bit size of groups */ -//#define POLARSSL_ECP_WINDOW_SIZE 6 /**< Maximum window size used */ -//#define POLARSSL_ECP_FIXED_POINT_OPTIM 1 /**< Enable fixed-point speed-up */ - -/* Entropy options */ -//#define ENTROPY_MAX_SOURCES 20 /**< Maximum number of sources supported */ -//#define ENTROPY_MAX_GATHER 128 /**< Maximum amount requested from entropy sources */ - -/* Memory buffer allocator options */ -//#define POLARSSL_MEMORY_ALIGN_MULTIPLE 4 /**< Align on multiples of this value */ - -/* Platform options */ -//#define POLARSSL_PLATFORM_STD_MEM_HDR <stdlib.h> /**< Header to include if POLARSSL_PLATFORM_NO_STD_FUNCTIONS is defined. Don't define if no header is needed. */ -//#define POLARSSL_PLATFORM_STD_MALLOC malloc /**< Default allocator to use, can be undefined */ -//#define POLARSSL_PLATFORM_STD_FREE free /**< Default free to use, can be undefined */ -//#define POLARSSL_PLATFORM_STD_PRINTF printf /**< Default printf to use, can be undefined */ -//#define POLARSSL_PLATFORM_STD_FPRINTF fprintf /**< Default fprintf to use, can be undefined */ - -/* SSL Cache options */ -//#define SSL_CACHE_DEFAULT_TIMEOUT 86400 /**< 1 day */ -//#define SSL_CACHE_DEFAULT_MAX_ENTRIES 50 /**< Maximum entries in cache */ - -/* SSL options */ -//#define SSL_MAX_CONTENT_LEN 16384 /**< Size of the input / output buffer */ -//#define SSL_DEFAULT_TICKET_LIFETIME 86400 /**< Lifetime of session tickets (if enabled) */ -//#define POLARSSL_PSK_MAX_LEN 32 /**< Max size of TLS pre-shared keys, in bytes (default 256 bits) */ - -/** - * Complete list of ciphersuites to use, in order of preference. - * - * \warning No dependency checking is done on that field! This option can only - * be used to restrict the set of available ciphersuites. It is your - * responsibility to make sure the needed modules are active. - * - * Use this to save a few hundred bytes of ROM (default ordering of all - * available ciphersuites) and a few to a few hundred bytes of RAM. - * - * The value below is only an example, not the default. - */ -//#define SSL_CIPHERSUITES TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 - -/* Debug options */ -//#define POLARSSL_DEBUG_DFL_MODE POLARSSL_DEBUG_LOG_FULL /**< Default log: Full or Raw */ - -/* \} name SECTION: Module configuration options */ - - -#endif /* POLARSSL_CONFIG_H */ From 79f3cec717301e0ba9ee89a9cc0b41df677b06ce Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Mon, 25 May 2020 02:30:00 +0200 Subject: [PATCH 359/632] use system zlib if available (client only) --- CHANGELOG.md | 1 + client/Makefile | 15 +++++++++++++++ doc/md/Development/Maintainers.md | 2 ++ 3 files changed, 18 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9d62254f..fdb0b7c05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Change, use system Lua library if available (@doegox) - Change, use system Jansson library if available (@doegox) - Change, use system Whereami library if available (@doegox) + - Change, use system Zlib library if available (@doegox) - Fix release version information (@doegox) ## [ice coffee.4.9237][2020-05-21] diff --git a/client/Makefile b/client/Makefile index 59c08f144..c1713e74c 100644 --- a/client/Makefile +++ b/client/Makefile @@ -165,6 +165,15 @@ INCLUDES += $(WAILIBINC) ## Zlib # system library useable? Need to recompress hardnested tables? +ifneq ($(SKIPZLIBSYSTEM),1) + ZLIBINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags zlib 2>/dev/null) + ZLIBLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs zlib 2>/dev/null) + ifneq ($(ZLIBLDLIBS),) + ZLIB = $(ZLIBLDLIBS) + ZLIBINC = $(ZLIBINCLUDES) + ZLIB_FOUND = 1 + endif +endif LDLIBS +=$(ZLIB) INCLUDES += $(ZLIBINC) @@ -328,6 +337,10 @@ ifeq ($(WAI_FOUND),1) $(info Whereami library: system library found) endif +ifeq ($(ZLIB_FOUND),1) + $(info Zlib library: system library found) +endif + $(info compiler version: $(shell $(CC) --version|head -n 1)) $(info ===================================================================) @@ -622,8 +635,10 @@ mbedtls: $(Q)$(MAKE) --no-print-directory -C $(MBEDTLSLIBPATH) OBJDIR=$(ROOT_DIR)$(OBJDIR) BINDIR=$(ROOT_DIR)$(OBJDIR) all zlib: +ifneq ($(ZLIB_FOUND),1) $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C $(ZLIBPATH) OBJDIR=$(ROOT_DIR)$(OBJDIR) BINDIR=$(ROOT_DIR)$(OBJDIR) all +endif ######## # misc # diff --git a/doc/md/Development/Maintainers.md b/doc/md/Development/Maintainers.md index 5d1400a7f..0ea33b924 100644 --- a/doc/md/Development/Maintainers.md +++ b/doc/md/Development/Maintainers.md @@ -62,7 +62,9 @@ It's also possible to skip parts even if libraries are present in the compilatio * `make client SKIPQT=1` to skip GUI even if Qt is present * `make client SKIPBT=1` to skip native Bluetooth support even if libbluetooth is present * `make client SKIPLUASYSTEM=1` to skip system Lua lib even if liblua5.2 is present, use embedded Lua lib instead +* `make client SKIPJANSSONSYSTEM=1` to skip system Jansson lib even if libjansson is present, use embedded Jansson lib instead * `make client SKIPWHEREAMISYSTEM=1` to skip system Whereami lib even if libwhereami is present, use embedded whereami lib instead +* `make client SKIPZLIBSYSTEM=1` to skip system Zlib even if libz is present, use embedded Zlib instead If you're cross-compiling, these ones might be useful: From 68da06f721f0f907c2582e6f58be959f29b87ea2 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Mon, 25 May 2020 10:15:51 +0200 Subject: [PATCH 360/632] makefile reorder --- client/Makefile | 93 ++++++++++++++++++++++++------------------------- 1 file changed, 46 insertions(+), 47 deletions(-) diff --git a/client/Makefile b/client/Makefile index c1713e74c..c97cd6181 100644 --- a/client/Makefile +++ b/client/Makefile @@ -32,11 +32,6 @@ AMIIBOLIBPATH = ./deps/amiitool AMIIBOLIBINC = -I$(AMIIBOLIBPATH) AMIIBOLIB = $(AMIIBOLIBPATH)/libamiibo.a -## Tinycbor -CBORLIBPATH = ./deps/tinycbor -CBORLIBINC = -I$(CBORLIBPATH) -CBORLIB = $(CBORLIBPATH)/tinycbor.a - ## Cliparser / Argtable3 CLIPARSERLIBPATH = ./deps/cliparser CLIPARSERLIBINC = -I$(CLIPARSERLIBPATH) @@ -73,6 +68,11 @@ REVENGLIBPATH = ./deps/reveng REVENGLIBINC = -I$(REVENGLIBPATH) REVENGLIB = $(REVENGLIBPATH)/libreveng.a +## Tinycbor +TINYCBORLIBPATH = ./deps/tinycbor +TINYCBORLIBINC = -I$(TINYCBORLIBPATH) +TINYCBORLIB = $(TINYCBORLIBPATH)/tinycbor.a + ## Whereami WAILIBPATH = ./deps/whereami WAILIBINC = -I$(WAILIBPATH) @@ -101,11 +101,6 @@ ZLIB = $(OBJDIR)/libz.a LDLIBS += $(AMIIBOLIB) INCLUDES += $(AMIIBOLIBINC) -## Tinycbor -# not distributed as system library -LDLIBS += $(CBORLIB) -INCLUDES += $(CBORLIBINC) - ## Cliparser / Argtable3 # not distributed as system library LDLIBS += $(CLIPARSERLIB) @@ -152,6 +147,11 @@ INCLUDES += $(MBEDTLSLIBINC) LDLIBS += $(REVENGLIB) INCLUDES += $(REVENGLIBINC) +## Tinycbor +# not distributed as system library +LDLIBS += $(TINYCBORLIB) +INCLUDES += $(TINYCBORLIBINC) + ## Whereami ifneq ($(SKIPWHEREAMISYSTEM),1) ifneq (,$(wildcard /usr/include/whereami.h)) @@ -524,7 +524,7 @@ all: $(BINS) all-static: LDLIBS:=-static $(LDLIBS) all-static: $(BINS) -proxmark3: $(OBJS) liblua jansson tinycbor reveng mbedtls zlib amiibo hardnested cliparser whereami lualibs/pm3_cmd.lua lualibs/mfc_default_keys.lua +proxmark3: $(OBJS) amiibo cliparser jansson hardnested lua mbedtls reveng tinycbor whereami zlib lualibs/pm3_cmd.lua lualibs/mfc_default_keys.lua $(info [=] LD $@) $(Q)$(LD) $(PM3LDFLAGS) $(OBJS) $(LDLIBS) -o $@ @@ -549,17 +549,17 @@ lualibs/mfc_default_keys.lua : mfc_default_keys.dic clean: $(Q)$(RM) $(CLEAN) $(Q)$(RMDIR) $(OBJDIR) - $(Q)$(MAKE) --no-print-directory -C $(LUALIBPATH) clean - $(Q)$(MAKE) --no-print-directory -C $(JANSSONLIBPATH) clean - $(Q)$(MAKE) --no-print-directory -C $(CBORLIBPATH) clean - $(Q)$(MAKE) --no-print-directory -C $(REVENGLIBPATH) clean $(Q)$(MAKE) --no-print-directory -C $(AMIIBOLIBPATH) clean - $(Q)$(MAKE) --no-print-directory -C $(HARDNESTEDLIBPATH) clean $(Q)$(MAKE) --no-print-directory -C $(CLIPARSERLIBPATH) clean + $(Q)$(MAKE) --no-print-directory -C $(HARDNESTEDLIBPATH) clean + $(Q)$(MAKE) --no-print-directory -C $(JANSSONLIBPATH) clean + $(Q)$(MAKE) --no-print-directory -C $(LUALIBPATH) clean + $(Q)$(MAKE) --no-print-directory -C $(REVENGLIBPATH) clean + $(Q)$(MAKE) --no-print-directory -C $(TINYCBORLIBPATH) clean $(Q)$(MAKE) --no-print-directory -C $(WAILIBPATH) clean @# Just in case someone compiled within these dirs: - $(Q)$(MAKE) --no-print-directory -C $(ZLIBPATH) clean $(Q)$(MAKE) --no-print-directory -C $(MBEDTLSLIBPATH) clean + $(Q)$(MAKE) --no-print-directory -C $(ZLIBPATH) clean install: all $(info [@] Installing client to $(DESTDIR)$(PREFIX)...) @@ -591,30 +591,6 @@ tarbin: $(BINS) # local libraries targets # ########################### -liblua: -ifneq ($(LUA_FOUND),1) - $(info [*] MAKE $@ for $(LUAPLATFORM)) - $(Q)$(MAKE) --no-print-directory -C $(LUALIBPATH) $(LUAPLATFORM) -endif - -jansson: -ifneq ($(JANSSON_FOUND),1) - $(info [*] MAKE $@) - $(Q)$(MAKE) --no-print-directory -C $(JANSSONLIBPATH) all -endif - -tinycbor: - $(info [*] MAKE $@) - $(Q)$(MAKE) --no-print-directory -C $(CBORLIBPATH) all - -reveng: - $(info [*] MAKE $@) - $(Q)$(MAKE) --no-print-directory -C $(REVENGLIBPATH) all - -hardnested: - $(info [*] MAKE $@) - $(Q)$(MAKE) --no-print-directory -C $(HARDNESTEDLIBPATH) all - amiibo: $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C $(AMIIBOLIBPATH) all @@ -623,17 +599,40 @@ cliparser: $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C $(CLIPARSERLIBPATH) all +hardnested: + $(info [*] MAKE $@) + $(Q)$(MAKE) --no-print-directory -C $(HARDNESTEDLIBPATH) all + +jansson: +ifneq ($(JANSSON_FOUND),1) + $(info [*] MAKE $@) + $(Q)$(MAKE) --no-print-directory -C $(JANSSONLIBPATH) all +endif + +lua: +ifneq ($(LUA_FOUND),1) + $(info [*] MAKE $@ for $(LUAPLATFORM)) + $(Q)$(MAKE) --no-print-directory -C $(LUALIBPATH) $(LUAPLATFORM) +endif + +mbedtls: + $(info [*] MAKE $@) + $(Q)$(MAKE) --no-print-directory -C $(MBEDTLSLIBPATH) OBJDIR=$(ROOT_DIR)$(OBJDIR) BINDIR=$(ROOT_DIR)$(OBJDIR) all + +reveng: + $(info [*] MAKE $@) + $(Q)$(MAKE) --no-print-directory -C $(REVENGLIBPATH) all + +tinycbor: + $(info [*] MAKE $@) + $(Q)$(MAKE) --no-print-directory -C $(TINYCBORLIBPATH) all + whereami: ifneq ($(WAI_FOUND),1) $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C $(WAILIBPATH) all endif -# common libraries: -mbedtls: - $(info [*] MAKE $@) - $(Q)$(MAKE) --no-print-directory -C $(MBEDTLSLIBPATH) OBJDIR=$(ROOT_DIR)$(OBJDIR) BINDIR=$(ROOT_DIR)$(OBJDIR) all - zlib: ifneq ($(ZLIB_FOUND),1) $(info [*] MAKE $@) @@ -644,7 +643,7 @@ endif # misc # ######## -.PHONY: all clean install uninstall tarbin liblua jansson tinycbor reveng hardnested amiibo cliparser whereami mbedtls zlib +.PHONY: all clean install uninstall tarbin amiibo cliparser hardnested jansson lua mbedtls reveng tinycbor whereami zlib # version.c should be remade on every compilation src/version.c: default_version.c From fc2ff7bb0affdfa122954a5f3ac73b3ad0bd6b02 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Mon, 25 May 2020 13:05:44 +0200 Subject: [PATCH 361/632] Makefile: remove /usr/local/lib --- client/Makefile | 2 -- 1 file changed, 2 deletions(-) diff --git a/client/Makefile b/client/Makefile index c97cd6181..ab109714b 100644 --- a/client/Makefile +++ b/client/Makefile @@ -16,8 +16,6 @@ VPATH = ../common src vpath %.dic dictionaries OBJDIR = obj -LDLIBS ?= -L/usr/local/lib - ifeq ($(platform),Darwin) # cf brew info qt: qt not symlinked anymore PKG_CONFIG_ENV := PKG_CONFIG_PATH=/usr/local/opt/qt/lib/pkgconfig From 162b7b58dff473e846d7bb0398642c6f78d4fe5c Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Mon, 25 May 2020 13:11:44 +0200 Subject: [PATCH 362/632] Makefile: more info --- client/Makefile | 82 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 54 insertions(+), 28 deletions(-) diff --git a/client/Makefile b/client/Makefile index ab109714b..35adc71eb 100644 --- a/client/Makefile +++ b/client/Makefile @@ -72,9 +72,9 @@ TINYCBORLIBINC = -I$(TINYCBORLIBPATH) TINYCBORLIB = $(TINYCBORLIBPATH)/tinycbor.a ## Whereami -WAILIBPATH = ./deps/whereami -WAILIBINC = -I$(WAILIBPATH) -WAILIB = $(WAILIBPATH)/libwhereami.a +WHEREAMILIBPATH = ./deps/whereami +WHEREAMILIBINC = -I$(WHEREAMILIBPATH) +WHEREAMILIB = $(WHEREAMILIBPATH)/libwhereami.a ########################## # common local libraries # @@ -153,13 +153,13 @@ INCLUDES += $(TINYCBORLIBINC) ## Whereami ifneq ($(SKIPWHEREAMISYSTEM),1) ifneq (,$(wildcard /usr/include/whereami.h)) - WAILIB = -lwhereami - WAILIBINC = - WAI_FOUND = 1 + WHEREAMILIB = -lwhereami + WHEREAMILIBINC = + WHEREAMI_FOUND = 1 endif endif -LDLIBS += $(WAILIB) -INCLUDES += $(WAILIBINC) +LDLIBS += $(WHEREAMILIB) +INCLUDES += $(WHEREAMILIBINC) ## Zlib # system library useable? Need to recompress hardnested tables? @@ -305,38 +305,64 @@ $(info Client platform: $(platform)) ifeq ($(SKIPQT),1) $(info GUI support: skipped) -else ifeq ($(QT_FOUND),1) - ifeq ($(QT5_FOUND),1) - $(info GUI support: QT5 found, enabled) - else - $(info GUI support: QT4 found, enabled) - endif else - $(info GUI support: QT not found, disabled) + ifeq ($(QT_FOUND),1) + ifeq ($(QT5_FOUND),1) + $(info GUI support: QT5 found, enabled) + else + $(info GUI support: QT4 found, enabled) + endif + else + $(info GUI support: QT not found, disabled) + endif endif ifeq ($(SKIPBT),1) $(info native BT support: skipped) -else ifneq ($(BTLDLIBS),) - $(info native BT support: Bluez found, enabled) else - $(info native BT support: Bluez not found, disabled) + ifeq ($(BT_FOUND),1) + $(info native BT support: Bluez found, enabled) + else + $(info native BT support: Bluez not found, disabled) + endif endif -ifeq ($(JANSSON_FOUND),1) +ifeq ($(SKIPJANSSONSYSTEM),1) + $(info Jansson library: local library forced) +else ifeq ($(JANSSON_FOUND),1) $(info Jansson library: system library found) +else + $(info Jansson library: system library not found, using local library) endif -ifeq ($(LUA_FOUND),1) - $(info Lua library: system library found) +ifeq ($(SKIPLUASYSTEM),1) + $(info Lua library: local library forced) +else + ifeq ($(LUA_FOUND),1) + $(info Lua library: system library found) + else + $(info Lua library: system library not found, using local library) + endif endif -ifeq ($(WAI_FOUND),1) - $(info Whereami library: system library found) +ifeq ($(SKIPWHEREAMISYSTEM),1) + $(info Whereami library: local library forced) +else + ifeq ($(WHEREAMI_FOUND),1) + $(info Whereami library: system library found) + else + $(info Whereami library: system library not found, using local library) + endif endif -ifeq ($(ZLIB_FOUND),1) - $(info Zlib library: system library found) +ifeq ($(SKIPZLIBSYSTEM),1) + $(info Zlib library: local library forced) +else + ifeq ($(ZLIB_FOUND),1) + $(info Zlib library: system library found) + else + $(info Zlib library: system library not found, using local library) + endif endif $(info compiler version: $(shell $(CC) --version|head -n 1)) @@ -554,7 +580,7 @@ clean: $(Q)$(MAKE) --no-print-directory -C $(LUALIBPATH) clean $(Q)$(MAKE) --no-print-directory -C $(REVENGLIBPATH) clean $(Q)$(MAKE) --no-print-directory -C $(TINYCBORLIBPATH) clean - $(Q)$(MAKE) --no-print-directory -C $(WAILIBPATH) clean + $(Q)$(MAKE) --no-print-directory -C $(WHEREAMILIBPATH) clean @# Just in case someone compiled within these dirs: $(Q)$(MAKE) --no-print-directory -C $(MBEDTLSLIBPATH) clean $(Q)$(MAKE) --no-print-directory -C $(ZLIBPATH) clean @@ -626,9 +652,9 @@ tinycbor: $(Q)$(MAKE) --no-print-directory -C $(TINYCBORLIBPATH) all whereami: -ifneq ($(WAI_FOUND),1) +ifneq ($(WHEREAMI_FOUND),1) $(info [*] MAKE $@) - $(Q)$(MAKE) --no-print-directory -C $(WAILIBPATH) all + $(Q)$(MAKE) --no-print-directory -C $(WHEREAMILIBPATH) all endif zlib: From b3ff89e41ed08c5cebd88c39a6fe30be1060e41c Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 26 May 2020 10:57:11 +0200 Subject: [PATCH 363/632] sign-compare --- client/src/aidsearch.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/aidsearch.c b/client/src/aidsearch.c index 291d2035c..7361442b0 100644 --- a/client/src/aidsearch.c +++ b/client/src/aidsearch.c @@ -122,8 +122,8 @@ int PrintAIDDescription(json_t *xroot, char *aid, bool verbose) { goto out; json_t *elm = NULL; - int maxaidlen = 0; - for (int elmindx = 0; elmindx < json_array_size(root); elmindx++) { + uint32_t maxaidlen = 0; + for (uint32_t elmindx = 0; elmindx < json_array_size(root); elmindx++) { json_t *data = AIDSearchGetElm(root, elmindx); if (data == NULL) continue; From e95f8072517acf4fff0b4bfe3ba4b2754cf84a56 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 26 May 2020 10:59:12 +0200 Subject: [PATCH 364/632] sign-compare --- client/src/cmddata.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 55fac1d0b..5aba8e537 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -1624,7 +1624,7 @@ int getSamples(uint32_t n, bool verbose) { if (verbose) PrintAndLogEx(INFO, "Unpacking..."); BitstreamOut bout = { got, bits_per_sample * n, 0}; - int j = 0; + uint32_t j = 0; for (j = 0; j * bits_per_sample < n * 8 && j < n; j++) { uint8_t sample = getByte(bits_per_sample, &bout); GraphBuffer[j] = ((int) sample) - 127; @@ -1634,7 +1634,7 @@ int getSamples(uint32_t n, bool verbose) { if (verbose) PrintAndLogEx(INFO, "Unpacked %d samples", j); } else { - for (int j = 0; j < n; j++) { + for (uint32_t j = 0; j < n; j++) { GraphBuffer[j] = ((int)got[j]) - 127; } GraphTraceLen = n; From 26e8a5a1e051bae20845d92487d6af310d50ce09 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 26 May 2020 11:29:44 +0200 Subject: [PATCH 365/632] added check for systemlib python3 in makefile --- client/Makefile | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/client/Makefile b/client/Makefile index 35adc71eb..adc07c88b 100644 --- a/client/Makefile +++ b/client/Makefile @@ -10,7 +10,7 @@ ROOT_DIR:=$(dir $(realpath $(lastword $(MAKEFILE_LIST)))) include ../Makefile.defs INSTALLBIN = proxmark3 -INSTALLSHARE = cmdscripts lualibs luascripts resources dictionaries +INSTALLSHARE = cmdscripts lualibs luascripts pyscripts resources dictionaries VPATH = ../common src vpath %.dic dictionaries @@ -135,6 +135,18 @@ endif LDLIBS += $(LUALIB) INCLUDES += $(LUALIBINC) +## Python3 +#PYTHON_CONFIG := python3-config +PYTHONINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags python3 2>/dev/null) +PYTHONLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs python3 2>/dev/null) +ifneq ($(PYTHONLDLIBS),) + PYTHONLIB = $(PYTHONLDLIBS) + PYTHONLIBINC = $(PYTHONINCLUDES) + PYTHON_FOUND = 1 +endif +LDLIBS += $(PYTHONLIB) +INCLUDES += $(PYTHONLIBINC) + ## mbed TLS # system library cannot be used because it is compiled by default without CMAC support LDLIBS +=$(MBEDTLSLIB) @@ -256,6 +268,9 @@ endif LDLIBS += $(QTLDLIBS) CXXINCLUDES += $(QTINCLUDES) +## Python + + ####################################################################################################### CFLAGS ?= $(DEFCFLAGS) # We cannot just use CFLAGS+=... because it has impact on sub-makes if CFLAGS is defined in env: @@ -345,6 +360,12 @@ else endif endif +ifeq ($(PYTHON_FOUND),1) + $(info Python library: system library found) +else + $(info Python library: system library not found, disabled) +endif + ifeq ($(SKIPWHEREAMISYSTEM),1) $(info Whereami library: local library forced) else From 06927f983a3f20bfc2c5e6a120c0ec659eda1ce2 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 26 May 2020 11:30:17 +0200 Subject: [PATCH 366/632] added python3 as script engine, if installed on system --- client/src/cmdscript.c | 113 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 106 insertions(+), 7 deletions(-) diff --git a/client/src/cmdscript.c b/client/src/cmdscript.c index 4f4a372d8..b2ad53f50 100644 --- a/client/src/cmdscript.c +++ b/client/src/cmdscript.c @@ -7,10 +7,17 @@ //----------------------------------------------------------------------------- // Some lua scripting glue to proxmark core. //----------------------------------------------------------------------------- +// 2020, added Python support (@iceman100) + #include <stdlib.h> #include <string.h> +#define PY_SSIZE_T_CLEAN +#include <Python.h> +#include <wchar.h> + + #include "cmdparser.h" // command_t #include "scripting.h" #include "comms.h" @@ -24,6 +31,12 @@ #include "ui.h" #include "fileutils.h" +typedef enum { + PM3_LUA, + PM3_CMD, + PM3_PY +} pm3_scriptfile_t; + static int CmdHelp(const char *Cmd); /** @@ -36,7 +49,12 @@ static int CmdScriptList(const char *Cmd) { int ret = searchAndList(LUA_SCRIPTS_SUBDIR, ".lua"); if (ret != PM3_SUCCESS) return ret; - return searchAndList(CMD_SCRIPTS_SUBDIR, ".cmd"); + + ret = searchAndList(CMD_SCRIPTS_SUBDIR, ".cmd"); + if (ret != PM3_SUCCESS) + return ret; + + return searchAndList(PYTHON_SCRIPTS_SUBDIR, ".py"); } /** @@ -54,9 +72,18 @@ static int CmdScriptRun(const char *Cmd) { int arg_len = 0; static uint8_t luascriptfile_idx = 0; sscanf(Cmd, "%127s%n %255[^\n\r]%n", preferredName, &name_len, arguments, &arg_len); - + + char *extension_chk; + extension_chk = str_dup(preferredName); + str_lower(extension_chk); + pm3_scriptfile_t ext = PM3_LUA; + if (str_endswith(preferredName, ".cmd")) + ext = PM3_CMD; + if (str_endswith(preferredName, ".py")) + ext = PM3_PY; + char *script_path = NULL; - if ((!str_endswith(preferredName, ".cmd")) && (searchFile(&script_path, LUA_SCRIPTS_SUBDIR, preferredName, ".lua", true) == PM3_SUCCESS)) { + if ((ext == PM3_LUA) && (searchFile(&script_path, LUA_SCRIPTS_SUBDIR, preferredName, ".lua", true) == PM3_SUCCESS)) { int error; if (luascriptfile_idx == MAX_NESTED_LUASCRIPT) { PrintAndLogEx(ERR, "too many nested scripts, skipping %s\n", script_path); @@ -112,7 +139,7 @@ static int CmdScriptRun(const char *Cmd) { return PM3_SUCCESS; } - if ((!str_endswith(preferredName, ".lua")) && (searchFile(&script_path, CMD_SCRIPTS_SUBDIR, preferredName, ".cmd", true) == PM3_SUCCESS)) { + if ((ext == PM3_CMD) && (searchFile(&script_path, CMD_SCRIPTS_SUBDIR, preferredName, ".cmd", true) == PM3_SUCCESS)) { PrintAndLogEx(SUCCESS, "executing Cmd " _YELLOW_("%s"), script_path); PrintAndLogEx(SUCCESS, "args " _YELLOW_("'%s'"), arguments); @@ -123,11 +150,83 @@ static int CmdScriptRun(const char *Cmd) { free(script_path); return ret; } + + /* + + For apt (Ubuntu, Debian...): + sudo apt-get install python3-dev # for python3.x installs + + For yum (CentOS, RHEL...): + sudo yum install python3-devel # for python3.x installs + + For dnf (Fedora...): + sudo dnf install python3-devel # for python3.x installs + + For zypper (openSUSE...): + sudo zypper in python3-devel # for python3.x installs + + For apk (Alpine...): + + # This is a departure from the normal Alpine naming + # scheme, which uses py2- and py3- prefixes + + sudo apk add python3-dev # for python3.x installs + + For apt-cyg (Cygwin...): + apt-cyg install python3-devel # for python3.x installs + + */ + + if ((ext == PM3_PY) && (searchFile(&script_path, PYTHON_SCRIPTS_SUBDIR, preferredName, ".py", true) == PM3_SUCCESS)) { + + PrintAndLogEx(SUCCESS, "executing python s " _YELLOW_("%s"), script_path); + PrintAndLogEx(SUCCESS, "args " _YELLOW_("'%s'"), arguments); + + wchar_t *program = Py_DecodeLocale(script_path, NULL); + if (program == NULL) { + PrintAndLogEx(ERR, "could not decode " _YELLOW_("%s"), script_path); + free(script_path); + return PM3_ESOFT; + } + + // optional but recommended + Py_SetProgramName(program); + Py_Initialize(); +// PySys_SetArgv(arguments, script_path); // we dont have argc , argv here + + FILE *f = fopen(script_path, "r"); + if (f == NULL) { + PrintAndLogEx(ERR, "could not decode " _YELLOW_("%s"), script_path); + free(script_path); + return PM3_ESOFT; + } + + PyRun_SimpleFile(f, script_path); + + fclose(f); + + if (Py_FinalizeEx() < 0) { + free(script_path); + return PM3_ESOFT; + } + + PyMem_RawFree(program); + free(script_path); + PrintAndLogEx(SUCCESS, "\nfinished " _YELLOW_("%s"), preferredName); + return PM3_SUCCESS; + } // file not found, let's search again to display the error messages int ret = PM3_EUNDEF; - if (!str_endswith(preferredName, ".cmd")) ret = searchFile(&script_path, LUA_SCRIPTS_SUBDIR, preferredName, ".lua", false); - if (!str_endswith(preferredName, ".lua")) ret = searchFile(&script_path, CMD_SCRIPTS_SUBDIR, preferredName, ".cmd", false); + if (ext == PM3_LUA) + ret = searchFile(&script_path, LUA_SCRIPTS_SUBDIR, preferredName, ".lua", false); + + if (ext == PM3_CMD) + ret = searchFile(&script_path, CMD_SCRIPTS_SUBDIR, preferredName, ".cmd", false); + + if (ext == PM3_PY) + ret = searchFile(&script_path, PYTHON_SCRIPTS_SUBDIR, preferredName, ".py", false); + free(script_path); return ret; } @@ -135,7 +234,7 @@ static int CmdScriptRun(const char *Cmd) { static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, {"list", CmdScriptList, AlwaysAvailable, "List available scripts"}, - {"run", CmdScriptRun, AlwaysAvailable, "<name> -- Execute a script"}, + {"run", CmdScriptRun, AlwaysAvailable, "<name> -- execute a script"}, {NULL, NULL, NULL, NULL} }; From 00ece05e79b4a74de8dcad1857cb9574a5687276 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 26 May 2020 11:30:37 +0200 Subject: [PATCH 367/632] added python3 scripts has their own folder --- include/common.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/common.h b/include/common.h index 4d6efcce2..9f04d75c7 100644 --- a/include/common.h +++ b/include/common.h @@ -24,6 +24,7 @@ #define PM3_USER_DIRECTORY PATHSEP ".proxmark3" PATHSEP // PM3 subdirectories: +#define PYTHON_SCRIPTS_SUBDIR "pyscripts" PATHSEP #define CMD_SCRIPTS_SUBDIR "cmdscripts" PATHSEP #define DICTIONARIES_SUBDIR "dictionaries" PATHSEP #define LUA_LIBRARIES_SUBDIR "lualibs" PATHSEP From 0e57a1c6cda97648ae42d5ac7bf605f28215e154 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 26 May 2020 11:48:37 +0200 Subject: [PATCH 368/632] optional python.. Thanks @doegox! --- client/Makefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/client/Makefile b/client/Makefile index adc07c88b..9ee678a4b 100644 --- a/client/Makefile +++ b/client/Makefile @@ -293,6 +293,11 @@ ifeq ($(BT_FOUND),1) PM3CFLAGS += -DHAVE_BLUEZ endif +ifeq ($(PYTHON_FOUND),1) + PM3CFLAGS += -DHAVE_PYTHON +endif + + CXXFLAGS ?= -Wall -Werror -O3 PM3CXXFLAGS = $(CXXFLAGS) PM3CXXFLAGS += -I../include From f852bf41c3a5bfde85f3f729bb6da75436839d9a Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 26 May 2020 11:49:26 +0200 Subject: [PATCH 369/632] adapt to optional python, Thanks @doegox! --- client/src/cmdscript.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/client/src/cmdscript.c b/client/src/cmdscript.c index b2ad53f50..0264a16f6 100644 --- a/client/src/cmdscript.c +++ b/client/src/cmdscript.c @@ -13,9 +13,11 @@ #include <stdlib.h> #include <string.h> -#define PY_SSIZE_T_CLEAN +#ifdef DHAVE_PYTHON +//#define PY_SSIZE_T_CLEAN #include <Python.h> #include <wchar.h> +#endif #include "cmdparser.h" // command_t @@ -79,8 +81,10 @@ static int CmdScriptRun(const char *Cmd) { pm3_scriptfile_t ext = PM3_LUA; if (str_endswith(preferredName, ".cmd")) ext = PM3_CMD; +#ifdef DHAVE_PYTHON if (str_endswith(preferredName, ".py")) ext = PM3_PY; +#endif char *script_path = NULL; if ((ext == PM3_LUA) && (searchFile(&script_path, LUA_SCRIPTS_SUBDIR, preferredName, ".lua", true) == PM3_SUCCESS)) { @@ -151,8 +155,7 @@ static int CmdScriptRun(const char *Cmd) { return ret; } - /* - + /* For apt (Ubuntu, Debian...): sudo apt-get install python3-dev # for python3.x installs @@ -177,6 +180,7 @@ static int CmdScriptRun(const char *Cmd) { */ +#ifdef DHAVE_PYTHON if ((ext == PM3_PY) && (searchFile(&script_path, PYTHON_SCRIPTS_SUBDIR, preferredName, ".py", true) == PM3_SUCCESS)) { PrintAndLogEx(SUCCESS, "executing python s " _YELLOW_("%s"), script_path); @@ -215,6 +219,7 @@ static int CmdScriptRun(const char *Cmd) { PrintAndLogEx(SUCCESS, "\nfinished " _YELLOW_("%s"), preferredName); return PM3_SUCCESS; } +#endif // file not found, let's search again to display the error messages int ret = PM3_EUNDEF; @@ -223,10 +228,10 @@ static int CmdScriptRun(const char *Cmd) { if (ext == PM3_CMD) ret = searchFile(&script_path, CMD_SCRIPTS_SUBDIR, preferredName, ".cmd", false); - +#ifdef DHAVE_PYTHON if (ext == PM3_PY) ret = searchFile(&script_path, PYTHON_SCRIPTS_SUBDIR, preferredName, ".py", false); - +#endif free(script_path); return ret; } From 6e3e1baef76bf60a1ff2b256386ba6eea341fb72 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 26 May 2020 12:00:42 +0200 Subject: [PATCH 370/632] logsss --- client/src/cmdscript.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/client/src/cmdscript.c b/client/src/cmdscript.c index 0264a16f6..f8fde1a40 100644 --- a/client/src/cmdscript.c +++ b/client/src/cmdscript.c @@ -13,7 +13,7 @@ #include <stdlib.h> #include <string.h> -#ifdef DHAVE_PYTHON +#ifdef HAVE_PYTHON //#define PY_SSIZE_T_CLEAN #include <Python.h> #include <wchar.h> @@ -79,11 +79,15 @@ static int CmdScriptRun(const char *Cmd) { extension_chk = str_dup(preferredName); str_lower(extension_chk); pm3_scriptfile_t ext = PM3_LUA; - if (str_endswith(preferredName, ".cmd")) + + if (str_endswith(extension_chk, ".cmd")) { ext = PM3_CMD; -#ifdef DHAVE_PYTHON - if (str_endswith(preferredName, ".py")) + } + +#ifdef HAVE_PYTHON + if (str_endswith(extension_chk, ".py")) { ext = PM3_PY; + } #endif char *script_path = NULL; @@ -180,9 +184,15 @@ static int CmdScriptRun(const char *Cmd) { */ -#ifdef DHAVE_PYTHON +#ifdef HAVE_PYTHON + + PrintAndLogEx(SUCCESS, "script engine detected: %s", ( ext == PM3_PY) ? "PYTHON" : ( ext == PM3_CMD) ? "CMD" : "LUA"); + PrintAndLogEx(SUCCESS, "script engine, folder %s", PYTHON_SCRIPTS_SUBDIR); + if ((ext == PM3_PY) && (searchFile(&script_path, PYTHON_SCRIPTS_SUBDIR, preferredName, ".py", true) == PM3_SUCCESS)) { + PrintAndLogEx(SUCCESS, "ICE"); + PrintAndLogEx(SUCCESS, "executing python s " _YELLOW_("%s"), script_path); PrintAndLogEx(SUCCESS, "args " _YELLOW_("'%s'"), arguments); @@ -200,7 +210,7 @@ static int CmdScriptRun(const char *Cmd) { FILE *f = fopen(script_path, "r"); if (f == NULL) { - PrintAndLogEx(ERR, "could not decode " _YELLOW_("%s"), script_path); + PrintAndLogEx(ERR, "Could open file " _YELLOW_("%s"), script_path); free(script_path); return PM3_ESOFT; } @@ -228,7 +238,7 @@ static int CmdScriptRun(const char *Cmd) { if (ext == PM3_CMD) ret = searchFile(&script_path, CMD_SCRIPTS_SUBDIR, preferredName, ".cmd", false); -#ifdef DHAVE_PYTHON +#ifdef HAVE_PYTHON if (ext == PM3_PY) ret = searchFile(&script_path, PYTHON_SCRIPTS_SUBDIR, preferredName, ".py", false); #endif From 6b8f1b141e9531334123001a3227ecaf62e20341 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 26 May 2020 12:07:01 +0200 Subject: [PATCH 371/632] change, search in python dir.. --- client/src/fileutils.c | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/fileutils.c b/client/src/fileutils.c index a650e3929..d5315e3b9 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -1446,6 +1446,7 @@ static int searchFinalFile(char **foundpath, const char *pm3dir, const char *sea (strcmp(LUA_LIBRARIES_SUBDIR, pm3dir) == 0) || (strcmp(LUA_SCRIPTS_SUBDIR, pm3dir) == 0) || (strcmp(CMD_SCRIPTS_SUBDIR, pm3dir) == 0) || + (strcmp(PYTHON_SCRIPTS_SUBDIR, pm3dir) == 0) || (strcmp(RESOURCES_SUBDIR, pm3dir) == 0))) { char *path = calloc(strlen(exec_path) + strlen(pm3dir) + strlen(filename) + 1, sizeof(char)); if (path == NULL) From e106a5717c7c464751aa28d1c2160b61992d5f41 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 26 May 2020 12:17:41 +0200 Subject: [PATCH 372/632] simple script working --- client/pyscripts/ice.py | 5 +++++ client/src/cmdscript.c | 5 ----- 2 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 client/pyscripts/ice.py diff --git a/client/pyscripts/ice.py b/client/pyscripts/ice.py new file mode 100644 index 000000000..a9d486813 --- /dev/null +++ b/client/pyscripts/ice.py @@ -0,0 +1,5 @@ + +lrc= 0x00 +for i in range(5): + lrc ^= 42 +print('\n final LRC XOR byte value: %02X\n' % (lrc)) diff --git a/client/src/cmdscript.c b/client/src/cmdscript.c index f8fde1a40..b5929c0ae 100644 --- a/client/src/cmdscript.c +++ b/client/src/cmdscript.c @@ -185,13 +185,8 @@ static int CmdScriptRun(const char *Cmd) { */ #ifdef HAVE_PYTHON - - PrintAndLogEx(SUCCESS, "script engine detected: %s", ( ext == PM3_PY) ? "PYTHON" : ( ext == PM3_CMD) ? "CMD" : "LUA"); - PrintAndLogEx(SUCCESS, "script engine, folder %s", PYTHON_SCRIPTS_SUBDIR); if ((ext == PM3_PY) && (searchFile(&script_path, PYTHON_SCRIPTS_SUBDIR, preferredName, ".py", true) == PM3_SUCCESS)) { - - PrintAndLogEx(SUCCESS, "ICE"); PrintAndLogEx(SUCCESS, "executing python s " _YELLOW_("%s"), script_path); PrintAndLogEx(SUCCESS, "args " _YELLOW_("'%s'"), arguments); From 366ac6a41f8a49b5de09a3555ca0030df200547b Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 26 May 2020 12:35:26 +0200 Subject: [PATCH 373/632] creating argc/argv --- client/src/cmdscript.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/client/src/cmdscript.c b/client/src/cmdscript.c index b5929c0ae..52b24562a 100644 --- a/client/src/cmdscript.c +++ b/client/src/cmdscript.c @@ -191,9 +191,9 @@ static int CmdScriptRun(const char *Cmd) { PrintAndLogEx(SUCCESS, "executing python s " _YELLOW_("%s"), script_path); PrintAndLogEx(SUCCESS, "args " _YELLOW_("'%s'"), arguments); - wchar_t *program = Py_DecodeLocale(script_path, NULL); + wchar_t *program = Py_DecodeLocale(preferredName, NULL); if (program == NULL) { - PrintAndLogEx(ERR, "could not decode " _YELLOW_("%s"), script_path); + PrintAndLogEx(ERR, "could not decode " _YELLOW_("%s"), preferredName); free(script_path); return PM3_ESOFT; } @@ -201,7 +201,20 @@ static int CmdScriptRun(const char *Cmd) { // optional but recommended Py_SetProgramName(program); Py_Initialize(); -// PySys_SetArgv(arguments, script_path); // we dont have argc , argv here + + + int argc = 6; + wchar_t *args[argc]; + args[0] = Py_DecodeLocale(preferredName, NULL); + args[1] = Py_DecodeLocale("04", NULL); + args[2] = Py_DecodeLocale("00", NULL); + args[3] = Py_DecodeLocale("80", NULL); + args[4] = Py_DecodeLocale("64", NULL); + args[5] = Py_DecodeLocale("ba", NULL); + + PySys_SetArgv(argc, args); + + //PySys_SetArgv(arguments, script_path); FILE *f = fopen(script_path, "r"); if (f == NULL) { @@ -210,7 +223,7 @@ static int CmdScriptRun(const char *Cmd) { return PM3_ESOFT; } - PyRun_SimpleFile(f, script_path); + PyRun_SimpleFile(f, preferredName); fclose(f); From 4aa40061671fbfaa8564a3fe8aebc1d813e2ffd9 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 26 May 2020 13:09:18 +0200 Subject: [PATCH 374/632] chg, python should close the script file --- client/src/cmdscript.c | 61 +++++++++++++++++++++++++++++++----------- 1 file changed, 46 insertions(+), 15 deletions(-) diff --git a/client/src/cmdscript.c b/client/src/cmdscript.c index 52b24562a..6fef662f3 100644 --- a/client/src/cmdscript.c +++ b/client/src/cmdscript.c @@ -36,11 +36,39 @@ typedef enum { PM3_LUA, PM3_CMD, +#ifdef HAVE_PYTHON PM3_PY +#endif } pm3_scriptfile_t; static int CmdHelp(const char *Cmd); +#ifdef HAVE_PYTHON +static int split(char *str, char **arr) { + int begin_index = 0; + int word_cnt = 0; + + while (1) { + while (isspace(str[begin_index])) { + ++begin_index; + } + if (str[begin_index] == '\0') { + break; + } + int end_index = begin_index; + while (str[end_index] && !isspace(str[end_index])) { + ++end_index; + } + int len = end_index - begin_index; + char *tmp = calloc(len + 1, sizeof(char)); + memcpy(tmp, &str[begin_index], len); + arr[word_cnt++] = tmp; + begin_index = end_index; + } + return word_cnt; +} +#endif + /** * Generate a sorted list of available commands, what it does is * generate a file listing of the script-directory for files @@ -188,7 +216,7 @@ static int CmdScriptRun(const char *Cmd) { if ((ext == PM3_PY) && (searchFile(&script_path, PYTHON_SCRIPTS_SUBDIR, preferredName, ".py", true) == PM3_SUCCESS)) { - PrintAndLogEx(SUCCESS, "executing python s " _YELLOW_("%s"), script_path); + PrintAndLogEx(SUCCESS, "executing python " _YELLOW_("%s"), script_path); PrintAndLogEx(SUCCESS, "args " _YELLOW_("'%s'"), arguments); wchar_t *program = Py_DecodeLocale(preferredName, NULL); @@ -202,19 +230,22 @@ static int CmdScriptRun(const char *Cmd) { Py_SetProgramName(program); Py_Initialize(); + //int argc, char ** argv + char *argv[128]; + int argc = split(arguments, argv); + + wchar_t *py_args[argc]; + py_args[0] = Py_DecodeLocale(preferredName, NULL); + for (int i = 0; i < argc; i++) { + py_args[i+1] = Py_DecodeLocale(argv[i], NULL); + } - int argc = 6; - wchar_t *args[argc]; - args[0] = Py_DecodeLocale(preferredName, NULL); - args[1] = Py_DecodeLocale("04", NULL); - args[2] = Py_DecodeLocale("00", NULL); - args[3] = Py_DecodeLocale("80", NULL); - args[4] = Py_DecodeLocale("64", NULL); - args[5] = Py_DecodeLocale("ba", NULL); - - PySys_SetArgv(argc, args); + PySys_SetArgv(argc, py_args); - //PySys_SetArgv(arguments, script_path); + // clean up + for (int i = 0; i < argc; ++i) { + free(argv[i]); + } FILE *f = fopen(script_path, "r"); if (f == NULL) { @@ -223,9 +254,9 @@ static int CmdScriptRun(const char *Cmd) { return PM3_ESOFT; } - PyRun_SimpleFile(f, preferredName); - - fclose(f); + // to we need to manually call all importmodules? + //PyImport_ImportModule("requests"); + PyRun_SimpleFileExFlags(f, preferredName, 1, NULL); if (Py_FinalizeEx() < 0) { free(script_path); From 5fcb031a681403d0a1d23b7f089a1e45cfc298c3 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 26 May 2020 13:10:33 +0200 Subject: [PATCH 375/632] chg, python scripts can not have "exit" calls... --- client/pyscripts/xorcheck.py | 51 ++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100755 client/pyscripts/xorcheck.py diff --git a/client/pyscripts/xorcheck.py b/client/pyscripts/xorcheck.py new file mode 100755 index 000000000..f4605a5e7 --- /dev/null +++ b/client/pyscripts/xorcheck.py @@ -0,0 +1,51 @@ +# xorcheck.py - find xor values for 8-bit LRC +# +# Adam Laurie <adam@algroup.co.uk> +# http://rfidiot.org/ +# +# This code is copyright (c) Adam Laurie, 2009, All rights reserved. +# For non-commercial use only, the following terms apply - for all other +# uses, please contact the author: +# +# This code 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 code 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. +# +# 2020, Modified (@iceman1001) + +import sys + +def main(): + if(len(sys.argv) < 3): + print(""" + \t{0} - Generate final byte for XOR LRC + + Usage: {0} <ID Byte1> <ID Byte2> ... <LRC> + + \tSpecifying the bytes of a UID with a known LRC will find the last byte value + \tneeded to generate that LRC with a rolling XOR. All bytes should be specified in HEX. + + Example: + + \t{0} 04 00 80 64 ba + + Should produce the output: + + \tTarget (BA) requires final LRC XOR byte value: 5A\n""".format(sys.argv[0])) + return 0 + + target= int(sys.argv[len(sys.argv) - 1],16) + + lrc= 0x00 + for i in range(len(sys.argv) - 1): + lrc ^= int(sys.argv[i + 1],16) + print('\nTarget (%02X) requires final LRC XOR byte value: %02X\n' % (target,lrc)) + +if __name__ == "__main__": + main() \ No newline at end of file From 3f02fa6e34844ef7c0e170b863e2e3a7c1e5fc46 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 26 May 2020 13:37:28 +0200 Subject: [PATCH 376/632] chg, right number of args.. --- client/src/cmdscript.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/cmdscript.c b/client/src/cmdscript.c index 6fef662f3..4bbe3b631 100644 --- a/client/src/cmdscript.c +++ b/client/src/cmdscript.c @@ -233,14 +233,14 @@ static int CmdScriptRun(const char *Cmd) { //int argc, char ** argv char *argv[128]; int argc = split(arguments, argv); - + wchar_t *py_args[argc]; py_args[0] = Py_DecodeLocale(preferredName, NULL); for (int i = 0; i < argc; i++) { py_args[i+1] = Py_DecodeLocale(argv[i], NULL); } - PySys_SetArgv(argc, py_args); + PySys_SetArgv(argc+1, py_args); // clean up for (int i = 0; i < argc; ++i) { From f7537519ff10909349fd1ea47372e69dd44f7966 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 26 May 2020 14:41:58 +0200 Subject: [PATCH 377/632] chg, make python aware of pm3 search paths --- client/pyscripts/ice.py | 7 +++-- client/src/cmdscript.c | 58 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 4 deletions(-) diff --git a/client/pyscripts/ice.py b/client/pyscripts/ice.py index a9d486813..9a223a059 100644 --- a/client/pyscripts/ice.py +++ b/client/pyscripts/ice.py @@ -1,5 +1,4 @@ +import os +import sys -lrc= 0x00 -for i in range(5): - lrc ^= 42 -print('\n final LRC XOR byte value: %02X\n' % (lrc)) +print("SP %s" % sys.path) diff --git a/client/src/cmdscript.c b/client/src/cmdscript.c index 4bbe3b631..cad94cafe 100644 --- a/client/src/cmdscript.c +++ b/client/src/cmdscript.c @@ -44,6 +44,9 @@ typedef enum { static int CmdHelp(const char *Cmd); #ifdef HAVE_PYTHON + +#define PYTHON_LIBRARIES_WILDCARD "?.py" + static int split(char *str, char **arr) { int begin_index = 0; int word_cnt = 0; @@ -67,6 +70,58 @@ static int split(char *str, char **arr) { } return word_cnt; } + +static void set_python_path(char *path) { + PyObject *syspath = PySys_GetObject("path"); + if (syspath == 0) { + PrintAndLogEx(WARNING, "Python failed to getobject"); + } + + PyObject *pName = PyUnicode_FromString(path); + if (PyList_Insert(syspath, 0, pName)) { + PrintAndLogEx(WARNING, "Error inserting extra path into sys.path list"); + } + + if (PySys_SetObject("path", syspath)) { + PrintAndLogEx(WARNING,"Error setting sys.path object"); + } +} + +static void set_python_paths(void) { + //--add to the LUA_PATH (package.path in lua) + // so we can load scripts from various places: + const char *exec_path = get_my_executable_directory(); + if (exec_path != NULL) { + // from the ./luascripts/ directory + char scripts_path[strlen(exec_path) + strlen(PYTHON_SCRIPTS_SUBDIR) + strlen(PYTHON_LIBRARIES_WILDCARD) + 1]; + strcpy(scripts_path, exec_path); + strcat(scripts_path, PYTHON_SCRIPTS_SUBDIR); +// strcat(scripts_path, PYTHON_LIBRARIES_WILDCARD); + set_python_path(scripts_path); + } + + const char *user_path = get_my_user_directory(); + if (user_path != NULL) { + // from the $HOME/.proxmark3/luascripts/ directory + char scripts_path[strlen(user_path) + strlen(PM3_USER_DIRECTORY) + strlen(PYTHON_SCRIPTS_SUBDIR) + strlen(PYTHON_LIBRARIES_WILDCARD) + 1]; + strcpy(scripts_path, user_path); + strcat(scripts_path, PM3_USER_DIRECTORY); + strcat(scripts_path, PYTHON_SCRIPTS_SUBDIR); +// strcat(scripts_path, PYTHON_LIBRARIES_WILDCARD); + set_python_path(scripts_path); + + } + + if (exec_path != NULL) { + // from the $PREFIX/share/proxmark3/luascripts/ directory + char scripts_path[strlen(exec_path) + strlen(PM3_SHARE_RELPATH) + strlen(PYTHON_SCRIPTS_SUBDIR) + strlen(PYTHON_LIBRARIES_WILDCARD) + 1]; + strcpy(scripts_path, exec_path); + strcat(scripts_path, PM3_SHARE_RELPATH); + strcat(scripts_path, PYTHON_SCRIPTS_SUBDIR); +// strcat(scripts_path, PYTHON_LIBRARIES_WILDCARD); + set_python_path(scripts_path); + } +} #endif /** @@ -247,6 +302,9 @@ static int CmdScriptRun(const char *Cmd) { free(argv[i]); } + // setup search paths. + set_python_paths(); + FILE *f = fopen(script_path, "r"); if (f == NULL) { PrintAndLogEx(ERR, "Could open file " _YELLOW_("%s"), script_path); From 698a56a91978c02cd0665eed2af6fc81bcf1be35 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 26 May 2020 14:43:40 +0200 Subject: [PATCH 378/632] moved and modified some existing pyton scripts for testing --- client/pyscripts/findbits.py | 99 ++++++++++++++++++++++++++++ client/pyscripts/parity.py | 78 ++++++++++++++++++++++ client/pyscripts/pm3_eml2mfd.py | 26 ++++++++ client/pyscripts/pm3_eml_mfd_test.py | 51 ++++++++++++++ client/pyscripts/pm3_mfd2eml.py | 28 ++++++++ 5 files changed, 282 insertions(+) create mode 100755 client/pyscripts/findbits.py create mode 100644 client/pyscripts/parity.py create mode 100755 client/pyscripts/pm3_eml2mfd.py create mode 100755 client/pyscripts/pm3_eml_mfd_test.py create mode 100755 client/pyscripts/pm3_mfd2eml.py diff --git a/client/pyscripts/findbits.py b/client/pyscripts/findbits.py new file mode 100755 index 000000000..809465a2e --- /dev/null +++ b/client/pyscripts/findbits.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 + +# findbits.py - find Binary, Octal, Decimal or Hex number in bitstream +# +# Adam Laurie <adam@algroup.co.uk> +# http://rfidiot.org/ +# +# This code is copyright (c) Adam Laurie, 2009, All rights reserved. +# For non-commercial use only, the following terms apply - for all other +# uses, please contact the author: +# +# This code 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 code 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. +# + +import sys +import os + +# invert binary string +def invert(data): + return ''.join('0' if c == '1' else '1' for c in data) + +# do the actual search +def search(target,data): + location = data.find(target) + if location >= 0: + print('*** Match at bit {:d}: {}<{}>{}'.format(location, data[:location],target,data[location+len(target):])) + else: + print('Not found') + +# convert integer to binary string +def binstring(number): + return bin(number)[2:] if number > 0 else '' + +# reverse string order +def stringreverse(data): + return data[::-1] + +# match forward, backward and inverted +def domatch(binary,number): + reversed= stringreverse(number) + inverted= invert(binary) + + print(' Forward: (%s) ' % number, end = '') + search(binary,number) + print(' Reverse: (%s) ' % reversed, end = '') + search(binary,reversed) + print(' Inverse: (%s) ' % inverted) + print(' Forward: (%s) ' % number, end = '') + search(inverted,number) + print(' Reverse: (%s) ' % reversed, end = '') + search(inverted,reversed) + +def main(): + if(len(sys.argv) < 3): + print(""" +\t{0} - Search bitstream for a known number + +Usage: {0} <NUMBER> <BITSTREAM> + +\tNUMBER will be converted to it\'s BINARY equivalent for all valid +\tinstances of BINARY, OCTAL, DECIMAL and HEX, and the bitstream +\tand it\'s inverse will be searched for a pattern match. Note that +\tNUMBER must be specified in BINARY to match leading zeros. + +Example: + +\t{0} 73 0110010101110011 +""".format(sys.argv[0])) + os._exit(True) + + bases= { + 2:'BINARY', + 8:'OCTAL', + 10:'DECIMAL', + 16:'HEX', + } + + for base, base_name in sorted(bases.items()): + try: + number= int(sys.argv[1],base) + print('\nTrying ' + base_name) + # do BINARY as specified to preserve leading zeros + if base == 2: + domatch(sys.argv[1],sys.argv[2]) + else: + domatch(binstring(number),sys.argv[2]) + except: + continue + +if __name__ == '__main__': + main() diff --git a/client/pyscripts/parity.py b/client/pyscripts/parity.py new file mode 100644 index 000000000..6be9d979d --- /dev/null +++ b/client/pyscripts/parity.py @@ -0,0 +1,78 @@ +# This code is contributed by +# Shubham Singh(SHUBHAMSINGH10) +# 2020, modified (@iceman1001) + +import sys + +# Python3 program to illustrate Compute the +# parity of a number using XOR +# Generating the look-up table while pre-processing +def P2(n, table): + table.extend([n, n ^ 1, n ^ 1, n]) +def P4(n, table): + return (P2(n, table), P2(n ^ 1, table), + P2(n ^ 1, table), P2(n, table)) +def P6(n, table): + return (P4(n, table), P4(n ^ 1, table), + P4(n ^ 1, table), P4(n, table)) +def LOOK_UP(table): + return (P6(0, table), P6(1, table), + P6(1, table), P6(0, table)) + +# LOOK_UP is the macro expansion to generate the table +table = [0] * 256 +LOOK_UP(table) + +# Function to find the parity +def Parity(num) : + # Number is considered to be of 32 bits + max = 16 + + # Dividing the number o 8-bit + # chunks while performing X-OR + while (max >= 8): + num = num ^ (num >> max) + max = max // 2 + + # Masking the number with 0xff (11111111) + # to produce valid 8-bit result + return table[num & 0xff] + +def main(): + if(len(sys.argv) < 2): + print(""" + \t{0} - Calculate parity of a given number + + Usage: {0} <2,10,16> <number> + + \t Specify type as in 2 Bin, 10 Decimal, 16 Hex, and number in that particular format + \t number can only be 32bit long. + + Example: + + \t{0} 10 1234 + + Should produce the output: + + \tOdd parity\n""".format(sys.argv[0])) + return 0 + + + numtype= int(sys.argv[1], 10) + print("numtype: {0}".format(numtype)) + input= int(sys.argv[2], numtype) + print("num: {0} 0x{0:X}".format(input)) + + #num = "001111100010100011101010111101011110" + # Result is 1 for odd parity + # 0 for even parity +# result = Parity( int(input, numtype) ) + result = Parity(input) + print("Odd parity") if result else print("Even parity") + + +if __name__ == "__main__": + main() + + + diff --git a/client/pyscripts/pm3_eml2mfd.py b/client/pyscripts/pm3_eml2mfd.py new file mode 100755 index 000000000..90803cf5e --- /dev/null +++ b/client/pyscripts/pm3_eml2mfd.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 + +''' +# Andrei Costin <zveriu@gmail.com>, 2011 +# pm3_eml2mfd.py +# Converts PM3 Mifare Classic emulator EML text file to MFD binary dump file +''' + +import sys +import binascii + +def main(argv): + argc = len(argv) + if argc < 3: + print('Usage:', argv[0], 'input.eml output.mfd') + return 1 + + with open(argv[1], "r") as file_inp, open(argv[2], "wb") as file_out: + for line in file_inp: + line = line.rstrip('\n').rstrip('\r') + print(line) + data = binascii.unhexlify(line) + file_out.write(data) + +if __name__ == '__main__': + main(sys.argv) diff --git a/client/pyscripts/pm3_eml_mfd_test.py b/client/pyscripts/pm3_eml_mfd_test.py new file mode 100755 index 000000000..8fae5965e --- /dev/null +++ b/client/pyscripts/pm3_eml_mfd_test.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 + +from tempfile import mkdtemp +from shutil import rmtree +from string import hexdigits +import unittest, os +import pm3_eml2mfd, pm3_mfd2eml + +class TestEmlMfd(unittest.TestCase): + def setUp(self): + self.tmpdir = mkdtemp() + + def tearDown(self): + rmtree(self.tmpdir) + + EML2MFD_TESTCASES = [ + ('', ''), + ("41424344\r\n45464748\n494A4B4C\n", "ABCDEFGHIJKL") + ] + def test_eml2mfd(self): + self.three_argument_test(pm3_eml2mfd.main, self.EML2MFD_TESTCASES) + + def test_mfd2eml(self): + self.three_argument_test(pm3_mfd2eml.main, + map(reversed, self.EML2MFD_TESTCASES), c14n=hex_c14n) + + def three_argument_test(self, operation, cases, c14n=str): + for case_input, case_output in cases: + try: + inp_name = os.path.join(self.tmpdir, 'input') + out_name = os.path.join(self.tmpdir, 'output') + with open(inp_name, 'w') as in_file: + in_file.write(case_input) + operation(['', inp_name, out_name]) + with open(out_name, 'r') as out_file: + self.assertEqual(c14n(case_output), c14n(out_file.read())) + finally: + for file_name in inp_name, out_name: + if os.path.exists(file_name): + os.remove(file_name) + + +def hex_c14n(inp): + """ + Canonicalizes the input string by removing non-hexadecimal + characters and making everything uppercase + """ + return ''.join(c.upper() for c in inp if c in hexdigits) + +if __name__ == '__main__': + unittest.main() diff --git a/client/pyscripts/pm3_mfd2eml.py b/client/pyscripts/pm3_mfd2eml.py new file mode 100755 index 000000000..ae7a79825 --- /dev/null +++ b/client/pyscripts/pm3_mfd2eml.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 + +''' +# Andrei Costin <zveriu@gmail.com>, 2011 +# pm3_eml2mfd.py +# Converts PM3 Mifare Classic MFD binary dump file to emulator EML text file +''' +import sys + +READ_BLOCKSIZE = 16 + +def main(argv): + argc = len(argv) + if argc < 3: + print('Usage:', argv[0], 'input.mfd output.eml') + return 1 + + with open(argv[1], "rb") as file_inp, open(argv[2], "w") as file_out: + while True: + byte_s = file_inp.read(READ_BLOCKSIZE) + if not byte_s: + break + hex_char_repr = byte_s.hex() + file_out.write(hex_char_repr) + file_out.write("\n") + +if __name__ == '__main__': + main(sys.argv) From 748c0772680725f4e6073cd6d6d522dc142dd823 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 26 May 2020 15:49:28 +0200 Subject: [PATCH 379/632] chg, python3 in cmake? --- client/CMakeLists.txt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 64cfca623..3938f76d5 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -38,6 +38,8 @@ endforeach() find_package(PkgConfig) pkg_search_module(BLUEZ QUIET bluez) +pkg_search_module(PYTHON3 QUIET python3) + SET (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake") add_subdirectory(deps) @@ -224,6 +226,14 @@ if (BLUEZ_FOUND) set(ADDITIONAL_LNK bluetooth ${ADDITIONAL_LNK}) endif (BLUEZ_FOUND) +if (PYTHON3_FOUND) + message("Python3 library found, building with python3 support :)") + add_definitions("-DHAVE_PYTHON") +# include_directories ( ${PYTHON_INCLUDE_DIRS} ) + set(ADDITIONAL_LNK python3 ${PYTHON_LIBRARIES}) +endif (PYTHON3_FOUND) + + add_executable( proxmark3 ${TARGET_SOURCES} @@ -286,7 +296,7 @@ target_link_libraries(proxmark3 PRIVATE ${ADDITIONAL_LNK}) install(TARGETS proxmark3 DESTINATION "bin") -install(DIRECTORY cmdscripts lualibs luascripts resources dictionaries DESTINATION "share/proxmark3") +install(DIRECTORY cmdscripts lualibs luascripts pyscripts resources dictionaries DESTINATION "share/proxmark3") add_custom_command(OUTPUT lualibs/pm3_cmd.lua COMMAND "awk -f pm3_cmd_h2lua.awk ../include/pm3_cmd.h > lualibs/pm3_cmd.lua" From e7230fa5d7a3a17b3e26a4add3bc1dd98a09413c Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 26 May 2020 16:47:54 +0200 Subject: [PATCH 380/632] chg, cmake woodo. almost there --- client/CMakeLists.txt | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 3938f76d5..20cb1cbbe 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -37,7 +37,6 @@ endforeach() find_package(PkgConfig) pkg_search_module(BLUEZ QUIET bluez) - pkg_search_module(PYTHON3 QUIET python3) SET (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake") @@ -190,7 +189,6 @@ add_custom_command( set(ADDITIONAL_SRC "") set(ADDITIONAL_LNK "") - set(X86_CPUS x86 x86_64 i686) message(STATUS "CMAKE_SYSTEM_PROCESSOR := ${CMAKE_SYSTEM_PROCESSOR}") @@ -229,10 +227,19 @@ endif (BLUEZ_FOUND) if (PYTHON3_FOUND) message("Python3 library found, building with python3 support :)") add_definitions("-DHAVE_PYTHON") -# include_directories ( ${PYTHON_INCLUDE_DIRS} ) - set(ADDITIONAL_LNK python3 ${PYTHON_LIBRARIES}) -endif (PYTHON3_FOUND) + #PYTHON3_LIBRARIES ... only the libraries (w/o the '-l') + #PYTHON3_LIBRARY_DIRS ... the paths of the libraries (w/o the '-L') + #PYTHON3_INCLUDE_DIRS ... the '-I' preprocessor flags (w/o the '-I') + + message(STATUS "PYTHON3 LIBS := ${PYTHON3_LIBRARIES}") + message(STATUS "PYTHON3 INC DIRS := ${PYTHON3_INCLUDE_DIRS}") + + set(ADDITIONAL_LNK ${ADDITIONAL_LNK} ${PYTHON3_LIBRARIES}) + +#PYTHONINCLUDES = pkg-config --cflags python3 == -I/usr/include/python3.6m -I/usr/include/x86_64-linux-gnu/python3.6m +#PYTHONLDLIBS = pkg-config --libs python3 == -lpython3.6m +endif (PYTHON3_FOUND) add_executable( proxmark3 From feafa62dede43839704cc4f70e7698f4ebeb2a9b Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 26 May 2020 16:57:54 +0200 Subject: [PATCH 381/632] chg, cmake compiles --- client/CMakeLists.txt | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 20cb1cbbe..285a20144 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -189,6 +189,7 @@ add_custom_command( set(ADDITIONAL_SRC "") set(ADDITIONAL_LNK "") +set(ADDITIONAL_DIRS "") set(X86_CPUS x86 x86_64 i686) message(STATUS "CMAKE_SYSTEM_PROCESSOR := ${CMAKE_SYSTEM_PROCESSOR}") @@ -227,18 +228,8 @@ endif (BLUEZ_FOUND) if (PYTHON3_FOUND) message("Python3 library found, building with python3 support :)") add_definitions("-DHAVE_PYTHON") - - #PYTHON3_LIBRARIES ... only the libraries (w/o the '-l') - #PYTHON3_LIBRARY_DIRS ... the paths of the libraries (w/o the '-L') - #PYTHON3_INCLUDE_DIRS ... the '-I' preprocessor flags (w/o the '-I') - - message(STATUS "PYTHON3 LIBS := ${PYTHON3_LIBRARIES}") - message(STATUS "PYTHON3 INC DIRS := ${PYTHON3_INCLUDE_DIRS}") - + set(ADDITIONAL_DIRS ${ADDITIONAL_DIRS} ${PYTHON3_INCLUDE_DIRS}) set(ADDITIONAL_LNK ${ADDITIONAL_LNK} ${PYTHON3_LIBRARIES}) - -#PYTHONINCLUDES = pkg-config --cflags python3 == -I/usr/include/python3.6m -I/usr/include/x86_64-linux-gnu/python3.6m -#PYTHONLDLIBS = pkg-config --libs python3 == -lpython3.6m endif (PYTHON3_FOUND) add_executable( @@ -265,6 +256,7 @@ target_include_directories(proxmark3 PRIVATE ../common_fpga ../include src + ${ADDITIONAL_DIRS} ) if (APPLE) From 9edb30f1665a97861ad6b49a5ef280dd78c75c76 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 26 May 2020 17:01:53 +0200 Subject: [PATCH 382/632] chg, python3-embed checks (@doegox) --- client/Makefile | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/client/Makefile b/client/Makefile index 9ee678a4b..70f45ca81 100644 --- a/client/Makefile +++ b/client/Makefile @@ -136,13 +136,20 @@ LDLIBS += $(LUALIB) INCLUDES += $(LUALIBINC) ## Python3 -#PYTHON_CONFIG := python3-config PYTHONINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags python3 2>/dev/null) PYTHONLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs python3 2>/dev/null) ifneq ($(PYTHONLDLIBS),) PYTHONLIB = $(PYTHONLDLIBS) PYTHONLIBINC = $(PYTHONINCLUDES) PYTHON_FOUND = 1 +else + PYTHONINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags python3-embed 2>/dev/null) + PYTHONLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs python3-embed 2>/dev/null) + ifneq ($(PYTHONLDLIBS),) + PYTHONLIB = $(PYTHONLDLIBS) + PYTHONLIBINC = $(PYTHONINCLUDES) + PYTHON_FOUND = 1 + endif endif LDLIBS += $(PYTHONLIB) INCLUDES += $(PYTHONLIBINC) From 6feb408071ba34c50d69cfb91dd812e63c26b3d6 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 26 May 2020 17:15:42 +0200 Subject: [PATCH 383/632] travis needs dev... --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index ad23bf6f8..7f3d79a46 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,6 +28,7 @@ addons: - gcc-arm-none-eabi - libnewlib-dev - libbluetooth-dev + - python3-dev homebrew: packages: - readline From 646a4cc4a6a4f1ec214047bd37663825b15823b3 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 26 May 2020 17:32:16 +0200 Subject: [PATCH 384/632] more version info --- client/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/Makefile b/client/Makefile index 70f45ca81..28ac1f87c 100644 --- a/client/Makefile +++ b/client/Makefile @@ -373,9 +373,9 @@ else endif ifeq ($(PYTHON_FOUND),1) - $(info Python library: system library found) + $(info Python3 version: Python3 v${shell pkg-config --modversion python3} found, enabled) else - $(info Python library: system library not found, disabled) + $(info Python library: Python3 not found, disabled) endif ifeq ($(SKIPWHEREAMISYSTEM),1) From 176f0dfe757525e1560fe44d55863b037c198b72 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 26 May 2020 17:35:27 +0200 Subject: [PATCH 385/632] chg, function available in v3.6 Travis has v3.5... --- client/src/cmdscript.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/client/src/cmdscript.c b/client/src/cmdscript.c index cad94cafe..07764db88 100644 --- a/client/src/cmdscript.c +++ b/client/src/cmdscript.c @@ -316,10 +316,7 @@ static int CmdScriptRun(const char *Cmd) { //PyImport_ImportModule("requests"); PyRun_SimpleFileExFlags(f, preferredName, 1, NULL); - if (Py_FinalizeEx() < 0) { - free(script_path); - return PM3_ESOFT; - } + Py_Finalize(); PyMem_RawFree(program); free(script_path); From 0464fd476ba9476288915d3cf41988bb07e26520 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Tue, 26 May 2020 17:37:03 +0200 Subject: [PATCH 386/632] Makefile python --- client/Makefile | 60 +++++++++++++++---------------- doc/md/Development/Maintainers.md | 1 + 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/client/Makefile b/client/Makefile index 28ac1f87c..bbaee39b0 100644 --- a/client/Makefile +++ b/client/Makefile @@ -135,25 +135,6 @@ endif LDLIBS += $(LUALIB) INCLUDES += $(LUALIBINC) -## Python3 -PYTHONINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags python3 2>/dev/null) -PYTHONLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs python3 2>/dev/null) -ifneq ($(PYTHONLDLIBS),) - PYTHONLIB = $(PYTHONLDLIBS) - PYTHONLIBINC = $(PYTHONINCLUDES) - PYTHON_FOUND = 1 -else - PYTHONINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags python3-embed 2>/dev/null) - PYTHONLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs python3-embed 2>/dev/null) - ifneq ($(PYTHONLDLIBS),) - PYTHONLIB = $(PYTHONLDLIBS) - PYTHONLIBINC = $(PYTHONINCLUDES) - PYTHON_FOUND = 1 - endif -endif -LDLIBS += $(PYTHONLIB) -INCLUDES += $(PYTHONLIBINC) - ## mbed TLS # system library cannot be used because it is compiled by default without CMAC support LDLIBS +=$(MBEDTLSLIB) @@ -219,13 +200,6 @@ endif LDLIBS += $(BTLIB) INCLUDES += $(BTLIBINC) -## Readline -ifeq ($(platform),Darwin) - LDLIBS += -L/usr/local/opt/readline/lib - INCLUDES += -I/usr/local/opt/readline/include -endif -LDLIBS += -lreadline - ## Math LDLIBS += -lm @@ -235,6 +209,28 @@ ifneq ($(SKIPPTHREAD),1) LDLIBS += -lpthread endif +## Python3 (optional) +ifneq ($(SKIPPYTHON),1) + PYTHONINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags python3 2>/dev/null) + PYTHONLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs python3 2>/dev/null) + ifneq ($(PYTHONLDLIBS),) + PYTHONLIB = $(PYTHONLDLIBS) + PYTHONLIBINC = $(PYTHONINCLUDES) + PYTHON_FOUND = 1 + else + # since python3.8, applications willing to embed python must use -embed: + PYTHONINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags python3-embed 2>/dev/null) + PYTHONLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs python3-embed 2>/dev/null) + ifneq ($(PYTHONLDLIBS),) + PYTHONLIB = $(PYTHONLDLIBS) + PYTHONLIBINC = $(PYTHONINCLUDES) + PYTHON_FOUND = 1 + endif + endif +endif +LDLIBS += $(PYTHONLIB) +INCLUDES += $(PYTHONLIBINC) + ## QT5 (or QT4 fallback) (optional) ifneq ($(SKIPQT),1) # Check for correctly configured Qt5 @@ -275,8 +271,12 @@ endif LDLIBS += $(QTLDLIBS) CXXINCLUDES += $(QTINCLUDES) -## Python - +## Readline +ifeq ($(platform),Darwin) + LDLIBS += -L/usr/local/opt/readline/lib + INCLUDES += -I/usr/local/opt/readline/include +endif +LDLIBS += -lreadline ####################################################################################################### CFLAGS ?= $(DEFCFLAGS) @@ -373,9 +373,9 @@ else endif ifeq ($(PYTHON_FOUND),1) - $(info Python3 version: Python3 v${shell pkg-config --modversion python3} found, enabled) + $(info Python3 library: Python3 v$(shell pkg-config --modversion python3) found, enabled) else - $(info Python library: Python3 not found, disabled) + $(info Python3 library: Python3 not found, disabled) endif ifeq ($(SKIPWHEREAMISYSTEM),1) diff --git a/doc/md/Development/Maintainers.md b/doc/md/Development/Maintainers.md index 0ea33b924..293fd3999 100644 --- a/doc/md/Development/Maintainers.md +++ b/doc/md/Development/Maintainers.md @@ -61,6 +61,7 @@ It's also possible to skip parts even if libraries are present in the compilatio * `make client SKIPQT=1` to skip GUI even if Qt is present * `make client SKIPBT=1` to skip native Bluetooth support even if libbluetooth is present +* `make client SKIPPYTHON=1` to skip embedded Python 3 interpreter even if libpython3 is present * `make client SKIPLUASYSTEM=1` to skip system Lua lib even if liblua5.2 is present, use embedded Lua lib instead * `make client SKIPJANSSONSYSTEM=1` to skip system Jansson lib even if libjansson is present, use embedded Jansson lib instead * `make client SKIPWHEREAMISYSTEM=1` to skip system Whereami lib even if libwhereami is present, use embedded whereami lib instead From 8498c32a785882fae25072ec65c4be6de9a1b7ab Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Tue, 26 May 2020 18:41:24 +0200 Subject: [PATCH 387/632] cmake support python < 3.8 and 3.8 --- client/CMakeLists.txt | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 285a20144..644008497 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -38,6 +38,7 @@ endforeach() find_package(PkgConfig) pkg_search_module(BLUEZ QUIET bluez) pkg_search_module(PYTHON3 QUIET python3) +pkg_search_module(PYTHON3EMBED QUIET python3-embed) SET (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake") @@ -225,12 +226,17 @@ if (BLUEZ_FOUND) set(ADDITIONAL_LNK bluetooth ${ADDITIONAL_LNK}) endif (BLUEZ_FOUND) -if (PYTHON3_FOUND) +if (PYTHON3EMBED_FOUND) message("Python3 library found, building with python3 support :)") add_definitions("-DHAVE_PYTHON") - set(ADDITIONAL_DIRS ${ADDITIONAL_DIRS} ${PYTHON3_INCLUDE_DIRS}) - set(ADDITIONAL_LNK ${ADDITIONAL_LNK} ${PYTHON3_LIBRARIES}) -endif (PYTHON3_FOUND) + set(ADDITIONAL_DIRS ${PYTHON3EMBED_INCLUDE_DIRS} ${ADDITIONAL_DIRS}) + set(ADDITIONAL_LNK ${PYTHON3EMBED_LIBRARIES} ${ADDITIONAL_LNK}) +elseif (PYTHON3_FOUND) + message("Python3 library found, building with python3 support :)") + add_definitions("-DHAVE_PYTHON") + set(ADDITIONAL_DIRS ${PYTHON3_INCLUDE_DIRS} ${ADDITIONAL_DIRS}) + set(ADDITIONAL_LNK ${PYTHON3_LIBRARIES} ${ADDITIONAL_LNK}) +endif (PYTHON3EMBED_FOUND) add_executable( proxmark3 From 25c5eebfcfbba7a22cc6da726c3705d2d15e5a82 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Tue, 26 May 2020 18:54:58 +0200 Subject: [PATCH 388/632] attempt to fix cmake+osx+python --- client/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 644008497..baf1dad44 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -231,11 +231,13 @@ if (PYTHON3EMBED_FOUND) add_definitions("-DHAVE_PYTHON") set(ADDITIONAL_DIRS ${PYTHON3EMBED_INCLUDE_DIRS} ${ADDITIONAL_DIRS}) set(ADDITIONAL_LNK ${PYTHON3EMBED_LIBRARIES} ${ADDITIONAL_LNK}) + set(ADDITIONAL_LNKDIRS ${PYTHON3EMBED_LIBRARY_DIRS} ${ADDITIONAL_LNKDIRS}) elseif (PYTHON3_FOUND) message("Python3 library found, building with python3 support :)") add_definitions("-DHAVE_PYTHON") set(ADDITIONAL_DIRS ${PYTHON3_INCLUDE_DIRS} ${ADDITIONAL_DIRS}) set(ADDITIONAL_LNK ${PYTHON3_LIBRARIES} ${ADDITIONAL_LNK}) + set(ADDITIONAL_LNKDIRS ${PYTHON3_LIBRARY_DIRS} ${ADDITIONAL_LNKDIRS}) endif (PYTHON3EMBED_FOUND) add_executable( @@ -300,6 +302,8 @@ target_link_libraries(proxmark3 PRIVATE pm3rrg_rdv4_whereami ${ADDITIONAL_LNK}) +target_link_directories(proxmark3 PRIVATE ${ADDITIONAL_LNKDIRS}) + install(TARGETS proxmark3 DESTINATION "bin") install(DIRECTORY cmdscripts lualibs luascripts pyscripts resources dictionaries DESTINATION "share/proxmark3") From 1781837bf98fb10a0f31bd0a99be19f4d6220f17 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 26 May 2020 21:57:26 +0200 Subject: [PATCH 389/632] chg, cmake for OSX, (Thanks @doegex!) --- client/CMakeLists.txt | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index baf1dad44..505073d7e 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -191,6 +191,7 @@ add_custom_command( set(ADDITIONAL_SRC "") set(ADDITIONAL_LNK "") set(ADDITIONAL_DIRS "") +set(ADDITIONAL_LNKDIRS "") set(X86_CPUS x86 x86_64 i686) message(STATUS "CMAKE_SYSTEM_PROCESSOR := ${CMAKE_SYSTEM_PROCESSOR}") @@ -227,7 +228,7 @@ if (BLUEZ_FOUND) endif (BLUEZ_FOUND) if (PYTHON3EMBED_FOUND) - message("Python3 library found, building with python3 support :)") + message("Python3-embed library found, building with python3 support :)") add_definitions("-DHAVE_PYTHON") set(ADDITIONAL_DIRS ${PYTHON3EMBED_INCLUDE_DIRS} ${ADDITIONAL_DIRS}) set(ADDITIONAL_LNK ${PYTHON3EMBED_LIBRARIES} ${ADDITIONAL_LNK}) @@ -237,7 +238,7 @@ elseif (PYTHON3_FOUND) add_definitions("-DHAVE_PYTHON") set(ADDITIONAL_DIRS ${PYTHON3_INCLUDE_DIRS} ${ADDITIONAL_DIRS}) set(ADDITIONAL_LNK ${PYTHON3_LIBRARIES} ${ADDITIONAL_LNK}) - set(ADDITIONAL_LNKDIRS ${PYTHON3_LIBRARY_DIRS} ${ADDITIONAL_LNKDIRS}) + set(ADDITIONAL_LNKDIRS ${PYTHON3_LIBRARY_DIRS} ${ADDITIONAL_LNKDIRS}) endif (PYTHON3EMBED_FOUND) add_executable( @@ -302,8 +303,15 @@ target_link_libraries(proxmark3 PRIVATE pm3rrg_rdv4_whereami ${ADDITIONAL_LNK}) -target_link_directories(proxmark3 PRIVATE ${ADDITIONAL_LNKDIRS}) - +# OSX have a hard time compiling python3 dependency with older cmake. +if (PYTHON3EMBED_FOUND AND PYTHON3_FOUND) + if (NOT CMAKE_VERSION VERSION_LESS 3.13) + target_link_directories(proxmark3 PRIVATE ${ADDITIONAL_LNKDIRS}) + elseif (APPLE) + message( SEND_ERROR "Your CMAKE version is too old for Apple platform, please update to a version >=3.13" ) + endif() +endif() + install(TARGETS proxmark3 DESTINATION "bin") install(DIRECTORY cmdscripts lualibs luascripts pyscripts resources dictionaries DESTINATION "share/proxmark3") From 125e05ec0e6522ba116e8265faa7499a3bf5483b Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 26 May 2020 21:58:50 +0200 Subject: [PATCH 390/632] chg, clean up --- client/src/cmdscript.c | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/client/src/cmdscript.c b/client/src/cmdscript.c index 07764db88..6d95c40ea 100644 --- a/client/src/cmdscript.c +++ b/client/src/cmdscript.c @@ -157,22 +157,22 @@ static int CmdScriptRun(const char *Cmd) { int arg_len = 0; static uint8_t luascriptfile_idx = 0; sscanf(Cmd, "%127s%n %255[^\n\r]%n", preferredName, &name_len, arguments, &arg_len); - + char *extension_chk; extension_chk = str_dup(preferredName); str_lower(extension_chk); pm3_scriptfile_t ext = PM3_LUA; - + if (str_endswith(extension_chk, ".cmd")) { ext = PM3_CMD; } - + #ifdef HAVE_PYTHON if (str_endswith(extension_chk, ".py")) { ext = PM3_PY; } #endif - + char *script_path = NULL; if ((ext == PM3_LUA) && (searchFile(&script_path, LUA_SCRIPTS_SUBDIR, preferredName, ".lua", true) == PM3_SUCCESS)) { int error; @@ -241,8 +241,8 @@ static int CmdScriptRun(const char *Cmd) { free(script_path); return ret; } - - /* + + /* For apt (Ubuntu, Debian...): sudo apt-get install python3-dev # for python3.x installs @@ -264,13 +264,12 @@ static int CmdScriptRun(const char *Cmd) { For apt-cyg (Cygwin...): apt-cyg install python3-devel # for python3.x installs - */ #ifdef HAVE_PYTHON - + if ((ext == PM3_PY) && (searchFile(&script_path, PYTHON_SCRIPTS_SUBDIR, preferredName, ".py", true) == PM3_SUCCESS)) { - + PrintAndLogEx(SUCCESS, "executing python " _YELLOW_("%s"), script_path); PrintAndLogEx(SUCCESS, "args " _YELLOW_("'%s'"), arguments); @@ -288,7 +287,6 @@ static int CmdScriptRun(const char *Cmd) { //int argc, char ** argv char *argv[128]; int argc = split(arguments, argv); - wchar_t *py_args[argc]; py_args[0] = Py_DecodeLocale(preferredName, NULL); for (int i = 0; i < argc; i++) { @@ -296,28 +294,24 @@ static int CmdScriptRun(const char *Cmd) { } PySys_SetArgv(argc+1, py_args); - + // clean up for (int i = 0; i < argc; ++i) { free(argv[i]); } - + // setup search paths. set_python_paths(); - + FILE *f = fopen(script_path, "r"); if (f == NULL) { PrintAndLogEx(ERR, "Could open file " _YELLOW_("%s"), script_path); free(script_path); - return PM3_ESOFT; + return PM3_ESOFT; } - // to we need to manually call all importmodules? - //PyImport_ImportModule("requests"); PyRun_SimpleFileExFlags(f, preferredName, 1, NULL); - Py_Finalize(); - PyMem_RawFree(program); free(script_path); PrintAndLogEx(SUCCESS, "\nfinished " _YELLOW_("%s"), preferredName); From 02c76f39e284d36f461173a660de8d48d78df5aa Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Tue, 26 May 2020 22:20:34 +0200 Subject: [PATCH 391/632] fix cmake for osx+python --- client/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 505073d7e..c01c199d9 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -304,7 +304,7 @@ target_link_libraries(proxmark3 PRIVATE ${ADDITIONAL_LNK}) # OSX have a hard time compiling python3 dependency with older cmake. -if (PYTHON3EMBED_FOUND AND PYTHON3_FOUND) +if (PYTHON3EMBED_FOUND OR PYTHON3_FOUND) if (NOT CMAKE_VERSION VERSION_LESS 3.13) target_link_directories(proxmark3 PRIVATE ${ADDITIONAL_LNKDIRS}) elseif (APPLE) From 24bdecac8e44e202d2709c78401cc20e62357dea Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Tue, 26 May 2020 19:06:08 +0200 Subject: [PATCH 392/632] cmake: use less hardcoded items --- client/CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index c01c199d9..28735b9b7 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -30,6 +30,7 @@ set(QT_PACKAGELIST set(Qt5_FOUND ON) foreach(_qt_package IN LISTS QT_PACKAGELIST) find_package(${_qt_package} QUIET ${QT_FIND_PACKAGE_OPTIONS}) + set(Qt5_LIBRARIES ${${_qt_package}_LIBRARIES} ${Qt5_LIBRARIES}) if(NOT ${_qt_package}_FOUND) set(Qt5_FOUND OFF) endif(NOT ${_qt_package}_FOUND) @@ -213,7 +214,7 @@ if (Qt5_FOUND) ${TARGET_SOURCES}) add_definitions("-DHAVE_GUI") - set(ADDITIONAL_LNK Qt5::Core Qt5::Widgets Qt5::Gui ${ADDITIONAL_LNK}) + set(ADDITIONAL_LNK ${Qt5_LIBRARIES} ${ADDITIONAL_LNK}) else (Qt5_FOUND) message("Qt5 library not found, not building gui") set(TARGET_SOURCES @@ -224,7 +225,7 @@ endif (Qt5_FOUND) if (BLUEZ_FOUND) message("Bluez library found, building native Bluetooth support :)") add_definitions("-DHAVE_BLUEZ") - set(ADDITIONAL_LNK bluetooth ${ADDITIONAL_LNK}) + set(ADDITIONAL_LNK ${BLUEZ_LIBRARIES} ${ADDITIONAL_LNK}) endif (BLUEZ_FOUND) if (PYTHON3EMBED_FOUND) From b4c715d8fb69f81a7d0abf4d9b0195321c351648 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Wed, 27 May 2020 00:40:01 +0200 Subject: [PATCH 393/632] script run: look for all three extensions if not specified --- client/src/cmdscript.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/client/src/cmdscript.c b/client/src/cmdscript.c index 6d95c40ea..c9b485231 100644 --- a/client/src/cmdscript.c +++ b/client/src/cmdscript.c @@ -34,11 +34,12 @@ #include "fileutils.h" typedef enum { + PM3_UNSPECIFIED, PM3_LUA, PM3_CMD, #ifdef HAVE_PYTHON PM3_PY -#endif +#endif } pm3_scriptfile_t; static int CmdHelp(const char *Cmd); @@ -161,20 +162,20 @@ static int CmdScriptRun(const char *Cmd) { char *extension_chk; extension_chk = str_dup(preferredName); str_lower(extension_chk); - pm3_scriptfile_t ext = PM3_LUA; - - if (str_endswith(extension_chk, ".cmd")) { + pm3_scriptfile_t ext = PM3_UNSPECIFIED; + if (str_endswith(extension_chk, ".lua")) { + ext = PM3_LUA; + } else if (str_endswith(extension_chk, ".cmd")) { ext = PM3_CMD; } - #ifdef HAVE_PYTHON - if (str_endswith(extension_chk, ".py")) { + else if (str_endswith(extension_chk, ".py")) { ext = PM3_PY; } #endif char *script_path = NULL; - if ((ext == PM3_LUA) && (searchFile(&script_path, LUA_SCRIPTS_SUBDIR, preferredName, ".lua", true) == PM3_SUCCESS)) { + if (((ext == PM3_LUA) || (ext == PM3_UNSPECIFIED)) && (searchFile(&script_path, LUA_SCRIPTS_SUBDIR, preferredName, ".lua", true) == PM3_SUCCESS)) { int error; if (luascriptfile_idx == MAX_NESTED_LUASCRIPT) { PrintAndLogEx(ERR, "too many nested scripts, skipping %s\n", script_path); @@ -230,7 +231,7 @@ static int CmdScriptRun(const char *Cmd) { return PM3_SUCCESS; } - if ((ext == PM3_CMD) && (searchFile(&script_path, CMD_SCRIPTS_SUBDIR, preferredName, ".cmd", true) == PM3_SUCCESS)) { + if (((ext == PM3_CMD) || (ext == PM3_UNSPECIFIED)) && (searchFile(&script_path, CMD_SCRIPTS_SUBDIR, preferredName, ".cmd", true) == PM3_SUCCESS)) { PrintAndLogEx(SUCCESS, "executing Cmd " _YELLOW_("%s"), script_path); PrintAndLogEx(SUCCESS, "args " _YELLOW_("'%s'"), arguments); @@ -268,7 +269,7 @@ static int CmdScriptRun(const char *Cmd) { #ifdef HAVE_PYTHON - if ((ext == PM3_PY) && (searchFile(&script_path, PYTHON_SCRIPTS_SUBDIR, preferredName, ".py", true) == PM3_SUCCESS)) { + if (((ext == PM3_PY) || (ext == PM3_UNSPECIFIED)) && (searchFile(&script_path, PYTHON_SCRIPTS_SUBDIR, preferredName, ".py", true) == PM3_SUCCESS)) { PrintAndLogEx(SUCCESS, "executing python " _YELLOW_("%s"), script_path); PrintAndLogEx(SUCCESS, "args " _YELLOW_("'%s'"), arguments); @@ -323,13 +324,14 @@ static int CmdScriptRun(const char *Cmd) { int ret = PM3_EUNDEF; if (ext == PM3_LUA) ret = searchFile(&script_path, LUA_SCRIPTS_SUBDIR, preferredName, ".lua", false); - - if (ext == PM3_CMD) + else if (ext == PM3_CMD) ret = searchFile(&script_path, CMD_SCRIPTS_SUBDIR, preferredName, ".cmd", false); #ifdef HAVE_PYTHON - if (ext == PM3_PY) + else if (ext == PM3_PY) ret = searchFile(&script_path, PYTHON_SCRIPTS_SUBDIR, preferredName, ".py", false); #endif + else if (ext == PM3_UNSPECIFIED) + PrintAndLogEx(FAILED, "Error - can't find %s.[lua|cmd|py]", preferredName); free(script_path); return ret; } From fcfdd92407f60190b577130d7ae742d740dbbdf7 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Wed, 27 May 2020 01:15:20 +0200 Subject: [PATCH 394/632] python: adjust help, hide more if no python available, search lua/cmd/py if no extension given --- client/Makefile | 10 +++++++--- client/src/cmdscript.c | 23 ++++++++++++++++++----- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/client/Makefile b/client/Makefile index bbaee39b0..52ccfc23f 100644 --- a/client/Makefile +++ b/client/Makefile @@ -372,10 +372,14 @@ else endif endif -ifeq ($(PYTHON_FOUND),1) - $(info Python3 library: Python3 v$(shell pkg-config --modversion python3) found, enabled) +ifeq ($(SKIPPYTHON),1) + $(info Python3 library: skipped) else - $(info Python3 library: Python3 not found, disabled) + ifeq ($(PYTHON_FOUND),1) + $(info Python3 library: Python3 v$(shell pkg-config --modversion python3) found, enabled) + else + $(info Python3 library: Python3 not found, disabled) + endif endif ifeq ($(SKIPWHEREAMISYSTEM),1) diff --git a/client/src/cmdscript.c b/client/src/cmdscript.c index c9b485231..bc8116849 100644 --- a/client/src/cmdscript.c +++ b/client/src/cmdscript.c @@ -139,8 +139,11 @@ static int CmdScriptList(const char *Cmd) { ret = searchAndList(CMD_SCRIPTS_SUBDIR, ".cmd"); if (ret != PM3_SUCCESS) return ret; - +#ifdef HAVE_PYTHON return searchAndList(PYTHON_SCRIPTS_SUBDIR, ".py"); +#else + return ret; +#endif } /** @@ -158,7 +161,10 @@ static int CmdScriptRun(const char *Cmd) { int arg_len = 0; static uint8_t luascriptfile_idx = 0; sscanf(Cmd, "%127s%n %255[^\n\r]%n", preferredName, &name_len, arguments, &arg_len); - + if (strlen(preferredName) == 0) { + PrintAndLogEx(FAILED, "no script name provided"); + return PM3_EINVARG; + } char *extension_chk; extension_chk = str_dup(preferredName); str_lower(extension_chk); @@ -329,15 +335,18 @@ static int CmdScriptRun(const char *Cmd) { #ifdef HAVE_PYTHON else if (ext == PM3_PY) ret = searchFile(&script_path, PYTHON_SCRIPTS_SUBDIR, preferredName, ".py", false); -#endif else if (ext == PM3_UNSPECIFIED) PrintAndLogEx(FAILED, "Error - can't find %s.[lua|cmd|py]", preferredName); +#else + else if (ext == PM3_UNSPECIFIED) + PrintAndLogEx(FAILED, "Error - can't find %s.[lua|cmd]", preferredName); +#endif free(script_path); return ret; } static command_t CommandTable[] = { - {"help", CmdHelp, AlwaysAvailable, "This help"}, + {"help", CmdHelp, AlwaysAvailable, "Usage info"}, {"list", CmdScriptList, AlwaysAvailable, "List available scripts"}, {"run", CmdScriptRun, AlwaysAvailable, "<name> -- execute a script"}, {NULL, NULL, NULL, NULL} @@ -351,7 +360,11 @@ static command_t CommandTable[] = { */ static int CmdHelp(const char *Cmd) { (void)Cmd; // Cmd is not used so far - PrintAndLogEx(NORMAL, "This is a feature to run Lua-scripts. You can place Lua-scripts within the luascripts/-folder. "); +#ifdef HAVE_PYTHON + PrintAndLogEx(NORMAL, "This is a feature to run Lua/Cmd/Python scripts. You can place scripts within the luascripts/cmdscripts/pyscripts folders. "); +#else + PrintAndLogEx(NORMAL, "This is a feature to run Lua/Cmd scripts. You can place scripts within the luascripts/cmdscripts folders. "); +#endif return PM3_SUCCESS; } From a8c3859ed18cc9f10a76a1d0ef04ea1e8f4dd1f6 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 10:19:22 +0200 Subject: [PATCH 395/632] chg, 'script run' - added hint --- client/src/cmdscript.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/client/src/cmdscript.c b/client/src/cmdscript.c index bc8116849..38c980765 100644 --- a/client/src/cmdscript.c +++ b/client/src/cmdscript.c @@ -37,7 +37,7 @@ typedef enum { PM3_UNSPECIFIED, PM3_LUA, PM3_CMD, -#ifdef HAVE_PYTHON +#ifdef HAVE_PYTHON PM3_PY #endif } pm3_scriptfile_t; @@ -77,12 +77,12 @@ static void set_python_path(char *path) { if (syspath == 0) { PrintAndLogEx(WARNING, "Python failed to getobject"); } - + PyObject *pName = PyUnicode_FromString(path); if (PyList_Insert(syspath, 0, pName)) { PrintAndLogEx(WARNING, "Error inserting extra path into sys.path list"); } - + if (PySys_SetObject("path", syspath)) { PrintAndLogEx(WARNING,"Error setting sys.path object"); } @@ -135,7 +135,7 @@ static int CmdScriptList(const char *Cmd) { int ret = searchAndList(LUA_SCRIPTS_SUBDIR, ".lua"); if (ret != PM3_SUCCESS) return ret; - + ret = searchAndList(CMD_SCRIPTS_SUBDIR, ".cmd"); if (ret != PM3_SUCCESS) return ret; @@ -163,6 +163,7 @@ static int CmdScriptRun(const char *Cmd) { sscanf(Cmd, "%127s%n %255[^\n\r]%n", preferredName, &name_len, arguments, &arg_len); if (strlen(preferredName) == 0) { PrintAndLogEx(FAILED, "no script name provided"); + PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`script list`") " to see available scripts"); return PM3_EINVARG; } char *extension_chk; From fa2e952dc9609c199860c35ce7f2ca8f989c73a9 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 10:19:45 +0200 Subject: [PATCH 396/632] chg, swapped prefix for HINT --- client/src/ui.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/src/ui.c b/client/src/ui.c index 798ed165a..cc256d8e3 100644 --- a/client/src/ui.c +++ b/client/src/ui.c @@ -207,6 +207,8 @@ void PrintAndLogEx(logLevel_t level, const char *fmt, ...) { strncpy(prefix, _BLUE_("[#] "), sizeof(prefix) - 1); break; case HINT: + strncpy(prefix, _YELLOW_("[?] "), sizeof(prefix) - 1); + break; case SUCCESS: strncpy(prefix, _GREEN_("[+] "), sizeof(prefix) - 1); break; From e381bd51196b0eecb675f65fdb9617df8db048b1 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 11:44:34 +0200 Subject: [PATCH 397/632] textual --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fdb0b7c05..3a70189b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Add Python3 as possible script engine (@iceman1001, @doegox) - Add doc/mfu_binary_format_notes.md (@iceman1001) - Fix `hf mfu dump` - now reads Ulev1 3counter vs NTAG 1 counters (@iceman1001) - Fix `hf mfu info` - now print correct cfg1 - nfc protection (@iceman1001) From f32620a04bbbac55a621b86eb024ea4d4d57687f Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 11:53:17 +0200 Subject: [PATCH 398/632] OLD->MIX --- client/src/cmdhfmfu.c | 50 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 7 deletions(-) diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index efd10210d..b150d3435 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -486,7 +486,7 @@ static int ul_fudan_check(void) { uint8_t cmd[4] = {0x30, 0x00, 0x02, 0xa7}; //wrong crc on purpose should be 0xa8 clearCommandBuffer(); - SendCommandOLD(CMD_HF_ISO14443A_READER, ISO14A_RAW | ISO14A_NO_DISCONNECT | ISO14A_NO_RATS, 4, 0, cmd, sizeof(cmd)); + SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_RAW | ISO14A_NO_DISCONNECT | ISO14A_NO_RATS, 4, 0, cmd, sizeof(cmd)); PacketResponseNG resp; if (!WaitForResponseTimeout(CMD_ACK, &resp, 1500)) return UL_ERROR; if (resp.oldarg[0] != 1) return UL_ERROR; @@ -1052,6 +1052,42 @@ uint32_t GetHF14AMfU_Type(void) { switch (len) { case 0x0A: { + /* + MF0UL1001DUx 0004030100000B03 +MF0UL1101DUx 0004030101000B03 +MF0ULH1101DUx 0004030201000B03 +MF0UL1141DUF 0004030301000B03 +MF0UL2101Dxy 0004030101000E03 +MF0UL2101DUx 0004030201000E03 +MF0UL3101DUx 0004030101001103 +MF0ULH3101DUx 0004030201001103 +MF0UL5101DUx 0004030101001303 +NT2L1011F0DUx 0004040101000B03 +NT2H1011G0DUD 0004040201000B03 +NT2L1211F0DUx 0004040101000E03 +NT2H1311G0DUx 0004040201000F03 +NT2H1311F0Dxy 0004040401000F03 +NT2H1411G0DUx 0004040201011103 +NT2H1511G0DUx 0004040201001103 +NT2H1511F0Dxy 0004040401001103 +NT2H1611G0DUx 0004040201001303 +NT2H1611F0Dxy 0004040401001303 +NT2H1311C1DTL 0004040201010F03 +NT2H1311TTDUx 0004040203000F03 +NT3H1101W0FHK 0004040502001303 +NT3H1201W0FHK 0004040502001503 +NT3H1101W0FHK_Variant 0004040502011303 +NT3H1201 0004040502011503 +NT3H2111 0004040502021303 +NT3H2211 0004040502021503 +nhs 0004040600001303 +MF0UN0001DUx 0004030102000B03 +MF0UNH0001DUx 0004030202000B03 +MF0UN1001DUx 0004030103000B03 +MF0UNH1001DUx 0004030203000B03 +NT2L1001G0DUx 0004040102000B03 +NT2H1001G0DUx 0004040202000B03 + */ if (memcmp(version, "\x00\x04\x03\x01\x01\x00\x0B", 7) == 0) { tagtype = UL_EV1_48; break; } else if (memcmp(version, "\x00\x04\x03\x01\x02\x00\x0B", 7) == 0) { tagtype = UL_NANO_40; break; } @@ -1534,7 +1570,7 @@ static int CmdHF14AMfUWrBl(const char *Cmd) { } clearCommandBuffer(); - SendCommandOLD(CMD_HF_MIFAREU_WRITEBL, blockNo, keytype, 0, cmddata, datalen); + SendCommandMIX(CMD_HF_MIFAREU_WRITEBL, blockNo, keytype, 0, cmddata, datalen); PacketResponseNG resp; if (WaitForResponseTimeout(CMD_ACK, &resp, 1500)) { uint8_t isOK = resp.oldarg[0] & 0xff; @@ -1639,7 +1675,7 @@ static int CmdHF14AMfURdBl(const char *Cmd) { } clearCommandBuffer(); - SendCommandOLD(CMD_HF_MIFAREU_READBL, blockNo, keytype, 0, authKeyPtr, datalen); + SendCommandMIX(CMD_HF_MIFAREU_READBL, blockNo, keytype, 0, authKeyPtr, datalen); PacketResponseNG resp; if (WaitForResponseTimeout(CMD_ACK, &resp, 1500)) { uint8_t isOK = resp.oldarg[0] & 0xff; @@ -1907,7 +1943,7 @@ static int CmdHF14AMfUDump(const char *Cmd) { } clearCommandBuffer(); - SendCommandOLD(CMD_HF_MIFAREU_READCARD, startPage, pages, keytype, authKeyPtr, dataLen); + SendCommandMIX(CMD_HF_MIFAREU_READCARD, startPage, pages, keytype, authKeyPtr, dataLen); PacketResponseNG resp; if (!WaitForResponseTimeout(CMD_ACK, &resp, 2500)) { @@ -2812,7 +2848,7 @@ static int CmdHF14AMfuOtpTearoff(const char *Cmd) { PrintAndLogEx(INFO, "Reading block BEFORE attack"); clearCommandBuffer(); - SendCommandOLD(CMD_HF_MIFAREU_READBL, blockNoUint, 0, 0, NULL, 0); + SendCommandMIX(CMD_HF_MIFAREU_READBL, blockNoUint, 0, 0, NULL, 0); PacketResponseNG resp; if (WaitForResponseTimeout(CMD_ACK, &resp, 1500)) { @@ -2828,7 +2864,7 @@ static int CmdHF14AMfuOtpTearoff(const char *Cmd) { PrintAndLogEx(INFO, "....."); clearCommandBuffer(); - SendCommandOLD(CMD_HF_MFU_OTP_TEAROFF, blockNoUint, actualTime, 0, teardata, 8); + SendCommandMIX(CMD_HF_MFU_OTP_TEAROFF, blockNoUint, actualTime, 0, teardata, 8); if (!WaitForResponseTimeout(CMD_HF_MFU_OTP_TEAROFF, &resp, 4000)) { PrintAndLogEx(WARNING, "Failed"); return PM3_ESOFT; @@ -2837,7 +2873,7 @@ static int CmdHF14AMfuOtpTearoff(const char *Cmd) { PrintAndLogEx(INFO, "Reading block AFTER attack"); clearCommandBuffer(); - SendCommandOLD(CMD_HF_MIFAREU_READBL, blockNoUint, 0, 0, NULL, 0); + SendCommandMIX(CMD_HF_MIFAREU_READBL, blockNoUint, 0, 0, NULL, 0); if (WaitForResponseTimeout(CMD_ACK, &resp, 1500)) { uint8_t isOK = resp.oldarg[0] & 0xff; if (isOK) { From 045f2a8587afe891550c0324b04650e9f1627108 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 11:55:32 +0200 Subject: [PATCH 399/632] OLD->MIX --- client/src/mifare/mifarehost.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/mifare/mifarehost.c b/client/src/mifare/mifarehost.c index 00e26a89e..fae64a2f6 100644 --- a/client/src/mifare/mifarehost.c +++ b/client/src/mifare/mifarehost.c @@ -748,7 +748,7 @@ out: int mfReadSector(uint8_t sectorNo, uint8_t keyType, uint8_t *key, uint8_t *data) { clearCommandBuffer(); - SendCommandOLD(CMD_HF_MIFARE_READSC, sectorNo, keyType, 0, key, 6); + SendCommandMIX(CMD_HF_MIFARE_READSC, sectorNo, keyType, 0, key, 6); PacketResponseNG resp; if (WaitForResponseTimeout(CMD_ACK, &resp, 1500)) { @@ -910,7 +910,7 @@ int mfCWipe(uint8_t *uid, uint8_t *atqa, uint8_t *sak) { int mfCSetBlock(uint8_t blockNo, uint8_t *data, uint8_t *uid, uint8_t params) { clearCommandBuffer(); - SendCommandOLD(CMD_HF_MIFARE_CSETBL, params, blockNo, 0, data, 16); + SendCommandMIX(CMD_HF_MIFARE_CSETBL, params, blockNo, 0, data, 16); PacketResponseNG resp; if (WaitForResponseTimeout(CMD_ACK, &resp, 1500)) { uint8_t isOK = resp.oldarg[0] & 0xff; From f3cc84220f221ad76b118f87e7c04bbe859eaa71 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 11:58:04 +0200 Subject: [PATCH 400/632] OLD->MIX --- client/src/cmdsmartcard.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/client/src/cmdsmartcard.c b/client/src/cmdsmartcard.c index f21ef5c4a..f60dd5513 100644 --- a/client/src/cmdsmartcard.c +++ b/client/src/cmdsmartcard.c @@ -366,7 +366,7 @@ static int smart_responseEx(uint8_t *data, bool silent) { uint8_t getstatus[] = {0x00, ISO7816_GET_RESPONSE, 0x00, 0x00, len}; clearCommandBuffer(); - SendCommandOLD(CMD_SMART_RAW, SC_RAW, sizeof(getstatus), 0, getstatus, sizeof(getstatus)); + SendCommandMIX(CMD_SMART_RAW, SC_RAW, sizeof(getstatus), 0, getstatus, sizeof(getstatus)); datalen = smart_wait(data, silent); @@ -893,7 +893,7 @@ static void smart_brute_prim(void) { for (int i = 0; i < ARRAYLEN(get_card_data); i += 5) { clearCommandBuffer(); - SendCommandOLD(CMD_SMART_RAW, SC_RAW_T0, 5, 0, get_card_data + i, 5); + SendCommandMIX(CMD_SMART_RAW, SC_RAW_T0, 5, 0, get_card_data + i, 5); int len = smart_responseEx(buf, true); @@ -936,7 +936,7 @@ static int smart_brute_sfi(bool decodeTLV) { READ_RECORD[3] = (sfi << 3) | 4; clearCommandBuffer(); - SendCommandOLD(CMD_SMART_RAW, SC_RAW_T0, sizeof(READ_RECORD), 0, READ_RECORD, sizeof(READ_RECORD)); + SendCommandMIX(CMD_SMART_RAW, SC_RAW_T0, sizeof(READ_RECORD), 0, READ_RECORD, sizeof(READ_RECORD)); len = smart_responseEx(buf, true); @@ -944,7 +944,7 @@ static int smart_brute_sfi(bool decodeTLV) { READ_RECORD[4] = buf[1]; clearCommandBuffer(); - SendCommandOLD(CMD_SMART_RAW, SC_RAW_T0, sizeof(READ_RECORD), 0, READ_RECORD, sizeof(READ_RECORD)); + SendCommandMIX(CMD_SMART_RAW, SC_RAW_T0, sizeof(READ_RECORD), 0, READ_RECORD, sizeof(READ_RECORD)); len = smart_responseEx(buf, true); READ_RECORD[4] = 0; @@ -979,7 +979,7 @@ static void smart_brute_options(bool decodeTLV) { // Get processing options command clearCommandBuffer(); - SendCommandOLD(CMD_SMART_RAW, SC_RAW_T0, sizeof(GET_PROCESSING_OPTIONS), 0, GET_PROCESSING_OPTIONS, sizeof(GET_PROCESSING_OPTIONS)); + SendCommandMIX(CMD_SMART_RAW, SC_RAW_T0, sizeof(GET_PROCESSING_OPTIONS), 0, GET_PROCESSING_OPTIONS, sizeof(GET_PROCESSING_OPTIONS)); int len = smart_responseEx(buf, true); if (len > 4) { @@ -1190,7 +1190,7 @@ int ExchangeAPDUSC(bool silent, uint8_t *datain, int datainlen, bool activateCar clearCommandBuffer(); // something fishy: we have only 5 bytes but we put datainlen in arg1? - SendCommandOLD(CMD_SMART_RAW, SC_RAW_T0, datainlen, 0, data, sizeof(data)); + SendCommandMIX(CMD_SMART_RAW, SC_RAW_T0, datainlen, 0, data, sizeof(data)); len = smart_responseEx(dataout, silent); } From abff3c2ea1513dfe4be17905e5dfc6a294b0d210 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 11:59:24 +0200 Subject: [PATCH 401/632] OLD-MIX --- client/src/cmdlft55xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdlft55xx.c b/client/src/cmdlft55xx.c index 9b54aef8f..173d8eb22 100644 --- a/client/src/cmdlft55xx.c +++ b/client/src/cmdlft55xx.c @@ -3618,7 +3618,7 @@ static int CmdT55xxSetDeviceConfig(const char *Cmd) { } clearCommandBuffer(); - SendCommandOLD(CMD_LF_T55XX_SET_CONFIG, shall_persist, 0, 0, &configurations, sizeof(t55xx_configurations_t)); + SendCommandMIX(CMD_LF_T55XX_SET_CONFIG, shall_persist, 0, 0, &configurations, sizeof(t55xx_configurations_t)); return PM3_SUCCESS; } From 54d3ea9c8fc410ef550dc10d8b4e59afbc5dae50 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 12:02:59 +0200 Subject: [PATCH 402/632] OLD->MIX --- client/src/cmdhf14b.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/cmdhf14b.c b/client/src/cmdhf14b.c index 7be829472..bfb19323b 100644 --- a/client/src/cmdhf14b.c +++ b/client/src/cmdhf14b.c @@ -693,7 +693,7 @@ static bool HF14B_Other_Reader(void) { // uint32_t flags = ISO14B_CONNECT | ISO14B_SELECT_STD | ISO14B_RAW | ISO14B_APPEND_CRC; // clearCommandBuffer(); - // SendCommandOLD(CMD_HF_ISO14443B_COMMAND, flags, datalen, 0, data, datalen); + // SendCommandMIX(CMD_HF_ISO14443B_COMMAND, flags, datalen, 0, data, datalen); // PacketResponseNG resp; // WaitForResponse(CMD_ACK,&resp); @@ -707,7 +707,7 @@ static bool HF14B_Other_Reader(void) { // data[0] = ISO14443B_AUTHENTICATE; // clearCommandBuffer(); - // SendCommandOLD(CMD_HF_ISO14443B_COMMAND, flags, 1, 0, data, 1); + // SendCommandMIX(CMD_HF_ISO14443B_COMMAND, flags, 1, 0, data, 1); // PacketResponseNG resp; // WaitForResponse(CMD_ACK, &resp); @@ -721,7 +721,7 @@ static bool HF14B_Other_Reader(void) { // data[0] = ISO14443B_RESET; // clearCommandBuffer(); - // SendCommandOLD(CMD_HF_ISO14443B_COMMAND, flags, 1, 0, data, 1); + // SendCommandMIX(CMD_HF_ISO14443B_COMMAND, flags, 1, 0, data, 1); // PacketResponseNG resp; // WaitForResponse(CMD_ACK, &resp); @@ -913,7 +913,7 @@ static int CmdHF14BDump(const char *Cmd) { req[1] = blocknum; clearCommandBuffer(); - SendCommandOLD(CMD_HF_ISO14443B_COMMAND, ISO14B_APPEND_CRC | ISO14B_RAW, 2, 0, req, sizeof(req)); + SendCommandMIX(CMD_HF_ISO14443B_COMMAND, ISO14B_APPEND_CRC | ISO14B_RAW, 2, 0, req, sizeof(req)); if (WaitForResponseTimeout(CMD_ACK, &resp, 2000)) { From b42c5f59e13ec6a118bbce2fcaa514f0b1a26d9c Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 17:44:54 +0200 Subject: [PATCH 403/632] OLD->MIX --- client/src/cmdlfhitag.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/cmdlfhitag.c b/client/src/cmdlfhitag.c index 5a11216fb..28cbd41d0 100644 --- a/client/src/cmdlfhitag.c +++ b/client/src/cmdlfhitag.c @@ -363,7 +363,7 @@ static int CmdLFHitagSim(const char *Cmd) { clearCommandBuffer(); if (tag_mem_supplied) { - SendCommandOLD(cmd, 1, 0, 0, data, datalen); + SendCommandMIX(cmd, 1, 0, 0, data, datalen); } else { SendCommandMIX(cmd, 0, 0, 0, NULL, 0); } @@ -693,7 +693,7 @@ static int CmdLFHitagWriter(const char *Cmd) { } clearCommandBuffer(); - SendCommandOLD(CMD_LF_HITAGS_WRITE, htf, 0, arg2, &htd, sizeof(htd)); + SendCommandMIX(CMD_LF_HITAGS_WRITE, htf, 0, arg2, &htd, sizeof(htd)); PacketResponseNG resp; if (!WaitForResponseTimeout(CMD_ACK, &resp, 4000)) { PrintAndLogEx(WARNING, "timeout while waiting for reply."); From 46f191e13f55aeaa5fa08a3ad1d4f28265d750bf Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 17:46:50 +0200 Subject: [PATCH 404/632] OLD->MIX --- client/src/cmdhf14a.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index d65869144..5f1ec7b18 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -1524,7 +1524,7 @@ int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { if (select_status == 2) { uint8_t rats[] = { 0xE0, 0x80 }; // FSDI=8 (FSD=256), CID=0 clearCommandBuffer(); - SendCommandOLD(CMD_HF_ISO14443A_READER, ISO14A_RAW | ISO14A_APPEND_CRC | ISO14A_NO_DISCONNECT, 2, 0, rats, sizeof(rats)); + SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_RAW | ISO14A_APPEND_CRC | ISO14A_NO_DISCONNECT, 2, 0, rats, sizeof(rats)); WaitForResponse(CMD_ACK, &resp); memcpy(card.ats, resp.data.asBytes, resp.oldarg[0]); From 5860cb5e925112d1c62893edc2d010799fd382d6 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 17:48:02 +0200 Subject: [PATCH 405/632] OLD->MIX --- client/src/cmdhfmf.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 4940e96a2..a8003eed4 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -612,7 +612,7 @@ static int CmdHF14AMfWrBl(const char *Cmd) { memcpy(data, key, 6); memcpy(data + 10, bldata, 16); clearCommandBuffer(); - SendCommandOLD(CMD_HF_MIFARE_WRITEBL, blockNo, keyType, 0, data, sizeof(data)); + SendCommandMIX(CMD_HF_MIFARE_WRITEBL, blockNo, keyType, 0, data, sizeof(data)); PacketResponseNG resp; if (WaitForResponseTimeout(CMD_ACK, &resp, 1500)) { @@ -725,7 +725,7 @@ static int CmdHF14AMfRdSc(const char *Cmd) { PrintAndLogEx(NORMAL, "--sector no:%d key type:%c key:%s ", sectorNo, keyType ? 'B' : 'A', sprint_hex(key, 6)); clearCommandBuffer(); - SendCommandOLD(CMD_HF_MIFARE_READSC, sectorNo, keyType, 0, key, 6); + SendCommandMIX(CMD_HF_MIFARE_READSC, sectorNo, keyType, 0, key, 6); PrintAndLogEx(NORMAL, ""); PacketResponseNG resp; @@ -1198,7 +1198,7 @@ static int CmdHF14AMfRestore(const char *Cmd) { memcpy(data + 10, bldata, 16); clearCommandBuffer(); - SendCommandOLD(CMD_HF_MIFARE_WRITEBL, FirstBlockOfSector(sectorNo) + blockNo, keyType, 0, data, sizeof(data)); + SendCommandMIX(CMD_HF_MIFARE_WRITEBL, FirstBlockOfSector(sectorNo) + blockNo, keyType, 0, data, sizeof(data)); PacketResponseNG resp; if (WaitForResponseTimeout(CMD_ACK, &resp, 1500)) { From 25890c3567f7ccc5f372e1c01082b058b1887321 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 17:49:18 +0200 Subject: [PATCH 406/632] OLD->MIX --- client/src/cmdhflto.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhflto.c b/client/src/cmdhflto.c index 947e2bacf..4739d6f06 100644 --- a/client/src/cmdhflto.c +++ b/client/src/cmdhflto.c @@ -109,7 +109,7 @@ static int lto_send_cmd_raw(uint8_t *cmd, uint8_t len, uint8_t *response, uint16 arg1 |= len; - SendCommandOLD(CMD_HF_ISO14443A_READER, arg0, arg1, 0, cmd, len); + SendCommandMIX(CMD_HF_ISO14443A_READER, arg0, arg1, 0, cmd, len); PacketResponseNG resp; if (!WaitForResponseTimeout(CMD_ACK, &resp, 1500)) { From a7260029be15dbe818687a3e94ad36f0c4a92c2b Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 17:53:02 +0200 Subject: [PATCH 407/632] OLD->MIX --- client/src/cmdhficlass.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 3026f3964..85caf2364 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -681,7 +681,7 @@ static int CmdHFiClassSim(const char *Cmd) { default: { uint8_t numberOfCSNs = 0; clearCommandBuffer(); - SendCommandOLD(CMD_HF_ICLASS_SIMULATE, simType, numberOfCSNs, 0, CSN, 8); + SendCommandMIX(CMD_HF_ICLASS_SIMULATE, simType, numberOfCSNs, 0, CSN, 8); break; } } From 3d67bde0d9bcb7708c5ff440927b079cd7910012 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 17:58:34 +0200 Subject: [PATCH 408/632] old->mix --- armsrc/Standalone/hf_young.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/armsrc/Standalone/hf_young.c b/armsrc/Standalone/hf_young.c index 193f124ed..a1b32dfab 100644 --- a/armsrc/Standalone/hf_young.c +++ b/armsrc/Standalone/hf_young.c @@ -151,10 +151,10 @@ void RunMod(void) { SpinDelay(500); // Begin clone function here: /* Example from client/mifarehost.c for commanding a block write for "magic Chinese" cards: - SendCommandOLD(CMD_HF_MIFARE_CSETBL, params & (0xFE | (uid == NULL ? 0:1)), blockNo, 0, data, 16); + SendCommandMIX(CMD_HF_MIFARE_CSETBL, params & (0xFE | (uid == NULL ? 0:1)), blockNo, 0, data, 16); Block read is similar: - SendCommandOLD(CMD_HF_MIFARE_CGETBL, params, blockNo, 0,...}; + SendCommandMIX(CMD_HF_MIFARE_CGETBL, params, blockNo, 0,...}; We need to imitate that call with blockNo 0 to set a uid. The get and set commands are handled in this file: From 4a1e539e4cf94566d97e30343f1b234f9ce6964b Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 18:01:07 +0200 Subject: [PATCH 409/632] draft of compiled knowledge of fpga arm --- doc/fpga_arm_notes.md | 249 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 doc/fpga_arm_notes.md diff --git a/doc/fpga_arm_notes.md b/doc/fpga_arm_notes.md new file mode 100644 index 000000000..48891408e --- /dev/null +++ b/doc/fpga_arm_notes.md @@ -0,0 +1,249 @@ +# Notes on ARM & FPGA comms + + +https://github.com/RfidResearchGroup/proxmark3/blob/master/doc/original_proxmark3/proxmark3.pdf + +INTERFACE FROM THE ARM TO THE FPGA +================================== + +The FPGA and the ARM can communicate in two main ways: using the ARM's +general-purpose synchronous serial port (the SSP), or using the ARM's +SPI port. The SPI port is used to configure the FPGA. The ARM writes a +configuration word to the FPGA, which determines what operation will +be performed (e.g. read 13.56 MHz vs. read 125 kHz vs. read 134 kHz +vs...). The SPI is used exclusively for configuration. + +The SSP is used for actual data sent over the air. The ARM's SSP can +work in slave mode, which means that we can send the data using clocks +generated by the FPGA (either from the PCK0 clock, which the ARM itself +supplies, or from the 13.56 MHz clock, which is certainly not going to +be synchronous to anything in the ARM), which saves synchronizing logic +in the FPGA. The SSP is bi-directional and full-duplex. + + +The FPGA communicates with the ARM through either +1) SPI port (the ARM is the master) +2) SSC synchronous serial port (the ARM is the master). + + +opamps, (*note, this affects source code in ARM, calculating actual voltage from antenna. Manufacturers never report what they use to much frustration) +comparators +coil drivers + +LF analog path (MCP6294 opamp. This has a GBW of 10 MHz), all 'slow' signals. Used for low frequency signals. Follows the peak detector. Signal centered around generated voltage Vmid. + + +## FPGA +Since the SPARTAN II is a old outdated FPGA, thus is very limited resource there was a need to split LF and HF functionality into two seperate FPGA images. Which are stored in ARM flash memory as bitstreams. + +We swap between these images by flashing fpga from ARM on the go. It takes about 1sec. Hence its usually a bad idea to program your device to continuously execute LF alt HF commands. + +The FPGA images is precompiled and located inside the /fpga folder. + - fpga_hf.bit + - fpga_lf.bit + +There is very rarely changes to the images so there is no need to setup a fpga tool chain to compile it yourself. +Since the FPGA is very old, the Xilinix WebPack ISE 10.1 is the last working tool chain. You can download this legacy development on xilinix and register for a free product installation id. +Or use mine `11LTAJ5ZJK3PXTUBMF0C0J6C4` The package to download is about 7Gb and linux based. Though I recently managed to install it on WSL for Windows 10. + +In order to save space, these fpga images is zlib compressed and included in the fullimage.elf file when compiling the ARM SRC. `make armsrc` +This means we save some precious space on the ARM but its a bit more complex when flashing to fpga since it has to decompress on the fly. + + +### FPGA modes. + - Major modes + - Minor modes + +## ARM FPGA communications. + +The ARM talks with FPGA over the Synchronous Serial Port (SSC) rx an tx. + +ARM, send a 16bit configuration with fits the select major mode. + + + +## ARM GPIO setup + +``` + // First configure the GPIOs, and get ourselves a clock. + AT91C_BASE_PIOA->PIO_ASR = + GPIO_SSC_FRAME | + GPIO_SSC_DIN | + GPIO_SSC_DOUT | + GPIO_SSC_CLK; + AT91C_BASE_PIOA->PIO_PDR = GPIO_SSC_DOUT; + + AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_SSC); + + // Now set up the SSC proper, starting from a known state. + AT91C_BASE_SSC->SSC_CR = AT91C_SSC_SWRST; + + // RX clock comes from TX clock, RX starts on Transmit Start, + // data and frame signal is sampled on falling edge of RK + AT91C_BASE_SSC->SSC_RCMR = SSC_CLOCK_MODE_SELECT(1) | SSC_CLOCK_MODE_START(1); + + // 8, 16 or 32 bits per transfer, no loopback, MSB first, 1 transfer per sync + // pulse, no output sync + if ((FPGA_mode & FPGA_MAJOR_MODE_MASK) == FPGA_MAJOR_MODE_HF_READER && FpgaGetCurrent() == FPGA_BITSTREAM_HF) { + AT91C_BASE_SSC->SSC_RFMR = SSC_FRAME_MODE_BITS_IN_WORD(16) | AT91C_SSC_MSBF | SSC_FRAME_MODE_WORDS_PER_TRANSFER(0); + } else { + AT91C_BASE_SSC->SSC_RFMR = SSC_FRAME_MODE_BITS_IN_WORD(8) | AT91C_SSC_MSBF | SSC_FRAME_MODE_WORDS_PER_TRANSFER(0); + } + + // TX clock comes from TK pin, no clock output, outputs change on rising edge of TK, + // TF (frame sync) is sampled on falling edge of TK, start TX on rising edge of TF + AT91C_BASE_SSC->SSC_TCMR = SSC_CLOCK_MODE_SELECT(2) | SSC_CLOCK_MODE_START(5); + + // tx framing is the same as the rx framing + AT91C_BASE_SSC->SSC_TFMR = AT91C_BASE_SSC->SSC_RFMR; + +``` + +## FPGA Setup + +// Set up DMA to receive samples from the FPGA. We will use the PDC, with +// a single buffer as a circular buffer (so that we just chain back to + + + +# HARDWARE OVERVIEW + +## ADC (ANALOG TO DIGITAL CONVERTER) +The analogue signal that comes from the antenna circuit is fed into an 8-bit Analogue to Digital Converter +(ADC). This delivers 8 output bits in parallel which represent the current voltage retrieved from the field. + + +## FIELD PROGRAMMABLE GATE ARRAY, FPGA +The 8 output pins from the ADC are connected to 8 pins of the Field Programmable Gate Array (FPGA). An +FPGA has a great advantage over a normal microcontroller in the sense that it emulates hardware. A +hardware description can be compiled and flashed into an FPGA. + +Because basic arithmetic functions can be performed fast and in parallel by an FPGA it is faster than an +implementation on a normal microcontroller. Only a real hardware implementation would be faster but +this lacks the flexibility of an FPGA. + +The FPGA can therefore be seen as dynamic hardware. It is possible to make a hardware design and flash +it into the memory of the FPGA. This gives some major advantages: + + + - "Hardware" errors can be corrected; the FPGA can be flashed with a new hardware design. + - Although not as fast as a real hardware implementation, an FPGA is faster than its equivalent on microprocessor. That is, it is specialized for one job. + +The FPGA has two main tasks. The first task is to demodulate the signal received from the ADC and relay +this as a digital encoded signal to the ARM. Depending on the task this might be the demodulation of a +100% Amplitude Shift Keying (ASK) signal from the reader or the load modulation of a card. The encodin +schemes used to communicate the signal to the ARM are Modified Miller for the reader and Manchester +encoding for the card signal. + +The second task is to modulate an encoded signal that is received from the ARM into the field of the +antenna. This can be both the encoding of reader messages or card messages. For reader messages the +FPGA generates an electromagnetic field on power hi and drops the amplitude for short periods. + + +## MICROCONTROLLER +The microcontroller is responsible for the protocol management. It receives the digital encoded signals +from the FPGA and decodes them. The decoded signals can just be copied to a buffer in the EEPROM +memory. Additionally, an answer to the received message can be send by encoding a reply and +communicating this to the FPGA. + +The microcontroller (ARM) implements the transport layer. First it decodes the samples received from +the FPGA. These samples are stored in a Direct Memory Access (DMA) buffer. The samples are binary +sequences that represent whether the signal was high or low. The software on the ARM tries to decode +these samples. When the Proxmark is in sniffing mode this is done for both the Manchester and Modified +Miller at the same time. Whenever one of the decoding procedures returns a valid message, this message +is stored in another buffer (BigBuf) and both decoding procedures are set to an un-synced state. The +BigBuf is limited to the available memory on the ARM. The current firmware has 2 KB of memory +reserved for traces (Besides the tracethe buffer also stores some temporary data that is needed in the +processing). When the BigBuf buffer is full the function normally returns. A new function call from the +client is needed to download the BigBuf contents to the computer. The BigBuf is especially useful for +ptocol investigation. Every single message is stored in this buffer. When a card is emulated or when the +Proxmark is used as a reader the BigBuf can be used to store status messages or protocol exceptions. + +``` +HF PATH + -- ANTENNA -> rectifying -> lowpass filter -> ADC -> FPGA -> ARM -> USB/CDC | FPC -> CLIENT + | | | | + induct peak detect (8bit) -- modes: + via circuit HF - peak-detected + HF - RAW + HF - +``` + + +``` +LF PATH + + -- ANTENNA -> rectifying -> lowpass filter -> ADC -> FPGA -> ARM -> USB/CDC | FPC -> CLIENT + | | | | + induct peak detect (8bit) -- modes: + via circuit LF - peak-detected + LF - RAW +``` +Problems: + 1. dynamic range of signal. Ie: High Carrier signal (reader) and low + + +## + +## To behave like a READER. +By driving all of the buffers LOW, it is possible to make the antenna +look to the receive path like a parallel LC circuit; this provides a +high-voltage output signal. This is typically what will be done when we +are not actively transmitting a carrier (i.e., behaving as a reader). + +## To behave like a TAG +On the receive side, there are two possibilities, which are selected by +RLY1. A mechanical relay is used, because the signal from the antenna is +likely to be more positive or negative than the highest or lowest supply +voltages on-board. In the usual case (PEAK-DETECTED mode), the received +signal is peak-detected by an analog circuit, then filtered slightly, +and then digitized by the ADC. This is the case for both the low- and +high-frequency paths, although the details of the circuits for the +two cases are somewhat different. This receive path would typically +be selected when the device is behaving as a reader, or when it is +eavesdropping at close range. + +It is also possible to digitize the signal from the antenna directly (RAW +mode), after passing it through a gain stage. This is more likely to be +useful in reading signals at long range, but the available dynamic range +will be poor, since it is limited by the 8-bit A/D. + +In either case, an analog signal is digitized by the ADC, and +from there goes in to the FPGA. The FPGA is big enough that it +can perform DSP operations itself. For some high-frequency standards, +the subcarriers are fast enough that it would be inconvenient to do all +the math on a general-purpose CPU. The FPGA can therefore correlate for +the desired signal itself, and simply report the total to the ARM. For +low-frequency tags, it probably makes sense just to pass data straight +through to the ARM. + +The FPGA communicates with the ARM through either its SPI port (the ARM +is the master) or its generic synchronous serial port (again, the ARM +is the master). The ARM connects to the outside world over USB. + +## To sniff traffic + + + +## FPGA purpose +Digtal signal processing. +In short, apply low pass / hi pass filtering, peak detect, correlate signal meaning IQ pair collecting. + +IQ means measure at In-phase and 90 phase shift later Quadrature-phase, with IQ samples you can plot the signal on a vector plan. + + +``` +IQ1 = 1,1 : 1, -1 (rising) +IQ2 = -1,1 : 1, 1 (falling) + + + + -1,1 | 1,1 + | (q2) + (i2) | (i1) + | + ----------0------------> + | + | (q1) + -1,-1 | 1, -1 +``` \ No newline at end of file From f96361f8f13e7a7462e4c9f37da011339318c331 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 20:08:22 +0200 Subject: [PATCH 410/632] fix memleak --- client/src/cmdhfmf.c | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index a8003eed4..2257a3172 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -4366,6 +4366,7 @@ static int CmdHF14AMfCSave(const char *Cmd) { if (select_status == 0) { PrintAndLogEx(WARNING, "iso14443a card select failed"); + free(dump); return select_status; } From dded3953efe3fc12ff5c0ecd3b72b4249af28d1b Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 20:21:42 +0200 Subject: [PATCH 411/632] fix memleak on realloc and uninit variable --- client/src/scripting.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/client/src/scripting.c b/client/src/scripting.c index a5c466ea4..a1fdb8a31 100644 --- a/client/src/scripting.c +++ b/client/src/scripting.c @@ -955,7 +955,7 @@ static int l_T55xx_readblock(lua_State *L) { if (n != 4) return returnToLuaWithError(L, "Wrong number of arguments, got %d bytes, expected 4", n); - uint32_t block, usepage1, override, password; + uint32_t block, usepage1, override, password = 0; bool usepwd; size_t size; @@ -1179,15 +1179,17 @@ static int l_cwd(lua_State *L) { uint16_t path_len = FILENAME_MAX; // should be a good starting point bool error = false; - char *cwd = NULL; - cwd = (char *)calloc(path_len, sizeof(uint8_t)); + char *cwd = (char *)calloc(path_len, sizeof(uint8_t)); while (!error && (GetCurrentDir(cwd, path_len) == NULL)) { if (errno == ERANGE) { // Need bigger buffer path_len += 10; // if buffer was too small add 10 characters and try again cwd = realloc(cwd, path_len); + if (cwd == NULL) { + free(cwd); + return returnToLuaWithError(L, "Failed to allocate memory"); + } } else { - error = true; free(cwd); return returnToLuaWithError(L, "Failed to get current working directory"); } From 12a4c5f2020446079f70c35bfe3e1cc897964d6b Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 20:22:07 +0200 Subject: [PATCH 412/632] fix clarify bool usage --- client/src/loclass/cipher.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/loclass/cipher.c b/client/src/loclass/cipher.c index b8d481f1e..dde046eff 100644 --- a/client/src/loclass/cipher.c +++ b/client/src/loclass/cipher.c @@ -124,8 +124,8 @@ static uint8_t _select(bool x, bool y, uint8_t r) { #define _r7 (r & 0x01) #define _z0 ( (_r0 & _r2) ^ ( _r1 & (!_r3)) ^ (_r2 | _r4) ) -#define _z1 ( (_r0 | _r2) ^ ( _r5 | _r7) ^_r1 ^ _r6 ^ x ^ y ) -#define _z2 ( (_r3 & (!_r5)) ^ (_r4 & _r6) ^ _r7 ^ x ) +#define _z1 ( (_r0 | _r2) ^ ( _r5 | _r7) ^_r1 ^ _r6 ^ (x) ^ (y) ) +#define _z2 ( (_r3 & (!_r5)) ^ (_r4 & _r6) ^ _r7 ^ (x) ) /* uint8_t r0 = r >> 7 & 0x1; @@ -177,10 +177,10 @@ static State successor(uint8_t *k, State s, bool y) { State successor = {0, 0, 0, 0}; successor.t = s.t >> 1; - successor.t |= (T(s) ^ r0 ^ r4) << 15; + successor.t |= ((T(s)) ^ r0 ^ r4) << 15; successor.b = s.b >> 1; - successor.b |= (B(s) ^ r7) << 7; + successor.b |= ((B(s)) ^ r7) << 7; bool Tt = T(s); From 49687f47498e77c47b471966709529db45c1a965 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 20:22:26 +0200 Subject: [PATCH 413/632] fix clarify bool usage --- client/src/cmdlfpac.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/client/src/cmdlfpac.c b/client/src/cmdlfpac.c index abfb5483a..a8e0401af 100644 --- a/client/src/cmdlfpac.c +++ b/client/src/cmdlfpac.c @@ -130,8 +130,9 @@ static void pacCardIdToRaw(uint8_t *outRawBytes, const char *cardId) { pattern = reflect8(idbytes[i - 2]); pattern |= oddparity8(pattern); if (i > 3) checksum ^= idbytes[i - 2]; - } else - pattern = (reflect8(checksum) & 0xFE) | oddparity8(checksum); + } else { + pattern = (reflect8(checksum) & 0xFE) | (oddparity8(checksum)); + } pattern <<= shift; outRawBytes[index] |= pattern >> 8 & 0xFF; From 72170720fbe0530e6770b864cf1cc558fb62ace3 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 20:24:02 +0200 Subject: [PATCH 414/632] fix memleak on realloc --- client/src/ui.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/client/src/ui.c b/client/src/ui.c index cc256d8e3..5764e63df 100644 --- a/client/src/ui.c +++ b/client/src/ui.c @@ -100,8 +100,10 @@ int searchHomeFilePath(char **foundpath, const char *subdir, const char *filenam if (subdir != NULL) { pathlen += strlen(subdir); path = realloc(path, pathlen * sizeof(char)); - if (path == NULL) + if (path == NULL) { + free(path); return PM3_EMALLOC; + } strcat(path, subdir); #ifdef _WIN32 @@ -536,7 +538,6 @@ void memcpy_filter_emoji(void *dest, const void *src, size_t n, emojiMode_t mode } } memcpy(rdest + si, current_token, current_token_length); - si += current_token_length; } } From f6f9140c79aea30a399dead3530139f1355b49a3 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 20:26:52 +0200 Subject: [PATCH 415/632] already empty --- client/src/util.c | 1 - 1 file changed, 1 deletion(-) diff --git a/client/src/util.c b/client/src/util.c index fb131e987..a22d8edde 100644 --- a/client/src/util.c +++ b/client/src/util.c @@ -111,7 +111,6 @@ void AddLogHex(const char *fn, const char *extData, const uint8_t *data, const s void AddLogUint64(const char *fn, const char *data, const uint64_t value) { char buf[20] = {0}; - memset(buf, 0x00, sizeof(buf)); sprintf(buf, "%016" PRIx64 "", value); AddLogLine(fn, data, buf); } From 6370551dd59208fee8a2d830b88113b40096a589 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 20:29:53 +0200 Subject: [PATCH 416/632] unreadvariable --- tools/hitag2crack/crack4/ht2crack4.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tools/hitag2crack/crack4/ht2crack4.c b/tools/hitag2crack/crack4/ht2crack4.c index e630a956f..26460a112 100644 --- a/tools/hitag2crack/crack4/ht2crack4.c +++ b/tools/hitag2crack/crack4/ht2crack4.c @@ -295,8 +295,6 @@ static void init_guess_table(char *filename, char *uidstr) { } fclose(fp); - fp = NULL; - fprintf(stderr, "Loaded %u nRaR pairs\n", num_nRaR); // set key and copy in enc_nR and ks values @@ -400,7 +398,7 @@ static double bit_score(uint64_t s, uint64_t size, uint64_t b) { * multiplied by the number of relevant bits in the scored state * to give weight to more complete states. */ static double score(uint64_t s, unsigned int size, uint64_t ks, unsigned int kssize) { - double sc, sc2; + double sc; if ((size == 1) || (kssize == 1)) { sc = bit_score(s, size, ks & 0x1); @@ -416,7 +414,7 @@ static double score(uint64_t s, unsigned int size, uint64_t ks, unsigned int kss return 0.0; } else { - sc2 = score(s >> 1, size - 1, ks >> 1, kssize - 1); + double sc2 = score(s >> 1, size - 1, ks >> 1, kssize - 1); // if score returns a probability of 0 then this can't be a winner if (sc2 == 0.0) { From 2ae85dea4e0a24dd5c3262e4970d7db24a771fde Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 20:33:25 +0200 Subject: [PATCH 417/632] fix memleak --- tools/hitag2crack/crack3/ht2crack3.c | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/tools/hitag2crack/crack3/ht2crack3.c b/tools/hitag2crack/crack3/ht2crack3.c index b54c7b000..fba050d67 100644 --- a/tools/hitag2crack/crack3/ht2crack3.c +++ b/tools/hitag2crack/crack3/ht2crack3.c @@ -147,12 +147,6 @@ static int testkey(uint64_t *out, uint64_t uid, uint64_t pkey, uint64_t nR, uint return 0; } - - - - - - // some notes on how I think this attack should work. // due to the way fc works, in a number of cases, it doesn't matter what // the most significant bits are doing for it to produce the same result. @@ -177,7 +171,6 @@ static int testkey(uint64_t *out, uint64_t uid, uint64_t pkey, uint64_t nR, uint // limit our guesses to a smaller set than a full brute force and // effectively work out candidates for the lower 34 bits of the key. - static void *crack(void *d) { struct threaddata *data = (struct threaddata *)d; uint64_t uid; @@ -187,21 +180,14 @@ static void *crack(void *d) { Hitag_State hstate; int i, j; - uint64_t klower; - uint64_t kmiddle; - uint64_t y; + uint64_t klower, kmiddle, klowery; + uint64_t y, b, z, bit; uint64_t ytmp; - uint64_t klowery; unsigned int count; - uint64_t bit; - uint64_t b; - uint64_t z; - uint64_t foundkey; - uint64_t revkey; + uint64_t foundkey, revkey; int ret; unsigned int found; unsigned int badguess; - struct Tklower *Tk = NULL; if (!data) { @@ -216,7 +202,7 @@ static void *crack(void *d) { // create space for tables Tk = (struct Tklower *)malloc(sizeof(struct Tklower) * 0x40000); if (!Tk) { - printf("cannot malloc Tk\n"); + printf("Failed to allocate memory (Tk)\n"); exit(1); } @@ -301,6 +287,7 @@ static void *crack(void *d) { } } + free(Tk); return NULL; } int main(int argc, char *argv[]) { @@ -383,7 +370,6 @@ int main(int argc, char *argv[]) { // close file fclose(fp); - fp = NULL; printf("Loaded %u NrAr pairs\n", numnrar); From 9417122714458133c6144a8543d3c58296025134 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 20:40:03 +0200 Subject: [PATCH 418/632] fix unused_result --- tools/hitag2crack/crack2/ht2crack2buildtable.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/hitag2crack/crack2/ht2crack2buildtable.c b/tools/hitag2crack/crack2/ht2crack2buildtable.c index c45768998..01cd0364c 100644 --- a/tools/hitag2crack/crack2/ht2crack2buildtable.c +++ b/tools/hitag2crack/crack2/ht2crack2buildtable.c @@ -204,7 +204,6 @@ static void write_ks_s(uint32_t ks1, uint32_t ks2, uint64_t shiftreg) { // store buffer store(buf); - } @@ -438,7 +437,10 @@ static void *sorttable(void *dd) { printf("cannot create outfile %s\n", outfile); exit(1); } - write(fdout, table, numentries * DATASIZE); + if (write(fdout, table, numentries * DATASIZE)) { + printf("writetable cannot write all of the data\n"); + exit(1); + } close(fdout); // remove input file From 988b61cfa5addd5f6b283f9cb141552235a6fc58 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 20:41:55 +0200 Subject: [PATCH 419/632] fix clarify condition --- client/src/wiegand_formatutils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/wiegand_formatutils.c b/client/src/wiegand_formatutils.c index 4fbd8c0d3..0d58e9d6f 100644 --- a/client/src/wiegand_formatutils.c +++ b/client/src/wiegand_formatutils.c @@ -80,7 +80,7 @@ static void message_datacopy(wiegand_message_t *src, wiegand_message_t *dest) { uint64_t get_linear_field(wiegand_message_t *data, uint8_t firstBit, uint8_t length) { uint64_t result = 0; for (uint8_t i = 0; i < length; i++) { - result = (result << 1) | get_bit_by_position(data, firstBit + i); + result = (result << 1) | (get_bit_by_position(data, firstBit + i)); } return result; } From d0489da611e0f247c392c095eacf9220eae162be Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 20:53:04 +0200 Subject: [PATCH 420/632] fix realloc properly --- client/src/proxmark3.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index a461d4c95..98fd33723 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -436,30 +436,36 @@ static void set_my_user_directory(void) { // if not found, default to current directory if (my_user_directory == NULL) { - char *cwd_Buffer = NULL; uint16_t pathLen = FILENAME_MAX; // should be a good starting point bool error = false; + char *cwd_buffer = (char *)calloc(pathLen, sizeof(uint8_t)); - cwd_Buffer = (char *)calloc(pathLen, sizeof(uint8_t)); - - while (!error && (GetCurrentDir(cwd_Buffer, pathLen) == NULL)) { + while (!error && (GetCurrentDir(cwd_buffer, pathLen) == NULL)) { if (errno == ERANGE) { // Need bigger buffer pathLen += 10; // if buffer was too small add 10 characters and try again - cwd_Buffer = realloc(cwd_Buffer, pathLen); + char *tmp = realloc(cwd_buffer, pathLen); + if (tmp == NULL) { + PrintAndLogEx(WARNING, "failed to allocate memory"); + free(cwd_buffer); + return; + } + cwd_buffer = tmp; } else { - error = true; - free(cwd_Buffer); - cwd_Buffer = NULL; + free(cwd_buffer); + return; } - printf("Len... %d\n", pathLen); + PrintAndLogEx(NORMAL, "Len... %d", pathLen); } if (!error) { - for (int i = 0; i < strlen(cwd_Buffer); i++) - if (cwd_Buffer[i] == '\\') cwd_Buffer[i] = '/'; + for (int i = 0; i < strlen(cwd_buffer); i++) { + if (cwd_buffer[i] == '\\') { + cwd_buffer[i] = '/'; + } + } - my_user_directory = cwd_Buffer; + my_user_directory = cwd_buffer; } } } From e7feadf32ce9f0993c3b9d933fb631c7451b17c3 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 22:33:16 +0200 Subject: [PATCH 421/632] fix out of bound --- client/src/cmdhfmfdes.c | 25 ++++++++++++------------- client/src/cmdhfmfp.c | 5 ++--- client/src/cmdhfmfu.c | 7 ++++--- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index 5e9a49c26..b1de9109e 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -1050,7 +1050,6 @@ static int desfire_print_signature(uint8_t *uid, uint8_t *signature, size_t sign }; uint8_t i; - int res; bool is_valid = false; for (i = 0; i < ARRAYLEN(nxp_desfire_public_keys); i++) { @@ -1059,12 +1058,12 @@ static int desfire_print_signature(uint8_t *uid, uint8_t *signature, size_t sign uint8_t key[PUBLIC_DESFIRE_ECDA_KEYLEN]; param_gethex_to_eol(nxp_desfire_public_keys[i].value, 0, key, PUBLIC_DESFIRE_ECDA_KEYLEN, &dl); - res = ecdsa_signature_r_s_verify(MBEDTLS_ECP_DP_SECP224R1, key, uid, 7, signature, signature_len, false); + int res = ecdsa_signature_r_s_verify(MBEDTLS_ECP_DP_SECP224R1, key, uid, 7, signature, signature_len, false); is_valid = (res == 0); if (is_valid) break; } - if (is_valid == false) { + if (is_valid == false || i == ARRAYLEN(nxp_desfire_public_keys)) { PrintAndLogEx(SUCCESS, "Signature verification " _RED_("failed")); return PM3_ESOFT; } @@ -3982,21 +3981,21 @@ static int CmdHF14aDesChk(const char *Cmd) { // dictionary mode size_t endFilePosition = 0; if (dict_filenamelen) { - uint32_t keycnt = 0; - res = loadFileDICTIONARYEx((char *)dict_filename, deskeyList, sizeof(deskeyList), NULL, 8, &keycnt, 0, &endFilePosition, true); - deskeyListLen = keycnt; - if (endFilePosition) + + res = loadFileDICTIONARYEx((char *)dict_filename, deskeyList, sizeof(deskeyList), NULL, 8, &deskeyListLen, 0, &endFilePosition, true); + if (res == PM3_SUCCESS && endFilePosition) PrintAndLogEx(SUCCESS, "First part of des dictionary successfully loaded."); + endFilePosition = 0; - res = loadFileDICTIONARYEx((char *)dict_filename, aeskeyList, sizeof(aeskeyList), NULL, 16, &keycnt, 0, &endFilePosition, true); - aeskeyListLen = keycnt; - if (endFilePosition) + res = loadFileDICTIONARYEx((char *)dict_filename, aeskeyList, sizeof(aeskeyList), NULL, 16, &aeskeyListLen, 0, &endFilePosition, true); + if (res == PM3_SUCCESS && endFilePosition) PrintAndLogEx(SUCCESS, "First part of aes dictionary successfully loaded."); + endFilePosition = 0; - res = loadFileDICTIONARYEx((char *)dict_filename, k3kkeyList, sizeof(k3kkeyList), NULL, 24, &keycnt, 0, &endFilePosition, true); - k3kkeyListLen = keycnt; - if (endFilePosition) + res = loadFileDICTIONARYEx((char *)dict_filename, k3kkeyList, sizeof(k3kkeyList), NULL, 24, &k3kkeyListLen, 0, &endFilePosition, true); + if (PM3_SUCCESS && endFilePosition) PrintAndLogEx(SUCCESS, "First part of k3kdes dictionary successfully loaded."); + endFilePosition = 0; } diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index b3c8e5c22..12fbce4d7 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -168,7 +168,6 @@ static int plus_print_signature(uint8_t *uid, uint8_t uidlen, uint8_t *signature }; uint8_t i; - int res; bool is_valid = false; for (i = 0; i < ARRAYLEN(nxp_plus_public_keys); i++) { @@ -177,7 +176,7 @@ static int plus_print_signature(uint8_t *uid, uint8_t uidlen, uint8_t *signature uint8_t key[PUBLIC_PLUS_ECDA_KEYLEN]; param_gethex_to_eol(nxp_plus_public_keys[i].value, 0, key, PUBLIC_PLUS_ECDA_KEYLEN, &dl); - res = ecdsa_signature_r_s_verify(MBEDTLS_ECP_DP_SECP224R1, key, uid, uidlen, signature, signature_len, false); + int res = ecdsa_signature_r_s_verify(MBEDTLS_ECP_DP_SECP224R1, key, uid, uidlen, signature, signature_len, false); is_valid = (res == 0); if (is_valid) break; @@ -186,7 +185,7 @@ static int plus_print_signature(uint8_t *uid, uint8_t uidlen, uint8_t *signature PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "--- " _CYAN_("Tag Signature")); - if (is_valid == false) { + if (is_valid == false || i == ARRAYLEN(nxp_plus_public_keys)) { PrintAndLogEx(SUCCESS, "Signature verification " _RED_("failed")); return PM3_ESOFT; } diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index b150d3435..b35a27e49 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -347,8 +347,7 @@ static int ul_select(iso14a_card_select_t *card) { ul_switch_on_field(); PacketResponseNG resp; - bool ans = false; - ans = WaitForResponseTimeout(CMD_ACK, &resp, 1500); + bool ans = WaitForResponseTimeout(CMD_ACK, &resp, 1500); if (!ans || resp.oldarg[0] < 1) { PrintAndLogEx(WARNING, "iso14443a card select failed"); @@ -946,7 +945,7 @@ static int ulev1_print_signature(TagTypeUL_t tagtype, uint8_t *uid, uint8_t *sig } PrintAndLogEx(NORMAL, ""); - if (is_valid == false) { + if (is_valid == false || i == ARRAYLEN(nxp_mfu_public_keys)) { PrintAndLogEx(SUCCESS, "Signature verification " _RED_("failed")); return PM3_ESOFT; } @@ -982,7 +981,9 @@ static int ntag_print_counter(void) { uint8_t counter[3] = {0, 0, 0}; uint16_t len; len = ulev1_readTearing(0x02, tear, sizeof(tear)); + (void)len; len = ulev1_readCounter(0x02, counter, sizeof(counter)); + (void)len; PrintAndLogEx(INFO, " [02]: %s", sprint_hex(counter, 3)); PrintAndLogEx(SUCCESS, " - %02X tearing (" _GREEN_("%s")")", tear[0], (tear[0] == 0xBD) ? "ok" : "failure"); return len; From 4073b88ed740e6edde6c88ad12c0c03a368a9446 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 22:33:50 +0200 Subject: [PATCH 422/632] fix realloc properly --- client/src/ui.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/client/src/ui.c b/client/src/ui.c index 5764e63df..24eac6a16 100644 --- a/client/src/ui.c +++ b/client/src/ui.c @@ -99,11 +99,12 @@ int searchHomeFilePath(char **foundpath, const char *subdir, const char *filenam } if (subdir != NULL) { pathlen += strlen(subdir); - path = realloc(path, pathlen * sizeof(char)); - if (path == NULL) { + char *tmp = realloc(path, pathlen * sizeof(char)); + if (tmp == NULL) { free(path); return PM3_EMALLOC; } + path = tmp; strcat(path, subdir); #ifdef _WIN32 From 9d355a9b4e45ca3e69a53b28125c39f9fff7473d Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 22:36:14 +0200 Subject: [PATCH 423/632] fix out-of-bound --- client/src/cmdhf15.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index 67e47c0d4..9c6c343aa 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -263,7 +263,6 @@ static int nxp_15693_print_signature(uint8_t *uid, uint8_t *signature) { */ uint8_t i; - int res; bool is_valid = false; for (i = 0; i < ARRAYLEN(nxp_15693_public_keys); i++) { @@ -271,14 +270,14 @@ static int nxp_15693_print_signature(uint8_t *uid, uint8_t *signature) { uint8_t key[PUBLIC_ECDA_KEYLEN]; param_gethex_to_eol(nxp_15693_public_keys[i].value, 0, key, PUBLIC_ECDA_KEYLEN, &dl); - res = ecdsa_signature_r_s_verify(MBEDTLS_ECP_DP_SECP128R1, key, uid, 8, signature, 32, false); + int res = ecdsa_signature_r_s_verify(MBEDTLS_ECP_DP_SECP128R1, key, uid, 8, signature, 32, false); is_valid = (res == 0); if (is_valid) break; } PrintAndLogEx(NORMAL, ""); - if (is_valid == false) { + if (is_valid == false || i == ARRAYLEN(nxp_15693_public_keys)) { PrintAndLogEx(SUCCESS, "Signature verification " _RED_("failed")); return PM3_ESOFT; } From f61ca646816327e470eb6b9122a18d5b79b99ba3 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 22:40:53 +0200 Subject: [PATCH 424/632] fix clarify --- client/src/loclass/cipher.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/loclass/cipher.c b/client/src/loclass/cipher.c index dde046eff..1753ebc9d 100644 --- a/client/src/loclass/cipher.c +++ b/client/src/loclass/cipher.c @@ -177,10 +177,10 @@ static State successor(uint8_t *k, State s, bool y) { State successor = {0, 0, 0, 0}; successor.t = s.t >> 1; - successor.t |= ((T(s)) ^ r0 ^ r4) << 15; + successor.t |= ((T(s)) ^ (r0) ^ (r4)) << 15; successor.b = s.b >> 1; - successor.b |= ((B(s)) ^ r7) << 7; + successor.b |= ((B(s)) ^ (r7)) << 7; bool Tt = T(s); From 2635ae43b7812c470252350c80e6634c8e19f608 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 22:43:48 +0200 Subject: [PATCH 425/632] fix redundantassignment --- client/src/cmdhffido.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/src/cmdhffido.c b/client/src/cmdhffido.c index e35479db9..991d7eb5d 100644 --- a/client/src/cmdhffido.c +++ b/client/src/cmdhffido.c @@ -337,6 +337,7 @@ static int CmdHFFidoRegister(const char *cmd) { &buf[67], keyHandleLen, // keyHandle &buf[1], 65, // user public key NULL, 0); + (void)res; //PrintAndLogEx(NORMAL, "--xbuf(%d)[%d]: %s", res, xbuflen, sprint_hex(xbuf, xbuflen)); res = ecdsa_signature_verify(MBEDTLS_ECP_DP_SECP256R1, public_key, xbuf, xbuflen, &buf[hashp], len - hashp, true); if (res) { @@ -563,6 +564,7 @@ static int CmdHFFidoAuthenticate(const char *cmd) { &buf[1], 4, // counter data, 32, // challenge parameter NULL, 0); + (void)res; //PrintAndLogEx(NORMAL, "--xbuf(%d)[%d]: %s", res, xbuflen, sprint_hex(xbuf, xbuflen)); res = ecdsa_signature_verify(MBEDTLS_ECP_DP_SECP256R1, public_key, xbuf, xbuflen, &buf[5], len - 5, true); if (res) { From 17c9bc8fc2f3b6f2d43e1735ddcb83fa7e5df6e1 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 22:46:22 +0200 Subject: [PATCH 426/632] fix redundantassignment --- client/src/comms.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/client/src/comms.c b/client/src/comms.c index d2ba5436f..0a49e1f31 100644 --- a/client/src/comms.c +++ b/client/src/comms.c @@ -605,24 +605,25 @@ int TestProxmark(void) { clearCommandBuffer(); SendCommandNG(CMD_PING, data, len); - uint32_t timeout = 1000; + uint32_t timeout; #ifdef USART_SLOW_LINK // 10s timeout for slow FPC, e.g. over BT // as this is the very first command sent to the pm3 // that initiates the BT connection timeout = 10000; +#else + timeout = 1000; #endif if (WaitForResponseTimeoutW(CMD_PING, &resp, timeout, false) == 0) { return PM3_ETIMEOUT; } - bool error = false; - error = memcmp(data, resp.data.asBytes, len) != 0; - - if (error) + bool error = memcmp(data, resp.data.asBytes, len) != 0; + if (error) { return PM3_EIO; + } SendCommandNG(CMD_CAPABILITIES, NULL, 0); if (WaitForResponseTimeoutW(CMD_CAPABILITIES, &resp, 1000, false) == 0) { From 036544e49ef725fa8c8505594c88d7a9d47cf860 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 27 May 2020 23:26:57 +0200 Subject: [PATCH 427/632] fix another realloc --- client/src/ui.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/client/src/ui.c b/client/src/ui.c index 24eac6a16..15b57c259 100644 --- a/client/src/ui.c +++ b/client/src/ui.c @@ -57,15 +57,18 @@ static void fPrintAndLog(FILE *stream, const char *fmt, ...); int searchHomeFilePath(char **foundpath, const char *subdir, const char *filename, bool create_home) { if (foundpath == NULL) return PM3_EINVARG; + const char *user_path = get_my_user_directory(); if (user_path == NULL) { fprintf(stderr, "Could not retrieve $HOME from the environment\n"); return PM3_EFILE; } + size_t pathlen = strlen(user_path) + strlen(PM3_USER_DIRECTORY) + 1; char *path = calloc(pathlen, sizeof(char)); if (path == NULL) return PM3_EMALLOC; + strcpy(path, user_path); strcat(path, PM3_USER_DIRECTORY); @@ -139,9 +142,12 @@ int searchHomeFilePath(char **foundpath, const char *subdir, const char *filenam return PM3_SUCCESS; } pathlen += strlen(filename); - path = realloc(path, pathlen * sizeof(char)); - if (path == NULL) + char *tmp = realloc(path, pathlen * sizeof(char)); + if (tmp == NULL) { + free(path); return PM3_EMALLOC; + } + path = tmp; strcat(path, filename); *foundpath = path; return PM3_SUCCESS; From c3a706b8cf05df6e7a90c0730449f62442eee5ca Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Thu, 28 May 2020 10:16:22 +0200 Subject: [PATCH 428/632] fix: 'lf ti demod - crc is now fixed --- client/src/cmdlfti.c | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/client/src/cmdlfti.c b/client/src/cmdlfti.c index 5a088d3c4..a41c70d91 100644 --- a/client/src/cmdlfti.c +++ b/client/src/cmdlfti.c @@ -85,7 +85,6 @@ static int CmdTIDemod(const char *Cmd) { int lowLen = ARRAYLEN(LowTone); int highLen = ARRAYLEN(HighTone); int convLen = (highLen > lowLen) ? highLen : lowLen; - uint16_t crc; int i, j, TagType; int lowSum = 0, highSum = 0; int lowTot = 0, highTot = 0; @@ -241,25 +240,23 @@ static int CmdTIDemod(const char *Cmd) { // i'm 99% sure the crc algorithm is correct, but it may need to eat the // bytes in reverse or something // calculate CRC - crc = 0; - crc = update_crc16(crc, (shift0 >> 0) & 0xFF); - crc = update_crc16(crc, (shift0 >> 8) & 0xFF); - crc = update_crc16(crc, (shift0 >> 16) & 0xFF); - crc = update_crc16(crc, (shift0 >> 24) & 0xFF); + uint8_t raw[8] = { + (shift0 >> 0) & 0xFF, + (shift0 >> 8) & 0xFF, + (shift0 >> 16) & 0xFF, + (shift0 >> 24) & 0xFF, + (shift1 >> 0) & 0xFF, + (shift1 >> 8) & 0xFF, + (shift1 >> 16) & 0xFF, + (shift1 >> 24) & 0xFF + }; + init_table(CRC_KERMIT); + uint16_t calccrc = crc16_kermit(raw, sizeof(raw)); + const char *crc_str = (calccrc == (shift2 & 0xFFFF)) ? _GREEN_("ok") : _RED_("fail"); + PrintAndLogEx(INFO, "Tag data = %08X%08X [%04X] (%s)", shift1, shift0, calccrc, crc_str); - crc = update_crc16(crc, (shift1 >> 0) & 0xFF); - crc = update_crc16(crc, (shift1 >> 8) & 0xFF); - crc = update_crc16(crc, (shift1 >> 16) & 0xFF); - crc = update_crc16(crc, (shift1 >> 24) & 0xFF); - - //crc = crc16_ccitt(message, sizeof(message); - - const char *crcStr = (crc == (shift2 & 0xFFFF)) ? _GREEN_("Passed") : _RED_("Fail"); - - PrintAndLogEx(INFO, "Tag data = %08X%08X [Crc %04X %s]", shift1, shift0, crc, crcStr); - - if (crc != (shift2 & 0xFFFF)) - PrintAndLogEx(WARNING, "Warning: CRC mismatch, calculated %04X, got %04X", crc, shift2 & 0xFFFF); + if (calccrc != (shift2 & 0xFFFF)) + PrintAndLogEx(WARNING, "Warning: CRC mismatch, calculated %04X, got %04X", calccrc, shift2 & 0xFFFF); retval = PM3_SUCCESS; goto out; From 691c1735a43faf39ac14f410aca1fe456a2f506f Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Fri, 29 May 2020 08:39:13 +0200 Subject: [PATCH 429/632] chg, printf --- client/src/emv/emv_pki.c | 70 ++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 39 deletions(-) diff --git a/client/src/emv/emv_pki.c b/client/src/emv/emv_pki.c index bbdb321b3..fba5902f9 100644 --- a/client/src/emv/emv_pki.c +++ b/client/src/emv/emv_pki.c @@ -26,6 +26,7 @@ #include "crypto.h" #include "dump.h" #include "util.h" +#include "ui.h" static bool strictExecution = true; void PKISetStrictExecution(bool se) { @@ -53,12 +54,12 @@ static unsigned char *emv_pki_decode_message(const struct emv_pk *enc_pk, return NULL; if (!cert_tlv) { - printf("ERROR: Can't find certificate\n"); + PrintAndLogEx(WARNING, "ERROR: Can't find certificate"); return NULL; } if (cert_tlv->len != enc_pk->mlen) { - printf("ERROR: Certificate length (%zu) not equal key length (%zu)\n", cert_tlv->len, enc_pk->mlen); + PrintAndLogEx(WARNING, "ERROR: Certificate length (%zu) not equal key length (%zu)", cert_tlv->len, enc_pk->mlen); return NULL; } kcp = crypto_pk_open(enc_pk->pk_algo, @@ -71,19 +72,19 @@ static unsigned char *emv_pki_decode_message(const struct emv_pk *enc_pk, crypto_pk_close(kcp); /* if (true){ - printf("Recovered data:\n"); + PrintAndLogEx(SUCCESS, "Recovered data:\n"); dump_buffer(data, data_len, stdout, 0); }*/ if (data[data_len - 1] != 0xbc || data[0] != 0x6a || data[1] != msgtype) { - printf("ERROR: Certificate format\n"); + PrintAndLogEx(WARNING, "ERROR: Certificate format"); free(data); return NULL; } size_t hash_pos = emv_pki_hash_psn[msgtype]; if (hash_pos == 0 || hash_pos > data_len) { - printf("ERROR: Cant get hash position in the certificate\n"); + PrintAndLogEx(WARNING, "ERROR: Cant get hash position in the certificate"); free(data); return NULL; } @@ -91,7 +92,7 @@ static unsigned char *emv_pki_decode_message(const struct emv_pk *enc_pk, struct crypto_hash *ch; ch = crypto_hash_open(data[hash_pos]); if (!ch) { - printf("ERROR: Cant do hash\n"); + PrintAndLogEx(WARNING, "ERROR: Cant do hash"); free(data); return NULL; } @@ -113,9 +114,9 @@ static unsigned char *emv_pki_decode_message(const struct emv_pk *enc_pk, memset(hash, 0, hash_len); memcpy(hash, crypto_hash_read(ch), hash_len); if (memcmp(data + data_len - 1 - hash_len, hash, hash_len)) { - printf("ERROR: Calculated wrong hash\n"); - printf("decoded: %s\n", sprint_hex(data + data_len - 1 - hash_len, hash_len)); - printf("calculated: %s\n", sprint_hex(hash, hash_len)); + PrintAndLogEx(WARNING, "ERROR: Calculated wrong hash"); + PrintAndLogEx(WARNING, "decoded: " _YELLOW_("%s"), sprint_hex(data + data_len - 1 - hash_len, hash_len)); + PrintAndLogEx(WARNING, "calculated: " _YELLOW_("%s"), sprint_hex(hash, hash_len)); if (strictExecution) { crypto_hash_close(ch); @@ -125,16 +126,12 @@ static unsigned char *emv_pki_decode_message(const struct emv_pk *enc_pk, } crypto_hash_close(ch); - *len = data_len - hash_len - 1; - return data; } static unsigned emv_cn_length(const struct tlv *tlv) { - int i; - - for (i = 0; i < tlv->len; i++) { + for (int i = 0; i < tlv->len; i++) { unsigned char c = tlv->value[i]; if (c >> 4 == 0xf) @@ -143,7 +140,6 @@ static unsigned emv_cn_length(const struct tlv *tlv) { if ((c & 0xf) == 0xf) return 2 * i + 1; } - return 2 * tlv->len; } @@ -185,7 +181,7 @@ static struct emv_pk *emv_pki_decode_key_ex(const struct emv_pk *enc_pk, else if (msgtype == 4) pan_length = 10; else { - printf("ERROR: Message type must be 2 or 4\n"); + PrintAndLogEx(WARNING, "ERROR: Message type must be 2 or 4"); return NULL; } @@ -198,12 +194,12 @@ static struct emv_pk *emv_pki_decode_key_ex(const struct emv_pk *enc_pk, sdatl_tlv, NULL); if (!data || data_len < 11 + pan_length) { - printf("ERROR: Can't decode message\n"); + PrintAndLogEx(WARNING, "ERROR: Can't decode message"); return NULL; } if (showData) { - printf("Recovered data:\n"); + PrintAndLogEx(SUCCESS, "Recovered data:"); dump_buffer(data, data_len, stdout, 0); } @@ -219,7 +215,7 @@ static struct emv_pk *emv_pki_decode_key_ex(const struct emv_pk *enc_pk, if (((msgtype == 2) && (pan2_len < 4 || pan2_len > pan_len)) || ((msgtype == 4) && (pan2_len != pan_len))) { - printf("ERROR: Invalid PAN lengths\n"); + PrintAndLogEx(WARNING, "ERROR: Invalid PAN lengths"); free(data); return NULL; @@ -228,9 +224,9 @@ static struct emv_pk *emv_pki_decode_key_ex(const struct emv_pk *enc_pk, unsigned i; for (i = 0; i < pan2_len; i++) if (emv_cn_get(pan_tlv, i) != emv_cn_get(&pan2_tlv, i)) { - printf("ERROR: PAN data mismatch\n"); - printf("tlv pan=%s\n", sprint_hex(pan_tlv->value, pan_tlv->len)); - printf("cert pan=%s\n", sprint_hex(pan2_tlv.value, pan2_tlv.len)); + PrintAndLogEx(WARNING, "ERROR: PAN data mismatch"); + PrintAndLogEx(WARNING, "tlv pan " _YELLOW_("%s"), sprint_hex(pan_tlv->value, pan_tlv->len)); + PrintAndLogEx(WARNING, "cert pan " _YELLOW_("%s"), sprint_hex(pan2_tlv.value, pan2_tlv.len)); free(data); return NULL; @@ -238,7 +234,7 @@ static struct emv_pk *emv_pki_decode_key_ex(const struct emv_pk *enc_pk, pk_len = data[9 + pan_length]; if (pk_len > data_len - 11 - pan_length + rem_tlv->len) { - printf("ERROR: Invalid pk length\n"); + PrintAndLogEx(WARNING, "ERROR: Invalid pk length"); free(data); return NULL; } @@ -268,7 +264,6 @@ static struct emv_pk *emv_pki_decode_key_ex(const struct emv_pk *enc_pk, memcpy(pk->exp, exp_tlv->value, exp_tlv->len); free(data); - return pk; } @@ -354,7 +349,6 @@ unsigned char *emv_pki_sdatl_fill(const struct tlvdb *db, size_t *sdatl_len) { return NULL; } - struct tlvdb *emv_pki_recover_dac_ex(const struct emv_pk *enc_pk, const struct tlvdb *db, const struct tlv *sda_tlv, bool showData) { size_t data_len; @@ -380,16 +374,15 @@ struct tlvdb *emv_pki_recover_dac_ex(const struct emv_pk *enc_pk, const struct t return NULL; if (showData) { - printf("Recovered data:\n"); + PrintAndLogEx(SUCCESS, "Recovered data:"); dump_buffer(data, data_len, stdout, 0); } struct tlvdb *dac_db = tlvdb_fixed(0x9f45, 2, data + 3); - free(data); - return dac_db; } + struct tlvdb *emv_pki_recover_dac(const struct emv_pk *enc_pk, const struct tlvdb *db, const struct tlv *sda_tlv) { return emv_pki_recover_dac_ex(enc_pk, db, sda_tlv, false); } @@ -415,7 +408,7 @@ struct tlvdb *emv_pki_recover_idn_ex(const struct emv_pk *enc_pk, const struct t } if (showData) { - printf("Recovered data:\n"); + PrintAndLogEx(SUCCESS, "Recovered data:"); dump_buffer(data, data_len, stdout, 0); } @@ -427,9 +420,7 @@ struct tlvdb *emv_pki_recover_idn_ex(const struct emv_pk *enc_pk, const struct t // 9f4c ICC Dynamic Number struct tlvdb *idn_db = tlvdb_fixed(0x9f4c, idn_len, data + 5); - free(data); - return idn_db; } @@ -453,7 +444,7 @@ struct tlvdb *emv_pki_recover_atc_ex(const struct emv_pk *enc_pk, const struct t } if (showData) { - printf("Recovered data:\n"); + PrintAndLogEx(SUCCESS, "Recovered data:"); dump_buffer(data, data_len, stdout, 0); } @@ -496,6 +487,7 @@ struct tlvdb *emv_pki_perform_cda(const struct emv_pk *enc_pk, const struct tlvd const struct tlv *crm2_tlv) { return emv_pki_perform_cda_ex(enc_pk, db, this_db, pdol_data_tlv, crm1_tlv, crm2_tlv, false); } + struct tlvdb *emv_pki_perform_cda_ex(const struct emv_pk *enc_pk, const struct tlvdb *db, const struct tlvdb *this_db, // AC TLV result const struct tlv *pdol_data_tlv, // PDOL @@ -515,23 +507,23 @@ struct tlvdb *emv_pki_perform_cda_ex(const struct emv_pk *enc_pk, const struct t un_tlv, NULL); if (!data || data_len < 3) { - printf("ERROR: can't decode message. len %zu\n", data_len); + PrintAndLogEx(WARNING, "ERROR: can't decode message. [%zu bytes]", data_len); return NULL; } if (showData) { - printf("Recovered data:\n"); + PrintAndLogEx(SUCCESS, "Recovered data:"); dump_buffer(data, data_len, stdout, 0); } if (data[3] < 30 || data[3] > data_len - 4) { - printf("ERROR: Invalid data length\n"); + PrintAndLogEx(WARNING, "ERROR: Invalid data length"); free(data); return NULL; } if (!cid_tlv || cid_tlv->len != 1 || cid_tlv->value[0] != data[5 + data[4]]) { - printf("ERROR: CID mismatch\n"); + PrintAndLogEx(WARNING, "ERROR: CID mismatch"); free(data); return NULL; } @@ -539,7 +531,7 @@ struct tlvdb *emv_pki_perform_cda_ex(const struct emv_pk *enc_pk, const struct t struct crypto_hash *ch; ch = crypto_hash_open(enc_pk->hash_algo); if (!ch) { - printf("ERROR: can't create hash\n"); + PrintAndLogEx(WARNING, "ERROR: can't create hash"); free(data); return NULL; } @@ -554,7 +546,7 @@ struct tlvdb *emv_pki_perform_cda_ex(const struct emv_pk *enc_pk, const struct t tlvdb_visit(this_db, tlv_hash, ch, 0); if (memcmp(data + 5 + data[4] + 1 + 8, crypto_hash_read(ch), 20)) { - printf("ERROR: calculated hash error\n"); + PrintAndLogEx(WARNING, "ERROR: calculated hash error"); crypto_hash_close(ch); free(data); return NULL; @@ -563,7 +555,7 @@ struct tlvdb *emv_pki_perform_cda_ex(const struct emv_pk *enc_pk, const struct t size_t idn_len = data[4]; if (idn_len > data[3] - 1) { - printf("ERROR: Invalid IDN length\n"); + PrintAndLogEx(WARNING, "ERROR: Invalid IDN length"); free(data); return NULL; } From 38a8e6021f148bd32ca96e03d0f32d664e0b9deb Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Fri, 29 May 2020 08:41:05 +0200 Subject: [PATCH 430/632] fix, emv roca hash mismatch https://github.com/Proxmark/proxmark3/pull/781 (@pwpiwi) --- client/src/emv/cmdemv.c | 115 ++++++++++++++++++++++++++-------------- 1 file changed, 76 insertions(+), 39 deletions(-) diff --git a/client/src/emv/cmdemv.c b/client/src/emv/cmdemv.c index 2cf76a636..474b4224b 100644 --- a/client/src/emv/cmdemv.c +++ b/client/src/emv/cmdemv.c @@ -56,10 +56,10 @@ static void ParamLoadDefaults(struct tlvdb *tlvRoot) { static void PrintChannel(EMVCommandChannel channel) { switch (channel) { case ECC_CONTACTLESS: - PrintAndLogEx(INFO, "Channel: CONTACTLESS (T=CL)"); + PrintAndLogEx(INFO, "Selected channel : " _GREEN_("CONTACTLESS (T=CL)")); break; case ECC_CONTACT: - PrintAndLogEx(INFO, "Channel: CONTACT"); + PrintAndLogEx(INFO, "Selected channel : " _GREEN_("CONTACT")); break; } } @@ -1747,6 +1747,8 @@ static int CmdEMVRoca(const char *Cmd) { uint8_t buf[APDU_RES_LEN] = {0}; size_t len = 0; uint16_t sw = 0; + uint8_t ODAI_list[4096]; + size_t ODAI_listlen = 0; int res; CLIParserInit("emv roca", @@ -1759,23 +1761,30 @@ static int CmdEMVRoca(const char *Cmd) { void *argtable[] = { arg_param_begin, arg_lit0("tT", "selftest", "self test"), - arg_lit0("wW", "wired", "Send data via contact (iso7816) interface. Contactless interface set by default."), + arg_lit0("aA", "apdu", "show APDU reqests and responses"), + arg_lit0("wW", "wired", "Send data via contact (iso7816) interface. Contactless interface set by default"), arg_param_end }; CLIExecWithReturn(Cmd, argtable, true); EMVCommandChannel channel = ECC_CONTACTLESS; - if (arg_get_lit(1)) + if (arg_get_lit(1)) { + CLIParserFree(); return roca_self_test(); + } - if (arg_get_lit(2)) + bool show_apdu = arg_get_lit(2); + + if (arg_get_lit(3)) channel = ECC_CONTACT; - PrintChannel(channel); + CLIParserFree(); + + PrintChannel(channel); if (!IfPm3Smartcard()) { if (channel == ECC_CONTACT) { - PrintAndLogEx(WARNING, "PM3 does not have SMARTCARD support. Exiting."); + PrintAndLogEx(WARNING, "PM3 does not have SMARTCARD support, exiting"); return PM3_EDEVNOTSUPP; } } @@ -1783,14 +1792,14 @@ static int CmdEMVRoca(const char *Cmd) { // select card uint8_t psenum = (channel == ECC_CONTACT) ? 1 : 2; - SetAPDULogging(false); + SetAPDULogging(show_apdu); // init applets list tree const char *al = "Applets list"; struct tlvdb *tlvSelect = tlvdb_fixed(1, strlen(al), (const unsigned char *)al); // EMV PPSE - PrintAndLogEx(NORMAL, "--> PPSE."); + PrintAndLogEx(INFO, "PPSE"); res = EMVSearchPSE(channel, false, true, psenum, false, tlvSelect); // check PPSE and select application id @@ -1798,9 +1807,9 @@ static int CmdEMVRoca(const char *Cmd) { TLVPrintAIDlistFromSelectTLV(tlvSelect); } else { // EMV SEARCH with AID list - PrintAndLogEx(NORMAL, "--> AID search."); + PrintAndLogEx(INFO, "starting AID search"); if (EMVSearch(channel, false, true, false, tlvSelect)) { - PrintAndLogEx(ERR, "Can't found any of EMV AID. Exit..."); + PrintAndLogEx(ERR, "Can't found any of EMV AID, exiting"); tlvdb_free(tlvSelect); DropFieldEx(channel); return PM3_ERFTRANS; @@ -1817,7 +1826,7 @@ static int CmdEMVRoca(const char *Cmd) { tlvdb_free(tlvSelect); if (!AIDlen) { - PrintAndLogEx(INFO, "Can't select AID. EMV AID not found. Exit..."); + PrintAndLogEx(INFO, "Can't select AID or EMV AID not found, exiting"); DropFieldEx(channel); return PM3_ERFTRANS; } @@ -1827,23 +1836,23 @@ static int CmdEMVRoca(const char *Cmd) { struct tlvdb *tlvRoot = tlvdb_fixed(1, strlen(alr), (const unsigned char *)alr); // EMV SELECT applet - PrintAndLogEx(NORMAL, "\n-->Selecting AID:%s.", sprint_hex_inrow(AID, AIDlen)); + PrintAndLogEx(INFO, "Selecting AID: " _YELLOW_("%s"), sprint_hex_inrow(AID, AIDlen)); res = EMVSelect(channel, false, true, AID, AIDlen, buf, sizeof(buf), &len, &sw, tlvRoot); if (res) { - PrintAndLogEx(ERR, "Can't select AID (%d). Exit...", res); + PrintAndLogEx(ERR, "Can't select AID (%d), exiting", res); tlvdb_free(tlvRoot); DropFieldEx(channel); return PM3_ERFTRANS; } - PrintAndLogEx(NORMAL, "\n* Init transaction parameters."); + PrintAndLogEx(INFO, "Init transaction parameters"); InitTransactionParameters(tlvRoot, true, TT_QVSDCMCHIP, false); - PrintAndLogEx(NORMAL, "-->Calc PDOL."); + PrintAndLogEx(INFO, "Calc PDOL"); struct tlv *pdol_data_tlv = dol_process(tlvdb_get(tlvRoot, 0x9f38, NULL), tlvRoot, 0x83); if (!pdol_data_tlv) { - PrintAndLogEx(ERR, "Can't create PDOL TLV."); + PrintAndLogEx(ERR, "Can't create PDOL TLV"); tlvdb_free(tlvRoot); DropFieldEx(channel); return PM3_ESOFT; @@ -1852,7 +1861,7 @@ static int CmdEMVRoca(const char *Cmd) { size_t pdol_data_tlv_data_len; unsigned char *pdol_data_tlv_data = tlv_encode(pdol_data_tlv, &pdol_data_tlv_data_len); if (!pdol_data_tlv_data) { - PrintAndLogEx(ERR, "Can't create PDOL data."); + PrintAndLogEx(ERR, "Can't create PDOL data, exiting"); tlvdb_free(tlvRoot); DropFieldEx(channel); free(pdol_data_tlv); @@ -1860,21 +1869,21 @@ static int CmdEMVRoca(const char *Cmd) { } PrintAndLogEx(INFO, "PDOL data[%zu]: %s", pdol_data_tlv_data_len, sprint_hex(pdol_data_tlv_data, pdol_data_tlv_data_len)); - PrintAndLogEx(INFO, "-->GPO."); + PrintAndLogEx(INFO, "GPO"); res = EMVGPO(channel, true, pdol_data_tlv_data, pdol_data_tlv_data_len, buf, sizeof(buf), &len, &sw, tlvRoot); free(pdol_data_tlv_data); free(pdol_data_tlv); if (res) { - PrintAndLogEx(ERR, "GPO error(%d): %4x. Exit...", res, sw); + PrintAndLogEx(ERR, "GPO error(%d): %4x, exiting", res, sw); tlvdb_free(tlvRoot); DropFieldEx(channel); return PM3_ERFTRANS; } ProcessGPOResponseFormat1(tlvRoot, buf, len, false); - PrintAndLogEx(INFO, "-->Read records from AFL."); + PrintAndLogEx(INFO, "Read records from AFL"); const struct tlv *AFL = tlvdb_get(tlvRoot, 0x94, NULL); while (AFL && AFL->len) { @@ -1889,35 +1898,62 @@ static int CmdEMVRoca(const char *Cmd) { uint8_t SFIend = AFL->value[i * 4 + 2]; uint8_t SFIoffline = AFL->value[i * 4 + 3]; - PrintAndLogEx(INFO, "--->SFI[%02x] start:%02x end:%02x offline:%02x", SFI, SFIstart, SFIend, SFIoffline); + PrintAndLogEx(INFO, " SFI[%02x] start :%02x end :%02x offline :%02x", SFI, SFIstart, SFIend, SFIoffline); if (SFI == 0 || SFI == 31 || SFIstart == 0 || SFIstart > SFIend) { - PrintAndLogEx(ERR, "SFI ERROR! Skipped..."); + PrintAndLogEx(ERR, "SFI ERROR, skipping"); continue; } for (int n = SFIstart; n <= SFIend; n++) { - PrintAndLogEx(INFO, "---->SFI[%02x] %d", SFI, n); + PrintAndLogEx(INFO, " SFI[%02x] %d", SFI, n); res = EMVReadRecord(channel, true, SFI, n, buf, sizeof(buf), &len, &sw, tlvRoot); if (res) { PrintAndLogEx(ERR, "SFI[%02x]. APDU error %4x", SFI, sw); continue; } + + // Build Input list for Offline Data Authentication + // EMV 4.3 book3 10.3, page 96 + if (SFIoffline > 0) { + if (SFI < 11) { + const unsigned char *abuf = buf; + size_t elmlen = len; + struct tlv e; + if (tlv_parse_tl(&abuf, &elmlen, &e)) { + memcpy(&ODAI_list[ODAI_listlen], &buf[len - elmlen], elmlen); + ODAI_listlen += elmlen; + } else { + PrintAndLogEx(WARNING, "Error SFI[%02x]. Creating input list for Offline Data Authentication error", SFI); + } + } else { + memcpy(&ODAI_list[ODAI_listlen], buf, len); + ODAI_listlen += len; + } + SFIoffline--; + } } } - break; } // getting certificates int ret = PM3_SUCCESS; + + // copy Input list for Offline Data Authentication + if (ODAI_listlen) { + struct tlvdb *oda = tlvdb_fixed(0x21, ODAI_listlen, ODAI_list); // not a standard tag + tlvdb_add(tlvRoot, oda); + PrintAndLogEx(INFO, "Input list for Offline Data Authentication added to TLV [%d bytes]", ODAI_listlen); + } + if (tlvdb_get(tlvRoot, 0x90, NULL)) { - PrintAndLogEx(INFO, "-->Recovering certificates."); + PrintAndLogEx(INFO, "Recovering certificates"); PKISetStrictExecution(false); struct emv_pk *pk = get_ca_pk(tlvRoot); if (!pk) { - PrintAndLogEx(ERR, "ERROR: Key not found. Exit."); + PrintAndLogEx(ERR, "ERROR: Key not found, exiting"); ret = PM3_ESOFT; goto out; } @@ -1925,41 +1961,45 @@ static int CmdEMVRoca(const char *Cmd) { struct emv_pk *issuer_pk = emv_pki_recover_issuer_cert(pk, tlvRoot); if (!issuer_pk) { emv_pk_free(pk); - PrintAndLogEx(WARNING, "WARNING: Issuer certificate not found. Exit."); + PrintAndLogEx(WARNING, "WARNING: Issuer certificate not found, exiting"); ret = PM3_ESOFT; goto out; } - PrintAndLogEx(SUCCESS, "Issuer PK recovered. RID %s IDX %02hhx CSN %s", + PrintAndLogEx(SUCCESS, "Issuer Public key recovered RID " _YELLOW_("%s") " IDX " _YELLOW_("%02hhx") " CSN " _YELLOW_("%s"), sprint_hex(issuer_pk->rid, 5), issuer_pk->index, sprint_hex(issuer_pk->serial, 3) ); - struct emv_pk *icc_pk = emv_pki_recover_icc_cert(issuer_pk, tlvRoot, NULL); + const struct tlv *sda_tlv = tlvdb_get(tlvRoot, 0x21, NULL); + struct emv_pk *icc_pk = emv_pki_recover_icc_cert(issuer_pk, tlvRoot, sda_tlv); if (!icc_pk) { emv_pk_free(pk); emv_pk_free(issuer_pk); - PrintAndLogEx(WARNING, "WARNING: ICC certificate not found. Exit."); + PrintAndLogEx(WARNING, "WARNING: ICC certificate not found, exiting"); ret = PM3_ESOFT; goto out; } - PrintAndLogEx(SUCCESS, "ICC PK recovered. RID %s IDX %02hhx CSN %s\n", + + PrintAndLogEx(SUCCESS, "ICC Public key recovered RID " _YELLOW_("%s") " IDX " _YELLOW_("%02hhx") " CSN " _YELLOW_("%s"), sprint_hex(icc_pk->rid, 5), icc_pk->index, sprint_hex(icc_pk->serial, 3) ); - PrintAndLogEx(INFO, "ICC pk modulus: %s", sprint_hex_inrow(icc_pk->modulus, icc_pk->mlen)); + PrintAndLogEx(INFO, "ICC Public key modulus:"); + print_hex_break(icc_pk->modulus, icc_pk->mlen, 16); // icc_pk->exp, icc_pk->elen // icc_pk->modulus, icc_pk->mlen if (icc_pk->elen > 0 && icc_pk->mlen > 0) { - if (emv_rocacheck(icc_pk->modulus, icc_pk->mlen, true)) { - PrintAndLogEx(INFO, "ICC pk is a subject to ROCA vulnerability, insecure.."); + PrintAndLogEx(NORMAL, ""); + if (emv_rocacheck(icc_pk->modulus, icc_pk->mlen, false)) { + PrintAndLogEx(SUCCESS, "ICC Public key is " _RED_("subject") " to ROCA vulnerability, it is considered insecure"); } else { - PrintAndLogEx(INFO, "ICC pk is OK("); + PrintAndLogEx(INFO, "ICC Public key is " _GREEN_("not subject") " to ROCA vulnerability, it is secure"); } } @@ -1967,10 +2007,7 @@ static int CmdEMVRoca(const char *Cmd) { } out: - - // free tlv object tlvdb_free(tlvRoot); - DropFieldEx(channel); return ret; } From 51e6440bedd34ff59b75cf21f8e51b9583ca5b34 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Fri, 29 May 2020 09:27:58 +0200 Subject: [PATCH 431/632] chg, printing style in emv --- client/src/emv/emvcore.c | 155 +++++++++++++++------------------------ 1 file changed, 58 insertions(+), 97 deletions(-) diff --git a/client/src/emv/emvcore.c b/client/src/emv/emvcore.c index 852d801c7..7a3e141e0 100644 --- a/client/src/emv/emvcore.c +++ b/client/src/emv/emvcore.c @@ -675,34 +675,28 @@ int trSDA(struct tlvdb *tlv) { struct emv_pk *pk = get_ca_pk(tlv); if (!pk) { - PrintAndLogEx(ERR, "Error: Key not found. Exit."); + PrintAndLogEx(ERR, "Error: Key not found, exiting"); return 2; } struct emv_pk *issuer_pk = emv_pki_recover_issuer_cert(pk, tlv); if (!issuer_pk) { emv_pk_free(pk); - PrintAndLogEx(ERR, "Error: Issuer certificate not found. Exit."); + PrintAndLogEx(ERR, "Error: Issuer certificate not found, exiting"); return 2; } - - PrintAndLogEx(SUCCESS, "Issuer PK recovered. RID %02hhx:%02hhx:%02hhx:%02hhx:%02hhx IDX %02hhx CSN %02hhx:%02hhx:%02hhx", - issuer_pk->rid[0], - issuer_pk->rid[1], - issuer_pk->rid[2], - issuer_pk->rid[3], - issuer_pk->rid[4], - issuer_pk->index, - issuer_pk->serial[0], - issuer_pk->serial[1], - issuer_pk->serial[2] - ); + + PrintAndLogEx(SUCCESS, "Issuer Public key recovered RID " _YELLOW_("%s") " IDX " _YELLOW_("%02hhx") " CSN " _YELLOW_("%s"), + sprint_hex(issuer_pk->rid, 5), + issuer_pk->index, + sprint_hex(issuer_pk->serial, 3) + ); const struct tlv *sda_tlv = tlvdb_get(tlv, 0x21, NULL); if (!sda_tlv || sda_tlv->len < 1) { emv_pk_free(issuer_pk); emv_pk_free(pk); - PrintAndLogEx(WARNING, "Can't find input list for Offline Data Authentication. Exit."); + PrintAndLogEx(WARNING, "Can't find input list for Offline Data Authentication, exiting"); return 3; } @@ -733,52 +727,42 @@ int trDDA(EMVCommandChannel channel, bool decodeTLV, struct tlvdb *tlv) { struct emv_pk *pk = get_ca_pk(tlv); if (!pk) { - PrintAndLogEx(ERR, "Error: Key not found. Exit."); + PrintAndLogEx(ERR, "Error: Key not found, exiting"); return 2; } const struct tlv *sda_tlv = tlvdb_get(tlv, 0x21, NULL); /* if (!sda_tlv || sda_tlv->len < 1) { it may be 0!!!! emv_pk_free(pk); - PrintAndLogEx(ERR, "Error: Can't find input list for Offline Data Authentication. Exit."); + PrintAndLogEx(ERR, "Error: Can't find input list for Offline Data Authentication, exiting"); return 3; } */ struct emv_pk *issuer_pk = emv_pki_recover_issuer_cert(pk, tlv); if (!issuer_pk) { emv_pk_free(pk); - PrintAndLogEx(ERR, "Error: Issuer certificate not found. Exit."); + PrintAndLogEx(ERR, "Error: Issuer certificate not found, exiting"); return 2; } - PrintAndLogEx(SUCCESS, "Issuer PK recovered. RID %02hhx:%02hhx:%02hhx:%02hhx:%02hhx IDX %02hhx CSN %02hhx:%02hhx:%02hhx\n", - issuer_pk->rid[0], - issuer_pk->rid[1], - issuer_pk->rid[2], - issuer_pk->rid[3], - issuer_pk->rid[4], - issuer_pk->index, - issuer_pk->serial[0], - issuer_pk->serial[1], - issuer_pk->serial[2] - ); + + PrintAndLogEx(SUCCESS, "Issuer Public key recovered RID " _YELLOW_("%s") " IDX " _YELLOW_("%02hhx") " CSN " _YELLOW_("%s"), + sprint_hex(issuer_pk->rid, 5), + issuer_pk->index, + sprint_hex(issuer_pk->serial, 3) + ); struct emv_pk *icc_pk = emv_pki_recover_icc_cert(issuer_pk, tlv, sda_tlv); if (!icc_pk) { emv_pk_free(pk); emv_pk_free(issuer_pk); - PrintAndLogEx(ERR, "Error: ICC certificate not found. Exit."); + PrintAndLogEx(ERR, "Error: ICC certificate not found, exiting"); return 2; } - PrintAndLogEx(SUCCESS, "ICC PK recovered. RID %02hhx:%02hhx:%02hhx:%02hhx:%02hhx IDX %02hhx CSN %02hhx:%02hhx:%02hhx\n", - icc_pk->rid[0], - icc_pk->rid[1], - icc_pk->rid[2], - icc_pk->rid[3], - icc_pk->rid[4], + + PrintAndLogEx(SUCCESS, "ICC Public key recovered. RID " _YELLOW_("%s") " IDX " _YELLOW_("%02hhx") " CSN " _YELLOW_("%s"), + sprint_hex(icc_pk->rid, 5), icc_pk->index, - icc_pk->serial[0], - icc_pk->serial[1], - icc_pk->serial[2] + sprint_hex(icc_pk->serial, 3) ); if (tlvdb_get(tlv, 0x9f2d, NULL)) { @@ -786,20 +770,14 @@ int trDDA(EMVCommandChannel channel, bool decodeTLV, struct tlvdb *tlv) { if (!icc_pe_pk) { PrintAndLogEx(WARNING, "WARNING: ICC PE PK recover error. "); } else { - PrintAndLogEx(SUCCESS, "ICC PE PK recovered. RID %02hhx:%02hhx:%02hhx:%02hhx:%02hhx IDX %02hhx CSN %02hhx:%02hhx:%02hhx\n", - icc_pe_pk->rid[0], - icc_pe_pk->rid[1], - icc_pe_pk->rid[2], - icc_pe_pk->rid[3], - icc_pe_pk->rid[4], + PrintAndLogEx(SUCCESS, "ICC PE Public key recovered. RID " _YELLOW_("%s") " IDX " _YELLOW_("%02hhx") " CSN " _YELLOW_("%s"), + sprint_hex(icc_pe_pk->rid, 5), icc_pe_pk->index, - icc_pe_pk->serial[0], - icc_pe_pk->serial[1], - icc_pe_pk->serial[2] + sprint_hex(icc_pe_pk->serial,3) ); } } else { - PrintAndLogEx(INFO, "ICC PE PK (PIN Encipherment Public Key Certificate) not found.\n"); + PrintAndLogEx(INFO, "ICC PE Public Key (PIN Encipherment Public Key Certificate) not found.\n"); } // 9F4B: Signed Dynamic Application Data @@ -807,7 +785,7 @@ int trDDA(EMVCommandChannel channel, bool decodeTLV, struct tlvdb *tlv) { // DDA with internal authenticate OR fDDA with filled 0x9F4B tag (GPO result) // EMV kernel3 v2.4, contactless book C-3, C.1., page 147 if (sdad_tlv) { - PrintAndLogEx(NORMAL, "\n* * Got Signed Dynamic Application Data (9F4B) form GPO. Maybe fDDA..."); + PrintAndLogEx(NORMAL, "* * Got Signed Dynamic Application Data (9F4B) form GPO. Maybe fDDA..."); const struct tlvdb *atc_db = emv_pki_recover_atc_ex(icc_pk, tlv, true); if (!atc_db) { @@ -831,7 +809,7 @@ int trDDA(EMVCommandChannel channel, bool decodeTLV, struct tlvdb *tlv) { PrintAndLogEx(WARNING, "Error: fDDA verified, but ATC in the certificate and ATC in the record not the same."); } } else { - PrintAndLogEx(NORMAL, "\nERROR: fDDA (fast DDA) verify error"); + PrintAndLogEx(WARNING, "ERROR: fDDA (fast DDA) verify error"); emv_pk_free(pk); emv_pk_free(issuer_pk); emv_pk_free(icc_pk); @@ -872,7 +850,7 @@ int trDDA(EMVCommandChannel channel, bool decodeTLV, struct tlvdb *tlv) { PrintAndLogEx(NORMAL, "\n* Internal Authenticate"); int res = EMVInternalAuthenticate(channel, true, (uint8_t *)ddol_data_tlv->value, ddol_data_tlv->len, buf, sizeof(buf), &len, &sw, NULL); if (res) { - PrintAndLogEx(ERR, "Internal Authenticate error(%d): %4x. Exit...", res, sw); + PrintAndLogEx(ERR, "Internal Authenticate error(%d): %4x, exiting..", res, sw); free(ddol_data_tlv); emv_pk_free(pk); emv_pk_free(issuer_pk); @@ -956,58 +934,48 @@ int trCDA(struct tlvdb *tlv, struct tlvdb *ac_tlv, struct tlv *pdol_data_tlv, st struct emv_pk *pk = get_ca_pk(tlv); if (!pk) { - PrintAndLogEx(ERR, "Error: Key not found. Exit."); + PrintAndLogEx(ERR, "Error: Key not found, exiting"); return 2; } const struct tlv *sda_tlv = tlvdb_get(tlv, 0x21, NULL); if (!sda_tlv || sda_tlv->len < 1) { - PrintAndLogEx(ERR, "Error: Can't find input list for Offline Data Authentication. Exit."); + PrintAndLogEx(ERR, "Error: Can't find input list for Offline Data Authentication, exiting"); emv_pk_free(pk); return 3; } struct emv_pk *issuer_pk = emv_pki_recover_issuer_cert(pk, tlv); if (!issuer_pk) { - PrintAndLogEx(ERR, "Error: Issuer certificate not found. Exit."); + PrintAndLogEx(ERR, "Error: Issuer certificate not found, exiting"); emv_pk_free(pk); return 2; } - PrintAndLogEx(SUCCESS, "Issuer PK recovered. RID %02hhx:%02hhx:%02hhx:%02hhx:%02hhx IDX %02hhx CSN %02hhx:%02hhx:%02hhx\n", - issuer_pk->rid[0], - issuer_pk->rid[1], - issuer_pk->rid[2], - issuer_pk->rid[3], - issuer_pk->rid[4], - issuer_pk->index, - issuer_pk->serial[0], - issuer_pk->serial[1], - issuer_pk->serial[2] - ); + + PrintAndLogEx(SUCCESS, "Issuer Public key recovered RID " _YELLOW_("%s") " IDX " _YELLOW_("%02hhx") " CSN " _YELLOW_("%s"), + sprint_hex(issuer_pk->rid, 5), + issuer_pk->index, + sprint_hex(issuer_pk->serial, 3) + ); struct emv_pk *icc_pk = emv_pki_recover_icc_cert(issuer_pk, tlv, sda_tlv); if (!icc_pk) { - PrintAndLogEx(ERR, "Error: ICC certificate not found. Exit."); + PrintAndLogEx(ERR, "Error: ICC certificate not found, exiting"); emv_pk_free(pk); emv_pk_free(issuer_pk); return 2; } - PrintAndLogEx(SUCCESS, "ICC PK recovered. RID %02hhx:%02hhx:%02hhx:%02hhx:%02hhx IDX %02hhx CSN %02hhx:%02hhx:%02hhx\n", - icc_pk->rid[0], - icc_pk->rid[1], - icc_pk->rid[2], - icc_pk->rid[3], - icc_pk->rid[4], + + PrintAndLogEx(SUCCESS, "ICC Public key recovered. RID " _YELLOW_("%s") " IDX " _YELLOW_("%02hhx") " CSN " _YELLOW_("%s"), + sprint_hex(icc_pk->rid, 5), icc_pk->index, - icc_pk->serial[0], - icc_pk->serial[1], - icc_pk->serial[2] + sprint_hex(icc_pk->serial,3) ); struct tlvdb *dac_db = emv_pki_recover_dac(issuer_pk, tlv, sda_tlv); if (dac_db) { const struct tlv *dac_tlv = tlvdb_get(dac_db, 0x9f45, NULL); - PrintAndLogEx(NORMAL, "SSAD verified OK. (%02hhx:%02hhx)", dac_tlv->value[0], dac_tlv->value[1]); + PrintAndLogEx(SUCCESS, "SSAD verified (%s) (%02hhx:%02hhx)", _GREEN_("ok"), dac_tlv->value[0], dac_tlv->value[1]); tlvdb_add(tlv, dac_db); } else { PrintAndLogEx(ERR, "Error: SSAD verify error"); @@ -1017,7 +985,7 @@ int trCDA(struct tlvdb *tlv, struct tlvdb *ac_tlv, struct tlv *pdol_data_tlv, st return 4; } - PrintAndLogEx(NORMAL, "\n* * Check Signed Dynamic Application Data (SDAD)"); + PrintAndLogEx(INFO, "* * Check Signed Dynamic Application Data (SDAD)"); struct tlvdb *idn_db = emv_pki_perform_cda_ex(icc_pk, tlv, ac_tlv, pdol_data_tlv, // pdol ac_data_tlv, // cdol1 @@ -1025,11 +993,11 @@ int trCDA(struct tlvdb *tlv, struct tlvdb *ac_tlv, struct tlv *pdol_data_tlv, st true); if (idn_db) { const struct tlv *idn_tlv = tlvdb_get(idn_db, 0x9f4c, NULL); - PrintAndLogEx(NORMAL, "\nIDN (ICC Dynamic Number) [%zu] %s", idn_tlv->len, sprint_hex_inrow(idn_tlv->value, idn_tlv->len)); - PrintAndLogEx(NORMAL, "CDA verified OK."); + PrintAndLogEx(INFO, "IDN (ICC Dynamic Number) [%zu] %s", idn_tlv->len, sprint_hex_inrow(idn_tlv->value, idn_tlv->len)); + PrintAndLogEx(SUCCESS, "CDA verified (%s)", _GREEN_("ok")); tlvdb_add(tlv, idn_db); } else { - PrintAndLogEx(ERR, "\nERROR: CDA verify error"); + PrintAndLogEx(ERR, "ERROR: CDA verify error"); } emv_pk_free(pk); @@ -1039,30 +1007,24 @@ int trCDA(struct tlvdb *tlv, struct tlvdb *ac_tlv, struct tlv *pdol_data_tlv, st } int RecoveryCertificates(struct tlvdb *tlvRoot, json_t *root) { - struct emv_pk *pk = get_ca_pk(tlvRoot); if (!pk) { - PrintAndLogEx(ERR, "ERROR: Key not found. Exit."); + PrintAndLogEx(ERR, "ERROR: Key not found, exiting"); return 1; } struct emv_pk *issuer_pk = emv_pki_recover_issuer_cert(pk, tlvRoot); if (!issuer_pk) { emv_pk_free(pk); - PrintAndLogEx(WARNING, "WARNING: Issuer certificate not found. Exit."); + PrintAndLogEx(WARNING, "WARNING: Issuer certificate not found, exiting"); return 2; } - PrintAndLogEx(SUCCESS, "Issuer PK recovered. RID %02hhx:%02hhx:%02hhx:%02hhx:%02hhx IDX %02hhx CSN %02hhx:%02hhx:%02hhx", - issuer_pk->rid[0], - issuer_pk->rid[1], - issuer_pk->rid[2], - issuer_pk->rid[3], - issuer_pk->rid[4], - issuer_pk->index, - issuer_pk->serial[0], - issuer_pk->serial[1], - issuer_pk->serial[2] - ); + + PrintAndLogEx(SUCCESS, "Issuer Public key recovered RID " _YELLOW_("%s") " IDX " _YELLOW_("%02hhx") " CSN " _YELLOW_("%s"), + sprint_hex(issuer_pk->rid, 5), + issuer_pk->index, + sprint_hex(issuer_pk->serial, 3) + ); JsonSaveBufAsHex(root, "$.ApplicationData.RID", issuer_pk->rid, 5); @@ -1075,7 +1037,7 @@ int RecoveryCertificates(struct tlvdb *tlvRoot, json_t *root) { if (!icc_pk) { emv_pk_free(pk); emv_pk_free(issuer_pk); - PrintAndLogEx(WARNING, "WARNING: ICC certificate not found. Exit."); + PrintAndLogEx(WARNING, "WARNING: ICC certificate not found, exiting"); return 2; } PrintAndLogEx(SUCCESS, "ICC PK recovered. RID %02hhx:%02hhx:%02hhx:%02hhx:%02hhx IDX %02hhx CSN %02hhx:%02hhx:%02hhx\n", @@ -1094,6 +1056,5 @@ int RecoveryCertificates(struct tlvdb *tlvRoot, json_t *root) { JsonSaveStr(root, "$.ApplicationData.ICCPublicKeyDec", icc_pk_c); JsonSaveBufAsHex(root, "$.ApplicationData.ICCPublicKeyModulus", icc_pk->modulus, icc_pk->mlen); free(icc_pk_c); - return 0; } From 7e70b53dd46f820950f70787c688cbc43a9d746a Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Fri, 29 May 2020 09:28:09 +0200 Subject: [PATCH 432/632] chg, scope --- client/src/util.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/client/src/util.c b/client/src/util.c index a22d8edde..12e62074c 100644 --- a/client/src/util.c +++ b/client/src/util.c @@ -194,9 +194,9 @@ void hex_to_buffer(const uint8_t *buf, const uint8_t *hex_data, const size_t hex size_t i; memset(tmp, 0x00, hex_max_len); - size_t maxLen = (hex_len > hex_max_len) ? hex_max_len : hex_len; + size_t max_len = (hex_len > hex_max_len) ? hex_max_len : hex_len; - for (i = 0; i < maxLen; ++i, tmp += 2 + spaces_between) { + for (i = 0; i < max_len; ++i, tmp += 2 + spaces_between) { sprintf(tmp, (uppercase) ? "%02X" : "%02x", (unsigned int) hex_data[i]); for (size_t j = 0; j < spaces_between; j++) @@ -204,10 +204,12 @@ void hex_to_buffer(const uint8_t *buf, const uint8_t *hex_data, const size_t hex } i *= (2 + spaces_between); - size_t minStrLen = min_str_len > i ? min_str_len : 0; - if (minStrLen > hex_max_len) - minStrLen = hex_max_len; - for (; i < minStrLen; i++, tmp += 1) + + size_t mlen = min_str_len > i ? min_str_len : 0; + if (mlen > hex_max_len) + mlen = hex_max_len; + + for (; i < mlen; i++, tmp += 1) sprintf(tmp, " "); // remove last space From fd6ac2f024e8afe3c1602e37163cc5a8b5cd0053 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Fri, 29 May 2020 09:46:06 +0200 Subject: [PATCH 433/632] chg, emv print, styles, --- client/src/crypto/asn1utils.c | 6 ++-- client/src/emv/emv_pki.c | 8 ++--- client/src/emv/emvcore.c | 56 ++++++++++++++++------------------- client/src/emv/tlv.h | 2 +- 4 files changed, 31 insertions(+), 41 deletions(-) diff --git a/client/src/crypto/asn1utils.c b/client/src/crypto/asn1utils.c index 1b2c78212..9e5826712 100644 --- a/client/src/crypto/asn1utils.c +++ b/client/src/crypto/asn1utils.c @@ -64,14 +64,12 @@ exit: return res; } -static bool print_cb(void *data, const struct tlv *tlv, int level, bool is_leaf) { +static void print_cb(void *data, const struct tlv *tlv, int level, bool is_leaf) { bool candump = true; asn1_tag_dump(tlv, stdout, level, &candump); if (is_leaf && candump) { dump_buffer(tlv->value, tlv->len, stdout, level); } - - return true; } int asn1_print(uint8_t *asn1buf, size_t asn1buflen, const char *indent) { @@ -81,7 +79,7 @@ int asn1_print(uint8_t *asn1buf, size_t asn1buflen, const char *indent) { tlvdb_visit(t, print_cb, NULL, 0); tlvdb_free(t); } else { - PrintAndLogEx(ERR, "Can't parse data as TLV tree."); + PrintAndLogEx(ERR, "Can't parse data as TLV tree"); return 1; } diff --git a/client/src/emv/emv_pki.c b/client/src/emv/emv_pki.c index fba5902f9..0afcfe775 100644 --- a/client/src/emv/emv_pki.c +++ b/client/src/emv/emv_pki.c @@ -462,22 +462,20 @@ struct tlvdb *emv_pki_recover_atc_ex(const struct emv_pk *enc_pk, const struct t return atc_db; } -static bool tlv_hash(void *data, const struct tlv *tlv, int level, bool is_leaf) { +static void tlv_hash(void *data, const struct tlv *tlv, int level, bool is_leaf) { struct crypto_hash *ch = data; size_t tag_len; unsigned char *tag; if (tlv_is_constructed(tlv)) - return true; + return; if (tlv->tag == 0x9f4b) - return true; + return; tag = tlv_encode(tlv, &tag_len); crypto_hash_write(ch, tag, tag_len); free(tag); - - return true; } struct tlvdb *emv_pki_perform_cda(const struct emv_pk *enc_pk, const struct tlvdb *db, diff --git a/client/src/emv/emvcore.c b/client/src/emv/emvcore.c index 7a3e141e0..f2244fa05 100644 --- a/client/src/emv/emvcore.c +++ b/client/src/emv/emvcore.c @@ -24,7 +24,7 @@ #include "emvjson.h" #include "util_posix.h" -// Got from here. Thanks) +// Got from here. Thanks! // https://eftlab.co.uk/index.php/site-map/knowledge-base/211-emv-aid-rid-pix static const char *PSElist [] = { "325041592E5359532E4444463031", // 2PAY.SYS.DDF01 - Visa Proximity Payment System Environment - PPSE @@ -131,6 +131,7 @@ static const TAIDList AIDlist [] = { { CV_OTHER, "F0000000030001" }, // BRADESCO - Brazilian Bank Banco Bradesco }; +//iceman: this logging setting, should be unified with client debug etc. static bool APDULogging = false; void SetAPDULogging(bool logging) { APDULogging = logging; @@ -156,20 +157,18 @@ enum CardPSVendor GetCardPSVendor(uint8_t *AID, size_t AIDlen) { return CV_NA; } -static bool print_cb(void *data, const struct tlv *tlv, int level, bool is_leaf) { +static void print_cb(void *data, const struct tlv *tlv, int level, bool is_leaf) { emv_tag_dump(tlv, stdout, level); if (is_leaf) { dump_buffer(tlv->value, tlv->len, stdout, level); } - - return true; } bool TLVPrintFromBuffer(uint8_t *data, int datalen) { struct tlvdb *t = NULL; t = tlvdb_parse_multi(data, datalen); if (t) { - PrintAndLogEx(NORMAL, "-------------------- TLV decoded --------------------"); + PrintAndLogEx(INFO, "-------------------- " _CYAN_("TLV decoded") " --------------------"); tlvdb_visit(t, print_cb, NULL, 0); tlvdb_free(t); @@ -192,13 +191,13 @@ void TLVPrintFromTLV(struct tlvdb *tlv) { } void TLVPrintAIDlistFromSelectTLV(struct tlvdb *tlv) { - PrintAndLogEx(NORMAL, "|------------------|--------|-------------------------|"); - PrintAndLogEx(NORMAL, "| AID |Priority| Name |"); - PrintAndLogEx(NORMAL, "|------------------|--------|-------------------------|"); + PrintAndLogEx(INFO, "|------------------+--------+-------------------------|"); + PrintAndLogEx(INFO, "| AID |Priority| Name |"); + PrintAndLogEx(INFO, "|------------------+--------+-------------------------|"); struct tlvdb *ttmp = tlvdb_find(tlv, 0x6f); if (!ttmp) - PrintAndLogEx(NORMAL, "| none |"); + PrintAndLogEx(INFO, "| none |"); while (ttmp) { const struct tlv *tgAID = tlvdb_get_inchild(ttmp, 0x84, NULL); @@ -206,7 +205,7 @@ void TLVPrintAIDlistFromSelectTLV(struct tlvdb *tlv) { const struct tlv *tgPrio = tlvdb_get_inchild(ttmp, 0x87, NULL); if (!tgAID) break; - PrintAndLogEx(NORMAL, "|%s| %s |%s|", + PrintAndLogEx(INFO, "|%s| %s |%s|", sprint_hex_inrow_ex(tgAID->value, tgAID->len, 18), (tgPrio) ? sprint_hex(tgPrio->value, 1) : " ", (tgName) ? sprint_ascii_ex(tgName->value, tgName->len, 25) : " "); @@ -214,7 +213,7 @@ void TLVPrintAIDlistFromSelectTLV(struct tlvdb *tlv) { ttmp = tlvdb_find_next(ttmp, 0x6f); } - PrintAndLogEx(NORMAL, "|------------------|--------|-------------------------|"); + PrintAndLogEx(INFO, "|------------------+--------+-------------------------|"); } struct tlvdb *GetPANFromTrack2(const struct tlv *track2) { @@ -362,7 +361,6 @@ int EMVSelectPSE(EMVCommandChannel channel, bool ActivateField, bool LeaveFieldO uint8_t buf[APDU_AID_LEN] = {0}; *ResultLen = 0; int len = 0; - int res = 0; switch (PSENum) { case 1: param_gethex_to_eol(PSElist[1], 0, buf, sizeof(buf), &len); @@ -373,11 +371,7 @@ int EMVSelectPSE(EMVCommandChannel channel, bool ActivateField, bool LeaveFieldO default: return -1; } - - // select - res = EMVSelect(channel, ActivateField, LeaveFieldON, buf, len, Result, MaxResultLen, ResultLen, sw, NULL); - - return res; + return EMVSelect(channel, ActivateField, LeaveFieldON, buf, len, Result, MaxResultLen, ResultLen, sw, NULL); } static int EMVSelectWithRetry(EMVCommandChannel channel, bool ActivateField, bool LeaveFieldON, uint8_t *AID, size_t AIDLen, uint8_t *Result, size_t MaxResultLen, size_t *ResultLen, uint16_t *sw, struct tlvdb *tlv) { @@ -398,7 +392,7 @@ static int EMVSelectWithRetry(EMVCommandChannel channel, bool ActivateField, boo } retrycnt = 0; - PrintAndLogEx(NORMAL, "Retry failed [%s]. Skipped...", sprint_hex_inrow(AID, AIDLen)); + PrintAndLogEx(FAILED, "Retry failed [%s]. Skipped...", sprint_hex_inrow(AID, AIDLen)); return res; } } @@ -430,7 +424,7 @@ static int EMVCheckAID(EMVCommandChannel channel, bool decodeTLV, struct tlvdb * // all is ok if (decodeTLV) { - PrintAndLogEx(NORMAL, "%s:", sprint_hex_inrow(tgAID->value, tgAID->len)); + PrintAndLogEx(SUCCESS, "%s:", sprint_hex_inrow(tgAID->value, tgAID->len)); TLVPrintFromBuffer(data, datalen); } } @@ -667,7 +661,7 @@ struct emv_pk *get_ca_pk(struct tlvdb *db) { if (!df_tlv || !caidx_tlv || df_tlv->len < 6 || caidx_tlv->len != 1) return NULL; - PrintAndLogEx(NORMAL, "CA public key index 0x%0x", caidx_tlv->value[0]); + PrintAndLogEx(INFO, "CA public key index 0x%0x", caidx_tlv->value[0]); return emv_pk_get_ca_pk(df_tlv->value, caidx_tlv->value[0]); } @@ -703,7 +697,7 @@ int trSDA(struct tlvdb *tlv) { struct tlvdb *dac_db = emv_pki_recover_dac(issuer_pk, tlv, sda_tlv); if (dac_db) { const struct tlv *dac_tlv = tlvdb_get(dac_db, 0x9f45, NULL); - PrintAndLogEx(NORMAL, "SDA verified OK. (Data Authentication Code: %02hhx:%02hhx)\n", dac_tlv->value[0], dac_tlv->value[1]); + PrintAndLogEx(INFO, "SDA verified (%s) (Data Authentication Code: %02hhx:%02hhx)", _GREEN_("ok"), dac_tlv->value[0], dac_tlv->value[1]); tlvdb_add(tlv, dac_db); } else { emv_pk_free(issuer_pk); @@ -785,7 +779,7 @@ int trDDA(EMVCommandChannel channel, bool decodeTLV, struct tlvdb *tlv) { // DDA with internal authenticate OR fDDA with filled 0x9F4B tag (GPO result) // EMV kernel3 v2.4, contactless book C-3, C.1., page 147 if (sdad_tlv) { - PrintAndLogEx(NORMAL, "* * Got Signed Dynamic Application Data (9F4B) form GPO. Maybe fDDA..."); + PrintAndLogEx(INFO, "* * Got Signed Dynamic Application Data (9F4B) form GPO. Maybe fDDA..."); const struct tlvdb *atc_db = emv_pki_recover_atc_ex(icc_pk, tlv, true); if (!atc_db) { @@ -799,7 +793,7 @@ int trDDA(EMVCommandChannel channel, bool decodeTLV, struct tlvdb *tlv) { // 9f36 Application Transaction Counter (ATC) const struct tlv *atc_tlv = tlvdb_get(atc_db, 0x9f36, NULL); if (atc_tlv) { - PrintAndLogEx(NORMAL, "\nATC (Application Transaction Counter) [%zu] %s", atc_tlv->len, sprint_hex_inrow(atc_tlv->value, atc_tlv->len)); + PrintAndLogEx(INFO, "ATC (Application Transaction Counter) [%zu] %s", atc_tlv->len, sprint_hex_inrow(atc_tlv->value, atc_tlv->len)); const struct tlv *core_atc_tlv = tlvdb_get(tlv, 0x9f36, NULL); if (tlv_equal(core_atc_tlv, atc_tlv)) { @@ -819,7 +813,7 @@ int trDDA(EMVCommandChannel channel, bool decodeTLV, struct tlvdb *tlv) { struct tlvdb *dac_db = emv_pki_recover_dac(issuer_pk, tlv, sda_tlv); if (dac_db) { const struct tlv *dac_tlv = tlvdb_get(dac_db, 0x9f45, NULL); - PrintAndLogEx(NORMAL, "SDAD verified OK. (Data Authentication Code: %02hhx:%02hhx)\n", dac_tlv->value[0], dac_tlv->value[1]); + PrintAndLogEx(INFO, "SDAD verified (%s) (Data Authentication Code: %02hhx:%02hhx)\n", _GREEN_("ok"), dac_tlv->value[0], dac_tlv->value[1]); tlvdb_add(tlv, dac_db); } else { PrintAndLogEx(ERR, "Error: SSAD verify error"); @@ -829,11 +823,11 @@ int trDDA(EMVCommandChannel channel, bool decodeTLV, struct tlvdb *tlv) { return 4; } - PrintAndLogEx(NORMAL, "\n* Calc DDOL"); + PrintAndLogEx(INFO, "* Calc DDOL"); const struct tlv *ddol_tlv = tlvdb_get(tlv, 0x9f49, NULL); if (!ddol_tlv) { ddol_tlv = &default_ddol_tlv; - PrintAndLogEx(NORMAL, "DDOL [9f49] not found. Using default DDOL"); + PrintAndLogEx(INFO, "DDOL [9f49] not found. Using default DDOL"); } struct tlv *ddol_data_tlv = dol_process(ddol_tlv, tlv, 0); @@ -845,9 +839,9 @@ int trDDA(EMVCommandChannel channel, bool decodeTLV, struct tlvdb *tlv) { return 5; } - PrintAndLogEx(NORMAL, "DDOL data[%zu]: %s", ddol_data_tlv->len, sprint_hex(ddol_data_tlv->value, ddol_data_tlv->len)); + PrintAndLogEx(INFO, "DDOL data[%zu]: %s", ddol_data_tlv->len, sprint_hex(ddol_data_tlv->value, ddol_data_tlv->len)); - PrintAndLogEx(NORMAL, "\n* Internal Authenticate"); + PrintAndLogEx(INFO, "* Internal Authenticate"); int res = EMVInternalAuthenticate(channel, true, (uint8_t *)ddol_data_tlv->value, ddol_data_tlv->len, buf, sizeof(buf), &len, &sw, NULL); if (res) { PrintAndLogEx(ERR, "Internal Authenticate error(%d): %4x, exiting..", res, sw); @@ -874,7 +868,7 @@ int trDDA(EMVCommandChannel channel, bool decodeTLV, struct tlvdb *tlv) { tlvdb_free(t80); if (decodeTLV) { - PrintAndLogEx(NORMAL, "* * Decode response format 1:"); + PrintAndLogEx(INFO, "* * Decode response format 1:"); TLVPrintFromTLV(dda_db); } } @@ -909,12 +903,12 @@ int trDDA(EMVCommandChannel channel, bool decodeTLV, struct tlvdb *tlv) { // 9f4c ICC Dynamic Number const struct tlv *idn_tlv = tlvdb_get(idn_db, 0x9f4c, NULL); if (idn_tlv) { - PrintAndLogEx(INFO, "\nIDN (ICC Dynamic Number) [%zu] %s", idn_tlv->len, sprint_hex_inrow(idn_tlv->value, idn_tlv->len)); + PrintAndLogEx(INFO, "IDN (ICC Dynamic Number) [%zu] %s", idn_tlv->len, sprint_hex_inrow(idn_tlv->value, idn_tlv->len)); PrintAndLogEx(INFO, "DDA verified OK."); tlvdb_add(tlv, idn_db); tlvdb_free(idn_db); } else { - PrintAndLogEx(ERR, "\nDDA verify error"); + PrintAndLogEx(ERR, "DDA verify error"); tlvdb_free(idn_db); emv_pk_free(pk); diff --git a/client/src/emv/tlv.h b/client/src/emv/tlv.h index 06a836876..41c28c3ef 100644 --- a/client/src/emv/tlv.h +++ b/client/src/emv/tlv.h @@ -29,7 +29,7 @@ struct tlv { }; struct tlvdb; -typedef bool (*tlv_cb)(void *data, const struct tlv *tlv, int level, bool is_leaf); +typedef void (*tlv_cb)(void *data, const struct tlv *tlv, int level, bool is_leaf); struct tlvdb *tlvdb_fixed(tlv_tag_t tag, size_t len, const unsigned char *value); struct tlvdb *tlvdb_external(tlv_tag_t tag, size_t len, const unsigned char *value); From 54827d3ec93acbc57656b361da436e8beaddaf1d Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Fri, 29 May 2020 10:15:40 +0200 Subject: [PATCH 434/632] chg, printf --- client/src/emv/test/cda_test.c | 51 ++++++++++++-------------- client/src/emv/test/crypto_test.c | 60 +++++++++++++++---------------- client/src/emv/test/cryptotest.c | 12 +++---- client/src/emv/test/dda_test.c | 49 ++++++++++++------------- client/src/emv/test/sda_test.c | 45 +++++++++++------------ 5 files changed, 99 insertions(+), 118 deletions(-) diff --git a/client/src/emv/test/cda_test.c b/client/src/emv/test/cda_test.c index 72f076a54..4fe181d6a 100644 --- a/client/src/emv/test/cda_test.c +++ b/client/src/emv/test/cda_test.c @@ -17,16 +17,16 @@ #include <config.h> #endif +#include <string.h> // memcpy +#include <stdlib.h> // malloc +#include "cda_test.h" + #include "../emv_pk.h" #include "../crypto.h" #include "../dump.h" #include "../tlv.h" #include "../emv_pki.h" - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include "cda_test.h" +#include "ui.h" // printandlog struct emv_pk c_mchip_05 = { .rid = { 0xa0, 0x00, 0x00, 0x00, 0x04, }, @@ -169,7 +169,7 @@ static int cda_test_raw(bool verbose) { return 1; if (verbose) { - printf("issuer cert:\n"); + PrintAndLogEx(INFO, "issuer cert:"); dump_buffer(ipk_data, ipk_data_len, stdout, 0); } @@ -199,7 +199,7 @@ static int cda_test_raw(bool verbose) { } if (verbose) { - printf("crypto hash:\n"); + PrintAndLogEx(INFO, "crypto hash:"); dump_buffer(h, 20, stdout, 0); } @@ -228,7 +228,7 @@ static int cda_test_raw(bool verbose) { return 1; if (verbose) { - printf("icc cert:\n"); + PrintAndLogEx(INFO, "icc cert:"); dump_buffer(iccpk_data, iccpk_data_len, stdout, 0); } @@ -257,7 +257,7 @@ static int cda_test_raw(bool verbose) { } if (verbose) { - printf("crypto hash1.1:\n"); + PrintAndLogEx(INFO, "crypto hash1.1:"); dump_buffer(h, 20, stdout, 0); } @@ -284,7 +284,7 @@ static int cda_test_raw(bool verbose) { return 1; if (verbose) { - printf("SDAD:\n"); + PrintAndLogEx(INFO, "SDAD:"); dump_buffer(sdad, sdad_len, stdout, 0); } @@ -305,7 +305,7 @@ static int cda_test_raw(bool verbose) { } if (verbose) { - printf("crypto hash2:\n"); + PrintAndLogEx(INFO, "crypto hash2:"); dump_buffer(h2, 20, stdout, 0); } @@ -328,7 +328,7 @@ static int cda_test_raw(bool verbose) { } if (verbose) { - printf("crypto hash2.1:\n"); + PrintAndLogEx(INFO, "crypto hash2.1:"); dump_buffer(h, 20, stdout, 0); } @@ -339,9 +339,7 @@ static int cda_test_raw(bool verbose) { } crypto_hash_close(ch); - free(sdad); - return 0; } @@ -356,7 +354,7 @@ static int cda_test_pk(bool verbose) { struct emv_pk *ipk = emv_pki_recover_issuer_cert(pk, db); if (!ipk) { - fprintf(stderr, "Could not recover Issuer certificate!\n"); + PrintAndLogEx(WARNING, "Could not recover Issuer certificate!"); tlvdb_free(db); return 2; } @@ -367,7 +365,7 @@ static int cda_test_pk(bool verbose) { struct emv_pk *iccpk = emv_pki_recover_icc_cert(ipk, db, &ssd1_tlv); if (!iccpk) { - fprintf(stderr, "Could not recover ICC certificate!\n"); + PrintAndLogEx(WARNING, "Could not recover ICC certificate!"); emv_pk_free(ipk); tlvdb_free(db); return 2; @@ -387,7 +385,7 @@ static int cda_test_pk(bool verbose) { &crm1_tlv, NULL); if (!idndb) { - fprintf(stderr, "Could not recover IDN!\n"); + PrintAndLogEx(WARNING, "Could not recover IDN!"); tlvdb_free(cda_db); emv_pk_free(iccpk); emv_pk_free(ipk); @@ -397,7 +395,7 @@ static int cda_test_pk(bool verbose) { const struct tlv *idn = tlvdb_get(idndb, 0x9f4c, NULL); if (!idn) { - fprintf(stderr, "IDN not found!\n"); + PrintAndLogEx(WARNING, "IDN not found!"); tlvdb_free(idndb); tlvdb_free(cda_db); emv_pk_free(iccpk); @@ -407,7 +405,7 @@ static int cda_test_pk(bool verbose) { } if (verbose) { - printf("IDN:\n"); + PrintAndLogEx(INFO, "IDN:"); dump_buffer(idn->value, idn->len, stdout, 0); } @@ -416,27 +414,22 @@ static int cda_test_pk(bool verbose) { emv_pk_free(iccpk); emv_pk_free(ipk); tlvdb_free(db); - return 0; } int exec_cda_test(bool verbose) { - int ret; - fprintf(stdout, "\n"); - - ret = cda_test_raw(verbose); + int ret = cda_test_raw(verbose); if (ret) { - fprintf(stderr, "CDA raw test: failed\n"); + PrintAndLogEx(WARNING, "CDA raw test: failed"); return ret; } - fprintf(stdout, "CDA raw test: passed\n"); + PrintAndLogEx(INFO, "CDA raw test: passed"); ret = cda_test_pk(verbose); if (ret) { - fprintf(stderr, "CDA test pk: failed\n"); + PrintAndLogEx(WARNING, "CDA test pk: failed"); return ret; } - fprintf(stdout, "CDA test pk: passed\n"); - + PrintAndLogEx(INFO, "CDA test pk: passed"); return 0; } diff --git a/client/src/emv/test/crypto_test.c b/client/src/emv/test/crypto_test.c index 4a40952a8..332b7dd87 100644 --- a/client/src/emv/test/crypto_test.c +++ b/client/src/emv/test/crypto_test.c @@ -17,16 +17,16 @@ #include <config.h> #endif -#include "commonutil.h" // ARRAYLEN +#include <string.h> // memcpy +#include <stdlib.h> // malloc +#include <inttypes.h> +#include "crypto_test.h" +#include "commonutil.h" // ARRAYLEN #include "../crypto.h" #include "../dump.h" #include "util_posix.h" - -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> -#include "crypto_test.h" +#include "ui.h" // printandlog static int test_genkey(unsigned int keylength, unsigned char *msg, size_t msg_len, bool verbose) { int ret = 1; @@ -34,46 +34,46 @@ static int test_genkey(unsigned int keylength, unsigned char *msg, size_t msg_le unsigned char *tmp, *tmp2; struct crypto_pk *pk; - printf("Testing key length %u ", keylength); + PrintAndLogEx(INFO, "Testing key length " _GREEN_("%u"), keylength); uint64_t ms = msclock(); pk = crypto_pk_genkey(PK_RSA, 1, keylength, 3); if (!pk) { - fprintf(stderr, "ERROR: key generation error.\n"); + PrintAndLogEx(WARNING, "ERROR: key generation error"); goto out; } tmp_len = crypto_pk_get_nbits(pk); if (tmp_len != keylength) { - fprintf(stderr, "ERROR: crypto_pk_get_nbits.\n"); + PrintAndLogEx(WARNING, "ERROR: crypto_pk_get_nbits"); goto close; } tmp = crypto_pk_decrypt(pk, msg, msg_len, &tmp_len); if (!tmp) { - fprintf(stderr, "ERROR: crypto_pk_decrypt.\n"); + PrintAndLogEx(WARNING, "ERROR: crypto_pk_decrypt"); goto close; } tmp2 = crypto_pk_encrypt(pk, tmp, tmp_len, &tmp2_len); if (!tmp2) { - fprintf(stderr, "ERROR: crypto_pk_encrypt.\n"); + PrintAndLogEx(WARNING, "ERROR: crypto_pk_encrypt"); goto free_tmp; } if (tmp2_len == msg_len && !memcmp(tmp2, msg, tmp2_len)) { ret = 0; } else { - fprintf(stderr, "ERROR: encrypt-decrypt sequence length or data error.\n"); + PrintAndLogEx(WARNING, "ERROR: encrypt-decrypt sequence length or data error"); } free(tmp2); - printf("passed. (%"PRIu64" ms) \n", msclock() - ms); + PrintAndLogEx(SUCCESS, "passed (" _GREEN_("%" PRIu64) " ms)", msclock() - ms); + free_tmp: free(tmp); close: crypto_pk_close(pk); - out: return ret; } @@ -202,25 +202,25 @@ static int test_pk(bool verbose) { unsigned char *msg = message; size_t msg_len = sizeof(pk_N); - printf("Testing public keys interfaces\n"); + PrintAndLogEx(INFO, "Testing public keys interfaces"); pubk = crypto_pk_open(PK_RSA, pk_N, sizeof(pk_N), pk_E, sizeof(pk_E)); if (!pubk) { - fprintf(stderr, "ERROR: open public key.\n"); + PrintAndLogEx(WARNING, "ERROR: open public key"); return 1; } tmp_len = crypto_pk_get_nbits(pubk); if (tmp_len != sizeof(pk_N) * 8) { - fprintf(stderr, "ERROR: crypto_pk_get_nbits mismatch.\n"); + PrintAndLogEx(WARNING, "ERROR: crypto_pk_get_nbits mismatch"); goto close_pub; } tmp = crypto_pk_get_parameter(pubk, 0, &tmp_len); if (tmp_len != sizeof(pk_N) || memcmp(tmp, pk_N, tmp_len)) { - fprintf(stderr, "ERROR: crypto_pk_get_parameter(0) Modulus. param len %zu len %zu\n", tmp_len, sizeof(pk_N)); + PrintAndLogEx(WARNING, "ERROR: crypto_pk_get_parameter(0) Modulus. param len %zu len %zu", tmp_len, sizeof(pk_N)); free(tmp); goto close_pub; } @@ -228,7 +228,7 @@ static int test_pk(bool verbose) { tmp = crypto_pk_get_parameter(pubk, 1, &tmp_len); if (tmp_len != sizeof(pk_E) || memcmp(tmp, pk_E, tmp_len)) { - fprintf(stderr, "ERROR: crypto_pk_get_parameter(1) Exponent.\n"); + PrintAndLogEx(WARNING, "ERROR: crypto_pk_get_parameter(1) Exponent"); free(tmp); goto close_pub; } @@ -244,20 +244,20 @@ static int test_pk(bool verbose) { pk_dQ, sizeof(pk_dQ), pk_I, sizeof(pk_I)); if (!privk) { - fprintf(stderr, "ERROR: open private key.\n"); + PrintAndLogEx(WARNING, "ERROR: open private key"); goto close_pub; } tmp_len = crypto_pk_get_nbits(privk); if (tmp_len != sizeof(pk_N) * 8) { - fprintf(stderr, "ERROR: crypto_pk_get_nbits mismatch.\n"); + PrintAndLogEx(WARNING, "ERROR: crypto_pk_get_nbits mismatch"); goto close_pub; } tmp = crypto_pk_get_parameter(privk, 0, &tmp_len); if (tmp_len != sizeof(pk_N) || memcmp(tmp, pk_N, tmp_len)) { - fprintf(stderr, "ERROR: crypto_pk_get_parameter(0) Modulus. param len %zu len %zu\n", tmp_len, sizeof(pk_N)); + PrintAndLogEx(WARNING, "ERROR: crypto_pk_get_parameter(0) Modulus. param len %zu len %zu", tmp_len, sizeof(pk_N)); free(tmp); goto close; } @@ -265,7 +265,7 @@ static int test_pk(bool verbose) { tmp = crypto_pk_get_parameter(privk, 1, &tmp_len); if (tmp_len != sizeof(pk_E) || memcmp(tmp, pk_E, tmp_len)) { - fprintf(stderr, "ERROR: crypto_pk_get_parameter(1) Exponent.\n"); + PrintAndLogEx(WARNING, "ERROR: crypto_pk_get_parameter(1) Exponent"); free(tmp); goto close; } @@ -273,20 +273,20 @@ static int test_pk(bool verbose) { tmp = crypto_pk_decrypt(privk, msg, msg_len, &tmp_len); if (!tmp) { - fprintf(stderr, "ERROR: crypto_pk_decrypt.\n"); + PrintAndLogEx(WARNING, "ERROR: crypto_pk_decrypt"); goto close; } tmp2 = crypto_pk_encrypt(pubk, tmp, tmp_len, &tmp2_len); if (!tmp2) { - fprintf(stderr, "ERROR: crypto_pk_encrypt.\n"); + PrintAndLogEx(WARNING, "ERROR: crypto_pk_encrypt"); goto free_tmp; } if (tmp2_len == msg_len && !memcmp(tmp2, msg, tmp2_len)) { ret = 0; } else { - fprintf(stderr, "ERROR: encrypt-decrypt sequence length or data error.\n"); + PrintAndLogEx(WARNING, "ERROR: encrypt-decrypt sequence length or data error"); } free(tmp2); @@ -310,16 +310,16 @@ int exec_crypto_test(bool verbose, bool include_slow_tests) { ret = test_pk(verbose); if (ret) { - fprintf(stderr, "Crypto raw test: failed\n"); + PrintAndLogEx(WARNING, "Crypto raw test: failed"); return ret; } - fprintf(stdout, "Crypto raw test: passed\n\n"); + PrintAndLogEx(SUCCESS, "Crypto raw test (%s)", _GREEN_("passed")); for (i = 0; i < ARRAYLEN(keylengths); i++) { unsigned int kl = keylengths[i]; ret = test_genkey(kl, message, kl / 8, verbose); if (ret) { - fprintf(stderr, "Crypto generate key[%u] test: failed\n", kl); + PrintAndLogEx(WARNING, "Crypto generate key[%u] test: failed", kl); return ret; } } @@ -328,7 +328,7 @@ int exec_crypto_test(bool verbose, bool include_slow_tests) { unsigned int kl = extra_keylengths[i]; ret = test_genkey(kl, message, kl / 8, verbose); if (ret) { - fprintf(stderr, "Crypto generate key[%u] test: failed\n", kl); + PrintAndLogEx(WARNING, "Crypto generate key[%u] test: failed", kl); return ret; } } diff --git a/client/src/emv/test/cryptotest.c b/client/src/emv/test/cryptotest.c index bb59de7fa..c15ec54f9 100644 --- a/client/src/emv/test/cryptotest.c +++ b/client/src/emv/test/cryptotest.c @@ -10,8 +10,7 @@ #include "cryptotest.h" #include "util.h" -#include "ui.h" - +#include "ui.h" // printandlog #include "bignum.h" #include "aes.h" #include "cmac.h" @@ -25,7 +24,6 @@ #include "ctr_drbg.h" #include "entropy.h" #include "timing.h" - #include "crypto_test.h" #include "sda_test.h" #include "dda_test.h" @@ -63,7 +61,7 @@ int ExecuteCryptoTests(bool verbose, bool ignore_time, bool include_slow_tests) res = mbedtls_timing_self_test(verbose); if (!res) break; - PrintAndLogEx(WARNING, "Repeat timing test %d", i + 1); + PrintAndLogEx(WARNING, "Repeat timing test " _RED_("%d"), i + 1); } if (res && !ignore_time) TestFail = true; @@ -100,12 +98,12 @@ int ExecuteCryptoTests(bool verbose, bool ignore_time, bool include_slow_tests) res = roca_self_test(); if (res) TestFail = true; - PrintAndLogEx(NORMAL, "\n--------------------------"); + PrintAndLogEx(INFO, "--------------------------"); if (TestFail) - PrintAndLogEx(FAILED, "\tTest(s) [ %s ]", _RED_("Fail")); + PrintAndLogEx(FAILED, "\tTest(s) [ %s ]", _RED_("fail")); else - PrintAndLogEx(SUCCESS, "\tTest(s) [ %s ]", _GREEN_("OK")); + PrintAndLogEx(SUCCESS, "\tTest(s) [ %s ]", _GREEN_("ok")); return TestFail; } diff --git a/client/src/emv/test/dda_test.c b/client/src/emv/test/dda_test.c index 55e2830ad..7bf6d4975 100644 --- a/client/src/emv/test/dda_test.c +++ b/client/src/emv/test/dda_test.c @@ -17,17 +17,17 @@ #include <config.h> #endif -#include "dda_test.h" +#include <string.h> // memcpy +#include <stdlib.h> // malloc +#include "dda_test.h" #include "../emv_pk.h" #include "../crypto.h" #include "../dump.h" #include "../tlv.h" #include "../emv_pki.h" +#include "ui.h" // printandlog -#include <stdio.h> -#include <string.h> -#include <stdlib.h> struct emv_pk mchip_05 = { .rid = { 0xa0, 0x00, 0x00, 0x00, 0x04, }, @@ -123,6 +123,7 @@ const unsigned char d_ssd1[] = { 0x03, 0x8d, 0x0c, 0x91, 0x0a, 0x8a, 0x02, 0x95, 0x05, 0x9f, 0x37, 0x04, 0x9f, 0x4c, 0x08, 0x39, 0x00, }; + static const struct tlv ssd1_tlv = { .len = sizeof(d_ssd1), .value = d_ssd1, @@ -135,6 +136,7 @@ const unsigned char d_pan[] = { const unsigned char d_dd1[] = { 0x00, 0x00, 0x00, 0x00, }; + static const struct tlv dd1_tlv = { .len = sizeof(d_dd1), .value = d_dd1, @@ -158,7 +160,7 @@ static int dda_test_raw(bool verbose) { return 1; if (verbose) { - printf("issuer cert:\n"); + PrintAndLogEx(INFO, "issuer cert:"); dump_buffer(ipk_data, ipk_data_len, stdout, 0); } @@ -188,7 +190,7 @@ static int dda_test_raw(bool verbose) { } if (verbose) { - printf("crypto hash:\n"); + PrintAndLogEx(INFO, "crypto hash:"); dump_buffer(h, 20, stdout, 0); } @@ -217,7 +219,7 @@ static int dda_test_raw(bool verbose) { return 1; if (verbose) { - printf("icc cert:\n"); + PrintAndLogEx(INFO, "icc cert:"); dump_buffer(iccpk_data, iccpk_data_len, stdout, 0); } @@ -246,7 +248,7 @@ static int dda_test_raw(bool verbose) { } if (verbose) { - printf("crypto hash1.1:\n"); + PrintAndLogEx(INFO, "crypto hash1.1:"); dump_buffer(h, 20, stdout, 0); } @@ -273,7 +275,7 @@ static int dda_test_raw(bool verbose) { return 1; if (verbose) { - printf("sdad:\n"); + PrintAndLogEx(INFO, "sdad:"); dump_buffer(sdad, sdad_len, stdout, 0); } @@ -294,14 +296,12 @@ static int dda_test_raw(bool verbose) { } if (verbose) { - printf("crypto hash2:\n"); + PrintAndLogEx(INFO, "crypto hash2:"); dump_buffer(h2, 20, stdout, 0); } crypto_hash_close(ch); - free(sdad); - return 0; } @@ -316,7 +316,7 @@ static int dda_test_pk(bool verbose) { struct emv_pk *ipk = emv_pki_recover_issuer_cert(pk, db); if (!ipk) { - fprintf(stderr, "Could not recover Issuer certificate!\n"); + PrintAndLogEx(WARNING, "Could not recover Issuer certificate!"); tlvdb_free(db); return 2; } @@ -327,7 +327,7 @@ static int dda_test_pk(bool verbose) { struct emv_pk *iccpk = emv_pki_recover_icc_cert(ipk, db, &ssd1_tlv); if (!iccpk) { - fprintf(stderr, "Could not recover ICC certificate!\n"); + PrintAndLogEx(WARNING, "Could not recover ICC certificate!"); emv_pk_free(ipk); tlvdb_free(db); return 2; @@ -337,7 +337,7 @@ static int dda_test_pk(bool verbose) { struct tlvdb *idndb = emv_pki_recover_idn(iccpk, db, &dd1_tlv); if (!idndb) { - fprintf(stderr, "Could not recover IDN!\n"); + PrintAndLogEx(WARNING, "Could not recover IDN!"); emv_pk_free(iccpk); emv_pk_free(ipk); tlvdb_free(db); @@ -346,7 +346,7 @@ static int dda_test_pk(bool verbose) { const struct tlv *idn = tlvdb_get(idndb, 0x9f4c, NULL); if (!idn) { - fprintf(stderr, "IDN not found!\n"); + PrintAndLogEx(WARNING, "IDN not found!"); tlvdb_free(idndb); emv_pk_free(iccpk); emv_pk_free(ipk); @@ -355,7 +355,7 @@ static int dda_test_pk(bool verbose) { } if (verbose) { - printf("IDN:\n"); + PrintAndLogEx(INFO, "IDN:"); dump_buffer(idn->value, idn->len, stdout, 0); } @@ -363,27 +363,22 @@ static int dda_test_pk(bool verbose) { emv_pk_free(iccpk); emv_pk_free(ipk); tlvdb_free(db); - return 0; } int exec_dda_test(bool verbose) { - int ret; - fprintf(stdout, "\n"); - - ret = dda_test_raw(verbose); + int ret = dda_test_raw(verbose); if (ret) { - fprintf(stderr, "DDA raw test: failed\n"); + PrintAndLogEx(WARNING, "DDA raw test: %s", _RED_("failed")); return ret; } - fprintf(stdout, "DDA raw test: passed\n"); + PrintAndLogEx(SUCCESS, "DDA raw test: %s", _GREEN_("passed")); ret = dda_test_pk(verbose); if (ret) { - fprintf(stderr, "DDA test pk: failed\n"); + PrintAndLogEx(WARNING, "DDA test pk: %s", _RED_("failed")); return ret; } - fprintf(stdout, "DDA test pk: passed\n"); - + PrintAndLogEx(SUCCESS, "DDA test pk: %s", _GREEN_("passed")); return 0; } diff --git a/client/src/emv/test/sda_test.c b/client/src/emv/test/sda_test.c index c8da53d7a..3907027ad 100644 --- a/client/src/emv/test/sda_test.c +++ b/client/src/emv/test/sda_test.c @@ -17,15 +17,16 @@ #include <config.h> #endif +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + #include "../emv_pk.h" #include "../crypto.h" #include "../dump.h" #include "../tlv.h" #include "../emv_pki.h" - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> +#include "ui.h" // printandlog #include "sda_test.h" struct emv_pk vsdc_01 = { @@ -92,6 +93,7 @@ const unsigned char ssd1[] = { 0x5f, 0x24, 0x03, 0x08, 0x12, 0x31, 0x5a, 0x08, 0x42, 0x76, 0x55, 0x00, 0x13, 0x23, 0x45, 0x99, 0x5f, 0x34, 0x01, 0x01, 0x9f, 0x07, 0x02, 0xff, 0x00, 0x9f, 0x0d, 0x05, 0xd0, 0x40, 0xac, 0xa8, 0x00, 0x9f, 0x0e, 0x05, 0x00, 0x10, 0x00, 0x00, 0x00, 0x9f, 0x0f, 0x05, 0xd0, 0x68, 0xbc, 0xf8, 0x00, 0x5c, 0x00, }; + static const struct tlv ssd1_tlv = { .len = sizeof(ssd1), .value = ssd1, @@ -119,7 +121,7 @@ static int sda_test_raw(bool verbose) { return 1; if (verbose) { - printf("issuer cert:\n"); + PrintAndLogEx(INFO, "issuer cert:"); dump_buffer(ipk_data, ipk_data_len, stdout, 0); } @@ -149,7 +151,7 @@ static int sda_test_raw(bool verbose) { } if (verbose) { - printf("crypto hash:\n"); + PrintAndLogEx(INFO, "crypto hash:"); dump_buffer(h, 20, stdout, 0); } @@ -176,7 +178,7 @@ static int sda_test_raw(bool verbose) { return 1; if (verbose) { - printf("ssad:\n"); + PrintAndLogEx(INFO, "ssad:"); dump_buffer(ssad, ssad_len, stdout, 0); } @@ -197,14 +199,12 @@ static int sda_test_raw(bool verbose) { } if (verbose) { - printf("crypto hash2:\n"); + PrintAndLogEx(INFO, "crypto hash2:"); dump_buffer(h2, 20, stdout, 0); } crypto_hash_close(ch); - free(ssad); - return 0; } @@ -219,7 +219,7 @@ static int sda_test_pk(bool verbose) { struct emv_pk *ipk = emv_pki_recover_issuer_cert(pk, db); if (!ipk) { - fprintf(stderr, "Could not recover Issuer certificate!\n"); + PrintAndLogEx(WARNING, "Could not recover Issuer certificate!"); tlvdb_free(db); return 2; } @@ -228,7 +228,7 @@ static int sda_test_pk(bool verbose) { struct tlvdb *dacdb = emv_pki_recover_dac(ipk, db, &ssd1_tlv); if (!dacdb) { - fprintf(stderr, "Could not recover DAC!\n"); + PrintAndLogEx(WARNING, "Could not recover DAC!"); emv_pk_free(ipk); tlvdb_free(db); return 2; @@ -236,7 +236,7 @@ static int sda_test_pk(bool verbose) { const struct tlv *dac = tlvdb_get(dacdb, 0x9f45, NULL); if (!dac) { - fprintf(stderr, "DAC not found!\n"); + PrintAndLogEx(WARNING, "DAC not found!"); tlvdb_free(dacdb); emv_pk_free(ipk); tlvdb_free(db); @@ -244,34 +244,29 @@ static int sda_test_pk(bool verbose) { } if (verbose) { - printf("dac:\n"); + PrintAndLogEx(INFO, "dac:"); dump_buffer(dac->value, dac->len, stdout, 0); } tlvdb_free(dacdb); emv_pk_free(ipk); tlvdb_free(db); - return 0; } int exec_sda_test(bool verbose) { - int ret; - fprintf(stdout, "\n"); - - ret = sda_test_raw(verbose); + int ret = sda_test_raw(verbose); if (ret) { - fprintf(stderr, "SDA raw test: failed\n"); + PrintAndLogEx(WARNING, "SDA raw test: %s", _RED_("failed")); return ret; } - fprintf(stdout, "SDA raw test: passed\n"); + PrintAndLogEx(SUCCESS, "SDA raw test: %s", _GREEN_("passed")); ret = sda_test_pk(verbose); if (ret) { - fprintf(stderr, "SDA test pk: failed\n"); + PrintAndLogEx(WARNING, "SDA test pk: %s", _RED_("failed")); return ret; } - fprintf(stdout, "SDA test pk: passed\n"); - + PrintAndLogEx(SUCCESS, "SDA test pk: %s", _GREEN_("passed")); return 0; -} +} \ No newline at end of file From 8ecc1f64f8ceb61c5649a759dd4e30b8a9047f8b Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Fri, 29 May 2020 10:22:56 +0200 Subject: [PATCH 435/632] fix: adapt return check --- tools/pm3_tests.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/pm3_tests.sh b/tools/pm3_tests.sh index d5b88f446..07e777fae 100755 --- a/tools/pm3_tests.sh +++ b/tools/pm3_tests.sh @@ -354,10 +354,10 @@ while true; do if ! CheckExecute "hf mf offline text" "$CLIENTBIN -c 'hf mf'" "at_enc"; then break; fi if ! CheckExecute slow retry ignore "hf mf hardnested long test" "$CLIENTBIN -c 'hf mf hardnested t 1 000000000000'" "found:"; then break; fi if ! CheckExecute slow "hf iclass long test" "$CLIENTBIN -c 'hf iclass loclass t l'" "verified ok"; then break; fi - if ! CheckExecute slow "emv long test" "$CLIENTBIN -c 'emv test -l'" "Test(s) \[ OK"; then break; fi + if ! CheckExecute slow "emv long test" "$CLIENTBIN -c 'emv test -l'" "Test(s) \[ ok"; then break; fi if ! $SLOWTESTS; then if ! CheckExecute "hf iclass test" "$CLIENTBIN -c 'hf iclass loclass t'" "key diversification (ok)"; then break; fi - if ! CheckExecute "emv test" "$CLIENTBIN -c 'emv test'" "Test(s) \[ OK"; then break; fi + if ! CheckExecute "emv test" "$CLIENTBIN -c 'emv test'" "Test(s) \[ ok"; then break; fi fi fi echo -e "\n${C_GREEN}Tests [OK]${C_NC}\n" From 529b33b234f2a128230f85861cf311977dda2ace Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Fri, 29 May 2020 10:23:14 +0200 Subject: [PATCH 436/632] chg, prints --- client/src/emv/emv_roca.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/client/src/emv/emv_roca.c b/client/src/emv/emv_roca.c index 1bebcacbf..8f6607363 100644 --- a/client/src/emv/emv_roca.c +++ b/client/src/emv/emv_roca.c @@ -143,8 +143,6 @@ cleanup: } int roca_self_test(void) { - int ret = 0; - PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "ROCA check vulnerability tests"); @@ -154,12 +152,12 @@ int roca_self_test(void) { "\x27\x83\x30\xd3\xf4\x71\xa2\x53\x8f\xa6\x67\x80\x2e\xd2\xa3\xc4"\ "\x4a\x8b\x7d\xea\x82\x6e\x88\x8d\x0a\xa3\x41\xfd\x66\x4f\x7f\xa7"; - + int ret = 0; if (emv_rocacheck(keyp, 64, false)) { - PrintAndLogEx(SUCCESS, "Weak modulus [ %s]", _GREEN_("PASS")); + PrintAndLogEx(SUCCESS, "Weak modulus [ %s ]", _GREEN_("PASS")); } else { ret++; - PrintAndLogEx(FAILED, "Weak modulus [ %s]", _RED_("Fail")); + PrintAndLogEx(FAILED, "Weak modulus [ %s ]", _RED_("Fail")); } // negative @@ -170,10 +168,9 @@ int roca_self_test(void) { if (emv_rocacheck(keyn, 64, false)) { ret++; - PrintAndLogEx(FAILED, "Strong modulus [ %s]", _RED_("Fail")); + PrintAndLogEx(FAILED, "Strong modulus [ %s ]", _RED_("Fail")); } else { - PrintAndLogEx(SUCCESS, "Strong modulus [ %s]", _GREEN_("PASS")); + PrintAndLogEx(SUCCESS, "Strong modulus [ %s ]", _GREEN_("PASS")); } - return ret; } From d65f2287f4f7cdd51f8718785c32d817438e3d2b Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Fri, 29 May 2020 10:23:34 +0200 Subject: [PATCH 437/632] chg, output --- client/src/emv/test/cda_test.c | 10 ++++++---- client/src/emv/test/crypto_test.c | 16 ++++++---------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/client/src/emv/test/cda_test.c b/client/src/emv/test/cda_test.c index 4fe181d6a..acdde8bb4 100644 --- a/client/src/emv/test/cda_test.c +++ b/client/src/emv/test/cda_test.c @@ -123,6 +123,7 @@ const unsigned char c_ssd1[] = { 0x03, 0x8d, 0x0c, 0x91, 0x0a, 0x8a, 0x02, 0x95, 0x05, 0x9f, 0x37, 0x04, 0x9f, 0x4c, 0x08, 0x39, 0x00, }; + static const struct tlv ssd1_tlv = { .len = sizeof(c_ssd1), .value = c_ssd1, @@ -146,6 +147,7 @@ const unsigned char c_crm1[] = { 0x00, 0x00, 0x00, 0x06, 0x43, 0x14, 0x09, 0x25, 0x50, 0x12, 0x34, 0x57, 0x79, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x03, 0x00, }; + static const struct tlv crm1_tlv = { .len = sizeof(c_crm1), .value = c_crm1, @@ -420,16 +422,16 @@ static int cda_test_pk(bool verbose) { int exec_cda_test(bool verbose) { int ret = cda_test_raw(verbose); if (ret) { - PrintAndLogEx(WARNING, "CDA raw test: failed"); + PrintAndLogEx(WARNING, "CDA raw test: (%s)", _RED_("failed")); return ret; } - PrintAndLogEx(INFO, "CDA raw test: passed"); + PrintAndLogEx(INFO, "CDA raw test: (%s)", _GREEN_("passed")); ret = cda_test_pk(verbose); if (ret) { - PrintAndLogEx(WARNING, "CDA test pk: failed"); + PrintAndLogEx(WARNING, "CDA test pk: (%s)", _RED_("failed")); return ret; } - PrintAndLogEx(INFO, "CDA test pk: passed"); + PrintAndLogEx(INFO, "CDA test pk: (%s)", _GREEN_("passed")); return 0; } diff --git a/client/src/emv/test/crypto_test.c b/client/src/emv/test/crypto_test.c index 332b7dd87..e3b8124f0 100644 --- a/client/src/emv/test/crypto_test.c +++ b/client/src/emv/test/crypto_test.c @@ -304,31 +304,27 @@ close_pub: int exec_crypto_test(bool verbose, bool include_slow_tests) { unsigned int keylengths[] = {1024, 2048}; unsigned int extra_keylengths[] = {1152, 1408, 1984, 3072, 4096}; - int i; - int ret; - fprintf(stdout, "\n"); - - ret = test_pk(verbose); + int ret = test_pk(verbose); if (ret) { - PrintAndLogEx(WARNING, "Crypto raw test: failed"); + PrintAndLogEx(WARNING, "Crypto raw test: (%s)", _RED_("failed")); return ret; } PrintAndLogEx(SUCCESS, "Crypto raw test (%s)", _GREEN_("passed")); - for (i = 0; i < ARRAYLEN(keylengths); i++) { + for (int i = 0; i < ARRAYLEN(keylengths); i++) { unsigned int kl = keylengths[i]; ret = test_genkey(kl, message, kl / 8, verbose); if (ret) { - PrintAndLogEx(WARNING, "Crypto generate key[%u] test: failed", kl); + PrintAndLogEx(WARNING, "Crypto generate key[%u] test: (%s)", kl, _RED_("failed")); return ret; } } if (include_slow_tests) { - for (i = 0; i < ARRAYLEN(extra_keylengths); i++) { + for (int i = 0; i < ARRAYLEN(extra_keylengths); i++) { unsigned int kl = extra_keylengths[i]; ret = test_genkey(kl, message, kl / 8, verbose); if (ret) { - PrintAndLogEx(WARNING, "Crypto generate key[%u] test: failed", kl); + PrintAndLogEx(WARNING, "Crypto generate key[%u] test: (%s)", kl, _RED_("failed")); return ret; } } From dc1bf1408a1965549496ad0607ac82aa93897732 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Fri, 29 May 2020 10:34:28 +0200 Subject: [PATCH 438/632] chg, printf --- client/src/emv/crypto_polarssl.c | 52 ++++++++++++-------------------- 1 file changed, 19 insertions(+), 33 deletions(-) diff --git a/client/src/emv/crypto_polarssl.c b/client/src/emv/crypto_polarssl.c index 0d582c7b3..f9603ead5 100644 --- a/client/src/emv/crypto_polarssl.c +++ b/client/src/emv/crypto_polarssl.c @@ -20,11 +20,12 @@ #include "crypto_backend.h" -#include <stdlib.h> -#include <string.h> +#include <stdlib.h> // malloc +#include <string.h> // memset #include "rsa.h" #include "sha1.h" +#include "ui.h" // printandlog struct crypto_hash_polarssl { struct crypto_hash ch; @@ -33,19 +34,16 @@ struct crypto_hash_polarssl { static void crypto_hash_polarssl_close(struct crypto_hash *_ch) { struct crypto_hash_polarssl *ch = (struct crypto_hash_polarssl *)_ch; - free(ch); } static void crypto_hash_polarssl_write(struct crypto_hash *_ch, const unsigned char *buf, size_t len) { struct crypto_hash_polarssl *ch = (struct crypto_hash_polarssl *)_ch; - mbedtls_sha1_update(&(ch->ctx), buf, len); } static unsigned char *crypto_hash_polarssl_read(struct crypto_hash *_ch) { struct crypto_hash_polarssl *ch = (struct crypto_hash_polarssl *)_ch; - static unsigned char sha1sum[20]; mbedtls_sha1_finish(&(ch->ctx), sha1sum); return sha1sum; @@ -54,8 +52,7 @@ static unsigned char *crypto_hash_polarssl_read(struct crypto_hash *_ch) { static size_t crypto_hash_polarssl_get_size(const struct crypto_hash *ch) { if (ch->algo == HASH_SHA_1) return 20; - else - return 0; + return 0; } static struct crypto_hash *crypto_hash_polarssl_open(enum crypto_algo_hash hash) { @@ -96,7 +93,7 @@ static struct crypto_pk *crypto_pk_polarssl_open_rsa(va_list vl) { int res = mbedtls_rsa_check_pubkey(&cp->ctx); if (res != 0) { - fprintf(stderr, "PolarSSL public key error res=%x exp=%d mod=%d.\n", res * -1, explen, modlen); + PrintAndLogEx(WARNING, "PolarSSL public key error res=%x exp=%d mod=%d", res * -1, explen, modlen); free(cp); return NULL; } @@ -139,14 +136,14 @@ static struct crypto_pk *crypto_pk_polarssl_open_priv_rsa(va_list vl) { int res = mbedtls_mpi_inv_mod(&cp->ctx.QP, &cp->ctx.Q, &cp->ctx.P); if (res != 0) { - fprintf(stderr, "PolarSSL private key error res=%x exp=%d mod=%d.\n", res * -1, explen, modlen); + PrintAndLogEx(WARNING, "PolarSSL private key error res=%x exp=%d mod=%d", res * -1, explen, modlen); free(cp); return NULL; } res = mbedtls_rsa_check_privkey(&cp->ctx); if (res != 0) { - fprintf(stderr, "PolarSSL private key error res=%x exp=%d mod=%d.\n", res * -1, explen, modlen); + PrintAndLogEx(WARNING, "PolarSSL private key error res=%x exp=%d mod=%d", res * -1, explen, modlen); free(cp); return NULL; } @@ -164,7 +161,6 @@ static int myrand(void *rng_state, unsigned char *output, size_t len) { return 0; } - static struct crypto_pk *crypto_pk_polarssl_genkey_rsa(va_list vl) { struct crypto_pk_polarssl *cp = malloc(sizeof(*cp)); memset(cp, 0x00, sizeof(*cp)); @@ -178,7 +174,7 @@ static struct crypto_pk *crypto_pk_polarssl_genkey_rsa(va_list vl) { int res = mbedtls_rsa_gen_key(&cp->ctx, &myrand, NULL, nbits, exp); if (res) { - fprintf(stderr, "PolarSSL private key generation error res=%x exp=%u nbits=%u.\n", res * -1, exp, nbits); + PrintAndLogEx(WARNING, "PolarSSL private key generation error res=%x exp=%u nbits=%u", res * -1, exp, nbits); free(cp); return NULL; } @@ -195,59 +191,50 @@ static void crypto_pk_polarssl_close(struct crypto_pk *_cp) { static unsigned char *crypto_pk_polarssl_encrypt(const struct crypto_pk *_cp, const unsigned char *buf, size_t len, size_t *clen) { struct crypto_pk_polarssl *cp = (struct crypto_pk_polarssl *)_cp; - int res; - unsigned char *result; - *clen = 0; size_t keylen = mbedtls_mpi_size(&cp->ctx.N); - result = malloc(keylen); + unsigned char *result = malloc(keylen); if (!result) { - printf("RSA encrypt failed. Can't allocate result memory.\n"); + PrintAndLogEx(WARNING, "RSA encrypt failed. Can't allocate result memory"); return NULL; } - res = mbedtls_rsa_public(&cp->ctx, buf, result); + int res = mbedtls_rsa_public(&cp->ctx, buf, result); if (res) { - printf("RSA encrypt failed. Error: %x data len: %zu key len: %zu\n", res * -1, len, keylen); + PrintAndLogEx(WARNING, "RSA encrypt failed. Error: %x data len: %zu key len: %zu", res * -1, len, keylen); free(result); return NULL; } *clen = keylen; - return result; } static unsigned char *crypto_pk_polarssl_decrypt(const struct crypto_pk *_cp, const unsigned char *buf, size_t len, size_t *clen) { struct crypto_pk_polarssl *cp = (struct crypto_pk_polarssl *)_cp; - int res; - unsigned char *result; - *clen = 0; size_t keylen = mbedtls_mpi_size(&cp->ctx.N); - result = malloc(keylen); + unsigned char *result = malloc(keylen); if (!result) { - printf("RSA encrypt failed. Can't allocate result memory.\n"); + PrintAndLogEx(WARNING, "RSA encrypt failed. Can't allocate result memory"); return NULL; } - res = mbedtls_rsa_private(&cp->ctx, NULL, NULL, buf, result); // CHECK??? + int res = mbedtls_rsa_private(&cp->ctx, NULL, NULL, buf, result); // CHECK??? if (res) { - printf("RSA decrypt failed. Error: %x data len: %zu key len: %zu\n", res * -1, len, keylen); + PrintAndLogEx(WARNING, "RSA decrypt failed. Error: %x data len: %zu key len: %zu", res * -1, len, keylen); free(result); return NULL; } *clen = keylen; - return result; } static size_t crypto_pk_polarssl_get_nbits(const struct crypto_pk *_cp) { struct crypto_pk_polarssl *cp = (struct crypto_pk_polarssl *)_cp; - return cp->ctx.len * 8; } @@ -263,7 +250,7 @@ static unsigned char *crypto_pk_polarssl_get_parameter(const struct crypto_pk *_ memset(result, 0x00, *plen); res = mbedtls_mpi_write_binary(&cp->ctx.N, result, *plen); if (res < 0) { - printf("Error write_binary."); + PrintAndLogEx(WARNING, "Error write_binary"); free(result); result = 0; } @@ -275,16 +262,15 @@ static unsigned char *crypto_pk_polarssl_get_parameter(const struct crypto_pk *_ memset(result, 0x00, *plen); res = mbedtls_mpi_write_binary(&cp->ctx.E, result, *plen); if (res < 0) { - printf("Error write_binary."); + PrintAndLogEx(WARNING, "Error write_binary"); free(result); result = 0; } break; default: - printf("Error get parameter. Param = %u", param); + PrintAndLogEx(WARNING, "Error get parameter. Param = %u", param); break; } - return result; } From f1da47336e178078a74c879d30479254898661fe Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Fri, 29 May 2020 12:42:52 +0200 Subject: [PATCH 439/632] fix: 'emv scan -w' - calculats hash correct --- client/src/emv/cmdemv.c | 80 +++++++++++++++++++++++++++------------- client/src/emv/emvcore.c | 56 +++++++++++++--------------- 2 files changed, 81 insertions(+), 55 deletions(-) diff --git a/client/src/emv/cmdemv.c b/client/src/emv/cmdemv.c index 474b4224b..347c7916a 100644 --- a/client/src/emv/cmdemv.c +++ b/client/src/emv/cmdemv.c @@ -1368,6 +1368,8 @@ static int CmdEMVScan(const char *Cmd) { size_t AIDlen = 0; uint8_t buf[APDU_RES_LEN] = {0}; size_t len = 0; + uint8_t ODAI_list[4096]; + size_t ODAI_listlen = 0; uint16_t sw = 0; int res; json_t *root; @@ -1425,7 +1427,7 @@ static int CmdEMVScan(const char *Cmd) { if (!IfPm3Smartcard()) { if (channel == ECC_CONTACT) { - PrintAndLogEx(WARNING, "PM3 does not have SMARTCARD support. Exiting."); + PrintAndLogEx(WARNING, "PM3 does not have SMARTCARD support, exiting"); return PM3_EDEVNOTSUPP; } } @@ -1435,6 +1437,7 @@ static int CmdEMVScan(const char *Cmd) { // current path + file name if (!strstr(crelfname, ".json")) strcat(crelfname, ".json"); + char fname[strlen(get_my_executable_directory()) + strlen(crelfname) + 1]; strcpy(fname, get_my_executable_directory()); strcat(fname, crelfname); @@ -1447,7 +1450,7 @@ static int CmdEMVScan(const char *Cmd) { } if (!json_is_object(root)) { - PrintAndLogEx(ERR, "Invalid json format. root must be an object."); + PrintAndLogEx(ERR, "Invalid json format. root must be an object"); return PM3_EFILE; } } else { @@ -1461,7 +1464,7 @@ static int CmdEMVScan(const char *Cmd) { if (channel == ECC_CONTACTLESS) { // iso 14443 select - PrintAndLogEx(NORMAL, "--> GET UID, ATS."); + PrintAndLogEx(INFO, "GET UID, ATS"); iso14a_card_select_t card; if (Hf14443_4aGetCardData(&card)) { @@ -1474,7 +1477,7 @@ static int CmdEMVScan(const char *Cmd) { JsonSaveHex(root, "$.Card.Contactless.SAK", card.sak, 0); JsonSaveBufAsHex(root, "$.Card.Contactless.ATS", (uint8_t *)card.ats, card.ats_len); } else { - PrintAndLogEx(NORMAL, "--> GET ATR."); + PrintAndLogEx(INFO, "GET ATR"); smart_card_atr_t card; smart_select(true, &card); @@ -1492,7 +1495,7 @@ static int CmdEMVScan(const char *Cmd) { struct tlvdb *tlvSelect = tlvdb_fixed(1, strlen(al), (const unsigned char *)al); // EMV PPSE - PrintAndLogEx(NORMAL, "--> PPSE."); + PrintAndLogEx(INFO, "PPSE"); res = EMVSelectPSE(channel, true, true, 2, buf, sizeof(buf), &len, &sw); if (!res && sw == 0x9000) { @@ -1518,9 +1521,9 @@ static int CmdEMVScan(const char *Cmd) { } else { // EMV SEARCH with AID list SetAPDULogging(false); - PrintAndLogEx(NORMAL, "--> AID search."); + PrintAndLogEx(INFO, "AID search."); if (EMVSearch(channel, false, true, decodeTLV, tlvSelect)) { - PrintAndLogEx(ERR, "Can't found any of EMV AID. Exit..."); + PrintAndLogEx(ERR, "Can't found any of EMV AID, exiting..."); tlvdb_free(tlvSelect); DropFieldEx(channel); return PM3_ERFTRANS; @@ -1537,7 +1540,7 @@ static int CmdEMVScan(const char *Cmd) { tlvdb_free(tlvSelect); if (!AIDlen) { - PrintAndLogEx(INFO, "Can't select AID. EMV AID not found. Exit..."); + PrintAndLogEx(INFO, "Can't select AID. EMV AID not found, exiting..."); DropFieldEx(channel); return PM3_ERFTRANS; } @@ -1550,12 +1553,12 @@ static int CmdEMVScan(const char *Cmd) { // EMV SELECT applet - PrintAndLogEx(NORMAL, "\n-->Selecting AID:%s.", sprint_hex_inrow(AID, AIDlen)); + PrintAndLogEx(INFO, "Selecting AID: " _GREEN_("%s"), sprint_hex_inrow(AID, AIDlen)); SetAPDULogging(showAPDU); res = EMVSelect(channel, false, true, AID, AIDlen, buf, sizeof(buf), &len, &sw, tlvRoot); if (res) { - PrintAndLogEx(ERR, "Can't select AID (%d). Exit...", res); + PrintAndLogEx(ERR, "Can't select AID (%d), exiting...", res); tlvdb_free(tlvRoot); DropFieldEx(channel); return PM3_ERFTRANS; @@ -1577,13 +1580,13 @@ static int CmdEMVScan(const char *Cmd) { tlvdb_free(fci); // create transaction parameters - PrintAndLogEx(NORMAL, "-->Init transaction parameters."); + PrintAndLogEx(INFO, "Init transaction parameters"); InitTransactionParameters(tlvRoot, paramLoadJSON, TrType, GenACGPO); - PrintAndLogEx(NORMAL, "-->Calc PDOL."); + PrintAndLogEx(INFO, "Calc PDOL"); struct tlv *pdol_data_tlv = dol_process(tlvdb_get(tlvRoot, 0x9f38, NULL), tlvRoot, 0x83); if (!pdol_data_tlv) { - PrintAndLogEx(ERR, "Can't create PDOL TLV."); + PrintAndLogEx(ERR, "Can't create PDOL TLV"); tlvdb_free(tlvRoot); DropFieldEx(channel); return PM3_ESOFT; @@ -1592,7 +1595,7 @@ static int CmdEMVScan(const char *Cmd) { size_t pdol_data_tlv_data_len; unsigned char *pdol_data_tlv_data = tlv_encode(pdol_data_tlv, &pdol_data_tlv_data_len); if (!pdol_data_tlv_data) { - PrintAndLogEx(ERR, "Can't create PDOL data."); + PrintAndLogEx(ERR, "Can't create PDOL data"); tlvdb_free(tlvRoot); free(pdol_data_tlv); DropFieldEx(channel); @@ -1600,14 +1603,14 @@ static int CmdEMVScan(const char *Cmd) { } PrintAndLogEx(INFO, "PDOL data[%zu]: %s", pdol_data_tlv_data_len, sprint_hex(pdol_data_tlv_data, pdol_data_tlv_data_len)); - PrintAndLogEx(INFO, "-->GPO."); + PrintAndLogEx(INFO, "GPO"); res = EMVGPO(channel, true, pdol_data_tlv_data, pdol_data_tlv_data_len, buf, sizeof(buf), &len, &sw, tlvRoot); free(pdol_data_tlv_data); free(pdol_data_tlv); if (res) { - PrintAndLogEx(ERR, "GPO error(%d): %4x. Exit...", res, sw); + PrintAndLogEx(ERR, "GPO error(%d): %4x, exiting...", res, sw); tlvdb_free(tlvRoot); DropFieldEx(channel); return PM3_ERFTRANS; @@ -1625,7 +1628,7 @@ static int CmdEMVScan(const char *Cmd) { tlvdb_free(gpofci); - PrintAndLogEx(INFO, "-->Read records from AFL."); + PrintAndLogEx(INFO, "Read records from AFL"); const struct tlv *AFL = tlvdb_get(tlvRoot, 0x94, NULL); while (AFL && AFL->len) { @@ -1650,15 +1653,16 @@ static int CmdEMVScan(const char *Cmd) { uint8_t SFIstart = AFL->value[i * 4 + 1]; uint8_t SFIend = AFL->value[i * 4 + 2]; uint8_t SFIoffline = AFL->value[i * 4 + 3]; + bool first_time = SFIoffline; - PrintAndLogEx(INFO, "--->SFI[%02x] start:%02x end:%02x offline:%02x", SFI, SFIstart, SFIend, SFIoffline); + PrintAndLogEx(INFO, " SFI[%02x] start:%02x end:%02x offline:%02x", SFI, SFIstart, SFIend, SFIoffline); if (SFI == 0 || SFI == 31 || SFIstart == 0 || SFIstart > SFIend) { PrintAndLogEx(ERR, "SFI ERROR! Skipped..."); continue; } for (int n = SFIstart; n <= SFIend; n++) { - PrintAndLogEx(INFO, "---->SFI[%02x] %d", SFI, n); + PrintAndLogEx(INFO, " SFI[%02x] %d", SFI, n); res = EMVReadRecord(channel, true, SFI, n, buf, sizeof(buf), &len, &sw, tlvRoot); if (res) { @@ -1666,6 +1670,26 @@ static int CmdEMVScan(const char *Cmd) { continue; } + // Build Input list for Offline Data Authentication + // EMV 4.3 book3 10.3, page 96 + if (first_time && SFIoffline) { + if (SFI < 11) { + const unsigned char *abuf = buf; + size_t elmlen = len; + struct tlv e; + if (tlv_parse_tl(&abuf, &elmlen, &e)) { + memcpy(ODAI_list + ODAI_listlen, &buf[len - elmlen], elmlen); + ODAI_listlen += elmlen; + } else { + PrintAndLogEx(WARNING, "Error SFI[%02x]. Creating input list for Offline Data Authentication error", SFI); + } + } else { + memcpy(ODAI_list + ODAI_listlen, buf, len); + ODAI_listlen += len; + } + first_time = false; + } + if (decodeTLV) { TLVPrintFromBuffer(buf, len); PrintAndLogEx(NORMAL, ""); @@ -1683,16 +1707,23 @@ static int CmdEMVScan(const char *Cmd) { JsonSaveTLVTree(root, jsonelm, "$.Data", rsfi); else JsonSaveTLVTreeElm(jsonelm, "$.Data", rsfi, true, true, false); - tlvdb_free(rsfi); + + tlvdb_free(rsfi); } } - break; } + // copy Input list for Offline Data Authentication + if (ODAI_listlen) { + struct tlvdb *oda = tlvdb_fixed(0x21, ODAI_listlen, ODAI_list); // not a standard tag + tlvdb_add(tlvRoot, oda); + PrintAndLogEx(INFO, "Input list for Offline Data Authentication added to TLV [%d bytes]", ODAI_listlen); + } + // getting certificates if (tlvdb_get(tlvRoot, 0x90, NULL)) { - PrintAndLogEx(INFO, "-->Recovering certificates."); + PrintAndLogEx(INFO, "Recovering certificates"); PKISetStrictExecution(false); RecoveryCertificates(tlvRoot, root); PKISetStrictExecution(true); @@ -1712,7 +1743,6 @@ static int CmdEMVScan(const char *Cmd) { // free json object json_decref(root); - return PM3_SUCCESS; } @@ -1921,13 +1951,13 @@ static int CmdEMVRoca(const char *Cmd) { size_t elmlen = len; struct tlv e; if (tlv_parse_tl(&abuf, &elmlen, &e)) { - memcpy(&ODAI_list[ODAI_listlen], &buf[len - elmlen], elmlen); + memcpy(ODAI_list + ODAI_listlen, &buf[len - elmlen], elmlen); ODAI_listlen += elmlen; } else { PrintAndLogEx(WARNING, "Error SFI[%02x]. Creating input list for Offline Data Authentication error", SFI); } } else { - memcpy(&ODAI_list[ODAI_listlen], buf, len); + memcpy(ODAI_list + ODAI_listlen, buf, len); ODAI_listlen += len; } SFIoffline--; diff --git a/client/src/emv/emvcore.c b/client/src/emv/emvcore.c index f2244fa05..3d9d3702f 100644 --- a/client/src/emv/emvcore.c +++ b/client/src/emv/emvcore.c @@ -205,10 +205,10 @@ void TLVPrintAIDlistFromSelectTLV(struct tlvdb *tlv) { const struct tlv *tgPrio = tlvdb_get_inchild(ttmp, 0x87, NULL); if (!tgAID) break; - PrintAndLogEx(INFO, "|%s| %s |%s|", - sprint_hex_inrow_ex(tgAID->value, tgAID->len, 18), + PrintAndLogEx(INFO, "| %s| %s | %s|", + sprint_hex_inrow_ex(tgAID->value, tgAID->len, 17), (tgPrio) ? sprint_hex(tgPrio->value, 1) : " ", - (tgName) ? sprint_ascii_ex(tgName->value, tgName->len, 25) : " "); + (tgName) ? sprint_ascii_ex(tgName->value, tgName->len, 24) : " "); ttmp = tlvdb_find_next(ttmp, 0x6f); } @@ -387,7 +387,7 @@ static int EMVSelectWithRetry(EMVCommandChannel channel, bool ActivateField, boo } else { // card select error, proxmark error if (res == 1) { - PrintAndLogEx(WARNING, "Exit..."); + PrintAndLogEx(WARNING, "exiting..."); return 1; } @@ -551,7 +551,7 @@ int EMVSearch(EMVCommandChannel channel, bool ActivateField, bool LeaveFieldON, if (!LeaveFieldON) DropFieldEx(channel); - PrintAndLogEx(WARNING, "Exit..."); + PrintAndLogEx(WARNING, "exiting..."); return 1; } @@ -681,9 +681,9 @@ int trSDA(struct tlvdb *tlv) { } PrintAndLogEx(SUCCESS, "Issuer Public key recovered RID " _YELLOW_("%s") " IDX " _YELLOW_("%02hhx") " CSN " _YELLOW_("%s"), - sprint_hex(issuer_pk->rid, 5), - issuer_pk->index, - sprint_hex(issuer_pk->serial, 3) + sprint_hex(issuer_pk->rid, 5), + issuer_pk->index, + sprint_hex(issuer_pk->serial, 3) ); const struct tlv *sda_tlv = tlvdb_get(tlv, 0x21, NULL); @@ -740,9 +740,9 @@ int trDDA(EMVCommandChannel channel, bool decodeTLV, struct tlvdb *tlv) { } PrintAndLogEx(SUCCESS, "Issuer Public key recovered RID " _YELLOW_("%s") " IDX " _YELLOW_("%02hhx") " CSN " _YELLOW_("%s"), - sprint_hex(issuer_pk->rid, 5), - issuer_pk->index, - sprint_hex(issuer_pk->serial, 3) + sprint_hex(issuer_pk->rid, 5), + issuer_pk->index, + sprint_hex(issuer_pk->serial, 3) ); struct emv_pk *icc_pk = emv_pki_recover_icc_cert(issuer_pk, tlv, sda_tlv); @@ -762,7 +762,7 @@ int trDDA(EMVCommandChannel channel, bool decodeTLV, struct tlvdb *tlv) { if (tlvdb_get(tlv, 0x9f2d, NULL)) { struct emv_pk *icc_pe_pk = emv_pki_recover_icc_pe_cert(issuer_pk, tlv); if (!icc_pe_pk) { - PrintAndLogEx(WARNING, "WARNING: ICC PE PK recover error. "); + PrintAndLogEx(WARNING, "WARNING: ICC PE Public key recover error"); } else { PrintAndLogEx(SUCCESS, "ICC PE Public key recovered. RID " _YELLOW_("%s") " IDX " _YELLOW_("%02hhx") " CSN " _YELLOW_("%s"), sprint_hex(icc_pe_pk->rid, 5), @@ -947,9 +947,9 @@ int trCDA(struct tlvdb *tlv, struct tlvdb *ac_tlv, struct tlv *pdol_data_tlv, st } PrintAndLogEx(SUCCESS, "Issuer Public key recovered RID " _YELLOW_("%s") " IDX " _YELLOW_("%02hhx") " CSN " _YELLOW_("%s"), - sprint_hex(issuer_pk->rid, 5), - issuer_pk->index, - sprint_hex(issuer_pk->serial, 3) + sprint_hex(issuer_pk->rid, 5), + issuer_pk->index, + sprint_hex(issuer_pk->serial, 3) ); struct emv_pk *icc_pk = emv_pki_recover_icc_cert(issuer_pk, tlv, sda_tlv); @@ -1015,9 +1015,9 @@ int RecoveryCertificates(struct tlvdb *tlvRoot, json_t *root) { } PrintAndLogEx(SUCCESS, "Issuer Public key recovered RID " _YELLOW_("%s") " IDX " _YELLOW_("%02hhx") " CSN " _YELLOW_("%s"), - sprint_hex(issuer_pk->rid, 5), - issuer_pk->index, - sprint_hex(issuer_pk->serial, 3) + sprint_hex(issuer_pk->rid, 5), + issuer_pk->index, + sprint_hex(issuer_pk->serial, 3) ); JsonSaveBufAsHex(root, "$.ApplicationData.RID", issuer_pk->rid, 5); @@ -1027,24 +1027,20 @@ int RecoveryCertificates(struct tlvdb *tlvRoot, json_t *root) { JsonSaveBufAsHex(root, "$.ApplicationData.IssuerPublicKeyModulus", issuer_pk->modulus, issuer_pk->mlen); free(issuer_pk_c); - struct emv_pk *icc_pk = emv_pki_recover_icc_cert(issuer_pk, tlvRoot, NULL); + const struct tlv *sda_tlv = tlvdb_get(tlvRoot, 0x21, NULL); + struct emv_pk *icc_pk = emv_pki_recover_icc_cert(issuer_pk, tlvRoot, sda_tlv); if (!icc_pk) { emv_pk_free(pk); emv_pk_free(issuer_pk); PrintAndLogEx(WARNING, "WARNING: ICC certificate not found, exiting"); return 2; } - PrintAndLogEx(SUCCESS, "ICC PK recovered. RID %02hhx:%02hhx:%02hhx:%02hhx:%02hhx IDX %02hhx CSN %02hhx:%02hhx:%02hhx\n", - icc_pk->rid[0], - icc_pk->rid[1], - icc_pk->rid[2], - icc_pk->rid[3], - icc_pk->rid[4], - icc_pk->index, - icc_pk->serial[0], - icc_pk->serial[1], - icc_pk->serial[2] - ); + + PrintAndLogEx(SUCCESS, "ICC Public key recovered RID " _YELLOW_("%s") " IDX " _YELLOW_("%02hhx") " CSN " _YELLOW_("%s"), + sprint_hex(icc_pk->rid, 5), + icc_pk->index, + sprint_hex(icc_pk->serial, 3) + ); char *icc_pk_c = emv_pk_dump_pk(icc_pk); JsonSaveStr(root, "$.ApplicationData.ICCPublicKeyDec", icc_pk_c); From edc1f4d3251da4f47a52b480618f8f5744648237 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Fri, 29 May 2020 12:46:27 +0200 Subject: [PATCH 440/632] textual --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a70189b2..0068f1fdf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Fix `emv scan -w` - hash mismatch, solution similar to below (@iceman1001) + - Fix 'emv roca' - hash mismatch, merged from offical repo (@pwpiwi) - Add Python3 as possible script engine (@iceman1001, @doegox) - Add doc/mfu_binary_format_notes.md (@iceman1001) - Fix `hf mfu dump` - now reads Ulev1 3counter vs NTAG 1 counters (@iceman1001) From 11e34237bbf1d540a70149c891966797f0e29be4 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Fri, 29 May 2020 12:47:12 +0200 Subject: [PATCH 441/632] textual --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0068f1fdf..448c7e88f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac ## [unreleased][unreleased] - Fix `emv scan -w` - hash mismatch, solution similar to below (@iceman1001) - Fix 'emv roca' - hash mismatch, merged from offical repo (@pwpiwi) + - Fix 'lf ti demod' - now calculates correct crc (@iceman1001) - Add Python3 as possible script engine (@iceman1001, @doegox) - Add doc/mfu_binary_format_notes.md (@iceman1001) - Fix `hf mfu dump` - now reads Ulev1 3counter vs NTAG 1 counters (@iceman1001) From e3eb8b74015f39dbeaaab02ab81f8021228cbed5 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Sun, 31 May 2020 23:09:26 +0200 Subject: [PATCH 442/632] char* port for OpenProxmark and remove global gui_serial_port_name --- client/src/cmdhw.c | 2 +- client/src/comms.c | 26 ++++++++++---------------- client/src/comms.h | 6 ++---- client/src/proxguiqt.cpp | 4 ++-- 4 files changed, 15 insertions(+), 23 deletions(-) diff --git a/client/src/cmdhw.c b/client/src/cmdhw.c index 45e56ba49..487d5eb2b 100644 --- a/client/src/cmdhw.c +++ b/client/src/cmdhw.c @@ -580,7 +580,7 @@ static int CmdConnect(const char *Cmd) { // default back to previous used serial port if (strlen(port) == 0) { - if (strlen((char *)conn.serial_port_name) == 0) { + if (strlen(conn.serial_port_name) == 0) { return usage_hw_connect(); } memcpy(port, conn.serial_port_name, sizeof(port)); diff --git a/client/src/comms.c b/client/src/comms.c index 0a49e1f31..09e39696c 100644 --- a/client/src/comms.c +++ b/client/src/comms.c @@ -24,8 +24,6 @@ //#define COMMS_DEBUG //#define COMMS_DEBUG_RAW -uint8_t gui_serial_port_name[FILE_PATH_SIZE]; - // Serial port that we are communicating with the PM3 on. static serial_port sp = NULL; @@ -537,19 +535,18 @@ bool IsCommunicationThreadDead(void) { return ret; } -bool OpenProxmark(void *port, bool wait_for_port, int timeout, bool flash_mode, uint32_t speed) { +bool OpenProxmark(char *port, bool wait_for_port, int timeout, bool flash_mode, uint32_t speed) { - char *portname = (char *)port; if (!wait_for_port) { - PrintAndLogEx(INFO, "Using UART port " _YELLOW_("%s"), portname); - sp = uart_open(portname, speed); + PrintAndLogEx(INFO, "Using UART port " _YELLOW_("%s"), port); + sp = uart_open(port, speed); } else { - PrintAndLogEx(SUCCESS, "Waiting for Proxmark3 to appear on " _YELLOW_("%s"), portname); + PrintAndLogEx(SUCCESS, "Waiting for Proxmark3 to appear on " _YELLOW_("%s"), port); fflush(stdout); int openCount = 0; PrintAndLogEx(INPLACE, "% 3i", timeout); do { - sp = uart_open(portname, speed); + sp = uart_open(port, speed); msleep(500); PrintAndLogEx(INPLACE, "% 3i", timeout - openCount - 1); @@ -558,22 +555,19 @@ bool OpenProxmark(void *port, bool wait_for_port, int timeout, bool flash_mode, // check result of uart opening if (sp == INVALID_SERIAL_PORT) { - PrintAndLogEx(WARNING, "\n" _RED_("ERROR:") " invalid serial port " _YELLOW_("%s"), portname); + PrintAndLogEx(WARNING, "\n" _RED_("ERROR:") " invalid serial port " _YELLOW_("%s"), port); sp = NULL; return false; } else if (sp == CLAIMED_SERIAL_PORT) { - PrintAndLogEx(WARNING, "\n" _RED_("ERROR:") " serial port " _YELLOW_("%s") " is claimed by another process", portname); + PrintAndLogEx(WARNING, "\n" _RED_("ERROR:") " serial port " _YELLOW_("%s") " is claimed by another process", port); sp = NULL; return false; } else { // start the communication thread - if (portname != (char *)conn.serial_port_name) { - uint16_t len = MIN(strlen(portname), FILE_PATH_SIZE - 1); + if (port != conn.serial_port_name) { + uint16_t len = MIN(strlen(port), FILE_PATH_SIZE - 1); memset(conn.serial_port_name, 0, FILE_PATH_SIZE); - memcpy(conn.serial_port_name, portname, len); - - memset(gui_serial_port_name, 0, FILE_PATH_SIZE); - memcpy(gui_serial_port_name, portname, len); + memcpy(conn.serial_port_name, port, len); } conn.run = true; conn.block_after_ACK = flash_mode; diff --git a/client/src/comms.h b/client/src/comms.h index 42f5580a6..9fcf1b7a6 100644 --- a/client/src/comms.h +++ b/client/src/comms.h @@ -60,13 +60,11 @@ typedef struct { // To memorise baudrate uint32_t uart_speed; uint16_t last_command; - uint8_t serial_port_name[FILE_PATH_SIZE]; + char serial_port_name[FILE_PATH_SIZE]; } communication_arg_t; extern communication_arg_t conn; -extern uint8_t gui_serial_port_name[FILE_PATH_SIZE]; - void *uart_receiver(void *targ); void SendCommandBL(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *data, size_t len); void SendCommandOLD(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *data, size_t len); @@ -76,7 +74,7 @@ void clearCommandBuffer(void); #define FLASHMODE_SPEED 460800 bool IsCommunicationThreadDead(void); -bool OpenProxmark(void *port, bool wait_for_port, int timeout, bool flash_mode, uint32_t speed); +bool OpenProxmark(char *port, bool wait_for_port, int timeout, bool flash_mode, uint32_t speed); int TestProxmark(void); void CloseProxmark(void); diff --git a/client/src/proxguiqt.cpp b/client/src/proxguiqt.cpp index f3f49b9a0..7374982ea 100644 --- a/client/src/proxguiqt.cpp +++ b/client/src/proxguiqt.cpp @@ -233,7 +233,7 @@ ProxWidget::ProxWidget(QWidget *parent, ProxGuiQT *master) : QWidget(parent) { setLayout(layout); // plot window title - QString pt = QString("[*]Plot [ %1 ]").arg((char *)gui_serial_port_name); + QString pt = QString("[*]Plot [ %1 ]").arg(conn.serial_port_name); setWindowTitle(pt); // shows plot window on the screen. @@ -247,7 +247,7 @@ ProxWidget::ProxWidget(QWidget *parent, ProxGuiQT *master) : QWidget(parent) { } // Olverlays / slider window title - QString ct = QString("[*]Slider [ %1 ]").arg((char *)gui_serial_port_name); + QString ct = QString("[*]Slider [ %1 ]").arg(conn.serial_port_name); controlWidget->setWindowTitle(ct); controlWidget->show(); From ff1f945291172db7ce0b566df767d68a48a85531 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Mon, 1 Jun 2020 15:28:18 +0200 Subject: [PATCH 443/632] desfire_crypto: remove global vars --- client/src/mifare/desfire_crypto.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/client/src/mifare/desfire_crypto.c b/client/src/mifare/desfire_crypto.c index 6dd2de26d..8dba06ca1 100644 --- a/client/src/mifare/desfire_crypto.c +++ b/client/src/mifare/desfire_crypto.c @@ -36,10 +36,6 @@ #include "crc16.h" // crc16 ccitt #include "crc32.h" -mbedtls_des_context ctx; -mbedtls_des3_context ctx3; -mbedtls_aes_context actx; - #ifndef AddCrc14A # define AddCrc14A(data, len) compute_crc(CRC_14443_A, (data), (len), (data)+(len), (data)+(len)+1) #endif @@ -57,17 +53,20 @@ static inline void update_key_schedules(desfirekey_t key) { /******************************************************************************/ void des_encrypt(void *out, const void *in, const void *key) { + mbedtls_des_context ctx; mbedtls_des_setkey_enc(&ctx, key); mbedtls_des_crypt_ecb(&ctx, in, out); } void des_decrypt(void *out, const void *in, const void *key) { + mbedtls_des_context ctx; mbedtls_des_setkey_dec(&ctx, key); mbedtls_des_crypt_ecb(&ctx, in, out); } void tdes_nxp_receive(const void *in, void *out, size_t length, const void *key, unsigned char iv[8], int keymode) { if (length % 8) return; + mbedtls_des3_context ctx3; if (keymode == 2) mbedtls_des3_set2key_dec(&ctx3, key); else mbedtls_des3_set3key_dec(&ctx3, key); @@ -94,6 +93,7 @@ void tdes_nxp_receive(const void *in, void *out, size_t length, const void *key, void tdes_nxp_send(const void *in, void *out, size_t length, const void *key, unsigned char iv[8], int keymode) { if (length % 8) return; + mbedtls_des3_context ctx3; if (keymode == 2) mbedtls_des3_set2key_enc(&ctx3, key); else mbedtls_des3_set3key_enc(&ctx3, key); @@ -754,43 +754,52 @@ void mifare_cypher_single_block(desfirekey_t key, uint8_t *data, uint8_t *ivect, break; case T_3DES: switch (operation) { - case MCO_ENCYPHER: + case MCO_ENCYPHER: { + mbedtls_des3_context ctx3; mbedtls_des3_set2key_enc(&ctx3, key->data); mbedtls_des3_crypt_ecb(&ctx3, data, edata); // DES_ecb_encrypt ((DES_cblock *) data, (DES_cblock *) edata, &(key->ks1), DES_ENCRYPT); // DES_ecb_encrypt ((DES_cblock *) edata, (DES_cblock *) data, &(key->ks2), DES_DECRYPT); // DES_ecb_encrypt ((DES_cblock *) data, (DES_cblock *) edata, &(key->ks1), DES_ENCRYPT); break; - case MCO_DECYPHER: + } + case MCO_DECYPHER: { + mbedtls_des3_context ctx3; mbedtls_des3_set2key_dec(&ctx3, key->data); mbedtls_des3_crypt_ecb(&ctx3, data, edata); // DES_ecb_encrypt ((DES_cblock *) data, (DES_cblock *) edata, &(key->ks1), DES_DECRYPT); // DES_ecb_encrypt ((DES_cblock *) edata, (DES_cblock *) data, &(key->ks2), DES_ENCRYPT); // DES_ecb_encrypt ((DES_cblock *) data, (DES_cblock *) edata, &(key->ks1), DES_DECRYPT); break; + } } break; case T_3K3DES: switch (operation) { - case MCO_ENCYPHER: + case MCO_ENCYPHER: { + mbedtls_des3_context ctx3; mbedtls_des3_set3key_enc(&ctx3, key->data); mbedtls_des3_crypt_ecb(&ctx3, data, edata); // DES_ecb_encrypt ((DES_cblock *) data, (DES_cblock *) edata, &(key->ks1), DES_ENCRYPT); // DES_ecb_encrypt ((DES_cblock *) edata, (DES_cblock *) data, &(key->ks2), DES_DECRYPT); // DES_ecb_encrypt ((DES_cblock *) data, (DES_cblock *) edata, &(key->ks3), DES_ENCRYPT); break; - case MCO_DECYPHER: + } + case MCO_DECYPHER: { + mbedtls_des3_context ctx3; mbedtls_des3_set3key_dec(&ctx3, key->data); mbedtls_des3_crypt_ecb(&ctx3, data, edata); // DES_ecb_encrypt ((DES_cblock *) data, (DES_cblock *) edata, &(key->ks3), DES_DECRYPT); // DES_ecb_encrypt ((DES_cblock *) edata, (DES_cblock *) data, &(key->ks2), DES_ENCRYPT); // DES_ecb_encrypt ((DES_cblock *) data, (DES_cblock *) edata, &(key->ks1), DES_DECRYPT); break; + } } break; case T_AES: switch (operation) { case MCO_ENCYPHER: { + mbedtls_aes_context actx; mbedtls_aes_init(&actx); mbedtls_aes_setkey_enc(&actx, key->data, 128); mbedtls_aes_crypt_cbc(&actx, MBEDTLS_AES_ENCRYPT, sizeof(edata), ivect, data, edata); @@ -798,6 +807,7 @@ void mifare_cypher_single_block(desfirekey_t key, uint8_t *data, uint8_t *ivect, break; } case MCO_DECYPHER: { + mbedtls_aes_context actx; mbedtls_aes_init(&actx); mbedtls_aes_setkey_dec(&actx, key->data, 128); mbedtls_aes_crypt_cbc(&actx, MBEDTLS_AES_DECRYPT, sizeof(edata), ivect, edata, data); From 6326c4126c10daeb5d639e665ec23946776fc301 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Mon, 1 Jun 2020 17:30:33 +0200 Subject: [PATCH 444/632] cliparser: remove global vars --- client/deps/cliparser/cliparser.c | 79 ++++++------ client/deps/cliparser/cliparser.h | 26 ++-- client/src/cmddata.c | 9 +- client/src/cmdhf.c | 6 +- client/src/cmdhf14a.c | 34 ++--- client/src/cmdhffido.c | 62 ++++----- client/src/cmdhfmf.c | 59 +++++---- client/src/cmdhfmfdes.c | 208 ++++++++++++++++-------------- client/src/cmdhfmfp.c | 112 ++++++++-------- client/src/cmdhfmfu.c | 9 +- client/src/cmdlfindala.c | 9 +- client/src/cmdlfmotorola.c | 9 +- client/src/emv/cmdemv.c | 101 ++++++++------- 13 files changed, 393 insertions(+), 330 deletions(-) diff --git a/client/deps/cliparser/cliparser.c b/client/deps/cliparser/cliparser.c index 27b0ed050..c4795d870 100644 --- a/client/deps/cliparser/cliparser.c +++ b/client/deps/cliparser/cliparser.c @@ -10,50 +10,50 @@ #include "cliparser.h" #include <string.h> +#include <stdlib.h> -void **argtable = NULL; -size_t argtableLen = 0; -const char *programName = NULL; -const char *programHint = NULL; -const char *programHelp = NULL; -char buf[500] = {0}; - -int CLIParserInit(const char *vprogramName, const char *vprogramHint, const char *vprogramHelp) { - argtable = NULL; - argtableLen = 0; - programName = vprogramName; - programHint = vprogramHint; - programHelp = vprogramHelp; - memset(buf, 0x00, 500); +int CLIParserInit(CLIParserContext **ctx, const char *vprogramName, const char *vprogramHint, const char *vprogramHelp) { + *ctx = malloc(sizeof(CLIParserContext)); + if (!*ctx) { + printf("ERROR: Insufficient memory\n"); + fflush(stdout); + return 2; + } + (*ctx)->argtable = NULL; + (*ctx)->argtableLen = 0; + (*ctx)->programName = vprogramName; + (*ctx)->programHint = vprogramHint; + (*ctx)->programHelp = vprogramHelp; + memset((*ctx)->buf, 0x00, sizeof((*ctx)->buf)); return 0; } -int CLIParserParseArg(int argc, char **argv, void *vargtable[], size_t vargtableLen, bool allowEmptyExec) { +int CLIParserParseArg(CLIParserContext *ctx, int argc, char **argv, void *vargtable[], size_t vargtableLen, bool allowEmptyExec) { int nerrors; - argtable = vargtable; - argtableLen = vargtableLen; + ctx->argtable = vargtable; + ctx->argtableLen = vargtableLen; /* verify the argtable[] entries were allocated sucessfully */ - if (arg_nullcheck(argtable) != 0) { + if (arg_nullcheck(ctx->argtable) != 0) { /* NULL entries were detected, some allocations must have failed */ printf("ERROR: Insufficient memory\n"); fflush(stdout); return 2; } /* Parse the command line as defined by argtable[] */ - nerrors = arg_parse(argc, argv, argtable); + nerrors = arg_parse(argc, argv, ctx->argtable); /* special case: '--help' takes precedence over error reporting */ - if ((argc < 2 && !allowEmptyExec) || ((struct arg_lit *)argtable[0])->count > 0) { // help must be the first record - printf("Usage: %s", programName); - arg_print_syntaxv(stdout, argtable, "\n"); - if (programHint) - printf("%s\n\n", programHint); - arg_print_glossary(stdout, argtable, " %-20s %s\n"); + if ((argc < 2 && !allowEmptyExec) || ((struct arg_lit *)(ctx->argtable)[0])->count > 0) { // help must be the first record + printf("Usage: %s", ctx->programName); + arg_print_syntaxv(stdout, ctx->argtable, "\n"); + if (ctx->programHint) + printf("%s\n\n", ctx->programHint); + arg_print_glossary(stdout, ctx->argtable, " %-20s %s\n"); printf("\n"); - if (programHelp) - printf("%s \n", programHelp); + if (ctx->programHelp) + printf("%s \n", ctx->programHelp); fflush(stdout); return 1; @@ -62,8 +62,8 @@ int CLIParserParseArg(int argc, char **argv, void *vargtable[], size_t vargtable /* If the parser returned any errors then display them and exit */ if (nerrors > 0) { /* Display the error details contained in the arg_end struct.*/ - arg_print_errors(stdout, ((struct arg_end *)argtable[vargtableLen - 1]), programName); - printf("Try '%s --help' for more information.\n", programName); + arg_print_errors(stdout, ((struct arg_end *)(ctx->argtable)[vargtableLen - 1]), ctx->programName); + printf("Try '%s --help' for more information.\n", ctx->programName); fflush(stdout); return 3; } @@ -79,23 +79,25 @@ enum ParserState { #define isSpace(c)(c == ' ' || c == '\t') -int CLIParserParseString(const char *str, void *vargtable[], size_t vargtableLen, bool allowEmptyExec) { - return CLIParserParseStringEx(str, vargtable, vargtableLen, allowEmptyExec, false); +int CLIParserParseString(CLIParserContext *ctx, const char *str, void *vargtable[], size_t vargtableLen, bool allowEmptyExec) { + return CLIParserParseStringEx(ctx, str, vargtable, vargtableLen, allowEmptyExec, false); } -int CLIParserParseStringEx(const char *str, void *vargtable[], size_t vargtableLen, bool allowEmptyExec, bool clueData) { +int CLIParserParseStringEx(CLIParserContext *ctx, const char *str, void *vargtable[], size_t vargtableLen, bool allowEmptyExec, bool clueData) { int argc = 0; char *argv[200] = {NULL}; int len = strlen(str); + char buf[500] = {0}; + memset(ctx->buf, 0x00, 500); char *bufptr = buf; char *spaceptr = NULL; enum ParserState state = PS_FIRST; argv[argc++] = bufptr; // param0 = program name - memcpy(buf, programName, strlen(programName) + 1); // with 0x00 - bufptr += strlen(programName) + 1; + memcpy(buf, ctx->programName, strlen(ctx->programName) + 1); // with 0x00 + bufptr += strlen(ctx->programName) + 1; if (len) argv[argc++] = bufptr; @@ -140,13 +142,12 @@ int CLIParserParseStringEx(const char *str, void *vargtable[], size_t vargtableL } } - return CLIParserParseArg(argc, argv, vargtable, vargtableLen, allowEmptyExec); + return CLIParserParseArg(ctx, argc, argv, vargtable, vargtableLen, allowEmptyExec); } -void CLIParserFree(void) { - arg_freetable(argtable, argtableLen); - argtable = NULL; - +void CLIParserFree(CLIParserContext *ctx) { + arg_freetable(ctx->argtable, ctx->argtableLen); + free(ctx); return; } diff --git a/client/deps/cliparser/cliparser.h b/client/deps/cliparser/cliparser.h index 866ee07d6..b0000f77b 100644 --- a/client/deps/cliparser/cliparser.h +++ b/client/deps/cliparser/cliparser.h @@ -27,16 +27,24 @@ #define arg_strx1(shortopts, longopts, datatype, glossary) (arg_strn((shortopts), (longopts), (datatype), 1, 250, (glossary))) #define arg_strx0(shortopts, longopts, datatype, glossary) (arg_strn((shortopts), (longopts), (datatype), 0, 250, (glossary))) -#define CLIExecWithReturn(cmd, atbl, ifempty) if (CLIParserParseString(cmd, atbl, arg_getsize(atbl), ifempty)){CLIParserFree();return PM3_ESOFT;} -#define CLIGetHexBLessWithReturn(paramnum, data, datalen, delta) if (CLIParamHexToBuf(arg_get_str(paramnum), data, sizeof(data) - (delta), datalen)) {CLIParserFree();return PM3_ESOFT;} -#define CLIGetHexWithReturn(paramnum, data, datalen) if (CLIParamHexToBuf(arg_get_str(paramnum), data, sizeof(data), datalen)) {CLIParserFree();return PM3_ESOFT;} -#define CLIGetStrWithReturn(paramnum, data, datalen) if (CLIParamStrToBuf(arg_get_str(paramnum), data, sizeof(data), datalen)) {CLIParserFree();return PM3_ESOFT;} +#define CLIExecWithReturn(ctx, cmd, atbl, ifempty) if (CLIParserParseString(ctx, cmd, atbl, arg_getsize(atbl), ifempty)){CLIParserFree(ctx);return PM3_ESOFT;} +#define CLIGetHexBLessWithReturn(ctx, paramnum, data, datalen, delta) if (CLIParamHexToBuf(arg_get_str(paramnum), data, sizeof(data) - (delta), datalen)) {CLIParserFree(ctx);return PM3_ESOFT;} +#define CLIGetHexWithReturn(ctx, paramnum, data, datalen) if (CLIParamHexToBuf(arg_get_str(paramnum), data, sizeof(data), datalen)) {CLIParserFree(ctx);return PM3_ESOFT;} +#define CLIGetStrWithReturn(ctx, paramnum, data, datalen) if (CLIParamStrToBuf(arg_get_str(paramnum), data, sizeof(data), datalen)) {CLIParserFree(ctx);return PM3_ESOFT;} -int CLIParserInit(const char *vprogramName, const char *vprogramHint, const char *vprogramHelp); -int CLIParserParseString(const char *str, void *vargtable[], size_t vargtableLen, bool allowEmptyExec); -int CLIParserParseStringEx(const char *str, void *vargtable[], size_t vargtableLen, bool allowEmptyExec, bool clueData); -int CLIParserParseArg(int argc, char **argv, void *vargtable[], size_t vargtableLen, bool allowEmptyExec); -void CLIParserFree(void); +typedef struct { + void **argtable; + size_t argtableLen; + const char *programName; + const char *programHint; + const char *programHelp; + char buf[500]; +} CLIParserContext; +int CLIParserInit(CLIParserContext **context, const char *vprogramName, const char *vprogramHint, const char *vprogramHelp); +int CLIParserParseString(CLIParserContext *context, const char *str, void *vargtable[], size_t vargtableLen, bool allowEmptyExec); +int CLIParserParseStringEx(CLIParserContext *context, const char *str, void *vargtable[], size_t vargtableLen, bool allowEmptyExec, bool clueData); +int CLIParserParseArg(CLIParserContext *context, int argc, char **argv, void *vargtable[], size_t vargtableLen, bool allowEmptyExec); +void CLIParserFree(CLIParserContext *context); int CLIParamHexToBuf(struct arg_str *argstr, uint8_t *data, int maxdatalen, int *datalen); int CLIParamStrToBuf(struct arg_str *argstr, uint8_t *data, int maxdatalen, int *datalen); diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 5aba8e537..326e0d457 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -2292,7 +2292,8 @@ static int CmdDataNDEF(const char *Cmd) { #define MAX_NDEF_LEN 2048 #endif - CLIParserInit("data ndef", + CLIParserContext *ctx; + CLIParserInit(&ctx, "data ndef", "Prints NFC Data Exchange Format (NDEF)", "Usage:\n\tdata ndef -d 9101085402656e48656c6c6f5101085402656e576f726c64\n"); @@ -2301,12 +2302,12 @@ static int CmdDataNDEF(const char *Cmd) { arg_strx0("dD", "data", "<hex>", "NDEF data to decode"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); int datalen = 0; uint8_t data[MAX_NDEF_LEN] = {0}; - CLIGetHexWithReturn(1, data, &datalen); - CLIParserFree(); + CLIGetHexWithReturn(ctx, 1, data, &datalen); + CLIParserFree(ctx); if (datalen == 0) return PM3_EINVARG; diff --git a/client/src/cmdhf.c b/client/src/cmdhf.c index ff2a5e79f..6b11a30da 100644 --- a/client/src/cmdhf.c +++ b/client/src/cmdhf.c @@ -254,7 +254,8 @@ int CmdHFSniff(const char *Cmd) { } int CmdHFPlot(const char *Cmd) { - CLIParserInit("hf plot", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf plot", "Plots HF signal after RF signal path and A/D conversion.", "This can be used after any hf command and will show the last few milliseconds of the HF signal.\n" "Note: If the last hf command terminated because of a timeout you will most probably see nothing.\n"); @@ -262,7 +263,8 @@ int CmdHFPlot(const char *Cmd) { arg_param_begin, arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); + CLIParserFree(ctx); uint8_t buf[FPGA_TRACE_SIZE]; diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index 5f1ec7b18..500406439 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -364,7 +364,8 @@ static int CmdHF14AInfo(const char *Cmd) { bool do_nack_test = false; bool do_aid_search = false; - CLIParserInit("hf 14a info", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf 14a info", "This command makes more extensive tests against a ISO14443a tag in order to collect information", "Sample:\n\thf 14a info -nsv - shows full information about the card\n"); @@ -375,13 +376,13 @@ static int CmdHF14AInfo(const char *Cmd) { arg_lit0("sS", "aidsearch", "checks if AIDs from aidlist.json is present on the card and prints information about found AIDs"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); verbose = arg_get_lit(1); do_nack_test = arg_get_lit(2); do_aid_search = arg_get_lit(3); - CLIParserFree(); + CLIParserFree(ctx); infoHF14A(verbose, do_nack_test, do_aid_search); return 0; @@ -878,7 +879,8 @@ static int CmdHF14AAPDU(const char *Cmd) { bool extendedAPDU = false; int le = 0; - CLIParserInit("hf 14a apdu", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf 14a apdu", "Sends an ISO 7816-4 APDU via ISO 14443-4 block transmission protocol (T=CL). works with all apdu types from ISO 7816-4:2013", "Sample:\n\thf 14a apdu -st 00A404000E325041592E5359532E444446303100\n" "\thf 14a apdu -sd 00A404000E325041592E5359532E444446303100 - decode apdu\n" @@ -897,14 +899,14 @@ static int CmdHF14AAPDU(const char *Cmd) { arg_strx1(NULL, NULL, "<APDU (hex) | data (hex)>", "data if `m` parameter included"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, false); + CLIExecWithReturn(ctx, Cmd, argtable, false); activateField = arg_get_lit(1); leaveSignalON = arg_get_lit(2); decodeTLV = arg_get_lit(3); decodeAPDU = arg_get_lit(4); - CLIGetHexWithReturn(5, header, &headerlen); + CLIGetHexWithReturn(ctx, 5, header, &headerlen); makeAPDU = headerlen > 0; if (makeAPDU && headerlen != 4) { PrintAndLogEx(ERR, "header length must be 4 bytes instead of %d", headerlen); @@ -917,7 +919,7 @@ static int CmdHF14AAPDU(const char *Cmd) { uint8_t apdudata[PM3_CMD_DATA_SIZE] = {0}; int apdudatalen = 0; - CLIGetHexBLessWithReturn(8, apdudata, &apdudatalen, 1 + 2); + CLIGetHexBLessWithReturn(ctx, 8, apdudata, &apdudatalen, 1 + 2); APDUStruct apdu; apdu.cla = header[0]; @@ -947,10 +949,10 @@ static int CmdHF14AAPDU(const char *Cmd) { } // len = data + PCB(1b) + CRC(2b) - CLIGetHexBLessWithReturn(8, data, &datalen, 1 + 2); + CLIGetHexBLessWithReturn(ctx, 8, data, &datalen, 1 + 2); } - CLIParserFree(); + CLIParserFree(ctx); PrintAndLogEx(NORMAL, ">>>>[%s%s%s] %s", activateField ? "sel " : "", leaveSignalON ? "keep " : "", decodeTLV ? "TLV" : "", sprint_hex(data, datalen)); if (decodeAPDU) { @@ -1162,7 +1164,8 @@ static int waitCmd(uint8_t iSelect) { static int CmdHF14AAntiFuzz(const char *Cmd) { - CLIParserInit("hf 14a antifuzz", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf 14a antifuzz", "Tries to fuzz the ISO14443a anticollision phase", "Usage:\n" "\thf 14a antifuzz -4\n"); @@ -1174,7 +1177,7 @@ static int CmdHF14AAntiFuzz(const char *Cmd) { arg_lit0(NULL, "10", "10 byte uid"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, false); + CLIExecWithReturn(ctx, Cmd, argtable, false); uint8_t arg0 = FLAG_4B_UID_IN_DATA; if (arg_get_lit(2)) @@ -1182,7 +1185,7 @@ static int CmdHF14AAntiFuzz(const char *Cmd) { if (arg_get_lit(3)) arg0 = FLAG_10B_UID_IN_DATA; - CLIParserFree(); + CLIParserFree(ctx); clearCommandBuffer(); SendCommandMIX(CMD_HF_ISO14443A_ANTIFUZZ, arg0, 0, 0, NULL, 0); return 0; @@ -1190,7 +1193,8 @@ static int CmdHF14AAntiFuzz(const char *Cmd) { static int CmdHF14AChaining(const char *Cmd) { - CLIParserInit("hf 14a chaining", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf 14a chaining", "Enable/Disable ISO14443a input chaining. Maximum input length goes from ATS.", "Usage:\n" "\thf 14a chaining disable -> disable chaining\n" @@ -1201,7 +1205,7 @@ static int CmdHF14AChaining(const char *Cmd) { arg_str0(NULL, NULL, "<enable/disable or 0/1>", NULL), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); struct arg_str *str = arg_get_str(1); int len = arg_get_str_len(1); @@ -1212,7 +1216,7 @@ static int CmdHF14AChaining(const char *Cmd) { if (len && (!strcmp(str->sval[0], "disable") || !strcmp(str->sval[0], "0"))) APDUInFramingEnable = false; - CLIParserFree(); + CLIParserFree(ctx); PrintAndLogEx(INFO, "\nISO 14443-4 input chaining %s.\n", APDUInFramingEnable ? "enabled" : "disabled"); diff --git a/client/src/cmdhffido.c b/client/src/cmdhffido.c index 991d7eb5d..22b855e95 100644 --- a/client/src/cmdhffido.c +++ b/client/src/cmdhffido.c @@ -110,7 +110,7 @@ static int CmdHFFidoInfo(const char *cmd) { return 0; } -static json_t *OpenJson(int paramnum, char *fname, void *argtable[], bool *err) { +static json_t *OpenJson(CLIParserContext *ctx, int paramnum, char *fname, void *argtable[], bool *err) { json_t *root = NULL; json_error_t error; *err = false; @@ -119,9 +119,9 @@ static json_t *OpenJson(int paramnum, char *fname, void *argtable[], bool *err) char *cjsonname = (char *)jsonname; int jsonnamelen = 0; - // CLIGetStrWithReturn(paramnum, jsonname, &jsonnamelen); + // CLIGetStrWithReturn(ctx, paramnum, jsonname, &jsonnamelen); if (CLIParamStrToBuf(arg_get_str(paramnum), jsonname, sizeof(jsonname), &jsonnamelen)) { - CLIParserFree(); + CLIParserFree(ctx); return NULL; } @@ -162,7 +162,8 @@ static int CmdHFFidoRegister(const char *cmd) { uint8_t adata[250] = {0}; json_t *root = NULL; - CLIParserInit("hf fido reg", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf fido reg", "Initiate a U2F token registration. Needs two 32-byte hash numbers. \nchallenge parameter (32b) and application parameter (32b).", "Usage:\n\thf fido reg -> execute command with 2 parameters, filled 0x00\n" "\thf fido reg 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f -> execute command with parameters" @@ -179,7 +180,7 @@ static int CmdHFFidoRegister(const char *cmd) { arg_str0(NULL, NULL, "<HEX/ASCII application parameter (32b HEX/1..16 chars)>", NULL), arg_param_end }; - CLIExecWithReturn(cmd, argtable, true); + CLIExecWithReturn(ctx, cmd, argtable, true); bool APDULogging = arg_get_lit(1); bool verbose = arg_get_lit(2); @@ -189,7 +190,7 @@ static int CmdHFFidoRegister(const char *cmd) { char fname[250] = {0}; bool err; - root = OpenJson(5, fname, argtable, &err); + root = OpenJson(ctx, 5, fname, argtable, &err); if (err) return 1; if (root) { @@ -200,13 +201,13 @@ static int CmdHFFidoRegister(const char *cmd) { if (paramsPlain) { memset(cdata, 0x00, 32); - CLIGetStrWithReturn(6, cdata, &chlen); + CLIGetStrWithReturn(ctx, 6, cdata, &chlen); if (chlen > 16) { PrintAndLogEx(ERR, "ERROR: challenge parameter length in ASCII mode must be less than 16 chars instead of: %d", chlen); return 1; } } else { - CLIGetHexWithReturn(6, cdata, &chlen); + CLIGetHexWithReturn(ctx, 6, cdata, &chlen); if (chlen && chlen != 32) { PrintAndLogEx(ERR, "ERROR: challenge parameter length must be 32 bytes only."); return 1; @@ -218,13 +219,13 @@ static int CmdHFFidoRegister(const char *cmd) { if (paramsPlain) { memset(adata, 0x00, 32); - CLIGetStrWithReturn(7, adata, &applen); + CLIGetStrWithReturn(ctx, 7, adata, &applen); if (applen > 16) { PrintAndLogEx(ERR, "ERROR: application parameter length in ASCII mode must be less than 16 chars instead of: %d", applen); return 1; } } else { - CLIGetHexWithReturn(7, adata, &applen); + CLIGetHexWithReturn(ctx, 7, adata, &applen); if (applen && applen != 32) { PrintAndLogEx(ERR, "ERROR: application parameter length must be 32 bytes only."); return 1; @@ -233,7 +234,7 @@ static int CmdHFFidoRegister(const char *cmd) { if (applen) memmove(&data[32], adata, 32); - CLIParserFree(); + CLIParserFree(ctx); SetAPDULogging(APDULogging); @@ -393,7 +394,8 @@ static int CmdHFFidoAuthenticate(const char *cmd) { uint8_t keyHandleLen = 0; json_t *root = NULL; - CLIParserInit("hf fido auth", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf fido auth", "Initiate a U2F token authentication. Needs key handle and two 32-byte hash numbers. \nkey handle(var 0..255), challenge parameter (32b) and application parameter (32b).", "Usage:\n\thf fido auth 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f -> execute command with 2 parameters, filled 0x00 and key handle\n" "\thf fido auth 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f " @@ -414,7 +416,7 @@ static int CmdHFFidoAuthenticate(const char *cmd) { arg_str0(NULL, NULL, "<HEX/ASCII application parameter (32b HEX/1..16 chars)>", NULL), arg_param_end }; - CLIExecWithReturn(cmd, argtable, true); + CLIExecWithReturn(ctx, cmd, argtable, true); bool APDULogging = arg_get_lit(1); bool verbose = arg_get_lit(2); @@ -427,7 +429,7 @@ static int CmdHFFidoAuthenticate(const char *cmd) { char fname[250] = {0}; bool err; - root = OpenJson(7, fname, argtable, &err); + root = OpenJson(ctx, 7, fname, argtable, &err); if (err) return 1; if (root) { @@ -442,7 +444,7 @@ static int CmdHFFidoAuthenticate(const char *cmd) { } // public key - CLIGetHexWithReturn(8, hdata, &hdatalen); + CLIGetHexWithReturn(ctx, 8, hdata, &hdatalen); if (hdatalen && hdatalen != 65) { PrintAndLogEx(ERR, "ERROR: public key length must be 65 bytes only."); return 1; @@ -452,7 +454,7 @@ static int CmdHFFidoAuthenticate(const char *cmd) { public_key_loaded = true; } - CLIGetHexWithReturn(9, hdata, &hdatalen); + CLIGetHexWithReturn(ctx, 9, hdata, &hdatalen); if (hdatalen > 255) { PrintAndLogEx(ERR, "ERROR: application parameter length must be less than 255."); return 1; @@ -465,13 +467,13 @@ static int CmdHFFidoAuthenticate(const char *cmd) { if (paramsPlain) { memset(hdata, 0x00, 32); - CLIGetStrWithReturn(9, hdata, &hdatalen); + CLIGetStrWithReturn(ctx, 9, hdata, &hdatalen); if (hdatalen > 16) { PrintAndLogEx(ERR, "ERROR: challenge parameter length in ASCII mode must be less than 16 chars instead of: %d", hdatalen); return 1; } } else { - CLIGetHexWithReturn(10, hdata, &hdatalen); + CLIGetHexWithReturn(ctx, 10, hdata, &hdatalen); if (hdatalen && hdatalen != 32) { PrintAndLogEx(ERR, "ERROR: challenge parameter length must be 32 bytes only."); return 1; @@ -482,13 +484,13 @@ static int CmdHFFidoAuthenticate(const char *cmd) { if (paramsPlain) { memset(hdata, 0x00, 32); - CLIGetStrWithReturn(11, hdata, &hdatalen); + CLIGetStrWithReturn(ctx, 11, hdata, &hdatalen); if (hdatalen > 16) { PrintAndLogEx(ERR, "ERROR: application parameter length in ASCII mode must be less than 16 chars instead of: %d", hdatalen); return 1; } } else { - CLIGetHexWithReturn(10, hdata, &hdatalen); + CLIGetHexWithReturn(ctx, 10, hdata, &hdatalen); if (hdatalen && hdatalen != 32) { PrintAndLogEx(ERR, "ERROR: application parameter length must be 32 bytes only."); return 1; @@ -497,7 +499,7 @@ static int CmdHFFidoAuthenticate(const char *cmd) { if (hdatalen) memmove(&data[32], hdata, 32); - CLIParserFree(); + CLIParserFree(ctx); SetAPDULogging(APDULogging); @@ -641,7 +643,8 @@ static int CmdHFFido2MakeCredential(const char *cmd) { json_t *root = NULL; char fname[300] = {0}; - CLIParserInit("hf fido make", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf fido make", "Execute a FIDO2 Make Credential command. Needs json file with parameters. Sample file " _YELLOW_("`fido2.json`") " in `resources/`.", "Usage:\n\thf fido make -> execute command with default parameters file `fido2.json`\n" "\thf fido make test.json -> execute command with parameters file `text.json`"); @@ -655,7 +658,7 @@ static int CmdHFFido2MakeCredential(const char *cmd) { arg_str0(NULL, NULL, "<json file name>", "JSON input / output file name for parameters. Default `fido2.json`"), arg_param_end }; - CLIExecWithReturn(cmd, argtable, true); + CLIExecWithReturn(ctx, cmd, argtable, true); bool APDULogging = arg_get_lit(1); bool verbose = arg_get_lit(2); @@ -666,14 +669,14 @@ static int CmdHFFido2MakeCredential(const char *cmd) { uint8_t jsonname[250] = {0}; char *cjsonname = (char *)jsonname; int jsonnamelen = 0; - CLIGetStrWithReturn(5, jsonname, &jsonnamelen); + CLIGetStrWithReturn(ctx, 5, jsonname, &jsonnamelen); if (!jsonnamelen) { strcat(cjsonname, "fido2"); jsonnamelen = strlen(cjsonname); } - CLIParserFree(); + CLIParserFree(ctx); SetAPDULogging(APDULogging); @@ -767,7 +770,8 @@ static int CmdHFFido2GetAssertion(const char *cmd) { json_t *root = NULL; char fname[300] = {0}; - CLIParserInit("hf fido assert", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf fido assert", "Execute a FIDO2 Get Assertion command. Needs json file with parameters. Sample file " _YELLOW_("`fido2.json`") " in `resources/`.", "Usage:\n\thf fido assert -> execute command with default parameters file `fido2.json`\n" "\thf fido assert test.json -l -> execute command with parameters file `text.json` and add to request CredentialId"); @@ -781,7 +785,7 @@ static int CmdHFFido2GetAssertion(const char *cmd) { arg_str0(NULL, NULL, "<json file name>", "JSON input / output file name for parameters. Default `fido2.json`"), arg_param_end }; - CLIExecWithReturn(cmd, argtable, true); + CLIExecWithReturn(ctx, cmd, argtable, true); bool APDULogging = arg_get_lit(1); bool verbose = arg_get_lit(2); @@ -792,14 +796,14 @@ static int CmdHFFido2GetAssertion(const char *cmd) { uint8_t jsonname[250] = {0}; char *cjsonname = (char *)jsonname; int jsonnamelen = 0; - CLIGetStrWithReturn(5, jsonname, &jsonnamelen); + CLIGetStrWithReturn(ctx, 5, jsonname, &jsonnamelen); if (!jsonnamelen) { strcat(cjsonname, "fido2"); jsonnamelen = strlen(cjsonname); } - CLIParserFree(); + CLIParserFree(ctx); SetAPDULogging(APDULogging); diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 2257a3172..062f22c06 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -4025,7 +4025,8 @@ static int CmdHF14AMfCWipe(const char *cmd) { uint8_t sak[1] = {0x00}; int sakLen = 0; - CLIParserInit("hf mf cwipe", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mf cwipe", "Wipe gen1 magic chinese card. Set UID/ATQA/SAK/Data/Keys/Access to default values.", "Usage:\n\thf mf cwipe -> wipe card.\n" "\thf mf cwipe -u 09080706 -a 0004 -s 18 -- set UID, ATQA and SAK and wipe card."); @@ -4037,12 +4038,12 @@ static int CmdHF14AMfCWipe(const char *cmd) { arg_str0("sS", "sak", "<SAK (hex 1b)>", "SAK for card"), arg_param_end }; - CLIExecWithReturn(cmd, argtable, true); + CLIExecWithReturn(ctx, cmd, argtable, true); - CLIGetHexWithReturn(1, uid, &uidLen); - CLIGetHexWithReturn(2, atqa, &atqaLen); - CLIGetHexWithReturn(3, sak, &sakLen); - CLIParserFree(); + CLIGetHexWithReturn(ctx, 1, uid, &uidLen); + CLIGetHexWithReturn(ctx, 2, atqa, &atqaLen); + CLIGetHexWithReturn(ctx, 3, sak, &sakLen); + CLIParserFree(ctx); if (uidLen && uidLen != 4) { PrintAndLogEx(ERR, "UID length must be 4 bytes instead of: %d", uidLen); @@ -4611,7 +4612,8 @@ static int CmdHF14AMfAuth4(const char *Cmd) { uint8_t key[16] = {0}; int keylen = 0; - CLIParserInit("hf mf auth4", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mf auth4", "Executes AES authentication command in ISO14443-4", "Usage:\n\thf mf auth4 4000 000102030405060708090a0b0c0d0e0f -> executes authentication\n" "\thf mf auth4 9003 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -> executes authentication\n"); @@ -4622,11 +4624,11 @@ static int CmdHF14AMfAuth4(const char *Cmd) { arg_str1(NULL, NULL, "<Key Value (HEX 16 bytes)>", NULL), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); - CLIGetHexWithReturn(1, keyn, &keynlen); - CLIGetHexWithReturn(2, key, &keylen); - CLIParserFree(); + CLIGetHexWithReturn(ctx, 1, keyn, &keynlen); + CLIGetHexWithReturn(ctx, 2, key, &keylen); + CLIParserFree(ctx); if (keynlen != 2) { PrintAndLogEx(ERR, "<Key Num> must be 2 bytes long instead of: %d", keynlen); @@ -4644,7 +4646,8 @@ static int CmdHF14AMfAuth4(const char *Cmd) { // https://www.nxp.com/docs/en/application-note/AN10787.pdf static int CmdHF14AMfMAD(const char *Cmd) { - CLIParserInit("hf mf mad", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mf mad", "Checks and prints Mifare Application Directory (MAD)", "Usage:\n\thf mf mad -> shows MAD if exists\n" "\thf mf mad -a 03e1 -k ffffffffffff -b -> shows NDEF data if exists. read card with custom key and key B\n"); @@ -4657,17 +4660,17 @@ static int CmdHF14AMfMAD(const char *Cmd) { arg_lit0("bB", "keyb", "use key B for access printing sectors (by default: key A)"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); bool verbose = arg_get_lit(1); uint8_t aid[2] = {0}; int aidlen; - CLIGetHexWithReturn(2, aid, &aidlen); + CLIGetHexWithReturn(ctx, 2, aid, &aidlen); uint8_t key[6] = {0}; int keylen; - CLIGetHexWithReturn(3, key, &keylen); + CLIGetHexWithReturn(ctx, 3, key, &keylen); bool keyB = arg_get_lit(4); - CLIParserFree(); + CLIParserFree(ctx); if (aidlen != 2 && keylen > 0) { PrintAndLogEx(WARNING, "do not need a key without aid."); @@ -4734,7 +4737,8 @@ static int CmdHF14AMfMAD(const char *Cmd) { static int CmdHFMFNDEF(const char *Cmd) { - CLIParserInit("hf mf ndef", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mf ndef", "Prints NFC Data Exchange Format (NDEF)", "Usage:\n\thf mf ndef -> shows NDEF data\n" "\thf mf ndef -a 03e1 -k ffffffffffff -b -> shows NDEF data with custom AID, key and with key B\n"); @@ -4747,19 +4751,19 @@ static int CmdHFMFNDEF(const char *Cmd) { arg_lit0("bB", "keyb", "use key B for access sectors (by default: key A)"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); bool verbose = arg_get_lit(1); bool verbose2 = arg_get_lit(1) > 1; uint8_t aid[2] = {0}; int aidlen; - CLIGetHexWithReturn(2, aid, &aidlen); + CLIGetHexWithReturn(ctx, 2, aid, &aidlen); uint8_t key[6] = {0}; int keylen; - CLIGetHexWithReturn(3, key, &keylen); + CLIGetHexWithReturn(ctx, 3, key, &keylen); bool keyB = arg_get_lit(4); - CLIParserFree(); + CLIParserFree(ctx); uint16_t ndefAID = 0x03e1; if (aidlen == 2) @@ -4838,7 +4842,8 @@ static int CmdHFMFNDEF(const char *Cmd) { static int CmdHFMFPersonalize(const char *cmd) { - CLIParserInit("hf mf personalize", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mf personalize", "Personalize the UID of a Mifare Classic EV1 card. This is only possible if it is a 7Byte UID card and if it is not already personalized.", "Usage:\n\thf mf personalize UIDF0 -> double size UID according to ISO/IEC14443-3\n" "\thf mf personalize UIDF1 -> double size UID according to ISO/IEC14443-3, optional usage of selection process shortcut\n" @@ -4853,7 +4858,7 @@ static int CmdHFMFPersonalize(const char *cmd) { arg_str1(NULL, NULL, "<UIDF0|UIDF1|UIDF2|UIDF3>", "Personalization Option"), arg_param_end }; - CLIExecWithReturn(cmd, argtable, true); + CLIExecWithReturn(ctx, cmd, argtable, true); char keytypestr[2] = "a"; uint8_t keytype = 0x00; @@ -4863,7 +4868,7 @@ static int CmdHFMFPersonalize(const char *cmd) { if (res || (keytypestr[0] != 'a' && keytypestr[0] != 'b')) { PrintAndLogEx(ERR, "ERROR: not a valid key type. Key type must be A or B"); - CLIParserFree(); + CLIParserFree(ctx); return PM3_EINVARG; } if (keytypestr[0] == 'b') { @@ -4875,7 +4880,7 @@ static int CmdHFMFPersonalize(const char *cmd) { res = CLIParamHexToBuf(arg_get_str(2), key, 6, &key_len); if (res || (!res && key_len > 0 && key_len != 6)) { PrintAndLogEx(ERR, "ERROR: not a valid key. Key must be 12 hex digits"); - CLIParserFree(); + CLIParserFree(ctx); return PM3_EINVARG; } @@ -4888,7 +4893,7 @@ static int CmdHFMFPersonalize(const char *cmd) { if (res || (!res && opt_len > 0 && opt_len != 5) || (strncmp(pers_optionstr, "uidf0", 5) && strncmp(pers_optionstr, "uidf1", 5) && strncmp(pers_optionstr, "uidf2", 5) && strncmp(pers_optionstr, "uidf3", 5))) { PrintAndLogEx(ERR, "ERROR: invalid personalization option. Must be one of UIDF0, UIDF1, UIDF2, or UIDF3"); - CLIParserFree(); + CLIParserFree(ctx); return PM3_EINVARG; } if (!strncmp(pers_optionstr, "uidf0", 5)) { @@ -4901,7 +4906,7 @@ static int CmdHFMFPersonalize(const char *cmd) { pers_option = MIFARE_EV1_UIDF3; } - CLIParserFree(); + CLIParserFree(ctx); clearCommandBuffer(); diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index b1de9109e..ed5f50236 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -1782,7 +1782,8 @@ static void swap16(uint8_t *data) { static int CmdHF14ADesCreateApp(const char *Cmd) { - CLIParserInit("hf mfdes createaid", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfdes createaid", "Create Application ID", "Usage:\n\thf mfdes createaid -a 123456 -f 1111 -k 0E -l 2E -n Test\n" ); @@ -1796,7 +1797,7 @@ static int CmdHF14ADesCreateApp(const char *Cmd) { arg_str0("nN", "name", "<name>", "App ISO-4 Name (optional)"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, false); + CLIExecWithReturn(ctx, Cmd, argtable, false); /* KeySetting 1 (AMK Setting): 0: Allow change master key 1: Free Directory list access without master key @@ -1835,12 +1836,12 @@ static int CmdHF14ADesCreateApp(const char *Cmd) { int keylen1 = 1; int keylen2 = 1; int namelen = 16; - CLIGetHexWithReturn(1, aid, &aidlength); - CLIGetHexWithReturn(2, fid, &fidlength); - CLIGetHexWithReturn(3, keysetting1, &keylen1); - CLIGetHexWithReturn(4, keysetting2, &keylen2); - CLIGetStrWithReturn(5, name, &namelen); - CLIParserFree(); + CLIGetHexWithReturn(ctx, 1, aid, &aidlength); + CLIGetHexWithReturn(ctx, 2, fid, &fidlength); + CLIGetHexWithReturn(ctx, 3, keysetting1, &keylen1); + CLIGetHexWithReturn(ctx, 4, keysetting2, &keylen2); + CLIGetStrWithReturn(ctx, 5, name, &namelen); + CLIParserFree(ctx); swap24(aid); swap16(fid); @@ -1908,7 +1909,8 @@ static int CmdHF14ADesCreateApp(const char *Cmd) { } static int CmdHF14ADesDeleteApp(const char *Cmd) { - CLIParserInit("hf mfdes deleteaid", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfdes deleteaid", "Delete Application ID", "Usage:\n\t-a aid (3 hex bytes, big endian)\n\n" "Example:\n\thf mfdes deleteaid -a 123456\n" @@ -1919,11 +1921,11 @@ static int CmdHF14ADesDeleteApp(const char *Cmd) { arg_strx0("aA", "aid", "<aid>", "App ID to delete"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, false); + CLIExecWithReturn(ctx, Cmd, argtable, false); int aidlength = 3; uint8_t aid[3] = {0}; - CLIGetHexWithReturn(1, aid, &aidlength); - CLIParserFree(); + CLIGetHexWithReturn(ctx, 1, aid, &aidlength); + CLIParserFree(ctx); swap24(aid); if (aidlength != 3) { PrintAndLogEx(ERR, "AID must have 3 bytes length."); @@ -1945,7 +1947,8 @@ static int CmdHF14ADesDeleteApp(const char *Cmd) { static int CmdHF14ADesClearRecordFile(const char *Cmd) { - CLIParserInit("hf mfdes clearrecord", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfdes clearrecord", "Clear record file", "Usage:\n\t" "hf mfdes clearrecord -a 123456 -n 01\n" @@ -1957,19 +1960,19 @@ static int CmdHF14ADesClearRecordFile(const char *Cmd) { arg_strx0("nN", "fileno", "<fileno>", "File Number (1 hex byte, 0x00 - 0x1F)"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, false); + CLIExecWithReturn(ctx, Cmd, argtable, false); int aidlength = 0; uint8_t aid[3] = {0}; - CLIGetHexWithReturn(1, aid, &aidlength); + CLIGetHexWithReturn(ctx, 1, aid, &aidlength); int filenolen = 0; uint8_t _fileno[1] = {0}; - CLIGetHexWithReturn(2, _fileno, &filenolen); + CLIGetHexWithReturn(ctx, 2, _fileno, &filenolen); int fidlength = 0; uint8_t fid[2] = {0}; - CLIGetHexWithReturn(3, fid, &fidlength); - CLIParserFree(); + CLIGetHexWithReturn(ctx, 3, fid, &fidlength); + CLIParserFree(ctx); if (filenolen != 1) { PrintAndLogEx(ERR, "Fileno must have 1 bytes length."); @@ -2005,7 +2008,8 @@ static int CmdHF14ADesClearRecordFile(const char *Cmd) { } static int CmdHF14ADesDeleteFile(const char *Cmd) { - CLIParserInit("hf mfdes deletefile", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfdes deletefile", "Delete File", "Usage:\n\t" "hf mfdes deletefile -a 123456 -n 01\n" @@ -2017,19 +2021,19 @@ static int CmdHF14ADesDeleteFile(const char *Cmd) { arg_strx0("nN", "fileno", "<fileno>", "File Number (1 hex byte, 0x00 - 0x1F)"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, false); + CLIExecWithReturn(ctx, Cmd, argtable, false); int aidlength = 0; uint8_t aid[3] = {0}; - CLIGetHexWithReturn(1, aid, &aidlength); + CLIGetHexWithReturn(ctx, 1, aid, &aidlength); int filenolen = 0; uint8_t _fileno[1] = {0}; - CLIGetHexWithReturn(2, _fileno, &filenolen); + CLIGetHexWithReturn(ctx, 2, _fileno, &filenolen); int fidlength = 0; uint8_t fid[2] = {0}; - CLIGetHexWithReturn(3, fid, &fidlength); - CLIParserFree(); + CLIGetHexWithReturn(ctx, 3, fid, &fidlength); + CLIParserFree(ctx); if (filenolen != 1) { PrintAndLogEx(ERR, "Fileno must have 1 bytes length."); @@ -2065,7 +2069,8 @@ static int CmdHF14ADesDeleteFile(const char *Cmd) { } static int CmdHF14ADesCreateFile(const char *Cmd) { - CLIParserInit("hf mfdes createfile", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfdes createfile", "Create Standard/Backup File", "Usage:" "\n\thf mfdes createfile -a 123456 -f 1111 -n 01 -c 0 -r EEEE -s 000100\n" @@ -2082,30 +2087,30 @@ static int CmdHF14ADesCreateFile(const char *Cmd) { arg_lit0("bB", "backup", "Create backupfile instead of standard file"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, false); + CLIExecWithReturn(ctx, Cmd, argtable, false); int aidlength = 0; uint8_t aid[3] = {0}; - CLIGetHexWithReturn(1, aid, &aidlength); + CLIGetHexWithReturn(ctx, 1, aid, &aidlength); int filenolen = 0; uint8_t _fileno[1] = {0}; - CLIGetHexWithReturn(2, _fileno, &filenolen); + CLIGetHexWithReturn(ctx, 2, _fileno, &filenolen); int fidlength = 0; uint8_t fid[2] = {0}; - CLIGetHexWithReturn(3, fid, &fidlength); + CLIGetHexWithReturn(ctx, 3, fid, &fidlength); uint8_t comset = arg_get_int(4); int arlength = 0; uint8_t ar[2] = {0}; - CLIGetHexWithReturn(5, ar, &arlength); + CLIGetHexWithReturn(ctx, 5, ar, &arlength); int fsizelen = 0; uint8_t filesize[3] = {0}; - CLIGetHexWithReturn(6, filesize, &fsizelen); + CLIGetHexWithReturn(ctx, 6, filesize, &fsizelen); bool isbackup = arg_get_lit(7); - CLIParserFree(); + CLIParserFree(ctx); swap24(aid); swap16(fid); @@ -2175,7 +2180,8 @@ static int CmdHF14ADesCreateFile(const char *Cmd) { } static int CmdHF14ADesGetValueData(const char *Cmd) { - CLIParserInit("hf mfdes getvalue", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfdes getvalue", "Get value from value file", "Usage:" "\n\thf mfdes getvalue -a 123456 -n 03\n" @@ -2187,16 +2193,16 @@ static int CmdHF14ADesGetValueData(const char *Cmd) { arg_strx0("nN", "fileno", "<fileno>", "File Number (1 hex byte, 0x00 - 0x1F)"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, false); + CLIExecWithReturn(ctx, Cmd, argtable, false); int aidlength = 0; uint8_t aid[3] = {0}; - CLIGetHexWithReturn(1, aid, &aidlength); + CLIGetHexWithReturn(ctx, 1, aid, &aidlength); int filenolen = 0; uint8_t _fileno[1] = {0}; - CLIGetHexWithReturn(2, _fileno, &filenolen); - CLIParserFree(); + CLIGetHexWithReturn(ctx, 2, _fileno, &filenolen); + CLIParserFree(ctx); if (filenolen != 1) { PrintAndLogEx(ERR, "File number is missing"); @@ -2242,7 +2248,8 @@ static int CmdHF14ADesGetValueData(const char *Cmd) { } static int CmdHF14ADesReadData(const char *Cmd) { - CLIParserInit("hf mfdes readdata", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfdes readdata", "Read data from File", "Usage:" "\n\thf mfdes readdata -a 123456 -n 01 -t 0 -o 000000 -l 000000\n" @@ -2257,25 +2264,25 @@ static int CmdHF14ADesReadData(const char *Cmd) { arg_int0("type", "type", "<type>", "File Type (0=Standard/Backup, 1=Record)"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, false); + CLIExecWithReturn(ctx, Cmd, argtable, false); int aidlength = 0; uint8_t aid[3] = {0}; - CLIGetHexWithReturn(1, aid, &aidlength); + CLIGetHexWithReturn(ctx, 1, aid, &aidlength); int filenolen = 0; uint8_t _fileno[1] = {0}; - CLIGetHexWithReturn(2, _fileno, &filenolen); + CLIGetHexWithReturn(ctx, 2, _fileno, &filenolen); int offsetlength = 0; uint8_t offset[3] = {0}; - CLIGetHexWithReturn(3, offset, &offsetlength); + CLIGetHexWithReturn(ctx, 3, offset, &offsetlength); int flength = 0; uint8_t filesize[3] = {0}; - CLIGetHexWithReturn(4, filesize, &flength); + CLIGetHexWithReturn(ctx, 4, filesize, &flength); int type = arg_get_int(5); - CLIParserFree(); + CLIParserFree(ctx); if (type > 1) { PrintAndLogEx(ERR, "Invalid file type (0=Standard/Backup, 1=Record)"); @@ -2347,7 +2354,8 @@ static int CmdHF14ADesReadData(const char *Cmd) { } static int CmdHF14ADesChangeValue(const char *Cmd) { - CLIParserInit("hf mfdes changevalue", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfdes changevalue", "Change value (credit/limitedcredit/debit)", "Usage:" "\n\thf mfdes changevalue -a 123456 -n 03 -m 0 -d 00000001\n" @@ -2363,22 +2371,22 @@ static int CmdHF14ADesChangeValue(const char *Cmd) { }; mfdes_value_t value; - CLIExecWithReturn(Cmd, argtable, false); + CLIExecWithReturn(ctx, Cmd, argtable, false); int aidlength = 0; uint8_t aid[3] = {0}; - CLIGetHexWithReturn(1, aid, &aidlength); + CLIGetHexWithReturn(ctx, 1, aid, &aidlength); int filenolen = 0; uint8_t _fileno[1] = {0}; - CLIGetHexWithReturn(2, _fileno, &filenolen); + CLIGetHexWithReturn(ctx, 2, _fileno, &filenolen); value.fileno = _fileno[0]; int vlength = 0x0; - CLIGetHexWithReturn(3, value.value, &vlength); + CLIGetHexWithReturn(ctx, 3, value.value, &vlength); int mode = arg_get_int(4); - CLIParserFree(); + CLIParserFree(ctx); swap24(aid); if (mode > 2) { @@ -2439,7 +2447,8 @@ static int CmdHF14ADesChangeValue(const char *Cmd) { static int CmdHF14ADesWriteData(const char *Cmd) { - CLIParserInit("hf mfdes writedata", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfdes writedata", "Write data to File", "Usage:" "\n\thf mfdes writedata -a 123456 -n 01 -t 0 -o 000000 -d 3132333435363738\n" @@ -2455,19 +2464,19 @@ static int CmdHF14ADesWriteData(const char *Cmd) { arg_param_end }; - CLIExecWithReturn(Cmd, argtable, false); + CLIExecWithReturn(ctx, Cmd, argtable, false); int aidlength = 0; uint8_t aid[3] = {0}; - CLIGetHexWithReturn(1, aid, &aidlength); + CLIGetHexWithReturn(ctx, 1, aid, &aidlength); int filenolen = 0; uint8_t _fileno[1] = {0}; - CLIGetHexWithReturn(2, _fileno, &filenolen); + CLIGetHexWithReturn(ctx, 2, _fileno, &filenolen); int offsetlength = 0; uint8_t offset[3] = {0}; - CLIGetHexWithReturn(3, offset, &offsetlength); + CLIGetHexWithReturn(ctx, 3, offset, &offsetlength); int dlength = 0xFFFF; uint8_t *data = (uint8_t *)calloc(dlength, sizeof(uint8_t)); @@ -2477,13 +2486,13 @@ static int CmdHF14ADesWriteData(const char *Cmd) { } if (CLIParamHexToBuf(arg_get_str(4), data, dlength, &dlength)) { free(data); - CLIParserFree(); + CLIParserFree(ctx); return PM3_ESOFT; } int type = arg_get_int(5); - CLIParserFree(); + CLIParserFree(ctx); swap24(aid); swap24(offset); @@ -2555,7 +2564,8 @@ static int CmdHF14ADesWriteData(const char *Cmd) { static int CmdHF14ADesCreateRecordFile(const char *Cmd) { - CLIParserInit("hf mfdes createrecordfile", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfdes createrecordfile", "Create Linear/Cyclic Record File", "Usage:" "\n\thf mfdes createrecordfile -a 123456 -f 1122 -n 02 -c 0 -r EEEE -s 000010 -m 000005\n" @@ -2573,34 +2583,34 @@ static int CmdHF14ADesCreateRecordFile(const char *Cmd) { arg_lit0("bB", "cyclic", "Create cyclic record file instead of linear record file"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, false); + CLIExecWithReturn(ctx, Cmd, argtable, false); int aidlength = 0; uint8_t aid[3] = {0}; - CLIGetHexWithReturn(1, aid, &aidlength); + CLIGetHexWithReturn(ctx, 1, aid, &aidlength); int filenolen = 0; uint8_t _fileno[1] = {0}; - CLIGetHexWithReturn(2, _fileno, &filenolen); + CLIGetHexWithReturn(ctx, 2, _fileno, &filenolen); int fidlength = 0; uint8_t fid[2] = {0}; - CLIGetHexWithReturn(3, fid, &fidlength); + CLIGetHexWithReturn(ctx, 3, fid, &fidlength); uint8_t comset = arg_get_int(4); int arlength = 0; uint8_t ar[2] = {0}; - CLIGetHexWithReturn(5, ar, &arlength); + CLIGetHexWithReturn(ctx, 5, ar, &arlength); int rsizelen = 0; uint8_t recordsize[3] = {0}; - CLIGetHexWithReturn(6, recordsize, &rsizelen); + CLIGetHexWithReturn(ctx, 6, recordsize, &rsizelen); int msizelen = 0; uint8_t maxnumrecords[3] = {0}; - CLIGetHexWithReturn(7, maxnumrecords, &msizelen); + CLIGetHexWithReturn(ctx, 7, maxnumrecords, &msizelen); bool cyclic = arg_get_lit(8); - CLIParserFree(); + CLIParserFree(ctx); swap24(aid); swap16(fid); @@ -2685,7 +2695,8 @@ static int CmdHF14ADesCreateRecordFile(const char *Cmd) { } static int CmdHF14ADesCreateValueFile(const char *Cmd) { - CLIParserInit("hf mfdes createvaluefile", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfdes createvaluefile", "Create Value File", "Usage:" "\n\thf mfdes createvaluefile -a 123456 -n 03 -c 0 -r EEEE -l 00000000 -u 00002000 -v 00000001 -m 02\n" @@ -2703,37 +2714,37 @@ static int CmdHF14ADesCreateValueFile(const char *Cmd) { arg_strx0("mM", "limitcredit", "<limitcredit>", "Limited Credit enabled (1 hex byte [Bit 0=LimitedCredit, 1=FreeValue])"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, false); + CLIExecWithReturn(ctx, Cmd, argtable, false); int aidlength = 0; uint8_t aid[3] = {0}; - CLIGetHexWithReturn(1, aid, &aidlength); + CLIGetHexWithReturn(ctx, 1, aid, &aidlength); int filenolen = 0; uint8_t _fileno[1] = {0}; - CLIGetHexWithReturn(2, _fileno, &filenolen); + CLIGetHexWithReturn(ctx, 2, _fileno, &filenolen); uint8_t comset = arg_get_int(3); int arlength = 0; uint8_t ar[2] = {0}; - CLIGetHexWithReturn(4, ar, &arlength); + CLIGetHexWithReturn(ctx, 4, ar, &arlength); int lllen = 0; uint8_t lowerlimit[4] = {0}; - CLIGetHexWithReturn(5, lowerlimit, &lllen); + CLIGetHexWithReturn(ctx, 5, lowerlimit, &lllen); int ullen = 0; uint8_t upperlimit[4] = {0}; - CLIGetHexWithReturn(6, upperlimit, &ullen); + CLIGetHexWithReturn(ctx, 6, upperlimit, &ullen); int vllen = 0; uint8_t value[4] = {0}; - CLIGetHexWithReturn(7, value, &vllen); + CLIGetHexWithReturn(ctx, 7, value, &vllen); int limitedlen = 0; uint8_t limited[1] = {0}; - CLIGetHexWithReturn(8, limited, &limitedlen); + CLIGetHexWithReturn(ctx, 8, limited, &limitedlen); - CLIParserFree(); + CLIParserFree(ctx); swap24(aid); swap32(lowerlimit); @@ -2813,7 +2824,8 @@ static int CmdHF14ADesCreateValueFile(const char *Cmd) { } static int CmdHF14ADesFormatPICC(const char *Cmd) { - CLIParserInit("hf mfdes formatpicc", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfdes formatpicc", "Formats MIFARE DESFire PICC to factory state", "Usage:\n\t-k PICC key (8 bytes)\n\n" "Example:\n\thf mfdes formatpicc -k 0000000000000000\n" @@ -2824,12 +2836,12 @@ static int CmdHF14ADesFormatPICC(const char *Cmd) { arg_str0("kK", "key", "<Key>", "Key for checking (HEX 16 bytes)"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, false); + CLIExecWithReturn(ctx, Cmd, argtable, false); uint8_t key[8] = {0}; int keylen = 8; - CLIGetHexWithReturn(1, key, &keylen); - CLIParserFree(); + CLIGetHexWithReturn(ctx, 1, key, &keylen); + CLIParserFree(ctx); if ((keylen < 8) || (keylen > 8)) { PrintAndLogEx(ERR, "Specified key must have 8 bytes length"); @@ -3419,7 +3431,8 @@ static int CmdHF14ADesAuth(const char *Cmd) { uint8_t keylength = 8; bool usedefaultkey = false; - CLIParserInit("hf mfdes auth", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfdes auth", "Authenticates Mifare DESFire using Key", "Usage:" "\n\thf mfdes auth -m 3 -t 4 -a 808301 -n 0 -k 00000000000000000000000000000000 (AES)" @@ -3436,21 +3449,21 @@ static int CmdHF14ADesAuth(const char *Cmd) { arg_str0("kK", "key", "<Key>", "Key for checking (HEX 8-24 bytes)"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, false); + CLIExecWithReturn(ctx, Cmd, argtable, false); uint8_t cmdAuthMode = arg_get_int_def(1, 0); uint8_t cmdAuthAlgo = arg_get_int_def(2, 0); int aidlength = 3; uint8_t aid[3] = {0}; - CLIGetHexWithReturn(3, aid, &aidlength); + CLIGetHexWithReturn(ctx, 3, aid, &aidlength); swap24(aid); uint8_t cmdKeyNo = arg_get_int_def(4, 0); uint8_t key[24] = {0}; int keylen = 0; - CLIGetHexWithReturn(5, key, &keylen); - CLIParserFree(); + CLIGetHexWithReturn(ctx, 5, key, &keylen); + CLIParserFree(ctx); if (keylen == 0) { usedefaultkey = true; @@ -3860,7 +3873,8 @@ static int CmdHF14aDesChk(const char *Cmd) { uint32_t k3kkeyListLen = 0; uint8_t foundKeys[4][0xE][24 + 1] = {{{0}}}; - CLIParserInit("hf mfdes chk", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfdes chk", "Checks keys with Mifare Desfire card.", "Usage:\n" " hf mfdes chk -a 123456 -k 000102030405060708090a0b0c0d0e0f -> check key on aid 0x123456\n" @@ -3881,15 +3895,15 @@ static int CmdHF14aDesChk(const char *Cmd) { arg_lit0("vV", "verbose", "Verbose mode."), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, false); + CLIExecWithReturn(ctx, Cmd, argtable, false); int aidlength = 0; uint8_t aid[3] = {0}; - CLIGetHexWithReturn(1, aid, &aidlength); + CLIGetHexWithReturn(ctx, 1, aid, &aidlength); swap24(aid); uint8_t vkey[16] = {0}; int vkeylen = 0; - CLIGetHexWithReturn(2, vkey, &vkeylen); + CLIGetHexWithReturn(ctx, 2, vkey, &vkeylen); if (vkeylen > 0) { if (vkeylen == 8) { @@ -3903,7 +3917,7 @@ static int CmdHF14aDesChk(const char *Cmd) { k3kkeyListLen++; } else { PrintAndLogEx(ERR, "Specified key must have 8, 16 or 24 bytes length."); - CLIParserFree(); + CLIParserFree(ctx); return PM3_EINVARG; } } @@ -3912,7 +3926,7 @@ static int CmdHF14aDesChk(const char *Cmd) { int dict_filenamelen = 0; if (CLIParamStrToBuf(arg_get_str(3), dict_filename, FILE_PATH_SIZE, &dict_filenamelen)) { PrintAndLogEx(FAILED, "File name too long or invalid."); - CLIParserFree(); + CLIParserFree(ctx); return PM3_EINVARG; } @@ -3921,26 +3935,26 @@ static int CmdHF14aDesChk(const char *Cmd) { if (pattern1b && pattern2b) { PrintAndLogEx(ERR, "Pattern search mode must be 2-byte or 1-byte only."); - CLIParserFree(); + CLIParserFree(ctx); return PM3_EINVARG; } if (dict_filenamelen && (pattern1b || pattern2b)) { PrintAndLogEx(ERR, "Pattern search mode and dictionary mode can't be used in one command."); - CLIParserFree(); + CLIParserFree(ctx); return PM3_EINVARG; } uint32_t startPattern = 0x0000; uint8_t vpattern[2]; int vpatternlen = 0; - CLIGetHexWithReturn(6, vpattern, &vpatternlen); + CLIGetHexWithReturn(ctx, 6, vpattern, &vpatternlen); if (vpatternlen > 0) { if (vpatternlen > 0 && vpatternlen <= 2) { startPattern = (vpattern[0] << 8) + vpattern[1]; } else { PrintAndLogEx(ERR, "Pattern must be 2-byte length."); - CLIParserFree(); + CLIParserFree(ctx); return PM3_EINVARG; } if (!pattern2b) @@ -3951,14 +3965,14 @@ static int CmdHF14aDesChk(const char *Cmd) { int jsonnamelen = 0; if (CLIParamStrToBuf(arg_get_str(7), jsonname, sizeof(jsonname), &jsonnamelen)) { PrintAndLogEx(ERR, "Invalid json name."); - CLIParserFree(); + CLIParserFree(ctx); return PM3_EINVARG; } jsonname[jsonnamelen] = 0; bool verbose = arg_get_lit(8); - CLIParserFree(); + CLIParserFree(ctx); // 1-byte pattern search mode if (pattern1b) { diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index 12fbce4d7..7cdeb5eb1 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -424,7 +424,8 @@ static int CmdHFMFPWritePerso(const char *Cmd) { uint8_t key[64] = {0}; int keyLen = 0; - CLIParserInit("hf mfp wrp", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfp wrp", "Executes Write Perso command. Can be used in SL0 mode only.", "Usage:\n\thf mfp wrp 4000 000102030405060708090a0b0c0d0e0f -> write key (00..0f) to key number 4000 \n" "\thf mfp wrp 4000 -> write default key(0xff..0xff) to key number 4000"); @@ -436,12 +437,12 @@ static int CmdHFMFPWritePerso(const char *Cmd) { arg_strx0(NULL, NULL, "<HEX key (16b)>", NULL), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); bool verbose = arg_get_lit(1); - CLIGetHexWithReturn(2, keyNum, &keyNumLen); - CLIGetHexWithReturn(3, key, &keyLen); - CLIParserFree(); + CLIGetHexWithReturn(ctx, 2, keyNum, &keyNumLen); + CLIGetHexWithReturn(ctx, 3, key, &keyLen); + CLIParserFree(ctx); mfpSetVerboseMode(verbose); @@ -490,7 +491,8 @@ static int CmdHFMFPInitPerso(const char *Cmd) { uint8_t data[250] = {0}; int datalen = 0; - CLIParserInit("hf mfp initp", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfp initp", "Executes Write Perso command for all card's keys. Can be used in SL0 mode only.", "Usage:\n\thf mfp initp 000102030405060708090a0b0c0d0e0f -> fill all the keys with key (00..0f)\n" "\thf mfp initp -vv -> fill all the keys with default key(0xff..0xff) and show all the data exchange"); @@ -501,12 +503,12 @@ static int CmdHFMFPInitPerso(const char *Cmd) { arg_strx0(NULL, NULL, "<HEX key (16b)>", NULL), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); bool verbose = arg_get_lit(1); bool verbose2 = arg_get_lit(1) > 1; - CLIGetHexWithReturn(2, key, &keyLen); - CLIParserFree(); + CLIGetHexWithReturn(ctx, 2, key, &keyLen); + CLIParserFree(ctx); if (keyLen && keyLen != 16) { PrintAndLogEx(ERR, "Key length must be 16 bytes instead of: %d", keyLen); @@ -557,7 +559,8 @@ static int CmdHFMFPInitPerso(const char *Cmd) { } static int CmdHFMFPCommitPerso(const char *Cmd) { - CLIParserInit("hf mfp commitp", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfp commitp", "Executes Commit Perso command. Can be used in SL0 mode only.", "Usage:\n\thf mfp commitp -> \n"); @@ -567,10 +570,10 @@ static int CmdHFMFPCommitPerso(const char *Cmd) { arg_int0(NULL, NULL, "SL mode", NULL), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); bool verbose = arg_get_lit(1); - CLIParserFree(); + CLIParserFree(ctx); mfpSetVerboseMode(verbose); @@ -603,7 +606,8 @@ static int CmdHFMFPAuth(const char *Cmd) { uint8_t key[250] = {0}; int keylen = 0; - CLIParserInit("hf mfp auth", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfp auth", "Executes AES authentication command for Mifare Plus card", "Usage:\n\thf mfp auth 4000 000102030405060708090a0b0c0d0e0f -> executes authentication\n" "\thf mfp auth 9003 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -v -> executes authentication and shows all the system data\n"); @@ -615,12 +619,12 @@ static int CmdHFMFPAuth(const char *Cmd) { arg_str1(NULL, NULL, "<Key Value (HEX 16 bytes)>", NULL), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); bool verbose = arg_get_lit(1); - CLIGetHexWithReturn(2, keyn, &keynlen); - CLIGetHexWithReturn(3, key, &keylen); - CLIParserFree(); + CLIGetHexWithReturn(ctx, 2, keyn, &keynlen); + CLIGetHexWithReturn(ctx, 3, key, &keylen); + CLIParserFree(ctx); if (keynlen != 2) { PrintAndLogEx(ERR, "ERROR: <Key Num> must be 2 bytes long instead of: %d", keynlen); @@ -640,7 +644,8 @@ static int CmdHFMFPRdbl(const char *Cmd) { uint8_t key[250] = {0}; int keylen = 0; - CLIParserInit("hf mfp rdbl", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfp rdbl", "Reads several blocks from Mifare Plus card.", "Usage:\n\thf mfp rdbl 0 000102030405060708090a0b0c0d0e0f -> executes authentication and read block 0 data\n" "\thf mfp rdbl 1 -v -> executes authentication and shows sector 1 data with default key 0xFF..0xFF and some additional data\n"); @@ -655,15 +660,15 @@ static int CmdHFMFPRdbl(const char *Cmd) { arg_str0(NULL, NULL, "<Key Value (HEX 16 bytes)>", NULL), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, false); + CLIExecWithReturn(ctx, Cmd, argtable, false); bool verbose = arg_get_lit(1); int blocksCount = arg_get_int_def(2, 1); bool keyB = arg_get_lit(3); int plain = arg_get_lit(4); uint32_t blockn = arg_get_int(5); - CLIGetHexWithReturn(6, key, &keylen); - CLIParserFree(); + CLIGetHexWithReturn(ctx, 6, key, &keylen); + CLIParserFree(ctx); mfpSetVerboseMode(verbose); @@ -752,7 +757,8 @@ static int CmdHFMFPRdsc(const char *Cmd) { uint8_t key[250] = {0}; int keylen = 0; - CLIParserInit("hf mfp rdsc", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfp rdsc", "Reads one sector from Mifare Plus card.", "Usage:\n\thf mfp rdsc 0 000102030405060708090a0b0c0d0e0f -> executes authentication and read sector 0 data\n" "\thf mfp rdsc 1 -v -> executes authentication and shows sector 1 data with default key 0xFF..0xFF and some additional data\n"); @@ -766,14 +772,14 @@ static int CmdHFMFPRdsc(const char *Cmd) { arg_str0(NULL, NULL, "<Key Value (HEX 16 bytes)>", NULL), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, false); + CLIExecWithReturn(ctx, Cmd, argtable, false); bool verbose = arg_get_lit(1); bool keyB = arg_get_lit(2); bool plain = arg_get_lit(3); uint32_t sectorNum = arg_get_int(4); - CLIGetHexWithReturn(5, key, &keylen); - CLIParserFree(); + CLIGetHexWithReturn(ctx, 5, key, &keylen); + CLIParserFree(ctx); mfpSetVerboseMode(verbose); @@ -850,7 +856,8 @@ static int CmdHFMFPWrbl(const char *Cmd) { uint8_t datain[250] = {0}; int datainlen = 0; - CLIParserInit("hf mfp wrbl", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfp wrbl", "Writes one block to Mifare Plus card.", "Usage:\n\thf mfp wrbl 1 ff0000000000000000000000000000ff 000102030405060708090a0b0c0d0e0f -> writes block 1 data\n" "\thf mfp wrbl 2 ff0000000000000000000000000000ff -v -> writes block 2 data with default key 0xFF..0xFF and some additional data\n"); @@ -864,14 +871,14 @@ static int CmdHFMFPWrbl(const char *Cmd) { arg_str0(NULL, NULL, "<Key (HEX 16 bytes)>", NULL), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, false); + CLIExecWithReturn(ctx, Cmd, argtable, false); bool verbose = arg_get_lit(1); bool keyB = arg_get_lit(2); uint32_t blockNum = arg_get_int(3); - CLIGetHexWithReturn(4, datain, &datainlen); - CLIGetHexWithReturn(5, key, &keylen); - CLIParserFree(); + CLIGetHexWithReturn(ctx, 4, datain, &datainlen); + CLIGetHexWithReturn(ctx, 5, key, &keylen); + CLIParserFree(ctx); mfpSetVerboseMode(verbose); @@ -1047,7 +1054,8 @@ static int CmdHFMFPChk(const char *Cmd) { uint32_t keyListLen = 0; uint8_t foundKeys[2][64][AES_KEY_LEN + 1] = {{{0}}}; - CLIParserInit("hf mfp chk", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfp chk", "Checks keys with Mifare Plus card.", "Usage:\n" " hf mfp chk -k 000102030405060708090a0b0c0d0e0f -> check key on sector 0 as key A and B\n" @@ -1071,7 +1079,7 @@ static int CmdHFMFPChk(const char *Cmd) { arg_lit0("vV", "verbose", "verbose mode."), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); bool keyA = arg_get_lit(1); bool keyB = arg_get_lit(2); @@ -1080,14 +1088,14 @@ static int CmdHFMFPChk(const char *Cmd) { uint8_t vkey[16] = {0}; int vkeylen = 0; - CLIGetHexWithReturn(5, vkey, &vkeylen); + CLIGetHexWithReturn(ctx, 5, vkey, &vkeylen); if (vkeylen > 0) { if (vkeylen == 16) { memcpy(&keyList[keyListLen], vkey, 16); keyListLen++; } else { PrintAndLogEx(ERR, "Specified key must have 16 bytes length."); - CLIParserFree(); + CLIParserFree(ctx); return PM3_EINVARG; } } @@ -1096,7 +1104,7 @@ static int CmdHFMFPChk(const char *Cmd) { int dict_filenamelen = 0; if (CLIParamStrToBuf(arg_get_str(6), dict_filename, FILE_PATH_SIZE, &dict_filenamelen)) { PrintAndLogEx(FAILED, "File name too long or invalid."); - CLIParserFree(); + CLIParserFree(ctx); return PM3_EINVARG; } @@ -1105,26 +1113,26 @@ static int CmdHFMFPChk(const char *Cmd) { if (pattern1b && pattern2b) { PrintAndLogEx(ERR, "Pattern search mode must be 2-byte or 1-byte only."); - CLIParserFree(); + CLIParserFree(ctx); return PM3_EINVARG; } if (dict_filenamelen && (pattern1b || pattern2b)) { PrintAndLogEx(ERR, "Pattern search mode and dictionary mode can't be used in one command."); - CLIParserFree(); + CLIParserFree(ctx); return PM3_EINVARG; } uint32_t startPattern = 0x0000; uint8_t vpattern[2]; int vpatternlen = 0; - CLIGetHexWithReturn(9, vpattern, &vpatternlen); + CLIGetHexWithReturn(ctx, 9, vpattern, &vpatternlen); if (vpatternlen > 0) { if (vpatternlen > 0 && vpatternlen <= 2) { startPattern = (vpattern[0] << 8) + vpattern[1]; } else { PrintAndLogEx(ERR, "Pattern must be 2-byte length."); - CLIParserFree(); + CLIParserFree(ctx); return PM3_EINVARG; } if (!pattern2b) @@ -1135,14 +1143,14 @@ static int CmdHFMFPChk(const char *Cmd) { int jsonnamelen = 0; if (CLIParamStrToBuf(arg_get_str(10), jsonname, sizeof(jsonname), &jsonnamelen)) { PrintAndLogEx(ERR, "Invalid json name."); - CLIParserFree(); + CLIParserFree(ctx); return PM3_EINVARG; } jsonname[jsonnamelen] = 0; bool verbose = arg_get_lit(11); - CLIParserFree(); + CLIParserFree(ctx); uint8_t startKeyAB = 0; uint8_t endKeyAB = 1; @@ -1277,7 +1285,8 @@ static int CmdHFMFPChk(const char *Cmd) { static int CmdHFMFPMAD(const char *Cmd) { - CLIParserInit("hf mfp mad", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfp mad", "Checks and prints Mifare Application Directory (MAD)", "Usage:\n\thf mfp mad -> shows MAD if exists\n" "\thf mfp mad -a 03e1 -k d3f7d3f7d3f7d3f7d3f7d3f7d3f7d3f7 -> shows NDEF data if exists\n"); @@ -1290,18 +1299,18 @@ static int CmdHFMFPMAD(const char *Cmd) { arg_lit0("bB", "keyb", "use key B for access printing sectors (by default: key A)"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); bool verbose = arg_get_lit(1); uint8_t aid[2] = {0}; int aidlen; - CLIGetHexWithReturn(2, aid, &aidlen); + CLIGetHexWithReturn(ctx, 2, aid, &aidlen); uint8_t key[16] = {0}; int keylen; - CLIGetHexWithReturn(3, key, &keylen); + CLIGetHexWithReturn(ctx, 3, key, &keylen); bool keyB = arg_get_lit(4); - CLIParserFree(); + CLIParserFree(ctx); if (aidlen != 2 && keylen > 0) { PrintAndLogEx(WARNING, "do not need a key without aid."); @@ -1371,7 +1380,8 @@ static int CmdHFMFPMAD(const char *Cmd) { static int CmdHFMFPNDEF(const char *Cmd) { - CLIParserInit("hf mfp ndef", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfp ndef", "Prints NFC Data Exchange Format (NDEF)", "Usage:\n\thf mfp ndef -> shows NDEF data\n" "\thf mfp ndef -a 03e1 -k d3f7d3f7d3f7d3f7d3f7d3f7d3f7d3f7 -> shows NDEF data with custom AID and key\n"); @@ -1384,19 +1394,19 @@ static int CmdHFMFPNDEF(const char *Cmd) { arg_lit0("bB", "keyb", "use key B for access sectors (by default: key A)"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); bool verbose = arg_get_lit(1); bool verbose2 = arg_get_lit(1) > 1; uint8_t aid[2] = {0}; int aidlen; - CLIGetHexWithReturn(2, aid, &aidlen); + CLIGetHexWithReturn(ctx, 2, aid, &aidlen); uint8_t key[16] = {0}; int keylen; - CLIGetHexWithReturn(3, key, &keylen); + CLIGetHexWithReturn(ctx, 3, key, &keylen); bool keyB = arg_get_lit(4); - CLIParserFree(); + CLIParserFree(ctx); uint16_t ndefAID = 0x03e1; if (aidlen == 2) diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index b35a27e49..dd812dd79 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -2915,7 +2915,8 @@ static int CmdHF14MfuNDEF(const char *Cmd) { uint8_t *p_key = key; uint8_t pack[4] = {0, 0, 0, 0}; - CLIParserInit("hf mfu ndef", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfu ndef", "Prints NFC Data Exchange Format (NDEF)", "Usage:\n\thf mfu ndef -> shows NDEF data\n" "\thf mfu ndef -k ffffffff -> shows NDEF data with key\n"); @@ -2926,10 +2927,10 @@ static int CmdHF14MfuNDEF(const char *Cmd) { arg_lit0("lL", "key", "(optional) swap entered key's endianness"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); - CLIGetHexWithReturn(1, key, &keylen); + CLIExecWithReturn(ctx, Cmd, argtable, true); + CLIGetHexWithReturn(ctx, 1, key, &keylen); swapEndian = arg_get_lit(2); - CLIParserFree(); + CLIParserFree(ctx); switch (keylen) { case 0: diff --git a/client/src/cmdlfindala.c b/client/src/cmdlfindala.c index d93f152fa..d9d24bfdd 100644 --- a/client/src/cmdlfindala.c +++ b/client/src/cmdlfindala.c @@ -560,7 +560,8 @@ static int CmdIndalaClone(const char *Cmd) { uint8_t fc = 0; uint16_t cn = 0; - CLIParserInit("lf indala clone", + CLIParserContext *ctx; + CLIParserInit(&ctx, "lf indala clone", "clone INDALA tag to T55x7 (or to q5/T5555)", "Examples:\n" "\tlf indala clone --heden 888\n" @@ -578,12 +579,12 @@ static int CmdIndalaClone(const char *Cmd) { arg_int0("", "cn", "<decimal>", "Cardnumber (26 bit format)"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, false); + CLIExecWithReturn(ctx, Cmd, argtable, false); is_long_uid = arg_get_lit(1); // raw param - CLIGetHexWithReturn(3, data, &datalen); + CLIGetHexWithReturn(ctx, 3, data, &datalen); is_t5555 = arg_get_lit(4); @@ -599,7 +600,7 @@ static int CmdIndalaClone(const char *Cmd) { got_26 = (fc != 0 && cn != 0); } - CLIParserFree(); + CLIParserFree(ctx); if (is_long_uid) { // 224 BIT UID diff --git a/client/src/cmdlfmotorola.c b/client/src/cmdlfmotorola.c index 3db82a0be..fc2156c1a 100644 --- a/client/src/cmdlfmotorola.c +++ b/client/src/cmdlfmotorola.c @@ -150,7 +150,8 @@ static int CmdMotorolaClone(const char *Cmd) { uint8_t data[8]; int datalen = 0; - CLIParserInit("lf indala clone", + CLIParserContext *ctx; + CLIParserInit(&ctx, "lf indala clone", "Enables cloning of Motorola card with specified uid onto T55x7\n" "defaults to 64.\n", "\n" @@ -163,9 +164,9 @@ static int CmdMotorolaClone(const char *Cmd) { arg_strx1(NULL, NULL, "<uid (hex)>", NULL), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, false); - CLIGetHexWithReturn(1, data, &datalen); - CLIParserFree(); + CLIExecWithReturn(ctx, Cmd, argtable, false); + CLIGetHexWithReturn(ctx, 1, data, &datalen); + CLIParserFree(ctx); //TODO add selection of chip for Q5 or T55x7 // data[0] = T5555_SET_BITRATE(32 | T5555_MODULATION_PSK1 | 2 << T5555_MAXBLOCK_SHIFT; diff --git a/client/src/emv/cmdemv.c b/client/src/emv/cmdemv.c index 347c7916a..4b364c85c 100644 --- a/client/src/emv/cmdemv.c +++ b/client/src/emv/cmdemv.c @@ -68,7 +68,8 @@ static int CmdEMVSelect(const char *Cmd) { uint8_t data[APDU_AID_LEN] = {0}; int datalen = 0; - CLIParserInit("emv select", + CLIParserContext *ctx; + CLIParserInit(&ctx, "emv select", "Executes select applet command", "Usage:\n\temv select -s a00000000101 -> select card, select applet\n\temv select -st a00000000101 -> select card, select applet, show result in TLV\n"); @@ -82,7 +83,7 @@ static int CmdEMVSelect(const char *Cmd) { arg_strx0(NULL, NULL, "<HEX applet AID>", NULL), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); bool activateField = arg_get_lit(1); bool leaveSignalON = arg_get_lit(2); @@ -92,8 +93,8 @@ static int CmdEMVSelect(const char *Cmd) { if (arg_get_lit(5)) channel = ECC_CONTACT; PrintChannel(channel); - CLIGetHexWithReturn(6, data, &datalen); - CLIParserFree(); + CLIGetHexWithReturn(ctx, 6, data, &datalen); + CLIParserFree(ctx); SetAPDULogging(APDULogging); @@ -117,7 +118,8 @@ static int CmdEMVSelect(const char *Cmd) { static int CmdEMVSearch(const char *Cmd) { - CLIParserInit("emv search", + CLIParserContext *ctx; + CLIParserInit(&ctx, "emv search", "Tries to select all applets from applet list:\n", "Usage:\n\temv search -s -> select card and search\n\temv search -st -> select card, search and show result in TLV\n"); @@ -130,7 +132,7 @@ static int CmdEMVSearch(const char *Cmd) { arg_lit0("wW", "wired", "Send data via contact (iso7816) interface. Contactless interface set by default."), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); bool activateField = arg_get_lit(1); bool leaveSignalON = arg_get_lit(2); @@ -140,7 +142,7 @@ static int CmdEMVSearch(const char *Cmd) { if (arg_get_lit(5)) channel = ECC_CONTACT; PrintChannel(channel); - CLIParserFree(); + CLIParserFree(ctx); SetAPDULogging(APDULogging); @@ -167,7 +169,8 @@ static int CmdEMVSearch(const char *Cmd) { static int CmdEMVPPSE(const char *Cmd) { - CLIParserInit("emv pse", + CLIParserContext *ctx; + CLIParserInit(&ctx, "emv pse", "Executes PSE/PPSE select command. It returns list of applet on the card:\n", "Usage:\n\temv pse -s1 -> select, get pse\n\temv pse -st2 -> select, get ppse, show result in TLV\n"); @@ -182,7 +185,7 @@ static int CmdEMVPPSE(const char *Cmd) { arg_lit0("wW", "wired", "Send data via contact (iso7816) interface. Contactless interface set by default."), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); bool activateField = arg_get_lit(1); bool leaveSignalON = arg_get_lit(2); @@ -197,7 +200,7 @@ static int CmdEMVPPSE(const char *Cmd) { if (arg_get_lit(7)) channel = ECC_CONTACT; PrintChannel(channel); - CLIParserFree(); + CLIParserFree(ctx); SetAPDULogging(APDULogging); @@ -223,7 +226,8 @@ static int CmdEMVGPO(const char *Cmd) { uint8_t data[APDU_RES_LEN] = {0}; int datalen = 0; - CLIParserInit("emv gpo", + CLIParserContext *ctx; + CLIParserInit(&ctx, "emv gpo", "Executes Get Processing Options command. It returns data in TLV format (0x77 - format2) or plain format (0x80 - format1).\nNeeds a EMV applet to be selected.", "Usage:\n\temv gpo -k -> execute GPO\n" "\temv gpo -t 01020304 -> execute GPO with 4-byte PDOL data, show result in TLV\n" @@ -240,7 +244,7 @@ static int CmdEMVGPO(const char *Cmd) { arg_strx0(NULL, NULL, "<HEX PDOLdata/PDOL>", NULL), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); bool leaveSignalON = arg_get_lit(1); bool paramsLoadFromFile = arg_get_lit(2); @@ -251,8 +255,8 @@ static int CmdEMVGPO(const char *Cmd) { if (arg_get_lit(6)) channel = ECC_CONTACT; PrintChannel(channel); - CLIGetHexWithReturn(7, data, &datalen); - CLIParserFree(); + CLIGetHexWithReturn(ctx, 7, data, &datalen); + CLIParserFree(ctx); SetAPDULogging(APDULogging); @@ -331,7 +335,8 @@ static int CmdEMVReadRecord(const char *Cmd) { uint8_t data[APDU_RES_LEN] = {0}; int datalen = 0; - CLIParserInit("emv readrec", + CLIParserContext *ctx; + CLIParserInit(&ctx, "emv readrec", "Executes Read Record command. It returns data in TLV format.\nNeeds a bank applet to be selected and sometimes needs GPO to be executed.", "Usage:\n\temv readrec -k 0101 -> read file SFI=01, SFIrec=01\n\temv readrec -kt 0201-> read file 0201 and show result in TLV\n"); @@ -344,7 +349,7 @@ static int CmdEMVReadRecord(const char *Cmd) { arg_strx1(NULL, NULL, "<SFI 1byte HEX><SFIrecord 1byte HEX>", NULL), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); bool leaveSignalON = arg_get_lit(1); bool APDULogging = arg_get_lit(2); @@ -353,8 +358,8 @@ static int CmdEMVReadRecord(const char *Cmd) { if (arg_get_lit(4)) channel = ECC_CONTACT; PrintChannel(channel); - CLIGetHexWithReturn(5, data, &datalen); - CLIParserFree(); + CLIGetHexWithReturn(ctx, 5, data, &datalen); + CLIParserFree(ctx); if (datalen != 2) { PrintAndLogEx(ERR, "Command needs to have 2 bytes of data"); @@ -386,7 +391,8 @@ static int CmdEMVAC(const char *Cmd) { uint8_t data[APDU_RES_LEN] = {0}; int datalen = 0; - CLIParserInit("emv genac", + CLIParserContext *ctx; + CLIParserInit(&ctx, "emv genac", "Generate Application Cryptogram command. It returns data in TLV format .\nNeeds a EMV applet to be selected and GPO to be executed.", "Usage:\n\temv genac -k 0102 -> generate AC with 2-byte CDOLdata and keep field ON after command\n" "\temv genac -t 01020304 -> generate AC with 4-byte CDOL data, show result in TLV\n" @@ -406,7 +412,7 @@ static int CmdEMVAC(const char *Cmd) { arg_strx1(NULL, NULL, "<HEX CDOLdata/CDOL>", NULL), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, false); + CLIExecWithReturn(ctx, Cmd, argtable, false); bool leaveSignalON = arg_get_lit(1); bool trTypeCDA = arg_get_lit(2); @@ -436,8 +442,8 @@ static int CmdEMVAC(const char *Cmd) { if (arg_get_lit(8)) channel = ECC_CONTACT; PrintChannel(channel); - CLIGetHexWithReturn(9, data, &datalen); - CLIParserFree(); + CLIGetHexWithReturn(ctx, 9, data, &datalen); + CLIParserFree(ctx); SetAPDULogging(APDULogging); @@ -505,7 +511,8 @@ static int CmdEMVAC(const char *Cmd) { static int CmdEMVGenerateChallenge(const char *Cmd) { - CLIParserInit("emv challenge", + CLIParserContext *ctx; + CLIParserInit(&ctx, "emv challenge", "Executes Generate Challenge command. It returns 4 or 8-byte random number from card.\nNeeds a EMV applet to be selected and GPO to be executed.", "Usage:\n\temv challenge -> get challenge\n\temv challenge -k -> get challenge, keep fileld ON\n"); @@ -516,7 +523,7 @@ static int CmdEMVGenerateChallenge(const char *Cmd) { arg_lit0("wW", "wired", "Send data via contact (iso7816) interface. Contactless interface set by default."), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); bool leaveSignalON = arg_get_lit(1); bool APDULogging = arg_get_lit(2); @@ -524,7 +531,7 @@ static int CmdEMVGenerateChallenge(const char *Cmd) { if (arg_get_lit(3)) channel = ECC_CONTACT; PrintChannel(channel); - CLIParserFree(); + CLIParserFree(ctx); SetAPDULogging(APDULogging); @@ -552,7 +559,8 @@ static int CmdEMVInternalAuthenticate(const char *Cmd) { uint8_t data[APDU_RES_LEN] = {0}; int datalen = 0; - CLIParserInit("emv intauth", + CLIParserContext *ctx; + CLIParserInit(&ctx, "emv intauth", "Generate Internal Authenticate command. Usually needs 4-byte random number. It returns data in TLV format .\n" "Needs a EMV applet to be selected and GPO to be executed.", @@ -572,7 +580,7 @@ static int CmdEMVInternalAuthenticate(const char *Cmd) { arg_strx1(NULL, NULL, "<HEX DDOLdata/DDOL>", NULL), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, false); + CLIExecWithReturn(ctx, Cmd, argtable, false); bool leaveSignalON = arg_get_lit(1); bool paramsLoadFromFile = arg_get_lit(2); @@ -583,8 +591,8 @@ static int CmdEMVInternalAuthenticate(const char *Cmd) { if (arg_get_lit(6)) channel = ECC_CONTACT; PrintChannel(channel); - CLIGetHexWithReturn(7, data, &datalen); - CLIParserFree(); + CLIGetHexWithReturn(ctx, 7, data, &datalen); + CLIParserFree(ctx); SetAPDULogging(APDULogging); @@ -782,7 +790,8 @@ static int CmdEMVExec(const char *Cmd) { struct tlvdb *tlvRoot = NULL; struct tlv *pdol_data_tlv = NULL; - CLIParserInit("emv exec", + CLIParserContext *ctx; + CLIParserInit(&ctx, "emv exec", "Executes EMV contactless transaction", "Usage:\n" "\temv exec -sat -> select card, execute MSD transaction, show APDU and TLV\n" @@ -803,7 +812,7 @@ static int CmdEMVExec(const char *Cmd) { arg_lit0("wW", "wired", "Send data via contact (iso7816) interface. Contactless interface set by default."), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); bool activateField = arg_get_lit(1); bool showAPDU = arg_get_lit(2); @@ -825,7 +834,7 @@ static int CmdEMVExec(const char *Cmd) { channel = ECC_CONTACT; PrintChannel(channel); uint8_t psenum = (channel == ECC_CONTACT) ? 1 : 2; - CLIParserFree(); + CLIParserFree(ctx); if (!IfPm3Smartcard()) { if (channel == ECC_CONTACT) { @@ -1375,7 +1384,8 @@ static int CmdEMVScan(const char *Cmd) { json_t *root; json_error_t error; - CLIParserInit("emv scan", + CLIParserContext *ctx; + CLIParserInit(&ctx, "emv scan", "Scan EMV card and save it contents to a file.", "It executes EMV contactless transaction and saves result to a file which can be used for emulation\n" "Usage:\n\temv scan -at -> scan MSD transaction mode and show APDU and TLV\n" @@ -1397,7 +1407,7 @@ static int CmdEMVScan(const char *Cmd) { arg_str1(NULL, NULL, "output.json", "JSON output file name"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); bool showAPDU = arg_get_lit(1); bool decodeTLV = arg_get_lit(2); @@ -1422,8 +1432,8 @@ static int CmdEMVScan(const char *Cmd) { uint8_t relfname[250] = {0}; char *crelfname = (char *)relfname; int relfnamelen = 0; - CLIGetStrWithReturn(12, relfname, &relfnamelen); - CLIParserFree(); + CLIGetStrWithReturn(ctx, 12, relfname, &relfnamelen); + CLIParserFree(ctx); if (!IfPm3Smartcard()) { if (channel == ECC_CONTACT) { @@ -1752,7 +1762,8 @@ static int CmdEMVList(const char *Cmd) { } static int CmdEMVTest(const char *Cmd) { - CLIParserInit("emv test", + CLIParserContext *ctx; + CLIParserInit(&ctx, "emv test", "Executes tests\n", "Usage:\n\temv test [l]\n"); @@ -1762,11 +1773,11 @@ static int CmdEMVTest(const char *Cmd) { arg_lit0("lL", "long", "run long tests too"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); bool ignoreTimeTest = arg_get_lit(1); bool runSlowTests = arg_get_lit(2); - CLIParserFree(); + CLIParserFree(ctx); return ExecuteCryptoTests(true, ignoreTimeTest, runSlowTests); } @@ -1781,7 +1792,8 @@ static int CmdEMVRoca(const char *Cmd) { size_t ODAI_listlen = 0; int res; - CLIParserInit("emv roca", + CLIParserContext *ctx; + CLIParserInit(&ctx, "emv roca", "Tries to extract public keys and run the ROCA test against them.\n", "Usage:\n" "\temv roca -w -> select --CONTACT-- card and run test\n" @@ -1795,11 +1807,11 @@ static int CmdEMVRoca(const char *Cmd) { arg_lit0("wW", "wired", "Send data via contact (iso7816) interface. Contactless interface set by default"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); EMVCommandChannel channel = ECC_CONTACTLESS; if (arg_get_lit(1)) { - CLIParserFree(); + CLIParserFree(ctx); return roca_self_test(); } @@ -1807,9 +1819,8 @@ static int CmdEMVRoca(const char *Cmd) { if (arg_get_lit(3)) channel = ECC_CONTACT; - - CLIParserFree(); - + + CLIParserFree(ctx); PrintChannel(channel); if (!IfPm3Smartcard()) { From b9b230bb996de5ec86db3e8b89fb838a4e89de2e Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Mon, 1 Jun 2020 18:30:51 +0200 Subject: [PATCH 445/632] cmdhfmfdes: remove global unused vars --- client/src/cmdhfmfdes.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index ed5f50236..c49c47ff4 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -35,10 +35,10 @@ struct desfire_key defaultkey = {0}; static desfirekey_t sessionkey = &defaultkey; -uint8_t key_zero_data[16] = { 0x00 }; -uint8_t key_ones_data[16] = { 0x01 }; -uint8_t key_defa_data[16] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; -uint8_t key_picc_data[16] = { 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f }; +//uint8_t key_zero_data[16] = { 0x00 }; +//uint8_t key_ones_data[16] = { 0x01 }; +//uint8_t key_defa_data[16] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; +//uint8_t key_picc_data[16] = { 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f }; typedef struct { uint8_t mode; From b6077df68e96a14874bdccb1c99f1dd3eee4f505 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Mon, 1 Jun 2020 20:10:45 +0200 Subject: [PATCH 446/632] less global vars --- client/src/cmdhfmf.c | 5 +++-- client/src/cmdlft55xx.c | 2 +- client/src/comms.c | 2 +- client/src/mifare/mifarehost.c | 15 ++++++--------- client/src/mifare/mifarehost.h | 4 ++-- 5 files changed, 13 insertions(+), 15 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 062f22c06..58278c9cc 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -3394,6 +3394,7 @@ static int CmdHF14AMfSniff(const char *Cmd) { SendCommandNG(CMD_HF_MIFARE_SNIFF, NULL, 0); PacketResponseNG resp; + struct Crypto1State *traceCrypto1 = NULL; // wait cycle while (true) { @@ -3490,13 +3491,13 @@ static int CmdHF14AMfSniff(const char *Cmd) { PrintAndLogEx(SUCCESS, "Trace saved to %s", logHexFileName); } if (wantDecrypt) - mfTraceInit(uid, uid_len, atqa, sak, wantSaveToEmlFile); + mfTraceInit(&traceCrypto1, uid, uid_len, atqa, sak, wantSaveToEmlFile); } else { PrintAndLogEx(NORMAL, "%03d| %s |%s", num, isTag ? "TAG" : "RDR", sprint_hex(bufPtr, len)); if (wantLogToFile) AddLogHex(logHexFileName, isTag ? "TAG| " : "RDR| ", bufPtr, len); if (wantDecrypt) - mfTraceDecode(bufPtr, len, wantSaveToEmlFile); + mfTraceDecode(traceCrypto1, bufPtr, len, wantSaveToEmlFile); num++; } bufPtr += len; diff --git a/client/src/cmdlft55xx.c b/client/src/cmdlft55xx.c index 173d8eb22..a4a885e1f 100644 --- a/client/src/cmdlft55xx.c +++ b/client/src/cmdlft55xx.c @@ -54,7 +54,7 @@ t55xx_conf_block_t config = { .downlink_mode = refFixedBit }; -t55xx_memory_item_t cardmem[T55x7_BLOCK_COUNT] = {{0}}; +static t55xx_memory_item_t cardmem[T55x7_BLOCK_COUNT] = {{0}}; t55xx_conf_block_t Get_t55xx_Config(void) { return config; diff --git a/client/src/comms.c b/client/src/comms.c index 09e39696c..f2788ad19 100644 --- a/client/src/comms.c +++ b/client/src/comms.c @@ -36,7 +36,7 @@ static bool comm_thread_dead = false; // Transmit buffer. static PacketCommandOLD txBuffer; static PacketCommandNGRaw txBufferNG; -size_t txBufferNGLen; +static size_t txBufferNGLen; static bool txBuffer_pending = false; static pthread_mutex_t txBufferMutex = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t txBufferSig = PTHREAD_COND_INITIALIZER; diff --git a/client/src/mifare/mifarehost.c b/client/src/mifare/mifarehost.c index fae64a2f6..df0a12ed0 100644 --- a/client/src/mifare/mifarehost.c +++ b/client/src/mifare/mifarehost.c @@ -955,9 +955,6 @@ static int traceState = TRACE_IDLE; static uint8_t traceCurBlock = 0; static uint8_t traceCurKey = 0; -struct Crypto1State *traceCrypto1 = NULL; -struct Crypto1State *revstate = NULL; - uint32_t cuid = 0; // uid part used for crypto1. int isTraceCardEmpty(void) { @@ -1046,12 +1043,12 @@ int saveTraceCard(void) { return PM3_SUCCESS; } // -int mfTraceInit(uint8_t *tuid, uint8_t uidlen, uint8_t *atqa, uint8_t sak, bool wantSaveToEmlFile) { +int mfTraceInit(struct Crypto1State **traceCrypto1, uint8_t *tuid, uint8_t uidlen, uint8_t *atqa, uint8_t sak, bool wantSaveToEmlFile) { - if (traceCrypto1) - crypto1_destroy(traceCrypto1); + if (*traceCrypto1) + crypto1_destroy(*traceCrypto1); - traceCrypto1 = NULL; + *traceCrypto1 = NULL; if (wantSaveToEmlFile) loadTraceCard(tuid, uidlen); @@ -1079,7 +1076,7 @@ void mf_crypto1_decrypt(struct Crypto1State *pcs, uint8_t *data, int len, bool i } } -int mfTraceDecode(uint8_t *data_src, int len, bool wantSaveToEmlFile) { +int mfTraceDecode(struct Crypto1State *traceCrypto1, uint8_t *data_src, int len, bool wantSaveToEmlFile) { if (traceState == TRACE_ERROR) return PM3_ESOFT; @@ -1209,7 +1206,7 @@ int mfTraceDecode(uint8_t *data_src, int len, bool wantSaveToEmlFile) { uint64_t key = 0; uint32_t ks2 = ar_enc ^ prng_successor(nt, 64); uint32_t ks3 = at_enc ^ prng_successor(nt, 96); - revstate = lfsr_recovery64(ks2, ks3); + struct Crypto1State *revstate = lfsr_recovery64(ks2, ks3); lfsr_rollback_word(revstate, 0, 0); lfsr_rollback_word(revstate, 0, 0); lfsr_rollback_word(revstate, nr_enc, 1); diff --git a/client/src/mifare/mifarehost.h b/client/src/mifare/mifarehost.h index 6f179c573..0595b2f8b 100644 --- a/client/src/mifare/mifarehost.h +++ b/client/src/mifare/mifarehost.h @@ -81,8 +81,8 @@ int mfCWipe(uint8_t *uid, uint8_t *atqa, uint8_t *sak); int mfCSetBlock(uint8_t blockNo, uint8_t *data, uint8_t *uid, uint8_t params); int mfCGetBlock(uint8_t blockNo, uint8_t *data, uint8_t params); -int mfTraceInit(uint8_t *tuid, uint8_t uidlen, uint8_t *atqa, uint8_t sak, bool wantSaveToEmlFile); -int mfTraceDecode(uint8_t *data_src, int len, bool wantSaveToEmlFile); +int mfTraceInit(struct Crypto1State **traceCrypto1, uint8_t *tuid, uint8_t uidlen, uint8_t *atqa, uint8_t sak, bool wantSaveToEmlFile); +int mfTraceDecode(struct Crypto1State *traceCrypto1, uint8_t *data_src, int len, bool wantSaveToEmlFile); int isTraceCardEmpty(void); int isBlockEmpty(int blockN); From d234e2a8f5a03a83017bdfad4410bb8f5bd2b278 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Mon, 1 Jun 2020 20:30:11 +0200 Subject: [PATCH 447/632] less global vars --- client/src/cmdhf14a.c | 6 ++++-- client/src/cmdhfmf.c | 13 ++++++------- client/src/cmdhfmf.h | 4 ++-- client/src/cmdparser.c | 4 ++-- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index 500406439..b293e4c01 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -438,6 +438,8 @@ int CmdHF14ASim(const char *Cmd) { bool setEmulatorMem = false; bool verbose = false; bool errors = false; + sector_t *k_sector = NULL; + uint8_t k_sectorsCount = 40; while (param_getchar(Cmd, cmdp) != 0x00 && !errors) { switch (tolower(param_getchar(Cmd, cmdp))) { @@ -521,7 +523,7 @@ int CmdHF14ASim(const char *Cmd) { if ((flags & FLAG_NR_AR_ATTACK) != FLAG_NR_AR_ATTACK) break; nonces_t *data = (nonces_t *)resp.data.asBytes; - readerAttack(data[0], setEmulatorMem, verbose); + readerAttack(k_sector, k_sectorsCount, data[0], setEmulatorMem, verbose); keypress = kbd_enter_pressed(); } @@ -532,7 +534,7 @@ int CmdHF14ASim(const char *Cmd) { } if (resp.status == PM3_EOPABORTED && ((flags & FLAG_NR_AR_ATTACK) == FLAG_NR_AR_ATTACK)) - showSectorTable(); + showSectorTable(k_sector, k_sectorsCount); PrintAndLogEx(INFO, "Done"); return PM3_SUCCESS; diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 58278c9cc..e3813a5a2 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -3129,10 +3129,7 @@ out: return PM3_SUCCESS; } -sector_t *k_sector = NULL; -uint8_t k_sectorsCount = 40; - -void showSectorTable(void) { +void showSectorTable(sector_t *k_sector, uint8_t k_sectorsCount) { if (k_sector != NULL) { printKeyTable(k_sectorsCount, k_sector); free(k_sector); @@ -3140,7 +3137,7 @@ void showSectorTable(void) { } } -void readerAttack(nonces_t data, bool setEmulatorMem, bool verbose) { +void readerAttack(sector_t *k_sector, uint8_t k_sectorsCount, nonces_t data, bool setEmulatorMem, bool verbose) { uint64_t key = 0; bool success = false; @@ -3196,6 +3193,8 @@ static int CmdHF14AMfSim(const char *Cmd) { nonces_t data[1]; char csize[13] = { 0 }; char uidsize[8] = { 0 }; + sector_t *k_sector = NULL; + uint8_t k_sectorsCount = 40; while (param_getchar(Cmd, cmdp) != 0x00 && !errors) { switch (tolower(param_getchar(Cmd, cmdp))) { @@ -3343,9 +3342,9 @@ static int CmdHF14AMfSim(const char *Cmd) { if ((resp.oldarg[0] & 0xffff) != CMD_HF_MIFARE_SIMULATE) break; memcpy(data, resp.data.asBytes, sizeof(data)); - readerAttack(data[0], setEmulatorMem, verbose); + readerAttack(k_sector, k_sectorsCount, data[0], setEmulatorMem, verbose); } - showSectorTable(); + showSectorTable(k_sector, k_sectorsCount); } k_sectorsCount = MIFARE_4K_MAXSECTOR; diff --git a/client/src/cmdhfmf.h b/client/src/cmdhfmf.h index c650b90f9..5325a7956 100644 --- a/client/src/cmdhfmf.h +++ b/client/src/cmdhfmf.h @@ -19,8 +19,8 @@ int CmdHFMF(const char *Cmd); int CmdHF14AMfELoad(const char *Cmd); // used by cmd hf mfu eload int CmdHF14AMfDbg(const char *Cmd); // used by cmd hf mfu dbg -void showSectorTable(void); -void readerAttack(nonces_t data, bool setEmulatorMem, bool verbose); +void showSectorTable(sector_t *k_sector, uint8_t k_sectorsCount); +void readerAttack(sector_t *k_sector, uint8_t k_sectorsCount, nonces_t data, bool setEmulatorMem, bool verbose); void printKeyTable(uint8_t sectorscnt, sector_t *e_sector); void printKeyTableEx(uint8_t sectorscnt, sector_t *e_sector, uint8_t start_sector); void printKeyTable_fast(uint8_t sectorscnt, icesector_t *e_sector, uint64_t bar, uint64_t foo); diff --git a/client/src/cmdparser.c b/client/src/cmdparser.c index e57d32090..529a3d553 100644 --- a/client/src/cmdparser.c +++ b/client/src/cmdparser.c @@ -234,8 +234,8 @@ int CmdsParse(const command_t Commands[], const char *Cmd) { return PM3_SUCCESS; } -char pparent[512] = {0}; -char *parent = pparent; +static char pparent[512] = {0}; +static char *parent = pparent; void dumpCommandsRecursive(const command_t cmds[], int markdown) { if (cmds[0].Name == NULL) return; From 447105511a16f84ea7e0bc83ceb1a0a636ba6823 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Mon, 1 Jun 2020 20:45:37 +0200 Subject: [PATCH 448/632] less global vars --- client/src/cmdhfmfdes.c | 2 +- client/src/cmdhfmfhard.c | 2 +- client/src/cmdlf.c | 2 +- client/src/cmdlfem4x.c | 2 +- client/src/cmdtrace.c | 2 +- client/src/emv/emv_roca.c | 60 +++++++++++++++++------------------- client/src/graph.c | 1 - client/src/graph.h | 1 - client/src/proxguiqt.cpp | 11 ++++--- client/src/proxmark3.c | 6 ++-- client/src/uart/uart_posix.c | 4 +-- client/src/ui.c | 4 +-- 12 files changed, 47 insertions(+), 50 deletions(-) diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index c49c47ff4..7f79bd1dd 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -32,7 +32,7 @@ #define MAX_KEY_LEN 24 #define MAX_KEYS_LIST_LEN 1024 -struct desfire_key defaultkey = {0}; +static struct desfire_key defaultkey = {0}; static desfirekey_t sessionkey = &defaultkey; //uint8_t key_zero_data[16] = { 0x00 }; diff --git a/client/src/cmdhfmfhard.c b/client/src/cmdhfmfhard.c index 383a9676f..ade910002 100644 --- a/client/src/cmdhfmfhard.c +++ b/client/src/cmdhfmfhard.c @@ -499,7 +499,7 @@ static void free_sum_bitarrays(void) { #ifdef DEBUG_KEY_ELIMINATION -char failstr[250] = ""; +static char failstr[250] = ""; #endif static const float p_K0[NUM_SUMS] = { // the probability that a random nonce has a Sum Property K diff --git a/client/src/cmdlf.c b/client/src/cmdlf.c index 520407847..1e91b490f 100644 --- a/client/src/cmdlf.c +++ b/client/src/cmdlf.c @@ -55,7 +55,7 @@ #include "cmdlfmotorola.h" // for Motorola menu #include "cmdlfgallagher.h" // for GALLAGHER menu -bool g_lf_threshold_set = false; +static bool g_lf_threshold_set = false; static int CmdHelp(const char *Cmd); diff --git a/client/src/cmdlfem4x.c b/client/src/cmdlfem4x.c index f3986b19d..2f003c8d5 100644 --- a/client/src/cmdlfem4x.c +++ b/client/src/cmdlfem4x.c @@ -30,7 +30,7 @@ #include "cmdlf.h" #include "lfdemod.h" -uint64_t g_em410xid = 0; +static uint64_t g_em410xid = 0; static int CmdHelp(const char *Cmd); diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index 4df4ee0c0..e7db5fa85 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -24,7 +24,7 @@ static int CmdHelp(const char *Cmd); // trace pointer static uint8_t *g_trace; -long g_traceLen = 0; +static long g_traceLen = 0; static int usage_trace_list(void) { PrintAndLogEx(NORMAL, "List protocol data in trace buffer."); diff --git a/client/src/emv/emv_roca.c b/client/src/emv/emv_roca.c index 8f6607363..4c42be7e2 100644 --- a/client/src/emv/emv_roca.c +++ b/client/src/emv/emv_roca.c @@ -26,39 +26,33 @@ #include "ui.h" // Print... #include "bignum.h" -static uint8_t g_primes[ROCA_PRINTS_LENGTH] = { - 11, 13, 17, 19, 37, 53, 61, 71, 73, 79, 97, 103, 107, 109, 127, 151, 157 -}; - -mbedtls_mpi g_prints[ROCA_PRINTS_LENGTH]; - -static void rocacheck_init(void) { +static void rocacheck_init(mbedtls_mpi *prints) { for (int i = 0; i < ROCA_PRINTS_LENGTH; i++) - mbedtls_mpi_init(&g_prints[i]); + mbedtls_mpi_init(&prints[i]); - mbedtls_mpi_read_string(&g_prints[0], 10, "1026"); - mbedtls_mpi_read_string(&g_prints[1], 10, "5658"); - mbedtls_mpi_read_string(&g_prints[2], 10, "107286"); - mbedtls_mpi_read_string(&g_prints[3], 10, "199410"); - mbedtls_mpi_read_string(&g_prints[4], 10, "67109890"); - mbedtls_mpi_read_string(&g_prints[5], 10, "5310023542746834"); - mbedtls_mpi_read_string(&g_prints[6], 10, "1455791217086302986"); - mbedtls_mpi_read_string(&g_prints[7], 10, "20052041432995567486"); - mbedtls_mpi_read_string(&g_prints[8], 10, "6041388139249378920330"); - mbedtls_mpi_read_string(&g_prints[9], 10, "207530445072488465666"); - mbedtls_mpi_read_string(&g_prints[10], 10, "79228162521181866724264247298"); - mbedtls_mpi_read_string(&g_prints[11], 10, "1760368345969468176824550810518"); - mbedtls_mpi_read_string(&g_prints[12], 10, "50079290986288516948354744811034"); - mbedtls_mpi_read_string(&g_prints[13], 10, "473022961816146413042658758988474"); - mbedtls_mpi_read_string(&g_prints[14], 10, "144390480366845522447407333004847678774"); - mbedtls_mpi_read_string(&g_prints[15], 10, "1800793591454480341970779146165214289059119882"); - mbedtls_mpi_read_string(&g_prints[16], 10, "126304807362733370595828809000324029340048915994"); + mbedtls_mpi_read_string(&prints[0], 10, "1026"); + mbedtls_mpi_read_string(&prints[1], 10, "5658"); + mbedtls_mpi_read_string(&prints[2], 10, "107286"); + mbedtls_mpi_read_string(&prints[3], 10, "199410"); + mbedtls_mpi_read_string(&prints[4], 10, "67109890"); + mbedtls_mpi_read_string(&prints[5], 10, "5310023542746834"); + mbedtls_mpi_read_string(&prints[6], 10, "1455791217086302986"); + mbedtls_mpi_read_string(&prints[7], 10, "20052041432995567486"); + mbedtls_mpi_read_string(&prints[8], 10, "6041388139249378920330"); + mbedtls_mpi_read_string(&prints[9], 10, "207530445072488465666"); + mbedtls_mpi_read_string(&prints[10], 10, "79228162521181866724264247298"); + mbedtls_mpi_read_string(&prints[11], 10, "1760368345969468176824550810518"); + mbedtls_mpi_read_string(&prints[12], 10, "50079290986288516948354744811034"); + mbedtls_mpi_read_string(&prints[13], 10, "473022961816146413042658758988474"); + mbedtls_mpi_read_string(&prints[14], 10, "144390480366845522447407333004847678774"); + mbedtls_mpi_read_string(&prints[15], 10, "1800793591454480341970779146165214289059119882"); + mbedtls_mpi_read_string(&prints[16], 10, "126304807362733370595828809000324029340048915994"); } -static void rocacheck_cleanup(void) { +static void rocacheck_cleanup(mbedtls_mpi *prints) { for (int i = 0; i < ROCA_PRINTS_LENGTH; i++) - mbedtls_mpi_free(&g_prints[i]); + mbedtls_mpi_free(&prints[i]); } static int bitand_is_zero(mbedtls_mpi *a, mbedtls_mpi *b) { @@ -97,8 +91,12 @@ bool emv_rocacheck(const unsigned char *buf, size_t buflen, bool verbose) { mbedtls_mpi_init(&t_modulus); bool ret = false; + mbedtls_mpi prints[ROCA_PRINTS_LENGTH]; + uint8_t primes[ROCA_PRINTS_LENGTH] = { + 11, 13, 17, 19, 37, 53, 61, 71, 73, 79, 97, 103, 107, 109, 127, 151, 157 + }; - rocacheck_init(); + rocacheck_init(prints); MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(&t_modulus, buf, buflen)); @@ -114,13 +112,13 @@ bool emv_rocacheck(const unsigned char *buf, size_t buflen, bool verbose) { MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&g_one, 10, "1")); - MBEDTLS_MPI_CHK(mbedtls_mpi_add_int(&t_prime, &t_prime, g_primes[i])); + MBEDTLS_MPI_CHK(mbedtls_mpi_add_int(&t_prime, &t_prime, primes[i])); MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(&t_temp, &t_modulus, &t_prime)); MBEDTLS_MPI_CHK(mbedtls_mpi_shift_l(&g_one, mpi_get_uint(&t_temp))); - if (bitand_is_zero(&g_one, &g_prints[i])) { + if (bitand_is_zero(&g_one, &prints[i])) { if (verbose) PrintAndLogEx(FAILED, "No fingerprint found.\n"); goto cleanup; @@ -138,7 +136,7 @@ bool emv_rocacheck(const unsigned char *buf, size_t buflen, bool verbose) { cleanup: mbedtls_mpi_free(&t_modulus); - rocacheck_cleanup(); + rocacheck_cleanup(prints); return ret; } diff --git a/client/src/graph.c b/client/src/graph.c index 6ce443155..3cb253b2c 100644 --- a/client/src/graph.c +++ b/client/src/graph.c @@ -19,7 +19,6 @@ int GraphBuffer[MAX_GRAPH_TRACE_LEN]; size_t GraphTraceLen; -int s_Buff[MAX_GRAPH_TRACE_LEN]; /* write a manchester bit to the graph TODO, verfy that this doesn't overflow buffer (iceman) diff --git a/client/src/graph.h b/client/src/graph.h index a53d65c06..deb51a31b 100644 --- a/client/src/graph.h +++ b/client/src/graph.h @@ -40,7 +40,6 @@ bool fskClocks(uint8_t *fc1, uint8_t *fc2, uint8_t *rf1, int *firstClockEdge); extern int GraphBuffer[MAX_GRAPH_TRACE_LEN]; extern size_t GraphTraceLen; -extern int s_Buff[MAX_GRAPH_TRACE_LEN]; #ifdef __cplusplus } diff --git a/client/src/proxguiqt.cpp b/client/src/proxguiqt.cpp index 7374982ea..149018b9f 100644 --- a/client/src/proxguiqt.cpp +++ b/client/src/proxguiqt.cpp @@ -34,11 +34,12 @@ extern "C" int preferences_save(void); -bool g_useOverlays = false; -int g_absVMax = 0; -uint32_t startMax; // Maximum offset in the graph (right side of graph) -uint32_t PageWidth; // How many samples are currently visible on this 'page' / graph -int unlockStart = 0; +static int s_Buff[MAX_GRAPH_TRACE_LEN]; +static bool g_useOverlays = false; +static int g_absVMax = 0; +static uint32_t startMax; // Maximum offset in the graph (right side of graph) +static uint32_t PageWidth; // How many samples are currently visible on this 'page' / graph +static int unlockStart = 0; void ProxGuiQT::ShowGraphWindow(void) { emit ShowGraphWindowSignal(); diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index 98fd33723..296149357 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -134,9 +134,9 @@ static int check_comm(void) { } // first slot is always NULL, indicating absence of script when idx=0 -FILE *cmdscriptfile[MAX_NESTED_CMDSCRIPT + 1] = {0}; -uint8_t cmdscriptfile_idx = 0; -bool cmdscriptfile_stayafter = false; +static FILE *cmdscriptfile[MAX_NESTED_CMDSCRIPT + 1] = {0}; +static uint8_t cmdscriptfile_idx = 0; +static bool cmdscriptfile_stayafter = false; int push_cmdscriptfile(char *path, bool stayafter) { if (cmdscriptfile_idx == MAX_NESTED_CMDSCRIPT) { diff --git a/client/src/uart/uart_posix.c b/client/src/uart/uart_posix.c index a846b0d78..1a6cf32a0 100644 --- a/client/src/uart/uart_posix.c +++ b/client/src/uart/uart_posix.c @@ -77,8 +77,8 @@ struct timeval timeout = { .tv_usec = UART_FPC_CLIENT_RX_TIMEOUT_MS * 1000 }; -uint32_t newtimeout_value = 0; -bool newtimeout_pending = false; +static uint32_t newtimeout_value = 0; +static bool newtimeout_pending = false; int uart_reconfigure_timeouts(uint32_t value) { newtimeout_value = value; diff --git a/client/src/ui.c b/client/src/ui.c index 15b57c259..86d996ae0 100644 --- a/client/src/ui.c +++ b/client/src/ui.c @@ -44,7 +44,7 @@ session_arg_t session; double CursorScaleFactor = 1; int PlotGridX = 0, PlotGridY = 0, PlotGridXdefault = 64, PlotGridYdefault = 64; uint32_t CursorCPos = 0, CursorDPos = 0; -bool flushAfterWrite = 0; +static bool flushAfterWrite = 0; int GridOffset = 0; bool GridLocked = false; bool showDemod = true; @@ -176,7 +176,7 @@ void PrintAndLogOptions(const char *str[][2], size_t size, size_t space) { PrintAndLogEx(NORMAL, "%s", buff); } -uint8_t PrintAndLogEx_spinidx = 0; +static uint8_t PrintAndLogEx_spinidx = 0; void PrintAndLogEx(logLevel_t level, const char *fmt, ...) { From 72987d562f9ff6a5710c10e8f08faa0680360f49 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Mon, 1 Jun 2020 23:44:41 +0200 Subject: [PATCH 449/632] Implement real callbacks for load/save prefs --- client/src/cmdhf15.c | 2 +- client/src/cmdhfcryptorf.c | 2 +- client/src/cmdhficlass.c | 6 +++--- client/src/cmdhflegic.c | 4 ++-- client/src/cmdhfmf.c | 10 +++++----- client/src/cmdhfmfdes.c | 2 +- client/src/cmdhfmfp.c | 2 +- client/src/cmdhfmfu.c | 2 +- client/src/cmdlfhitag.c | 4 ++-- client/src/cmdlft55xx.c | 2 +- client/src/fileutils.c | 20 ++++++++++---------- client/src/fileutils.h | 10 +++++----- client/src/preferences.c | 4 ++-- 13 files changed, 35 insertions(+), 35 deletions(-) diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index 9c6c343aa..8712a9829 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -1272,7 +1272,7 @@ static int CmdHF15Dump(const char *Cmd) { size_t datalen = blocknum * 4; saveFile(filename, ".bin", data, datalen); saveFileEML(filename, data, datalen, 4); - saveFileJSON(filename, jsf15, data, datalen); + saveFileJSON(filename, jsf15, data, datalen, NULL); return PM3_SUCCESS; } diff --git a/client/src/cmdhfcryptorf.c b/client/src/cmdhfcryptorf.c index 559dc0e35..7f727d4bf 100644 --- a/client/src/cmdhfcryptorf.c +++ b/client/src/cmdhfcryptorf.c @@ -495,7 +495,7 @@ static int CmdHFCryptoRFESave(const char *Cmd) { //needs to change saveFileEML(filename, data, numofbytes, 8); //needs to change - saveFileJSON(filename, jsfRaw, data, numofbytes); + saveFileJSON(filename, jsfRaw, data, numofbytes, NULL); return PM3_SUCCESS; } diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 85caf2364..d67deda5a 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -776,7 +776,7 @@ static int CmdHFiClassELoad(const char *Cmd) { break; } case JSON: { - res = loadFileJSON(filename, dump, 2048, &bytes_read); + res = loadFileJSON(filename, dump, 2048, &bytes_read, NULL); break; } case DICTIONARY: @@ -966,7 +966,7 @@ static int CmdHFiClassDecrypt(const char *Cmd) { saveFile(fptr, ".bin", decrypted, decryptedlen); saveFileEML(fptr, decrypted, decryptedlen, 8); - saveFileJSON(fptr, jsfIclass, decrypted, decryptedlen); + saveFileJSON(fptr, jsfIclass, decrypted, decryptedlen, NULL); PrintAndLogEx(INFO, "Following output skips CSN / block0"); printIclassDumpContents(decrypted, 1, (decryptedlen / 8), decryptedlen); @@ -1433,7 +1433,7 @@ static int CmdHFiClassReader_Dump(const char *Cmd) { PrintAndLogEx(SUCCESS, "saving dump file - %zu blocks read", gotBytes / 8); saveFile(filename, ".bin", tag_data, gotBytes); saveFileEML(filename, tag_data, gotBytes, 8); - saveFileJSON(filename, jsfIclass, tag_data, gotBytes); + saveFileJSON(filename, jsfIclass, tag_data, gotBytes, NULL); return PM3_SUCCESS; } diff --git a/client/src/cmdhflegic.c b/client/src/cmdhflegic.c index 28138f0ea..a97d13d3f 100644 --- a/client/src/cmdhflegic.c +++ b/client/src/cmdhflegic.c @@ -1026,7 +1026,7 @@ static int CmdLegicDump(const char *Cmd) { saveFile(filename, ".bin", data, readlen); saveFileEML(filename, data, readlen, 8); - saveFileJSON(filename, jsfLegic, data, readlen); + saveFileJSON(filename, jsfLegic, data, readlen, NULL); free(data); return PM3_SUCCESS; } @@ -1299,7 +1299,7 @@ static int CmdLegicESave(const char *Cmd) { saveFile(filename, ".bin", data, numofbytes); saveFileEML(filename, data, numofbytes, 8); - saveFileJSON(filename, jsfLegic, data, numofbytes); + saveFileJSON(filename, jsfLegic, data, numofbytes, NULL); return PM3_SUCCESS; } diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index e3813a5a2..9a4c36d9d 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -1068,7 +1068,7 @@ static int CmdHF14AMfDump(const char *Cmd) { saveFile(dataFilename, ".bin", (uint8_t *)carddata, bytes); saveFileEML(dataFilename, (uint8_t *)carddata, bytes, MFBLOCK_SIZE); - saveFileJSON(dataFilename, jsfCardMemory, (uint8_t *)carddata, bytes); + saveFileJSON(dataFilename, jsfCardMemory, (uint8_t *)carddata, bytes, NULL); return PM3_SUCCESS; } @@ -2518,7 +2518,7 @@ all_found: saveFile(filename, ".bin", dump, bytes); saveFileEML(filename, dump, bytes, MFBLOCK_SIZE); - saveFileJSON(filename, jsfCardMemory, dump, bytes); + saveFileJSON(filename, jsfCardMemory, dump, bytes, NULL); // Generate and show statistics t1 = msclock() - t1; @@ -3832,7 +3832,7 @@ static int CmdHF14AMfESave(const char *Cmd) { saveFile(filename, ".bin", dump, bytes); saveFileEML(filename, dump, bytes, MFBLOCK_SIZE); - saveFileJSON(filename, jsfCardMemory, dump, bytes); + saveFileJSON(filename, jsfCardMemory, dump, bytes, NULL); free(dump); return PM3_SUCCESS; } @@ -4150,7 +4150,7 @@ static int CmdHF14AMfCLoad(const char *Cmd) { res = loadFile(fileName, ".bin", data, maxdatalen, &datalen); } else { if (fillFromJson) { - res = loadFileJSON(fileName, data, maxdatalen, &datalen); + res = loadFileJSON(fileName, data, maxdatalen, &datalen, NULL); } else { res = loadFileEML(Cmd, data, &datalen); } @@ -4412,7 +4412,7 @@ static int CmdHF14AMfCSave(const char *Cmd) { saveFile(filename, ".bin", dump, bytes); saveFileEML(filename, dump, bytes, MFBLOCK_SIZE); - saveFileJSON(filename, jsfCardMemory, dump, bytes); + saveFileJSON(filename, jsfCardMemory, dump, bytes, NULL); free(dump); return PM3_SUCCESS; } diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index 7f79bd1dd..9d9cd68e0 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -4114,7 +4114,7 @@ static int CmdHF14aDesChk(const char *Cmd) { // length: UID(10b)+SAK(1b)+ATQA(2b)+ATSlen(1b)+ATS(atslen)+foundKeys[2][64][AES_KEY_LEN + 1] memcpy(&data[14 + atslen], foundKeys, 4 * 0xE * (24 + 1)); - saveFileJSON((char *)jsonname, jsfMfDesfireKeys, data, 0xE); + saveFileJSON((char *)jsonname, jsfMfDesfireKeys, data, 0xE, NULL); } return PM3_SUCCESS; diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index 7cdeb5eb1..5f10406b1 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -1277,7 +1277,7 @@ static int CmdHFMFPChk(const char *Cmd) { // length: UID(10b)+SAK(1b)+ATQA(2b)+ATSlen(1b)+ATS(atslen)+foundKeys[2][64][AES_KEY_LEN + 1] memcpy(&data[14 + atslen], foundKeys, 2 * 64 * (AES_KEY_LEN + 1)); - saveFileJSON((char *)jsonname, jsfMfPlusKeys, data, 64); + saveFileJSON((char *)jsonname, jsfMfPlusKeys, data, 64, NULL); } return PM3_SUCCESS; diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index dd812dd79..c5f22b628 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -2090,7 +2090,7 @@ static int CmdHF14AMfUDump(const char *Cmd) { } uint16_t datalen = pages * 4 + MFU_DUMP_PREFIX_LENGTH; saveFile(filename, ".bin", (uint8_t *)&dump_file_data, datalen); - saveFileJSON(filename, jsfMfuMemory, (uint8_t *)&dump_file_data, datalen); + saveFileJSON(filename, jsfMfuMemory, (uint8_t *)&dump_file_data, datalen, NULL); if (is_partial) PrintAndLogEx(WARNING, "Partial dump created. (%d of %d blocks)", pages, card_mem_size); diff --git a/client/src/cmdlfhitag.c b/client/src/cmdlfhitag.c index 28cbd41d0..b05405465 100644 --- a/client/src/cmdlfhitag.c +++ b/client/src/cmdlfhitag.c @@ -330,7 +330,7 @@ static int CmdLFHitagSim(const char *Cmd) { break; case 'j': param_getstr(Cmd, cmdp + 1, filename, sizeof(filename)); - res = loadFileJSON(filename, data, maxdatalen, &datalen); + res = loadFileJSON(filename, data, maxdatalen, &datalen, NULL); if (res > 0) { errors = true; break; @@ -725,7 +725,7 @@ static int CmdLFHitag2Dump(const char *Cmd) { saveFile(filename, ".bin", data, 48); saveFileEML(filename, data, 48, 4); - saveFileJSON(filename, jsfHitag, data, 48); + saveFileJSON(filename, jsfHitag, data, 48, NULL); return PM3_SUCCESS; } diff --git a/client/src/cmdlft55xx.c b/client/src/cmdlft55xx.c index a4a885e1f..6294ffef6 100644 --- a/client/src/cmdlft55xx.c +++ b/client/src/cmdlft55xx.c @@ -2319,7 +2319,7 @@ static int CmdT55xxDump(const char *Cmd) { for (int i = 0; i < T55x7_BLOCK_COUNT; i++) data[i] = BSWAP_32(cardmem[i].blockdata); - saveFileJSON(preferredName, jsfT55x7, (uint8_t *)data, T55x7_BLOCK_COUNT * sizeof(uint32_t)); + saveFileJSON(preferredName, jsfT55x7, (uint8_t *)data, T55x7_BLOCK_COUNT * sizeof(uint32_t), NULL); saveFileEML(preferredName, (uint8_t *)data, T55x7_BLOCK_COUNT * sizeof(uint32_t), sizeof(uint32_t)); saveFile(preferredName, ".bin", data, sizeof(data)); } diff --git a/client/src/fileutils.c b/client/src/fileutils.c index d5315e3b9..d8176f65c 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -312,10 +312,10 @@ out: return retval; } -int saveFileJSON(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen) { - return saveFileJSONex(preferredName, ftype, data, datalen, true); +int saveFileJSON(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen, void (*callback)(json_t *)) { + return saveFileJSONex(preferredName, ftype, data, datalen, true, callback); } -int saveFileJSONex(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen, bool verbose) { +int saveFileJSONex(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen, bool verbose, void (*callback)(json_t *)) { if (data == NULL) return PM3_EINVARG; @@ -548,8 +548,8 @@ int saveFileJSONex(const char *preferredName, JSONFileType ftype, uint8_t *data, } } break; - case jsfSettings: - preferences_save_callback(root); + case jsfCustom: + (*callback)(root); break; default: break; @@ -855,10 +855,10 @@ out: return retval; } -int loadFileJSON(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen) { - return loadFileJSONex(preferredName, data, maxdatalen, datalen, true); +int loadFileJSON(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen, void (*callback)(json_t *)) { + return loadFileJSONex(preferredName, data, maxdatalen, datalen, true, callback); } -int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen, bool verbose) { +int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen, bool verbose, void (*callback)(json_t *)) { if (data == NULL) return PM3_EINVARG; char *fileName = filenamemcopy(preferredName, ".json"); @@ -1001,8 +1001,8 @@ int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, siz if (verbose) PrintAndLogEx(SUCCESS, "loaded from JSON file " _YELLOW_("%s"), fileName); - if (!strcmp(ctype, "settings")) { - preferences_load_callback(root); + if (callback != NULL) { + (*callback)(root); } out: json_decref(root); diff --git a/client/src/fileutils.h b/client/src/fileutils.h index cf00efb03..96170a440 100644 --- a/client/src/fileutils.h +++ b/client/src/fileutils.h @@ -62,7 +62,7 @@ typedef enum { jsfT55x7, jsfT5555, jsfMfPlusKeys, - jsfSettings, + jsfCustom, jsfMfDesfireKeys, } JSONFileType; @@ -115,8 +115,8 @@ int saveFileEML(const char *preferredName, uint8_t *data, size_t datalen, size_t * @param datalen the length of the data * @return 0 for ok, 1 for failz */ -int saveFileJSON(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen); -int saveFileJSONex(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen, bool verbose); +int saveFileJSON(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen, void (*callback)(json_t *)); +int saveFileJSONex(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen, bool verbose, void (*callback)(json_t *)); /** STUB * @brief Utility function to save WAVE data to a file. This method takes a preferred name, but if that @@ -198,8 +198,8 @@ int loadFileEML(const char *preferredName, void *data, size_t *datalen); * @param datalen the number of bytes loaded from file * @return 0 for ok, 1 for failz */ -int loadFileJSON(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen); -int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen, bool verbose); +int loadFileJSON(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen, void (*callback)(json_t *)); +int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen, bool verbose, void (*callback)(json_t *)); /** diff --git a/client/src/preferences.c b/client/src/preferences.c index 89d9cc188..5ae73b902 100644 --- a/client/src/preferences.c +++ b/client/src/preferences.c @@ -89,7 +89,7 @@ int preferences_load(void) { char *fn = prefGetFilename(); if (fileExists(fn)) { PrintAndLogEx(INFO, "Loading Preferences..."); - if (loadFileJSON(fn, &dummyData, sizeof(dummyData), &dummyDL) == PM3_SUCCESS) { + if (loadFileJSON(fn, &dummyData, sizeof(dummyData), &dummyDL, &preferences_load_callback) == PM3_SUCCESS) { session.preferences_loaded = true; } } @@ -139,7 +139,7 @@ int preferences_save(void) { uint8_t dummyData = 0x00; size_t dummyDL = 0x00; - if (saveFileJSON(fn, jsfSettings, &dummyData, dummyDL) != PM3_SUCCESS) + if (saveFileJSON(fn, jsfCustom, &dummyData, dummyDL, &preferences_save_callback) != PM3_SUCCESS) PrintAndLogEx(ERR, "Error saving preferences to \"%s\"", fn); free(fn); From aff86a29396f2a00a566948ee658280565a1155e Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Tue, 2 Jun 2020 01:16:21 +0200 Subject: [PATCH 450/632] cleaner paths in cmake --- client/CMakeLists.txt | 307 +++++++++++++++++++++--------------------- 1 file changed, 153 insertions(+), 154 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 28735b9b7..0b8fea18d 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -7,6 +7,7 @@ cmake_minimum_required(VERSION 3.10) project(proxmark3) +SET (PM3_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/..) if(CMAKE_VERSION VERSION_LESS "3.7.0") set(CMAKE_INCLUDE_CURRENT_DIR ON) @@ -41,152 +42,149 @@ pkg_search_module(BLUEZ QUIET bluez) pkg_search_module(PYTHON3 QUIET python3) pkg_search_module(PYTHON3EMBED QUIET python3-embed) -SET (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake") - -add_subdirectory(deps) +add_subdirectory(${PM3_ROOT}/client/deps deps) set (TARGET_SOURCES - src/proxmark3.c - ../common/commonutil.c - ../common/util_posix.c - ../common/parity.c - ../common/bucketsort.c - ../common/crapto1/crapto1.c - ../common/crapto1/crypto1.c - ../common/crc.c - ../common/crc16.c - ../common/crc32.c - ../common/crc64.c - ../common/lfdemod.c - ../common/legic_prng.c - ../common/iso15693tools.c - ../common/cardhelper.c - ../common/generator.c - src/crypto/asn1dump.c - src/crypto/asn1utils.c - src/crypto/libpcrypto.c - src/emv/test/cda_test.c - src/emv/test/crypto_test.c - src/emv/test/cryptotest.c - src/emv/test/dda_test.c - src/emv/test/sda_test.c - src/emv/apduinfo.c - src/emv/cmdemv.c - src/emv/crypto.c - src/emv/crypto_polarssl.c - src/emv/dol.c - src/emv/dump.c - src/emv/emv_pk.c - src/emv/emv_pki.c - src/emv/emv_pki_priv.c - src/emv/emv_roca.c - src/emv/emv_tags.c - src/emv/emvcore.c - src/emv/emvjson.c - src/emv/tlv.c - src/fido/additional_ca.c - src/fido/cbortools.c - src/fido/cose.c - src/fido/fidocore.c - src/loclass/cipher.c - src/loclass/cipherutils.c - src/loclass/elite_crack.c - src/loclass/hash1_brute.c - src/loclass/ikeys.c - src/mifare/mad.c - src/mifare/mfkey.c - src/mifare/mifare4.c - src/mifare/mifaredefault.c - src/mifare/mifarehost.c - src/mifare/ndef.c - src/mifare/desfire_crypto.c - src/uart/uart_posix.c - src/uart/uart_win32.c - src/ui/overlays.ui - src/aidsearch.c - src/cmdanalyse.c - src/cmdcrc.c - src/cmddata.c - src/cmdflashmem.c - src/cmdflashmemspiffs.c - src/cmdhf.c - src/cmdhf14a.c - src/cmdhf14b.c - src/cmdhf15.c - src/cmdhfcryptorf.c - src/cmdhfepa.c - src/cmdhffelica.c - src/cmdhffido.c - src/cmdhficlass.c - src/cmdhflegic.c - src/cmdhflist.c - src/cmdhflto.c - src/cmdhfmf.c - src/cmdhfmfdes.c - src/cmdhfmfhard.c - src/cmdhfmfp.c - src/cmdhfmfu.c - src/cmdhfthinfilm.c - src/cmdhftopaz.c - src/cmdhw.c - src/cmdlf.c - src/cmdlfawid.c - src/cmdlfcotag.c - src/cmdlfem4x.c - src/cmdlffdx.c - src/cmdlfgallagher.c - src/cmdlfguard.c - src/cmdlfhid.c - src/cmdlfhitag.c - src/cmdlfindala.c - src/cmdlfio.c - src/cmdlfjablotron.c - src/cmdlfkeri.c - src/cmdlfmotorola.c - src/cmdlfnedap.c - src/cmdlfnexwatch.c - src/cmdlfnoralsy.c - src/cmdlfpac.c - src/cmdlfparadox.c - src/cmdlfpcf7931.c - src/cmdlfpresco.c - src/cmdlfpyramid.c - src/cmdlfsecurakey.c - src/cmdlft55xx.c - src/cmdlfti.c - src/cmdlfverichip.c - src/cmdlfviking.c - src/cmdlfvisa2000.c - src/cmdmain.c - src/cmdparser.c - src/cmdscript.c - src/cmdsmartcard.c - src/cmdtrace.c - src/cmdusart.c - src/cmdwiegand.c - src/comms.c - src/fileutils.c - src/flash.c - src/graph.c - src/jansson_path.c - src/preferences.c - src/pm3_binlib.c - src/pm3_bitlib.c - src/prng.c - src/scandir.c - src/scripting.c - src/tea.c - src/ui.c - src/util.c - src/wiegand_formats.c - src/wiegand_formatutils.c + ${PM3_ROOT}/common/commonutil.c + ${PM3_ROOT}/common/util_posix.c + ${PM3_ROOT}/common/parity.c + ${PM3_ROOT}/common/bucketsort.c + ${PM3_ROOT}/common/crapto1/crapto1.c + ${PM3_ROOT}/common/crapto1/crypto1.c + ${PM3_ROOT}/common/crc.c + ${PM3_ROOT}/common/crc16.c + ${PM3_ROOT}/common/crc32.c + ${PM3_ROOT}/common/crc64.c + ${PM3_ROOT}/common/lfdemod.c + ${PM3_ROOT}/common/legic_prng.c + ${PM3_ROOT}/common/iso15693tools.c + ${PM3_ROOT}/common/cardhelper.c + ${PM3_ROOT}/common/generator.c + ${PM3_ROOT}/client/src/crypto/asn1dump.c + ${PM3_ROOT}/client/src/crypto/asn1utils.c + ${PM3_ROOT}/client/src/crypto/libpcrypto.c + ${PM3_ROOT}/client/src/emv/test/cda_test.c + ${PM3_ROOT}/client/src/emv/test/crypto_test.c + ${PM3_ROOT}/client/src/emv/test/cryptotest.c + ${PM3_ROOT}/client/src/emv/test/dda_test.c + ${PM3_ROOT}/client/src/emv/test/sda_test.c + ${PM3_ROOT}/client/src/emv/apduinfo.c + ${PM3_ROOT}/client/src/emv/cmdemv.c + ${PM3_ROOT}/client/src/emv/crypto.c + ${PM3_ROOT}/client/src/emv/crypto_polarssl.c + ${PM3_ROOT}/client/src/emv/dol.c + ${PM3_ROOT}/client/src/emv/dump.c + ${PM3_ROOT}/client/src/emv/emv_pk.c + ${PM3_ROOT}/client/src/emv/emv_pki.c + ${PM3_ROOT}/client/src/emv/emv_pki_priv.c + ${PM3_ROOT}/client/src/emv/emv_roca.c + ${PM3_ROOT}/client/src/emv/emv_tags.c + ${PM3_ROOT}/client/src/emv/emvcore.c + ${PM3_ROOT}/client/src/emv/emvjson.c + ${PM3_ROOT}/client/src/emv/tlv.c + ${PM3_ROOT}/client/src/fido/additional_ca.c + ${PM3_ROOT}/client/src/fido/cbortools.c + ${PM3_ROOT}/client/src/fido/cose.c + ${PM3_ROOT}/client/src/fido/fidocore.c + ${PM3_ROOT}/client/src/loclass/cipher.c + ${PM3_ROOT}/client/src/loclass/cipherutils.c + ${PM3_ROOT}/client/src/loclass/elite_crack.c + ${PM3_ROOT}/client/src/loclass/hash1_brute.c + ${PM3_ROOT}/client/src/loclass/ikeys.c + ${PM3_ROOT}/client/src/mifare/mad.c + ${PM3_ROOT}/client/src/mifare/mfkey.c + ${PM3_ROOT}/client/src/mifare/mifare4.c + ${PM3_ROOT}/client/src/mifare/mifaredefault.c + ${PM3_ROOT}/client/src/mifare/mifarehost.c + ${PM3_ROOT}/client/src/mifare/ndef.c + ${PM3_ROOT}/client/src/mifare/desfire_crypto.c + ${PM3_ROOT}/client/src/uart/uart_posix.c + ${PM3_ROOT}/client/src/uart/uart_win32.c + ${PM3_ROOT}/client/src/ui/overlays.ui + ${PM3_ROOT}/client/src/aidsearch.c + ${PM3_ROOT}/client/src/cmdanalyse.c + ${PM3_ROOT}/client/src/cmdcrc.c + ${PM3_ROOT}/client/src/cmddata.c + ${PM3_ROOT}/client/src/cmdflashmem.c + ${PM3_ROOT}/client/src/cmdflashmemspiffs.c + ${PM3_ROOT}/client/src/cmdhf.c + ${PM3_ROOT}/client/src/cmdhf14a.c + ${PM3_ROOT}/client/src/cmdhf14b.c + ${PM3_ROOT}/client/src/cmdhf15.c + ${PM3_ROOT}/client/src/cmdhfcryptorf.c + ${PM3_ROOT}/client/src/cmdhfepa.c + ${PM3_ROOT}/client/src/cmdhffelica.c + ${PM3_ROOT}/client/src/cmdhffido.c + ${PM3_ROOT}/client/src/cmdhficlass.c + ${PM3_ROOT}/client/src/cmdhflegic.c + ${PM3_ROOT}/client/src/cmdhflist.c + ${PM3_ROOT}/client/src/cmdhflto.c + ${PM3_ROOT}/client/src/cmdhfmf.c + ${PM3_ROOT}/client/src/cmdhfmfdes.c + ${PM3_ROOT}/client/src/cmdhfmfhard.c + ${PM3_ROOT}/client/src/cmdhfmfp.c + ${PM3_ROOT}/client/src/cmdhfmfu.c + ${PM3_ROOT}/client/src/cmdhfthinfilm.c + ${PM3_ROOT}/client/src/cmdhftopaz.c + ${PM3_ROOT}/client/src/cmdhw.c + ${PM3_ROOT}/client/src/cmdlf.c + ${PM3_ROOT}/client/src/cmdlfawid.c + ${PM3_ROOT}/client/src/cmdlfcotag.c + ${PM3_ROOT}/client/src/cmdlfem4x.c + ${PM3_ROOT}/client/src/cmdlffdx.c + ${PM3_ROOT}/client/src/cmdlfgallagher.c + ${PM3_ROOT}/client/src/cmdlfguard.c + ${PM3_ROOT}/client/src/cmdlfhid.c + ${PM3_ROOT}/client/src/cmdlfhitag.c + ${PM3_ROOT}/client/src/cmdlfindala.c + ${PM3_ROOT}/client/src/cmdlfio.c + ${PM3_ROOT}/client/src/cmdlfjablotron.c + ${PM3_ROOT}/client/src/cmdlfkeri.c + ${PM3_ROOT}/client/src/cmdlfmotorola.c + ${PM3_ROOT}/client/src/cmdlfnedap.c + ${PM3_ROOT}/client/src/cmdlfnexwatch.c + ${PM3_ROOT}/client/src/cmdlfnoralsy.c + ${PM3_ROOT}/client/src/cmdlfpac.c + ${PM3_ROOT}/client/src/cmdlfparadox.c + ${PM3_ROOT}/client/src/cmdlfpcf7931.c + ${PM3_ROOT}/client/src/cmdlfpresco.c + ${PM3_ROOT}/client/src/cmdlfpyramid.c + ${PM3_ROOT}/client/src/cmdlfsecurakey.c + ${PM3_ROOT}/client/src/cmdlft55xx.c + ${PM3_ROOT}/client/src/cmdlfti.c + ${PM3_ROOT}/client/src/cmdlfverichip.c + ${PM3_ROOT}/client/src/cmdlfviking.c + ${PM3_ROOT}/client/src/cmdlfvisa2000.c + ${PM3_ROOT}/client/src/cmdmain.c + ${PM3_ROOT}/client/src/cmdparser.c + ${PM3_ROOT}/client/src/cmdscript.c + ${PM3_ROOT}/client/src/cmdsmartcard.c + ${PM3_ROOT}/client/src/cmdtrace.c + ${PM3_ROOT}/client/src/cmdusart.c + ${PM3_ROOT}/client/src/cmdwiegand.c + ${PM3_ROOT}/client/src/comms.c + ${PM3_ROOT}/client/src/fileutils.c + ${PM3_ROOT}/client/src/flash.c + ${PM3_ROOT}/client/src/graph.c + ${PM3_ROOT}/client/src/jansson_path.c + ${PM3_ROOT}/client/src/preferences.c + ${PM3_ROOT}/client/src/pm3_binlib.c + ${PM3_ROOT}/client/src/pm3_bitlib.c + ${PM3_ROOT}/client/src/prng.c + ${PM3_ROOT}/client/src/scandir.c + ${PM3_ROOT}/client/src/scripting.c + ${PM3_ROOT}/client/src/tea.c + ${PM3_ROOT}/client/src/ui.c + ${PM3_ROOT}/client/src/util.c + ${PM3_ROOT}/client/src/wiegand_formats.c + ${PM3_ROOT}/client/src/wiegand_formatutils.c ${CMAKE_BINARY_DIR}/version.c ) add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/version.c - COMMAND sh ${CMAKE_SOURCE_DIR}/../tools/mkversion.sh > ${CMAKE_BINARY_DIR}/version.c || perl ${CMAKE_SOURCE_DIR}/../tools/mkversion.pl > ${CMAKE_BINARY_DIR}/version.c || ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../common/default_version.c ${CMAKE_BINARY_DIR}/version.c - DEPENDS ${CMAKE_SOURCE_DIR}/../common/default_version.c + COMMAND sh ${PM3_ROOT}/tools/mkversion.sh > ${CMAKE_BINARY_DIR}/version.c || perl ${PM3_ROOT}/tools/mkversion.pl > ${CMAKE_BINARY_DIR}/version.c || ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version.c ${CMAKE_BINARY_DIR}/version.c + DEPENDS ${PM3_ROOT}/common/default_version.c ) set(ADDITIONAL_SRC "") @@ -199,7 +197,7 @@ message(STATUS "CMAKE_SYSTEM_PROCESSOR := ${CMAKE_SYSTEM_PROCESSOR}") if (APPLE) message("Apple device detected.") - set(ADDITIONAL_SRC src/util_darwin.h src/util_darwin.m ${ADDITIONAL_SRC}) + set(ADDITIONAL_SRC ${PM3_ROOT}/client/src/util_darwin.h ${PM3_ROOT}/client/src/util_darwin.m ${ADDITIONAL_SRC}) set(ADDITIONAL_LNK "-framework Foundation" "-framework AppKit") endif (APPLE) @@ -209,8 +207,8 @@ if (Qt5_FOUND) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) set (TARGET_SOURCES - src/proxgui.cpp - src/proxguiqt.cpp + ${PM3_ROOT}/client/src/proxgui.cpp + ${PM3_ROOT}/client/src/proxguiqt.cpp ${TARGET_SOURCES}) add_definitions("-DHAVE_GUI") @@ -218,7 +216,7 @@ if (Qt5_FOUND) else (Qt5_FOUND) message("Qt5 library not found, not building gui") set(TARGET_SOURCES - src/guidummy.cpp + ${PM3_ROOT}/client/src/guidummy.cpp ${TARGET_SOURCES}) endif (Qt5_FOUND) @@ -230,20 +228,20 @@ endif (BLUEZ_FOUND) if (PYTHON3EMBED_FOUND) message("Python3-embed library found, building with python3 support :)") - add_definitions("-DHAVE_PYTHON") + add_definitions(-DHAVE_PYTHON) set(ADDITIONAL_DIRS ${PYTHON3EMBED_INCLUDE_DIRS} ${ADDITIONAL_DIRS}) set(ADDITIONAL_LNK ${PYTHON3EMBED_LIBRARIES} ${ADDITIONAL_LNK}) set(ADDITIONAL_LNKDIRS ${PYTHON3EMBED_LIBRARY_DIRS} ${ADDITIONAL_LNKDIRS}) elseif (PYTHON3_FOUND) message("Python3 library found, building with python3 support :)") - add_definitions("-DHAVE_PYTHON") + add_definitions(-DHAVE_PYTHON) set(ADDITIONAL_DIRS ${PYTHON3_INCLUDE_DIRS} ${ADDITIONAL_DIRS}) set(ADDITIONAL_LNK ${PYTHON3_LIBRARIES} ${ADDITIONAL_LNK}) set(ADDITIONAL_LNKDIRS ${PYTHON3_LIBRARY_DIRS} ${ADDITIONAL_LNKDIRS}) endif (PYTHON3EMBED_FOUND) -add_executable( - proxmark3 +add_executable(proxmark3 + ${PM3_ROOT}/client/src/proxmark3.c ${TARGET_SOURCES} ${ADDITIONAL_SRC} ) @@ -262,10 +260,11 @@ if (MINGW) endif (MINGW) target_include_directories(proxmark3 PRIVATE - ../common - ../common_fpga - ../include - src + ${PM3_ROOT}/common + ${PM3_ROOT}/common_fpga + ${PM3_ROOT}/include + ${PM3_ROOT}/client/src + ${PM3_ROOT}/client/include ${ADDITIONAL_DIRS} ) @@ -310,9 +309,9 @@ if (PYTHON3EMBED_FOUND OR PYTHON3_FOUND) target_link_directories(proxmark3 PRIVATE ${ADDITIONAL_LNKDIRS}) elseif (APPLE) message( SEND_ERROR "Your CMAKE version is too old for Apple platform, please update to a version >=3.13" ) - endif() -endif() - + endif (NOT CMAKE_VERSION VERSION_LESS 3.13) +endif (PYTHON3EMBED_FOUND OR PYTHON3_FOUND) + install(TARGETS proxmark3 DESTINATION "bin") install(DIRECTORY cmdscripts lualibs luascripts pyscripts resources dictionaries DESTINATION "share/proxmark3") From c3ab0b6527cc1bd63bf062d70b9dddfbe6c45d25 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 08:54:59 +0200 Subject: [PATCH 451/632] fix: #752 MINGW env needs to be using gnu printf --- client/deps/tinycbor/cbor.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/deps/tinycbor/cbor.h b/client/deps/tinycbor/cbor.h index 238a2717f..081597fec 100644 --- a/client/deps/tinycbor/cbor.h +++ b/client/deps/tinycbor/cbor.h @@ -556,8 +556,10 @@ enum CborPrettyFlags { }; typedef CborError(*CborStreamFunction)(void *token, const char *fmt, ...) -#ifdef __GNUC__ -__attribute__((__format__(printf, 2, 3))) +#if defined(__MINGW32__) || defined(__MINGW64__) + __attribute__((format (__MINGW_PRINTF_FORMAT, 2, 3))); +#elif defined(__GNUC__) + __attribute__((__format__(printf, 2, 3))) #endif ; From a62199ac0fad058a37e95a74cc28e57a0acaf2e1 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 09:15:56 +0200 Subject: [PATCH 452/632] fix: coverity 290109 resouce leak --- client/src/cmdscript.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/src/cmdscript.c b/client/src/cmdscript.c index 38c980765..4e9c5fc1f 100644 --- a/client/src/cmdscript.c +++ b/client/src/cmdscript.c @@ -169,6 +169,7 @@ static int CmdScriptRun(const char *Cmd) { char *extension_chk; extension_chk = str_dup(preferredName); str_lower(extension_chk); + pm3_scriptfile_t ext = PM3_UNSPECIFIED; if (str_endswith(extension_chk, ".lua")) { ext = PM3_LUA; @@ -180,6 +181,7 @@ static int CmdScriptRun(const char *Cmd) { ext = PM3_PY; } #endif + free(extension_chk); char *script_path = NULL; if (((ext == PM3_LUA) || (ext == PM3_UNSPECIFIED)) && (searchFile(&script_path, LUA_SCRIPTS_SUBDIR, preferredName, ".lua", true) == PM3_SUCCESS)) { From 071ab7193c5b491776be7b200224d3e2cd27171a Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 09:17:10 +0200 Subject: [PATCH 453/632] fix coverity 290110 - missing break --- client/src/cmdhfmfu.c | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index c5f22b628..54e0b2423 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -2177,6 +2177,7 @@ static int CmdHF14AMfURestore(const char *Cmd) { case 'v': cmdp++; verbose = true; + break; default: PrintAndLogEx(WARNING, "Unknown parameter: " _RED_("'%c'"), param_getchar(Cmd, cmdp)); errors = true; From c53c79f0ba05792b4c2ae3e2f3fc2cd080bd2b11 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 09:18:45 +0200 Subject: [PATCH 454/632] fix coverity 290111 --- client/src/cmdhfmfdes.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index 9d9cd68e0..1d3943446 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -4007,7 +4007,7 @@ static int CmdHF14aDesChk(const char *Cmd) { endFilePosition = 0; res = loadFileDICTIONARYEx((char *)dict_filename, k3kkeyList, sizeof(k3kkeyList), NULL, 24, &k3kkeyListLen, 0, &endFilePosition, true); - if (PM3_SUCCESS && endFilePosition) + if (res == PM3_SUCCESS && endFilePosition) PrintAndLogEx(SUCCESS, "First part of k3kdes dictionary successfully loaded."); endFilePosition = 0; From 5b1e16b14eb0d883433ae54e611de70c4b30d80d Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 09:24:23 +0200 Subject: [PATCH 455/632] cppcheck warning --- client/deps/cliparser/cliparser.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/client/deps/cliparser/cliparser.h b/client/deps/cliparser/cliparser.h index b0000f77b..0bb75413f 100644 --- a/client/deps/cliparser/cliparser.h +++ b/client/deps/cliparser/cliparser.h @@ -40,11 +40,11 @@ typedef struct { const char *programHelp; char buf[500]; } CLIParserContext; -int CLIParserInit(CLIParserContext **context, const char *vprogramName, const char *vprogramHint, const char *vprogramHelp); -int CLIParserParseString(CLIParserContext *context, const char *str, void *vargtable[], size_t vargtableLen, bool allowEmptyExec); -int CLIParserParseStringEx(CLIParserContext *context, const char *str, void *vargtable[], size_t vargtableLen, bool allowEmptyExec, bool clueData); -int CLIParserParseArg(CLIParserContext *context, int argc, char **argv, void *vargtable[], size_t vargtableLen, bool allowEmptyExec); -void CLIParserFree(CLIParserContext *context); +int CLIParserInit(CLIParserContext **ctx, const char *vprogramName, const char *vprogramHint, const char *vprogramHelp); +int CLIParserParseString(CLIParserContext *ctx, const char *str, void *vargtable[], size_t vargtableLen, bool allowEmptyExec); +int CLIParserParseStringEx(CLIParserContext *ctx, const char *str, void *vargtable[], size_t vargtableLen, bool allowEmptyExec, bool clueData); +int CLIParserParseArg(CLIParserContext *ctx, int argc, char **argv, void *vargtable[], size_t vargtableLen, bool allowEmptyExec); +void CLIParserFree(CLIParserContext *ctx); int CLIParamHexToBuf(struct arg_str *argstr, uint8_t *data, int maxdatalen, int *datalen); int CLIParamStrToBuf(struct arg_str *argstr, uint8_t *data, int maxdatalen, int *datalen); From 8ed6afa99a5ac20fd8e13e8f1f1ea6cff81be0b0 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 09:37:23 +0200 Subject: [PATCH 456/632] fix cppcheck --- client/src/cmdhfmf.c | 1 - 1 file changed, 1 deletion(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 9a4c36d9d..85f390b4b 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -3133,7 +3133,6 @@ void showSectorTable(sector_t *k_sector, uint8_t k_sectorsCount) { if (k_sector != NULL) { printKeyTable(k_sectorsCount, k_sector); free(k_sector); - k_sector = NULL; } } From d84008449202fb9fd152594e75f39025ee98edfe Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 09:37:53 +0200 Subject: [PATCH 457/632] rearrange --- client/src/emv/cmdemv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/emv/cmdemv.c b/client/src/emv/cmdemv.c index 4b364c85c..905bbb99e 100644 --- a/client/src/emv/cmdemv.c +++ b/client/src/emv/cmdemv.c @@ -1809,7 +1809,6 @@ static int CmdEMVRoca(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, true); - EMVCommandChannel channel = ECC_CONTACTLESS; if (arg_get_lit(1)) { CLIParserFree(ctx); return roca_self_test(); @@ -1817,6 +1816,7 @@ static int CmdEMVRoca(const char *Cmd) { bool show_apdu = arg_get_lit(2); + EMVCommandChannel channel = ECC_CONTACTLESS; if (arg_get_lit(3)) channel = ECC_CONTACT; From fae243855975c080ac46bbf6343d8eddd0c13dda Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 10:38:18 +0200 Subject: [PATCH 458/632] fix cppcheck --- client/android/pm3_main.c | 112 +++++++++++++++++--------------------- 1 file changed, 50 insertions(+), 62 deletions(-) diff --git a/client/android/pm3_main.c b/client/android/pm3_main.c index d35ae25fc..5d8d51059 100644 --- a/client/android/pm3_main.c +++ b/client/android/pm3_main.c @@ -27,82 +27,67 @@ #include "fileutils.h" #include "jni_tools.h" -#define LOCAL_SOCKET_SERVER_NAME "DXL.COM.ASL" - -void ShowGraphWindow() { +//iceman, todo: proxify socker server name. Maybe set in preferences? +#define PM3_LOCAL_SOCKET_SERVER "DXL.COM.ASL" +void ShowGraphWindow(void) { } void HideGraphWindow(void) { - } -void RepaintGraphWindow() { - +void RepaintGraphWindow(void) { } int push_cmdscriptfile(char *path, bool stayafter) { return PM3_SUCCESS; } -static char *g_android_my_executable_path = NULL; -static char *g_android_my_executable_directory = NULL; +static char *g_android_executable_directory = NULL; +static const char *g_android_user_directory = NULL; -const char *get_my_executable_path(void) { - return g_android_my_executable_path; +const char *get_executable_directory(void) { + + if (g_android_executable_directory == NULL) { + char buf[FILE_PATH_SIZE] = {0}; + getcwd(buf, sizeof(buf)); + strncat(buf, PATHSEP, 1) + g_android_executable_directory = strdup(buf); + } + return g_android_executable_directory; } -const char *get_my_executable_directory(void) { - if (g_android_my_executable_directory != NULL) free(g_android_my_executable_directory); - char buf[1024]; - // get current work directory - getcwd(buf, sizeof(buf)); - // add / to end. - sprintf(buf, "%s%s", buf, PATHSEP); - // create on global - g_android_my_executable_directory = strdup(buf); - return g_android_my_executable_directory; +const char *get_user_directory(void) { + return g_android_user_directory; } -static void set_my_executable_path(void) { - -} - -static const char *my_user_directory = NULL; - -const char *get_my_user_directory(void) { - return my_user_directory; -} - -static void set_my_user_directory(void) { -} - -static bool open() { +static bool OpenPm3(void) { if (conn.run) { return true; } - // Open with LocalSocket(Not a tcp connection!) - bool ret = OpenProxmark("socket:"LOCAL_SOCKET_SERVER_NAME, false, 1000, false, 115200); + // Open with LocalSocket. Not a tcp connection! + bool ret = OpenProxmark("socket:"PM3_LOCAL_SOCKET_SERVER, false, 1000, false, 115200); return ret; } /* * Transfers to the command buffer and waits for a new command to be executed * */ -jint sendCMD(JNIEnv *env, jobject instance, jstring cmd_) { - //may be pm3 not running. +jint Console(JNIEnv *env, jobject instance, jstring cmd_) { + if (!conn.run) { - if (open() && TestProxmark() == PM3_SUCCESS) { - LOGD("Open Successfully!"); - PrintAndLogEx(NORMAL, "Open Successfully!"); + if (OpenPm3() && TestProxmark() == PM3_SUCCESS) { + LOGD("Connected to device"); + PrintAndLogEx(SUCCESS, "Connected to device"); } else { - LOGD("Open failed!"); - PrintAndLogEx(NORMAL, "Open failed!"); + LOGD("Failed to connect to device"); + PrintAndLogEx(ERR, "Failed to connect to device"); CloseProxmark(); } } - // display on new line - PrintAndLogEx(NORMAL, "\n"); + + PrintAndLogEx(NORMAL, ""); + char *cmd = (char *) ((*env)->GetStringUTFChars(env, cmd_, 0)); int ret = CommandReceived(cmd); if (ret == 99) { @@ -110,6 +95,7 @@ jint sendCMD(JNIEnv *env, jobject instance, jstring cmd_) { // TODO: implement this PrintAndLogEx(NORMAL, "Asked to exit, can't really do that yet..."); } + (*env)->ReleaseStringUTFChars(env, cmd_, cmd); return ret; } @@ -117,33 +103,34 @@ jint sendCMD(JNIEnv *env, jobject instance, jstring cmd_) { /* * Is client running! * */ -jboolean isExecuting(JNIEnv *env, jobject instance) { +jboolean IsClientRunning(JNIEnv *env, jobject instance) { return (jboolean) ((jboolean) conn.run); } /* * test hw and hw and client. * */ -jboolean testPm3(JNIEnv *env, jobject instance) { - bool ret1 = open(); - if (!ret1) { +jboolean TestPm3(JNIEnv *env, jobject instance) { + if (open() == false) { CloseProxmark(); return false; } - bool ret2 = TestProxmark() == PM3_SUCCESS; - return (jboolean) (ret1 && ret2); + bool ret = (TestProxmark() == PM3_SUCCESS); + return (jboolean) (ret); } /* * stop pm3 client * */ -void stopPm3(JNIEnv *env, jobject instance) { +void ClosePm3(JNIEnv *env, jobject instance) { CloseProxmark(); } /* * native function map to jvm * */ + + //iceman: todo, pm3:ify java class root. Return codes, should match PM3_E* codes. JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { JNIEnv *jniEnv = NULL; if ((*vm)->GetEnv(vm, (void **) &jniEnv, JNI_VERSION_1_4) != JNI_OK) { @@ -156,23 +143,24 @@ JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { } jclass clz_test = (*jniEnv)->FindClass(jniEnv, "cn/rrg/devices/Proxmark3RRGRdv4"); JNINativeMethod methods[] = { - {"startExecute", "(Ljava/lang/String;)I", (void *) sendCMD}, - {"stopExecute", "()V", (void *) stopPm3}, - {"isExecuting", "()Z", (void *) isExecuting} + {"startExecute", "(Ljava/lang/String;)I", (void *) Console}, + {"stopExecute", "()V", (void *) ClosePm3}, + {"isExecuting", "()Z", (void *) IsClientRunning} }; + JNINativeMethod methods1[] = { - {"testPm3", "()Z", (void *) testPm3}, - {"closePm3", "()V", stopPm3} + {"testPm3", "()Z", (void *) TestPm3}, + {"closePm3", "()V", ClosePm3} }; - if ((*jniEnv)->RegisterNatives(jniEnv, clazz, methods, sizeof(methods) / sizeof(methods[0])) != - JNI_OK) { + + if ((*jniEnv)->RegisterNatives(jniEnv, clazz, methods, sizeof(methods) / sizeof(methods[0])) != JNI_OK) { return -1; } - if ((*jniEnv)->RegisterNatives(jniEnv, clz_test, methods1, - sizeof(methods1) / sizeof(methods1[0])) != - JNI_OK) { + + if ((*jniEnv)->RegisterNatives(jniEnv, clz_test, methods1, sizeof(methods1) / sizeof(methods1[0])) != JNI_OK) { return -1; } + (*jniEnv)->DeleteLocalRef(jniEnv, clazz); (*jniEnv)->DeleteLocalRef(jniEnv, clz_test); return JNI_VERSION_1_4; From e42e8e4c92f7f0fcf45e4ad3df56e862aac247f3 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 11:02:23 +0200 Subject: [PATCH 459/632] fix coverity 290267 --- client/src/cmdhf14a.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index b293e4c01..baa2c66cf 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -912,6 +912,7 @@ static int CmdHF14AAPDU(const char *Cmd) { makeAPDU = headerlen > 0; if (makeAPDU && headerlen != 4) { PrintAndLogEx(ERR, "header length must be 4 bytes instead of %d", headerlen); + CLIParserFree(ctx); return 1; } extendedAPDU = arg_get_lit(6); @@ -937,24 +938,27 @@ static int CmdHF14AAPDU(const char *Cmd) { if (APDUEncode(&apdu, data, &datalen)) { PrintAndLogEx(ERR, "can't make apdu with provided parameters."); + CLIParserFree(ctx); return 2; } } else { if (extendedAPDU) { PrintAndLogEx(ERR, "make mode not set but here `e` option."); + CLIParserFree(ctx); return 3; } if (le > 0) { PrintAndLogEx(ERR, "make mode not set but here `l` option."); + CLIParserFree(ctx); return 3; } // len = data + PCB(1b) + CRC(2b) CLIGetHexBLessWithReturn(ctx, 8, data, &datalen, 1 + 2); } - CLIParserFree(ctx); + PrintAndLogEx(NORMAL, ">>>>[%s%s%s] %s", activateField ? "sel " : "", leaveSignalON ? "keep " : "", decodeTLV ? "TLV" : "", sprint_hex(data, datalen)); if (decodeAPDU) { From cff9e2381d3f963f101723f355ed08f540bfffb4 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 11:02:37 +0200 Subject: [PATCH 460/632] fix coverity 290268 --- client/src/cmdhfmf.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 85f390b4b..5c0ae6cb5 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -515,7 +515,6 @@ static char *GenerateFilename(const char *prefix, const char *suffix) { static int32_t initSectorTable(sector_t **src, int32_t items) { - // initialize storage (*src) = calloc(items, sizeof(sector_t)); if (*src == NULL) @@ -3144,6 +3143,7 @@ void readerAttack(sector_t *k_sector, uint8_t k_sectorsCount, nonces_t data, boo if (k_sector == NULL) { int32_t res = initSectorTable(&k_sector, k_sectorsCount); if (res != k_sectorsCount) { + free(k_sector); return; } } @@ -3175,6 +3175,8 @@ void readerAttack(sector_t *k_sector, uint8_t k_sectorsCount, nonces_t data, boo mfEmlSetMem(memBlock, (sector * 4) + 3, 1); } } + + free(k_sector); } static int CmdHF14AMfSim(const char *Cmd) { From c81f0c7d0fa6bcbd3f08c6a0d9f67a6dbe29dc6e Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 11:05:21 +0200 Subject: [PATCH 461/632] fix coverity 290270 --- client/src/mifare/mifarehost.c | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/mifare/mifarehost.c b/client/src/mifare/mifarehost.c index df0a12ed0..dcd8698df 100644 --- a/client/src/mifare/mifarehost.c +++ b/client/src/mifare/mifarehost.c @@ -1212,6 +1212,7 @@ int mfTraceDecode(struct Crypto1State *traceCrypto1, uint8_t *data_src, int len, lfsr_rollback_word(revstate, nr_enc, 1); lfsr_rollback_word(revstate, cuid ^ nt, 0); crypto1_get_lfsr(revstate, &key); + free(revstate); PrintAndLogEx(SUCCESS, "found Key: [%012" PRIx64 "]", key); //if ( tryMfk64(cuid, nt, nr_enc, ar_enc, at_enc, &key) ) From d8ef01b69dda83bef5159ea38d562ecfb93d0d7a Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 11:06:24 +0200 Subject: [PATCH 462/632] fix coverity 290272 --- client/src/emv/cmdemv.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/src/emv/cmdemv.c b/client/src/emv/cmdemv.c index 905bbb99e..3c606740b 100644 --- a/client/src/emv/cmdemv.c +++ b/client/src/emv/cmdemv.c @@ -427,6 +427,7 @@ static int CmdEMVAC(const char *Cmd) { if (termDecision == 0xff) { PrintAndLogEx(ERR, "ERROR: can't find terminal decision '%s'", arg_get_str(3)->sval[0]); + CLIParserFree(ctx); return PM3_EINVARG; } } else { @@ -438,9 +439,11 @@ static int CmdEMVAC(const char *Cmd) { bool dataMakeFromCDOL = arg_get_lit(5); bool APDULogging = arg_get_lit(6); bool decodeTLV = arg_get_lit(7); + EMVCommandChannel channel = ECC_CONTACTLESS; if (arg_get_lit(8)) channel = ECC_CONTACT; + PrintChannel(channel); CLIGetHexWithReturn(ctx, 9, data, &datalen); CLIParserFree(ctx); From bd8edced9b2d304c542529b5bf7c351edfca1dd0 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 11:07:29 +0200 Subject: [PATCH 463/632] fix coverity 290273 --- client/src/cmdhfmfdes.c | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index 1d3943446..06e11ef1e 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -2482,6 +2482,7 @@ static int CmdHF14ADesWriteData(const char *Cmd) { uint8_t *data = (uint8_t *)calloc(dlength, sizeof(uint8_t)); if (data == NULL) { PrintAndLogEx(ERR, "failed to allocate memory"); + CLIParserFree(ctx); return PM3_EMALLOC; } if (CLIParamHexToBuf(arg_get_str(4), data, dlength, &dlength)) { From 19f2c0ef89b033940947f4e2d1a39e66ba10cff1 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 11:09:10 +0200 Subject: [PATCH 464/632] fix coverity 290271 --- client/src/emv/cmdemv.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/emv/cmdemv.c b/client/src/emv/cmdemv.c index 3c606740b..c69888584 100644 --- a/client/src/emv/cmdemv.c +++ b/client/src/emv/cmdemv.c @@ -1731,7 +1731,7 @@ static int CmdEMVScan(const char *Cmd) { if (ODAI_listlen) { struct tlvdb *oda = tlvdb_fixed(0x21, ODAI_listlen, ODAI_list); // not a standard tag tlvdb_add(tlvRoot, oda); - PrintAndLogEx(INFO, "Input list for Offline Data Authentication added to TLV [%d bytes]", ODAI_listlen); + PrintAndLogEx(INFO, "Input list for Offline Data Authentication added to TLV [%zu bytes]", ODAI_listlen); } // getting certificates @@ -1988,7 +1988,7 @@ static int CmdEMVRoca(const char *Cmd) { if (ODAI_listlen) { struct tlvdb *oda = tlvdb_fixed(0x21, ODAI_listlen, ODAI_list); // not a standard tag tlvdb_add(tlvRoot, oda); - PrintAndLogEx(INFO, "Input list for Offline Data Authentication added to TLV [%d bytes]", ODAI_listlen); + PrintAndLogEx(INFO, "Input list for Offline Data Authentication added to TLV [%zu bytes]", ODAI_listlen); } if (tlvdb_get(tlvRoot, 0x90, NULL)) { From 2daa2c09fd2265f8249c4ecddb2c894dfdff1e0f Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 11:27:47 +0200 Subject: [PATCH 465/632] fix coverity 290266 --- client/deps/cliparser/cliparser.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/client/deps/cliparser/cliparser.c b/client/deps/cliparser/cliparser.c index c4795d870..1e379556d 100644 --- a/client/deps/cliparser/cliparser.c +++ b/client/deps/cliparser/cliparser.c @@ -146,9 +146,10 @@ int CLIParserParseStringEx(CLIParserContext *ctx, const char *str, void *vargtab } void CLIParserFree(CLIParserContext *ctx) { - arg_freetable(ctx->argtable, ctx->argtableLen); - free(ctx); - return; + if (ctx) { + arg_freetable(ctx->argtable, ctx->argtableLen); + free(ctx); + } } // convertors From 96076c19453f3aa7ac7a8dff0682b81ccf4d30ab Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 11:46:59 +0200 Subject: [PATCH 466/632] chg: remove unused code from "hf mf sim" --- client/src/cmdhfmf.c | 160 ------------------ client/src/mifare/mifarehost.c | 290 --------------------------------- client/src/mifare/mifarehost.h | 9 - 3 files changed, 459 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 5c0ae6cb5..7fe84f55e 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -3351,166 +3351,6 @@ static int CmdHF14AMfSim(const char *Cmd) { k_sectorsCount = MIFARE_4K_MAXSECTOR; return PM3_SUCCESS; } -/* -static int CmdHF14AMfSniff(const char *Cmd) { - bool wantLogToFile = false; - bool wantDecrypt = false; - //bool wantSaveToEml = false; TODO - bool wantSaveToEmlFile = false; - - //var - int res = 0, len = 0, blockLen = 0; - int pckNum = 0, num = 0; - uint8_t sak = 0; - uint8_t uid[10]; - uint8_t uid_len = 0; - uint8_t atqa[2] = {0x00, 0x00}; - bool isTag = false; - uint8_t *buf = NULL; - uint16_t bufsize = 0; - uint8_t *bufPtr = NULL; - uint16_t traceLen = 0; - - memset(uid, 0x00, sizeof(uid)); - - char ctmp = tolower(param_getchar(Cmd, 0)); - if (ctmp == 'h') return usage_hf14_sniff(); - - for (int i = 0; i < 4; i++) { - ctmp = tolower(param_getchar(Cmd, i)); - if (ctmp == 'l') wantLogToFile = true; - if (ctmp == 'd') wantDecrypt = true; - //if (ctmp == 'e') wantSaveToEml = true; TODO - if (ctmp == 'f') wantSaveToEmlFile = true; - } - - PrintAndLogEx(NORMAL, "-------------------------------------------------------------------------\n"); - PrintAndLogEx(NORMAL, "Executing mifare sniffing command. \n"); - PrintAndLogEx(NORMAL, "Press the button on the Proxmark3 device to abort both Proxmark3 and client.\n"); - PrintAndLogEx(NORMAL, "Press Enter to abort the client.\n"); - PrintAndLogEx(NORMAL, "-------------------------------------------------------------------------\n"); - - clearCommandBuffer(); - SendCommandNG(CMD_HF_MIFARE_SNIFF, NULL, 0); - - PacketResponseNG resp; - struct Crypto1State *traceCrypto1 = NULL; - - // wait cycle - while (true) { - printf("."); - fflush(stdout); - if (kbd_enter_pressed()) { - PrintAndLogEx(INFO, "\naborted via keyboard!\n"); - break; - } - - if (!WaitForResponseTimeout(CMD_ACK, &resp, 2000)) { - continue; - } - - res = resp.oldarg[0] & 0xff; - traceLen = resp.oldarg[1]; - len = resp.oldarg[2]; - - if (res == 0) { - PrintAndLogEx(SUCCESS, "hf mifare sniff finished"); - free(buf); - return 0; - } - - if (res == 1) { // there is (more) data to be transferred - if (pckNum == 0) { // first packet, (re)allocate necessary buffer - if (traceLen > bufsize || buf == NULL) { - uint8_t *p; - if (buf == NULL) // not yet allocated - p = calloc(traceLen, sizeof(uint8_t)); - else // need more memory - p = realloc(buf, traceLen); - - if (p == NULL) { - PrintAndLogEx(FAILED, "Cannot allocate memory for trace"); - free(buf); - return 2; - } - buf = p; - } - bufPtr = buf; - bufsize = traceLen; - memset(buf, 0x00, traceLen); - } - - // what happens if LEN is bigger then TRACELEN --iceman - memcpy(bufPtr, resp.data.asBytes, len); - bufPtr += len; - pckNum++; - } - - if (res == 2) { // received all data, start displaying - blockLen = bufPtr - buf; - bufPtr = buf; - PrintAndLogEx(NORMAL, ">\n"); - PrintAndLogEx(SUCCESS, "received trace len: %d packages: %d", blockLen, pckNum); - while (bufPtr - buf < blockLen) { - bufPtr += 6; // skip (void) timing information - len = *((uint16_t *)bufPtr); - if (len & 0x8000) { - isTag = true; - len &= 0x7fff; - } else { - isTag = false; - } - bufPtr += 2; - - // the uid identification package - // 0xFF 0xFF xx xx xx xx xx xx xx xx xx xx aa aa cc 0xFF 0xFF - // x = uid, a = atqa, c = sak - if ((len == 17) && (bufPtr[0] == 0xff) && (bufPtr[1] == 0xff) && (bufPtr[15] == 0xff) && (bufPtr[16] == 0xff)) { - memcpy(uid, bufPtr + 2, 10); - memcpy(atqa, bufPtr + 2 + 10, 2); - switch (atqa[0] & 0xC0) { - case 0x80: - uid_len = 10; - break; - case 0x40: - uid_len = 7; - break; - default: - uid_len = 4; - break; - } - sak = bufPtr[14]; - PrintAndLogEx(SUCCESS, "UID %s | ATQA %02x %02x | SAK 0x%02x", - sprint_hex(uid, uid_len), - atqa[1], - atqa[0], - sak); - if (wantLogToFile || wantDecrypt) { - FillFileNameByUID(logHexFileName, uid, ".log", uid_len); - AddLogCurrentDT(logHexFileName); - PrintAndLogEx(SUCCESS, "Trace saved to %s", logHexFileName); - } - if (wantDecrypt) - mfTraceInit(&traceCrypto1, uid, uid_len, atqa, sak, wantSaveToEmlFile); - } else { - PrintAndLogEx(NORMAL, "%03d| %s |%s", num, isTag ? "TAG" : "RDR", sprint_hex(bufPtr, len)); - if (wantLogToFile) - AddLogHex(logHexFileName, isTag ? "TAG| " : "RDR| ", bufPtr, len); - if (wantDecrypt) - mfTraceDecode(traceCrypto1, bufPtr, len, wantSaveToEmlFile); - num++; - } - bufPtr += len; - bufPtr += ((len - 1) / 8 + 1); // ignore parity - } - pckNum = 0; - } - } // while (true) - - free(buf); - return PM3_SUCCESS; -} -*/ /* static int CmdHF14AMfKeyBrute(const char *Cmd) { diff --git a/client/src/mifare/mifarehost.c b/client/src/mifare/mifarehost.c index dcd8698df..8e476a424 100644 --- a/client/src/mifare/mifarehost.c +++ b/client/src/mifare/mifarehost.c @@ -944,124 +944,9 @@ int mfCGetBlock(uint8_t blockNo, uint8_t *data, uint8_t params) { // SNIFFER // [iceman] so many global variables.... -// constants -static uint8_t trailerAccessBytes[4] = {0x08, 0x77, 0x8F, 0x00}; - // variables -char logHexFileName[FILE_PATH_SIZE] = {0x00}; -static uint8_t traceCard[4096] = {0x00}; -static char traceFileName[FILE_PATH_SIZE] = {0x00}; -static int traceState = TRACE_IDLE; -static uint8_t traceCurBlock = 0; -static uint8_t traceCurKey = 0; - uint32_t cuid = 0; // uid part used for crypto1. -int isTraceCardEmpty(void) { - return ((traceCard[0] == 0) && (traceCard[1] == 0) && (traceCard[2] == 0) && (traceCard[3] == 0)); -} - -int isBlockEmpty(int blockN) { - for (int i = 0; i < 16; i++) - if (traceCard[blockN * 16 + i] != 0) return 0; - - return 1; -} - -int isBlockTrailer(int blockN) { - return ((blockN & 0x03) == 0x03); -} - -int loadTraceCard(uint8_t *tuid, uint8_t uidlen) { - FILE *f; - char buf[64] = {0x00}; - uint8_t buf8[64] = {0x00}; - int i, blockNum; - uint32_t tmp; - - if (!isTraceCardEmpty()) - saveTraceCard(); - - memset(traceCard, 0x00, 4096); - memcpy(traceCard, tuid, uidlen); - - FillFileNameByUID(traceFileName, tuid, ".eml", uidlen); - - f = fopen(traceFileName, "r"); - if (!f) return PM3_EFILE; - - blockNum = 0; - - while (!feof(f)) { - - memset(buf, 0, sizeof(buf)); - if (fgets(buf, sizeof(buf), f) == NULL) { - PrintAndLogEx(FAILED, "No trace file found or reading error."); - fclose(f); - return PM3_EFILE; - } - - if (strlen(buf) < 32) { - if (feof(f)) break; - PrintAndLogEx(FAILED, "File content error. Block data must include 32 HEX symbols"); - fclose(f); - return PM3_EFILE; - } - for (i = 0; i < 32; i += 2) { - sscanf(&buf[i], "%02X", &tmp); - buf8[i / 2] = tmp & 0xFF; - } - - memcpy(traceCard + blockNum * 16, buf8, 16); - - blockNum++; - } - fclose(f); - return PM3_SUCCESS; -} - -int saveTraceCard(void) { - - if ((!strlen(traceFileName)) || (isTraceCardEmpty())) return PM3_ESOFT; - - FILE *f; - f = fopen(traceFileName, "w+"); - if (!f) return PM3_EFILE; - - // given 4096 tracecard size, these loop will only match a 1024, 1kb card memory - // 4086/16 == 256blocks. - for (uint16_t i = 0; i < 256; i++) { // blocks - for (uint8_t j = 0; j < 16; j++) // bytes - fprintf(f, "%02X", *(traceCard + i * 16 + j)); - - // no extra line in the end - if (i < 255) - fprintf(f, "\n"); - } - fflush(f); - fclose(f); - return PM3_SUCCESS; -} -// -int mfTraceInit(struct Crypto1State **traceCrypto1, uint8_t *tuid, uint8_t uidlen, uint8_t *atqa, uint8_t sak, bool wantSaveToEmlFile) { - - if (*traceCrypto1) - crypto1_destroy(*traceCrypto1); - - *traceCrypto1 = NULL; - - if (wantSaveToEmlFile) - loadTraceCard(tuid, uidlen); - - traceCard[4] = traceCard[0] ^ traceCard[1] ^ traceCard[2] ^ traceCard[3]; - traceCard[5] = sak; - memcpy(&traceCard[6], atqa, 2); - traceCurBlock = 0; - cuid = bytes_to_num(tuid + (uidlen - 4), 4); - traceState = TRACE_IDLE; - return PM3_SUCCESS; -} - void mf_crypto1_decrypt(struct Crypto1State *pcs, uint8_t *data, int len, bool isEncrypted) { if (len != 1) { for (int i = 0; i < len; i++) @@ -1076,181 +961,6 @@ void mf_crypto1_decrypt(struct Crypto1State *pcs, uint8_t *data, int len, bool i } } -int mfTraceDecode(struct Crypto1State *traceCrypto1, uint8_t *data_src, int len, bool wantSaveToEmlFile) { - if (traceState == TRACE_ERROR) - return PM3_ESOFT; - - if (len > 255) { - traceState = TRACE_ERROR; - return PM3_ESOFT; - } - - uint8_t data[255]; - memset(data, 0x00, sizeof(data)); - - memcpy(data, data_src, len); - - if ((traceCrypto1) && ((traceState == TRACE_IDLE) || (traceState > TRACE_AUTH_OK))) { - mf_crypto1_decrypt(traceCrypto1, data, len, 0); - PrintAndLogEx(NORMAL, "DEC| %s", sprint_hex(data, len)); - AddLogHex(logHexFileName, "DEC| ", data, len); - } - - switch (traceState) { - case TRACE_IDLE: - // check packet crc16! - if ((len >= 4) && (!check_crc(CRC_14443_A, data, len))) { - PrintAndLogEx(NORMAL, "DEC| CRC ERROR!!!"); - AddLogLine(logHexFileName, "DEC| ", "CRC ERROR!!!"); - traceState = TRACE_ERROR; // do not decrypt the next commands - return PM3_ESOFT; - } - - // AUTHENTICATION - if ((len == 4) && ((data[0] == MIFARE_AUTH_KEYA) || (data[0] == MIFARE_AUTH_KEYB))) { - traceState = TRACE_AUTH1; - traceCurBlock = data[1]; - traceCurKey = data[0] == 60 ? 1 : 0; - return PM3_SUCCESS; - } - - // READ - if ((len == 4) && ((data[0] == ISO14443A_CMD_READBLOCK))) { - traceState = TRACE_READ_DATA; - traceCurBlock = data[1]; - return PM3_SUCCESS; - } - - // WRITE - if ((len == 4) && ((data[0] == ISO14443A_CMD_WRITEBLOCK))) { - traceState = TRACE_WRITE_OK; - traceCurBlock = data[1]; - return PM3_SUCCESS; - } - - // HALT - if ((len == 4) && ((data[0] == ISO14443A_CMD_HALT) && (data[1] == 0x00))) { - traceState = TRACE_ERROR; // do not decrypt the next commands - return PM3_SUCCESS; - } - return PM3_SUCCESS; - - case TRACE_READ_DATA: - if (len == 18) { - traceState = TRACE_IDLE; - - if (isBlockTrailer(traceCurBlock)) { - memcpy(traceCard + traceCurBlock * 16 + 6, data + 6, 4); - } else { - memcpy(traceCard + traceCurBlock * 16, data, 16); - } - if (wantSaveToEmlFile) saveTraceCard(); - return PM3_SUCCESS; - } else { - traceState = TRACE_ERROR; - return PM3_ESOFT; - } - break; - case TRACE_WRITE_OK: - if ((len == 1) && (data[0] == 0x0a)) { - traceState = TRACE_WRITE_DATA; - return PM3_SUCCESS; - } else { - traceState = TRACE_ERROR; - return PM3_ESOFT; - } - break; - case TRACE_WRITE_DATA: - if (len == 18) { - traceState = TRACE_IDLE; - memcpy(traceCard + traceCurBlock * 16, data, 16); - if (wantSaveToEmlFile) saveTraceCard(); - return PM3_SUCCESS; - } else { - traceState = TRACE_ERROR; - return PM3_ESOFT; - } - break; - case TRACE_AUTH1: - if (len == 4) { - traceState = TRACE_AUTH2; - //nt = bytes_to_num(data, 4); - return PM3_SUCCESS; - } else { - traceState = TRACE_ERROR; - return PM3_ESOFT; - } - break; - case TRACE_AUTH2: - if (len == 8) { - traceState = TRACE_AUTH_OK; - //nr_enc = bytes_to_num(data, 4); - //ar_enc = bytes_to_num(data + 4, 4); - return PM3_SUCCESS; - } else { - traceState = TRACE_ERROR; - return PM3_ESOFT; - } - break; - case TRACE_AUTH_OK: - if (len == 4) { - uint32_t nt = 0; // tag challenge - uint32_t nr_enc = 0; // encrypted reader challenge - uint32_t ar_enc = 0; // encrypted reader response - uint32_t at_enc = 0; // encrypted tag response - traceState = TRACE_IDLE; - // encrypted tag response - at_enc = bytes_to_num(data, 4); - - // mfkey64 recover key. - uint64_t key = 0; - uint32_t ks2 = ar_enc ^ prng_successor(nt, 64); - uint32_t ks3 = at_enc ^ prng_successor(nt, 96); - struct Crypto1State *revstate = lfsr_recovery64(ks2, ks3); - lfsr_rollback_word(revstate, 0, 0); - lfsr_rollback_word(revstate, 0, 0); - lfsr_rollback_word(revstate, nr_enc, 1); - lfsr_rollback_word(revstate, cuid ^ nt, 0); - crypto1_get_lfsr(revstate, &key); - free(revstate); - PrintAndLogEx(SUCCESS, "found Key: [%012" PRIx64 "]", key); - - //if ( tryMfk64(cuid, nt, nr_enc, ar_enc, at_enc, &key) ) - AddLogUint64(logHexFileName, "Found Key: ", key); - - int blockShift = ((traceCurBlock & 0xFC) + 3) * 16; - if (isBlockEmpty((traceCurBlock & 0xFC) + 3)) - memcpy(traceCard + blockShift + 6, trailerAccessBytes, 4); - - // keytype A/B - if (traceCurKey) - num_to_bytes(key, 6, traceCard + blockShift + 10); - else - num_to_bytes(key, 6, traceCard + blockShift); - - if (wantSaveToEmlFile) - saveTraceCard(); - - if (traceCrypto1) - crypto1_destroy(traceCrypto1); - - // set cryptosystem state - traceCrypto1 = lfsr_recovery64(ks2, ks3); - - } else { - PrintAndLogEx(WARNING, "nested key recovery not implemented!\n"); - //at_enc = bytes_to_num(data, 4); - crypto1_destroy(traceCrypto1); - traceState = TRACE_ERROR; - } - break; - default: - traceState = TRACE_ERROR; - return PM3_ESOFT; - } - return PM3_SUCCESS; -} - int tryDecryptWord(uint32_t nt, uint32_t ar_enc, uint32_t at_enc, uint8_t *data, int len) { PrintAndLogEx(SUCCESS, "\nencrypted data: [%s]", sprint_hex(data, len)); struct Crypto1State *s; diff --git a/client/src/mifare/mifarehost.h b/client/src/mifare/mifarehost.h index 0595b2f8b..fc3a571be 100644 --- a/client/src/mifare/mifarehost.h +++ b/client/src/mifare/mifarehost.h @@ -54,7 +54,6 @@ typedef struct { //uint8_t foundKey[2]; } icesector_t; -extern char logHexFileName[FILE_PATH_SIZE]; #define KEYS_IN_BLOCK ((PM3_CMD_DATA_SIZE - 4) / 6) #define KEYBLOCK_SIZE (KEYS_IN_BLOCK * 6) #define CANDIDATE_SIZE (0xFFFF * 6) @@ -81,14 +80,6 @@ int mfCWipe(uint8_t *uid, uint8_t *atqa, uint8_t *sak); int mfCSetBlock(uint8_t blockNo, uint8_t *data, uint8_t *uid, uint8_t params); int mfCGetBlock(uint8_t blockNo, uint8_t *data, uint8_t params); -int mfTraceInit(struct Crypto1State **traceCrypto1, uint8_t *tuid, uint8_t uidlen, uint8_t *atqa, uint8_t sak, bool wantSaveToEmlFile); -int mfTraceDecode(struct Crypto1State *traceCrypto1, uint8_t *data_src, int len, bool wantSaveToEmlFile); - -int isTraceCardEmpty(void); -int isBlockEmpty(int blockN); -int isBlockTrailer(int blockN); -int loadTraceCard(uint8_t *tuid, uint8_t uidlen); -int saveTraceCard(void); int tryDecryptWord(uint32_t nt, uint32_t ar_enc, uint32_t at_enc, uint8_t *data, int len); int detect_classic_prng(void); From f5efcc43f0e9a69fff5f65818227846df6204b58 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 11:54:31 +0200 Subject: [PATCH 467/632] fix coverity 290111 --- client/src/cmdhfmfdes.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index 06e11ef1e..d56218e4b 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -4073,15 +4073,22 @@ static int CmdHF14aDesChk(const char *Cmd) { if (dict_filenamelen && endFilePosition) { if (!verbose) printf("d"); + uint32_t keycnt = 0; res = loadFileDICTIONARYEx((char *)dict_filename, deskeyList, sizeof(deskeyList), NULL, 16, &keycnt, endFilePosition, &endFilePosition, false); - deskeyListLen = keycnt; + if (res == PM3_SUCCESS && endFilePosition) + deskeyListLen = keycnt; + keycnt = 0; res = loadFileDICTIONARYEx((char *)dict_filename, aeskeyList, sizeof(aeskeyList), NULL, 16, &keycnt, endFilePosition, &endFilePosition, false); - aeskeyListLen = keycnt; + if (res == PM3_SUCCESS && endFilePosition) + aeskeyListLen = keycnt; + keycnt = 0; res = loadFileDICTIONARYEx((char *)dict_filename, k3kkeyList, sizeof(k3kkeyList), NULL, 16, &keycnt, endFilePosition, &endFilePosition, false); - k3kkeyListLen = keycnt; + if (res == PM3_SUCCESS && endFilePosition) + k3kkeyListLen = keycnt; + continue; } } From c6072d7a45e53f6df1809155dca64b1244361ef4 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 11:54:42 +0200 Subject: [PATCH 468/632] chg, textual --- client/src/preferences.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/client/src/preferences.c b/client/src/preferences.c index 5ae73b902..b5599f1ba 100644 --- a/client/src/preferences.c +++ b/client/src/preferences.c @@ -88,7 +88,7 @@ int preferences_load(void) { // to better control json cant find file error msg. char *fn = prefGetFilename(); if (fileExists(fn)) { - PrintAndLogEx(INFO, "Loading Preferences..."); + PrintAndLogEx(INFO, "Loading preferences..."); if (loadFileJSON(fn, &dummyData, sizeof(dummyData), &dummyDL, &preferences_load_callback) == PM3_SUCCESS) { session.preferences_loaded = true; } @@ -104,7 +104,7 @@ int preferences_load(void) { int preferences_save(void) { // Note sure if backup has value ? - PrintAndLogEx(INFO, "Saving Preferences..."); + PrintAndLogEx(INFO, "Saving preferences..."); char *fn = prefGetFilename(); int fnLen = strlen(fn) + 5; // .bak\0 @@ -908,18 +908,16 @@ static int CmdPrefSet(const char *Cmd) { static int CmdPrefShow(const char *Cmd) { - char *fn = prefGetFilename(); - PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(NORMAL, _CYAN_("Preferences loaded from %s"), fn); - - free(fn); - - if (!session.preferences_loaded) { + if (session.preferences_loaded) { + char *fn = prefGetFilename(); + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, _CYAN_("Preferences loaded from " _YELLOW_("%s")), fn); + free(fn); + } else { PrintAndLogEx(ERR, "Preferences not loaded"); return PM3_ESOFT; } - // PrintAndLogEx(NORMAL, " preference file........ "_GREEN_("%s"), fn); showEmojiState(prefShowNone); showHintsState(prefShowNone); showColorState(prefShowNone); @@ -931,7 +929,6 @@ static int CmdPrefShow(const char *Cmd) { showClientDebugState(prefShowNone); // showDeviceDebugState(prefShowNone); - PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } /* From 0b33746c83d6892662642995b819844056b6591a Mon Sep 17 00:00:00 2001 From: Iceman <iceman@iuse.se> Date: Tue, 2 Jun 2020 12:06:15 +0200 Subject: [PATCH 469/632] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ba17074d3..7a31880cf 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,8 @@ | Releases | Linux & OSX CI | Windows CI | Coverity | | ------------------- |:-------------------:| -------------------:| -------------------:| -| [![Latest release](https://img.shields.io/github/release/RfidResearchGroup/proxmark3.svg)](https://github.com/RfidResearchGroup/proxmark3/releases/latest) | [![Build status](https://api.travis-ci.org/RfidResearchGroup/proxmark3.svg?branch=master)](https://travis-ci.org/RfidResearchGroup/proxmark3) | [![Build status](https://ci.appveyor.com/api/projects/status/b4gwrhq3nc876cuu/branch/master?svg=true)](https://ci.appveyor.com/project/RfidResearchGroup/proxmark3/branch/master) | [![Coverity Status](https://scan.coverity.com/projects/19334/badge.svg)](https://scan.coverity.com/projects/proxmark3-rrg-iceman-repo)| +| [![Latest release](https://img.shields.io/github/v/release/rfidresearchgroup/proxmark3)](https://github.com/RfidResearchGroup/proxmark3/releases/latest) +| [![Build status](https://api.travis-ci.org/RfidResearchGroup/proxmark3.svg?branch=master)](https://travis-ci.org/RfidResearchGroup/proxmark3) | [![Build status](https://ci.appveyor.com/api/projects/status/b4gwrhq3nc876cuu/branch/master?svg=true)](https://ci.appveyor.com/project/RfidResearchGroup/proxmark3/branch/master) | [![Coverity Status](https://scan.coverity.com/projects/19334/badge.svg)](https://scan.coverity.com/projects/proxmark3-rrg-iceman-repo)| From 6022f374d54d8c6760558242491441c403343642 Mon Sep 17 00:00:00 2001 From: Iceman <iceman@iuse.se> Date: Tue, 2 Jun 2020 12:06:57 +0200 Subject: [PATCH 470/632] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 7a31880cf..f5482bc6b 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,7 @@ | Releases | Linux & OSX CI | Windows CI | Coverity | | ------------------- |:-------------------:| -------------------:| -------------------:| -| [![Latest release](https://img.shields.io/github/v/release/rfidresearchgroup/proxmark3)](https://github.com/RfidResearchGroup/proxmark3/releases/latest) -| [![Build status](https://api.travis-ci.org/RfidResearchGroup/proxmark3.svg?branch=master)](https://travis-ci.org/RfidResearchGroup/proxmark3) | [![Build status](https://ci.appveyor.com/api/projects/status/b4gwrhq3nc876cuu/branch/master?svg=true)](https://ci.appveyor.com/project/RfidResearchGroup/proxmark3/branch/master) | [![Coverity Status](https://scan.coverity.com/projects/19334/badge.svg)](https://scan.coverity.com/projects/proxmark3-rrg-iceman-repo)| +| [![Latest release](https://img.shields.io/github/v/release/rfidresearchgroup/proxmark3)](https://github.com/RfidResearchGroup/proxmark3/releases/latest) | [![Build status](https://api.travis-ci.org/RfidResearchGroup/proxmark3.svg?branch=master)](https://travis-ci.org/RfidResearchGroup/proxmark3) | [![Build status](https://ci.appveyor.com/api/projects/status/b4gwrhq3nc876cuu/branch/master?svg=true)](https://ci.appveyor.com/project/RfidResearchGroup/proxmark3/branch/master) | [![Coverity Status](https://scan.coverity.com/projects/19334/badge.svg)](https://scan.coverity.com/projects/proxmark3-rrg-iceman-repo)| From e67c515451d95b4c41c04f39bd3410da324494e6 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 12:49:18 +0200 Subject: [PATCH 471/632] fix cppchecker --- armsrc/spiffs_hydrogen.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/armsrc/spiffs_hydrogen.c b/armsrc/spiffs_hydrogen.c index 7290e676a..a166c3b7a 100644 --- a/armsrc/spiffs_hydrogen.c +++ b/armsrc/spiffs_hydrogen.c @@ -39,13 +39,12 @@ s32_t SPIFFS_format(spiffs *fs) { return -1; } - s32_t res; SPIFFS_LOCK(fs); spiffs_block_ix bix = 0; while (bix < fs->block_count) { fs->max_erase_count = 0; - res = spiffs_erase_block(fs, bix); + s32_t res = spiffs_erase_block(fs, bix); if (res != SPIFFS_OK) { res = SPIFFS_ERR_ERASE_FAIL; } @@ -1121,11 +1120,11 @@ s32_t SPIFFS_check(spiffs *fs) { SPIFFS_LOCK(fs); res = spiffs_lookup_consistency_check(fs, 0); - + (void)res; res = spiffs_object_index_consistency_check(fs); - + (void)res; res = spiffs_page_consistency_check(fs); - + (void)res; res = spiffs_obj_lu_scan(fs); SPIFFS_UNLOCK(fs); From 9594619af3db8ea922ce49aa083e7e32404c94b3 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 12:51:45 +0200 Subject: [PATCH 472/632] fix cppchecker --- bootrom/bootrom.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/bootrom/bootrom.c b/bootrom/bootrom.c index 7f4e38ac7..77305f22c 100644 --- a/bootrom/bootrom.c +++ b/bootrom/bootrom.c @@ -38,12 +38,8 @@ static int reply_old(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, } } - int result = PM3_EUNDEF; // Send frame and make sure all bytes are transmitted - - result = usb_write((uint8_t *)&txcmd, sizeof(PacketResponseOLD)); - - return result; + return usb_write((uint8_t *)&txcmd, sizeof(PacketResponseOLD)); } #if DEBUG @@ -80,7 +76,7 @@ static void Fatal(void) { } static void UsbPacketReceived(uint8_t *packet) { - int i, dont_ack = 0; + int dont_ack = 0; PacketCommandOLD *c = (PacketCommandOLD *)packet; //if ( len != sizeof(PacketCommandOLD`)) Fatal(); @@ -128,7 +124,7 @@ static void UsbPacketReceived(uint8_t *packet) { // We need to offset the writes or it will not fill the correct bank write buffer. offset = (AT91C_IFLASH_NB_OF_PAGES / 2) * AT91C_IFLASH_PAGE_SIZE / sizeof(uint32_t); } - for (i = 0 + (64 * j); i < 64 + (64 * j); i++) { + for (int i = 0 + (64 * j); i < 64 + (64 * j); i++) { _flash_start[offset + i] = c->d.asDwords[i]; } From 422e0187185fc976a9e41c8bc746cada37e46849 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 12:56:20 +0200 Subject: [PATCH 473/632] cppcheck --- client/deps/hardnested/hardnested_bf_core.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/client/deps/hardnested/hardnested_bf_core.c b/client/deps/hardnested/hardnested_bf_core.c index b8fd56cf2..5f4fcf991 100644 --- a/client/deps/hardnested/hardnested_bf_core.c +++ b/client/deps/hardnested/hardnested_bf_core.c @@ -557,17 +557,22 @@ void SetSIMDInstr(SIMDExecInstr instr) { } static SIMDExecInstr GetSIMDInstr(void) { - SIMDExecInstr instr = SIMD_NONE; + SIMDExecInstr instr; #if defined(COMPILER_HAS_SIMD_AVX512) - if (__builtin_cpu_supports("avx512f")) instr = SIMD_AVX512; + if (__builtin_cpu_supports("avx512f")) + instr = SIMD_AVX512; else #endif #if defined(COMPILER_HAS_SIMD) - if (__builtin_cpu_supports("avx2")) instr = SIMD_AVX2; - else if (__builtin_cpu_supports("avx")) instr = SIMD_AVX; - else if (__builtin_cpu_supports("sse2")) instr = SIMD_SSE2; - else if (__builtin_cpu_supports("mmx")) instr = SIMD_MMX; + if (__builtin_cpu_supports("avx2")) + instr = SIMD_AVX2; + else if (__builtin_cpu_supports("avx")) + instr = SIMD_AVX; + else if (__builtin_cpu_supports("sse2")) + instr = SIMD_SSE2; + else if (__builtin_cpu_supports("mmx")) + instr = SIMD_MMX; else #endif instr = SIMD_NONE; From cc6f497897b762ba8ef96fcdd7b37218414f9f89 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 12:56:38 +0200 Subject: [PATCH 474/632] cppcheck --- client/deps/cliparser/argtable3.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/deps/cliparser/argtable3.c b/client/deps/cliparser/argtable3.c index f64688b2a..f0b6a4d37 100644 --- a/client/deps/cliparser/argtable3.c +++ b/client/deps/cliparser/argtable3.c @@ -3398,13 +3398,13 @@ void trex_free(TRex *exp) { } TRexBool trex_match(TRex *exp, const TRexChar *text) { - const TRexChar *res = NULL; exp->_bol = text; exp->_eol = text + scstrlen(text); exp->_currsubexp = 0; - res = trex_matchnode(exp, exp->_nodes, text, NULL); - if (res == NULL || res != exp->_eol) + const TRexChar *res = trex_matchnode(exp, exp->_nodes, text, NULL); + if (res == NULL || res != exp->_eol) { return TRex_False; + } return TRex_True; } From 89f43c12216be38534ffbebc61c995d56b2ccc17 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 12:58:37 +0200 Subject: [PATCH 475/632] cppchecker --- armsrc/frozen.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/armsrc/frozen.c b/armsrc/frozen.c index 4abd21ebf..b8a6f3a02 100644 --- a/armsrc/frozen.c +++ b/armsrc/frozen.c @@ -1471,10 +1471,9 @@ char *json_vasprintf(const char *fmt, va_list ap) { char *json_asprintf(const char *fmt, ...) WEAK; char *json_asprintf(const char *fmt, ...) { - char *result = NULL; va_list ap; va_start(ap, fmt); - result = json_vasprintf(fmt, ap); + char *result = json_vasprintf(fmt, ap); va_end(ap); return result; } From 05c5179b41d66fe9276339dfc73d5885d6c3f6fc Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 13:00:36 +0200 Subject: [PATCH 476/632] cppchecker --- client/src/emv/cmdemv.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/client/src/emv/cmdemv.c b/client/src/emv/cmdemv.c index c69888584..f1e047c15 100644 --- a/client/src/emv/cmdemv.c +++ b/client/src/emv/cmdemv.c @@ -146,9 +146,8 @@ static int CmdEMVSearch(const char *Cmd) { SetAPDULogging(APDULogging); - struct tlvdb *t = NULL; const char *al = "Applets list"; - t = tlvdb_fixed(1, strlen(al), (const unsigned char *)al); + struct tlvdb *t = tlvdb_fixed(1, strlen(al), (const unsigned char *)al); if (EMVSearch(channel, activateField, leaveSignalON, decodeTLV, t)) { tlvdb_free(t); From 5c1b99b0487ecfb94a321566b1febd09e526f9b9 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 13:01:11 +0200 Subject: [PATCH 477/632] cppchecker --- client/src/emv/emvcore.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/client/src/emv/emvcore.c b/client/src/emv/emvcore.c index 3d9d3702f..cb68b9a5d 100644 --- a/client/src/emv/emvcore.c +++ b/client/src/emv/emvcore.c @@ -165,8 +165,7 @@ static void print_cb(void *data, const struct tlv *tlv, int level, bool is_leaf) } bool TLVPrintFromBuffer(uint8_t *data, int datalen) { - struct tlvdb *t = NULL; - t = tlvdb_parse_multi(data, datalen); + struct tlvdb *t = tlvdb_parse_multi(data, datalen); if (t) { PrintAndLogEx(INFO, "-------------------- " _CYAN_("TLV decoded") " --------------------"); From 295286e68aec9327a3580417009ec506abdf651a Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 13:02:21 +0200 Subject: [PATCH 478/632] cppchecker --- client/src/emv/emvcore.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/client/src/emv/emvcore.c b/client/src/emv/emvcore.c index cb68b9a5d..6647dbf8b 100644 --- a/client/src/emv/emvcore.c +++ b/client/src/emv/emvcore.c @@ -439,8 +439,6 @@ int EMVSearchPSE(EMVCommandChannel channel, bool ActivateField, bool LeaveFieldO size_t sfidatalen[0x11] = {0}; uint16_t sw = 0; int res; - bool fileFound = false; - const char *PSE_or_PPSE = PSENum == 1 ? "PSE" : "PPSE"; // select PPSE @@ -452,8 +450,9 @@ int EMVSearchPSE(EMVCommandChannel channel, bool ActivateField, bool LeaveFieldO return 1; } - struct tlvdb *t = NULL; - t = tlvdb_parse_multi(data, datalen); + bool fileFound = false; + + struct tlvdb *t = tlvdb_parse_multi(data, datalen); if (t) { // PSE/PPSE with SFI struct tlvdb *tsfi = tlvdb_find_path(t, (tlv_tag_t[]) {0x6f, 0xa5, 0x88, 0x00}); From 9883343cccde13da9e72adee937bcaa7f8541d16 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 13:03:11 +0200 Subject: [PATCH 479/632] cppchecker --- common/generator.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/generator.c b/common/generator.c index 513806fba..f189d09e3 100644 --- a/common/generator.c +++ b/common/generator.c @@ -424,14 +424,14 @@ int generator_selftest(void) { PrintAndLogEx(INFO, "PWD / KEY generator selftest"); PrintAndLogEx(INFO, "----------------------------"); - bool success = false; uint8_t testresult = 0; uint8_t uid1[] = {0x04, 0x11, 0x12, 0x11, 0x12, 0x11, 0x10}; uint32_t pwd1 = ul_ev1_pwdgenA(uid1); - success = (pwd1 == 0x8432EB17); + bool success = (pwd1 == 0x8432EB17); if (success) testresult++; + PrintAndLogEx(success ? SUCCESS : WARNING, "UID | %s | %08X - %s", sprint_hex(uid1, 7), pwd1, success ? "OK" : "->8432EB17<-"); uint8_t uid2[] = {0x04, 0x1f, 0x98, 0xea, 0x1e, 0x3e, 0x81}; From dec92755b6bc99fabc448aa346dbecb5e25fd864 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 13:04:23 +0200 Subject: [PATCH 480/632] cppchecker --- tools/hitag2crack/common/ht2crackutils.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/hitag2crack/common/ht2crackutils.c b/tools/hitag2crack/common/ht2crackutils.c index 8b67cf789..ac492ffa0 100644 --- a/tools/hitag2crack/common/ht2crackutils.c +++ b/tools/hitag2crack/common/ht2crackutils.c @@ -190,7 +190,6 @@ unsigned long hexreversetoulong(char *hex) { // convert byte-reversed 12 digit hex to unsigned long unsigned long long hexreversetoulonglong(char *hex) { - unsigned long long ret = 0LL; char tmp[9]; // this may seem an odd way to do it, but weird compiler issues were @@ -199,7 +198,7 @@ unsigned long long hexreversetoulonglong(char *hex) { tmp[8] = '\0'; memset(tmp + 4, '0', 4); memcpy(tmp, hex + 8, 4); - ret = hexreversetoulong(tmp); + unsigned long long ret = hexreversetoulong(tmp); ret <<= 32; memcpy(tmp, hex, 8); ret += hexreversetoulong(tmp); From b0b51e4222eb73050beac7ded715c256c1aa035f Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 13:05:19 +0200 Subject: [PATCH 481/632] cppchecker --- tools/hitag2crack/crack2/ht2crack2buildtable.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/hitag2crack/crack2/ht2crack2buildtable.c b/tools/hitag2crack/crack2/ht2crack2buildtable.c index 01cd0364c..6f8319a02 100644 --- a/tools/hitag2crack/crack2/ht2crack2buildtable.c +++ b/tools/hitag2crack/crack2/ht2crack2buildtable.c @@ -375,13 +375,12 @@ static void *sorttable(void *dd) { char outfile[64]; unsigned char *data = NULL; struct stat filestat; - unsigned char *table = NULL; uint64_t numentries = 0; int index = (int)(long)dd; int space = 0x100 / NUM_SORT_THREADS; // create table - 50MB should be enough - table = (unsigned char *)malloc(50UL * 1024UL * 1024UL); + unsigned char *table = (unsigned char *)malloc(50UL * 1024UL * 1024UL); if (!table) { printf("sorttable: cannot malloc table\n"); exit(1); From 1b9490c6aa8125c591b75c015c7efd84e9ae8de0 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 13:07:25 +0200 Subject: [PATCH 482/632] cppchecker --- tools/mf_nonce_brute/mf_nonce_brute.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/mf_nonce_brute/mf_nonce_brute.c b/tools/mf_nonce_brute/mf_nonce_brute.c index 7edcf4824..8e769b5b5 100644 --- a/tools/mf_nonce_brute/mf_nonce_brute.c +++ b/tools/mf_nonce_brute/mf_nonce_brute.c @@ -269,6 +269,7 @@ static void *brute_thread(void *arguments) { uint8_t isOK = 0; // check if cmd exists isOK = checkValidCmd(decrypted); + (void)isOK; // Add a crc-check. isOK = checkCRC(decrypted); From f830843442664eb70ad0361a4d7eee8e30044021 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 13:09:29 +0200 Subject: [PATCH 483/632] coverity.. --- client/deps/cliparser/cliparser.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/deps/cliparser/cliparser.c b/client/deps/cliparser/cliparser.c index 1e379556d..b3beb6ae0 100644 --- a/client/deps/cliparser/cliparser.c +++ b/client/deps/cliparser/cliparser.c @@ -146,9 +146,10 @@ int CLIParserParseStringEx(CLIParserContext *ctx, const char *str, void *vargtab } void CLIParserFree(CLIParserContext *ctx) { - if (ctx) { + if (ctx != NULL) { arg_freetable(ctx->argtable, ctx->argtableLen); free(ctx); + ctx = NULL; } } From 7064b73b483891b4a73e78c59cddcc25f3cbef35 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 13:27:54 +0200 Subject: [PATCH 484/632] chg parsing free Thanks @doegox! --- client/deps/cliparser/cliparser.c | 7 ++----- client/deps/cliparser/cliparser.h | 9 +++++---- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/client/deps/cliparser/cliparser.c b/client/deps/cliparser/cliparser.c index b3beb6ae0..25cd786d7 100644 --- a/client/deps/cliparser/cliparser.c +++ b/client/deps/cliparser/cliparser.c @@ -146,11 +146,8 @@ int CLIParserParseStringEx(CLIParserContext *ctx, const char *str, void *vargtab } void CLIParserFree(CLIParserContext *ctx) { - if (ctx != NULL) { - arg_freetable(ctx->argtable, ctx->argtableLen); - free(ctx); - ctx = NULL; - } + arg_freetable(ctx->argtable, ctx->argtableLen); + free(ctx); } // convertors diff --git a/client/deps/cliparser/cliparser.h b/client/deps/cliparser/cliparser.h index 0bb75413f..b88acefc5 100644 --- a/client/deps/cliparser/cliparser.h +++ b/client/deps/cliparser/cliparser.h @@ -27,10 +27,11 @@ #define arg_strx1(shortopts, longopts, datatype, glossary) (arg_strn((shortopts), (longopts), (datatype), 1, 250, (glossary))) #define arg_strx0(shortopts, longopts, datatype, glossary) (arg_strn((shortopts), (longopts), (datatype), 0, 250, (glossary))) -#define CLIExecWithReturn(ctx, cmd, atbl, ifempty) if (CLIParserParseString(ctx, cmd, atbl, arg_getsize(atbl), ifempty)){CLIParserFree(ctx);return PM3_ESOFT;} -#define CLIGetHexBLessWithReturn(ctx, paramnum, data, datalen, delta) if (CLIParamHexToBuf(arg_get_str(paramnum), data, sizeof(data) - (delta), datalen)) {CLIParserFree(ctx);return PM3_ESOFT;} -#define CLIGetHexWithReturn(ctx, paramnum, data, datalen) if (CLIParamHexToBuf(arg_get_str(paramnum), data, sizeof(data), datalen)) {CLIParserFree(ctx);return PM3_ESOFT;} -#define CLIGetStrWithReturn(ctx, paramnum, data, datalen) if (CLIParamStrToBuf(arg_get_str(paramnum), data, sizeof(data), datalen)) {CLIParserFree(ctx);return PM3_ESOFT;} +#define CLIFree(ctx) if ((ctx)) {CLIParserFree((ctx)); (ctx)=NULL;} +#define CLIExecWithReturn(ctx, cmd, atbl, ifempty) if (CLIParserParseString(ctx, cmd, atbl, arg_getsize(atbl), ifempty)){if ((ctx)) CLIParserFree((ctx)); (ctx)=NULL;return PM3_ESOFT;} +#define CLIGetHexBLessWithReturn(ctx, paramnum, data, datalen, delta) if (CLIParamHexToBuf(arg_get_str(paramnum), data, sizeof(data) - (delta), datalen)) {if ((ctx)) CLIParserFree((ctx)); (ctx)=NULL;return PM3_ESOFT;} +#define CLIGetHexWithReturn(ctx, paramnum, data, datalen) if (CLIParamHexToBuf(arg_get_str(paramnum), data, sizeof(data), datalen)) {if ((ctx)) CLIParserFree((ctx)); (ctx)=NULL;return PM3_ESOFT;} +#define CLIGetStrWithReturn(ctx, paramnum, data, datalen) if (CLIParamStrToBuf(arg_get_str(paramnum), data, sizeof(data), datalen)) {if ((ctx)) CLIParserFree((ctx)); (ctx)=NULL;return PM3_ESOFT;} typedef struct { void **argtable; From 653f5b4e5dfd520796a91d3c3e277646391c946a Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 13:35:16 +0200 Subject: [PATCH 485/632] chg: make define --- client/deps/cliparser/cliparser.c | 5 ----- client/deps/cliparser/cliparser.h | 12 ++++++------ 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/client/deps/cliparser/cliparser.c b/client/deps/cliparser/cliparser.c index 25cd786d7..f0ba57d40 100644 --- a/client/deps/cliparser/cliparser.c +++ b/client/deps/cliparser/cliparser.c @@ -145,11 +145,6 @@ int CLIParserParseStringEx(CLIParserContext *ctx, const char *str, void *vargtab return CLIParserParseArg(ctx, argc, argv, vargtable, vargtableLen, allowEmptyExec); } -void CLIParserFree(CLIParserContext *ctx) { - arg_freetable(ctx->argtable, ctx->argtableLen); - free(ctx); -} - // convertors int CLIParamHexToBuf(struct arg_str *argstr, uint8_t *data, int maxdatalen, int *datalen) { *datalen = 0; diff --git a/client/deps/cliparser/cliparser.h b/client/deps/cliparser/cliparser.h index b88acefc5..990e6d8d6 100644 --- a/client/deps/cliparser/cliparser.h +++ b/client/deps/cliparser/cliparser.h @@ -11,6 +11,7 @@ #ifndef __CLIPARSER_H #define __CLIPARSER_H #include "argtable3.h" +#include <stdlib.h> #include "util.h" #define arg_param_begin arg_lit0("hH", "help", "This help") @@ -27,11 +28,11 @@ #define arg_strx1(shortopts, longopts, datatype, glossary) (arg_strn((shortopts), (longopts), (datatype), 1, 250, (glossary))) #define arg_strx0(shortopts, longopts, datatype, glossary) (arg_strn((shortopts), (longopts), (datatype), 0, 250, (glossary))) -#define CLIFree(ctx) if ((ctx)) {CLIParserFree((ctx)); (ctx)=NULL;} -#define CLIExecWithReturn(ctx, cmd, atbl, ifempty) if (CLIParserParseString(ctx, cmd, atbl, arg_getsize(atbl), ifempty)){if ((ctx)) CLIParserFree((ctx)); (ctx)=NULL;return PM3_ESOFT;} -#define CLIGetHexBLessWithReturn(ctx, paramnum, data, datalen, delta) if (CLIParamHexToBuf(arg_get_str(paramnum), data, sizeof(data) - (delta), datalen)) {if ((ctx)) CLIParserFree((ctx)); (ctx)=NULL;return PM3_ESOFT;} -#define CLIGetHexWithReturn(ctx, paramnum, data, datalen) if (CLIParamHexToBuf(arg_get_str(paramnum), data, sizeof(data), datalen)) {if ((ctx)) CLIParserFree((ctx)); (ctx)=NULL;return PM3_ESOFT;} -#define CLIGetStrWithReturn(ctx, paramnum, data, datalen) if (CLIParamStrToBuf(arg_get_str(paramnum), data, sizeof(data), datalen)) {if ((ctx)) CLIParserFree((ctx)); (ctx)=NULL;return PM3_ESOFT;} +#define CLIParserFree(ctx) if ((ctx)) {arg_freetable(ctx->argtable, ctx->argtableLen); free((ctx)); (ctx)=NULL;} +#define CLIExecWithReturn(ctx, cmd, atbl, ifempty) if (CLIParserParseString(ctx, cmd, atbl, arg_getsize(atbl), ifempty)) {CLIParserFree((ctx)); return PM3_ESOFT;} +#define CLIGetHexBLessWithReturn(ctx, paramnum, data, datalen, delta) if (CLIParamHexToBuf(arg_get_str(paramnum), data, sizeof(data) - (delta), datalen)) {CLIParserFree((ctx)); return PM3_ESOFT;} +#define CLIGetHexWithReturn(ctx, paramnum, data, datalen) if (CLIParamHexToBuf(arg_get_str(paramnum), data, sizeof(data), datalen)) {CLIParserFree((ctx)); return PM3_ESOFT;} +#define CLIGetStrWithReturn(ctx, paramnum, data, datalen) if (CLIParamStrToBuf(arg_get_str(paramnum), data, sizeof(data), datalen)) {CLIParserFree((ctx)); return PM3_ESOFT;} typedef struct { void **argtable; @@ -45,7 +46,6 @@ int CLIParserInit(CLIParserContext **ctx, const char *vprogramName, const char * int CLIParserParseString(CLIParserContext *ctx, const char *str, void *vargtable[], size_t vargtableLen, bool allowEmptyExec); int CLIParserParseStringEx(CLIParserContext *ctx, const char *str, void *vargtable[], size_t vargtableLen, bool allowEmptyExec, bool clueData); int CLIParserParseArg(CLIParserContext *ctx, int argc, char **argv, void *vargtable[], size_t vargtableLen, bool allowEmptyExec); -void CLIParserFree(CLIParserContext *ctx); int CLIParamHexToBuf(struct arg_str *argstr, uint8_t *data, int maxdatalen, int *datalen); int CLIParamStrToBuf(struct arg_str *argstr, uint8_t *data, int maxdatalen, int *datalen); From 6980429bd4c01a716c9168b05dd2f805b7e35940 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Tue, 2 Jun 2020 14:12:28 +0200 Subject: [PATCH 486/632] ARM: remove contradictory flag -fno-strict-aliasing as we have -fstrict-aliasing in Makefile.common --- armsrc/Makefile | 2 +- bootrom/Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/armsrc/Makefile b/armsrc/Makefile index f9e33f5e5..23ac247c3 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -20,7 +20,7 @@ endif #in the next section to remove that particular feature from compilation. # NO space,TABs after the "\" sign. APP_CFLAGS = $(PLATFORM_DEFS) \ - -fno-strict-aliasing -ffunction-sections -fdata-sections + -ffunction-sections -fdata-sections SRC_LF = lfops.c lfsampling.c pcf7931.c lfdemod.c lfadc.c SRC_ISO15693 = iso15693.c iso15693tools.c diff --git a/bootrom/Makefile b/bootrom/Makefile index 785293ca6..75a4e5ced 100644 --- a/bootrom/Makefile +++ b/bootrom/Makefile @@ -23,7 +23,7 @@ VERSIONSRC = version.c # THUMBSRC := # stdint.h provided locally until GCC 4.5 becomes C99 compliant -APP_CFLAGS = -I. -fno-strict-aliasing -ffunction-sections -fdata-sections +APP_CFLAGS = -I. -ffunction-sections -fdata-sections # stack-protect , no-pie reduces size on Gentoo Hardened 8.2 gcc APP_CFLAGS += -fno-stack-protector -fno-pie From 04bf1b8db7666d18dc959104600c2e97882cc789 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 2 Jun 2020 18:18:33 +0200 Subject: [PATCH 487/632] cppchecker --- client/src/fileutils.c | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/client/src/fileutils.c b/client/src/fileutils.c index d8176f65c..9fc8d5f95 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -346,37 +346,30 @@ int saveFileJSONex(const char *preferredName, JSONFileType ftype, uint8_t *data, } if (mfIsSectorTrailer(i)) { - memset(path, 0x00, sizeof(path)); - sprintf(path, "$.SectorKeys.%d.KeyA", mfSectorNum(i)); + + snprintf(path, sizeof(path), "$.SectorKeys.%d.KeyA", mfSectorNum(i)); JsonSaveBufAsHexCompact(root, path, &data[i * 16], 6); - memset(path, 0x00, sizeof(path)); - sprintf(path, "$.SectorKeys.%d.KeyB", mfSectorNum(i)); + snprintf(path, sizeof(path), "$.SectorKeys.%d.KeyB", mfSectorNum(i)); JsonSaveBufAsHexCompact(root, path, &data[i * 16 + 10], 6); - memset(path, 0x00, sizeof(path)); uint8_t *adata = &data[i * 16 + 6]; - sprintf(path, "$.SectorKeys.%d.AccessConditions", mfSectorNum(i)); + snprintf(path, sizeof(path), "$.SectorKeys.%d.AccessConditions", mfSectorNum(i)); JsonSaveBufAsHexCompact(root, path, &data[i * 16 + 6], 4); - memset(path, 0x00, sizeof(path)); - sprintf(path, "$.SectorKeys.%d.AccessConditionsText.block%zu", mfSectorNum(i), i - 3); + snprintf(path, sizeof(path), "$.SectorKeys.%d.AccessConditionsText.block%zu", mfSectorNum(i), i - 3); JsonSaveStr(root, path, mfGetAccessConditionsDesc(0, adata)); - memset(path, 0x00, sizeof(path)); - sprintf(path, "$.SectorKeys.%d.AccessConditionsText.block%zu", mfSectorNum(i), i - 2); + snprintf(path, sizeof(path), "$.SectorKeys.%d.AccessConditionsText.block%zu", mfSectorNum(i), i - 2); JsonSaveStr(root, path, mfGetAccessConditionsDesc(1, adata)); - memset(path, 0x00, sizeof(path)); - sprintf(path, "$.SectorKeys.%d.AccessConditionsText.block%zu", mfSectorNum(i), i - 1); + snprintf(path, sizeof(path), "$.SectorKeys.%d.AccessConditionsText.block%zu", mfSectorNum(i), i - 1); JsonSaveStr(root, path, mfGetAccessConditionsDesc(2, adata)); - memset(path, 0x00, sizeof(path)); - sprintf(path, "$.SectorKeys.%d.AccessConditionsText.block%zu", mfSectorNum(i), i); + snprintf(path, sizeof(path), "$.SectorKeys.%d.AccessConditionsText.block%zu", mfSectorNum(i), i); JsonSaveStr(root, path, mfGetAccessConditionsDesc(3, adata)); - memset(path, 0x00, sizeof(path)); - sprintf(path, "$.SectorKeys.%d.AccessConditionsText.UserData", mfSectorNum(i)); + snprintf(path, sizeof(path), "$.SectorKeys.%d.AccessConditionsText.UserData", mfSectorNum(i)); JsonSaveBufAsHexCompact(root, path, &adata[3], 1); } } From e93ba733bccd17ee545eb6d5f575ed19de9ff88f Mon Sep 17 00:00:00 2001 From: Iceman <iceman@iuse.se> Date: Tue, 2 Jun 2020 18:51:57 +0200 Subject: [PATCH 488/632] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f5482bc6b..924114638 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ |[Notes on UART](/doc/uart_notes.md)|[Notes on Termux / Android](/doc/termux_notes.md)|[Notes on paths](/doc/path_notes.md)| |[Notes on frame format](/doc/new_frame_format.md)|[Notes on tracelog / wireshark](/doc/trace_notes.md)|[Notes on EMV](/doc/emv_notes.md)| |[Notes on external flash](/doc/ext_flash_notes.md)|[Notes on loclass](/doc/loclass_notes.md)|[Notes on Coverity Scan Config & Run](/doc/md/Development/Coverity-Scan-Config-%26-Run.md)| -|[Notes on file formats used with Proxmark3](/doc/extensions_notes.md)|[Notes on MFU binary format](/doc/mfu_binary_format_notes.md)|| +|[Notes on file formats used with Proxmark3](/doc/extensions_notes.md)|[Notes on MFU binary format](/doc/mfu_binary_format_notes.md)|[Notes on FPGA & ARM](/doc/fpga_arm_notes.md)| |[Developing standalone mode](/armsrc/Standalone/readme.md)|[Wiki about standalone mode](https://github.com/RfidResearchGroup/proxmark3/wiki/Standalone-mode)|| From ffbad646dff4b18661b914c821b56f95b89eaa6d Mon Sep 17 00:00:00 2001 From: Iceman <iceman@iuse.se> Date: Wed, 3 Jun 2020 10:27:56 +0200 Subject: [PATCH 489/632] Update Troubleshooting.md --- doc/md/Installation_Instructions/Troubleshooting.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/doc/md/Installation_Instructions/Troubleshooting.md b/doc/md/Installation_Instructions/Troubleshooting.md index d2c062dcb..f33897f78 100644 --- a/doc/md/Installation_Instructions/Troubleshooting.md +++ b/doc/md/Installation_Instructions/Troubleshooting.md @@ -20,6 +20,7 @@ Always use the latest repository commits from *master* branch. There are always * [Usb cable](#usb-cable) * [WSL 2 explorer.exe . doesnt work](#WSL-2) * [Troubles with running the Proxmark3 client](#troubles-with-running-the-proxmark3-client) + * [libQt5Core.so.5 not found]() ## `pm3` or `pm3-flash*` doesn't see my Proxmark @@ -178,3 +179,11 @@ Trying to access the dump files created in WSL, you will need to run ```explore Some reports has stated that they needed to execute the Proxmark3 as root on their *nix system. Try running it with `sudo ./pm3` + +## libQt5Core.so.5 not found +On WSL1 / updated to Ubuntu 20.04, there is a slight chance you experience problems when compiling the repo with QT5. +The following steps is needed to make the development environment happy again. +``` +sudo apt reinstall qtbase5-dev +sudo strip --remove-section=.note.ABI-tag /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 +``` From 4321b42e891a6f843617ae5577e6e4ff56790f7e Mon Sep 17 00:00:00 2001 From: Iceman <iceman@iuse.se> Date: Wed, 3 Jun 2020 10:29:23 +0200 Subject: [PATCH 490/632] Update Troubleshooting.md --- doc/md/Installation_Instructions/Troubleshooting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/md/Installation_Instructions/Troubleshooting.md b/doc/md/Installation_Instructions/Troubleshooting.md index f33897f78..27a2a01e8 100644 --- a/doc/md/Installation_Instructions/Troubleshooting.md +++ b/doc/md/Installation_Instructions/Troubleshooting.md @@ -20,7 +20,7 @@ Always use the latest repository commits from *master* branch. There are always * [Usb cable](#usb-cable) * [WSL 2 explorer.exe . doesnt work](#WSL-2) * [Troubles with running the Proxmark3 client](#troubles-with-running-the-proxmark3-client) - * [libQt5Core.so.5 not found]() + * [libQt5Core.so.5 not found](#libQt5Core.so.5-not-found) ## `pm3` or `pm3-flash*` doesn't see my Proxmark From 1848f688f86fdc8d46e503e9b5ffa420c8c0a5db Mon Sep 17 00:00:00 2001 From: Iceman <iceman@iuse.se> Date: Wed, 3 Jun 2020 10:29:56 +0200 Subject: [PATCH 491/632] Update Troubleshooting.md --- doc/md/Installation_Instructions/Troubleshooting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/md/Installation_Instructions/Troubleshooting.md b/doc/md/Installation_Instructions/Troubleshooting.md index 27a2a01e8..c81d3bea7 100644 --- a/doc/md/Installation_Instructions/Troubleshooting.md +++ b/doc/md/Installation_Instructions/Troubleshooting.md @@ -20,7 +20,7 @@ Always use the latest repository commits from *master* branch. There are always * [Usb cable](#usb-cable) * [WSL 2 explorer.exe . doesnt work](#WSL-2) * [Troubles with running the Proxmark3 client](#troubles-with-running-the-proxmark3-client) - * [libQt5Core.so.5 not found](#libQt5Core.so.5-not-found) + * [libQt5Core.so.5 not found](#libQt5Coreso5-not-found) ## `pm3` or `pm3-flash*` doesn't see my Proxmark From cfa176dd3e6f57848068c0ac78ca0307585e48fc Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 3 Jun 2020 11:18:17 +0200 Subject: [PATCH 492/632] frees --- client/src/cmdhffido.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/client/src/cmdhffido.c b/client/src/cmdhffido.c index 22b855e95..70ddd9319 100644 --- a/client/src/cmdhffido.c +++ b/client/src/cmdhffido.c @@ -121,7 +121,6 @@ static json_t *OpenJson(CLIParserContext *ctx, int paramnum, char *fname, void * // CLIGetStrWithReturn(ctx, paramnum, jsonname, &jsonnamelen); if (CLIParamStrToBuf(arg_get_str(paramnum), jsonname, sizeof(jsonname), &jsonnamelen)) { - CLIParserFree(ctx); return NULL; } @@ -191,8 +190,10 @@ static int CmdHFFidoRegister(const char *cmd) { char fname[250] = {0}; bool err; root = OpenJson(ctx, 5, fname, argtable, &err); - if (err) + if (err) { + CLIParserFree(ctx); return 1; + } if (root) { size_t jlen; JsonLoadBufAsHex(root, "$.ChallengeParam", data, 32, &jlen); @@ -430,8 +431,10 @@ static int CmdHFFidoAuthenticate(const char *cmd) { char fname[250] = {0}; bool err; root = OpenJson(ctx, 7, fname, argtable, &err); - if (err) + if (err) { + CLIParserFree(ctx); return 1; + } if (root) { size_t jlen; JsonLoadBufAsHex(root, "$.ChallengeParam", data, 32, &jlen); From 4683f84991acf182e6f719d6c2ee7d11727fa0c5 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 3 Jun 2020 12:06:41 +0200 Subject: [PATCH 493/632] chg: 'hf 15 restore' - now also can use addressed mode --- client/src/cmdhf15.c | 101 ++++++++++++++++++++----------------------- 1 file changed, 48 insertions(+), 53 deletions(-) diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index 8712a9829..b2a01b7ff 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -469,8 +469,8 @@ static int usage_15_restore(void) { {"h", "this help"}, {"-2", "use slower '1 out of 256' mode"}, {"-o", "set OPTION Flag (needed for TI)"}, + {"a", "use addressed mode"}, {"r <NUM>", "numbers of retries on error, default is 3"}, - {"u <UID>", "load hf-15-<UID>-dump.bin"}, {"f <filename>", "load <filename>"}, {"b <block size>", "block size, default is 4"} }; @@ -1617,34 +1617,29 @@ static int CmdHF15Write(const char *Cmd) { } static int CmdHF15Restore(const char *Cmd) { - FILE *f; - uint8_t uid[8] = {0x00}; + char newPrefix[60] = {0x00}; char filename[FILE_PATH_SIZE] = {0x00}; - char buff[255] = {0x00}; size_t blocksize = 4; - uint8_t cmdp = 0; - char newCmdPrefix[FILE_PATH_SIZE + 1] = {0x00}, tmpCmd[FILE_PATH_SIZE + 262] = {0x00}; - char param[FILE_PATH_SIZE] = ""; - char hex[255] = ""; - uint8_t retries = 3, i = 0; - int retval = 0; + uint8_t cmdp = 0, retries = 3; + bool addressed_mode = false; while (param_getchar(Cmd, cmdp) != 0x00) { switch (tolower(param_getchar(Cmd, cmdp))) { - case '-': + case '-': { + char param[3] = ""; param_getstr(Cmd, cmdp, param, sizeof(param)); switch (param[1]) { case '2': case 'o': - strncpy(newCmdPrefix, " ", sizeof(newCmdPrefix) - 1); - strncat(newCmdPrefix, param, sizeof(newCmdPrefix) - strlen(newCmdPrefix) - 1); + sprintf(newPrefix, " %s", param); break; default: - PrintAndLogEx(WARNING, "Unknown parameter '%s'", param); + PrintAndLogEx(WARNING, "11 Unknown parameter " _YELLOW_("'%s'"), param); return usage_15_restore(); } break; + } case 'f': param_getstr(Cmd, cmdp + 1, filename, FILE_PATH_SIZE); cmdp++; @@ -1657,15 +1652,13 @@ static int CmdHF15Restore(const char *Cmd) { blocksize = param_get8ex(Cmd, cmdp + 1, 4, 10); cmdp++; break; - case 'u': - param_getstr(Cmd, cmdp + 1, buff, FILE_PATH_SIZE); - cmdp++; - snprintf(filename, sizeof(filename), "hf-15-%s-dump.bin", buff); + case 'a': + addressed_mode = true; break; case 'h': return usage_15_restore(); default: - PrintAndLogEx(WARNING, "Unknown parameter '%c'", param_getchar(Cmd, cmdp)); + PrintAndLogEx(WARNING, "Unknown parameter " _YELLOW_("'%c'"), param_getchar(Cmd, cmdp)); return usage_15_restore(); } cmdp++; @@ -1678,62 +1671,64 @@ static int CmdHF15Restore(const char *Cmd) { return usage_15_restore(); } - if ((f = fopen(filename, "rb")) == NULL) { - - PrintAndLogEx(WARNING, "Could not find file %s", filename); - return PM3_EFILE; - } - + uint8_t uid[8] = {0x00}; if (!getUID(uid)) { PrintAndLogEx(WARNING, "No tag found"); - fclose(f); + return PM3_ESOFT; + } + + size_t datalen = 0; + uint8_t *data = NULL; + if (loadFile_safe(filename, ".bin", (void **)&data, &datalen) != PM3_SUCCESS) { + PrintAndLogEx(WARNING, "Could not find file " _YELLOW_("%s"), filename); + return PM3_EFILE; + } + + if ((datalen % blocksize) != 0) { + PrintAndLogEx(WARNING, "Datalen %zu isn't dividable with blocksize %zu", datalen, blocksize); return PM3_ESOFT; } PrintAndLogEx(INFO, "Restoring data blocks."); - while (1) { - uint8_t tried = 0; - hex[0] = 0x00; - tmpCmd[0] = 0x00; + int retval = PM3_SUCCESS; + size_t bytes = 0; + uint16_t i = 0; + while (bytes < datalen) { - size_t bytes_read = fread(buff, 1, blocksize, f); - if (bytes_read == 0) { - PrintAndLogEx(SUCCESS, "File reading done `%s`", filename); - fclose(f); - return PM3_SUCCESS; - } else if (bytes_read != blocksize) { - PrintAndLogEx(ERR, "File reading error (%s), %zu bytes read instead of %zu bytes.", filename, bytes_read, blocksize); - fclose(f); - return PM3_EFILE; + uint8_t tried = 0; + char hex[40] = {0x00}; + char tmpCmd[200] = {0x00}; + + if (addressed_mode) { + char uidhex[17] = {0x00}; + hex_to_buffer((uint8_t *)uidhex, uid, sizeof(uid), sizeof(uidhex) - 1, 0, false, true); + hex_to_buffer((uint8_t *)hex, data + i, blocksize, sizeof(hex) - 1, 0, false, true); + snprintf(tmpCmd, sizeof(tmpCmd), "%s %s %u %s", newPrefix, uidhex, i, hex); + } else { + hex_to_buffer((uint8_t *)hex, data + i, blocksize, sizeof(hex) - 1, 0, false, true); + snprintf(tmpCmd, sizeof(tmpCmd), "%s u %u %s", newPrefix, i, hex); } - for (int j = 0; j < blocksize; j++) - snprintf(hex + j * 2, 3, "%02X", buff[j]); - - for (int j = 0; j < ARRAYLEN(uid); j++) - snprintf(buff + j * 2, 3, "%02X", uid[j]); - - //TODO: Addressed mode currently not work - //snprintf(tmpCmd, sizeof(tmpCmd), "%s %s %d %s", newCmdPrefix, buff, i, hex); - snprintf(tmpCmd, sizeof(tmpCmd), "%s u %u %s", newCmdPrefix, i, hex); - PrintAndLogEx(DEBUG, "Command to be sent| %s", tmpCmd); + PrintAndLogEx(DEBUG, "hf 15 write %s", tmpCmd); for (tried = 0; tried < retries; tried++) { if (!(retval = CmdHF15Write(tmpCmd))) { break; } } + if (tried >= retries) { - fclose(f); + free(data); PrintAndLogEx(FAILED, "Restore failed. Too many retries."); return retval; } - + bytes += blocksize; i++; } - fclose(f); - PrintAndLogEx(INFO, "Finish restore"); + free(data); + PrintAndLogEx(INFO, "done"); + PrintAndLogEx(HINT, "Try reading your card to verify with " _YELLOW_("`hf 15 dump`") ); return PM3_SUCCESS; } From 843ab094bb26642577a8166ad39efb76f5033352 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 3 Jun 2020 12:29:52 +0200 Subject: [PATCH 494/632] chg: 'trace load' - use fileutils --- client/src/cmdtrace.c | 39 +++++++-------------------------------- 1 file changed, 7 insertions(+), 32 deletions(-) diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index e7db5fa85..29cf2c1df 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -427,48 +427,23 @@ static int SanityOfflineCheck( bool useTraceBuffer ){ static int CmdTraceLoad(const char *Cmd) { - FILE *f = NULL; char filename[FILE_PATH_SIZE]; char cmdp = tolower(param_getchar(Cmd, 0)); if (strlen(Cmd) < 1 || cmdp == 'h') return usage_trace_load(); param_getstr(Cmd, 0, filename, sizeof(filename)); - if ((f = fopen(filename, "rb")) == NULL) { - PrintAndLogEx(FAILED, "Could not open file " _YELLOW_("%s"), filename); - return PM3_EIO; - } - - // get filesize in order to malloc memory - fseek(f, 0, SEEK_END); - long fsize = ftell(f); - fseek(f, 0, SEEK_SET); - - if (fsize < 0) { - PrintAndLogEx(FAILED, "error, when getting filesize"); - fclose(f); - return PM3_EIO; - } - if (fsize < 4) { - PrintAndLogEx(FAILED, "error, file is too small"); - fclose(f); - return PM3_ESOFT; - } - if (g_trace) free(g_trace); - g_traceLen = 0; - g_trace = calloc(fsize, sizeof(uint8_t)); - if (g_trace == NULL) { - PrintAndLogEx(FAILED, "Cannot allocate memory for trace"); - fclose(f); - return PM3_EMALLOC; + size_t len = 0; + if (loadFile_safe(filename, ".trace", (void**)&g_trace, &len) != PM3_SUCCESS) { + PrintAndLogEx(FAILED, "Could not open file " _YELLOW_("%s"), filename); + return PM3_EIO; } - - size_t bytes_read = fread(g_trace, 1, fsize, f); - g_traceLen = bytes_read; - fclose(f); + + g_traceLen = (long)len; + PrintAndLogEx(SUCCESS, "Recorded Activity (TraceLen = " _YELLOW_("%lu") " bytes) loaded from " _YELLOW_("%s"), g_traceLen, filename); return PM3_SUCCESS; } From 8667b34da6eda883364ece8eb1edbb98bdcdd1ea Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Tue, 2 Jun 2020 23:12:29 +0200 Subject: [PATCH 495/632] document mingw tweak --- client/deps/tinycbor/cbor.h | 1 + 1 file changed, 1 insertion(+) diff --git a/client/deps/tinycbor/cbor.h b/client/deps/tinycbor/cbor.h index 081597fec..6890ee597 100644 --- a/client/deps/tinycbor/cbor.h +++ b/client/deps/tinycbor/cbor.h @@ -555,6 +555,7 @@ enum CborPrettyFlags { CborPrettyDefaultFlags = CborPrettyIndicateIndeterminateLength }; +/* cf https://sourceforge.net/p/mingw-w64/wiki2/gnu%20printf/ */ typedef CborError(*CborStreamFunction)(void *token, const char *fmt, ...) #if defined(__MINGW32__) || defined(__MINGW64__) __attribute__((format (__MINGW_PRINTF_FORMAT, 2, 3))); From f6566f89f262ac3ce87e5cb7b100381e4c44c857 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 3 Jun 2020 13:05:33 +0200 Subject: [PATCH 496/632] chg: 'sc upgrade' - now uses fileutils --- client/src/cmdsmartcard.c | 106 ++++++++++++-------------------------- 1 file changed, 34 insertions(+), 72 deletions(-) diff --git a/client/src/cmdsmartcard.c b/client/src/cmdsmartcard.c index f60dd5513..143140174 100644 --- a/client/src/cmdsmartcard.c +++ b/client/src/cmdsmartcard.c @@ -522,7 +522,6 @@ static int CmdSmartUpgrade(const char *Cmd) { PrintAndLogEx(WARNING, "A dangerous command, do wrong and you could brick the sim module"); PrintAndLogEx(NORMAL, ""); - FILE *f; char filename[FILE_PATH_SIZE] = {0}; uint8_t cmdp = 0; bool errors = false; @@ -530,7 +529,6 @@ static int CmdSmartUpgrade(const char *Cmd) { while (param_getchar(Cmd, cmdp) != 0x00 && !errors) { switch (tolower(param_getchar(Cmd, cmdp))) { case 'f': - //File handling and reading if (param_getstr(Cmd, cmdp + 1, filename, FILE_PATH_SIZE) >= FILE_PATH_SIZE) { PrintAndLogEx(FAILED, "Filename too long"); errors = true; @@ -550,105 +548,70 @@ static int CmdSmartUpgrade(const char *Cmd) { //Validations if (errors || cmdp == 0) return usage_sm_upgrade(); - char sha512filename[FILE_PATH_SIZE] = {'\0'}; + char *bin_extension = filename; char *dot_position = NULL; while ((dot_position = strchr(bin_extension, '.')) != NULL) { bin_extension = dot_position + 1; } + // generate filename for the related SHA512 hash file + char sha512filename[FILE_PATH_SIZE] = {'\0'}; if (!strcmp(bin_extension, "BIN") || !strcmp(bin_extension, "bin")) { memcpy(sha512filename, filename, strlen(filename) - strlen("bin")); strcat(sha512filename, "sha512.txt"); } else { PrintAndLogEx(FAILED, "Filename extension of firmware upgrade file must be .BIN"); - return 1; + return PM3_ESOFT; } - PrintAndLogEx(INFO, "firmware file : " _YELLOW_("%s"), filename); - PrintAndLogEx(INFO, "Checking integrity : " _YELLOW_("%s"), sha512filename); + PrintAndLogEx(INFO, "firmware file " _YELLOW_("%s"), filename); + PrintAndLogEx(INFO, "Checking integrity " _YELLOW_("%s"), sha512filename); // load firmware file - f = fopen(filename, "rb"); - if (!f) { + size_t firmware_size = 0; + uint8_t *firmware = NULL; + if (loadFile_safe(filename, "", (void**)&firmware, &firmware_size) != PM3_SUCCESS) { PrintAndLogEx(FAILED, "Firmware file " _YELLOW_("%s") " not found or locked.", filename); return PM3_EFILE; } - // get filesize in order to malloc memory - fseek(f, 0, SEEK_END); - long fsize = ftell(f); - fseek(f, 0, SEEK_SET); - - if (fsize <= 0) { - PrintAndLogEx(ERR, "error, when getting filesize"); - fclose(f); - return 1; - } - - uint8_t *dump = calloc(fsize, sizeof(uint8_t)); - if (!dump) { - PrintAndLogEx(ERR, "error, cannot allocate memory "); - fclose(f); - return 1; - } - - size_t firmware_size = fread(dump, 1, fsize, f); - fclose(f); - // load sha512 file - f = fopen(sha512filename, "rb"); - if (!f) { + size_t sha512_size = 0; + char *hashstring = NULL; + if (loadFile_safe(sha512filename, "", (void**)&hashstring, &sha512_size) != PM3_SUCCESS) { PrintAndLogEx(FAILED, "SHA-512 file not found or locked."); - free(dump); + free(firmware); return PM3_EFILE; } - // get filesize in order to malloc memory - fseek(f, 0, SEEK_END); - fsize = ftell(f); - fseek(f, 0, SEEK_SET); - - if (fsize < 0) { - PrintAndLogEx(FAILED, "Could not determine size of SHA-512 file"); - fclose(f); - free(dump); - return 1; + if (sha512_size < 128) { + PrintAndLogEx(FAILED, "SHA-512 file wrong size"); + free(firmware); + return PM3_ESOFT; } - - if (fsize < 128) { - PrintAndLogEx(FAILED, "SHA-512 file too short"); - fclose(f); - free(dump); - return 1; - } - - char hashstring[129]; - size_t bytes_read = fread(hashstring, 1, 128, f); hashstring[128] = '\0'; - fclose(f); - uint8_t hash_1[64]; - if (bytes_read != 128 || param_gethex(hashstring, 0, hash_1, 128)) { + if (param_gethex(hashstring, 0, hash_1, 128)) { PrintAndLogEx(FAILED, "Couldn't read SHA-512 file"); - free(dump); - return 1; + free(firmware); + return PM3_ESOFT; } uint8_t hash_2[64]; - if (sha512hash(dump, firmware_size, hash_2)) { + if (sha512hash(firmware, firmware_size, hash_2)) { PrintAndLogEx(FAILED, "Couldn't calculate SHA-512 of firmware"); - free(dump); - return 1; + free(firmware); + return PM3_ESOFT; } if (memcmp(hash_1, hash_2, 64)) { PrintAndLogEx(FAILED, "Couldn't verify integrity of firmware file " _RED_("(wrong SHA-512 hash)")); - free(dump); - return 1; + free(firmware); + return PM3_ESOFT; } - + PrintAndLogEx(SUCCESS, "Sim module firmware uploading to PM3"); //Send to device @@ -666,20 +629,19 @@ static int CmdSmartUpgrade(const char *Cmd) { conn.block_after_ACK = false; } clearCommandBuffer(); - SendCommandOLD(CMD_SMART_UPLOAD, index + bytes_sent, bytes_in_packet, 0, dump + bytes_sent, bytes_in_packet); + SendCommandOLD(CMD_SMART_UPLOAD, index + bytes_sent, bytes_in_packet, 0, firmware + bytes_sent, bytes_in_packet); if (!WaitForResponseTimeout(CMD_ACK, NULL, 2000)) { PrintAndLogEx(WARNING, "timeout while waiting for reply."); - free(dump); - return 1; + free(firmware); + return PM3_ETIMEOUT; } bytes_remaining -= bytes_in_packet; bytes_sent += bytes_in_packet; - printf("."); - fflush(stdout); + PrintAndLogEx(INPLACE, "%d bytes sent", bytes_sent); } - free(dump); - printf("\n"); + free(firmware); + PrintAndLogEx(NORMAL, ""); PrintAndLogEx(SUCCESS, "Sim module firmware updating, don\'t turn off your PM3!"); // trigger the firmware upgrade @@ -688,11 +650,11 @@ static int CmdSmartUpgrade(const char *Cmd) { PacketResponseNG resp; if (!WaitForResponseTimeout(CMD_ACK, &resp, 2500)) { PrintAndLogEx(WARNING, "timeout while waiting for reply."); - return 1; + return PM3_ETIMEOUT; } if ((resp.oldarg[0] & 0xFF)) { PrintAndLogEx(SUCCESS, "Sim module firmware upgrade " _GREEN_("successful")); - PrintAndLogEx(SUCCESS, "\n run " _YELLOW_("`hw status`") " to validate the fw version "); + PrintAndLogEx(HINT, "run " _YELLOW_("`hw status`") " to validate the fw version "); } else { PrintAndLogEx(FAILED, "Sim module firmware upgrade " _RED_("failed")); } From 8898000dac1291e9e2f4fcaad4accb13335e74c5 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 3 Jun 2020 13:10:34 +0200 Subject: [PATCH 497/632] chg: 'hf mfu restore' - now uses fileutils --- client/src/cmdhfmfu.c | 31 ++++++------------------------- 1 file changed, 6 insertions(+), 25 deletions(-) diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index 54e0b2423..ed7e7d358 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -2127,7 +2127,6 @@ static int CmdHF14AMfURestore(const char *Cmd) { bool read_key = false; bool verbose = false; size_t filelen = 0; - FILE *f; memset(authkey, 0x00, sizeof(authkey)); @@ -2188,35 +2187,17 @@ static int CmdHF14AMfURestore(const char *Cmd) { //Validations if (errors || cmdp == 0) return usage_hf_mfu_restore(); - if ((f = fopen(filename, "rb")) == NULL) { + uint8_t *dump = NULL; + size_t bytes_read = 0; + if (loadFile_safe(filename, "", (void**)&dump, &bytes_read) != PM3_SUCCESS) { PrintAndLogEx(WARNING, "Could not find file " _YELLOW_("%s"), filename); - return 1; + return PM3_EIO; } - // get filesize to know how memory to allocate - fseek(f, 0, SEEK_END); - long fsize = ftell(f); - fseek(f, 0, SEEK_SET); - if (fsize <= 0) { - PrintAndLogEx(ERR, "Error, when getting filesize"); - fclose(f); - return 1; - } - - uint8_t *dump = calloc(fsize, sizeof(uint8_t)); - if (!dump) { - PrintAndLogEx(WARNING, "Failed to allocate memory"); - fclose(f); - return 1; - } - - // read all data - size_t bytes_read = fread(dump, 1, fsize, f); - fclose(f); if (bytes_read < MFU_DUMP_PREFIX_LENGTH) { PrintAndLogEx(ERR, "Error, dump file is too small"); free(dump); - return 1; + return PM3_ESOFT; } int res = convert_mfu_dump_format(&dump, &bytes_read, verbose); @@ -2232,7 +2213,7 @@ static int CmdHF14AMfURestore(const char *Cmd) { if (pages - 1 != mem->pages) { PrintAndLogEx(ERR, "Error, invalid dump, wrong page count"); free(dump); - return 1; + return PM3_ESOFT; } PrintAndLogEx(INFO, "Restoring " _YELLOW_("%s")" to card", filename); From 17d6ce50071b56b492104c596b7e320442a9460a Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 3 Jun 2020 14:26:09 +0200 Subject: [PATCH 498/632] coverity 290398 --- client/src/cmdhf15.c | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index b2a01b7ff..65946b7d5 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -1686,6 +1686,7 @@ static int CmdHF15Restore(const char *Cmd) { if ((datalen % blocksize) != 0) { PrintAndLogEx(WARNING, "Datalen %zu isn't dividable with blocksize %zu", datalen, blocksize); + free(data); return PM3_ESOFT; } From 12425aaf60912978ce315cc18745287d8df1d8a4 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 3 Jun 2020 14:52:27 +0200 Subject: [PATCH 499/632] chg, hf fido remake --- client/src/cmdhffido.c | 177 ++++++++++++++++++++--------------------- 1 file changed, 86 insertions(+), 91 deletions(-) diff --git a/client/src/cmdhffido.c b/client/src/cmdhffido.c index 70ddd9319..4b58e1cba 100644 --- a/client/src/cmdhffido.c +++ b/client/src/cmdhffido.c @@ -18,14 +18,12 @@ // https://fidoalliance.org/specs/fido-u2f-v1.2-ps-20170411/fido-u2f-raw-message-formats-v1.2-ps-20170411.html //----------------------------------------------------------------------------- - #include "cmdhffido.h" #include <unistd.h> #include "cmdparser.h" // command_t #include "commonutil.h" - #include "comms.h" #include "proxmark3.h" #include "emv/emvcore.h" @@ -50,7 +48,7 @@ static int CmdHFFidoInfo(const char *cmd) { infoHF14A(false, false, false); // FIDO info - PrintAndLogEx(NORMAL, "--------------------------------------------"); + PrintAndLogEx(INFO, "-----------" _CYAN_("FIDO Info") "---------------------------------"); SetAPDULogging(false); uint8_t buf[APDU_RES_LEN] = {0}; @@ -70,7 +68,7 @@ static int CmdHFFidoInfo(const char *cmd) { PrintAndLogEx(ERR, "APDU exchange error. Card returns 0x0000."); DropField(); - return 0; + return PM3_SUCCESS; } if (!strncmp((char *)buf, "U2F_V2", 7)) { @@ -92,13 +90,12 @@ static int CmdHFFidoInfo(const char *cmd) { } if (sw != 0x9000) { PrintAndLogEx(ERR, "FIDO2 version doesn't exist (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); - - return 0; + return PM3_SUCCESS; } if (buf[0]) { PrintAndLogEx(ERR, "FIDO2 get version error: %d - %s", buf[0], fido2GetCmdErrorDescription(buf[0])); - return 0; + return PM3_SUCCESS; } if (len > 1) { @@ -107,7 +104,7 @@ static int CmdHFFidoInfo(const char *cmd) { } else { PrintAndLogEx(ERR, "FIDO2 version length error"); } - return 0; + return PM3_SUCCESS; } static json_t *OpenJson(CLIParserContext *ctx, int paramnum, char *fname, void *argtable[], bool *err) { @@ -115,7 +112,7 @@ static json_t *OpenJson(CLIParserContext *ctx, int paramnum, char *fname, void * json_error_t error; *err = false; - uint8_t jsonname[250] = {0}; + uint8_t jsonname[FILE_PATH_SIZE] = {0}; char *cjsonname = (char *)jsonname; int jsonnamelen = 0; @@ -159,7 +156,6 @@ static int CmdHFFidoRegister(const char *cmd) { uint8_t cdata[250] = {0}; int applen = 0; uint8_t adata[250] = {0}; - json_t *root = NULL; CLIParserContext *ctx; CLIParserInit(&ctx, "hf fido reg", @@ -187,12 +183,12 @@ static int CmdHFFidoRegister(const char *cmd) { bool paramsPlain = arg_get_lit(3); bool showDERTLV = arg_get_lit(4); - char fname[250] = {0}; + char fname[FILE_PATH_SIZE] = {0}; bool err; - root = OpenJson(ctx, 5, fname, argtable, &err); + json_t *root = OpenJson(ctx, 5, fname, argtable, &err); if (err) { CLIParserFree(ctx); - return 1; + return PM3_EINVARG; } if (root) { size_t jlen; @@ -205,13 +201,13 @@ static int CmdHFFidoRegister(const char *cmd) { CLIGetStrWithReturn(ctx, 6, cdata, &chlen); if (chlen > 16) { PrintAndLogEx(ERR, "ERROR: challenge parameter length in ASCII mode must be less than 16 chars instead of: %d", chlen); - return 1; + return PM3_EINVARG; } } else { CLIGetHexWithReturn(ctx, 6, cdata, &chlen); if (chlen && chlen != 32) { PrintAndLogEx(ERR, "ERROR: challenge parameter length must be 32 bytes only."); - return 1; + return PM3_EINVARG; } } if (chlen) @@ -223,13 +219,13 @@ static int CmdHFFidoRegister(const char *cmd) { CLIGetStrWithReturn(ctx, 7, adata, &applen); if (applen > 16) { PrintAndLogEx(ERR, "ERROR: application parameter length in ASCII mode must be less than 16 chars instead of: %d", applen); - return 1; + return PM3_EINVARG; } } else { CLIGetHexWithReturn(ctx, 7, adata, &applen); if (applen && applen != 32) { PrintAndLogEx(ERR, "ERROR: application parameter length must be 32 bytes only."); - return 1; + return PM3_EINVARG; } } if (applen) @@ -258,7 +254,7 @@ static int CmdHFFidoRegister(const char *cmd) { if (sw != 0x9000) { PrintAndLogEx(ERR, "Can't select FIDO application. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); - return 2; + return PM3_ESOFT; } res = FIDORegister(data, buf, sizeof(buf), &len, &sw); @@ -270,22 +266,24 @@ static int CmdHFFidoRegister(const char *cmd) { if (sw != 0x9000) { PrintAndLogEx(ERR, "ERROR execute register command. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); - return 3; + return PM3_ESOFT; } PrintAndLogEx(NORMAL, ""); if (APDULogging) - PrintAndLogEx(NORMAL, "---------------------------------------------------------------"); + PrintAndLogEx(INFO, "---------------------------------------------------------------"); + PrintAndLogEx(NORMAL, "data len: %zu", len); + if (verbose2) { - PrintAndLogEx(NORMAL, "--------------data----------------------"); + PrintAndLogEx(INFO, "------------ " _CYAN_("data") " ----------------------"); dump_buffer((const unsigned char *)buf, len, NULL, 0); - PrintAndLogEx(NORMAL, "--------------data----------------------"); + PrintAndLogEx(INFO, "-------------" _CYAN_("data") " ----------------------"); } if (buf[0] != 0x05) { PrintAndLogEx(ERR, "ERROR: First byte must be 0x05, but it %2x", buf[0]); - return 5; + return PM3_ESOFT; } PrintAndLogEx(SUCCESS, "User public key: %s", sprint_hex(&buf[1], 65)); @@ -357,12 +355,11 @@ static int CmdHFFidoRegister(const char *cmd) { } PrintAndLogEx(INFO, "\nauth command: "); - printf("hf fido auth %s%s", paramsPlain ? "-p " : "", sprint_hex_inrow(&buf[67], keyHandleLen)); + PrintAndLogEx(INFO, "hf fido auth %s%s", paramsPlain ? "-p " : "", sprint_hex_inrow(&buf[67], keyHandleLen)); if (chlen || applen) - printf(" %s", paramsPlain ? (char *)cdata : sprint_hex_inrow(cdata, 32)); + PrintAndLogEx(INFO, " %s", paramsPlain ? (char *)cdata : sprint_hex_inrow(cdata, 32)); if (applen) - printf(" %s", paramsPlain ? (char *)adata : sprint_hex_inrow(adata, 32)); - printf("\n"); + PrintAndLogEx(INFO, " %s", paramsPlain ? (char *)adata : sprint_hex_inrow(adata, 32)); if (root) { JsonSaveBufAsHex(root, "ChallengeParam", data, 32); @@ -375,16 +372,15 @@ static int CmdHFFidoRegister(const char *cmd) { res = json_dump_file(root, fname, JSON_INDENT(2)); if (res) { PrintAndLogEx(ERR, "ERROR: can't save the file: %s", fname); - return 200; + return PM3_EFILE; } PrintAndLogEx(SUCCESS, "File " _YELLOW_("`%s`") " saved.", fname); // free json object json_decref(root); } - - return 0; -}; + return PM3_SUCCESS; +} static int CmdHFFidoAuthenticate(const char *cmd) { uint8_t data[512] = {0}; @@ -393,7 +389,6 @@ static int CmdHFFidoAuthenticate(const char *cmd) { uint8_t public_key[65] = {0}; int hdatalen = 0; uint8_t keyHandleLen = 0; - json_t *root = NULL; CLIParserContext *ctx; CLIParserInit(&ctx, "hf fido auth", @@ -430,11 +425,12 @@ static int CmdHFFidoAuthenticate(const char *cmd) { char fname[250] = {0}; bool err; - root = OpenJson(ctx, 7, fname, argtable, &err); + json_t *root = OpenJson(ctx, 7, fname, argtable, &err); if (err) { CLIParserFree(ctx); - return 1; + return PM3_EINVARG; } + if (root) { size_t jlen; JsonLoadBufAsHex(root, "$.ChallengeParam", data, 32, &jlen); @@ -450,7 +446,7 @@ static int CmdHFFidoAuthenticate(const char *cmd) { CLIGetHexWithReturn(ctx, 8, hdata, &hdatalen); if (hdatalen && hdatalen != 65) { PrintAndLogEx(ERR, "ERROR: public key length must be 65 bytes only."); - return 1; + return PM3_EINVARG; } if (hdatalen) { memmove(public_key, hdata, hdatalen); @@ -460,7 +456,7 @@ static int CmdHFFidoAuthenticate(const char *cmd) { CLIGetHexWithReturn(ctx, 9, hdata, &hdatalen); if (hdatalen > 255) { PrintAndLogEx(ERR, "ERROR: application parameter length must be less than 255."); - return 1; + return PM3_EINVARG; } if (hdatalen) { keyHandleLen = hdatalen; @@ -473,13 +469,13 @@ static int CmdHFFidoAuthenticate(const char *cmd) { CLIGetStrWithReturn(ctx, 9, hdata, &hdatalen); if (hdatalen > 16) { PrintAndLogEx(ERR, "ERROR: challenge parameter length in ASCII mode must be less than 16 chars instead of: %d", hdatalen); - return 1; + return PM3_EINVARG; } } else { CLIGetHexWithReturn(ctx, 10, hdata, &hdatalen); if (hdatalen && hdatalen != 32) { PrintAndLogEx(ERR, "ERROR: challenge parameter length must be 32 bytes only."); - return 1; + return PM3_EINVARG; } } if (hdatalen) @@ -490,13 +486,15 @@ static int CmdHFFidoAuthenticate(const char *cmd) { CLIGetStrWithReturn(ctx, 11, hdata, &hdatalen); if (hdatalen > 16) { PrintAndLogEx(ERR, "ERROR: application parameter length in ASCII mode must be less than 16 chars instead of: %d", hdatalen); - return 1; + CLIParserFree(ctx); + return PM3_EINVARG; } } else { CLIGetHexWithReturn(ctx, 10, hdata, &hdatalen); if (hdatalen && hdatalen != 32) { PrintAndLogEx(ERR, "ERROR: application parameter length must be 32 bytes only."); - return 1; + CLIParserFree(ctx); + return PM3_EINVARG; } } if (hdatalen) @@ -530,7 +528,7 @@ static int CmdHFFidoAuthenticate(const char *cmd) { if (sw != 0x9000) { PrintAndLogEx(ERR, "Can't select FIDO application. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); - return 2; + return PM3_ESOFT; } res = FIDOAuthentication(data, datalen, controlByte, buf, sizeof(buf), &len, &sw); @@ -542,7 +540,7 @@ static int CmdHFFidoAuthenticate(const char *cmd) { if (sw != 0x9000) { PrintAndLogEx(ERR, "ERROR execute authentication command. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); - return 3; + return PM3_ESOFT; } PrintAndLogEx(NORMAL, "---------------------------------------------------------------"); @@ -598,15 +596,15 @@ static int CmdHFFidoAuthenticate(const char *cmd) { res = json_dump_file(root, fname, JSON_INDENT(2)); if (res) { PrintAndLogEx(ERR, "ERROR: can't save the file: %s", fname); - return 200; + return PM3_EFILE; } PrintAndLogEx(SUCCESS, "File " _YELLOW_("`%s`") " saved.", fname); // free json object json_decref(root); } - return 0; -}; + return PM3_ESOFT; +} static void CheckSlash(char *fileName) { if ((fileName[strlen(fileName) - 1] != '/') && @@ -614,6 +612,7 @@ static void CheckSlash(char *fileName) { strcat(fileName, "/"); } +//iceman, todo: use searchfile.. static int GetExistsFileNameJson(const char *prefixDir, const char *reqestedFileName, char *fileName) { fileName[0] = 0x00; strcpy(fileName, get_my_executable_directory()); @@ -635,16 +634,15 @@ static int GetExistsFileNameJson(const char *prefixDir, const char *reqestedFile strcat(fileName, ".json"); if (access(fileName, F_OK) < 0) { - return 1; // file not found + return PM3_EFILE; // file not found } } - return 0; + return PM3_SUCCESS; } static int CmdHFFido2MakeCredential(const char *cmd) { json_error_t error; - json_t *root = NULL; - char fname[300] = {0}; + char fname[FILE_PATH_SIZE] = {0}; CLIParserContext *ctx; CLIParserInit(&ctx, "hf fido make", @@ -669,7 +667,7 @@ static int CmdHFFido2MakeCredential(const char *cmd) { bool showDERTLV = arg_get_lit(3); bool showCBOR = arg_get_lit(4); - uint8_t jsonname[250] = {0}; + uint8_t jsonname[FILE_PATH_SIZE] = {0}; char *cjsonname = (char *)jsonname; int jsonnamelen = 0; CLIGetStrWithReturn(ctx, 5, jsonname, &jsonnamelen); @@ -684,15 +682,15 @@ static int CmdHFFido2MakeCredential(const char *cmd) { SetAPDULogging(APDULogging); int res = GetExistsFileNameJson("fido", cjsonname, fname); - if (res) { + if (res != PM3_SUCCESS) { PrintAndLogEx(ERR, "ERROR: Can't found the json file."); return res; } PrintAndLogEx(NORMAL, "fname: %s\n", fname); - root = json_load_file(fname, 0, &error); + json_t *root = json_load_file(fname, 0, &error); if (!root) { PrintAndLogEx(ERR, "ERROR: json error on line %d: %s", error.line, error.text); - return 1; + return PM3_EFILE; } uint8_t data[2048] = {0}; @@ -703,7 +701,6 @@ static int CmdHFFido2MakeCredential(const char *cmd) { DropField(); res = FIDOSelect(true, true, buf, sizeof(buf), &len, &sw); - if (res) { PrintAndLogEx(ERR, "Can't select authenticator. res=%x. Exit...", res); DropField(); @@ -713,7 +710,7 @@ static int CmdHFFido2MakeCredential(const char *cmd) { if (sw != 0x9000) { PrintAndLogEx(ERR, "Can't select FIDO application. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); - return 2; + return PM3_ESOFT; } res = FIDO2CreateMakeCredentionalReq(root, data, sizeof(data), &datalen); @@ -722,9 +719,9 @@ static int CmdHFFido2MakeCredential(const char *cmd) { if (showCBOR) { PrintAndLogEx(INFO, "CBOR make credential request:"); - PrintAndLogEx(NORMAL, "---------------- CBOR ------------------"); + PrintAndLogEx(INFO, "---------------- " _CYAN_("CBOR") " ------------------"); TinyCborPrintFIDOPackage(fido2CmdMakeCredential, false, data, datalen); - PrintAndLogEx(NORMAL, "---------------- CBOR ------------------"); + PrintAndLogEx(INFO, "---------------- " _CYAN_("CBOR") " ------------------"); } res = FIDO2MakeCredential(data, datalen, buf, sizeof(buf), &len, &sw); @@ -736,20 +733,20 @@ static int CmdHFFido2MakeCredential(const char *cmd) { if (sw != 0x9000) { PrintAndLogEx(ERR, "ERROR execute make credential command. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); - return 3; + return PM3_EFILE; } if (buf[0]) { PrintAndLogEx(ERR, "FIDO2 make credential error: %d - %s", buf[0], fido2GetCmdErrorDescription(buf[0])); - return 0; + return PM3_SUCCESS; } PrintAndLogEx(SUCCESS, "MakeCredential result (%zu b) OK.", len); if (showCBOR) { PrintAndLogEx(SUCCESS, "CBOR make credential response:"); - PrintAndLogEx(NORMAL, "---------------- CBOR ------------------"); + PrintAndLogEx(INFO, "---------------- " _CYAN_("CBOR") " ------------------"); TinyCborPrintFIDOPackage(fido2CmdMakeCredential, true, &buf[1], len - 1); - PrintAndLogEx(NORMAL, "---------------- CBOR ------------------"); + PrintAndLogEx(INFO, "---------------- " _CYAN_("CBOR") " ------------------"); } // parse returned cbor @@ -759,19 +756,18 @@ static int CmdHFFido2MakeCredential(const char *cmd) { res = json_dump_file(root, fname, JSON_INDENT(2)); if (res) { PrintAndLogEx(ERR, "ERROR: can't save the file: %s", fname); - return 200; + return PM3_EFILE; } PrintAndLogEx(SUCCESS, "File " _YELLOW_("`%s`") " saved.", fname); } json_decref(root); - return 0; -}; + return PM3_SUCCESS; +} static int CmdHFFido2GetAssertion(const char *cmd) { json_error_t error; - json_t *root = NULL; - char fname[300] = {0}; + char fname[FILE_PATH_SIZE] = {0}; CLIParserContext *ctx; CLIParserInit(&ctx, "hf fido assert", @@ -796,7 +792,7 @@ static int CmdHFFido2GetAssertion(const char *cmd) { bool showCBOR = arg_get_lit(3); bool createAllowList = arg_get_lit(4); - uint8_t jsonname[250] = {0}; + uint8_t jsonname[FILE_PATH_SIZE] = {0}; char *cjsonname = (char *)jsonname; int jsonnamelen = 0; CLIGetStrWithReturn(ctx, 5, jsonname, &jsonnamelen); @@ -811,15 +807,15 @@ static int CmdHFFido2GetAssertion(const char *cmd) { SetAPDULogging(APDULogging); int res = GetExistsFileNameJson("fido", cjsonname, fname); - if (res) { + if (res != PM3_SUCCESS) { PrintAndLogEx(ERR, "ERROR: Can't found the json file."); return res; } PrintAndLogEx(NORMAL, "fname: %s\n", fname); - root = json_load_file(fname, 0, &error); + json_t *root = json_load_file(fname, 0, &error); if (!root) { PrintAndLogEx(ERR, "ERROR: json error on line %d: %s", error.line, error.text); - return 1; + return PM3_EFILE; } uint8_t data[2048] = {0}; @@ -830,9 +826,8 @@ static int CmdHFFido2GetAssertion(const char *cmd) { DropField(); res = FIDOSelect(true, true, buf, sizeof(buf), &len, &sw); - if (res) { - PrintAndLogEx(ERR, "Can't select authenticator. res=%x. Exit...", res); + PrintAndLogEx(ERR, "Can't select authenticator. res=%x. exiting...", res); DropField(); return res; } @@ -840,7 +835,7 @@ static int CmdHFFido2GetAssertion(const char *cmd) { if (sw != 0x9000) { PrintAndLogEx(ERR, "Can't select FIDO application. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); - return 2; + return PM3_ESOFT; } res = FIDO2CreateGetAssertionReq(root, data, sizeof(data), &datalen, createAllowList); @@ -849,9 +844,9 @@ static int CmdHFFido2GetAssertion(const char *cmd) { if (showCBOR) { PrintAndLogEx(SUCCESS, "CBOR get assertion request:"); - PrintAndLogEx(NORMAL, "---------------- CBOR ------------------"); + PrintAndLogEx(NORMAL, "---------------- " _CYAN_("CBOR") " ------------------"); TinyCborPrintFIDOPackage(fido2CmdGetAssertion, false, data, datalen); - PrintAndLogEx(NORMAL, "---------------- CBOR ------------------"); + PrintAndLogEx(NORMAL, "---------------- " _CYAN_("CBOR") " ------------------"); } res = FIDO2GetAssertion(data, datalen, buf, sizeof(buf), &len, &sw); @@ -863,20 +858,20 @@ static int CmdHFFido2GetAssertion(const char *cmd) { if (sw != 0x9000) { PrintAndLogEx(ERR, "ERROR execute get assertion command. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); - return 3; + return PM3_ESOFT; } if (buf[0]) { PrintAndLogEx(ERR, "FIDO2 get assertion error: %d - %s", buf[0], fido2GetCmdErrorDescription(buf[0])); - return 0; + return PM3_ESOFT; } PrintAndLogEx(SUCCESS, "GetAssertion result (%zu b) OK.", len); if (showCBOR) { PrintAndLogEx(SUCCESS, "CBOR get assertion response:"); - PrintAndLogEx(NORMAL, "---------------- CBOR ------------------"); + PrintAndLogEx(NORMAL, "---------------- " _CYAN_("CBOR") " ------------------"); TinyCborPrintFIDOPackage(fido2CmdGetAssertion, true, &buf[1], len - 1); - PrintAndLogEx(NORMAL, "---------------- CBOR ------------------"); + PrintAndLogEx(NORMAL, "---------------- " _CYAN_("CBOR") " ------------------"); } // parse returned cbor @@ -886,32 +881,32 @@ static int CmdHFFido2GetAssertion(const char *cmd) { res = json_dump_file(root, fname, JSON_INDENT(2)); if (res) { PrintAndLogEx(ERR, "ERROR: can't save the file: %s", fname); - return 200; + return PM3_EFILE; } PrintAndLogEx(SUCCESS, "File " _YELLOW_("`%s`") " saved.", fname); } json_decref(root); - return 0; -}; + return PM3_SUCCESS; +} static command_t CommandTable[] = { - {"help", CmdHelp, AlwaysAvailable, "This help."}, - {"info", CmdHFFidoInfo, IfPm3Iso14443a, "Info about FIDO tag."}, - {"reg", CmdHFFidoRegister, IfPm3Iso14443a, "FIDO U2F Registration Message."}, - {"auth", CmdHFFidoAuthenticate, IfPm3Iso14443a, "FIDO U2F Authentication Message."}, - {"make", CmdHFFido2MakeCredential, IfPm3Iso14443a, "FIDO2 MakeCredential command."}, - {"assert", CmdHFFido2GetAssertion, IfPm3Iso14443a, "FIDO2 GetAssertion command."}, - {NULL, NULL, 0, NULL} + {"help", CmdHelp, AlwaysAvailable, "This help."}, + {"info", CmdHFFidoInfo, IfPm3Iso14443a, "Info about FIDO tag."}, + {"reg", CmdHFFidoRegister, IfPm3Iso14443a, "FIDO U2F Registration Message."}, + {"auth", CmdHFFidoAuthenticate, IfPm3Iso14443a, "FIDO U2F Authentication Message."}, + {"make", CmdHFFido2MakeCredential, IfPm3Iso14443a, "FIDO2 MakeCredential command."}, + {"assert", CmdHFFido2GetAssertion, IfPm3Iso14443a, "FIDO2 GetAssertion command."}, + {NULL, NULL, 0, NULL} }; int CmdHFFido(const char *Cmd) { - (void)WaitForResponseTimeout(CMD_ACK, NULL, 100); + clearCommandBuffer(); return CmdsParse(CommandTable, Cmd); } int CmdHelp(const char *Cmd) { (void)Cmd; // Cmd is not used so far CmdsHelp(CommandTable); - return 0; + return PM3_SUCCESS; } From d5731b3aec5262f949011e8d7b55555fc1a31154 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 3 Jun 2020 14:52:48 +0200 Subject: [PATCH 500/632] chg, strange wait --- client/src/cmdhfmfp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index 5f10406b1..f39ba5c2e 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -1506,7 +1506,7 @@ static int CmdHelp(const char *Cmd) { } int CmdHFMFP(const char *Cmd) { - (void)WaitForResponseTimeout(CMD_ACK, NULL, 100); + clearCommandBuffer(); return CmdsParse(CommandTable, Cmd); } From dcdd9ce364e3f044759043292b22b249283e2fae Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 3 Jun 2020 15:02:35 +0200 Subject: [PATCH 501/632] nothing special --- client/deps/jansson/load.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/client/deps/jansson/load.c b/client/deps/jansson/load.c index 7f3fa7458..52b9bed89 100644 --- a/client/deps/jansson/load.c +++ b/client/deps/jansson/load.c @@ -1040,8 +1040,6 @@ json_t *json_loadfd(int input, size_t flags, json_error_t *error) { json_t *json_load_file(const char *path, size_t flags, json_error_t *error) { json_t *result; - FILE *fp; - jsonp_error_init(error, path); if (path == NULL) { @@ -1049,15 +1047,13 @@ json_t *json_load_file(const char *path, size_t flags, json_error_t *error) { return NULL; } - fp = fopen(path, "rb"); + FILE *fp = fopen(path, "rb"); if (!fp) { - error_set(error, NULL, json_error_cannot_open_file, "unable to open %s: %s", - path, strerror(errno)); + error_set(error, NULL, json_error_cannot_open_file, "unable to open %s: %s", path, strerror(errno)); return NULL; } result = json_loadf(fp, flags, error); - fclose(fp); return result; } From 173f2d472d366b91eef2b97af7f80c35a524b3e1 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 3 Jun 2020 15:27:07 +0200 Subject: [PATCH 502/632] chg; remove unused fcts --- client/src/util.c | 48 ----------------------------------------------- client/src/util.h | 5 ----- 2 files changed, 53 deletions(-) diff --git a/client/src/util.c b/client/src/util.c index 12e62074c..5e1e55d67 100644 --- a/client/src/util.c +++ b/client/src/util.c @@ -80,54 +80,6 @@ int kbd_enter_pressed(void) { } #endif -// log files functions - -// open, appped and close logfile -void AddLogLine(const char *fn, const char *data, const char *c) { - FILE *f = NULL; - char filename[FILE_PATH_SIZE] = {0x00}; - int len = 0; - - len = strlen(fn); - if (len > FILE_PATH_SIZE) - len = FILE_PATH_SIZE; - memcpy(filename, fn, len); - - f = fopen(filename, "a"); - if (!f) { - PrintAndLogEx(ERR, "Could not append log file" _YELLOW_("%s"), filename); - return; - } - - fprintf(f, "%s", data); - fprintf(f, "%s\n", c); - fflush(f); - fclose(f); -} - -void AddLogHex(const char *fn, const char *extData, const uint8_t *data, const size_t len) { - AddLogLine(fn, extData, sprint_hex(data, len)); -} - -void AddLogUint64(const char *fn, const char *data, const uint64_t value) { - char buf[20] = {0}; - sprintf(buf, "%016" PRIx64 "", value); - AddLogLine(fn, data, buf); -} - -void AddLogCurrentDT(const char *fn) { - char buf[20] = {0}; - struct tm *ct, tm_buf; - time_t now = time(NULL); -#if defined(_WIN32) - ct = gmtime_s(&tm_buf, &now) == 0 ? &tm_buf : NULL; -#else - ct = gmtime_r(&now, &tm_buf); -#endif - strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ct); - AddLogLine(fn, "\nanticollision: ", buf); -} - // create filename on hex uid. // param *fn - pointer to filename char array // param *uid - pointer to uid byte array diff --git a/client/src/util.h b/client/src/util.h index 3f67c33f4..c15183734 100644 --- a/client/src/util.h +++ b/client/src/util.h @@ -28,12 +28,7 @@ extern uint8_t g_printAndLog; #define PRINTANDLOG_LOG 2 int kbd_enter_pressed(void); -void AddLogLine(const char *fn, const char *data, const char *c); -void AddLogHex(const char *fn, const char *extData, const uint8_t *data, const size_t len); -void AddLogUint64(const char *fn, const char *data, const uint64_t value); -void AddLogCurrentDT(const char *fn); void FillFileNameByUID(char *filenamePrefix, const uint8_t *uid, const char *ext, const int uidlen); - // fill buffer from structure [{uint8_t data, size_t length},...] int FillBuffer(uint8_t *data, size_t maxDataLength, size_t *dataLength, ...); From 519d2e4917347251db52346b90bed5a78725a766 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 3 Jun 2020 15:27:22 +0200 Subject: [PATCH 503/632] fiddle --- client/src/proxmark3.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index 296149357..eb34393ae 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -143,12 +143,15 @@ int push_cmdscriptfile(char *path, bool stayafter) { PrintAndLogEx(ERR, "Too many nested scripts, skipping %s\n", path); return PM3_EMALLOC; } - FILE *tmp = fopen(path, "r"); - if (tmp == NULL) + + FILE *f = fopen(path, "r"); + if (f == NULL) return PM3_EFILE; + if (cmdscriptfile_idx == 0) cmdscriptfile_stayafter = stayafter; - cmdscriptfile[++cmdscriptfile_idx] = tmp; + + cmdscriptfile[++cmdscriptfile_idx] = f; return PM3_SUCCESS; } From 64322896f21f271e8b3986599811c0c60928cee1 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 3 Jun 2020 15:31:41 +0200 Subject: [PATCH 504/632] chg, textual --- client/src/ui.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/client/src/ui.c b/client/src/ui.c index 86d996ae0..0f4e28a62 100644 --- a/client/src/ui.c +++ b/client/src/ui.c @@ -316,20 +316,20 @@ static void fPrintAndLog(FILE *stream, const char *fmt, ...) { timenow = gmtime(&now); strftime(filename, sizeof(filename), PROXLOG, timenow); if (searchHomeFilePath(&my_logfile_path, LOGS_SUBDIR, filename, true) != PM3_SUCCESS) { - fprintf(stderr, "[-] Logging disabled!\n\n"); + printf(_YELLOW_("[-]") " Logging disabled!\n"); my_logfile_path = NULL; logging = 0; } else { logfile = fopen(my_logfile_path, "a"); if (logfile == NULL) { - fprintf(stderr, "[-] Can't open logfile %s, logging disabled!\n", my_logfile_path); + printf(_YELLOW_("[-]") " Can't open logfile %s, logging disabled!\n", my_logfile_path); logging = 0; } else { if (session.supports_colors) { - printf(_YELLOW_("[=] ") "Session log " _YELLOW_("%s") "\n", my_logfile_path); + printf(_YELLOW_("[=]") " Session log " _YELLOW_("%s") "\n", my_logfile_path); } else { - printf("[=] Session log %s\n", my_logfile_path); + printf(_YELLOW_("[=]") " Session log %s\n", my_logfile_path); } } @@ -363,7 +363,6 @@ static void fPrintAndLog(FILE *stream, const char *fmt, ...) { if (g_printAndLog & PRINTANDLOG_PRINT) { memcpy_filter_emoji(buffer3, buffer2, sizeof(buffer2), session.emoji_mode); fprintf(stream, "%s", buffer3); -// fprintf(stream, " "); // cleaning prompt fprintf(stream, "\n"); } From 96ae026f3545b87596294500e7545f87509f7d4e Mon Sep 17 00:00:00 2001 From: slurdge <slurdge@slurdge.org> Date: Wed, 3 Jun 2020 16:07:23 +0200 Subject: [PATCH 505/632] import lz4 --- common/get_lz4.sh | 5 + common/lz4/LICENSE | 11 + common/lz4/lz4.c | 2398 ++++++++++++++++++++++++++++++++++++++++++++ common/lz4/lz4.h | 764 ++++++++++++++ common/lz4/lz4hc.c | 1538 ++++++++++++++++++++++++++++ common/lz4/lz4hc.h | 438 ++++++++ common_fpga/fpga.h | 2 +- 7 files changed, 5155 insertions(+), 1 deletion(-) create mode 100755 common/get_lz4.sh create mode 100644 common/lz4/LICENSE create mode 100644 common/lz4/lz4.c create mode 100644 common/lz4/lz4.h create mode 100644 common/lz4/lz4hc.c create mode 100644 common/lz4/lz4hc.h diff --git a/common/get_lz4.sh b/common/get_lz4.sh new file mode 100755 index 000000000..ef4de2c7b --- /dev/null +++ b/common/get_lz4.sh @@ -0,0 +1,5 @@ +version=1.9.2 +mkdir -p lz4 +wget https://github.com/lz4/lz4/archive/v$version.zip +unzip -o -j v$version "lz4-$version/LICENSE" "lz4-$version/lib/lz4.h" "lz4-$version/lib/lz4.c" "lz4-$version/lib/lz4hc.h" "lz4-$version/lib/lz4hc.c" -d lz4 +rm v$version.zip \ No newline at end of file diff --git a/common/lz4/LICENSE b/common/lz4/LICENSE new file mode 100644 index 000000000..c221aebd2 --- /dev/null +++ b/common/lz4/LICENSE @@ -0,0 +1,11 @@ +This repository uses 2 different licenses : +- all files in the `lib` directory use a BSD 2-Clause license +- all other files use a GPLv2 license, unless explicitly stated otherwise + +Relevant license is reminded at the top of each source file, +and with presence of COPYING or LICENSE file in associated directories. + +This model is selected to emphasize that +files in the `lib` directory are designed to be included into 3rd party applications, +while all other files, in `programs`, `tests` or `examples`, +receive more limited attention and support for such scenario. diff --git a/common/lz4/lz4.c b/common/lz4/lz4.c new file mode 100644 index 000000000..9808d70ae --- /dev/null +++ b/common/lz4/lz4.c @@ -0,0 +1,2398 @@ +/* + LZ4 - Fast LZ compression algorithm + Copyright (C) 2011-present, Yann Collet. + + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * 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 COPYRIGHT HOLDERS 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 COPYRIGHT + OWNER 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. + + You can contact the author at : + - LZ4 homepage : http://www.lz4.org + - LZ4 source repository : https://github.com/lz4/lz4 +*/ + +/*-************************************ +* Tuning parameters +**************************************/ +/* + * LZ4_HEAPMODE : + * Select how default compression functions will allocate memory for their hash table, + * in memory stack (0:default, fastest), or in memory heap (1:requires malloc()). + */ +#ifndef LZ4_HEAPMODE +# define LZ4_HEAPMODE 0 +#endif + +/* + * ACCELERATION_DEFAULT : + * Select "acceleration" for LZ4_compress_fast() when parameter value <= 0 + */ +#define ACCELERATION_DEFAULT 1 + + +/*-************************************ +* CPU Feature Detection +**************************************/ +/* LZ4_FORCE_MEMORY_ACCESS + * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. + * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. + * The below switch allow to select different access method for improved performance. + * Method 0 (default) : use `memcpy()`. Safe and portable. + * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). + * This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. + * Method 2 : direct access. This method is portable but violate C standard. + * It can generate buggy code on targets which assembly generation depends on alignment. + * But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) + * See https://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details. + * Prefer these methods in priority order (0 > 1 > 2) + */ +#ifndef LZ4_FORCE_MEMORY_ACCESS /* can be defined externally */ +# if defined(__GNUC__) && \ + ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) \ + || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) ) +# define LZ4_FORCE_MEMORY_ACCESS 2 +# elif (defined(__INTEL_COMPILER) && !defined(_WIN32)) || defined(__GNUC__) +# define LZ4_FORCE_MEMORY_ACCESS 1 +# endif +#endif + +/* + * LZ4_FORCE_SW_BITCOUNT + * Define this parameter if your target system or compiler does not support hardware bit count + */ +#if defined(_MSC_VER) && defined(_WIN32_WCE) /* Visual Studio for WinCE doesn't support Hardware bit count */ +# define LZ4_FORCE_SW_BITCOUNT +#endif + + + +/*-************************************ +* Dependency +**************************************/ +/* + * LZ4_SRC_INCLUDED: + * Amalgamation flag, whether lz4.c is included + */ +#ifndef LZ4_SRC_INCLUDED +# define LZ4_SRC_INCLUDED 1 +#endif + +#ifndef LZ4_STATIC_LINKING_ONLY +#define LZ4_STATIC_LINKING_ONLY +#endif + +#ifndef LZ4_DISABLE_DEPRECATE_WARNINGS +#define LZ4_DISABLE_DEPRECATE_WARNINGS /* due to LZ4_decompress_safe_withPrefix64k */ +#endif + +#define LZ4_STATIC_LINKING_ONLY /* LZ4_DISTANCE_MAX */ +#include "lz4.h" +/* see also "memory routines" below */ + + +/*-************************************ +* Compiler Options +**************************************/ +#ifdef _MSC_VER /* Visual Studio */ +# include <intrin.h> +# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ +# pragma warning(disable : 4293) /* disable: C4293: too large shift (32-bits) */ +#endif /* _MSC_VER */ + +#ifndef LZ4_FORCE_INLINE +# ifdef _MSC_VER /* Visual Studio */ +# define LZ4_FORCE_INLINE static __forceinline +# else +# if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */ +# ifdef __GNUC__ +# define LZ4_FORCE_INLINE static inline __attribute__((always_inline)) +# else +# define LZ4_FORCE_INLINE static inline +# endif +# else +# define LZ4_FORCE_INLINE static +# endif /* __STDC_VERSION__ */ +# endif /* _MSC_VER */ +#endif /* LZ4_FORCE_INLINE */ + +/* LZ4_FORCE_O2_GCC_PPC64LE and LZ4_FORCE_O2_INLINE_GCC_PPC64LE + * gcc on ppc64le generates an unrolled SIMDized loop for LZ4_wildCopy8, + * together with a simple 8-byte copy loop as a fall-back path. + * However, this optimization hurts the decompression speed by >30%, + * because the execution does not go to the optimized loop + * for typical compressible data, and all of the preamble checks + * before going to the fall-back path become useless overhead. + * This optimization happens only with the -O3 flag, and -O2 generates + * a simple 8-byte copy loop. + * With gcc on ppc64le, all of the LZ4_decompress_* and LZ4_wildCopy8 + * functions are annotated with __attribute__((optimize("O2"))), + * and also LZ4_wildCopy8 is forcibly inlined, so that the O2 attribute + * of LZ4_wildCopy8 does not affect the compression speed. + */ +#if defined(__PPC64__) && defined(__LITTLE_ENDIAN__) && defined(__GNUC__) && !defined(__clang__) +# define LZ4_FORCE_O2_GCC_PPC64LE __attribute__((optimize("O2"))) +# define LZ4_FORCE_O2_INLINE_GCC_PPC64LE __attribute__((optimize("O2"))) LZ4_FORCE_INLINE +#else +# define LZ4_FORCE_O2_GCC_PPC64LE +# define LZ4_FORCE_O2_INLINE_GCC_PPC64LE static +#endif + +#if (defined(__GNUC__) && (__GNUC__ >= 3)) || (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 800)) || defined(__clang__) +# define expect(expr,value) (__builtin_expect ((expr),(value)) ) +#else +# define expect(expr,value) (expr) +#endif + +#ifndef likely +#define likely(expr) expect((expr) != 0, 1) +#endif +#ifndef unlikely +#define unlikely(expr) expect((expr) != 0, 0) +#endif + + +/*-************************************ +* Memory routines +**************************************/ +#include <stdlib.h> /* malloc, calloc, free */ +#define ALLOC(s) malloc(s) +#define ALLOC_AND_ZERO(s) calloc(1,s) +#define FREEMEM(p) free(p) +#include <string.h> /* memset, memcpy */ +#define MEM_INIT(p,v,s) memset((p),(v),(s)) + + +/*-************************************ +* Common Constants +**************************************/ +#define MINMATCH 4 + +#define WILDCOPYLENGTH 8 +#define LASTLITERALS 5 /* see ../doc/lz4_Block_format.md#parsing-restrictions */ +#define MFLIMIT 12 /* see ../doc/lz4_Block_format.md#parsing-restrictions */ +#define MATCH_SAFEGUARD_DISTANCE ((2*WILDCOPYLENGTH) - MINMATCH) /* ensure it's possible to write 2 x wildcopyLength without overflowing output buffer */ +#define FASTLOOP_SAFE_DISTANCE 64 +static const int LZ4_minLength = (MFLIMIT+1); + +#define KB *(1 <<10) +#define MB *(1 <<20) +#define GB *(1U<<30) + +#define LZ4_DISTANCE_ABSOLUTE_MAX 65535 +#if (LZ4_DISTANCE_MAX > LZ4_DISTANCE_ABSOLUTE_MAX) /* max supported by LZ4 format */ +# error "LZ4_DISTANCE_MAX is too big : must be <= 65535" +#endif + +#define ML_BITS 4 +#define ML_MASK ((1U<<ML_BITS)-1) +#define RUN_BITS (8-ML_BITS) +#define RUN_MASK ((1U<<RUN_BITS)-1) + + +/*-************************************ +* Error detection +**************************************/ +#if defined(LZ4_DEBUG) && (LZ4_DEBUG>=1) +# include <assert.h> +#else +# ifndef assert +# define assert(condition) ((void)0) +# endif +#endif + +#define LZ4_STATIC_ASSERT(c) { enum { LZ4_static_assert = 1/(int)(!!(c)) }; } /* use after variable declarations */ + +#if defined(LZ4_DEBUG) && (LZ4_DEBUG>=2) +# include <stdio.h> +static int g_debuglog_enable = 1; +# define DEBUGLOG(l, ...) { \ + if ((g_debuglog_enable) && (l<=LZ4_DEBUG)) { \ + fprintf(stderr, __FILE__ ": "); \ + fprintf(stderr, __VA_ARGS__); \ + fprintf(stderr, " \n"); \ + } } +#else +# define DEBUGLOG(l, ...) {} /* disabled */ +#endif + + +/*-************************************ +* Types +**************************************/ +#if defined(__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +# include <stdint.h> + typedef uint8_t BYTE; + typedef uint16_t U16; + typedef uint32_t U32; + typedef int32_t S32; + typedef uint64_t U64; + typedef uintptr_t uptrval; +#else + typedef unsigned char BYTE; + typedef unsigned short U16; + typedef unsigned int U32; + typedef signed int S32; + typedef unsigned long long U64; + typedef size_t uptrval; /* generally true, except OpenVMS-64 */ +#endif + +#if defined(__x86_64__) + typedef U64 reg_t; /* 64-bits in x32 mode */ +#else + typedef size_t reg_t; /* 32-bits in x32 mode */ +#endif + +typedef enum { + notLimited = 0, + limitedOutput = 1, + fillOutput = 2 +} limitedOutput_directive; + + +/*-************************************ +* Reading and writing into memory +**************************************/ +static unsigned LZ4_isLittleEndian(void) +{ + const union { U32 u; BYTE c[4]; } one = { 1 }; /* don't use static : performance detrimental */ + return one.c[0]; +} + + +#if defined(LZ4_FORCE_MEMORY_ACCESS) && (LZ4_FORCE_MEMORY_ACCESS==2) +/* lie to the compiler about data alignment; use with caution */ + +static U16 LZ4_read16(const void* memPtr) { return *(const U16*) memPtr; } +static U32 LZ4_read32(const void* memPtr) { return *(const U32*) memPtr; } +static reg_t LZ4_read_ARCH(const void* memPtr) { return *(const reg_t*) memPtr; } + +static void LZ4_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; } +static void LZ4_write32(void* memPtr, U32 value) { *(U32*)memPtr = value; } + +#elif defined(LZ4_FORCE_MEMORY_ACCESS) && (LZ4_FORCE_MEMORY_ACCESS==1) + +/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ +/* currently only defined for gcc and icc */ +typedef union { U16 u16; U32 u32; reg_t uArch; } __attribute__((packed)) unalign; + +static U16 LZ4_read16(const void* ptr) { return ((const unalign*)ptr)->u16; } +static U32 LZ4_read32(const void* ptr) { return ((const unalign*)ptr)->u32; } +static reg_t LZ4_read_ARCH(const void* ptr) { return ((const unalign*)ptr)->uArch; } + +static void LZ4_write16(void* memPtr, U16 value) { ((unalign*)memPtr)->u16 = value; } +static void LZ4_write32(void* memPtr, U32 value) { ((unalign*)memPtr)->u32 = value; } + +#else /* safe and portable access using memcpy() */ + +static U16 LZ4_read16(const void* memPtr) +{ + U16 val; memcpy(&val, memPtr, sizeof(val)); return val; +} + +static U32 LZ4_read32(const void* memPtr) +{ + U32 val; memcpy(&val, memPtr, sizeof(val)); return val; +} + +static reg_t LZ4_read_ARCH(const void* memPtr) +{ + reg_t val; memcpy(&val, memPtr, sizeof(val)); return val; +} + +static void LZ4_write16(void* memPtr, U16 value) +{ + memcpy(memPtr, &value, sizeof(value)); +} + +static void LZ4_write32(void* memPtr, U32 value) +{ + memcpy(memPtr, &value, sizeof(value)); +} + +#endif /* LZ4_FORCE_MEMORY_ACCESS */ + + +static U16 LZ4_readLE16(const void* memPtr) +{ + if (LZ4_isLittleEndian()) { + return LZ4_read16(memPtr); + } else { + const BYTE* p = (const BYTE*)memPtr; + return (U16)((U16)p[0] + (p[1]<<8)); + } +} + +static void LZ4_writeLE16(void* memPtr, U16 value) +{ + if (LZ4_isLittleEndian()) { + LZ4_write16(memPtr, value); + } else { + BYTE* p = (BYTE*)memPtr; + p[0] = (BYTE) value; + p[1] = (BYTE)(value>>8); + } +} + +/* customized variant of memcpy, which can overwrite up to 8 bytes beyond dstEnd */ +LZ4_FORCE_O2_INLINE_GCC_PPC64LE +void LZ4_wildCopy8(void* dstPtr, const void* srcPtr, void* dstEnd) +{ + BYTE* d = (BYTE*)dstPtr; + const BYTE* s = (const BYTE*)srcPtr; + BYTE* const e = (BYTE*)dstEnd; + + do { memcpy(d,s,8); d+=8; s+=8; } while (d<e); +} + +static const unsigned inc32table[8] = {0, 1, 2, 1, 0, 4, 4, 4}; +static const int dec64table[8] = {0, 0, 0, -1, -4, 1, 2, 3}; + + +#ifndef LZ4_FAST_DEC_LOOP +# if defined(__i386__) || defined(__x86_64__) +# define LZ4_FAST_DEC_LOOP 1 +# elif defined(__aarch64__) && !defined(__clang__) + /* On aarch64, we disable this optimization for clang because on certain + * mobile chipsets and clang, it reduces performance. For more information + * refer to https://github.com/lz4/lz4/pull/707. */ +# define LZ4_FAST_DEC_LOOP 1 +# else +# define LZ4_FAST_DEC_LOOP 0 +# endif +#endif + +#if LZ4_FAST_DEC_LOOP + +LZ4_FORCE_O2_INLINE_GCC_PPC64LE void +LZ4_memcpy_using_offset_base(BYTE* dstPtr, const BYTE* srcPtr, BYTE* dstEnd, const size_t offset) +{ + if (offset < 8) { + dstPtr[0] = srcPtr[0]; + dstPtr[1] = srcPtr[1]; + dstPtr[2] = srcPtr[2]; + dstPtr[3] = srcPtr[3]; + srcPtr += inc32table[offset]; + memcpy(dstPtr+4, srcPtr, 4); + srcPtr -= dec64table[offset]; + dstPtr += 8; + } else { + memcpy(dstPtr, srcPtr, 8); + dstPtr += 8; + srcPtr += 8; + } + + LZ4_wildCopy8(dstPtr, srcPtr, dstEnd); +} + +/* customized variant of memcpy, which can overwrite up to 32 bytes beyond dstEnd + * this version copies two times 16 bytes (instead of one time 32 bytes) + * because it must be compatible with offsets >= 16. */ +LZ4_FORCE_O2_INLINE_GCC_PPC64LE void +LZ4_wildCopy32(void* dstPtr, const void* srcPtr, void* dstEnd) +{ + BYTE* d = (BYTE*)dstPtr; + const BYTE* s = (const BYTE*)srcPtr; + BYTE* const e = (BYTE*)dstEnd; + + do { memcpy(d,s,16); memcpy(d+16,s+16,16); d+=32; s+=32; } while (d<e); +} + +/* LZ4_memcpy_using_offset() presumes : + * - dstEnd >= dstPtr + MINMATCH + * - there is at least 8 bytes available to write after dstEnd */ +LZ4_FORCE_O2_INLINE_GCC_PPC64LE void +LZ4_memcpy_using_offset(BYTE* dstPtr, const BYTE* srcPtr, BYTE* dstEnd, const size_t offset) +{ + BYTE v[8]; + + assert(dstEnd >= dstPtr + MINMATCH); + LZ4_write32(dstPtr, 0); /* silence an msan warning when offset==0 */ + + switch(offset) { + case 1: + memset(v, *srcPtr, 8); + break; + case 2: + memcpy(v, srcPtr, 2); + memcpy(&v[2], srcPtr, 2); + memcpy(&v[4], &v[0], 4); + break; + case 4: + memcpy(v, srcPtr, 4); + memcpy(&v[4], srcPtr, 4); + break; + default: + LZ4_memcpy_using_offset_base(dstPtr, srcPtr, dstEnd, offset); + return; + } + + memcpy(dstPtr, v, 8); + dstPtr += 8; + while (dstPtr < dstEnd) { + memcpy(dstPtr, v, 8); + dstPtr += 8; + } +} +#endif + + +/*-************************************ +* Common functions +**************************************/ +static unsigned LZ4_NbCommonBytes (reg_t val) +{ + if (LZ4_isLittleEndian()) { + if (sizeof(val)==8) { +# if defined(_MSC_VER) && defined(_WIN64) && !defined(LZ4_FORCE_SW_BITCOUNT) + unsigned long r = 0; + _BitScanForward64( &r, (U64)val ); + return (int)(r>>3); +# elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT) + return (unsigned)__builtin_ctzll((U64)val) >> 3; +# else + static const int DeBruijnBytePos[64] = { 0, 0, 0, 0, 0, 1, 1, 2, + 0, 3, 1, 3, 1, 4, 2, 7, + 0, 2, 3, 6, 1, 5, 3, 5, + 1, 3, 4, 4, 2, 5, 6, 7, + 7, 0, 1, 2, 3, 3, 4, 6, + 2, 6, 5, 5, 3, 4, 5, 6, + 7, 1, 2, 4, 6, 4, 4, 5, + 7, 2, 6, 5, 7, 6, 7, 7 }; + return DeBruijnBytePos[((U64)((val & -(long long)val) * 0x0218A392CDABBD3FULL)) >> 58]; +# endif + } else /* 32 bits */ { +# if defined(_MSC_VER) && !defined(LZ4_FORCE_SW_BITCOUNT) + unsigned long r; + _BitScanForward( &r, (U32)val ); + return (int)(r>>3); +# elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT) + return (unsigned)__builtin_ctz((U32)val) >> 3; +# else + static const int DeBruijnBytePos[32] = { 0, 0, 3, 0, 3, 1, 3, 0, + 3, 2, 2, 1, 3, 2, 0, 1, + 3, 3, 1, 2, 2, 2, 2, 0, + 3, 1, 2, 0, 1, 0, 1, 1 }; + return DeBruijnBytePos[((U32)((val & -(S32)val) * 0x077CB531U)) >> 27]; +# endif + } + } else /* Big Endian CPU */ { + if (sizeof(val)==8) { /* 64-bits */ +# if defined(_MSC_VER) && defined(_WIN64) && !defined(LZ4_FORCE_SW_BITCOUNT) + unsigned long r = 0; + _BitScanReverse64( &r, val ); + return (unsigned)(r>>3); +# elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT) + return (unsigned)__builtin_clzll((U64)val) >> 3; +# else + static const U32 by32 = sizeof(val)*4; /* 32 on 64 bits (goal), 16 on 32 bits. + Just to avoid some static analyzer complaining about shift by 32 on 32-bits target. + Note that this code path is never triggered in 32-bits mode. */ + unsigned r; + if (!(val>>by32)) { r=4; } else { r=0; val>>=by32; } + if (!(val>>16)) { r+=2; val>>=8; } else { val>>=24; } + r += (!val); + return r; +# endif + } else /* 32 bits */ { +# if defined(_MSC_VER) && !defined(LZ4_FORCE_SW_BITCOUNT) + unsigned long r = 0; + _BitScanReverse( &r, (unsigned long)val ); + return (unsigned)(r>>3); +# elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT) + return (unsigned)__builtin_clz((U32)val) >> 3; +# else + unsigned r; + if (!(val>>16)) { r=2; val>>=8; } else { r=0; val>>=24; } + r += (!val); + return r; +# endif + } + } +} + +#define STEPSIZE sizeof(reg_t) +LZ4_FORCE_INLINE +unsigned LZ4_count(const BYTE* pIn, const BYTE* pMatch, const BYTE* pInLimit) +{ + const BYTE* const pStart = pIn; + + if (likely(pIn < pInLimit-(STEPSIZE-1))) { + reg_t const diff = LZ4_read_ARCH(pMatch) ^ LZ4_read_ARCH(pIn); + if (!diff) { + pIn+=STEPSIZE; pMatch+=STEPSIZE; + } else { + return LZ4_NbCommonBytes(diff); + } } + + while (likely(pIn < pInLimit-(STEPSIZE-1))) { + reg_t const diff = LZ4_read_ARCH(pMatch) ^ LZ4_read_ARCH(pIn); + if (!diff) { pIn+=STEPSIZE; pMatch+=STEPSIZE; continue; } + pIn += LZ4_NbCommonBytes(diff); + return (unsigned)(pIn - pStart); + } + + if ((STEPSIZE==8) && (pIn<(pInLimit-3)) && (LZ4_read32(pMatch) == LZ4_read32(pIn))) { pIn+=4; pMatch+=4; } + if ((pIn<(pInLimit-1)) && (LZ4_read16(pMatch) == LZ4_read16(pIn))) { pIn+=2; pMatch+=2; } + if ((pIn<pInLimit) && (*pMatch == *pIn)) pIn++; + return (unsigned)(pIn - pStart); +} + + +#ifndef LZ4_COMMONDEFS_ONLY +/*-************************************ +* Local Constants +**************************************/ +static const int LZ4_64Klimit = ((64 KB) + (MFLIMIT-1)); +static const U32 LZ4_skipTrigger = 6; /* Increase this value ==> compression run slower on incompressible data */ + + +/*-************************************ +* Local Structures and types +**************************************/ +typedef enum { clearedTable = 0, byPtr, byU32, byU16 } tableType_t; + +/** + * This enum distinguishes several different modes of accessing previous + * content in the stream. + * + * - noDict : There is no preceding content. + * - withPrefix64k : Table entries up to ctx->dictSize before the current blob + * blob being compressed are valid and refer to the preceding + * content (of length ctx->dictSize), which is available + * contiguously preceding in memory the content currently + * being compressed. + * - usingExtDict : Like withPrefix64k, but the preceding content is somewhere + * else in memory, starting at ctx->dictionary with length + * ctx->dictSize. + * - usingDictCtx : Like usingExtDict, but everything concerning the preceding + * content is in a separate context, pointed to by + * ctx->dictCtx. ctx->dictionary, ctx->dictSize, and table + * entries in the current context that refer to positions + * preceding the beginning of the current compression are + * ignored. Instead, ctx->dictCtx->dictionary and ctx->dictCtx + * ->dictSize describe the location and size of the preceding + * content, and matches are found by looking in the ctx + * ->dictCtx->hashTable. + */ +typedef enum { noDict = 0, withPrefix64k, usingExtDict, usingDictCtx } dict_directive; +typedef enum { noDictIssue = 0, dictSmall } dictIssue_directive; + + +/*-************************************ +* Local Utils +**************************************/ +int LZ4_versionNumber (void) { return LZ4_VERSION_NUMBER; } +const char* LZ4_versionString(void) { return LZ4_VERSION_STRING; } +int LZ4_compressBound(int isize) { return LZ4_COMPRESSBOUND(isize); } +int LZ4_sizeofState() { return LZ4_STREAMSIZE; } + + +/*-************************************ +* Internal Definitions used in Tests +**************************************/ +#if defined (__cplusplus) +extern "C" { +#endif + +int LZ4_compress_forceExtDict (LZ4_stream_t* LZ4_dict, const char* source, char* dest, int srcSize); + +int LZ4_decompress_safe_forceExtDict(const char* source, char* dest, + int compressedSize, int maxOutputSize, + const void* dictStart, size_t dictSize); + +#if defined (__cplusplus) +} +#endif + +/*-****************************** +* Compression functions +********************************/ +static U32 LZ4_hash4(U32 sequence, tableType_t const tableType) +{ + if (tableType == byU16) + return ((sequence * 2654435761U) >> ((MINMATCH*8)-(LZ4_HASHLOG+1))); + else + return ((sequence * 2654435761U) >> ((MINMATCH*8)-LZ4_HASHLOG)); +} + +static U32 LZ4_hash5(U64 sequence, tableType_t const tableType) +{ + const U32 hashLog = (tableType == byU16) ? LZ4_HASHLOG+1 : LZ4_HASHLOG; + if (LZ4_isLittleEndian()) { + const U64 prime5bytes = 889523592379ULL; + return (U32)(((sequence << 24) * prime5bytes) >> (64 - hashLog)); + } else { + const U64 prime8bytes = 11400714785074694791ULL; + return (U32)(((sequence >> 24) * prime8bytes) >> (64 - hashLog)); + } +} + +LZ4_FORCE_INLINE U32 LZ4_hashPosition(const void* const p, tableType_t const tableType) +{ + if ((sizeof(reg_t)==8) && (tableType != byU16)) return LZ4_hash5(LZ4_read_ARCH(p), tableType); + return LZ4_hash4(LZ4_read32(p), tableType); +} + +static void LZ4_clearHash(U32 h, void* tableBase, tableType_t const tableType) +{ + switch (tableType) + { + default: /* fallthrough */ + case clearedTable: { /* illegal! */ assert(0); return; } + case byPtr: { const BYTE** hashTable = (const BYTE**)tableBase; hashTable[h] = NULL; return; } + case byU32: { U32* hashTable = (U32*) tableBase; hashTable[h] = 0; return; } + case byU16: { U16* hashTable = (U16*) tableBase; hashTable[h] = 0; return; } + } +} + +static void LZ4_putIndexOnHash(U32 idx, U32 h, void* tableBase, tableType_t const tableType) +{ + switch (tableType) + { + default: /* fallthrough */ + case clearedTable: /* fallthrough */ + case byPtr: { /* illegal! */ assert(0); return; } + case byU32: { U32* hashTable = (U32*) tableBase; hashTable[h] = idx; return; } + case byU16: { U16* hashTable = (U16*) tableBase; assert(idx < 65536); hashTable[h] = (U16)idx; return; } + } +} + +static void LZ4_putPositionOnHash(const BYTE* p, U32 h, + void* tableBase, tableType_t const tableType, + const BYTE* srcBase) +{ + switch (tableType) + { + case clearedTable: { /* illegal! */ assert(0); return; } + case byPtr: { const BYTE** hashTable = (const BYTE**)tableBase; hashTable[h] = p; return; } + case byU32: { U32* hashTable = (U32*) tableBase; hashTable[h] = (U32)(p-srcBase); return; } + case byU16: { U16* hashTable = (U16*) tableBase; hashTable[h] = (U16)(p-srcBase); return; } + } +} + +LZ4_FORCE_INLINE void LZ4_putPosition(const BYTE* p, void* tableBase, tableType_t tableType, const BYTE* srcBase) +{ + U32 const h = LZ4_hashPosition(p, tableType); + LZ4_putPositionOnHash(p, h, tableBase, tableType, srcBase); +} + +/* LZ4_getIndexOnHash() : + * Index of match position registered in hash table. + * hash position must be calculated by using base+index, or dictBase+index. + * Assumption 1 : only valid if tableType == byU32 or byU16. + * Assumption 2 : h is presumed valid (within limits of hash table) + */ +static U32 LZ4_getIndexOnHash(U32 h, const void* tableBase, tableType_t tableType) +{ + LZ4_STATIC_ASSERT(LZ4_MEMORY_USAGE > 2); + if (tableType == byU32) { + const U32* const hashTable = (const U32*) tableBase; + assert(h < (1U << (LZ4_MEMORY_USAGE-2))); + return hashTable[h]; + } + if (tableType == byU16) { + const U16* const hashTable = (const U16*) tableBase; + assert(h < (1U << (LZ4_MEMORY_USAGE-1))); + return hashTable[h]; + } + assert(0); return 0; /* forbidden case */ +} + +static const BYTE* LZ4_getPositionOnHash(U32 h, const void* tableBase, tableType_t tableType, const BYTE* srcBase) +{ + if (tableType == byPtr) { const BYTE* const* hashTable = (const BYTE* const*) tableBase; return hashTable[h]; } + if (tableType == byU32) { const U32* const hashTable = (const U32*) tableBase; return hashTable[h] + srcBase; } + { const U16* const hashTable = (const U16*) tableBase; return hashTable[h] + srcBase; } /* default, to ensure a return */ +} + +LZ4_FORCE_INLINE const BYTE* +LZ4_getPosition(const BYTE* p, + const void* tableBase, tableType_t tableType, + const BYTE* srcBase) +{ + U32 const h = LZ4_hashPosition(p, tableType); + return LZ4_getPositionOnHash(h, tableBase, tableType, srcBase); +} + +LZ4_FORCE_INLINE void +LZ4_prepareTable(LZ4_stream_t_internal* const cctx, + const int inputSize, + const tableType_t tableType) { + /* If compression failed during the previous step, then the context + * is marked as dirty, therefore, it has to be fully reset. + */ + if (cctx->dirty) { + DEBUGLOG(5, "LZ4_prepareTable: Full reset for %p", cctx); + MEM_INIT(cctx, 0, sizeof(LZ4_stream_t_internal)); + return; + } + + /* If the table hasn't been used, it's guaranteed to be zeroed out, and is + * therefore safe to use no matter what mode we're in. Otherwise, we figure + * out if it's safe to leave as is or whether it needs to be reset. + */ + if (cctx->tableType != clearedTable) { + assert(inputSize >= 0); + if (cctx->tableType != tableType + || ((tableType == byU16) && cctx->currentOffset + (unsigned)inputSize >= 0xFFFFU) + || ((tableType == byU32) && cctx->currentOffset > 1 GB) + || tableType == byPtr + || inputSize >= 4 KB) + { + DEBUGLOG(4, "LZ4_prepareTable: Resetting table in %p", cctx); + MEM_INIT(cctx->hashTable, 0, LZ4_HASHTABLESIZE); + cctx->currentOffset = 0; + cctx->tableType = clearedTable; + } else { + DEBUGLOG(4, "LZ4_prepareTable: Re-use hash table (no reset)"); + } + } + + /* Adding a gap, so all previous entries are > LZ4_DISTANCE_MAX back, is faster + * than compressing without a gap. However, compressing with + * currentOffset == 0 is faster still, so we preserve that case. + */ + if (cctx->currentOffset != 0 && tableType == byU32) { + DEBUGLOG(5, "LZ4_prepareTable: adding 64KB to currentOffset"); + cctx->currentOffset += 64 KB; + } + + /* Finally, clear history */ + cctx->dictCtx = NULL; + cctx->dictionary = NULL; + cctx->dictSize = 0; +} + +/** LZ4_compress_generic() : + inlined, to ensure branches are decided at compilation time */ +LZ4_FORCE_INLINE int LZ4_compress_generic( + LZ4_stream_t_internal* const cctx, + const char* const source, + char* const dest, + const int inputSize, + int *inputConsumed, /* only written when outputDirective == fillOutput */ + const int maxOutputSize, + const limitedOutput_directive outputDirective, + const tableType_t tableType, + const dict_directive dictDirective, + const dictIssue_directive dictIssue, + const int acceleration) +{ + int result; + const BYTE* ip = (const BYTE*) source; + + U32 const startIndex = cctx->currentOffset; + const BYTE* base = (const BYTE*) source - startIndex; + const BYTE* lowLimit; + + const LZ4_stream_t_internal* dictCtx = (const LZ4_stream_t_internal*) cctx->dictCtx; + const BYTE* const dictionary = + dictDirective == usingDictCtx ? dictCtx->dictionary : cctx->dictionary; + const U32 dictSize = + dictDirective == usingDictCtx ? dictCtx->dictSize : cctx->dictSize; + const U32 dictDelta = (dictDirective == usingDictCtx) ? startIndex - dictCtx->currentOffset : 0; /* make indexes in dictCtx comparable with index in current context */ + + int const maybe_extMem = (dictDirective == usingExtDict) || (dictDirective == usingDictCtx); + U32 const prefixIdxLimit = startIndex - dictSize; /* used when dictDirective == dictSmall */ + const BYTE* const dictEnd = dictionary + dictSize; + const BYTE* anchor = (const BYTE*) source; + const BYTE* const iend = ip + inputSize; + const BYTE* const mflimitPlusOne = iend - MFLIMIT + 1; + const BYTE* const matchlimit = iend - LASTLITERALS; + + /* the dictCtx currentOffset is indexed on the start of the dictionary, + * while a dictionary in the current context precedes the currentOffset */ + const BYTE* dictBase = (dictDirective == usingDictCtx) ? + dictionary + dictSize - dictCtx->currentOffset : + dictionary + dictSize - startIndex; + + BYTE* op = (BYTE*) dest; + BYTE* const olimit = op + maxOutputSize; + + U32 offset = 0; + U32 forwardH; + + DEBUGLOG(5, "LZ4_compress_generic: srcSize=%i, tableType=%u", inputSize, tableType); + /* If init conditions are not met, we don't have to mark stream + * as having dirty context, since no action was taken yet */ + if (outputDirective == fillOutput && maxOutputSize < 1) { return 0; } /* Impossible to store anything */ + if ((U32)inputSize > (U32)LZ4_MAX_INPUT_SIZE) { return 0; } /* Unsupported inputSize, too large (or negative) */ + if ((tableType == byU16) && (inputSize>=LZ4_64Klimit)) { return 0; } /* Size too large (not within 64K limit) */ + if (tableType==byPtr) assert(dictDirective==noDict); /* only supported use case with byPtr */ + assert(acceleration >= 1); + + lowLimit = (const BYTE*)source - (dictDirective == withPrefix64k ? dictSize : 0); + + /* Update context state */ + if (dictDirective == usingDictCtx) { + /* Subsequent linked blocks can't use the dictionary. */ + /* Instead, they use the block we just compressed. */ + cctx->dictCtx = NULL; + cctx->dictSize = (U32)inputSize; + } else { + cctx->dictSize += (U32)inputSize; + } + cctx->currentOffset += (U32)inputSize; + cctx->tableType = (U16)tableType; + + if (inputSize<LZ4_minLength) goto _last_literals; /* Input too small, no compression (all literals) */ + + /* First Byte */ + LZ4_putPosition(ip, cctx->hashTable, tableType, base); + ip++; forwardH = LZ4_hashPosition(ip, tableType); + + /* Main Loop */ + for ( ; ; ) { + const BYTE* match; + BYTE* token; + const BYTE* filledIp; + + /* Find a match */ + if (tableType == byPtr) { + const BYTE* forwardIp = ip; + int step = 1; + int searchMatchNb = acceleration << LZ4_skipTrigger; + do { + U32 const h = forwardH; + ip = forwardIp; + forwardIp += step; + step = (searchMatchNb++ >> LZ4_skipTrigger); + + if (unlikely(forwardIp > mflimitPlusOne)) goto _last_literals; + assert(ip < mflimitPlusOne); + + match = LZ4_getPositionOnHash(h, cctx->hashTable, tableType, base); + forwardH = LZ4_hashPosition(forwardIp, tableType); + LZ4_putPositionOnHash(ip, h, cctx->hashTable, tableType, base); + + } while ( (match+LZ4_DISTANCE_MAX < ip) + || (LZ4_read32(match) != LZ4_read32(ip)) ); + + } else { /* byU32, byU16 */ + + const BYTE* forwardIp = ip; + int step = 1; + int searchMatchNb = acceleration << LZ4_skipTrigger; + do { + U32 const h = forwardH; + U32 const current = (U32)(forwardIp - base); + U32 matchIndex = LZ4_getIndexOnHash(h, cctx->hashTable, tableType); + assert(matchIndex <= current); + assert(forwardIp - base < (ptrdiff_t)(2 GB - 1)); + ip = forwardIp; + forwardIp += step; + step = (searchMatchNb++ >> LZ4_skipTrigger); + + if (unlikely(forwardIp > mflimitPlusOne)) goto _last_literals; + assert(ip < mflimitPlusOne); + + if (dictDirective == usingDictCtx) { + if (matchIndex < startIndex) { + /* there was no match, try the dictionary */ + assert(tableType == byU32); + matchIndex = LZ4_getIndexOnHash(h, dictCtx->hashTable, byU32); + match = dictBase + matchIndex; + matchIndex += dictDelta; /* make dictCtx index comparable with current context */ + lowLimit = dictionary; + } else { + match = base + matchIndex; + lowLimit = (const BYTE*)source; + } + } else if (dictDirective==usingExtDict) { + if (matchIndex < startIndex) { + DEBUGLOG(7, "extDict candidate: matchIndex=%5u < startIndex=%5u", matchIndex, startIndex); + assert(startIndex - matchIndex >= MINMATCH); + match = dictBase + matchIndex; + lowLimit = dictionary; + } else { + match = base + matchIndex; + lowLimit = (const BYTE*)source; + } + } else { /* single continuous memory segment */ + match = base + matchIndex; + } + forwardH = LZ4_hashPosition(forwardIp, tableType); + LZ4_putIndexOnHash(current, h, cctx->hashTable, tableType); + + DEBUGLOG(7, "candidate at pos=%u (offset=%u \n", matchIndex, current - matchIndex); + if ((dictIssue == dictSmall) && (matchIndex < prefixIdxLimit)) { continue; } /* match outside of valid area */ + assert(matchIndex < current); + if ( ((tableType != byU16) || (LZ4_DISTANCE_MAX < LZ4_DISTANCE_ABSOLUTE_MAX)) + && (matchIndex+LZ4_DISTANCE_MAX < current)) { + continue; + } /* too far */ + assert((current - matchIndex) <= LZ4_DISTANCE_MAX); /* match now expected within distance */ + + if (LZ4_read32(match) == LZ4_read32(ip)) { + if (maybe_extMem) offset = current - matchIndex; + break; /* match found */ + } + + } while(1); + } + + /* Catch up */ + filledIp = ip; + while (((ip>anchor) & (match > lowLimit)) && (unlikely(ip[-1]==match[-1]))) { ip--; match--; } + + /* Encode Literals */ + { unsigned const litLength = (unsigned)(ip - anchor); + token = op++; + if ((outputDirective == limitedOutput) && /* Check output buffer overflow */ + (unlikely(op + litLength + (2 + 1 + LASTLITERALS) + (litLength/255) > olimit)) ) { + return 0; /* cannot compress within `dst` budget. Stored indexes in hash table are nonetheless fine */ + } + if ((outputDirective == fillOutput) && + (unlikely(op + (litLength+240)/255 /* litlen */ + litLength /* literals */ + 2 /* offset */ + 1 /* token */ + MFLIMIT - MINMATCH /* min last literals so last match is <= end - MFLIMIT */ > olimit))) { + op--; + goto _last_literals; + } + if (litLength >= RUN_MASK) { + int len = (int)(litLength - RUN_MASK); + *token = (RUN_MASK<<ML_BITS); + for(; len >= 255 ; len-=255) *op++ = 255; + *op++ = (BYTE)len; + } + else *token = (BYTE)(litLength<<ML_BITS); + + /* Copy Literals */ + LZ4_wildCopy8(op, anchor, op+litLength); + op+=litLength; + DEBUGLOG(6, "seq.start:%i, literals=%u, match.start:%i", + (int)(anchor-(const BYTE*)source), litLength, (int)(ip-(const BYTE*)source)); + } + +_next_match: + /* at this stage, the following variables must be correctly set : + * - ip : at start of LZ operation + * - match : at start of previous pattern occurence; can be within current prefix, or within extDict + * - offset : if maybe_ext_memSegment==1 (constant) + * - lowLimit : must be == dictionary to mean "match is within extDict"; must be == source otherwise + * - token and *token : position to write 4-bits for match length; higher 4-bits for literal length supposed already written + */ + + if ((outputDirective == fillOutput) && + (op + 2 /* offset */ + 1 /* token */ + MFLIMIT - MINMATCH /* min last literals so last match is <= end - MFLIMIT */ > olimit)) { + /* the match was too close to the end, rewind and go to last literals */ + op = token; + goto _last_literals; + } + + /* Encode Offset */ + if (maybe_extMem) { /* static test */ + DEBUGLOG(6, " with offset=%u (ext if > %i)", offset, (int)(ip - (const BYTE*)source)); + assert(offset <= LZ4_DISTANCE_MAX && offset > 0); + LZ4_writeLE16(op, (U16)offset); op+=2; + } else { + DEBUGLOG(6, " with offset=%u (same segment)", (U32)(ip - match)); + assert(ip-match <= LZ4_DISTANCE_MAX); + LZ4_writeLE16(op, (U16)(ip - match)); op+=2; + } + + /* Encode MatchLength */ + { unsigned matchCode; + + if ( (dictDirective==usingExtDict || dictDirective==usingDictCtx) + && (lowLimit==dictionary) /* match within extDict */ ) { + const BYTE* limit = ip + (dictEnd-match); + assert(dictEnd > match); + if (limit > matchlimit) limit = matchlimit; + matchCode = LZ4_count(ip+MINMATCH, match+MINMATCH, limit); + ip += (size_t)matchCode + MINMATCH; + if (ip==limit) { + unsigned const more = LZ4_count(limit, (const BYTE*)source, matchlimit); + matchCode += more; + ip += more; + } + DEBUGLOG(6, " with matchLength=%u starting in extDict", matchCode+MINMATCH); + } else { + matchCode = LZ4_count(ip+MINMATCH, match+MINMATCH, matchlimit); + ip += (size_t)matchCode + MINMATCH; + DEBUGLOG(6, " with matchLength=%u", matchCode+MINMATCH); + } + + if ((outputDirective) && /* Check output buffer overflow */ + (unlikely(op + (1 + LASTLITERALS) + (matchCode+240)/255 > olimit)) ) { + if (outputDirective == fillOutput) { + /* Match description too long : reduce it */ + U32 newMatchCode = 15 /* in token */ - 1 /* to avoid needing a zero byte */ + ((U32)(olimit - op) - 1 - LASTLITERALS) * 255; + ip -= matchCode - newMatchCode; + assert(newMatchCode < matchCode); + matchCode = newMatchCode; + if (unlikely(ip <= filledIp)) { + /* We have already filled up to filledIp so if ip ends up less than filledIp + * we have positions in the hash table beyond the current position. This is + * a problem if we reuse the hash table. So we have to remove these positions + * from the hash table. + */ + const BYTE* ptr; + DEBUGLOG(5, "Clearing %u positions", (U32)(filledIp - ip)); + for (ptr = ip; ptr <= filledIp; ++ptr) { + U32 const h = LZ4_hashPosition(ptr, tableType); + LZ4_clearHash(h, cctx->hashTable, tableType); + } + } + } else { + assert(outputDirective == limitedOutput); + return 0; /* cannot compress within `dst` budget. Stored indexes in hash table are nonetheless fine */ + } + } + if (matchCode >= ML_MASK) { + *token += ML_MASK; + matchCode -= ML_MASK; + LZ4_write32(op, 0xFFFFFFFF); + while (matchCode >= 4*255) { + op+=4; + LZ4_write32(op, 0xFFFFFFFF); + matchCode -= 4*255; + } + op += matchCode / 255; + *op++ = (BYTE)(matchCode % 255); + } else + *token += (BYTE)(matchCode); + } + /* Ensure we have enough space for the last literals. */ + assert(!(outputDirective == fillOutput && op + 1 + LASTLITERALS > olimit)); + + anchor = ip; + + /* Test end of chunk */ + if (ip >= mflimitPlusOne) break; + + /* Fill table */ + LZ4_putPosition(ip-2, cctx->hashTable, tableType, base); + + /* Test next position */ + if (tableType == byPtr) { + + match = LZ4_getPosition(ip, cctx->hashTable, tableType, base); + LZ4_putPosition(ip, cctx->hashTable, tableType, base); + if ( (match+LZ4_DISTANCE_MAX >= ip) + && (LZ4_read32(match) == LZ4_read32(ip)) ) + { token=op++; *token=0; goto _next_match; } + + } else { /* byU32, byU16 */ + + U32 const h = LZ4_hashPosition(ip, tableType); + U32 const current = (U32)(ip-base); + U32 matchIndex = LZ4_getIndexOnHash(h, cctx->hashTable, tableType); + assert(matchIndex < current); + if (dictDirective == usingDictCtx) { + if (matchIndex < startIndex) { + /* there was no match, try the dictionary */ + matchIndex = LZ4_getIndexOnHash(h, dictCtx->hashTable, byU32); + match = dictBase + matchIndex; + lowLimit = dictionary; /* required for match length counter */ + matchIndex += dictDelta; + } else { + match = base + matchIndex; + lowLimit = (const BYTE*)source; /* required for match length counter */ + } + } else if (dictDirective==usingExtDict) { + if (matchIndex < startIndex) { + match = dictBase + matchIndex; + lowLimit = dictionary; /* required for match length counter */ + } else { + match = base + matchIndex; + lowLimit = (const BYTE*)source; /* required for match length counter */ + } + } else { /* single memory segment */ + match = base + matchIndex; + } + LZ4_putIndexOnHash(current, h, cctx->hashTable, tableType); + assert(matchIndex < current); + if ( ((dictIssue==dictSmall) ? (matchIndex >= prefixIdxLimit) : 1) + && (((tableType==byU16) && (LZ4_DISTANCE_MAX == LZ4_DISTANCE_ABSOLUTE_MAX)) ? 1 : (matchIndex+LZ4_DISTANCE_MAX >= current)) + && (LZ4_read32(match) == LZ4_read32(ip)) ) { + token=op++; + *token=0; + if (maybe_extMem) offset = current - matchIndex; + DEBUGLOG(6, "seq.start:%i, literals=%u, match.start:%i", + (int)(anchor-(const BYTE*)source), 0, (int)(ip-(const BYTE*)source)); + goto _next_match; + } + } + + /* Prepare next loop */ + forwardH = LZ4_hashPosition(++ip, tableType); + + } + +_last_literals: + /* Encode Last Literals */ + { size_t lastRun = (size_t)(iend - anchor); + if ( (outputDirective) && /* Check output buffer overflow */ + (op + lastRun + 1 + ((lastRun+255-RUN_MASK)/255) > olimit)) { + if (outputDirective == fillOutput) { + /* adapt lastRun to fill 'dst' */ + assert(olimit >= op); + lastRun = (size_t)(olimit-op) - 1; + lastRun -= (lastRun+240)/255; + } else { + assert(outputDirective == limitedOutput); + return 0; /* cannot compress within `dst` budget. Stored indexes in hash table are nonetheless fine */ + } + } + if (lastRun >= RUN_MASK) { + size_t accumulator = lastRun - RUN_MASK; + *op++ = RUN_MASK << ML_BITS; + for(; accumulator >= 255 ; accumulator-=255) *op++ = 255; + *op++ = (BYTE) accumulator; + } else { + *op++ = (BYTE)(lastRun<<ML_BITS); + } + memcpy(op, anchor, lastRun); + ip = anchor + lastRun; + op += lastRun; + } + + if (outputDirective == fillOutput) { + *inputConsumed = (int) (((const char*)ip)-source); + } + DEBUGLOG(5, "LZ4_compress_generic: compressed %i bytes into %i bytes", inputSize, (int)(((char*)op) - dest)); + result = (int)(((char*)op) - dest); + assert(result > 0); + return result; +} + + +int LZ4_compress_fast_extState(void* state, const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration) +{ + LZ4_stream_t_internal* const ctx = & LZ4_initStream(state, sizeof(LZ4_stream_t)) -> internal_donotuse; + assert(ctx != NULL); + if (acceleration < 1) acceleration = ACCELERATION_DEFAULT; + if (maxOutputSize >= LZ4_compressBound(inputSize)) { + if (inputSize < LZ4_64Klimit) { + return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, 0, notLimited, byU16, noDict, noDictIssue, acceleration); + } else { + const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)source > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, 0, notLimited, tableType, noDict, noDictIssue, acceleration); + } + } else { + if (inputSize < LZ4_64Klimit) { + return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, byU16, noDict, noDictIssue, acceleration); + } else { + const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)source > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, noDict, noDictIssue, acceleration); + } + } +} + +/** + * LZ4_compress_fast_extState_fastReset() : + * A variant of LZ4_compress_fast_extState(). + * + * Using this variant avoids an expensive initialization step. It is only safe + * to call if the state buffer is known to be correctly initialized already + * (see comment in lz4.h on LZ4_resetStream_fast() for a definition of + * "correctly initialized"). + */ +int LZ4_compress_fast_extState_fastReset(void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration) +{ + LZ4_stream_t_internal* ctx = &((LZ4_stream_t*)state)->internal_donotuse; + if (acceleration < 1) acceleration = ACCELERATION_DEFAULT; + + if (dstCapacity >= LZ4_compressBound(srcSize)) { + if (srcSize < LZ4_64Klimit) { + const tableType_t tableType = byU16; + LZ4_prepareTable(ctx, srcSize, tableType); + if (ctx->currentOffset) { + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, 0, notLimited, tableType, noDict, dictSmall, acceleration); + } else { + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, 0, notLimited, tableType, noDict, noDictIssue, acceleration); + } + } else { + const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + LZ4_prepareTable(ctx, srcSize, tableType); + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, 0, notLimited, tableType, noDict, noDictIssue, acceleration); + } + } else { + if (srcSize < LZ4_64Klimit) { + const tableType_t tableType = byU16; + LZ4_prepareTable(ctx, srcSize, tableType); + if (ctx->currentOffset) { + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, dstCapacity, limitedOutput, tableType, noDict, dictSmall, acceleration); + } else { + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, dstCapacity, limitedOutput, tableType, noDict, noDictIssue, acceleration); + } + } else { + const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + LZ4_prepareTable(ctx, srcSize, tableType); + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, dstCapacity, limitedOutput, tableType, noDict, noDictIssue, acceleration); + } + } +} + + +int LZ4_compress_fast(const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration) +{ + int result; +#if (LZ4_HEAPMODE) + LZ4_stream_t* ctxPtr = ALLOC(sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */ + if (ctxPtr == NULL) return 0; +#else + LZ4_stream_t ctx; + LZ4_stream_t* const ctxPtr = &ctx; +#endif + result = LZ4_compress_fast_extState(ctxPtr, source, dest, inputSize, maxOutputSize, acceleration); + +#if (LZ4_HEAPMODE) + FREEMEM(ctxPtr); +#endif + return result; +} + + +int LZ4_compress_default(const char* src, char* dst, int srcSize, int maxOutputSize) +{ + return LZ4_compress_fast(src, dst, srcSize, maxOutputSize, 1); +} + + +/* hidden debug function */ +/* strangely enough, gcc generates faster code when this function is uncommented, even if unused */ +int LZ4_compress_fast_force(const char* src, char* dst, int srcSize, int dstCapacity, int acceleration) +{ + LZ4_stream_t ctx; + LZ4_initStream(&ctx, sizeof(ctx)); + + if (srcSize < LZ4_64Klimit) { + return LZ4_compress_generic(&ctx.internal_donotuse, src, dst, srcSize, NULL, dstCapacity, limitedOutput, byU16, noDict, noDictIssue, acceleration); + } else { + tableType_t const addrMode = (sizeof(void*) > 4) ? byU32 : byPtr; + return LZ4_compress_generic(&ctx.internal_donotuse, src, dst, srcSize, NULL, dstCapacity, limitedOutput, addrMode, noDict, noDictIssue, acceleration); + } +} + + +/* Note!: This function leaves the stream in an unclean/broken state! + * It is not safe to subsequently use the same state with a _fastReset() or + * _continue() call without resetting it. */ +static int LZ4_compress_destSize_extState (LZ4_stream_t* state, const char* src, char* dst, int* srcSizePtr, int targetDstSize) +{ + void* const s = LZ4_initStream(state, sizeof (*state)); + assert(s != NULL); (void)s; + + if (targetDstSize >= LZ4_compressBound(*srcSizePtr)) { /* compression success is guaranteed */ + return LZ4_compress_fast_extState(state, src, dst, *srcSizePtr, targetDstSize, 1); + } else { + if (*srcSizePtr < LZ4_64Klimit) { + return LZ4_compress_generic(&state->internal_donotuse, src, dst, *srcSizePtr, srcSizePtr, targetDstSize, fillOutput, byU16, noDict, noDictIssue, 1); + } else { + tableType_t const addrMode = ((sizeof(void*)==4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + return LZ4_compress_generic(&state->internal_donotuse, src, dst, *srcSizePtr, srcSizePtr, targetDstSize, fillOutput, addrMode, noDict, noDictIssue, 1); + } } +} + + +int LZ4_compress_destSize(const char* src, char* dst, int* srcSizePtr, int targetDstSize) +{ +#if (LZ4_HEAPMODE) + LZ4_stream_t* ctx = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */ + if (ctx == NULL) return 0; +#else + LZ4_stream_t ctxBody; + LZ4_stream_t* ctx = &ctxBody; +#endif + + int result = LZ4_compress_destSize_extState(ctx, src, dst, srcSizePtr, targetDstSize); + +#if (LZ4_HEAPMODE) + FREEMEM(ctx); +#endif + return result; +} + + + +/*-****************************** +* Streaming functions +********************************/ + +LZ4_stream_t* LZ4_createStream(void) +{ + LZ4_stream_t* const lz4s = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t)); + LZ4_STATIC_ASSERT(LZ4_STREAMSIZE >= sizeof(LZ4_stream_t_internal)); /* A compilation error here means LZ4_STREAMSIZE is not large enough */ + DEBUGLOG(4, "LZ4_createStream %p", lz4s); + if (lz4s == NULL) return NULL; + LZ4_initStream(lz4s, sizeof(*lz4s)); + return lz4s; +} + +#ifndef _MSC_VER /* for some reason, Visual fails the aligment test on 32-bit x86 : + it reports an aligment of 8-bytes, + while actually aligning LZ4_stream_t on 4 bytes. */ +static size_t LZ4_stream_t_alignment(void) +{ + struct { char c; LZ4_stream_t t; } t_a; + return sizeof(t_a) - sizeof(t_a.t); +} +#endif + +LZ4_stream_t* LZ4_initStream (void* buffer, size_t size) +{ + DEBUGLOG(5, "LZ4_initStream"); + if (buffer == NULL) { return NULL; } + if (size < sizeof(LZ4_stream_t)) { return NULL; } +#ifndef _MSC_VER /* for some reason, Visual fails the aligment test on 32-bit x86 : + it reports an aligment of 8-bytes, + while actually aligning LZ4_stream_t on 4 bytes. */ + if (((size_t)buffer) & (LZ4_stream_t_alignment() - 1)) { return NULL; } /* alignment check */ +#endif + MEM_INIT(buffer, 0, sizeof(LZ4_stream_t)); + return (LZ4_stream_t*)buffer; +} + +/* resetStream is now deprecated, + * prefer initStream() which is more general */ +void LZ4_resetStream (LZ4_stream_t* LZ4_stream) +{ + DEBUGLOG(5, "LZ4_resetStream (ctx:%p)", LZ4_stream); + MEM_INIT(LZ4_stream, 0, sizeof(LZ4_stream_t)); +} + +void LZ4_resetStream_fast(LZ4_stream_t* ctx) { + LZ4_prepareTable(&(ctx->internal_donotuse), 0, byU32); +} + +int LZ4_freeStream (LZ4_stream_t* LZ4_stream) +{ + if (!LZ4_stream) return 0; /* support free on NULL */ + DEBUGLOG(5, "LZ4_freeStream %p", LZ4_stream); + FREEMEM(LZ4_stream); + return (0); +} + + +#define HASH_UNIT sizeof(reg_t) +int LZ4_loadDict (LZ4_stream_t* LZ4_dict, const char* dictionary, int dictSize) +{ + LZ4_stream_t_internal* dict = &LZ4_dict->internal_donotuse; + const tableType_t tableType = byU32; + const BYTE* p = (const BYTE*)dictionary; + const BYTE* const dictEnd = p + dictSize; + const BYTE* base; + + DEBUGLOG(4, "LZ4_loadDict (%i bytes from %p into %p)", dictSize, dictionary, LZ4_dict); + + /* It's necessary to reset the context, + * and not just continue it with prepareTable() + * to avoid any risk of generating overflowing matchIndex + * when compressing using this dictionary */ + LZ4_resetStream(LZ4_dict); + + /* We always increment the offset by 64 KB, since, if the dict is longer, + * we truncate it to the last 64k, and if it's shorter, we still want to + * advance by a whole window length so we can provide the guarantee that + * there are only valid offsets in the window, which allows an optimization + * in LZ4_compress_fast_continue() where it uses noDictIssue even when the + * dictionary isn't a full 64k. */ + dict->currentOffset += 64 KB; + + if (dictSize < (int)HASH_UNIT) { + return 0; + } + + if ((dictEnd - p) > 64 KB) p = dictEnd - 64 KB; + base = dictEnd - dict->currentOffset; + dict->dictionary = p; + dict->dictSize = (U32)(dictEnd - p); + dict->tableType = tableType; + + while (p <= dictEnd-HASH_UNIT) { + LZ4_putPosition(p, dict->hashTable, tableType, base); + p+=3; + } + + return (int)dict->dictSize; +} + +void LZ4_attach_dictionary(LZ4_stream_t* workingStream, const LZ4_stream_t* dictionaryStream) { + const LZ4_stream_t_internal* dictCtx = dictionaryStream == NULL ? NULL : + &(dictionaryStream->internal_donotuse); + + DEBUGLOG(4, "LZ4_attach_dictionary (%p, %p, size %u)", + workingStream, dictionaryStream, + dictCtx != NULL ? dictCtx->dictSize : 0); + + /* Calling LZ4_resetStream_fast() here makes sure that changes will not be + * erased by subsequent calls to LZ4_resetStream_fast() in case stream was + * marked as having dirty context, e.g. requiring full reset. + */ + LZ4_resetStream_fast(workingStream); + + if (dictCtx != NULL) { + /* If the current offset is zero, we will never look in the + * external dictionary context, since there is no value a table + * entry can take that indicate a miss. In that case, we need + * to bump the offset to something non-zero. + */ + if (workingStream->internal_donotuse.currentOffset == 0) { + workingStream->internal_donotuse.currentOffset = 64 KB; + } + + /* Don't actually attach an empty dictionary. + */ + if (dictCtx->dictSize == 0) { + dictCtx = NULL; + } + } + workingStream->internal_donotuse.dictCtx = dictCtx; +} + + +static void LZ4_renormDictT(LZ4_stream_t_internal* LZ4_dict, int nextSize) +{ + assert(nextSize >= 0); + if (LZ4_dict->currentOffset + (unsigned)nextSize > 0x80000000) { /* potential ptrdiff_t overflow (32-bits mode) */ + /* rescale hash table */ + U32 const delta = LZ4_dict->currentOffset - 64 KB; + const BYTE* dictEnd = LZ4_dict->dictionary + LZ4_dict->dictSize; + int i; + DEBUGLOG(4, "LZ4_renormDictT"); + for (i=0; i<LZ4_HASH_SIZE_U32; i++) { + if (LZ4_dict->hashTable[i] < delta) LZ4_dict->hashTable[i]=0; + else LZ4_dict->hashTable[i] -= delta; + } + LZ4_dict->currentOffset = 64 KB; + if (LZ4_dict->dictSize > 64 KB) LZ4_dict->dictSize = 64 KB; + LZ4_dict->dictionary = dictEnd - LZ4_dict->dictSize; + } +} + + +int LZ4_compress_fast_continue (LZ4_stream_t* LZ4_stream, + const char* source, char* dest, + int inputSize, int maxOutputSize, + int acceleration) +{ + const tableType_t tableType = byU32; + LZ4_stream_t_internal* streamPtr = &LZ4_stream->internal_donotuse; + const BYTE* dictEnd = streamPtr->dictionary + streamPtr->dictSize; + + DEBUGLOG(5, "LZ4_compress_fast_continue (inputSize=%i)", inputSize); + + if (streamPtr->dirty) { return 0; } /* Uninitialized structure detected */ + LZ4_renormDictT(streamPtr, inputSize); /* avoid index overflow */ + if (acceleration < 1) acceleration = ACCELERATION_DEFAULT; + + /* invalidate tiny dictionaries */ + if ( (streamPtr->dictSize-1 < 4-1) /* intentional underflow */ + && (dictEnd != (const BYTE*)source) ) { + DEBUGLOG(5, "LZ4_compress_fast_continue: dictSize(%u) at addr:%p is too small", streamPtr->dictSize, streamPtr->dictionary); + streamPtr->dictSize = 0; + streamPtr->dictionary = (const BYTE*)source; + dictEnd = (const BYTE*)source; + } + + /* Check overlapping input/dictionary space */ + { const BYTE* sourceEnd = (const BYTE*) source + inputSize; + if ((sourceEnd > streamPtr->dictionary) && (sourceEnd < dictEnd)) { + streamPtr->dictSize = (U32)(dictEnd - sourceEnd); + if (streamPtr->dictSize > 64 KB) streamPtr->dictSize = 64 KB; + if (streamPtr->dictSize < 4) streamPtr->dictSize = 0; + streamPtr->dictionary = dictEnd - streamPtr->dictSize; + } + } + + /* prefix mode : source data follows dictionary */ + if (dictEnd == (const BYTE*)source) { + if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) + return LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, withPrefix64k, dictSmall, acceleration); + else + return LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, withPrefix64k, noDictIssue, acceleration); + } + + /* external dictionary mode */ + { int result; + if (streamPtr->dictCtx) { + /* We depend here on the fact that dictCtx'es (produced by + * LZ4_loadDict) guarantee that their tables contain no references + * to offsets between dictCtx->currentOffset - 64 KB and + * dictCtx->currentOffset - dictCtx->dictSize. This makes it safe + * to use noDictIssue even when the dict isn't a full 64 KB. + */ + if (inputSize > 4 KB) { + /* For compressing large blobs, it is faster to pay the setup + * cost to copy the dictionary's tables into the active context, + * so that the compression loop is only looking into one table. + */ + memcpy(streamPtr, streamPtr->dictCtx, sizeof(LZ4_stream_t)); + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingExtDict, noDictIssue, acceleration); + } else { + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingDictCtx, noDictIssue, acceleration); + } + } else { + if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) { + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingExtDict, dictSmall, acceleration); + } else { + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingExtDict, noDictIssue, acceleration); + } + } + streamPtr->dictionary = (const BYTE*)source; + streamPtr->dictSize = (U32)inputSize; + return result; + } +} + + +/* Hidden debug function, to force-test external dictionary mode */ +int LZ4_compress_forceExtDict (LZ4_stream_t* LZ4_dict, const char* source, char* dest, int srcSize) +{ + LZ4_stream_t_internal* streamPtr = &LZ4_dict->internal_donotuse; + int result; + + LZ4_renormDictT(streamPtr, srcSize); + + if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) { + result = LZ4_compress_generic(streamPtr, source, dest, srcSize, NULL, 0, notLimited, byU32, usingExtDict, dictSmall, 1); + } else { + result = LZ4_compress_generic(streamPtr, source, dest, srcSize, NULL, 0, notLimited, byU32, usingExtDict, noDictIssue, 1); + } + + streamPtr->dictionary = (const BYTE*)source; + streamPtr->dictSize = (U32)srcSize; + + return result; +} + + +/*! LZ4_saveDict() : + * If previously compressed data block is not guaranteed to remain available at its memory location, + * save it into a safer place (char* safeBuffer). + * Note : you don't need to call LZ4_loadDict() afterwards, + * dictionary is immediately usable, you can therefore call LZ4_compress_fast_continue(). + * Return : saved dictionary size in bytes (necessarily <= dictSize), or 0 if error. + */ +int LZ4_saveDict (LZ4_stream_t* LZ4_dict, char* safeBuffer, int dictSize) +{ + LZ4_stream_t_internal* const dict = &LZ4_dict->internal_donotuse; + const BYTE* const previousDictEnd = dict->dictionary + dict->dictSize; + + if ((U32)dictSize > 64 KB) { dictSize = 64 KB; } /* useless to define a dictionary > 64 KB */ + if ((U32)dictSize > dict->dictSize) { dictSize = (int)dict->dictSize; } + + memmove(safeBuffer, previousDictEnd - dictSize, dictSize); + + dict->dictionary = (const BYTE*)safeBuffer; + dict->dictSize = (U32)dictSize; + + return dictSize; +} + + + +/*-******************************* + * Decompression functions + ********************************/ + +typedef enum { endOnOutputSize = 0, endOnInputSize = 1 } endCondition_directive; +typedef enum { decode_full_block = 0, partial_decode = 1 } earlyEnd_directive; + +#undef MIN +#define MIN(a,b) ( (a) < (b) ? (a) : (b) ) + +/* Read the variable-length literal or match length. + * + * ip - pointer to use as input. + * lencheck - end ip. Return an error if ip advances >= lencheck. + * loop_check - check ip >= lencheck in body of loop. Returns loop_error if so. + * initial_check - check ip >= lencheck before start of loop. Returns initial_error if so. + * error (output) - error code. Should be set to 0 before call. + */ +typedef enum { loop_error = -2, initial_error = -1, ok = 0 } variable_length_error; +LZ4_FORCE_INLINE unsigned +read_variable_length(const BYTE**ip, const BYTE* lencheck, int loop_check, int initial_check, variable_length_error* error) +{ + unsigned length = 0; + unsigned s; + if (initial_check && unlikely((*ip) >= lencheck)) { /* overflow detection */ + *error = initial_error; + return length; + } + do { + s = **ip; + (*ip)++; + length += s; + if (loop_check && unlikely((*ip) >= lencheck)) { /* overflow detection */ + *error = loop_error; + return length; + } + } while (s==255); + + return length; +} + +/*! LZ4_decompress_generic() : + * This generic decompression function covers all use cases. + * It shall be instantiated several times, using different sets of directives. + * Note that it is important for performance that this function really get inlined, + * in order to remove useless branches during compilation optimization. + */ +LZ4_FORCE_INLINE int +LZ4_decompress_generic( + const char* const src, + char* const dst, + int srcSize, + int outputSize, /* If endOnInput==endOnInputSize, this value is `dstCapacity` */ + + endCondition_directive endOnInput, /* endOnOutputSize, endOnInputSize */ + earlyEnd_directive partialDecoding, /* full, partial */ + dict_directive dict, /* noDict, withPrefix64k, usingExtDict */ + const BYTE* const lowPrefix, /* always <= dst, == dst when no prefix */ + const BYTE* const dictStart, /* only if dict==usingExtDict */ + const size_t dictSize /* note : = 0 if noDict */ + ) +{ + if (src == NULL) { return -1; } + + { const BYTE* ip = (const BYTE*) src; + const BYTE* const iend = ip + srcSize; + + BYTE* op = (BYTE*) dst; + BYTE* const oend = op + outputSize; + BYTE* cpy; + + const BYTE* const dictEnd = (dictStart == NULL) ? NULL : dictStart + dictSize; + + const int safeDecode = (endOnInput==endOnInputSize); + const int checkOffset = ((safeDecode) && (dictSize < (int)(64 KB))); + + + /* Set up the "end" pointers for the shortcut. */ + const BYTE* const shortiend = iend - (endOnInput ? 14 : 8) /*maxLL*/ - 2 /*offset*/; + const BYTE* const shortoend = oend - (endOnInput ? 14 : 8) /*maxLL*/ - 18 /*maxML*/; + + const BYTE* match; + size_t offset; + unsigned token; + size_t length; + + + DEBUGLOG(5, "LZ4_decompress_generic (srcSize:%i, dstSize:%i)", srcSize, outputSize); + + /* Special cases */ + assert(lowPrefix <= op); + if ((endOnInput) && (unlikely(outputSize==0))) { + /* Empty output buffer */ + if (partialDecoding) return 0; + return ((srcSize==1) && (*ip==0)) ? 0 : -1; + } + if ((!endOnInput) && (unlikely(outputSize==0))) { return (*ip==0 ? 1 : -1); } + if ((endOnInput) && unlikely(srcSize==0)) { return -1; } + + /* Currently the fast loop shows a regression on qualcomm arm chips. */ +#if LZ4_FAST_DEC_LOOP + if ((oend - op) < FASTLOOP_SAFE_DISTANCE) { + DEBUGLOG(6, "skip fast decode loop"); + goto safe_decode; + } + + /* Fast loop : decode sequences as long as output < iend-FASTLOOP_SAFE_DISTANCE */ + while (1) { + /* Main fastloop assertion: We can always wildcopy FASTLOOP_SAFE_DISTANCE */ + assert(oend - op >= FASTLOOP_SAFE_DISTANCE); + if (endOnInput) { assert(ip < iend); } + token = *ip++; + length = token >> ML_BITS; /* literal length */ + + assert(!endOnInput || ip <= iend); /* ip < iend before the increment */ + + /* decode literal length */ + if (length == RUN_MASK) { + variable_length_error error = ok; + length += read_variable_length(&ip, iend-RUN_MASK, endOnInput, endOnInput, &error); + if (error == initial_error) { goto _output_error; } + if ((safeDecode) && unlikely((uptrval)(op)+length<(uptrval)(op))) { goto _output_error; } /* overflow detection */ + if ((safeDecode) && unlikely((uptrval)(ip)+length<(uptrval)(ip))) { goto _output_error; } /* overflow detection */ + + /* copy literals */ + cpy = op+length; + LZ4_STATIC_ASSERT(MFLIMIT >= WILDCOPYLENGTH); + if (endOnInput) { /* LZ4_decompress_safe() */ + if ((cpy>oend-32) || (ip+length>iend-32)) { goto safe_literal_copy; } + LZ4_wildCopy32(op, ip, cpy); + } else { /* LZ4_decompress_fast() */ + if (cpy>oend-8) { goto safe_literal_copy; } + LZ4_wildCopy8(op, ip, cpy); /* LZ4_decompress_fast() cannot copy more than 8 bytes at a time : + * it doesn't know input length, and only relies on end-of-block properties */ + } + ip += length; op = cpy; + } else { + cpy = op+length; + if (endOnInput) { /* LZ4_decompress_safe() */ + DEBUGLOG(7, "copy %u bytes in a 16-bytes stripe", (unsigned)length); + /* We don't need to check oend, since we check it once for each loop below */ + if (ip > iend-(16 + 1/*max lit + offset + nextToken*/)) { goto safe_literal_copy; } + /* Literals can only be 14, but hope compilers optimize if we copy by a register size */ + memcpy(op, ip, 16); + } else { /* LZ4_decompress_fast() */ + /* LZ4_decompress_fast() cannot copy more than 8 bytes at a time : + * it doesn't know input length, and relies on end-of-block properties */ + memcpy(op, ip, 8); + if (length > 8) { memcpy(op+8, ip+8, 8); } + } + ip += length; op = cpy; + } + + /* get offset */ + offset = LZ4_readLE16(ip); ip+=2; + match = op - offset; + assert(match <= op); + + /* get matchlength */ + length = token & ML_MASK; + + if (length == ML_MASK) { + variable_length_error error = ok; + if ((checkOffset) && (unlikely(match + dictSize < lowPrefix))) { goto _output_error; } /* Error : offset outside buffers */ + length += read_variable_length(&ip, iend - LASTLITERALS + 1, endOnInput, 0, &error); + if (error != ok) { goto _output_error; } + if ((safeDecode) && unlikely((uptrval)(op)+length<(uptrval)op)) { goto _output_error; } /* overflow detection */ + length += MINMATCH; + if (op + length >= oend - FASTLOOP_SAFE_DISTANCE) { + goto safe_match_copy; + } + } else { + length += MINMATCH; + if (op + length >= oend - FASTLOOP_SAFE_DISTANCE) { + goto safe_match_copy; + } + + /* Fastpath check: Avoids a branch in LZ4_wildCopy32 if true */ + if ((dict == withPrefix64k) || (match >= lowPrefix)) { + if (offset >= 8) { + assert(match >= lowPrefix); + assert(match <= op); + assert(op + 18 <= oend); + + memcpy(op, match, 8); + memcpy(op+8, match+8, 8); + memcpy(op+16, match+16, 2); + op += length; + continue; + } } } + + if ((checkOffset) && (unlikely(match + dictSize < lowPrefix))) { goto _output_error; } /* Error : offset outside buffers */ + /* match starting within external dictionary */ + if ((dict==usingExtDict) && (match < lowPrefix)) { + if (unlikely(op+length > oend-LASTLITERALS)) { + if (partialDecoding) { + length = MIN(length, (size_t)(oend-op)); /* reach end of buffer */ + } else { + goto _output_error; /* end-of-block condition violated */ + } } + + if (length <= (size_t)(lowPrefix-match)) { + /* match fits entirely within external dictionary : just copy */ + memmove(op, dictEnd - (lowPrefix-match), length); + op += length; + } else { + /* match stretches into both external dictionary and current block */ + size_t const copySize = (size_t)(lowPrefix - match); + size_t const restSize = length - copySize; + memcpy(op, dictEnd - copySize, copySize); + op += copySize; + if (restSize > (size_t)(op - lowPrefix)) { /* overlap copy */ + BYTE* const endOfMatch = op + restSize; + const BYTE* copyFrom = lowPrefix; + while (op < endOfMatch) { *op++ = *copyFrom++; } + } else { + memcpy(op, lowPrefix, restSize); + op += restSize; + } } + continue; + } + + /* copy match within block */ + cpy = op + length; + + assert((op <= oend) && (oend-op >= 32)); + if (unlikely(offset<16)) { + LZ4_memcpy_using_offset(op, match, cpy, offset); + } else { + LZ4_wildCopy32(op, match, cpy); + } + + op = cpy; /* wildcopy correction */ + } + safe_decode: +#endif + + /* Main Loop : decode remaining sequences where output < FASTLOOP_SAFE_DISTANCE */ + while (1) { + token = *ip++; + length = token >> ML_BITS; /* literal length */ + + assert(!endOnInput || ip <= iend); /* ip < iend before the increment */ + + /* A two-stage shortcut for the most common case: + * 1) If the literal length is 0..14, and there is enough space, + * enter the shortcut and copy 16 bytes on behalf of the literals + * (in the fast mode, only 8 bytes can be safely copied this way). + * 2) Further if the match length is 4..18, copy 18 bytes in a similar + * manner; but we ensure that there's enough space in the output for + * those 18 bytes earlier, upon entering the shortcut (in other words, + * there is a combined check for both stages). + */ + if ( (endOnInput ? length != RUN_MASK : length <= 8) + /* strictly "less than" on input, to re-enter the loop with at least one byte */ + && likely((endOnInput ? ip < shortiend : 1) & (op <= shortoend)) ) { + /* Copy the literals */ + memcpy(op, ip, endOnInput ? 16 : 8); + op += length; ip += length; + + /* The second stage: prepare for match copying, decode full info. + * If it doesn't work out, the info won't be wasted. */ + length = token & ML_MASK; /* match length */ + offset = LZ4_readLE16(ip); ip += 2; + match = op - offset; + assert(match <= op); /* check overflow */ + + /* Do not deal with overlapping matches. */ + if ( (length != ML_MASK) + && (offset >= 8) + && (dict==withPrefix64k || match >= lowPrefix) ) { + /* Copy the match. */ + memcpy(op + 0, match + 0, 8); + memcpy(op + 8, match + 8, 8); + memcpy(op +16, match +16, 2); + op += length + MINMATCH; + /* Both stages worked, load the next token. */ + continue; + } + + /* The second stage didn't work out, but the info is ready. + * Propel it right to the point of match copying. */ + goto _copy_match; + } + + /* decode literal length */ + if (length == RUN_MASK) { + variable_length_error error = ok; + length += read_variable_length(&ip, iend-RUN_MASK, endOnInput, endOnInput, &error); + if (error == initial_error) { goto _output_error; } + if ((safeDecode) && unlikely((uptrval)(op)+length<(uptrval)(op))) { goto _output_error; } /* overflow detection */ + if ((safeDecode) && unlikely((uptrval)(ip)+length<(uptrval)(ip))) { goto _output_error; } /* overflow detection */ + } + + /* copy literals */ + cpy = op+length; +#if LZ4_FAST_DEC_LOOP + safe_literal_copy: +#endif + LZ4_STATIC_ASSERT(MFLIMIT >= WILDCOPYLENGTH); + if ( ((endOnInput) && ((cpy>oend-MFLIMIT) || (ip+length>iend-(2+1+LASTLITERALS))) ) + || ((!endOnInput) && (cpy>oend-WILDCOPYLENGTH)) ) + { + /* We've either hit the input parsing restriction or the output parsing restriction. + * If we've hit the input parsing condition then this must be the last sequence. + * If we've hit the output parsing condition then we are either using partialDecoding + * or we've hit the output parsing condition. + */ + if (partialDecoding) { + /* Since we are partial decoding we may be in this block because of the output parsing + * restriction, which is not valid since the output buffer is allowed to be undersized. + */ + assert(endOnInput); + /* If we're in this block because of the input parsing condition, then we must be on the + * last sequence (or invalid), so we must check that we exactly consume the input. + */ + if ((ip+length>iend-(2+1+LASTLITERALS)) && (ip+length != iend)) { goto _output_error; } + assert(ip+length <= iend); + /* We are finishing in the middle of a literals segment. + * Break after the copy. + */ + if (cpy > oend) { + cpy = oend; + assert(op<=oend); + length = (size_t)(oend-op); + } + assert(ip+length <= iend); + } else { + /* We must be on the last sequence because of the parsing limitations so check + * that we exactly regenerate the original size (must be exact when !endOnInput). + */ + if ((!endOnInput) && (cpy != oend)) { goto _output_error; } + /* We must be on the last sequence (or invalid) because of the parsing limitations + * so check that we exactly consume the input and don't overrun the output buffer. + */ + if ((endOnInput) && ((ip+length != iend) || (cpy > oend))) { goto _output_error; } + } + memmove(op, ip, length); /* supports overlapping memory regions, which only matters for in-place decompression scenarios */ + ip += length; + op += length; + /* Necessarily EOF when !partialDecoding. When partialDecoding + * it is EOF if we've either filled the output buffer or hit + * the input parsing restriction. + */ + if (!partialDecoding || (cpy == oend) || (ip == iend)) { + break; + } + } else { + LZ4_wildCopy8(op, ip, cpy); /* may overwrite up to WILDCOPYLENGTH beyond cpy */ + ip += length; op = cpy; + } + + /* get offset */ + offset = LZ4_readLE16(ip); ip+=2; + match = op - offset; + + /* get matchlength */ + length = token & ML_MASK; + + _copy_match: + if (length == ML_MASK) { + variable_length_error error = ok; + length += read_variable_length(&ip, iend - LASTLITERALS + 1, endOnInput, 0, &error); + if (error != ok) goto _output_error; + if ((safeDecode) && unlikely((uptrval)(op)+length<(uptrval)op)) goto _output_error; /* overflow detection */ + } + length += MINMATCH; + +#if LZ4_FAST_DEC_LOOP + safe_match_copy: +#endif + if ((checkOffset) && (unlikely(match + dictSize < lowPrefix))) goto _output_error; /* Error : offset outside buffers */ + /* match starting within external dictionary */ + if ((dict==usingExtDict) && (match < lowPrefix)) { + if (unlikely(op+length > oend-LASTLITERALS)) { + if (partialDecoding) length = MIN(length, (size_t)(oend-op)); + else goto _output_error; /* doesn't respect parsing restriction */ + } + + if (length <= (size_t)(lowPrefix-match)) { + /* match fits entirely within external dictionary : just copy */ + memmove(op, dictEnd - (lowPrefix-match), length); + op += length; + } else { + /* match stretches into both external dictionary and current block */ + size_t const copySize = (size_t)(lowPrefix - match); + size_t const restSize = length - copySize; + memcpy(op, dictEnd - copySize, copySize); + op += copySize; + if (restSize > (size_t)(op - lowPrefix)) { /* overlap copy */ + BYTE* const endOfMatch = op + restSize; + const BYTE* copyFrom = lowPrefix; + while (op < endOfMatch) *op++ = *copyFrom++; + } else { + memcpy(op, lowPrefix, restSize); + op += restSize; + } } + continue; + } + assert(match >= lowPrefix); + + /* copy match within block */ + cpy = op + length; + + /* partialDecoding : may end anywhere within the block */ + assert(op<=oend); + if (partialDecoding && (cpy > oend-MATCH_SAFEGUARD_DISTANCE)) { + size_t const mlen = MIN(length, (size_t)(oend-op)); + const BYTE* const matchEnd = match + mlen; + BYTE* const copyEnd = op + mlen; + if (matchEnd > op) { /* overlap copy */ + while (op < copyEnd) { *op++ = *match++; } + } else { + memcpy(op, match, mlen); + } + op = copyEnd; + if (op == oend) { break; } + continue; + } + + if (unlikely(offset<8)) { + LZ4_write32(op, 0); /* silence msan warning when offset==0 */ + op[0] = match[0]; + op[1] = match[1]; + op[2] = match[2]; + op[3] = match[3]; + match += inc32table[offset]; + memcpy(op+4, match, 4); + match -= dec64table[offset]; + } else { + memcpy(op, match, 8); + match += 8; + } + op += 8; + + if (unlikely(cpy > oend-MATCH_SAFEGUARD_DISTANCE)) { + BYTE* const oCopyLimit = oend - (WILDCOPYLENGTH-1); + if (cpy > oend-LASTLITERALS) { goto _output_error; } /* Error : last LASTLITERALS bytes must be literals (uncompressed) */ + if (op < oCopyLimit) { + LZ4_wildCopy8(op, match, oCopyLimit); + match += oCopyLimit - op; + op = oCopyLimit; + } + while (op < cpy) { *op++ = *match++; } + } else { + memcpy(op, match, 8); + if (length > 16) { LZ4_wildCopy8(op+8, match+8, cpy); } + } + op = cpy; /* wildcopy correction */ + } + + /* end of decoding */ + if (endOnInput) { + return (int) (((char*)op)-dst); /* Nb of output bytes decoded */ + } else { + return (int) (((const char*)ip)-src); /* Nb of input bytes read */ + } + + /* Overflow error detected */ + _output_error: + return (int) (-(((const char*)ip)-src))-1; + } +} + + +/*===== Instantiate the API decoding functions. =====*/ + +LZ4_FORCE_O2_GCC_PPC64LE +int LZ4_decompress_safe(const char* source, char* dest, int compressedSize, int maxDecompressedSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxDecompressedSize, + endOnInputSize, decode_full_block, noDict, + (BYTE*)dest, NULL, 0); +} + +LZ4_FORCE_O2_GCC_PPC64LE +int LZ4_decompress_safe_partial(const char* src, char* dst, int compressedSize, int targetOutputSize, int dstCapacity) +{ + dstCapacity = MIN(targetOutputSize, dstCapacity); + return LZ4_decompress_generic(src, dst, compressedSize, dstCapacity, + endOnInputSize, partial_decode, + noDict, (BYTE*)dst, NULL, 0); +} + +LZ4_FORCE_O2_GCC_PPC64LE +int LZ4_decompress_fast(const char* source, char* dest, int originalSize) +{ + return LZ4_decompress_generic(source, dest, 0, originalSize, + endOnOutputSize, decode_full_block, withPrefix64k, + (BYTE*)dest - 64 KB, NULL, 0); +} + +/*===== Instantiate a few more decoding cases, used more than once. =====*/ + +LZ4_FORCE_O2_GCC_PPC64LE /* Exported, an obsolete API function. */ +int LZ4_decompress_safe_withPrefix64k(const char* source, char* dest, int compressedSize, int maxOutputSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, + endOnInputSize, decode_full_block, withPrefix64k, + (BYTE*)dest - 64 KB, NULL, 0); +} + +/* Another obsolete API function, paired with the previous one. */ +int LZ4_decompress_fast_withPrefix64k(const char* source, char* dest, int originalSize) +{ + /* LZ4_decompress_fast doesn't validate match offsets, + * and thus serves well with any prefixed dictionary. */ + return LZ4_decompress_fast(source, dest, originalSize); +} + +LZ4_FORCE_O2_GCC_PPC64LE +static int LZ4_decompress_safe_withSmallPrefix(const char* source, char* dest, int compressedSize, int maxOutputSize, + size_t prefixSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, + endOnInputSize, decode_full_block, noDict, + (BYTE*)dest-prefixSize, NULL, 0); +} + +LZ4_FORCE_O2_GCC_PPC64LE +int LZ4_decompress_safe_forceExtDict(const char* source, char* dest, + int compressedSize, int maxOutputSize, + const void* dictStart, size_t dictSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, + endOnInputSize, decode_full_block, usingExtDict, + (BYTE*)dest, (const BYTE*)dictStart, dictSize); +} + +LZ4_FORCE_O2_GCC_PPC64LE +static int LZ4_decompress_fast_extDict(const char* source, char* dest, int originalSize, + const void* dictStart, size_t dictSize) +{ + return LZ4_decompress_generic(source, dest, 0, originalSize, + endOnOutputSize, decode_full_block, usingExtDict, + (BYTE*)dest, (const BYTE*)dictStart, dictSize); +} + +/* The "double dictionary" mode, for use with e.g. ring buffers: the first part + * of the dictionary is passed as prefix, and the second via dictStart + dictSize. + * These routines are used only once, in LZ4_decompress_*_continue(). + */ +LZ4_FORCE_INLINE +int LZ4_decompress_safe_doubleDict(const char* source, char* dest, int compressedSize, int maxOutputSize, + size_t prefixSize, const void* dictStart, size_t dictSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, + endOnInputSize, decode_full_block, usingExtDict, + (BYTE*)dest-prefixSize, (const BYTE*)dictStart, dictSize); +} + +LZ4_FORCE_INLINE +int LZ4_decompress_fast_doubleDict(const char* source, char* dest, int originalSize, + size_t prefixSize, const void* dictStart, size_t dictSize) +{ + return LZ4_decompress_generic(source, dest, 0, originalSize, + endOnOutputSize, decode_full_block, usingExtDict, + (BYTE*)dest-prefixSize, (const BYTE*)dictStart, dictSize); +} + +/*===== streaming decompression functions =====*/ + +LZ4_streamDecode_t* LZ4_createStreamDecode(void) +{ + LZ4_streamDecode_t* lz4s = (LZ4_streamDecode_t*) ALLOC_AND_ZERO(sizeof(LZ4_streamDecode_t)); + LZ4_STATIC_ASSERT(LZ4_STREAMDECODESIZE >= sizeof(LZ4_streamDecode_t_internal)); /* A compilation error here means LZ4_STREAMDECODESIZE is not large enough */ + return lz4s; +} + +int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream) +{ + if (LZ4_stream == NULL) { return 0; } /* support free on NULL */ + FREEMEM(LZ4_stream); + return 0; +} + +/*! LZ4_setStreamDecode() : + * Use this function to instruct where to find the dictionary. + * This function is not necessary if previous data is still available where it was decoded. + * Loading a size of 0 is allowed (same effect as no dictionary). + * @return : 1 if OK, 0 if error + */ +int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize) +{ + LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse; + lz4sd->prefixSize = (size_t) dictSize; + lz4sd->prefixEnd = (const BYTE*) dictionary + dictSize; + lz4sd->externalDict = NULL; + lz4sd->extDictSize = 0; + return 1; +} + +/*! LZ4_decoderRingBufferSize() : + * when setting a ring buffer for streaming decompression (optional scenario), + * provides the minimum size of this ring buffer + * to be compatible with any source respecting maxBlockSize condition. + * Note : in a ring buffer scenario, + * blocks are presumed decompressed next to each other. + * When not enough space remains for next block (remainingSize < maxBlockSize), + * decoding resumes from beginning of ring buffer. + * @return : minimum ring buffer size, + * or 0 if there is an error (invalid maxBlockSize). + */ +int LZ4_decoderRingBufferSize(int maxBlockSize) +{ + if (maxBlockSize < 0) return 0; + if (maxBlockSize > LZ4_MAX_INPUT_SIZE) return 0; + if (maxBlockSize < 16) maxBlockSize = 16; + return LZ4_DECODER_RING_BUFFER_SIZE(maxBlockSize); +} + +/* +*_continue() : + These decoding functions allow decompression of multiple blocks in "streaming" mode. + Previously decoded blocks must still be available at the memory position where they were decoded. + If it's not possible, save the relevant part of decoded data into a safe buffer, + and indicate where it stands using LZ4_setStreamDecode() +*/ +LZ4_FORCE_O2_GCC_PPC64LE +int LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int compressedSize, int maxOutputSize) +{ + LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse; + int result; + + if (lz4sd->prefixSize == 0) { + /* The first call, no dictionary yet. */ + assert(lz4sd->extDictSize == 0); + result = LZ4_decompress_safe(source, dest, compressedSize, maxOutputSize); + if (result <= 0) return result; + lz4sd->prefixSize = (size_t)result; + lz4sd->prefixEnd = (BYTE*)dest + result; + } else if (lz4sd->prefixEnd == (BYTE*)dest) { + /* They're rolling the current segment. */ + if (lz4sd->prefixSize >= 64 KB - 1) + result = LZ4_decompress_safe_withPrefix64k(source, dest, compressedSize, maxOutputSize); + else if (lz4sd->extDictSize == 0) + result = LZ4_decompress_safe_withSmallPrefix(source, dest, compressedSize, maxOutputSize, + lz4sd->prefixSize); + else + result = LZ4_decompress_safe_doubleDict(source, dest, compressedSize, maxOutputSize, + lz4sd->prefixSize, lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize += (size_t)result; + lz4sd->prefixEnd += result; + } else { + /* The buffer wraps around, or they're switching to another buffer. */ + lz4sd->extDictSize = lz4sd->prefixSize; + lz4sd->externalDict = lz4sd->prefixEnd - lz4sd->extDictSize; + result = LZ4_decompress_safe_forceExtDict(source, dest, compressedSize, maxOutputSize, + lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize = (size_t)result; + lz4sd->prefixEnd = (BYTE*)dest + result; + } + + return result; +} + +LZ4_FORCE_O2_GCC_PPC64LE +int LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int originalSize) +{ + LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse; + int result; + assert(originalSize >= 0); + + if (lz4sd->prefixSize == 0) { + assert(lz4sd->extDictSize == 0); + result = LZ4_decompress_fast(source, dest, originalSize); + if (result <= 0) return result; + lz4sd->prefixSize = (size_t)originalSize; + lz4sd->prefixEnd = (BYTE*)dest + originalSize; + } else if (lz4sd->prefixEnd == (BYTE*)dest) { + if (lz4sd->prefixSize >= 64 KB - 1 || lz4sd->extDictSize == 0) + result = LZ4_decompress_fast(source, dest, originalSize); + else + result = LZ4_decompress_fast_doubleDict(source, dest, originalSize, + lz4sd->prefixSize, lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize += (size_t)originalSize; + lz4sd->prefixEnd += originalSize; + } else { + lz4sd->extDictSize = lz4sd->prefixSize; + lz4sd->externalDict = lz4sd->prefixEnd - lz4sd->extDictSize; + result = LZ4_decompress_fast_extDict(source, dest, originalSize, + lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize = (size_t)originalSize; + lz4sd->prefixEnd = (BYTE*)dest + originalSize; + } + + return result; +} + + +/* +Advanced decoding functions : +*_usingDict() : + These decoding functions work the same as "_continue" ones, + the dictionary must be explicitly provided within parameters +*/ + +int LZ4_decompress_safe_usingDict(const char* source, char* dest, int compressedSize, int maxOutputSize, const char* dictStart, int dictSize) +{ + if (dictSize==0) + return LZ4_decompress_safe(source, dest, compressedSize, maxOutputSize); + if (dictStart+dictSize == dest) { + if (dictSize >= 64 KB - 1) { + return LZ4_decompress_safe_withPrefix64k(source, dest, compressedSize, maxOutputSize); + } + assert(dictSize >= 0); + return LZ4_decompress_safe_withSmallPrefix(source, dest, compressedSize, maxOutputSize, (size_t)dictSize); + } + assert(dictSize >= 0); + return LZ4_decompress_safe_forceExtDict(source, dest, compressedSize, maxOutputSize, dictStart, (size_t)dictSize); +} + +int LZ4_decompress_fast_usingDict(const char* source, char* dest, int originalSize, const char* dictStart, int dictSize) +{ + if (dictSize==0 || dictStart+dictSize == dest) + return LZ4_decompress_fast(source, dest, originalSize); + assert(dictSize >= 0); + return LZ4_decompress_fast_extDict(source, dest, originalSize, dictStart, (size_t)dictSize); +} + + +/*=************************************************* +* Obsolete Functions +***************************************************/ +/* obsolete compression functions */ +int LZ4_compress_limitedOutput(const char* source, char* dest, int inputSize, int maxOutputSize) +{ + return LZ4_compress_default(source, dest, inputSize, maxOutputSize); +} +int LZ4_compress(const char* src, char* dest, int srcSize) +{ + return LZ4_compress_default(src, dest, srcSize, LZ4_compressBound(srcSize)); +} +int LZ4_compress_limitedOutput_withState (void* state, const char* src, char* dst, int srcSize, int dstSize) +{ + return LZ4_compress_fast_extState(state, src, dst, srcSize, dstSize, 1); +} +int LZ4_compress_withState (void* state, const char* src, char* dst, int srcSize) +{ + return LZ4_compress_fast_extState(state, src, dst, srcSize, LZ4_compressBound(srcSize), 1); +} +int LZ4_compress_limitedOutput_continue (LZ4_stream_t* LZ4_stream, const char* src, char* dst, int srcSize, int dstCapacity) +{ + return LZ4_compress_fast_continue(LZ4_stream, src, dst, srcSize, dstCapacity, 1); +} +int LZ4_compress_continue (LZ4_stream_t* LZ4_stream, const char* source, char* dest, int inputSize) +{ + return LZ4_compress_fast_continue(LZ4_stream, source, dest, inputSize, LZ4_compressBound(inputSize), 1); +} + +/* +These decompression functions are deprecated and should no longer be used. +They are only provided here for compatibility with older user programs. +- LZ4_uncompress is totally equivalent to LZ4_decompress_fast +- LZ4_uncompress_unknownOutputSize is totally equivalent to LZ4_decompress_safe +*/ +int LZ4_uncompress (const char* source, char* dest, int outputSize) +{ + return LZ4_decompress_fast(source, dest, outputSize); +} +int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize) +{ + return LZ4_decompress_safe(source, dest, isize, maxOutputSize); +} + +/* Obsolete Streaming functions */ + +int LZ4_sizeofStreamState() { return LZ4_STREAMSIZE; } + +int LZ4_resetStreamState(void* state, char* inputBuffer) +{ + (void)inputBuffer; + LZ4_resetStream((LZ4_stream_t*)state); + return 0; +} + +void* LZ4_create (char* inputBuffer) +{ + (void)inputBuffer; + return LZ4_createStream(); +} + +char* LZ4_slideInputBuffer (void* state) +{ + /* avoid const char * -> char * conversion warning */ + return (char *)(uptrval)((LZ4_stream_t*)state)->internal_donotuse.dictionary; +} + +#endif /* LZ4_COMMONDEFS_ONLY */ diff --git a/common/lz4/lz4.h b/common/lz4/lz4.h new file mode 100644 index 000000000..32108e232 --- /dev/null +++ b/common/lz4/lz4.h @@ -0,0 +1,764 @@ +/* + * LZ4 - Fast LZ compression algorithm + * Header File + * Copyright (C) 2011-present, Yann Collet. + + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * 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 COPYRIGHT HOLDERS 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 COPYRIGHT + OWNER 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. + + You can contact the author at : + - LZ4 homepage : http://www.lz4.org + - LZ4 source repository : https://github.com/lz4/lz4 +*/ +#if defined (__cplusplus) +extern "C" { +#endif + +#ifndef LZ4_H_2983827168210 +#define LZ4_H_2983827168210 + +/* --- Dependency --- */ +#include <stddef.h> /* size_t */ + + +/** + Introduction + + LZ4 is lossless compression algorithm, providing compression speed >500 MB/s per core, + scalable with multi-cores CPU. It features an extremely fast decoder, with speed in + multiple GB/s per core, typically reaching RAM speed limits on multi-core systems. + + The LZ4 compression library provides in-memory compression and decompression functions. + It gives full buffer control to user. + Compression can be done in: + - a single step (described as Simple Functions) + - a single step, reusing a context (described in Advanced Functions) + - unbounded multiple steps (described as Streaming compression) + + lz4.h generates and decodes LZ4-compressed blocks (doc/lz4_Block_format.md). + Decompressing such a compressed block requires additional metadata. + Exact metadata depends on exact decompression function. + For the typical case of LZ4_decompress_safe(), + metadata includes block's compressed size, and maximum bound of decompressed size. + Each application is free to encode and pass such metadata in whichever way it wants. + + lz4.h only handle blocks, it can not generate Frames. + + Blocks are different from Frames (doc/lz4_Frame_format.md). + Frames bundle both blocks and metadata in a specified manner. + Embedding metadata is required for compressed data to be self-contained and portable. + Frame format is delivered through a companion API, declared in lz4frame.h. + The `lz4` CLI can only manage frames. +*/ + +/*^*************************************************************** +* Export parameters +*****************************************************************/ +/* +* LZ4_DLL_EXPORT : +* Enable exporting of functions when building a Windows DLL +* LZ4LIB_VISIBILITY : +* Control library symbols visibility. +*/ +#ifndef LZ4LIB_VISIBILITY +# if defined(__GNUC__) && (__GNUC__ >= 4) +# define LZ4LIB_VISIBILITY __attribute__ ((visibility ("default"))) +# else +# define LZ4LIB_VISIBILITY +# endif +#endif +#if defined(LZ4_DLL_EXPORT) && (LZ4_DLL_EXPORT==1) +# define LZ4LIB_API __declspec(dllexport) LZ4LIB_VISIBILITY +#elif defined(LZ4_DLL_IMPORT) && (LZ4_DLL_IMPORT==1) +# define LZ4LIB_API __declspec(dllimport) LZ4LIB_VISIBILITY /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ +#else +# define LZ4LIB_API LZ4LIB_VISIBILITY +#endif + +/*------ Version ------*/ +#define LZ4_VERSION_MAJOR 1 /* for breaking interface changes */ +#define LZ4_VERSION_MINOR 9 /* for new (non-breaking) interface capabilities */ +#define LZ4_VERSION_RELEASE 2 /* for tweaks, bug-fixes, or development */ + +#define LZ4_VERSION_NUMBER (LZ4_VERSION_MAJOR *100*100 + LZ4_VERSION_MINOR *100 + LZ4_VERSION_RELEASE) + +#define LZ4_LIB_VERSION LZ4_VERSION_MAJOR.LZ4_VERSION_MINOR.LZ4_VERSION_RELEASE +#define LZ4_QUOTE(str) #str +#define LZ4_EXPAND_AND_QUOTE(str) LZ4_QUOTE(str) +#define LZ4_VERSION_STRING LZ4_EXPAND_AND_QUOTE(LZ4_LIB_VERSION) + +LZ4LIB_API int LZ4_versionNumber (void); /**< library version number; useful to check dll version */ +LZ4LIB_API const char* LZ4_versionString (void); /**< library version string; useful to check dll version */ + + +/*-************************************ +* Tuning parameter +**************************************/ +/*! + * LZ4_MEMORY_USAGE : + * Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; etc.) + * Increasing memory usage improves compression ratio. + * Reduced memory usage may improve speed, thanks to better cache locality. + * Default value is 14, for 16KB, which nicely fits into Intel x86 L1 cache + */ +#ifndef LZ4_MEMORY_USAGE +# define LZ4_MEMORY_USAGE 14 +#endif + + +/*-************************************ +* Simple Functions +**************************************/ +/*! LZ4_compress_default() : + * Compresses 'srcSize' bytes from buffer 'src' + * into already allocated 'dst' buffer of size 'dstCapacity'. + * Compression is guaranteed to succeed if 'dstCapacity' >= LZ4_compressBound(srcSize). + * It also runs faster, so it's a recommended setting. + * If the function cannot compress 'src' into a more limited 'dst' budget, + * compression stops *immediately*, and the function result is zero. + * In which case, 'dst' content is undefined (invalid). + * srcSize : max supported value is LZ4_MAX_INPUT_SIZE. + * dstCapacity : size of buffer 'dst' (which must be already allocated) + * @return : the number of bytes written into buffer 'dst' (necessarily <= dstCapacity) + * or 0 if compression fails + * Note : This function is protected against buffer overflow scenarios (never writes outside 'dst' buffer, nor read outside 'source' buffer). + */ +LZ4LIB_API int LZ4_compress_default(const char* src, char* dst, int srcSize, int dstCapacity); + +/*! LZ4_decompress_safe() : + * compressedSize : is the exact complete size of the compressed block. + * dstCapacity : is the size of destination buffer (which must be already allocated), presumed an upper bound of decompressed size. + * @return : the number of bytes decompressed into destination buffer (necessarily <= dstCapacity) + * If destination buffer is not large enough, decoding will stop and output an error code (negative value). + * If the source stream is detected malformed, the function will stop decoding and return a negative result. + * Note 1 : This function is protected against malicious data packets : + * it will never writes outside 'dst' buffer, nor read outside 'source' buffer, + * even if the compressed block is maliciously modified to order the decoder to do these actions. + * In such case, the decoder stops immediately, and considers the compressed block malformed. + * Note 2 : compressedSize and dstCapacity must be provided to the function, the compressed block does not contain them. + * The implementation is free to send / store / derive this information in whichever way is most beneficial. + * If there is a need for a different format which bundles together both compressed data and its metadata, consider looking at lz4frame.h instead. + */ +LZ4LIB_API int LZ4_decompress_safe (const char* src, char* dst, int compressedSize, int dstCapacity); + + +/*-************************************ +* Advanced Functions +**************************************/ +#define LZ4_MAX_INPUT_SIZE 0x7E000000 /* 2 113 929 216 bytes */ +#define LZ4_COMPRESSBOUND(isize) ((unsigned)(isize) > (unsigned)LZ4_MAX_INPUT_SIZE ? 0 : (isize) + ((isize)/255) + 16) + +/*! LZ4_compressBound() : + Provides the maximum size that LZ4 compression may output in a "worst case" scenario (input data not compressible) + This function is primarily useful for memory allocation purposes (destination buffer size). + Macro LZ4_COMPRESSBOUND() is also provided for compilation-time evaluation (stack memory allocation for example). + Note that LZ4_compress_default() compresses faster when dstCapacity is >= LZ4_compressBound(srcSize) + inputSize : max supported value is LZ4_MAX_INPUT_SIZE + return : maximum output size in a "worst case" scenario + or 0, if input size is incorrect (too large or negative) +*/ +LZ4LIB_API int LZ4_compressBound(int inputSize); + +/*! LZ4_compress_fast() : + Same as LZ4_compress_default(), but allows selection of "acceleration" factor. + The larger the acceleration value, the faster the algorithm, but also the lesser the compression. + It's a trade-off. It can be fine tuned, with each successive value providing roughly +~3% to speed. + An acceleration value of "1" is the same as regular LZ4_compress_default() + Values <= 0 will be replaced by ACCELERATION_DEFAULT (currently == 1, see lz4.c). +*/ +LZ4LIB_API int LZ4_compress_fast (const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); + + +/*! LZ4_compress_fast_extState() : + * Same as LZ4_compress_fast(), using an externally allocated memory space for its state. + * Use LZ4_sizeofState() to know how much memory must be allocated, + * and allocate it on 8-bytes boundaries (using `malloc()` typically). + * Then, provide this buffer as `void* state` to compression function. + */ +LZ4LIB_API int LZ4_sizeofState(void); +LZ4LIB_API int LZ4_compress_fast_extState (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); + + +/*! LZ4_compress_destSize() : + * Reverse the logic : compresses as much data as possible from 'src' buffer + * into already allocated buffer 'dst', of size >= 'targetDestSize'. + * This function either compresses the entire 'src' content into 'dst' if it's large enough, + * or fill 'dst' buffer completely with as much data as possible from 'src'. + * note: acceleration parameter is fixed to "default". + * + * *srcSizePtr : will be modified to indicate how many bytes where read from 'src' to fill 'dst'. + * New value is necessarily <= input value. + * @return : Nb bytes written into 'dst' (necessarily <= targetDestSize) + * or 0 if compression fails. +*/ +LZ4LIB_API int LZ4_compress_destSize (const char* src, char* dst, int* srcSizePtr, int targetDstSize); + + +/*! LZ4_decompress_safe_partial() : + * Decompress an LZ4 compressed block, of size 'srcSize' at position 'src', + * into destination buffer 'dst' of size 'dstCapacity'. + * Up to 'targetOutputSize' bytes will be decoded. + * The function stops decoding on reaching this objective, + * which can boost performance when only the beginning of a block is required. + * + * @return : the number of bytes decoded in `dst` (necessarily <= dstCapacity) + * If source stream is detected malformed, function returns a negative result. + * + * Note : @return can be < targetOutputSize, if compressed block contains less data. + * + * Note 2 : this function features 2 parameters, targetOutputSize and dstCapacity, + * and expects targetOutputSize <= dstCapacity. + * It effectively stops decoding on reaching targetOutputSize, + * so dstCapacity is kind of redundant. + * This is because in a previous version of this function, + * decoding operation would not "break" a sequence in the middle. + * As a consequence, there was no guarantee that decoding would stop at exactly targetOutputSize, + * it could write more bytes, though only up to dstCapacity. + * Some "margin" used to be required for this operation to work properly. + * This is no longer necessary. + * The function nonetheless keeps its signature, in an effort to not break API. + */ +LZ4LIB_API int LZ4_decompress_safe_partial (const char* src, char* dst, int srcSize, int targetOutputSize, int dstCapacity); + + +/*-********************************************* +* Streaming Compression Functions +***********************************************/ +typedef union LZ4_stream_u LZ4_stream_t; /* incomplete type (defined later) */ + +LZ4LIB_API LZ4_stream_t* LZ4_createStream(void); +LZ4LIB_API int LZ4_freeStream (LZ4_stream_t* streamPtr); + +/*! LZ4_resetStream_fast() : v1.9.0+ + * Use this to prepare an LZ4_stream_t for a new chain of dependent blocks + * (e.g., LZ4_compress_fast_continue()). + * + * An LZ4_stream_t must be initialized once before usage. + * This is automatically done when created by LZ4_createStream(). + * However, should the LZ4_stream_t be simply declared on stack (for example), + * it's necessary to initialize it first, using LZ4_initStream(). + * + * After init, start any new stream with LZ4_resetStream_fast(). + * A same LZ4_stream_t can be re-used multiple times consecutively + * and compress multiple streams, + * provided that it starts each new stream with LZ4_resetStream_fast(). + * + * LZ4_resetStream_fast() is much faster than LZ4_initStream(), + * but is not compatible with memory regions containing garbage data. + * + * Note: it's only useful to call LZ4_resetStream_fast() + * in the context of streaming compression. + * The *extState* functions perform their own resets. + * Invoking LZ4_resetStream_fast() before is redundant, and even counterproductive. + */ +LZ4LIB_API void LZ4_resetStream_fast (LZ4_stream_t* streamPtr); + +/*! LZ4_loadDict() : + * Use this function to reference a static dictionary into LZ4_stream_t. + * The dictionary must remain available during compression. + * LZ4_loadDict() triggers a reset, so any previous data will be forgotten. + * The same dictionary will have to be loaded on decompression side for successful decoding. + * Dictionary are useful for better compression of small data (KB range). + * While LZ4 accept any input as dictionary, + * results are generally better when using Zstandard's Dictionary Builder. + * Loading a size of 0 is allowed, and is the same as reset. + * @return : loaded dictionary size, in bytes (necessarily <= 64 KB) + */ +LZ4LIB_API int LZ4_loadDict (LZ4_stream_t* streamPtr, const char* dictionary, int dictSize); + +/*! LZ4_compress_fast_continue() : + * Compress 'src' content using data from previously compressed blocks, for better compression ratio. + * 'dst' buffer must be already allocated. + * If dstCapacity >= LZ4_compressBound(srcSize), compression is guaranteed to succeed, and runs faster. + * + * @return : size of compressed block + * or 0 if there is an error (typically, cannot fit into 'dst'). + * + * Note 1 : Each invocation to LZ4_compress_fast_continue() generates a new block. + * Each block has precise boundaries. + * Each block must be decompressed separately, calling LZ4_decompress_*() with relevant metadata. + * It's not possible to append blocks together and expect a single invocation of LZ4_decompress_*() to decompress them together. + * + * Note 2 : The previous 64KB of source data is __assumed__ to remain present, unmodified, at same address in memory ! + * + * Note 3 : When input is structured as a double-buffer, each buffer can have any size, including < 64 KB. + * Make sure that buffers are separated, by at least one byte. + * This construction ensures that each block only depends on previous block. + * + * Note 4 : If input buffer is a ring-buffer, it can have any size, including < 64 KB. + * + * Note 5 : After an error, the stream status is undefined (invalid), it can only be reset or freed. + */ +LZ4LIB_API int LZ4_compress_fast_continue (LZ4_stream_t* streamPtr, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); + +/*! LZ4_saveDict() : + * If last 64KB data cannot be guaranteed to remain available at its current memory location, + * save it into a safer place (char* safeBuffer). + * This is schematically equivalent to a memcpy() followed by LZ4_loadDict(), + * but is much faster, because LZ4_saveDict() doesn't need to rebuild tables. + * @return : saved dictionary size in bytes (necessarily <= maxDictSize), or 0 if error. + */ +LZ4LIB_API int LZ4_saveDict (LZ4_stream_t* streamPtr, char* safeBuffer, int maxDictSize); + + +/*-********************************************** +* Streaming Decompression Functions +* Bufferless synchronous API +************************************************/ +typedef union LZ4_streamDecode_u LZ4_streamDecode_t; /* tracking context */ + +/*! LZ4_createStreamDecode() and LZ4_freeStreamDecode() : + * creation / destruction of streaming decompression tracking context. + * A tracking context can be re-used multiple times. + */ +LZ4LIB_API LZ4_streamDecode_t* LZ4_createStreamDecode(void); +LZ4LIB_API int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream); + +/*! LZ4_setStreamDecode() : + * An LZ4_streamDecode_t context can be allocated once and re-used multiple times. + * Use this function to start decompression of a new stream of blocks. + * A dictionary can optionally be set. Use NULL or size 0 for a reset order. + * Dictionary is presumed stable : it must remain accessible and unmodified during next decompression. + * @return : 1 if OK, 0 if error + */ +LZ4LIB_API int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize); + +/*! LZ4_decoderRingBufferSize() : v1.8.2+ + * Note : in a ring buffer scenario (optional), + * blocks are presumed decompressed next to each other + * up to the moment there is not enough remaining space for next block (remainingSize < maxBlockSize), + * at which stage it resumes from beginning of ring buffer. + * When setting such a ring buffer for streaming decompression, + * provides the minimum size of this ring buffer + * to be compatible with any source respecting maxBlockSize condition. + * @return : minimum ring buffer size, + * or 0 if there is an error (invalid maxBlockSize). + */ +LZ4LIB_API int LZ4_decoderRingBufferSize(int maxBlockSize); +#define LZ4_DECODER_RING_BUFFER_SIZE(maxBlockSize) (65536 + 14 + (maxBlockSize)) /* for static allocation; maxBlockSize presumed valid */ + +/*! LZ4_decompress_*_continue() : + * These decoding functions allow decompression of consecutive blocks in "streaming" mode. + * A block is an unsplittable entity, it must be presented entirely to a decompression function. + * Decompression functions only accepts one block at a time. + * The last 64KB of previously decoded data *must* remain available and unmodified at the memory position where they were decoded. + * If less than 64KB of data has been decoded, all the data must be present. + * + * Special : if decompression side sets a ring buffer, it must respect one of the following conditions : + * - Decompression buffer size is _at least_ LZ4_decoderRingBufferSize(maxBlockSize). + * maxBlockSize is the maximum size of any single block. It can have any value > 16 bytes. + * In which case, encoding and decoding buffers do not need to be synchronized. + * Actually, data can be produced by any source compliant with LZ4 format specification, and respecting maxBlockSize. + * - Synchronized mode : + * Decompression buffer size is _exactly_ the same as compression buffer size, + * and follows exactly same update rule (block boundaries at same positions), + * and decoding function is provided with exact decompressed size of each block (exception for last block of the stream), + * _then_ decoding & encoding ring buffer can have any size, including small ones ( < 64 KB). + * - Decompression buffer is larger than encoding buffer, by a minimum of maxBlockSize more bytes. + * In which case, encoding and decoding buffers do not need to be synchronized, + * and encoding ring buffer can have any size, including small ones ( < 64 KB). + * + * Whenever these conditions are not possible, + * save the last 64KB of decoded data into a safe buffer where it can't be modified during decompression, + * then indicate where this data is saved using LZ4_setStreamDecode(), before decompressing next block. +*/ +LZ4LIB_API int LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* src, char* dst, int srcSize, int dstCapacity); + + +/*! LZ4_decompress_*_usingDict() : + * These decoding functions work the same as + * a combination of LZ4_setStreamDecode() followed by LZ4_decompress_*_continue() + * They are stand-alone, and don't need an LZ4_streamDecode_t structure. + * Dictionary is presumed stable : it must remain accessible and unmodified during decompression. + * Performance tip : Decompression speed can be substantially increased + * when dst == dictStart + dictSize. + */ +LZ4LIB_API int LZ4_decompress_safe_usingDict (const char* src, char* dst, int srcSize, int dstCapcity, const char* dictStart, int dictSize); + +#endif /* LZ4_H_2983827168210 */ + + +/*^************************************* + * !!!!!! STATIC LINKING ONLY !!!!!! + ***************************************/ + +/*-**************************************************************************** + * Experimental section + * + * Symbols declared in this section must be considered unstable. Their + * signatures or semantics may change, or they may be removed altogether in the + * future. They are therefore only safe to depend on when the caller is + * statically linked against the library. + * + * To protect against unsafe usage, not only are the declarations guarded, + * the definitions are hidden by default + * when building LZ4 as a shared/dynamic library. + * + * In order to access these declarations, + * define LZ4_STATIC_LINKING_ONLY in your application + * before including LZ4's headers. + * + * In order to make their implementations accessible dynamically, you must + * define LZ4_PUBLISH_STATIC_FUNCTIONS when building the LZ4 library. + ******************************************************************************/ + +#ifdef LZ4_STATIC_LINKING_ONLY + +#ifndef LZ4_STATIC_3504398509 +#define LZ4_STATIC_3504398509 + +#ifdef LZ4_PUBLISH_STATIC_FUNCTIONS +#define LZ4LIB_STATIC_API LZ4LIB_API +#else +#define LZ4LIB_STATIC_API +#endif + + +/*! LZ4_compress_fast_extState_fastReset() : + * A variant of LZ4_compress_fast_extState(). + * + * Using this variant avoids an expensive initialization step. + * It is only safe to call if the state buffer is known to be correctly initialized already + * (see above comment on LZ4_resetStream_fast() for a definition of "correctly initialized"). + * From a high level, the difference is that + * this function initializes the provided state with a call to something like LZ4_resetStream_fast() + * while LZ4_compress_fast_extState() starts with a call to LZ4_resetStream(). + */ +LZ4LIB_STATIC_API int LZ4_compress_fast_extState_fastReset (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); + +/*! LZ4_attach_dictionary() : + * This is an experimental API that allows + * efficient use of a static dictionary many times. + * + * Rather than re-loading the dictionary buffer into a working context before + * each compression, or copying a pre-loaded dictionary's LZ4_stream_t into a + * working LZ4_stream_t, this function introduces a no-copy setup mechanism, + * in which the working stream references the dictionary stream in-place. + * + * Several assumptions are made about the state of the dictionary stream. + * Currently, only streams which have been prepared by LZ4_loadDict() should + * be expected to work. + * + * Alternatively, the provided dictionaryStream may be NULL, + * in which case any existing dictionary stream is unset. + * + * If a dictionary is provided, it replaces any pre-existing stream history. + * The dictionary contents are the only history that can be referenced and + * logically immediately precede the data compressed in the first subsequent + * compression call. + * + * The dictionary will only remain attached to the working stream through the + * first compression call, at the end of which it is cleared. The dictionary + * stream (and source buffer) must remain in-place / accessible / unchanged + * through the completion of the first compression call on the stream. + */ +LZ4LIB_STATIC_API void LZ4_attach_dictionary(LZ4_stream_t* workingStream, const LZ4_stream_t* dictionaryStream); + + +/*! In-place compression and decompression + * + * It's possible to have input and output sharing the same buffer, + * for highly contrained memory environments. + * In both cases, it requires input to lay at the end of the buffer, + * and decompression to start at beginning of the buffer. + * Buffer size must feature some margin, hence be larger than final size. + * + * |<------------------------buffer--------------------------------->| + * |<-----------compressed data--------->| + * |<-----------decompressed size------------------>| + * |<----margin---->| + * + * This technique is more useful for decompression, + * since decompressed size is typically larger, + * and margin is short. + * + * In-place decompression will work inside any buffer + * which size is >= LZ4_DECOMPRESS_INPLACE_BUFFER_SIZE(decompressedSize). + * This presumes that decompressedSize > compressedSize. + * Otherwise, it means compression actually expanded data, + * and it would be more efficient to store such data with a flag indicating it's not compressed. + * This can happen when data is not compressible (already compressed, or encrypted). + * + * For in-place compression, margin is larger, as it must be able to cope with both + * history preservation, requiring input data to remain unmodified up to LZ4_DISTANCE_MAX, + * and data expansion, which can happen when input is not compressible. + * As a consequence, buffer size requirements are much higher, + * and memory savings offered by in-place compression are more limited. + * + * There are ways to limit this cost for compression : + * - Reduce history size, by modifying LZ4_DISTANCE_MAX. + * Note that it is a compile-time constant, so all compressions will apply this limit. + * Lower values will reduce compression ratio, except when input_size < LZ4_DISTANCE_MAX, + * so it's a reasonable trick when inputs are known to be small. + * - Require the compressor to deliver a "maximum compressed size". + * This is the `dstCapacity` parameter in `LZ4_compress*()`. + * When this size is < LZ4_COMPRESSBOUND(inputSize), then compression can fail, + * in which case, the return code will be 0 (zero). + * The caller must be ready for these cases to happen, + * and typically design a backup scheme to send data uncompressed. + * The combination of both techniques can significantly reduce + * the amount of margin required for in-place compression. + * + * In-place compression can work in any buffer + * which size is >= (maxCompressedSize) + * with maxCompressedSize == LZ4_COMPRESSBOUND(srcSize) for guaranteed compression success. + * LZ4_COMPRESS_INPLACE_BUFFER_SIZE() depends on both maxCompressedSize and LZ4_DISTANCE_MAX, + * so it's possible to reduce memory requirements by playing with them. + */ + +#define LZ4_DECOMPRESS_INPLACE_MARGIN(compressedSize) (((compressedSize) >> 8) + 32) +#define LZ4_DECOMPRESS_INPLACE_BUFFER_SIZE(decompressedSize) ((decompressedSize) + LZ4_DECOMPRESS_INPLACE_MARGIN(decompressedSize)) /**< note: presumes that compressedSize < decompressedSize. note2: margin is overestimated a bit, since it could use compressedSize instead */ + +#ifndef LZ4_DISTANCE_MAX /* history window size; can be user-defined at compile time */ +# define LZ4_DISTANCE_MAX 65535 /* set to maximum value by default */ +#endif + +#define LZ4_COMPRESS_INPLACE_MARGIN (LZ4_DISTANCE_MAX + 32) /* LZ4_DISTANCE_MAX can be safely replaced by srcSize when it's smaller */ +#define LZ4_COMPRESS_INPLACE_BUFFER_SIZE(maxCompressedSize) ((maxCompressedSize) + LZ4_COMPRESS_INPLACE_MARGIN) /**< maxCompressedSize is generally LZ4_COMPRESSBOUND(inputSize), but can be set to any lower value, with the risk that compression can fail (return code 0(zero)) */ + +#endif /* LZ4_STATIC_3504398509 */ +#endif /* LZ4_STATIC_LINKING_ONLY */ + + + +#ifndef LZ4_H_98237428734687 +#define LZ4_H_98237428734687 + +/*-************************************************************ + * PRIVATE DEFINITIONS + ************************************************************** + * Do not use these definitions directly. + * They are only exposed to allow static allocation of `LZ4_stream_t` and `LZ4_streamDecode_t`. + * Accessing members will expose code to API and/or ABI break in future versions of the library. + **************************************************************/ +#define LZ4_HASHLOG (LZ4_MEMORY_USAGE-2) +#define LZ4_HASHTABLESIZE (1 << LZ4_MEMORY_USAGE) +#define LZ4_HASH_SIZE_U32 (1 << LZ4_HASHLOG) /* required as macro for static allocation */ + +#if defined(__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +#include <stdint.h> + +typedef struct LZ4_stream_t_internal LZ4_stream_t_internal; +struct LZ4_stream_t_internal { + uint32_t hashTable[LZ4_HASH_SIZE_U32]; + uint32_t currentOffset; + uint16_t dirty; + uint16_t tableType; + const uint8_t* dictionary; + const LZ4_stream_t_internal* dictCtx; + uint32_t dictSize; +}; + +typedef struct { + const uint8_t* externalDict; + size_t extDictSize; + const uint8_t* prefixEnd; + size_t prefixSize; +} LZ4_streamDecode_t_internal; + +#else + +typedef struct LZ4_stream_t_internal LZ4_stream_t_internal; +struct LZ4_stream_t_internal { + unsigned int hashTable[LZ4_HASH_SIZE_U32]; + unsigned int currentOffset; + unsigned short dirty; + unsigned short tableType; + const unsigned char* dictionary; + const LZ4_stream_t_internal* dictCtx; + unsigned int dictSize; +}; + +typedef struct { + const unsigned char* externalDict; + const unsigned char* prefixEnd; + size_t extDictSize; + size_t prefixSize; +} LZ4_streamDecode_t_internal; + +#endif + +/*! LZ4_stream_t : + * information structure to track an LZ4 stream. + * LZ4_stream_t can also be created using LZ4_createStream(), which is recommended. + * The structure definition can be convenient for static allocation + * (on stack, or as part of larger structure). + * Init this structure with LZ4_initStream() before first use. + * note : only use this definition in association with static linking ! + * this definition is not API/ABI safe, and may change in a future version. + */ +#define LZ4_STREAMSIZE_U64 ((1 << (LZ4_MEMORY_USAGE-3)) + 4 + ((sizeof(void*)==16) ? 4 : 0) /*AS-400*/ ) +#define LZ4_STREAMSIZE (LZ4_STREAMSIZE_U64 * sizeof(unsigned long long)) +union LZ4_stream_u { + unsigned long long table[LZ4_STREAMSIZE_U64]; + LZ4_stream_t_internal internal_donotuse; +} ; /* previously typedef'd to LZ4_stream_t */ + +/*! LZ4_initStream() : v1.9.0+ + * An LZ4_stream_t structure must be initialized at least once. + * This is automatically done when invoking LZ4_createStream(), + * but it's not when the structure is simply declared on stack (for example). + * + * Use LZ4_initStream() to properly initialize a newly declared LZ4_stream_t. + * It can also initialize any arbitrary buffer of sufficient size, + * and will @return a pointer of proper type upon initialization. + * + * Note : initialization fails if size and alignment conditions are not respected. + * In which case, the function will @return NULL. + * Note2: An LZ4_stream_t structure guarantees correct alignment and size. + * Note3: Before v1.9.0, use LZ4_resetStream() instead + */ +LZ4LIB_API LZ4_stream_t* LZ4_initStream (void* buffer, size_t size); + + +/*! LZ4_streamDecode_t : + * information structure to track an LZ4 stream during decompression. + * init this structure using LZ4_setStreamDecode() before first use. + * note : only use in association with static linking ! + * this definition is not API/ABI safe, + * and may change in a future version ! + */ +#define LZ4_STREAMDECODESIZE_U64 (4 + ((sizeof(void*)==16) ? 2 : 0) /*AS-400*/ ) +#define LZ4_STREAMDECODESIZE (LZ4_STREAMDECODESIZE_U64 * sizeof(unsigned long long)) +union LZ4_streamDecode_u { + unsigned long long table[LZ4_STREAMDECODESIZE_U64]; + LZ4_streamDecode_t_internal internal_donotuse; +} ; /* previously typedef'd to LZ4_streamDecode_t */ + + + +/*-************************************ +* Obsolete Functions +**************************************/ + +/*! Deprecation warnings + * + * Deprecated functions make the compiler generate a warning when invoked. + * This is meant to invite users to update their source code. + * Should deprecation warnings be a problem, it is generally possible to disable them, + * typically with -Wno-deprecated-declarations for gcc + * or _CRT_SECURE_NO_WARNINGS in Visual. + * + * Another method is to define LZ4_DISABLE_DEPRECATE_WARNINGS + * before including the header file. + */ +#ifdef LZ4_DISABLE_DEPRECATE_WARNINGS +# define LZ4_DEPRECATED(message) /* disable deprecation warnings */ +#else +# define LZ4_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) +# if defined (__cplusplus) && (__cplusplus >= 201402) /* C++14 or greater */ +# define LZ4_DEPRECATED(message) [[deprecated(message)]] +# elif (LZ4_GCC_VERSION >= 405) || defined(__clang__) +# define LZ4_DEPRECATED(message) __attribute__((deprecated(message))) +# elif (LZ4_GCC_VERSION >= 301) +# define LZ4_DEPRECATED(message) __attribute__((deprecated)) +# elif defined(_MSC_VER) +# define LZ4_DEPRECATED(message) __declspec(deprecated(message)) +# else +# pragma message("WARNING: You need to implement LZ4_DEPRECATED for this compiler") +# define LZ4_DEPRECATED(message) +# endif +#endif /* LZ4_DISABLE_DEPRECATE_WARNINGS */ + +/* Obsolete compression functions */ +LZ4_DEPRECATED("use LZ4_compress_default() instead") LZ4LIB_API int LZ4_compress (const char* src, char* dest, int srcSize); +LZ4_DEPRECATED("use LZ4_compress_default() instead") LZ4LIB_API int LZ4_compress_limitedOutput (const char* src, char* dest, int srcSize, int maxOutputSize); +LZ4_DEPRECATED("use LZ4_compress_fast_extState() instead") LZ4LIB_API int LZ4_compress_withState (void* state, const char* source, char* dest, int inputSize); +LZ4_DEPRECATED("use LZ4_compress_fast_extState() instead") LZ4LIB_API int LZ4_compress_limitedOutput_withState (void* state, const char* source, char* dest, int inputSize, int maxOutputSize); +LZ4_DEPRECATED("use LZ4_compress_fast_continue() instead") LZ4LIB_API int LZ4_compress_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize); +LZ4_DEPRECATED("use LZ4_compress_fast_continue() instead") LZ4LIB_API int LZ4_compress_limitedOutput_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize, int maxOutputSize); + +/* Obsolete decompression functions */ +LZ4_DEPRECATED("use LZ4_decompress_fast() instead") LZ4LIB_API int LZ4_uncompress (const char* source, char* dest, int outputSize); +LZ4_DEPRECATED("use LZ4_decompress_safe() instead") LZ4LIB_API int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize); + +/* Obsolete streaming functions; degraded functionality; do not use! + * + * In order to perform streaming compression, these functions depended on data + * that is no longer tracked in the state. They have been preserved as well as + * possible: using them will still produce a correct output. However, they don't + * actually retain any history between compression calls. The compression ratio + * achieved will therefore be no better than compressing each chunk + * independently. + */ +LZ4_DEPRECATED("Use LZ4_createStream() instead") LZ4LIB_API void* LZ4_create (char* inputBuffer); +LZ4_DEPRECATED("Use LZ4_createStream() instead") LZ4LIB_API int LZ4_sizeofStreamState(void); +LZ4_DEPRECATED("Use LZ4_resetStream() instead") LZ4LIB_API int LZ4_resetStreamState(void* state, char* inputBuffer); +LZ4_DEPRECATED("Use LZ4_saveDict() instead") LZ4LIB_API char* LZ4_slideInputBuffer (void* state); + +/* Obsolete streaming decoding functions */ +LZ4_DEPRECATED("use LZ4_decompress_safe_usingDict() instead") LZ4LIB_API int LZ4_decompress_safe_withPrefix64k (const char* src, char* dst, int compressedSize, int maxDstSize); +LZ4_DEPRECATED("use LZ4_decompress_fast_usingDict() instead") LZ4LIB_API int LZ4_decompress_fast_withPrefix64k (const char* src, char* dst, int originalSize); + +/*! LZ4_decompress_fast() : **unsafe!** + * These functions used to be faster than LZ4_decompress_safe(), + * but it has changed, and they are now slower than LZ4_decompress_safe(). + * This is because LZ4_decompress_fast() doesn't know the input size, + * and therefore must progress more cautiously in the input buffer to not read beyond the end of block. + * On top of that `LZ4_decompress_fast()` is not protected vs malformed or malicious inputs, making it a security liability. + * As a consequence, LZ4_decompress_fast() is strongly discouraged, and deprecated. + * + * The last remaining LZ4_decompress_fast() specificity is that + * it can decompress a block without knowing its compressed size. + * Such functionality could be achieved in a more secure manner, + * by also providing the maximum size of input buffer, + * but it would require new prototypes, and adaptation of the implementation to this new use case. + * + * Parameters: + * originalSize : is the uncompressed size to regenerate. + * `dst` must be already allocated, its size must be >= 'originalSize' bytes. + * @return : number of bytes read from source buffer (== compressed size). + * The function expects to finish at block's end exactly. + * If the source stream is detected malformed, the function stops decoding and returns a negative result. + * note : LZ4_decompress_fast*() requires originalSize. Thanks to this information, it never writes past the output buffer. + * However, since it doesn't know its 'src' size, it may read an unknown amount of input, past input buffer bounds. + * Also, since match offsets are not validated, match reads from 'src' may underflow too. + * These issues never happen if input (compressed) data is correct. + * But they may happen if input data is invalid (error or intentional tampering). + * As a consequence, use these functions in trusted environments with trusted data **only**. + */ + +LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe() instead") +LZ4LIB_API int LZ4_decompress_fast (const char* src, char* dst, int originalSize); +LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe_continue() instead") +LZ4LIB_API int LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* src, char* dst, int originalSize); +LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe_usingDict() instead") +LZ4LIB_API int LZ4_decompress_fast_usingDict (const char* src, char* dst, int originalSize, const char* dictStart, int dictSize); + +/*! LZ4_resetStream() : + * An LZ4_stream_t structure must be initialized at least once. + * This is done with LZ4_initStream(), or LZ4_resetStream(). + * Consider switching to LZ4_initStream(), + * invoking LZ4_resetStream() will trigger deprecation warnings in the future. + */ +LZ4LIB_API void LZ4_resetStream (LZ4_stream_t* streamPtr); + + +#endif /* LZ4_H_98237428734687 */ + + +#if defined (__cplusplus) +} +#endif diff --git a/common/lz4/lz4hc.c b/common/lz4/lz4hc.c new file mode 100644 index 000000000..5922ed7b1 --- /dev/null +++ b/common/lz4/lz4hc.c @@ -0,0 +1,1538 @@ +/* + LZ4 HC - High Compression Mode of LZ4 + Copyright (C) 2011-2017, Yann Collet. + + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * 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 COPYRIGHT HOLDERS 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 COPYRIGHT + OWNER 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. + + You can contact the author at : + - LZ4 source repository : https://github.com/lz4/lz4 + - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c +*/ +/* note : lz4hc is not an independent module, it requires lz4.h/lz4.c for proper compilation */ + + +/* ************************************* +* Tuning Parameter +***************************************/ + +/*! HEAPMODE : + * Select how default compression function will allocate workplace memory, + * in stack (0:fastest), or in heap (1:requires malloc()). + * Since workplace is rather large, heap mode is recommended. + */ +#ifndef LZ4HC_HEAPMODE +# define LZ4HC_HEAPMODE 1 +#endif + + +/*=== Dependency ===*/ +#define LZ4_HC_STATIC_LINKING_ONLY +#include "lz4hc.h" + + +/*=== Common LZ4 definitions ===*/ +#if defined(__GNUC__) +# pragma GCC diagnostic ignored "-Wunused-function" +#endif +#if defined (__clang__) +# pragma clang diagnostic ignored "-Wunused-function" +#endif + +/*=== Enums ===*/ +typedef enum { noDictCtx, usingDictCtxHc } dictCtx_directive; + + +#define LZ4_COMMONDEFS_ONLY +#ifndef LZ4_SRC_INCLUDED +#include "lz4.c" /* LZ4_count, constants, mem */ +#endif + +/*=== Constants ===*/ +#define OPTIMAL_ML (int)((ML_MASK-1)+MINMATCH) +#define LZ4_OPT_NUM (1<<12) + + +/*=== Macros ===*/ +#define MIN(a,b) ( (a) < (b) ? (a) : (b) ) +#define MAX(a,b) ( (a) > (b) ? (a) : (b) ) +#define HASH_FUNCTION(i) (((i) * 2654435761U) >> ((MINMATCH*8)-LZ4HC_HASH_LOG)) +#define DELTANEXTMAXD(p) chainTable[(p) & LZ4HC_MAXD_MASK] /* flexible, LZ4HC_MAXD dependent */ +#define DELTANEXTU16(table, pos) table[(U16)(pos)] /* faster */ +/* Make fields passed to, and updated by LZ4HC_encodeSequence explicit */ +#define UPDATABLE(ip, op, anchor) &ip, &op, &anchor + +static U32 LZ4HC_hashPtr(const void* ptr) { return HASH_FUNCTION(LZ4_read32(ptr)); } + + +/************************************** +* HC Compression +**************************************/ +static void LZ4HC_clearTables (LZ4HC_CCtx_internal* hc4) +{ + MEM_INIT((void*)hc4->hashTable, 0, sizeof(hc4->hashTable)); + MEM_INIT(hc4->chainTable, 0xFF, sizeof(hc4->chainTable)); +} + +static void LZ4HC_init_internal (LZ4HC_CCtx_internal* hc4, const BYTE* start) +{ + uptrval startingOffset = (uptrval)(hc4->end - hc4->base); + if (startingOffset > 1 GB) { + LZ4HC_clearTables(hc4); + startingOffset = 0; + } + startingOffset += 64 KB; + hc4->nextToUpdate = (U32) startingOffset; + hc4->base = start - startingOffset; + hc4->end = start; + hc4->dictBase = start - startingOffset; + hc4->dictLimit = (U32) startingOffset; + hc4->lowLimit = (U32) startingOffset; +} + + +/* Update chains up to ip (excluded) */ +LZ4_FORCE_INLINE void LZ4HC_Insert (LZ4HC_CCtx_internal* hc4, const BYTE* ip) +{ + U16* const chainTable = hc4->chainTable; + U32* const hashTable = hc4->hashTable; + const BYTE* const base = hc4->base; + U32 const target = (U32)(ip - base); + U32 idx = hc4->nextToUpdate; + + while (idx < target) { + U32 const h = LZ4HC_hashPtr(base+idx); + size_t delta = idx - hashTable[h]; + if (delta>LZ4_DISTANCE_MAX) delta = LZ4_DISTANCE_MAX; + DELTANEXTU16(chainTable, idx) = (U16)delta; + hashTable[h] = idx; + idx++; + } + + hc4->nextToUpdate = target; +} + +/** LZ4HC_countBack() : + * @return : negative value, nb of common bytes before ip/match */ +LZ4_FORCE_INLINE +int LZ4HC_countBack(const BYTE* const ip, const BYTE* const match, + const BYTE* const iMin, const BYTE* const mMin) +{ + int back = 0; + int const min = (int)MAX(iMin - ip, mMin - match); + assert(min <= 0); + assert(ip >= iMin); assert((size_t)(ip-iMin) < (1U<<31)); + assert(match >= mMin); assert((size_t)(match - mMin) < (1U<<31)); + while ( (back > min) + && (ip[back-1] == match[back-1]) ) + back--; + return back; +} + +#if defined(_MSC_VER) +# define LZ4HC_rotl32(x,r) _rotl(x,r) +#else +# define LZ4HC_rotl32(x,r) ((x << r) | (x >> (32 - r))) +#endif + + +static U32 LZ4HC_rotatePattern(size_t const rotate, U32 const pattern) +{ + size_t const bitsToRotate = (rotate & (sizeof(pattern) - 1)) << 3; + if (bitsToRotate == 0) + return pattern; + return LZ4HC_rotl32(pattern, (int)bitsToRotate); +} + +/* LZ4HC_countPattern() : + * pattern32 must be a sample of repetitive pattern of length 1, 2 or 4 (but not 3!) */ +static unsigned +LZ4HC_countPattern(const BYTE* ip, const BYTE* const iEnd, U32 const pattern32) +{ + const BYTE* const iStart = ip; + reg_t const pattern = (sizeof(pattern)==8) ? (reg_t)pattern32 + (((reg_t)pattern32) << 32) : pattern32; + + while (likely(ip < iEnd-(sizeof(pattern)-1))) { + reg_t const diff = LZ4_read_ARCH(ip) ^ pattern; + if (!diff) { ip+=sizeof(pattern); continue; } + ip += LZ4_NbCommonBytes(diff); + return (unsigned)(ip - iStart); + } + + if (LZ4_isLittleEndian()) { + reg_t patternByte = pattern; + while ((ip<iEnd) && (*ip == (BYTE)patternByte)) { + ip++; patternByte >>= 8; + } + } else { /* big endian */ + U32 bitOffset = (sizeof(pattern)*8) - 8; + while (ip < iEnd) { + BYTE const byte = (BYTE)(pattern >> bitOffset); + if (*ip != byte) break; + ip ++; bitOffset -= 8; + } + } + + return (unsigned)(ip - iStart); +} + +/* LZ4HC_reverseCountPattern() : + * pattern must be a sample of repetitive pattern of length 1, 2 or 4 (but not 3!) + * read using natural platform endianess */ +static unsigned +LZ4HC_reverseCountPattern(const BYTE* ip, const BYTE* const iLow, U32 pattern) +{ + const BYTE* const iStart = ip; + + while (likely(ip >= iLow+4)) { + if (LZ4_read32(ip-4) != pattern) break; + ip -= 4; + } + { const BYTE* bytePtr = (const BYTE*)(&pattern) + 3; /* works for any endianess */ + while (likely(ip>iLow)) { + if (ip[-1] != *bytePtr) break; + ip--; bytePtr--; + } } + return (unsigned)(iStart - ip); +} + +/* LZ4HC_protectDictEnd() : + * Checks if the match is in the last 3 bytes of the dictionary, so reading the + * 4 byte MINMATCH would overflow. + * @returns true if the match index is okay. + */ +static int LZ4HC_protectDictEnd(U32 const dictLimit, U32 const matchIndex) +{ + return ((U32)((dictLimit - 1) - matchIndex) >= 3); +} + +typedef enum { rep_untested, rep_not, rep_confirmed } repeat_state_e; +typedef enum { favorCompressionRatio=0, favorDecompressionSpeed } HCfavor_e; + +LZ4_FORCE_INLINE int +LZ4HC_InsertAndGetWiderMatch ( + LZ4HC_CCtx_internal* hc4, + const BYTE* const ip, + const BYTE* const iLowLimit, + const BYTE* const iHighLimit, + int longest, + const BYTE** matchpos, + const BYTE** startpos, + const int maxNbAttempts, + const int patternAnalysis, + const int chainSwap, + const dictCtx_directive dict, + const HCfavor_e favorDecSpeed) +{ + U16* const chainTable = hc4->chainTable; + U32* const HashTable = hc4->hashTable; + const LZ4HC_CCtx_internal * const dictCtx = hc4->dictCtx; + const BYTE* const base = hc4->base; + const U32 dictLimit = hc4->dictLimit; + const BYTE* const lowPrefixPtr = base + dictLimit; + const U32 ipIndex = (U32)(ip - base); + const U32 lowestMatchIndex = (hc4->lowLimit + (LZ4_DISTANCE_MAX + 1) > ipIndex) ? hc4->lowLimit : ipIndex - LZ4_DISTANCE_MAX; + const BYTE* const dictBase = hc4->dictBase; + int const lookBackLength = (int)(ip-iLowLimit); + int nbAttempts = maxNbAttempts; + U32 matchChainPos = 0; + U32 const pattern = LZ4_read32(ip); + U32 matchIndex; + repeat_state_e repeat = rep_untested; + size_t srcPatternLength = 0; + + DEBUGLOG(7, "LZ4HC_InsertAndGetWiderMatch"); + /* First Match */ + LZ4HC_Insert(hc4, ip); + matchIndex = HashTable[LZ4HC_hashPtr(ip)]; + DEBUGLOG(7, "First match at index %u / %u (lowestMatchIndex)", + matchIndex, lowestMatchIndex); + + while ((matchIndex>=lowestMatchIndex) && (nbAttempts)) { + int matchLength=0; + nbAttempts--; + assert(matchIndex < ipIndex); + if (favorDecSpeed && (ipIndex - matchIndex < 8)) { + /* do nothing */ + } else if (matchIndex >= dictLimit) { /* within current Prefix */ + const BYTE* const matchPtr = base + matchIndex; + assert(matchPtr >= lowPrefixPtr); + assert(matchPtr < ip); + assert(longest >= 1); + if (LZ4_read16(iLowLimit + longest - 1) == LZ4_read16(matchPtr - lookBackLength + longest - 1)) { + if (LZ4_read32(matchPtr) == pattern) { + int const back = lookBackLength ? LZ4HC_countBack(ip, matchPtr, iLowLimit, lowPrefixPtr) : 0; + matchLength = MINMATCH + (int)LZ4_count(ip+MINMATCH, matchPtr+MINMATCH, iHighLimit); + matchLength -= back; + if (matchLength > longest) { + longest = matchLength; + *matchpos = matchPtr + back; + *startpos = ip + back; + } } } + } else { /* lowestMatchIndex <= matchIndex < dictLimit */ + const BYTE* const matchPtr = dictBase + matchIndex; + if (LZ4_read32(matchPtr) == pattern) { + const BYTE* const dictStart = dictBase + hc4->lowLimit; + int back = 0; + const BYTE* vLimit = ip + (dictLimit - matchIndex); + if (vLimit > iHighLimit) vLimit = iHighLimit; + matchLength = (int)LZ4_count(ip+MINMATCH, matchPtr+MINMATCH, vLimit) + MINMATCH; + if ((ip+matchLength == vLimit) && (vLimit < iHighLimit)) + matchLength += LZ4_count(ip+matchLength, lowPrefixPtr, iHighLimit); + back = lookBackLength ? LZ4HC_countBack(ip, matchPtr, iLowLimit, dictStart) : 0; + matchLength -= back; + if (matchLength > longest) { + longest = matchLength; + *matchpos = base + matchIndex + back; /* virtual pos, relative to ip, to retrieve offset */ + *startpos = ip + back; + } } } + + if (chainSwap && matchLength==longest) { /* better match => select a better chain */ + assert(lookBackLength==0); /* search forward only */ + if (matchIndex + (U32)longest <= ipIndex) { + int const kTrigger = 4; + U32 distanceToNextMatch = 1; + int const end = longest - MINMATCH + 1; + int step = 1; + int accel = 1 << kTrigger; + int pos; + for (pos = 0; pos < end; pos += step) { + U32 const candidateDist = DELTANEXTU16(chainTable, matchIndex + (U32)pos); + step = (accel++ >> kTrigger); + if (candidateDist > distanceToNextMatch) { + distanceToNextMatch = candidateDist; + matchChainPos = (U32)pos; + accel = 1 << kTrigger; + } + } + if (distanceToNextMatch > 1) { + if (distanceToNextMatch > matchIndex) break; /* avoid overflow */ + matchIndex -= distanceToNextMatch; + continue; + } } } + + { U32 const distNextMatch = DELTANEXTU16(chainTable, matchIndex); + if (patternAnalysis && distNextMatch==1 && matchChainPos==0) { + U32 const matchCandidateIdx = matchIndex-1; + /* may be a repeated pattern */ + if (repeat == rep_untested) { + if ( ((pattern & 0xFFFF) == (pattern >> 16)) + & ((pattern & 0xFF) == (pattern >> 24)) ) { + repeat = rep_confirmed; + srcPatternLength = LZ4HC_countPattern(ip+sizeof(pattern), iHighLimit, pattern) + sizeof(pattern); + } else { + repeat = rep_not; + } } + if ( (repeat == rep_confirmed) && (matchCandidateIdx >= lowestMatchIndex) + && LZ4HC_protectDictEnd(dictLimit, matchCandidateIdx) ) { + const int extDict = matchCandidateIdx < dictLimit; + const BYTE* const matchPtr = (extDict ? dictBase : base) + matchCandidateIdx; + if (LZ4_read32(matchPtr) == pattern) { /* good candidate */ + const BYTE* const dictStart = dictBase + hc4->lowLimit; + const BYTE* const iLimit = extDict ? dictBase + dictLimit : iHighLimit; + size_t forwardPatternLength = LZ4HC_countPattern(matchPtr+sizeof(pattern), iLimit, pattern) + sizeof(pattern); + if (extDict && matchPtr + forwardPatternLength == iLimit) { + U32 const rotatedPattern = LZ4HC_rotatePattern(forwardPatternLength, pattern); + forwardPatternLength += LZ4HC_countPattern(lowPrefixPtr, iHighLimit, rotatedPattern); + } + { const BYTE* const lowestMatchPtr = extDict ? dictStart : lowPrefixPtr; + size_t backLength = LZ4HC_reverseCountPattern(matchPtr, lowestMatchPtr, pattern); + size_t currentSegmentLength; + if (!extDict && matchPtr - backLength == lowPrefixPtr && hc4->lowLimit < dictLimit) { + U32 const rotatedPattern = LZ4HC_rotatePattern((U32)(-(int)backLength), pattern); + backLength += LZ4HC_reverseCountPattern(dictBase + dictLimit, dictStart, rotatedPattern); + } + /* Limit backLength not go further than lowestMatchIndex */ + backLength = matchCandidateIdx - MAX(matchCandidateIdx - (U32)backLength, lowestMatchIndex); + assert(matchCandidateIdx - backLength >= lowestMatchIndex); + currentSegmentLength = backLength + forwardPatternLength; + /* Adjust to end of pattern if the source pattern fits, otherwise the beginning of the pattern */ + if ( (currentSegmentLength >= srcPatternLength) /* current pattern segment large enough to contain full srcPatternLength */ + && (forwardPatternLength <= srcPatternLength) ) { /* haven't reached this position yet */ + U32 const newMatchIndex = matchCandidateIdx + (U32)forwardPatternLength - (U32)srcPatternLength; /* best position, full pattern, might be followed by more match */ + if (LZ4HC_protectDictEnd(dictLimit, newMatchIndex)) + matchIndex = newMatchIndex; + else { + /* Can only happen if started in the prefix */ + assert(newMatchIndex >= dictLimit - 3 && newMatchIndex < dictLimit && !extDict); + matchIndex = dictLimit; + } + } else { + U32 const newMatchIndex = matchCandidateIdx - (U32)backLength; /* farthest position in current segment, will find a match of length currentSegmentLength + maybe some back */ + if (!LZ4HC_protectDictEnd(dictLimit, newMatchIndex)) { + assert(newMatchIndex >= dictLimit - 3 && newMatchIndex < dictLimit && !extDict); + matchIndex = dictLimit; + } else { + matchIndex = newMatchIndex; + if (lookBackLength==0) { /* no back possible */ + size_t const maxML = MIN(currentSegmentLength, srcPatternLength); + if ((size_t)longest < maxML) { + assert(base + matchIndex < ip); + if (ip - (base+matchIndex) > LZ4_DISTANCE_MAX) break; + assert(maxML < 2 GB); + longest = (int)maxML; + *matchpos = base + matchIndex; /* virtual pos, relative to ip, to retrieve offset */ + *startpos = ip; + } + { U32 const distToNextPattern = DELTANEXTU16(chainTable, matchIndex); + if (distToNextPattern > matchIndex) break; /* avoid overflow */ + matchIndex -= distToNextPattern; + } } } } } + continue; + } } + } } /* PA optimization */ + + /* follow current chain */ + matchIndex -= DELTANEXTU16(chainTable, matchIndex + matchChainPos); + + } /* while ((matchIndex>=lowestMatchIndex) && (nbAttempts)) */ + + if ( dict == usingDictCtxHc + && nbAttempts + && ipIndex - lowestMatchIndex < LZ4_DISTANCE_MAX) { + size_t const dictEndOffset = (size_t)(dictCtx->end - dictCtx->base); + U32 dictMatchIndex = dictCtx->hashTable[LZ4HC_hashPtr(ip)]; + assert(dictEndOffset <= 1 GB); + matchIndex = dictMatchIndex + lowestMatchIndex - (U32)dictEndOffset; + while (ipIndex - matchIndex <= LZ4_DISTANCE_MAX && nbAttempts--) { + const BYTE* const matchPtr = dictCtx->base + dictMatchIndex; + + if (LZ4_read32(matchPtr) == pattern) { + int mlt; + int back = 0; + const BYTE* vLimit = ip + (dictEndOffset - dictMatchIndex); + if (vLimit > iHighLimit) vLimit = iHighLimit; + mlt = (int)LZ4_count(ip+MINMATCH, matchPtr+MINMATCH, vLimit) + MINMATCH; + back = lookBackLength ? LZ4HC_countBack(ip, matchPtr, iLowLimit, dictCtx->base + dictCtx->dictLimit) : 0; + mlt -= back; + if (mlt > longest) { + longest = mlt; + *matchpos = base + matchIndex + back; + *startpos = ip + back; + } } + + { U32 const nextOffset = DELTANEXTU16(dictCtx->chainTable, dictMatchIndex); + dictMatchIndex -= nextOffset; + matchIndex -= nextOffset; + } } } + + return longest; +} + +LZ4_FORCE_INLINE +int LZ4HC_InsertAndFindBestMatch(LZ4HC_CCtx_internal* const hc4, /* Index table will be updated */ + const BYTE* const ip, const BYTE* const iLimit, + const BYTE** matchpos, + const int maxNbAttempts, + const int patternAnalysis, + const dictCtx_directive dict) +{ + const BYTE* uselessPtr = ip; + /* note : LZ4HC_InsertAndGetWiderMatch() is able to modify the starting position of a match (*startpos), + * but this won't be the case here, as we define iLowLimit==ip, + * so LZ4HC_InsertAndGetWiderMatch() won't be allowed to search past ip */ + return LZ4HC_InsertAndGetWiderMatch(hc4, ip, ip, iLimit, MINMATCH-1, matchpos, &uselessPtr, maxNbAttempts, patternAnalysis, 0 /*chainSwap*/, dict, favorCompressionRatio); +} + +/* LZ4HC_encodeSequence() : + * @return : 0 if ok, + * 1 if buffer issue detected */ +LZ4_FORCE_INLINE int LZ4HC_encodeSequence ( + const BYTE** ip, + BYTE** op, + const BYTE** anchor, + int matchLength, + const BYTE* const match, + limitedOutput_directive limit, + BYTE* oend) +{ + size_t length; + BYTE* const token = (*op)++; + +#if defined(LZ4_DEBUG) && (LZ4_DEBUG >= 6) + static const BYTE* start = NULL; + static U32 totalCost = 0; + U32 const pos = (start==NULL) ? 0 : (U32)(*anchor - start); + U32 const ll = (U32)(*ip - *anchor); + U32 const llAdd = (ll>=15) ? ((ll-15) / 255) + 1 : 0; + U32 const mlAdd = (matchLength>=19) ? ((matchLength-19) / 255) + 1 : 0; + U32 const cost = 1 + llAdd + ll + 2 + mlAdd; + if (start==NULL) start = *anchor; /* only works for single segment */ + /* g_debuglog_enable = (pos >= 2228) & (pos <= 2262); */ + DEBUGLOG(6, "pos:%7u -- literals:%3u, match:%4i, offset:%5u, cost:%3u + %u", + pos, + (U32)(*ip - *anchor), matchLength, (U32)(*ip-match), + cost, totalCost); + totalCost += cost; +#endif + + /* Encode Literal length */ + length = (size_t)(*ip - *anchor); + if ((limit) && ((*op + (length / 255) + length + (2 + 1 + LASTLITERALS)) > oend)) return 1; /* Check output limit */ + if (length >= RUN_MASK) { + size_t len = length - RUN_MASK; + *token = (RUN_MASK << ML_BITS); + for(; len >= 255 ; len -= 255) *(*op)++ = 255; + *(*op)++ = (BYTE)len; + } else { + *token = (BYTE)(length << ML_BITS); + } + + /* Copy Literals */ + LZ4_wildCopy8(*op, *anchor, (*op) + length); + *op += length; + + /* Encode Offset */ + assert( (*ip - match) <= LZ4_DISTANCE_MAX ); /* note : consider providing offset as a value, rather than as a pointer difference */ + LZ4_writeLE16(*op, (U16)(*ip-match)); *op += 2; + + /* Encode MatchLength */ + assert(matchLength >= MINMATCH); + length = (size_t)matchLength - MINMATCH; + if ((limit) && (*op + (length / 255) + (1 + LASTLITERALS) > oend)) return 1; /* Check output limit */ + if (length >= ML_MASK) { + *token += ML_MASK; + length -= ML_MASK; + for(; length >= 510 ; length -= 510) { *(*op)++ = 255; *(*op)++ = 255; } + if (length >= 255) { length -= 255; *(*op)++ = 255; } + *(*op)++ = (BYTE)length; + } else { + *token += (BYTE)(length); + } + + /* Prepare next loop */ + *ip += matchLength; + *anchor = *ip; + + return 0; +} + +LZ4_FORCE_INLINE int LZ4HC_compress_hashChain ( + LZ4HC_CCtx_internal* const ctx, + const char* const source, + char* const dest, + int* srcSizePtr, + int const maxOutputSize, + unsigned maxNbAttempts, + const limitedOutput_directive limit, + const dictCtx_directive dict + ) +{ + const int inputSize = *srcSizePtr; + const int patternAnalysis = (maxNbAttempts > 128); /* levels 9+ */ + + const BYTE* ip = (const BYTE*) source; + const BYTE* anchor = ip; + const BYTE* const iend = ip + inputSize; + const BYTE* const mflimit = iend - MFLIMIT; + const BYTE* const matchlimit = (iend - LASTLITERALS); + + BYTE* optr = (BYTE*) dest; + BYTE* op = (BYTE*) dest; + BYTE* oend = op + maxOutputSize; + + int ml0, ml, ml2, ml3; + const BYTE* start0; + const BYTE* ref0; + const BYTE* ref = NULL; + const BYTE* start2 = NULL; + const BYTE* ref2 = NULL; + const BYTE* start3 = NULL; + const BYTE* ref3 = NULL; + + /* init */ + *srcSizePtr = 0; + if (limit == fillOutput) oend -= LASTLITERALS; /* Hack for support LZ4 format restriction */ + if (inputSize < LZ4_minLength) goto _last_literals; /* Input too small, no compression (all literals) */ + + /* Main Loop */ + while (ip <= mflimit) { + ml = LZ4HC_InsertAndFindBestMatch(ctx, ip, matchlimit, &ref, maxNbAttempts, patternAnalysis, dict); + if (ml<MINMATCH) { ip++; continue; } + + /* saved, in case we would skip too much */ + start0 = ip; ref0 = ref; ml0 = ml; + +_Search2: + if (ip+ml <= mflimit) { + ml2 = LZ4HC_InsertAndGetWiderMatch(ctx, + ip + ml - 2, ip + 0, matchlimit, ml, &ref2, &start2, + maxNbAttempts, patternAnalysis, 0, dict, favorCompressionRatio); + } else { + ml2 = ml; + } + + if (ml2 == ml) { /* No better match => encode ML1 */ + optr = op; + if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ml, ref, limit, oend)) goto _dest_overflow; + continue; + } + + if (start0 < ip) { /* first match was skipped at least once */ + if (start2 < ip + ml0) { /* squeezing ML1 between ML0(original ML1) and ML2 */ + ip = start0; ref = ref0; ml = ml0; /* restore initial ML1 */ + } } + + /* Here, start0==ip */ + if ((start2 - ip) < 3) { /* First Match too small : removed */ + ml = ml2; + ip = start2; + ref =ref2; + goto _Search2; + } + +_Search3: + /* At this stage, we have : + * ml2 > ml1, and + * ip1+3 <= ip2 (usually < ip1+ml1) */ + if ((start2 - ip) < OPTIMAL_ML) { + int correction; + int new_ml = ml; + if (new_ml > OPTIMAL_ML) new_ml = OPTIMAL_ML; + if (ip+new_ml > start2 + ml2 - MINMATCH) new_ml = (int)(start2 - ip) + ml2 - MINMATCH; + correction = new_ml - (int)(start2 - ip); + if (correction > 0) { + start2 += correction; + ref2 += correction; + ml2 -= correction; + } + } + /* Now, we have start2 = ip+new_ml, with new_ml = min(ml, OPTIMAL_ML=18) */ + + if (start2 + ml2 <= mflimit) { + ml3 = LZ4HC_InsertAndGetWiderMatch(ctx, + start2 + ml2 - 3, start2, matchlimit, ml2, &ref3, &start3, + maxNbAttempts, patternAnalysis, 0, dict, favorCompressionRatio); + } else { + ml3 = ml2; + } + + if (ml3 == ml2) { /* No better match => encode ML1 and ML2 */ + /* ip & ref are known; Now for ml */ + if (start2 < ip+ml) ml = (int)(start2 - ip); + /* Now, encode 2 sequences */ + optr = op; + if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ml, ref, limit, oend)) goto _dest_overflow; + ip = start2; + optr = op; + if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ml2, ref2, limit, oend)) goto _dest_overflow; + continue; + } + + if (start3 < ip+ml+3) { /* Not enough space for match 2 : remove it */ + if (start3 >= (ip+ml)) { /* can write Seq1 immediately ==> Seq2 is removed, so Seq3 becomes Seq1 */ + if (start2 < ip+ml) { + int correction = (int)(ip+ml - start2); + start2 += correction; + ref2 += correction; + ml2 -= correction; + if (ml2 < MINMATCH) { + start2 = start3; + ref2 = ref3; + ml2 = ml3; + } + } + + optr = op; + if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ml, ref, limit, oend)) goto _dest_overflow; + ip = start3; + ref = ref3; + ml = ml3; + + start0 = start2; + ref0 = ref2; + ml0 = ml2; + goto _Search2; + } + + start2 = start3; + ref2 = ref3; + ml2 = ml3; + goto _Search3; + } + + /* + * OK, now we have 3 ascending matches; + * let's write the first one ML1. + * ip & ref are known; Now decide ml. + */ + if (start2 < ip+ml) { + if ((start2 - ip) < OPTIMAL_ML) { + int correction; + if (ml > OPTIMAL_ML) ml = OPTIMAL_ML; + if (ip + ml > start2 + ml2 - MINMATCH) ml = (int)(start2 - ip) + ml2 - MINMATCH; + correction = ml - (int)(start2 - ip); + if (correction > 0) { + start2 += correction; + ref2 += correction; + ml2 -= correction; + } + } else { + ml = (int)(start2 - ip); + } + } + optr = op; + if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ml, ref, limit, oend)) goto _dest_overflow; + + /* ML2 becomes ML1 */ + ip = start2; ref = ref2; ml = ml2; + + /* ML3 becomes ML2 */ + start2 = start3; ref2 = ref3; ml2 = ml3; + + /* let's find a new ML3 */ + goto _Search3; + } + +_last_literals: + /* Encode Last Literals */ + { size_t lastRunSize = (size_t)(iend - anchor); /* literals */ + size_t litLength = (lastRunSize + 255 - RUN_MASK) / 255; + size_t const totalSize = 1 + litLength + lastRunSize; + if (limit == fillOutput) oend += LASTLITERALS; /* restore correct value */ + if (limit && (op + totalSize > oend)) { + if (limit == limitedOutput) return 0; /* Check output limit */ + /* adapt lastRunSize to fill 'dest' */ + lastRunSize = (size_t)(oend - op) - 1; + litLength = (lastRunSize + 255 - RUN_MASK) / 255; + lastRunSize -= litLength; + } + ip = anchor + lastRunSize; + + if (lastRunSize >= RUN_MASK) { + size_t accumulator = lastRunSize - RUN_MASK; + *op++ = (RUN_MASK << ML_BITS); + for(; accumulator >= 255 ; accumulator -= 255) *op++ = 255; + *op++ = (BYTE) accumulator; + } else { + *op++ = (BYTE)(lastRunSize << ML_BITS); + } + memcpy(op, anchor, lastRunSize); + op += lastRunSize; + } + + /* End */ + *srcSizePtr = (int) (((const char*)ip) - source); + return (int) (((char*)op)-dest); + +_dest_overflow: + if (limit == fillOutput) { + op = optr; /* restore correct out pointer */ + goto _last_literals; + } + return 0; +} + + +static int LZ4HC_compress_optimal( LZ4HC_CCtx_internal* ctx, + const char* const source, char* dst, + int* srcSizePtr, int dstCapacity, + int const nbSearches, size_t sufficient_len, + const limitedOutput_directive limit, int const fullUpdate, + const dictCtx_directive dict, + HCfavor_e favorDecSpeed); + + +LZ4_FORCE_INLINE int LZ4HC_compress_generic_internal ( + LZ4HC_CCtx_internal* const ctx, + const char* const src, + char* const dst, + int* const srcSizePtr, + int const dstCapacity, + int cLevel, + const limitedOutput_directive limit, + const dictCtx_directive dict + ) +{ + typedef enum { lz4hc, lz4opt } lz4hc_strat_e; + typedef struct { + lz4hc_strat_e strat; + U32 nbSearches; + U32 targetLength; + } cParams_t; + static const cParams_t clTable[LZ4HC_CLEVEL_MAX+1] = { + { lz4hc, 2, 16 }, /* 0, unused */ + { lz4hc, 2, 16 }, /* 1, unused */ + { lz4hc, 2, 16 }, /* 2, unused */ + { lz4hc, 4, 16 }, /* 3 */ + { lz4hc, 8, 16 }, /* 4 */ + { lz4hc, 16, 16 }, /* 5 */ + { lz4hc, 32, 16 }, /* 6 */ + { lz4hc, 64, 16 }, /* 7 */ + { lz4hc, 128, 16 }, /* 8 */ + { lz4hc, 256, 16 }, /* 9 */ + { lz4opt, 96, 64 }, /*10==LZ4HC_CLEVEL_OPT_MIN*/ + { lz4opt, 512,128 }, /*11 */ + { lz4opt,16384,LZ4_OPT_NUM }, /* 12==LZ4HC_CLEVEL_MAX */ + }; + + DEBUGLOG(4, "LZ4HC_compress_generic(ctx=%p, src=%p, srcSize=%d)", ctx, src, *srcSizePtr); + + if (limit == fillOutput && dstCapacity < 1) return 0; /* Impossible to store anything */ + if ((U32)*srcSizePtr > (U32)LZ4_MAX_INPUT_SIZE) return 0; /* Unsupported input size (too large or negative) */ + + ctx->end += *srcSizePtr; + if (cLevel < 1) cLevel = LZ4HC_CLEVEL_DEFAULT; /* note : convention is different from lz4frame, maybe something to review */ + cLevel = MIN(LZ4HC_CLEVEL_MAX, cLevel); + { cParams_t const cParam = clTable[cLevel]; + HCfavor_e const favor = ctx->favorDecSpeed ? favorDecompressionSpeed : favorCompressionRatio; + int result; + + if (cParam.strat == lz4hc) { + result = LZ4HC_compress_hashChain(ctx, + src, dst, srcSizePtr, dstCapacity, + cParam.nbSearches, limit, dict); + } else { + assert(cParam.strat == lz4opt); + result = LZ4HC_compress_optimal(ctx, + src, dst, srcSizePtr, dstCapacity, + (int)cParam.nbSearches, cParam.targetLength, limit, + cLevel == LZ4HC_CLEVEL_MAX, /* ultra mode */ + dict, favor); + } + if (result <= 0) ctx->dirty = 1; + return result; + } +} + +static void LZ4HC_setExternalDict(LZ4HC_CCtx_internal* ctxPtr, const BYTE* newBlock); + +static int +LZ4HC_compress_generic_noDictCtx ( + LZ4HC_CCtx_internal* const ctx, + const char* const src, + char* const dst, + int* const srcSizePtr, + int const dstCapacity, + int cLevel, + limitedOutput_directive limit + ) +{ + assert(ctx->dictCtx == NULL); + return LZ4HC_compress_generic_internal(ctx, src, dst, srcSizePtr, dstCapacity, cLevel, limit, noDictCtx); +} + +static int +LZ4HC_compress_generic_dictCtx ( + LZ4HC_CCtx_internal* const ctx, + const char* const src, + char* const dst, + int* const srcSizePtr, + int const dstCapacity, + int cLevel, + limitedOutput_directive limit + ) +{ + const size_t position = (size_t)(ctx->end - ctx->base) - ctx->lowLimit; + assert(ctx->dictCtx != NULL); + if (position >= 64 KB) { + ctx->dictCtx = NULL; + return LZ4HC_compress_generic_noDictCtx(ctx, src, dst, srcSizePtr, dstCapacity, cLevel, limit); + } else if (position == 0 && *srcSizePtr > 4 KB) { + memcpy(ctx, ctx->dictCtx, sizeof(LZ4HC_CCtx_internal)); + LZ4HC_setExternalDict(ctx, (const BYTE *)src); + ctx->compressionLevel = (short)cLevel; + return LZ4HC_compress_generic_noDictCtx(ctx, src, dst, srcSizePtr, dstCapacity, cLevel, limit); + } else { + return LZ4HC_compress_generic_internal(ctx, src, dst, srcSizePtr, dstCapacity, cLevel, limit, usingDictCtxHc); + } +} + +static int +LZ4HC_compress_generic ( + LZ4HC_CCtx_internal* const ctx, + const char* const src, + char* const dst, + int* const srcSizePtr, + int const dstCapacity, + int cLevel, + limitedOutput_directive limit + ) +{ + if (ctx->dictCtx == NULL) { + return LZ4HC_compress_generic_noDictCtx(ctx, src, dst, srcSizePtr, dstCapacity, cLevel, limit); + } else { + return LZ4HC_compress_generic_dictCtx(ctx, src, dst, srcSizePtr, dstCapacity, cLevel, limit); + } +} + + +int LZ4_sizeofStateHC(void) { return (int)sizeof(LZ4_streamHC_t); } + +#ifndef _MSC_VER /* for some reason, Visual fails the aligment test on 32-bit x86 : + * it reports an aligment of 8-bytes, + * while actually aligning LZ4_streamHC_t on 4 bytes. */ +static size_t LZ4_streamHC_t_alignment(void) +{ + struct { char c; LZ4_streamHC_t t; } t_a; + return sizeof(t_a) - sizeof(t_a.t); +} +#endif + +/* state is presumed correctly initialized, + * in which case its size and alignment have already been validate */ +int LZ4_compress_HC_extStateHC_fastReset (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int compressionLevel) +{ + LZ4HC_CCtx_internal* const ctx = &((LZ4_streamHC_t*)state)->internal_donotuse; +#ifndef _MSC_VER /* for some reason, Visual fails the aligment test on 32-bit x86 : + * it reports an aligment of 8-bytes, + * while actually aligning LZ4_streamHC_t on 4 bytes. */ + assert(((size_t)state & (LZ4_streamHC_t_alignment() - 1)) == 0); /* check alignment */ +#endif + if (((size_t)(state)&(sizeof(void*)-1)) != 0) return 0; /* Error : state is not aligned for pointers (32 or 64 bits) */ + LZ4_resetStreamHC_fast((LZ4_streamHC_t*)state, compressionLevel); + LZ4HC_init_internal (ctx, (const BYTE*)src); + if (dstCapacity < LZ4_compressBound(srcSize)) + return LZ4HC_compress_generic (ctx, src, dst, &srcSize, dstCapacity, compressionLevel, limitedOutput); + else + return LZ4HC_compress_generic (ctx, src, dst, &srcSize, dstCapacity, compressionLevel, notLimited); +} + +int LZ4_compress_HC_extStateHC (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int compressionLevel) +{ + LZ4_streamHC_t* const ctx = LZ4_initStreamHC(state, sizeof(*ctx)); + if (ctx==NULL) return 0; /* init failure */ + return LZ4_compress_HC_extStateHC_fastReset(state, src, dst, srcSize, dstCapacity, compressionLevel); +} + +int LZ4_compress_HC(const char* src, char* dst, int srcSize, int dstCapacity, int compressionLevel) +{ +#if defined(LZ4HC_HEAPMODE) && LZ4HC_HEAPMODE==1 + LZ4_streamHC_t* const statePtr = (LZ4_streamHC_t*)ALLOC(sizeof(LZ4_streamHC_t)); +#else + LZ4_streamHC_t state; + LZ4_streamHC_t* const statePtr = &state; +#endif + int const cSize = LZ4_compress_HC_extStateHC(statePtr, src, dst, srcSize, dstCapacity, compressionLevel); +#if defined(LZ4HC_HEAPMODE) && LZ4HC_HEAPMODE==1 + FREEMEM(statePtr); +#endif + return cSize; +} + +/* state is presumed sized correctly (>= sizeof(LZ4_streamHC_t)) */ +int LZ4_compress_HC_destSize(void* state, const char* source, char* dest, int* sourceSizePtr, int targetDestSize, int cLevel) +{ + LZ4_streamHC_t* const ctx = LZ4_initStreamHC(state, sizeof(*ctx)); + if (ctx==NULL) return 0; /* init failure */ + LZ4HC_init_internal(&ctx->internal_donotuse, (const BYTE*) source); + LZ4_setCompressionLevel(ctx, cLevel); + return LZ4HC_compress_generic(&ctx->internal_donotuse, source, dest, sourceSizePtr, targetDestSize, cLevel, fillOutput); +} + + + +/************************************** +* Streaming Functions +**************************************/ +/* allocation */ +LZ4_streamHC_t* LZ4_createStreamHC(void) +{ + LZ4_streamHC_t* const LZ4_streamHCPtr = (LZ4_streamHC_t*)ALLOC(sizeof(LZ4_streamHC_t)); + if (LZ4_streamHCPtr==NULL) return NULL; + LZ4_initStreamHC(LZ4_streamHCPtr, sizeof(*LZ4_streamHCPtr)); /* full initialization, malloc'ed buffer can be full of garbage */ + return LZ4_streamHCPtr; +} + +int LZ4_freeStreamHC (LZ4_streamHC_t* LZ4_streamHCPtr) +{ + DEBUGLOG(4, "LZ4_freeStreamHC(%p)", LZ4_streamHCPtr); + if (!LZ4_streamHCPtr) return 0; /* support free on NULL */ + FREEMEM(LZ4_streamHCPtr); + return 0; +} + + +LZ4_streamHC_t* LZ4_initStreamHC (void* buffer, size_t size) +{ + LZ4_streamHC_t* const LZ4_streamHCPtr = (LZ4_streamHC_t*)buffer; + if (buffer == NULL) return NULL; + if (size < sizeof(LZ4_streamHC_t)) return NULL; +#ifndef _MSC_VER /* for some reason, Visual fails the aligment test on 32-bit x86 : + * it reports an aligment of 8-bytes, + * while actually aligning LZ4_streamHC_t on 4 bytes. */ + if (((size_t)buffer) & (LZ4_streamHC_t_alignment() - 1)) return NULL; /* alignment check */ +#endif + /* if compilation fails here, LZ4_STREAMHCSIZE must be increased */ + LZ4_STATIC_ASSERT(sizeof(LZ4HC_CCtx_internal) <= LZ4_STREAMHCSIZE); + DEBUGLOG(4, "LZ4_initStreamHC(%p, %u)", LZ4_streamHCPtr, (unsigned)size); + /* end-base will trigger a clearTable on starting compression */ + LZ4_streamHCPtr->internal_donotuse.end = (const BYTE *)(ptrdiff_t)-1; + LZ4_streamHCPtr->internal_donotuse.base = NULL; + LZ4_streamHCPtr->internal_donotuse.dictCtx = NULL; + LZ4_streamHCPtr->internal_donotuse.favorDecSpeed = 0; + LZ4_streamHCPtr->internal_donotuse.dirty = 0; + LZ4_setCompressionLevel(LZ4_streamHCPtr, LZ4HC_CLEVEL_DEFAULT); + return LZ4_streamHCPtr; +} + +/* just a stub */ +void LZ4_resetStreamHC (LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel) +{ + LZ4_initStreamHC(LZ4_streamHCPtr, sizeof(*LZ4_streamHCPtr)); + LZ4_setCompressionLevel(LZ4_streamHCPtr, compressionLevel); +} + +void LZ4_resetStreamHC_fast (LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel) +{ + DEBUGLOG(4, "LZ4_resetStreamHC_fast(%p, %d)", LZ4_streamHCPtr, compressionLevel); + if (LZ4_streamHCPtr->internal_donotuse.dirty) { + LZ4_initStreamHC(LZ4_streamHCPtr, sizeof(*LZ4_streamHCPtr)); + } else { + /* preserve end - base : can trigger clearTable's threshold */ + LZ4_streamHCPtr->internal_donotuse.end -= (uptrval)LZ4_streamHCPtr->internal_donotuse.base; + LZ4_streamHCPtr->internal_donotuse.base = NULL; + LZ4_streamHCPtr->internal_donotuse.dictCtx = NULL; + } + LZ4_setCompressionLevel(LZ4_streamHCPtr, compressionLevel); +} + +void LZ4_setCompressionLevel(LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel) +{ + DEBUGLOG(5, "LZ4_setCompressionLevel(%p, %d)", LZ4_streamHCPtr, compressionLevel); + if (compressionLevel < 1) compressionLevel = LZ4HC_CLEVEL_DEFAULT; + if (compressionLevel > LZ4HC_CLEVEL_MAX) compressionLevel = LZ4HC_CLEVEL_MAX; + LZ4_streamHCPtr->internal_donotuse.compressionLevel = (short)compressionLevel; +} + +void LZ4_favorDecompressionSpeed(LZ4_streamHC_t* LZ4_streamHCPtr, int favor) +{ + LZ4_streamHCPtr->internal_donotuse.favorDecSpeed = (favor!=0); +} + +/* LZ4_loadDictHC() : + * LZ4_streamHCPtr is presumed properly initialized */ +int LZ4_loadDictHC (LZ4_streamHC_t* LZ4_streamHCPtr, + const char* dictionary, int dictSize) +{ + LZ4HC_CCtx_internal* const ctxPtr = &LZ4_streamHCPtr->internal_donotuse; + DEBUGLOG(4, "LZ4_loadDictHC(%p, %p, %d)", LZ4_streamHCPtr, dictionary, dictSize); + assert(LZ4_streamHCPtr != NULL); + if (dictSize > 64 KB) { + dictionary += (size_t)dictSize - 64 KB; + dictSize = 64 KB; + } + /* need a full initialization, there are bad side-effects when using resetFast() */ + { int const cLevel = ctxPtr->compressionLevel; + LZ4_initStreamHC(LZ4_streamHCPtr, sizeof(*LZ4_streamHCPtr)); + LZ4_setCompressionLevel(LZ4_streamHCPtr, cLevel); + } + LZ4HC_init_internal (ctxPtr, (const BYTE*)dictionary); + ctxPtr->end = (const BYTE*)dictionary + dictSize; + if (dictSize >= 4) LZ4HC_Insert (ctxPtr, ctxPtr->end-3); + return dictSize; +} + +void LZ4_attach_HC_dictionary(LZ4_streamHC_t *working_stream, const LZ4_streamHC_t *dictionary_stream) { + working_stream->internal_donotuse.dictCtx = dictionary_stream != NULL ? &(dictionary_stream->internal_donotuse) : NULL; +} + +/* compression */ + +static void LZ4HC_setExternalDict(LZ4HC_CCtx_internal* ctxPtr, const BYTE* newBlock) +{ + DEBUGLOG(4, "LZ4HC_setExternalDict(%p, %p)", ctxPtr, newBlock); + if (ctxPtr->end >= ctxPtr->base + ctxPtr->dictLimit + 4) + LZ4HC_Insert (ctxPtr, ctxPtr->end-3); /* Referencing remaining dictionary content */ + + /* Only one memory segment for extDict, so any previous extDict is lost at this stage */ + ctxPtr->lowLimit = ctxPtr->dictLimit; + ctxPtr->dictLimit = (U32)(ctxPtr->end - ctxPtr->base); + ctxPtr->dictBase = ctxPtr->base; + ctxPtr->base = newBlock - ctxPtr->dictLimit; + ctxPtr->end = newBlock; + ctxPtr->nextToUpdate = ctxPtr->dictLimit; /* match referencing will resume from there */ + + /* cannot reference an extDict and a dictCtx at the same time */ + ctxPtr->dictCtx = NULL; +} + +static int LZ4_compressHC_continue_generic (LZ4_streamHC_t* LZ4_streamHCPtr, + const char* src, char* dst, + int* srcSizePtr, int dstCapacity, + limitedOutput_directive limit) +{ + LZ4HC_CCtx_internal* const ctxPtr = &LZ4_streamHCPtr->internal_donotuse; + DEBUGLOG(4, "LZ4_compressHC_continue_generic(ctx=%p, src=%p, srcSize=%d)", + LZ4_streamHCPtr, src, *srcSizePtr); + assert(ctxPtr != NULL); + /* auto-init if forgotten */ + if (ctxPtr->base == NULL) LZ4HC_init_internal (ctxPtr, (const BYTE*) src); + + /* Check overflow */ + if ((size_t)(ctxPtr->end - ctxPtr->base) > 2 GB) { + size_t dictSize = (size_t)(ctxPtr->end - ctxPtr->base) - ctxPtr->dictLimit; + if (dictSize > 64 KB) dictSize = 64 KB; + LZ4_loadDictHC(LZ4_streamHCPtr, (const char*)(ctxPtr->end) - dictSize, (int)dictSize); + } + + /* Check if blocks follow each other */ + if ((const BYTE*)src != ctxPtr->end) + LZ4HC_setExternalDict(ctxPtr, (const BYTE*)src); + + /* Check overlapping input/dictionary space */ + { const BYTE* sourceEnd = (const BYTE*) src + *srcSizePtr; + const BYTE* const dictBegin = ctxPtr->dictBase + ctxPtr->lowLimit; + const BYTE* const dictEnd = ctxPtr->dictBase + ctxPtr->dictLimit; + if ((sourceEnd > dictBegin) && ((const BYTE*)src < dictEnd)) { + if (sourceEnd > dictEnd) sourceEnd = dictEnd; + ctxPtr->lowLimit = (U32)(sourceEnd - ctxPtr->dictBase); + if (ctxPtr->dictLimit - ctxPtr->lowLimit < 4) ctxPtr->lowLimit = ctxPtr->dictLimit; + } + } + + return LZ4HC_compress_generic (ctxPtr, src, dst, srcSizePtr, dstCapacity, ctxPtr->compressionLevel, limit); +} + +int LZ4_compress_HC_continue (LZ4_streamHC_t* LZ4_streamHCPtr, const char* src, char* dst, int srcSize, int dstCapacity) +{ + if (dstCapacity < LZ4_compressBound(srcSize)) + return LZ4_compressHC_continue_generic (LZ4_streamHCPtr, src, dst, &srcSize, dstCapacity, limitedOutput); + else + return LZ4_compressHC_continue_generic (LZ4_streamHCPtr, src, dst, &srcSize, dstCapacity, notLimited); +} + +int LZ4_compress_HC_continue_destSize (LZ4_streamHC_t* LZ4_streamHCPtr, const char* src, char* dst, int* srcSizePtr, int targetDestSize) +{ + return LZ4_compressHC_continue_generic(LZ4_streamHCPtr, src, dst, srcSizePtr, targetDestSize, fillOutput); +} + + + +/* dictionary saving */ + +int LZ4_saveDictHC (LZ4_streamHC_t* LZ4_streamHCPtr, char* safeBuffer, int dictSize) +{ + LZ4HC_CCtx_internal* const streamPtr = &LZ4_streamHCPtr->internal_donotuse; + int const prefixSize = (int)(streamPtr->end - (streamPtr->base + streamPtr->dictLimit)); + DEBUGLOG(4, "LZ4_saveDictHC(%p, %p, %d)", LZ4_streamHCPtr, safeBuffer, dictSize); + if (dictSize > 64 KB) dictSize = 64 KB; + if (dictSize < 4) dictSize = 0; + if (dictSize > prefixSize) dictSize = prefixSize; + memmove(safeBuffer, streamPtr->end - dictSize, dictSize); + { U32 const endIndex = (U32)(streamPtr->end - streamPtr->base); + streamPtr->end = (const BYTE*)safeBuffer + dictSize; + streamPtr->base = streamPtr->end - endIndex; + streamPtr->dictLimit = endIndex - (U32)dictSize; + streamPtr->lowLimit = endIndex - (U32)dictSize; + if (streamPtr->nextToUpdate < streamPtr->dictLimit) streamPtr->nextToUpdate = streamPtr->dictLimit; + } + return dictSize; +} + + +/*************************************************** +* Deprecated Functions +***************************************************/ + +/* These functions currently generate deprecation warnings */ + +/* Wrappers for deprecated compression functions */ +int LZ4_compressHC(const char* src, char* dst, int srcSize) { return LZ4_compress_HC (src, dst, srcSize, LZ4_compressBound(srcSize), 0); } +int LZ4_compressHC_limitedOutput(const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_HC(src, dst, srcSize, maxDstSize, 0); } +int LZ4_compressHC2(const char* src, char* dst, int srcSize, int cLevel) { return LZ4_compress_HC (src, dst, srcSize, LZ4_compressBound(srcSize), cLevel); } +int LZ4_compressHC2_limitedOutput(const char* src, char* dst, int srcSize, int maxDstSize, int cLevel) { return LZ4_compress_HC(src, dst, srcSize, maxDstSize, cLevel); } +int LZ4_compressHC_withStateHC (void* state, const char* src, char* dst, int srcSize) { return LZ4_compress_HC_extStateHC (state, src, dst, srcSize, LZ4_compressBound(srcSize), 0); } +int LZ4_compressHC_limitedOutput_withStateHC (void* state, const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_HC_extStateHC (state, src, dst, srcSize, maxDstSize, 0); } +int LZ4_compressHC2_withStateHC (void* state, const char* src, char* dst, int srcSize, int cLevel) { return LZ4_compress_HC_extStateHC(state, src, dst, srcSize, LZ4_compressBound(srcSize), cLevel); } +int LZ4_compressHC2_limitedOutput_withStateHC (void* state, const char* src, char* dst, int srcSize, int maxDstSize, int cLevel) { return LZ4_compress_HC_extStateHC(state, src, dst, srcSize, maxDstSize, cLevel); } +int LZ4_compressHC_continue (LZ4_streamHC_t* ctx, const char* src, char* dst, int srcSize) { return LZ4_compress_HC_continue (ctx, src, dst, srcSize, LZ4_compressBound(srcSize)); } +int LZ4_compressHC_limitedOutput_continue (LZ4_streamHC_t* ctx, const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_HC_continue (ctx, src, dst, srcSize, maxDstSize); } + + +/* Deprecated streaming functions */ +int LZ4_sizeofStreamStateHC(void) { return LZ4_STREAMHCSIZE; } + +/* state is presumed correctly sized, aka >= sizeof(LZ4_streamHC_t) + * @return : 0 on success, !=0 if error */ +int LZ4_resetStreamStateHC(void* state, char* inputBuffer) +{ + LZ4_streamHC_t* const hc4 = LZ4_initStreamHC(state, sizeof(*hc4)); + if (hc4 == NULL) return 1; /* init failed */ + LZ4HC_init_internal (&hc4->internal_donotuse, (const BYTE*)inputBuffer); + return 0; +} + +void* LZ4_createHC (const char* inputBuffer) +{ + LZ4_streamHC_t* const hc4 = LZ4_createStreamHC(); + if (hc4 == NULL) return NULL; /* not enough memory */ + LZ4HC_init_internal (&hc4->internal_donotuse, (const BYTE*)inputBuffer); + return hc4; +} + +int LZ4_freeHC (void* LZ4HC_Data) +{ + if (!LZ4HC_Data) return 0; /* support free on NULL */ + FREEMEM(LZ4HC_Data); + return 0; +} + +int LZ4_compressHC2_continue (void* LZ4HC_Data, const char* src, char* dst, int srcSize, int cLevel) +{ + return LZ4HC_compress_generic (&((LZ4_streamHC_t*)LZ4HC_Data)->internal_donotuse, src, dst, &srcSize, 0, cLevel, notLimited); +} + +int LZ4_compressHC2_limitedOutput_continue (void* LZ4HC_Data, const char* src, char* dst, int srcSize, int dstCapacity, int cLevel) +{ + return LZ4HC_compress_generic (&((LZ4_streamHC_t*)LZ4HC_Data)->internal_donotuse, src, dst, &srcSize, dstCapacity, cLevel, limitedOutput); +} + +char* LZ4_slideInputBufferHC(void* LZ4HC_Data) +{ + LZ4_streamHC_t *ctx = (LZ4_streamHC_t*)LZ4HC_Data; + const BYTE *bufferStart = ctx->internal_donotuse.base + ctx->internal_donotuse.lowLimit; + LZ4_resetStreamHC_fast(ctx, ctx->internal_donotuse.compressionLevel); + /* avoid const char * -> char * conversion warning :( */ + return (char *)(uptrval)bufferStart; +} + + +/* ================================================ + * LZ4 Optimal parser (levels [LZ4HC_CLEVEL_OPT_MIN - LZ4HC_CLEVEL_MAX]) + * ===============================================*/ +typedef struct { + int price; + int off; + int mlen; + int litlen; +} LZ4HC_optimal_t; + +/* price in bytes */ +LZ4_FORCE_INLINE int LZ4HC_literalsPrice(int const litlen) +{ + int price = litlen; + assert(litlen >= 0); + if (litlen >= (int)RUN_MASK) + price += 1 + ((litlen-(int)RUN_MASK) / 255); + return price; +} + + +/* requires mlen >= MINMATCH */ +LZ4_FORCE_INLINE int LZ4HC_sequencePrice(int litlen, int mlen) +{ + int price = 1 + 2 ; /* token + 16-bit offset */ + assert(litlen >= 0); + assert(mlen >= MINMATCH); + + price += LZ4HC_literalsPrice(litlen); + + if (mlen >= (int)(ML_MASK+MINMATCH)) + price += 1 + ((mlen-(int)(ML_MASK+MINMATCH)) / 255); + + return price; +} + + +typedef struct { + int off; + int len; +} LZ4HC_match_t; + +LZ4_FORCE_INLINE LZ4HC_match_t +LZ4HC_FindLongerMatch(LZ4HC_CCtx_internal* const ctx, + const BYTE* ip, const BYTE* const iHighLimit, + int minLen, int nbSearches, + const dictCtx_directive dict, + const HCfavor_e favorDecSpeed) +{ + LZ4HC_match_t match = { 0 , 0 }; + const BYTE* matchPtr = NULL; + /* note : LZ4HC_InsertAndGetWiderMatch() is able to modify the starting position of a match (*startpos), + * but this won't be the case here, as we define iLowLimit==ip, + * so LZ4HC_InsertAndGetWiderMatch() won't be allowed to search past ip */ + int matchLength = LZ4HC_InsertAndGetWiderMatch(ctx, ip, ip, iHighLimit, minLen, &matchPtr, &ip, nbSearches, 1 /*patternAnalysis*/, 1 /*chainSwap*/, dict, favorDecSpeed); + if (matchLength <= minLen) return match; + if (favorDecSpeed) { + if ((matchLength>18) & (matchLength<=36)) matchLength=18; /* favor shortcut */ + } + match.len = matchLength; + match.off = (int)(ip-matchPtr); + return match; +} + + +static int LZ4HC_compress_optimal ( LZ4HC_CCtx_internal* ctx, + const char* const source, + char* dst, + int* srcSizePtr, + int dstCapacity, + int const nbSearches, + size_t sufficient_len, + const limitedOutput_directive limit, + int const fullUpdate, + const dictCtx_directive dict, + const HCfavor_e favorDecSpeed) +{ +#define TRAILING_LITERALS 3 + LZ4HC_optimal_t opt[LZ4_OPT_NUM + TRAILING_LITERALS]; /* ~64 KB, which is a bit large for stack... */ + + const BYTE* ip = (const BYTE*) source; + const BYTE* anchor = ip; + const BYTE* const iend = ip + *srcSizePtr; + const BYTE* const mflimit = iend - MFLIMIT; + const BYTE* const matchlimit = iend - LASTLITERALS; + BYTE* op = (BYTE*) dst; + BYTE* opSaved = (BYTE*) dst; + BYTE* oend = op + dstCapacity; + + /* init */ + DEBUGLOG(5, "LZ4HC_compress_optimal(dst=%p, dstCapa=%u)", dst, (unsigned)dstCapacity); + *srcSizePtr = 0; + if (limit == fillOutput) oend -= LASTLITERALS; /* Hack for support LZ4 format restriction */ + if (sufficient_len >= LZ4_OPT_NUM) sufficient_len = LZ4_OPT_NUM-1; + + /* Main Loop */ + assert(ip - anchor < LZ4_MAX_INPUT_SIZE); + while (ip <= mflimit) { + int const llen = (int)(ip - anchor); + int best_mlen, best_off; + int cur, last_match_pos = 0; + + LZ4HC_match_t const firstMatch = LZ4HC_FindLongerMatch(ctx, ip, matchlimit, MINMATCH-1, nbSearches, dict, favorDecSpeed); + if (firstMatch.len==0) { ip++; continue; } + + if ((size_t)firstMatch.len > sufficient_len) { + /* good enough solution : immediate encoding */ + int const firstML = firstMatch.len; + const BYTE* const matchPos = ip - firstMatch.off; + opSaved = op; + if ( LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), firstML, matchPos, limit, oend) ) /* updates ip, op and anchor */ + goto _dest_overflow; + continue; + } + + /* set prices for first positions (literals) */ + { int rPos; + for (rPos = 0 ; rPos < MINMATCH ; rPos++) { + int const cost = LZ4HC_literalsPrice(llen + rPos); + opt[rPos].mlen = 1; + opt[rPos].off = 0; + opt[rPos].litlen = llen + rPos; + opt[rPos].price = cost; + DEBUGLOG(7, "rPos:%3i => price:%3i (litlen=%i) -- initial setup", + rPos, cost, opt[rPos].litlen); + } } + /* set prices using initial match */ + { int mlen = MINMATCH; + int const matchML = firstMatch.len; /* necessarily < sufficient_len < LZ4_OPT_NUM */ + int const offset = firstMatch.off; + assert(matchML < LZ4_OPT_NUM); + for ( ; mlen <= matchML ; mlen++) { + int const cost = LZ4HC_sequencePrice(llen, mlen); + opt[mlen].mlen = mlen; + opt[mlen].off = offset; + opt[mlen].litlen = llen; + opt[mlen].price = cost; + DEBUGLOG(7, "rPos:%3i => price:%3i (matchlen=%i) -- initial setup", + mlen, cost, mlen); + } } + last_match_pos = firstMatch.len; + { int addLit; + for (addLit = 1; addLit <= TRAILING_LITERALS; addLit ++) { + opt[last_match_pos+addLit].mlen = 1; /* literal */ + opt[last_match_pos+addLit].off = 0; + opt[last_match_pos+addLit].litlen = addLit; + opt[last_match_pos+addLit].price = opt[last_match_pos].price + LZ4HC_literalsPrice(addLit); + DEBUGLOG(7, "rPos:%3i => price:%3i (litlen=%i) -- initial setup", + last_match_pos+addLit, opt[last_match_pos+addLit].price, addLit); + } } + + /* check further positions */ + for (cur = 1; cur < last_match_pos; cur++) { + const BYTE* const curPtr = ip + cur; + LZ4HC_match_t newMatch; + + if (curPtr > mflimit) break; + DEBUGLOG(7, "rPos:%u[%u] vs [%u]%u", + cur, opt[cur].price, opt[cur+1].price, cur+1); + if (fullUpdate) { + /* not useful to search here if next position has same (or lower) cost */ + if ( (opt[cur+1].price <= opt[cur].price) + /* in some cases, next position has same cost, but cost rises sharply after, so a small match would still be beneficial */ + && (opt[cur+MINMATCH].price < opt[cur].price + 3/*min seq price*/) ) + continue; + } else { + /* not useful to search here if next position has same (or lower) cost */ + if (opt[cur+1].price <= opt[cur].price) continue; + } + + DEBUGLOG(7, "search at rPos:%u", cur); + if (fullUpdate) + newMatch = LZ4HC_FindLongerMatch(ctx, curPtr, matchlimit, MINMATCH-1, nbSearches, dict, favorDecSpeed); + else + /* only test matches of minimum length; slightly faster, but misses a few bytes */ + newMatch = LZ4HC_FindLongerMatch(ctx, curPtr, matchlimit, last_match_pos - cur, nbSearches, dict, favorDecSpeed); + if (!newMatch.len) continue; + + if ( ((size_t)newMatch.len > sufficient_len) + || (newMatch.len + cur >= LZ4_OPT_NUM) ) { + /* immediate encoding */ + best_mlen = newMatch.len; + best_off = newMatch.off; + last_match_pos = cur + 1; + goto encode; + } + + /* before match : set price with literals at beginning */ + { int const baseLitlen = opt[cur].litlen; + int litlen; + for (litlen = 1; litlen < MINMATCH; litlen++) { + int const price = opt[cur].price - LZ4HC_literalsPrice(baseLitlen) + LZ4HC_literalsPrice(baseLitlen+litlen); + int const pos = cur + litlen; + if (price < opt[pos].price) { + opt[pos].mlen = 1; /* literal */ + opt[pos].off = 0; + opt[pos].litlen = baseLitlen+litlen; + opt[pos].price = price; + DEBUGLOG(7, "rPos:%3i => price:%3i (litlen=%i)", + pos, price, opt[pos].litlen); + } } } + + /* set prices using match at position = cur */ + { int const matchML = newMatch.len; + int ml = MINMATCH; + + assert(cur + newMatch.len < LZ4_OPT_NUM); + for ( ; ml <= matchML ; ml++) { + int const pos = cur + ml; + int const offset = newMatch.off; + int price; + int ll; + DEBUGLOG(7, "testing price rPos %i (last_match_pos=%i)", + pos, last_match_pos); + if (opt[cur].mlen == 1) { + ll = opt[cur].litlen; + price = ((cur > ll) ? opt[cur - ll].price : 0) + + LZ4HC_sequencePrice(ll, ml); + } else { + ll = 0; + price = opt[cur].price + LZ4HC_sequencePrice(0, ml); + } + + assert((U32)favorDecSpeed <= 1); + if (pos > last_match_pos+TRAILING_LITERALS + || price <= opt[pos].price - (int)favorDecSpeed) { + DEBUGLOG(7, "rPos:%3i => price:%3i (matchlen=%i)", + pos, price, ml); + assert(pos < LZ4_OPT_NUM); + if ( (ml == matchML) /* last pos of last match */ + && (last_match_pos < pos) ) + last_match_pos = pos; + opt[pos].mlen = ml; + opt[pos].off = offset; + opt[pos].litlen = ll; + opt[pos].price = price; + } } } + /* complete following positions with literals */ + { int addLit; + for (addLit = 1; addLit <= TRAILING_LITERALS; addLit ++) { + opt[last_match_pos+addLit].mlen = 1; /* literal */ + opt[last_match_pos+addLit].off = 0; + opt[last_match_pos+addLit].litlen = addLit; + opt[last_match_pos+addLit].price = opt[last_match_pos].price + LZ4HC_literalsPrice(addLit); + DEBUGLOG(7, "rPos:%3i => price:%3i (litlen=%i)", last_match_pos+addLit, opt[last_match_pos+addLit].price, addLit); + } } + } /* for (cur = 1; cur <= last_match_pos; cur++) */ + + assert(last_match_pos < LZ4_OPT_NUM + TRAILING_LITERALS); + best_mlen = opt[last_match_pos].mlen; + best_off = opt[last_match_pos].off; + cur = last_match_pos - best_mlen; + + encode: /* cur, last_match_pos, best_mlen, best_off must be set */ + assert(cur < LZ4_OPT_NUM); + assert(last_match_pos >= 1); /* == 1 when only one candidate */ + DEBUGLOG(6, "reverse traversal, looking for shortest path (last_match_pos=%i)", last_match_pos); + { int candidate_pos = cur; + int selected_matchLength = best_mlen; + int selected_offset = best_off; + while (1) { /* from end to beginning */ + int const next_matchLength = opt[candidate_pos].mlen; /* can be 1, means literal */ + int const next_offset = opt[candidate_pos].off; + DEBUGLOG(7, "pos %i: sequence length %i", candidate_pos, selected_matchLength); + opt[candidate_pos].mlen = selected_matchLength; + opt[candidate_pos].off = selected_offset; + selected_matchLength = next_matchLength; + selected_offset = next_offset; + if (next_matchLength > candidate_pos) break; /* last match elected, first match to encode */ + assert(next_matchLength > 0); /* can be 1, means literal */ + candidate_pos -= next_matchLength; + } } + + /* encode all recorded sequences in order */ + { int rPos = 0; /* relative position (to ip) */ + while (rPos < last_match_pos) { + int const ml = opt[rPos].mlen; + int const offset = opt[rPos].off; + if (ml == 1) { ip++; rPos++; continue; } /* literal; note: can end up with several literals, in which case, skip them */ + rPos += ml; + assert(ml >= MINMATCH); + assert((offset >= 1) && (offset <= LZ4_DISTANCE_MAX)); + opSaved = op; + if ( LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ml, ip - offset, limit, oend) ) /* updates ip, op and anchor */ + goto _dest_overflow; + } } + } /* while (ip <= mflimit) */ + + _last_literals: + /* Encode Last Literals */ + { size_t lastRunSize = (size_t)(iend - anchor); /* literals */ + size_t litLength = (lastRunSize + 255 - RUN_MASK) / 255; + size_t const totalSize = 1 + litLength + lastRunSize; + if (limit == fillOutput) oend += LASTLITERALS; /* restore correct value */ + if (limit && (op + totalSize > oend)) { + if (limit == limitedOutput) return 0; /* Check output limit */ + /* adapt lastRunSize to fill 'dst' */ + lastRunSize = (size_t)(oend - op) - 1; + litLength = (lastRunSize + 255 - RUN_MASK) / 255; + lastRunSize -= litLength; + } + ip = anchor + lastRunSize; + + if (lastRunSize >= RUN_MASK) { + size_t accumulator = lastRunSize - RUN_MASK; + *op++ = (RUN_MASK << ML_BITS); + for(; accumulator >= 255 ; accumulator -= 255) *op++ = 255; + *op++ = (BYTE) accumulator; + } else { + *op++ = (BYTE)(lastRunSize << ML_BITS); + } + memcpy(op, anchor, lastRunSize); + op += lastRunSize; + } + + /* End */ + *srcSizePtr = (int) (((const char*)ip) - source); + return (int) ((char*)op-dst); + + _dest_overflow: + if (limit == fillOutput) { + op = opSaved; /* restore correct out pointer */ + goto _last_literals; + } + return 0; + } diff --git a/common/lz4/lz4hc.h b/common/lz4/lz4hc.h new file mode 100644 index 000000000..44e35bbf6 --- /dev/null +++ b/common/lz4/lz4hc.h @@ -0,0 +1,438 @@ +/* + LZ4 HC - High Compression Mode of LZ4 + Header File + Copyright (C) 2011-2017, Yann Collet. + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * 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 COPYRIGHT HOLDERS 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 COPYRIGHT + OWNER 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. + + You can contact the author at : + - LZ4 source repository : https://github.com/lz4/lz4 + - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c +*/ +#ifndef LZ4_HC_H_19834876238432 +#define LZ4_HC_H_19834876238432 + +#if defined (__cplusplus) +extern "C" { +#endif + +/* --- Dependency --- */ +/* note : lz4hc requires lz4.h/lz4.c for compilation */ +#include "lz4.h" /* stddef, LZ4LIB_API, LZ4_DEPRECATED */ + + +/* --- Useful constants --- */ +#define LZ4HC_CLEVEL_MIN 3 +#define LZ4HC_CLEVEL_DEFAULT 9 +#define LZ4HC_CLEVEL_OPT_MIN 10 +#define LZ4HC_CLEVEL_MAX 12 + + +/*-************************************ + * Block Compression + **************************************/ +/*! LZ4_compress_HC() : + * Compress data from `src` into `dst`, using the powerful but slower "HC" algorithm. + * `dst` must be already allocated. + * Compression is guaranteed to succeed if `dstCapacity >= LZ4_compressBound(srcSize)` (see "lz4.h") + * Max supported `srcSize` value is LZ4_MAX_INPUT_SIZE (see "lz4.h") + * `compressionLevel` : any value between 1 and LZ4HC_CLEVEL_MAX will work. + * Values > LZ4HC_CLEVEL_MAX behave the same as LZ4HC_CLEVEL_MAX. + * @return : the number of bytes written into 'dst' + * or 0 if compression fails. + */ +LZ4LIB_API int LZ4_compress_HC (const char* src, char* dst, int srcSize, int dstCapacity, int compressionLevel); + + +/* Note : + * Decompression functions are provided within "lz4.h" (BSD license) + */ + + +/*! LZ4_compress_HC_extStateHC() : + * Same as LZ4_compress_HC(), but using an externally allocated memory segment for `state`. + * `state` size is provided by LZ4_sizeofStateHC(). + * Memory segment must be aligned on 8-bytes boundaries (which a normal malloc() should do properly). + */ +LZ4LIB_API int LZ4_sizeofStateHC(void); +LZ4LIB_API int LZ4_compress_HC_extStateHC(void* stateHC, const char* src, char* dst, int srcSize, int maxDstSize, int compressionLevel); + + +/*! LZ4_compress_HC_destSize() : v1.9.0+ + * Will compress as much data as possible from `src` + * to fit into `targetDstSize` budget. + * Result is provided in 2 parts : + * @return : the number of bytes written into 'dst' (necessarily <= targetDstSize) + * or 0 if compression fails. + * `srcSizePtr` : on success, *srcSizePtr is updated to indicate how much bytes were read from `src` + */ +LZ4LIB_API int LZ4_compress_HC_destSize(void* stateHC, + const char* src, char* dst, + int* srcSizePtr, int targetDstSize, + int compressionLevel); + + +/*-************************************ + * Streaming Compression + * Bufferless synchronous API + **************************************/ + typedef union LZ4_streamHC_u LZ4_streamHC_t; /* incomplete type (defined later) */ + +/*! LZ4_createStreamHC() and LZ4_freeStreamHC() : + * These functions create and release memory for LZ4 HC streaming state. + * Newly created states are automatically initialized. + * A same state can be used multiple times consecutively, + * starting with LZ4_resetStreamHC_fast() to start a new stream of blocks. + */ +LZ4LIB_API LZ4_streamHC_t* LZ4_createStreamHC(void); +LZ4LIB_API int LZ4_freeStreamHC (LZ4_streamHC_t* streamHCPtr); + +/* + These functions compress data in successive blocks of any size, + using previous blocks as dictionary, to improve compression ratio. + One key assumption is that previous blocks (up to 64 KB) remain read-accessible while compressing next blocks. + There is an exception for ring buffers, which can be smaller than 64 KB. + Ring-buffer scenario is automatically detected and handled within LZ4_compress_HC_continue(). + + Before starting compression, state must be allocated and properly initialized. + LZ4_createStreamHC() does both, though compression level is set to LZ4HC_CLEVEL_DEFAULT. + + Selecting the compression level can be done with LZ4_resetStreamHC_fast() (starts a new stream) + or LZ4_setCompressionLevel() (anytime, between blocks in the same stream) (experimental). + LZ4_resetStreamHC_fast() only works on states which have been properly initialized at least once, + which is automatically the case when state is created using LZ4_createStreamHC(). + + After reset, a first "fictional block" can be designated as initial dictionary, + using LZ4_loadDictHC() (Optional). + + Invoke LZ4_compress_HC_continue() to compress each successive block. + The number of blocks is unlimited. + Previous input blocks, including initial dictionary when present, + must remain accessible and unmodified during compression. + + It's allowed to update compression level anytime between blocks, + using LZ4_setCompressionLevel() (experimental). + + 'dst' buffer should be sized to handle worst case scenarios + (see LZ4_compressBound(), it ensures compression success). + In case of failure, the API does not guarantee recovery, + so the state _must_ be reset. + To ensure compression success + whenever `dst` buffer size cannot be made >= LZ4_compressBound(), + consider using LZ4_compress_HC_continue_destSize(). + + Whenever previous input blocks can't be preserved unmodified in-place during compression of next blocks, + it's possible to copy the last blocks into a more stable memory space, using LZ4_saveDictHC(). + Return value of LZ4_saveDictHC() is the size of dictionary effectively saved into 'safeBuffer' (<= 64 KB) + + After completing a streaming compression, + it's possible to start a new stream of blocks, using the same LZ4_streamHC_t state, + just by resetting it, using LZ4_resetStreamHC_fast(). +*/ + +LZ4LIB_API void LZ4_resetStreamHC_fast(LZ4_streamHC_t* streamHCPtr, int compressionLevel); /* v1.9.0+ */ +LZ4LIB_API int LZ4_loadDictHC (LZ4_streamHC_t* streamHCPtr, const char* dictionary, int dictSize); + +LZ4LIB_API int LZ4_compress_HC_continue (LZ4_streamHC_t* streamHCPtr, + const char* src, char* dst, + int srcSize, int maxDstSize); + +/*! LZ4_compress_HC_continue_destSize() : v1.9.0+ + * Similar to LZ4_compress_HC_continue(), + * but will read as much data as possible from `src` + * to fit into `targetDstSize` budget. + * Result is provided into 2 parts : + * @return : the number of bytes written into 'dst' (necessarily <= targetDstSize) + * or 0 if compression fails. + * `srcSizePtr` : on success, *srcSizePtr will be updated to indicate how much bytes were read from `src`. + * Note that this function may not consume the entire input. + */ +LZ4LIB_API int LZ4_compress_HC_continue_destSize(LZ4_streamHC_t* LZ4_streamHCPtr, + const char* src, char* dst, + int* srcSizePtr, int targetDstSize); + +LZ4LIB_API int LZ4_saveDictHC (LZ4_streamHC_t* streamHCPtr, char* safeBuffer, int maxDictSize); + + + +/*^********************************************** + * !!!!!! STATIC LINKING ONLY !!!!!! + ***********************************************/ + +/*-****************************************************************** + * PRIVATE DEFINITIONS : + * Do not use these definitions directly. + * They are merely exposed to allow static allocation of `LZ4_streamHC_t`. + * Declare an `LZ4_streamHC_t` directly, rather than any type below. + * Even then, only do so in the context of static linking, as definitions may change between versions. + ********************************************************************/ + +#define LZ4HC_DICTIONARY_LOGSIZE 16 +#define LZ4HC_MAXD (1<<LZ4HC_DICTIONARY_LOGSIZE) +#define LZ4HC_MAXD_MASK (LZ4HC_MAXD - 1) + +#define LZ4HC_HASH_LOG 15 +#define LZ4HC_HASHTABLESIZE (1 << LZ4HC_HASH_LOG) +#define LZ4HC_HASH_MASK (LZ4HC_HASHTABLESIZE - 1) + + +#if defined(__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +#include <stdint.h> + +typedef struct LZ4HC_CCtx_internal LZ4HC_CCtx_internal; +struct LZ4HC_CCtx_internal +{ + uint32_t hashTable[LZ4HC_HASHTABLESIZE]; + uint16_t chainTable[LZ4HC_MAXD]; + const uint8_t* end; /* next block here to continue on current prefix */ + const uint8_t* base; /* All index relative to this position */ + const uint8_t* dictBase; /* alternate base for extDict */ + uint32_t dictLimit; /* below that point, need extDict */ + uint32_t lowLimit; /* below that point, no more dict */ + uint32_t nextToUpdate; /* index from which to continue dictionary update */ + short compressionLevel; + int8_t favorDecSpeed; /* favor decompression speed if this flag set, + otherwise, favor compression ratio */ + int8_t dirty; /* stream has to be fully reset if this flag is set */ + const LZ4HC_CCtx_internal* dictCtx; +}; + +#else + +typedef struct LZ4HC_CCtx_internal LZ4HC_CCtx_internal; +struct LZ4HC_CCtx_internal +{ + unsigned int hashTable[LZ4HC_HASHTABLESIZE]; + unsigned short chainTable[LZ4HC_MAXD]; + const unsigned char* end; /* next block here to continue on current prefix */ + const unsigned char* base; /* All index relative to this position */ + const unsigned char* dictBase; /* alternate base for extDict */ + unsigned int dictLimit; /* below that point, need extDict */ + unsigned int lowLimit; /* below that point, no more dict */ + unsigned int nextToUpdate; /* index from which to continue dictionary update */ + short compressionLevel; + char favorDecSpeed; /* favor decompression speed if this flag set, + otherwise, favor compression ratio */ + char dirty; /* stream has to be fully reset if this flag is set */ + const LZ4HC_CCtx_internal* dictCtx; +}; + +#endif + + +/* Do not use these definitions directly ! + * Declare or allocate an LZ4_streamHC_t instead. + */ +#define LZ4_STREAMHCSIZE (4*LZ4HC_HASHTABLESIZE + 2*LZ4HC_MAXD + 56 + ((sizeof(void*)==16) ? 56 : 0) /* AS400*/ ) /* 262200 or 262256*/ +#define LZ4_STREAMHCSIZE_SIZET (LZ4_STREAMHCSIZE / sizeof(size_t)) +union LZ4_streamHC_u { + size_t table[LZ4_STREAMHCSIZE_SIZET]; + LZ4HC_CCtx_internal internal_donotuse; +}; /* previously typedef'd to LZ4_streamHC_t */ + +/* LZ4_streamHC_t : + * This structure allows static allocation of LZ4 HC streaming state. + * This can be used to allocate statically, on state, or as part of a larger structure. + * + * Such state **must** be initialized using LZ4_initStreamHC() before first use. + * + * Note that invoking LZ4_initStreamHC() is not required when + * the state was created using LZ4_createStreamHC() (which is recommended). + * Using the normal builder, a newly created state is automatically initialized. + * + * Static allocation shall only be used in combination with static linking. + */ + +/* LZ4_initStreamHC() : v1.9.0+ + * Required before first use of a statically allocated LZ4_streamHC_t. + * Before v1.9.0 : use LZ4_resetStreamHC() instead + */ +LZ4LIB_API LZ4_streamHC_t* LZ4_initStreamHC (void* buffer, size_t size); + + +/*-************************************ +* Deprecated Functions +**************************************/ +/* see lz4.h LZ4_DISABLE_DEPRECATE_WARNINGS to turn off deprecation warnings */ + +/* deprecated compression functions */ +LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC (const char* source, char* dest, int inputSize); +LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC_limitedOutput (const char* source, char* dest, int inputSize, int maxOutputSize); +LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC2 (const char* source, char* dest, int inputSize, int compressionLevel); +LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC2_limitedOutput(const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel); +LZ4_DEPRECATED("use LZ4_compress_HC_extStateHC() instead") LZ4LIB_API int LZ4_compressHC_withStateHC (void* state, const char* source, char* dest, int inputSize); +LZ4_DEPRECATED("use LZ4_compress_HC_extStateHC() instead") LZ4LIB_API int LZ4_compressHC_limitedOutput_withStateHC (void* state, const char* source, char* dest, int inputSize, int maxOutputSize); +LZ4_DEPRECATED("use LZ4_compress_HC_extStateHC() instead") LZ4LIB_API int LZ4_compressHC2_withStateHC (void* state, const char* source, char* dest, int inputSize, int compressionLevel); +LZ4_DEPRECATED("use LZ4_compress_HC_extStateHC() instead") LZ4LIB_API int LZ4_compressHC2_limitedOutput_withStateHC(void* state, const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel); +LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") LZ4LIB_API int LZ4_compressHC_continue (LZ4_streamHC_t* LZ4_streamHCPtr, const char* source, char* dest, int inputSize); +LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") LZ4LIB_API int LZ4_compressHC_limitedOutput_continue (LZ4_streamHC_t* LZ4_streamHCPtr, const char* source, char* dest, int inputSize, int maxOutputSize); + +/* Obsolete streaming functions; degraded functionality; do not use! + * + * In order to perform streaming compression, these functions depended on data + * that is no longer tracked in the state. They have been preserved as well as + * possible: using them will still produce a correct output. However, use of + * LZ4_slideInputBufferHC() will truncate the history of the stream, rather + * than preserve a window-sized chunk of history. + */ +LZ4_DEPRECATED("use LZ4_createStreamHC() instead") LZ4LIB_API void* LZ4_createHC (const char* inputBuffer); +LZ4_DEPRECATED("use LZ4_saveDictHC() instead") LZ4LIB_API char* LZ4_slideInputBufferHC (void* LZ4HC_Data); +LZ4_DEPRECATED("use LZ4_freeStreamHC() instead") LZ4LIB_API int LZ4_freeHC (void* LZ4HC_Data); +LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") LZ4LIB_API int LZ4_compressHC2_continue (void* LZ4HC_Data, const char* source, char* dest, int inputSize, int compressionLevel); +LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") LZ4LIB_API int LZ4_compressHC2_limitedOutput_continue (void* LZ4HC_Data, const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel); +LZ4_DEPRECATED("use LZ4_createStreamHC() instead") LZ4LIB_API int LZ4_sizeofStreamStateHC(void); +LZ4_DEPRECATED("use LZ4_initStreamHC() instead") LZ4LIB_API int LZ4_resetStreamStateHC(void* state, char* inputBuffer); + + +/* LZ4_resetStreamHC() is now replaced by LZ4_initStreamHC(). + * The intention is to emphasize the difference with LZ4_resetStreamHC_fast(), + * which is now the recommended function to start a new stream of blocks, + * but cannot be used to initialize a memory segment containing arbitrary garbage data. + * + * It is recommended to switch to LZ4_initStreamHC(). + * LZ4_resetStreamHC() will generate deprecation warnings in a future version. + */ +LZ4LIB_API void LZ4_resetStreamHC (LZ4_streamHC_t* streamHCPtr, int compressionLevel); + + +#if defined (__cplusplus) +} +#endif + +#endif /* LZ4_HC_H_19834876238432 */ + + +/*-************************************************** + * !!!!! STATIC LINKING ONLY !!!!! + * Following definitions are considered experimental. + * They should not be linked from DLL, + * as there is no guarantee of API stability yet. + * Prototypes will be promoted to "stable" status + * after successfull usage in real-life scenarios. + ***************************************************/ +#ifdef LZ4_HC_STATIC_LINKING_ONLY /* protection macro */ +#ifndef LZ4_HC_SLO_098092834 +#define LZ4_HC_SLO_098092834 + +#define LZ4_STATIC_LINKING_ONLY /* LZ4LIB_STATIC_API */ +#include "lz4.h" + +#if defined (__cplusplus) +extern "C" { +#endif + +/*! LZ4_setCompressionLevel() : v1.8.0+ (experimental) + * It's possible to change compression level + * between successive invocations of LZ4_compress_HC_continue*() + * for dynamic adaptation. + */ +LZ4LIB_STATIC_API void LZ4_setCompressionLevel( + LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel); + +/*! LZ4_favorDecompressionSpeed() : v1.8.2+ (experimental) + * Opt. Parser will favor decompression speed over compression ratio. + * Only applicable to levels >= LZ4HC_CLEVEL_OPT_MIN. + */ +LZ4LIB_STATIC_API void LZ4_favorDecompressionSpeed( + LZ4_streamHC_t* LZ4_streamHCPtr, int favor); + +/*! LZ4_resetStreamHC_fast() : v1.9.0+ + * When an LZ4_streamHC_t is known to be in a internally coherent state, + * it can often be prepared for a new compression with almost no work, only + * sometimes falling back to the full, expensive reset that is always required + * when the stream is in an indeterminate state (i.e., the reset performed by + * LZ4_resetStreamHC()). + * + * LZ4_streamHCs are guaranteed to be in a valid state when: + * - returned from LZ4_createStreamHC() + * - reset by LZ4_resetStreamHC() + * - memset(stream, 0, sizeof(LZ4_streamHC_t)) + * - the stream was in a valid state and was reset by LZ4_resetStreamHC_fast() + * - the stream was in a valid state and was then used in any compression call + * that returned success + * - the stream was in an indeterminate state and was used in a compression + * call that fully reset the state (LZ4_compress_HC_extStateHC()) and that + * returned success + * + * Note: + * A stream that was last used in a compression call that returned an error + * may be passed to this function. However, it will be fully reset, which will + * clear any existing history and settings from the context. + */ +LZ4LIB_STATIC_API void LZ4_resetStreamHC_fast( + LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel); + +/*! LZ4_compress_HC_extStateHC_fastReset() : + * A variant of LZ4_compress_HC_extStateHC(). + * + * Using this variant avoids an expensive initialization step. It is only safe + * to call if the state buffer is known to be correctly initialized already + * (see above comment on LZ4_resetStreamHC_fast() for a definition of + * "correctly initialized"). From a high level, the difference is that this + * function initializes the provided state with a call to + * LZ4_resetStreamHC_fast() while LZ4_compress_HC_extStateHC() starts with a + * call to LZ4_resetStreamHC(). + */ +LZ4LIB_STATIC_API int LZ4_compress_HC_extStateHC_fastReset ( + void* state, + const char* src, char* dst, + int srcSize, int dstCapacity, + int compressionLevel); + +/*! LZ4_attach_HC_dictionary() : + * This is an experimental API that allows for the efficient use of a + * static dictionary many times. + * + * Rather than re-loading the dictionary buffer into a working context before + * each compression, or copying a pre-loaded dictionary's LZ4_streamHC_t into a + * working LZ4_streamHC_t, this function introduces a no-copy setup mechanism, + * in which the working stream references the dictionary stream in-place. + * + * Several assumptions are made about the state of the dictionary stream. + * Currently, only streams which have been prepared by LZ4_loadDictHC() should + * be expected to work. + * + * Alternatively, the provided dictionary stream pointer may be NULL, in which + * case any existing dictionary stream is unset. + * + * A dictionary should only be attached to a stream without any history (i.e., + * a stream that has just been reset). + * + * The dictionary will remain attached to the working stream only for the + * current stream session. Calls to LZ4_resetStreamHC(_fast) will remove the + * dictionary context association from the working stream. The dictionary + * stream (and source buffer) must remain in-place / accessible / unchanged + * through the lifetime of the stream session. + */ +LZ4LIB_STATIC_API void LZ4_attach_HC_dictionary( + LZ4_streamHC_t *working_stream, + const LZ4_streamHC_t *dictionary_stream); + +#if defined (__cplusplus) +} +#endif + +#endif /* LZ4_HC_SLO_098092834 */ +#endif /* LZ4_HC_STATIC_LINKING_ONLY */ diff --git a/common_fpga/fpga.h b/common_fpga/fpga.h index f1b42ab2b..c8390ff7e 100644 --- a/common_fpga/fpga.h +++ b/common_fpga/fpga.h @@ -13,7 +13,7 @@ #define FPGA_BITSTREAM_FIXED_HEADER_SIZE sizeof(bitparse_fixed_header) #define FPGA_INTERLEAVE_SIZE 288 #define FPGA_CONFIG_SIZE 42336L // our current fpga_[lh]f.bit files are 42175 bytes. Rounded up to next multiple of FPGA_INTERLEAVE_SIZE - +#define FPGA_RING_BUFFER_BYTES (1024 * 39) #define FPGA_TRACE_SIZE 3072 static const uint8_t bitparse_fixed_header[] = {0x00, 0x09, 0x0f, 0xf0, 0x0f, 0xf0, 0x0f, 0xf0, 0x0f, 0xf0, 0x00, 0x00, 0x01}; From cb032864203ba80187e0616b1622b6d7068e2aef Mon Sep 17 00:00:00 2001 From: slurdge <slurdge@slurdge.org> Date: Wed, 3 Jun 2020 16:07:35 +0200 Subject: [PATCH 506/632] fpga_compress uses lz4 --- tools/fpga_compress/Makefile | 12 +- tools/fpga_compress/fpga_compress.c | 209 ++++++++++------------------ 2 files changed, 78 insertions(+), 143 deletions(-) diff --git a/tools/fpga_compress/Makefile b/tools/fpga_compress/Makefile index 5452f9083..26b34ba61 100644 --- a/tools/fpga_compress/Makefile +++ b/tools/fpga_compress/Makefile @@ -1,13 +1,14 @@ -MYSRCPATHS = +MYSRCPATHS = MYINCLUDES = -I../../common_fpga MYCFLAGS = -std=c99 -D_ISOC99_SOURCE MYDEFS = MYSRCS = MYLIBS = -ZLIBPATH = ../../common/zlib -MYINCLUDES += -I$(ZLIBPATH) -MYLIBS += $(OBJDIR)/libz.a +MYSRCPATHS += ../../common/lz4 +MYINCLUDES += -I../../common/lz4 +MYSRCS += lz4hc.c lz4.c +MYCFLAGS += -DLZ4_MEMORY_USAGE=20 -Wno-redundant-decls -Wno-old-style-definition -Wno-missing-prototypes -Wno-missing-declarations BINS = fpga_compress @@ -16,9 +17,6 @@ ROOT_DIR:=$(dir $(realpath $(lastword $(MAKEFILE_LIST)))) include ../../Makefile.host fpga_compress: $(OBJDIR)/fpga_compress.o $(MYOBJS) -$(OBJDIR)/libz.a: - $(info [*] MAKE zlib) - $(Q)$(MAKE) --no-print-directory -C $(ZLIBPATH) OBJDIR=$(ROOT_DIR)$(OBJDIR) BINDIR=$(ROOT_DIR)$(OBJDIR) all tarbin: $(BINS) $(info [=] TAR ../proxmark3-$(platform)-bin.tar) diff --git a/tools/fpga_compress/fpga_compress.c b/tools/fpga_compress/fpga_compress.c index a99cc3fee..fc136523d 100644 --- a/tools/fpga_compress/fpga_compress.c +++ b/tools/fpga_compress/fpga_compress.c @@ -7,7 +7,7 @@ //----------------------------------------------------------------------------- // Compression tool for FPGA config files. Compress several *.bit files at // compile time. Decompression is done at run time (see fpgaloader.c). -// This uses the zlib library tuned to this specific case. The small file sizes +// This uses the lz4 library tuned to this specific case. The small file sizes // allow to use "insane" parameters for optimum compression ratio. //----------------------------------------------------------------------------- @@ -15,28 +15,11 @@ #include <stdlib.h> #include <libgen.h> #include <string.h> +#include <stdint.h> +#include <stdbool.h> +#include <inttypes.h> #include "fpga.h" -#include "zlib.h" - -// zlib configuration -#define COMPRESS_LEVEL 9 // use best possible compression -#define COMPRESS_WINDOW_BITS 15 // default = max = 15 for a window of 2^15 = 32KBytes -#define COMPRESS_MEM_LEVEL 9 // determines the amount of memory allocated during compression. Default = 8. - -/* COMPRESS_STRATEGY can be - Z_DEFAULT_STRATEGY (the default), - Z_FILTERED (more huffmann, less string matching), - Z_HUFFMAN_ONLY (huffman only, no string matching) - Z_RLE (distances limited to one) - Z_FIXED (prevents the use of dynamic Huffman codes) -*/ - -#define COMPRESS_STRATEGY Z_DEFAULT_STRATEGY -// zlib tuning parameters: -#define COMPRESS_GOOD_LENGTH 258 -#define COMPRESS_MAX_LAZY 258 -#define COMPRESS_MAX_NICE_LENGTH 258 -#define COMPRESS_MAX_CHAIN 8192 +#include "lz4hc.h" #define HARDNESTED_TABLE_SIZE (uint32_t)(sizeof(uint32_t) * ((1L<<19)+1)) @@ -52,18 +35,6 @@ static void usage(void) { } -static voidpf fpga_deflate_malloc(voidpf opaque, uInt items, uInt size) { - (void) opaque; - return calloc(items * size, sizeof(uint8_t)); -} - - -static void fpga_deflate_free(voidpf opaque, voidpf address) { - (void) opaque; - free(address); -} - - static bool all_feof(FILE *infile[], uint8_t num_infiles) { for (uint16_t i = 0; i < num_infiles; i++) { if (!feof(infile[i])) { @@ -76,10 +47,8 @@ static bool all_feof(FILE *infile[], uint8_t num_infiles) { static int zlib_compress(FILE *infile[], uint8_t num_infiles, FILE *outfile, bool hardnested_mode) { uint8_t *fpga_config; - uint32_t i; - int32_t ret; + //int32_t ret; uint8_t c; - z_stream compressed_fpga_stream; if (hardnested_mode) { fpga_config = calloc(num_infiles * HARDNESTED_TABLE_SIZE, sizeof(uint8_t)); @@ -87,10 +56,10 @@ static int zlib_compress(FILE *infile[], uint8_t num_infiles, FILE *outfile, boo fpga_config = calloc(num_infiles * FPGA_CONFIG_SIZE, sizeof(uint8_t)); } // read the input files. Interleave them into fpga_config[] - i = 0; + uint32_t total_size = 0; do { - if (i >= num_infiles * (hardnested_mode ? HARDNESTED_TABLE_SIZE : FPGA_CONFIG_SIZE)) { + if (total_size >= num_infiles * (hardnested_mode ? HARDNESTED_TABLE_SIZE : FPGA_CONFIG_SIZE)) { if (hardnested_mode) { fprintf(stderr, "Input file too big (> %" PRIu32 " bytes). This is probably not a hardnested bitflip state table.\n" @@ -112,53 +81,47 @@ static int zlib_compress(FILE *infile[], uint8_t num_infiles, FILE *outfile, boo for (uint16_t k = 0; k < FPGA_INTERLEAVE_SIZE; k++) { c = (uint8_t)fgetc(infile[j]); if (!feof(infile[j])) { - fpga_config[i++] = c; + fpga_config[total_size++] = c; } else if (num_infiles > 1) { - fpga_config[i++] = '\0'; + fpga_config[total_size++] = '\0'; } } } } while (!all_feof(infile, num_infiles)); - // initialize zlib structures - compressed_fpga_stream.next_in = fpga_config; - compressed_fpga_stream.avail_in = i; - compressed_fpga_stream.zalloc = fpga_deflate_malloc; - compressed_fpga_stream.zfree = fpga_deflate_free; - compressed_fpga_stream.opaque = Z_NULL; + uint32_t buffer_size = FPGA_RING_BUFFER_BYTES; + if (num_infiles == 1) + buffer_size = 1024*1024; //1M for now + uint32_t outsize_max = LZ4_compressBound(buffer_size); - ret = deflateInit2(&compressed_fpga_stream, - COMPRESS_LEVEL, - Z_DEFLATED, - COMPRESS_WINDOW_BITS, - COMPRESS_MEM_LEVEL, - COMPRESS_STRATEGY); + char *outbuf = calloc(outsize_max, sizeof(char)); - // estimate the size of the compressed output - uint32_t outsize_max = deflateBound(&compressed_fpga_stream, compressed_fpga_stream.avail_in); - uint8_t *outbuf = calloc(outsize_max, sizeof(uint8_t)); - compressed_fpga_stream.next_out = outbuf; - compressed_fpga_stream.avail_out = outsize_max; + LZ4_streamHC_t* lz4_streamhc = LZ4_createStreamHC(); + LZ4_resetStreamHC_fast(lz4_streamhc, LZ4HC_CLEVEL_MAX); - if (ret == Z_OK) { - ret = deflateTune(&compressed_fpga_stream, - COMPRESS_GOOD_LENGTH, - COMPRESS_MAX_LAZY, - COMPRESS_MAX_NICE_LENGTH, - COMPRESS_MAX_CHAIN); + int current_in = 0; + int current_out = 0; + char * ring_buffer = calloc(buffer_size, sizeof(char)); + while (current_in < total_size) { + int bytes_to_copy = FPGA_RING_BUFFER_BYTES; + if (total_size - current_in < FPGA_RING_BUFFER_BYTES) + bytes_to_copy = total_size - current_in; + memcpy(ring_buffer, fpga_config + current_in, bytes_to_copy); + int cmp_bytes = LZ4_compress_HC_continue(lz4_streamhc, ring_buffer, outbuf, bytes_to_copy, outsize_max); + fwrite(&cmp_bytes, sizeof(int), 1, outfile); + fwrite(outbuf, sizeof(char), cmp_bytes, outfile); + current_in += bytes_to_copy; + current_out += cmp_bytes; } - if (ret == Z_OK) { - ret = deflate(&compressed_fpga_stream, Z_FINISH); - } + free(ring_buffer); - fprintf(stdout, "compressed %u input bytes to %lu output bytes\n", i, compressed_fpga_stream.total_out); + fprintf(stdout, "compressed %u input bytes to %u output bytes\n", total_size, current_out); - if (ret != Z_STREAM_END) { - fprintf(stderr, "Error in deflate(): %d %s\n", ret, compressed_fpga_stream.msg); + if (current_out == 0) { + fprintf(stderr, "Error in lz4"); free(outbuf); - deflateEnd(&compressed_fpga_stream); for (uint16_t j = 0; j < num_infiles; j++) { fclose(infile[j]); } @@ -167,90 +130,64 @@ static int zlib_compress(FILE *infile[], uint8_t num_infiles, FILE *outfile, boo return (EXIT_FAILURE); } - for (i = 0; i < compressed_fpga_stream.total_out; i++) { - fputc(outbuf[i], outfile); - } - free(outbuf); - deflateEnd(&compressed_fpga_stream); + for (uint16_t j = 0; j < num_infiles; j++) { fclose(infile[j]); } fclose(outfile); + LZ4_freeStreamHC(lz4_streamhc); free(fpga_config); return (EXIT_SUCCESS); } +typedef struct lz4_stream_s { + LZ4_streamDecode_t* lz4StreamDecode; + char * next_in; + int avail_in; +} lz4_stream; static int zlib_decompress(FILE *infile, FILE *outfile) { -#define DECOMPRESS_BUF_SIZE 1024 - uint8_t outbuf[DECOMPRESS_BUF_SIZE]; - uint8_t inbuf[DECOMPRESS_BUF_SIZE]; - int32_t ret; - z_stream compressed_fpga_stream; + LZ4_streamDecode_t lz4StreamDecode_body = { 0 }; + char outbuf[FPGA_RING_BUFFER_BYTES]; - // initialize zlib structures - compressed_fpga_stream.next_in = inbuf; - compressed_fpga_stream.avail_in = 0; - compressed_fpga_stream.next_out = outbuf; - compressed_fpga_stream.avail_out = DECOMPRESS_BUF_SIZE; - compressed_fpga_stream.zalloc = fpga_deflate_malloc; - compressed_fpga_stream.zfree = fpga_deflate_free; - compressed_fpga_stream.opaque = Z_NULL; + fseek(infile, 0L, SEEK_END); + long infile_size = ftell(infile); + fseek(infile, 0L, SEEK_SET); - ret = inflateInit2(&compressed_fpga_stream, 0); - if (ret < 0) - return (EXIT_FAILURE); + char * inbuf = calloc(infile_size, sizeof(char)); + size_t num_read = fread(inbuf, sizeof(char), infile_size, infile); - do { - if (compressed_fpga_stream.avail_in == 0) { - compressed_fpga_stream.next_in = inbuf; - uint16_t i = 0; - do { - int32_t c = fgetc(infile); - if (!feof(infile)) { - inbuf[i++] = c & 0xFF; - compressed_fpga_stream.avail_in++; - } else { - break; - } - } while (i < DECOMPRESS_BUF_SIZE); - } - - ret = inflate(&compressed_fpga_stream, Z_SYNC_FLUSH); - - if (ret != Z_OK && ret != Z_STREAM_END) { - break; - } - - if (compressed_fpga_stream.avail_out == 0) { - for (uint16_t i = 0; i < DECOMPRESS_BUF_SIZE; i++) { - fputc(outbuf[i], outfile); - } - compressed_fpga_stream.avail_out = DECOMPRESS_BUF_SIZE; - compressed_fpga_stream.next_out = outbuf; - } - } while (ret == Z_OK); - - if (ret == Z_STREAM_END) { // reached end of input - uint16_t i = 0; - while (compressed_fpga_stream.avail_out < DECOMPRESS_BUF_SIZE) { - fputc(outbuf[i++], outfile); - compressed_fpga_stream.avail_out++; - } - fclose(outfile); - fclose(infile); - return (EXIT_SUCCESS); - } else { - fprintf(stderr, "Error. Inflate() returned error %d, %s", ret, compressed_fpga_stream.msg); - fclose(outfile); - fclose(infile); + if (num_read != infile_size) { return (EXIT_FAILURE); } + lz4_stream compressed_fpga_stream; + // initialize lz4 structures + compressed_fpga_stream.lz4StreamDecode = &lz4StreamDecode_body; + compressed_fpga_stream.next_in = inbuf; + compressed_fpga_stream.avail_in = infile_size; + + int total_size = 0; + while (compressed_fpga_stream.avail_in > 0) { + const int cmp_bytes = *(int*)(compressed_fpga_stream.next_in); + compressed_fpga_stream.next_in += 4; + compressed_fpga_stream.avail_in -= cmp_bytes + 4; + const int decBytes = LZ4_decompress_safe_continue(compressed_fpga_stream.lz4StreamDecode, compressed_fpga_stream.next_in, outbuf, cmp_bytes, FPGA_RING_BUFFER_BYTES); + if (decBytes <= 0) { + break; + } + fwrite(outbuf, decBytes, sizeof(char), outfile); + total_size += decBytes; + compressed_fpga_stream.next_in += cmp_bytes; + } + printf("uncompressed %li input bytes to %i output bytes\n", infile_size, total_size); + fclose(outfile); + fclose(infile); + return (EXIT_SUCCESS); } @@ -342,7 +279,7 @@ static int FpgaGatherVersion(FILE *infile, char *infile_name, char *dst, int len strncat(dst, " on ", len - strlen(dst) - 1); for (uint16_t i = 0; i < fpga_info_len; i++) { char c = (char)fgetc(infile); - if (i < sizeof(tempstr)) { + if (i < sizeof(tempstr)) { if (c == '/') c = '-'; if (c == ' ') c = '0'; tempstr[i] = c; From 4ba4c76081dea4d72fe22d1e203ddd3132faf75c Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 3 Jun 2020 17:27:38 +0200 Subject: [PATCH 507/632] added a loadEML_safe fct --- client/src/fileutils.c | 92 +++++++++++++++++++++++++++++++++++++++++- client/src/fileutils.h | 2 + 2 files changed, 93 insertions(+), 1 deletion(-) diff --git a/client/src/fileutils.c b/client/src/fileutils.c index 9fc8d5f95..3d3175859 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -737,6 +737,9 @@ out: } int loadFile_safe(const char *preferredName, const char *suffix, void **pdata, size_t *datalen) { + return loadFile_safeEx(preferredName, suffix, pdata, datalen, true); +} +int loadFile_safeEx(const char *preferredName, const char *suffix, void **pdata, size_t *datalen, bool verbose) { char *path; int res = searchFile(&path, RESOURCES_SUBDIR, preferredName, suffix, false); @@ -782,7 +785,8 @@ int loadFile_safe(const char *preferredName, const char *suffix, void **pdata, s *datalen = bytes_read; - PrintAndLogEx(SUCCESS, "loaded " _YELLOW_("%zu") " bytes from binary file " _YELLOW_("%s"), bytes_read, preferredName); + if (verbose) + PrintAndLogEx(SUCCESS, "loaded " _YELLOW_("%zu") " bytes from binary file " _YELLOW_("%s"), bytes_read, preferredName); return PM3_SUCCESS; } @@ -848,6 +852,92 @@ out: return retval; } +int loadFileEML_safe(const char *preferredName, void **pdata, size_t *datalen) { + char *path; + int res = searchFile(&path, RESOURCES_SUBDIR, preferredName, "", false); + if (res != PM3_SUCCESS) { + return PM3_EFILE; + } + + FILE *f = fopen(path, "r"); + if (!f) { + PrintAndLogEx(WARNING, "file not found or locked. '" _YELLOW_("%s")"'", path); + free(path); + return PM3_EFILE; + } + free(path); + + // get filesize in order to malloc memory + fseek(f, 0, SEEK_END); + long fsize = ftell(f); + fseek(f, 0, SEEK_SET); + + if (fsize <= 0) { + PrintAndLogEx(FAILED, "error, when getting filesize"); + fclose(f); + return PM3_EFILE; + } + + *pdata = calloc(fsize, sizeof(uint8_t)); + if (!*pdata) { + PrintAndLogEx(FAILED, "error, cannot allocate memory"); + fclose(f); + return PM3_EMALLOC; + } + + // 128 + 2 newline chars + 1 null terminator + char line[131]; + memset(line, 0, sizeof(line)); + uint8_t buf[64] = {0x00}; + size_t counter = 0; + int retval = PM3_SUCCESS, hexlen = 0; + + uint8_t *tmp = (uint8_t *)*pdata; + + while (!feof(f)) { + + memset(line, 0, sizeof(line)); + + if (fgets(line, sizeof(line), f) == NULL) { + if (feof(f)) + break; + + fclose(f); + PrintAndLogEx(FAILED, "File reading error."); + return PM3_EFILE; + } + + if (line[0] == '#') + continue; + + strcleanrn(line, sizeof(line)); + + res = param_gethex_to_eol(line, 0, buf, sizeof(buf), &hexlen); + if (res == 0) { + memcpy( tmp + counter, buf, hexlen); + counter += hexlen; + } else { + retval = PM3_ESOFT; + } + } + fclose(f); + PrintAndLogEx(SUCCESS, "loaded " _YELLOW_("%zu") " bytes from text file " _YELLOW_("%s"), counter, preferredName); + + + uint8_t *newdump = realloc(*pdata, counter); + if (newdump == NULL) { + free(*pdata); + return PM3_EMALLOC; + } else { + *pdata = newdump; + } + + if (datalen) + *datalen = counter; + + return retval; +} + int loadFileJSON(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen, void (*callback)(json_t *)) { return loadFileJSONex(preferredName, data, maxdatalen, datalen, true, callback); } diff --git a/client/src/fileutils.h b/client/src/fileutils.h index 96170a440..d3d757408 100644 --- a/client/src/fileutils.h +++ b/client/src/fileutils.h @@ -177,6 +177,7 @@ int loadFile(const char *preferredName, const char *suffix, void *data, size_t m * @return PM3_SUCCESS for ok, PM3_E* for failz */ int loadFile_safe(const char *preferredName, const char *suffix, void **pdata, size_t *datalen); +int loadFile_safeEx(const char *preferredName, const char *suffix, void **pdata, size_t *datalen, bool verbose); /** * @brief Utility function to load data from a textfile (EML). This method takes a preferred name. * E.g. dumpdata-15.txt @@ -187,6 +188,7 @@ int loadFile_safe(const char *preferredName, const char *suffix, void **pdata, s * @return 0 for ok, 1 for failz */ int loadFileEML(const char *preferredName, void *data, size_t *datalen); +int loadFileEML_safe(const char *preferredName, void **pdata, size_t *datalen); /** * @brief Utility function to load data from a JSON textfile. This method takes a preferred name. From bbd9271fa3575416142b6588ac87d01053c6c95a Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 3 Jun 2020 17:28:29 +0200 Subject: [PATCH 508/632] chg: 'hf lto restore' - now uses save loads and case-ignore extensions --- client/src/cmdhflto.c | 56 +++++++++++++++++-------------------------- 1 file changed, 22 insertions(+), 34 deletions(-) diff --git a/client/src/cmdhflto.c b/client/src/cmdhflto.c index 4739d6f06..74b724bb6 100644 --- a/client/src/cmdhflto.c +++ b/client/src/cmdhflto.c @@ -566,13 +566,7 @@ static int CmdHfLTRestore(const char *Cmd) { uint8_t cmdp = 0; bool errors = false; - int is_data_loaded = PM3_ESOFT; - char filename[FILE_PATH_SIZE] = {0}; - char extension[FILE_PATH_SIZE] = {0}; - - uint8_t dump_data[CM_MEM_MAX_SIZE] = {0}; - size_t dump_datalen = 0; while (param_getchar(Cmd, cmdp) != 0x00 && !errors) { switch (tolower(param_getchar(Cmd, cmdp))) { @@ -580,8 +574,9 @@ static int CmdHfLTRestore(const char *Cmd) { return usage_lto_restore(); case 'f': param_getstr(Cmd, cmdp + 1, filename, FILE_PATH_SIZE); - if (strlen(filename) == 0) + if (strlen(filename) < 5) errors = true; + cmdp += 2; break; default: @@ -591,40 +586,33 @@ static int CmdHfLTRestore(const char *Cmd) { } } - if (errors || (strlen(filename)) == 0) { - usage_lto_restore(); - return PM3_EINVARG; + if (errors || strlen(Cmd) == 0 ) { + return usage_lto_restore(); } - // split file name into prefix and ext. - int fnLength; + size_t dump_len = 0; + char *lowstr = str_dup(filename); + str_lower(lowstr); - fnLength = strlen(filename); + if (str_endswith(lowstr, ".bin")) { - if (fnLength > 4) { - memcpy(extension, &filename[fnLength - 4], 4); - extension[5] = 0x00; + uint8_t *dump = NULL; + if (loadFile_safe(filename, "", (void**)&dump, &dump_len) == PM3_SUCCESS) { + restoreLTO(dump, true); + free(dump); + } + } else if (str_endswith(lowstr, ".eml")) { - // check if valid file extension and attempt to load data - if (memcmp(extension, ".bin", 4) == 0) { - filename[fnLength - 4] = 0x00; - is_data_loaded = loadFile(filename, ".bin", dump_data, sizeof(dump_data), &dump_datalen); - - } else if (memcmp(extension, ".eml", 4) == 0) { - filename[fnLength - 4] = 0x00; - dump_datalen = 12; - is_data_loaded = loadFileEML(filename, (uint8_t *)dump_data, &dump_datalen); - - } else - PrintAndLogEx(WARNING, "\nWarning: invalid dump filename "_YELLOW_("%s")" to restore!\n", filename); - } - - if (is_data_loaded == PM3_SUCCESS) { - return restoreLTO(dump_data, true); + uint8_t *dump = NULL; + if (loadFileEML_safe(filename, (void**)&dump, &dump_len) == PM3_SUCCESS) { + restoreLTO(dump, true); + free(dump); + } } else { - return PM3_EFILE; + PrintAndLogEx(WARNING, "Warning: invalid dump filename " _YELLOW_("%s") " to restore", filename); } - + free(lowstr); + return PM3_SUCCESS; } static command_t CommandTable[] = { From 62afc143350306539bfbb9972c9461c2685b6abe Mon Sep 17 00:00:00 2001 From: Iceman <iceman@iuse.se> Date: Thu, 4 Jun 2020 09:22:17 +0200 Subject: [PATCH 509/632] Update README.md --- README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/README.md b/README.md index 924114638..219997851 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,24 @@ Hardware to run client on - Raspberry Pi & Raspberry Pi Zero - Jetson Nano +## Precompiled binaries +We don't maintain any precompiled binaries in this repo. There is community effort over at the Proxmark3 forum where @gator96100 has set up a google drive with many mingw binaries which is up-to-date. We link to these files here as to make it easier for users. +If you are having troubles with these files, contact the package maintainer @gator96100. + +- [Precompiled builds for RDV40 dedicated x86](https://drive.google.com/open?id=13zUs-aiQkYaSl5KWrBtuW5IWCoHJPsue) +- [Precompiled builds for RDV40 dedicated x64](https://drive.google.com/open?id=1SyPB8t5Vo8O0Lh7PjNm3Kv-mO4BNbxjX) + +- [Precompiled builds for RDV40 dedicated with Bluetooth addon x86](https://drive.google.com/open?id=1TqWYctkRvkLshQ1ZRBHPLDzYHR-asuMO) +- [Precompiled builds for RDV40 dedicated with Bluetooth addon x64](https://drive.google.com/open?id=17ful7u2QyYmMQzQzc5fAf8nJvyoDJfSL) + +Generice Proxmark3 devices (non RDV4) +- [Precompiled builds for RRG / Iceman repository x86](https://drive.google.com/open?id=1PI3Xr1mussPBPnYGu4ZjWzGPARK4N7JR) +- [Precompiled builds for RRG / Iceman repository x64](https://drive.google.com/open?id=1uX9RtYGinuFrpHybu4xq_BE3HrobI20e) + +Ref: +[Link to sticky thread at forum](http://www.proxmark.org/forum/viewtopic.php?pid=24763#p24763) + + ## Roadmap The [public roadmap](https://github.com/RfidResearchGroup/proxmark3/wiki/Public-Roadmap) is an excellent start to read if you are interesting in contributing. From bd5aa92a56a61273ceac9a2e0ea07087901a652b Mon Sep 17 00:00:00 2001 From: Iceman <iceman@iuse.se> Date: Thu, 4 Jun 2020 09:24:17 +0200 Subject: [PATCH 510/632] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 219997851..9d69ba832 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,10 @@ Hardware to run client on ## Precompiled binaries We don't maintain any precompiled binaries in this repo. There is community effort over at the Proxmark3 forum where @gator96100 has set up a google drive with many mingw binaries which is up-to-date. We link to these files here as to make it easier for users. -If you are having troubles with these files, contact the package maintainer @gator96100. +If you are having troubles with these files, contact the package maintainer @gator96100 and read the [sticky thread at forum](http://www.proxmark.org/forum/viewtopic.php?pid=24763#p24763) where known issues has been documented. + + +Ref: - [Precompiled builds for RDV40 dedicated x86](https://drive.google.com/open?id=13zUs-aiQkYaSl5KWrBtuW5IWCoHJPsue) - [Precompiled builds for RDV40 dedicated x64](https://drive.google.com/open?id=1SyPB8t5Vo8O0Lh7PjNm3Kv-mO4BNbxjX) @@ -89,9 +92,6 @@ Generice Proxmark3 devices (non RDV4) - [Precompiled builds for RRG / Iceman repository x86](https://drive.google.com/open?id=1PI3Xr1mussPBPnYGu4ZjWzGPARK4N7JR) - [Precompiled builds for RRG / Iceman repository x64](https://drive.google.com/open?id=1uX9RtYGinuFrpHybu4xq_BE3HrobI20e) -Ref: -[Link to sticky thread at forum](http://www.proxmark.org/forum/viewtopic.php?pid=24763#p24763) - ## Roadmap The [public roadmap](https://github.com/RfidResearchGroup/proxmark3/wiki/Public-Roadmap) is an excellent start to read if you are interesting in contributing. From 66fd599c7075180ca0466695249953254a8548ce Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Thu, 4 Jun 2020 11:32:33 +0200 Subject: [PATCH 511/632] fix: 'hf mfu ndef' - now prints ID field correct if present --- client/src/mifare/ndef.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/src/mifare/ndef.c b/client/src/mifare/ndef.c index 45ad2e081..58b9b0a25 100644 --- a/client/src/mifare/ndef.c +++ b/client/src/mifare/ndef.c @@ -127,6 +127,7 @@ static int ndefDecodeHeader(uint8_t *data, size_t datalen, NDEFHeader_t *header) if (header->IDLenPresent) { header->IDLen = (header->ShortRecordBit ? (data[3]) : (data[6])); + header->ID = data + header->len + header->TypeLen; } else { header->IDLen = 0; } @@ -136,7 +137,7 @@ static int ndefDecodeHeader(uint8_t *data, size_t datalen, NDEFHeader_t *header) header->RecLen = header->len + header->TypeLen + header->PayloadLen + header->IDLen; if (header->RecLen > datalen) - return 3; + return PM3_ESOFT; return PM3_SUCCESS; } From fd93222fdb60db01eab29d1c6eef838ceffb8da0 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Thu, 4 Jun 2020 11:50:41 +0200 Subject: [PATCH 512/632] chg: 'trace save' - if client has no log, try download from device before saveing --- client/src/cmdtrace.c | 143 ++++++++++++++++++++++-------------------- 1 file changed, 76 insertions(+), 67 deletions(-) diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index 29cf2c1df..5747eef00 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -414,6 +414,56 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr return tracepos; } +static int download_trace(void) { + + if (!IfPm3Present()) { + PrintAndLogEx(FAILED, "You requested a trace upload in offline mode, consider using parameter '1' for working from Tracebuffer"); + return PM3_EINVARG; + } + + // reserve some space. + if (g_trace) + free(g_trace); + + g_traceLen = 0; + + g_trace = calloc(PM3_CMD_DATA_SIZE, sizeof(uint8_t)); + if (g_trace == NULL) { + PrintAndLogEx(FAILED, "Cannot allocate memory for trace"); + return PM3_EMALLOC; + } + + PrintAndLogEx(INFO, "downloading tracelog from device"); + + // Query for the size of the trace, downloading PM3_CMD_DATA_SIZE + PacketResponseNG response; + if (!GetFromDevice(BIG_BUF, g_trace, PM3_CMD_DATA_SIZE, 0, NULL, 0, &response, 4000, true)) { + PrintAndLogEx(WARNING, "timeout while waiting for reply."); + free(g_trace); + return PM3_ETIMEOUT; + } + + g_traceLen = response.oldarg[2]; + + // if tracelog buffer was larger and we need to download more. + if (g_traceLen > PM3_CMD_DATA_SIZE) { + + free(g_trace); + g_trace = calloc(g_traceLen, sizeof(uint8_t)); + if (g_trace == NULL) { + PrintAndLogEx(FAILED, "Cannot allocate memory for trace"); + return PM3_EMALLOC; + } + + if (!GetFromDevice(BIG_BUF, g_trace, g_traceLen, 0, NULL, 0, NULL, 2500, false)) { + PrintAndLogEx(WARNING, "command execution time out"); + free(g_trace); + return PM3_ETIMEOUT; + } + } + return PM3_SUCCESS; +} + // sanity check. Don't use proxmark if it is offline and you didn't specify useTraceBuffer /* static int SanityOfflineCheck( bool useTraceBuffer ){ @@ -429,7 +479,7 @@ static int CmdTraceLoad(const char *Cmd) { char filename[FILE_PATH_SIZE]; char cmdp = tolower(param_getchar(Cmd, 0)); - if (strlen(Cmd) < 1 || cmdp == 'h') return usage_trace_load(); + if (strlen(Cmd) < 1 || (strlen(Cmd) == 1 && cmdp == 'h')) return usage_trace_load(); param_getstr(Cmd, 0, filename, sizeof(filename)); @@ -449,7 +499,11 @@ static int CmdTraceLoad(const char *Cmd) { } static int CmdTraceSave(const char *Cmd) { - + + if (g_traceLen == 0) { + download_trace(); + } + if (g_traceLen == 0) { PrintAndLogEx(WARNING, "trace is empty, nothing to save"); return PM3_SUCCESS; @@ -457,32 +511,13 @@ static int CmdTraceSave(const char *Cmd) { char filename[FILE_PATH_SIZE]; char cmdp = tolower(param_getchar(Cmd, 0)); - if (strlen(Cmd) < 1 || cmdp == 'h') return usage_trace_save(); + if (strlen(Cmd) < 1 || (strlen(Cmd) == 1 && cmdp == 'h')) return usage_trace_save(); param_getstr(Cmd, 0, filename, sizeof(filename)); saveFile(filename, ".bin", g_trace, g_traceLen); return PM3_SUCCESS; } -static command_t CommandTable[] = { - {"help", CmdHelp, AlwaysAvailable, "This help"}, - {"list", CmdTraceList, AlwaysAvailable, "List protocol data in trace buffer"}, - {"load", CmdTraceLoad, AlwaysAvailable, "Load trace from file"}, - {"save", CmdTraceSave, AlwaysAvailable, "Save trace buffer to file"}, - {NULL, NULL, NULL, NULL} -}; - -static int CmdHelp(const char *Cmd) { - (void)Cmd; // Cmd is not used so far - CmdsHelp(CommandTable); - return PM3_SUCCESS; -} - -int CmdTrace(const char *Cmd) { - clearCommandBuffer(); - return CmdsParse(CommandTable, Cmd); -} - int CmdTraceList(const char *Cmd) { clearCommandBuffer(); @@ -567,51 +602,7 @@ int CmdTraceList(const char *Cmd) { if (errors) return usage_trace_list(); if (isOnline) { - - if (!IfPm3Present()) { - PrintAndLogEx(FAILED, "You requested a trace upload in offline mode, consider using parameter '1' for working from Tracebuffer"); - return PM3_EINVARG; - } - // reserve some space. - if (g_trace) - free(g_trace); - - g_traceLen = 0; - - g_trace = calloc(PM3_CMD_DATA_SIZE, sizeof(uint8_t)); - if (g_trace == NULL) { - PrintAndLogEx(FAILED, "Cannot allocate memory for trace"); - return PM3_EMALLOC; - } - - PrintAndLogEx(INFO, "downloading tracelog from device"); - - // Query for the size of the trace, downloading PM3_CMD_DATA_SIZE - PacketResponseNG response; - if (!GetFromDevice(BIG_BUF, g_trace, PM3_CMD_DATA_SIZE, 0, NULL, 0, &response, 4000, true)) { - PrintAndLogEx(WARNING, "timeout while waiting for reply."); - free(g_trace); - return PM3_ETIMEOUT; - } - - g_traceLen = response.oldarg[2]; - - // if tracelog buffer was larger and we need to download more. - if (g_traceLen > PM3_CMD_DATA_SIZE) { - - free(g_trace); - g_trace = calloc(g_traceLen, sizeof(uint8_t)); - if (g_trace == NULL) { - PrintAndLogEx(FAILED, "Cannot allocate memory for trace"); - return PM3_EMALLOC; - } - - if (!GetFromDevice(BIG_BUF, g_trace, g_traceLen, 0, NULL, 0, NULL, 2500, false)) { - PrintAndLogEx(WARNING, "command execution time out"); - free(g_trace); - return PM3_ETIMEOUT; - } - } + download_trace(); } PrintAndLogEx(SUCCESS, "Recorded activity (trace len = " _YELLOW_("%lu") " bytes)", g_traceLen); @@ -667,3 +658,21 @@ int CmdTraceList(const char *Cmd) { return PM3_SUCCESS; } +static command_t CommandTable[] = { + {"help", CmdHelp, AlwaysAvailable, "This help"}, + {"list", CmdTraceList, AlwaysAvailable, "List protocol data in trace buffer"}, + {"load", CmdTraceLoad, AlwaysAvailable, "Load trace from file"}, + {"save", CmdTraceSave, AlwaysAvailable, "Save trace buffer to file"}, + {NULL, NULL, NULL, NULL} +}; + +static int CmdHelp(const char *Cmd) { + (void)Cmd; // Cmd is not used so far + CmdsHelp(CommandTable); + return PM3_SUCCESS; +} + +int CmdTrace(const char *Cmd) { + clearCommandBuffer(); + return CmdsParse(CommandTable, Cmd); +} From d2a499ce5e2e124808cd8a117293e2239094171f Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Thu, 4 Jun 2020 11:52:58 +0200 Subject: [PATCH 513/632] chg: 'trace save' - use .trace extension --- client/src/cmdtrace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index 5747eef00..c142973d9 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -514,7 +514,7 @@ static int CmdTraceSave(const char *Cmd) { if (strlen(Cmd) < 1 || (strlen(Cmd) == 1 && cmdp == 'h')) return usage_trace_save(); param_getstr(Cmd, 0, filename, sizeof(filename)); - saveFile(filename, ".bin", g_trace, g_traceLen); + saveFile(filename, ".trace", g_trace, g_traceLen); return PM3_SUCCESS; } From 4e207da500f1abe386586072415c19fcae30a3c7 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Thu, 4 Jun 2020 11:56:57 +0200 Subject: [PATCH 514/632] add simulation of MFU ultralight card with NDEF trace --- traces/hf-mfu-0466D65F00509C-sim.trace | Bin 0 -> 5005 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 traces/hf-mfu-0466D65F00509C-sim.trace diff --git a/traces/hf-mfu-0466D65F00509C-sim.trace b/traces/hf-mfu-0466D65F00509C-sim.trace new file mode 100644 index 0000000000000000000000000000000000000000..ff5a365942b80a36d244ddb46d70c2f3263cd7e5 GIT binary patch literal 5005 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 literal 0 HcmV?d00001 From f354f480de5326fc69d6e3efd2cd95ba523c1754 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Fri, 5 Jun 2020 11:05:46 +0200 Subject: [PATCH 515/632] chg; return codes --- client/src/cmdsmartcard.c | 62 ++++++++++++++++++--------------------- client/src/emv/emvcore.c | 4 +-- 2 files changed, 31 insertions(+), 35 deletions(-) diff --git a/client/src/cmdsmartcard.c b/client/src/cmdsmartcard.c index 143140174..f03617d3a 100644 --- a/client/src/cmdsmartcard.c +++ b/client/src/cmdsmartcard.c @@ -41,8 +41,7 @@ static int usage_sm_raw(void) { PrintAndLogEx(NORMAL, " sc raw 0 d 00a404000e325041592e5359532e4444463031 - `2PAY.SYS.DDF01` PPSE directory"); PrintAndLogEx(NORMAL, " sc raw 0 t d 00a4040007a0000000041010 - Mastercard"); PrintAndLogEx(NORMAL, " sc raw 0 t d 00a4040007a0000000031010 - Visa"); - - return 0; + return PM3_SUCCESS; } static int usage_sm_reader(void) { PrintAndLogEx(NORMAL, "Usage: sc reader [h|s]"); @@ -51,7 +50,7 @@ static int usage_sm_reader(void) { PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); PrintAndLogEx(NORMAL, " sc reader"); - return 0; + return PM3_SUCCESS; } static int usage_sm_info(void) { PrintAndLogEx(NORMAL, "Usage: sc info [h|s]"); @@ -60,7 +59,7 @@ static int usage_sm_info(void) { PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); PrintAndLogEx(NORMAL, " sc info"); - return 0; + return PM3_SUCCESS; } static int usage_sm_upgrade(void) { PrintAndLogEx(NORMAL, "Upgrade RDV4.0 Sim module firmware"); @@ -70,7 +69,7 @@ static int usage_sm_upgrade(void) { PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); PrintAndLogEx(NORMAL, " sc upgrade f ../tools/simmodule/sim011.bin"); - return 0; + return PM3_SUCCESS; } static int usage_sm_setclock(void) { PrintAndLogEx(NORMAL, "Usage: sc setclock [h] c <clockspeed>"); @@ -79,7 +78,7 @@ static int usage_sm_setclock(void) { PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); PrintAndLogEx(NORMAL, " sc setclock c 2"); - return 0; + return PM3_SUCCESS; } static int usage_sm_brute(void) { PrintAndLogEx(NORMAL, "Tries to bruteforce SFI, using a known list of AID's "); @@ -90,7 +89,7 @@ static int usage_sm_brute(void) { PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); PrintAndLogEx(NORMAL, " sc brute t"); - return 0; + return PM3_SUCCESS; } static int smart_loadjson(const char *preferredName, json_t **root) { @@ -207,7 +206,7 @@ static float GetATRF(uint8_t *atr, size_t atrlen) { return FArray[TA1 >> 4]; // The 4 high-order bits of TA1 (8th MSbit to 5th LSbit) encode fmax and Fi } -static int PrintATR(uint8_t *atr, size_t atrlen) { +static void PrintATR(uint8_t *atr, size_t atrlen) { uint8_t T0 = atr[1]; uint8_t K = T0 & 0x0F; @@ -320,8 +319,6 @@ static int PrintATR(uint8_t *atr, size_t atrlen) { PrintAndLogEx(INFO, "\tHistorical bytes"); dump_buffer(&atr[2 + T1len + TD1len + TDilen], K, NULL, 1); } - - return 0; } static int smart_wait(uint8_t *data, bool silent) { @@ -443,13 +440,13 @@ static int CmdSmartRaw(const char *Cmd) { switch (param_gethex_to_eol(Cmd, cmdp + 1, data, sizeof(data), &hexlen)) { case 1: PrintAndLogEx(WARNING, "Invalid HEX value."); - return 1; + return PM3_EINVARG; case 2: PrintAndLogEx(WARNING, "Too many bytes. Max %zu bytes", sizeof(data)); - return 1; + return PM3_EINVARG; case 3: PrintAndLogEx(WARNING, "Hex must have even number of digits."); - return 1; + return PM3_EINVARG; } cmdp++; breakloop = true; @@ -490,12 +487,12 @@ static int CmdSmartRaw(const char *Cmd) { uint8_t *buf = calloc(PM3_CMD_DATA_SIZE, sizeof(uint8_t)); if (!buf) - return 1; + return PM3_EMALLOC; int len = smart_response(buf); if (len < 0) { free(buf); - return 2; + return PM3_ESOFT; } if (buf[0] == 0x6C) { @@ -513,7 +510,7 @@ static int CmdSmartRaw(const char *Cmd) { free(buf); } - return 0; + return PM3_SUCCESS; } static int CmdSmartUpgrade(const char *Cmd) { @@ -688,13 +685,13 @@ static int CmdSmartInfo(const char *Cmd) { PacketResponseNG resp; if (!WaitForResponseTimeout(CMD_ACK, &resp, 2500)) { if (!silent) PrintAndLogEx(WARNING, "smart card select failed"); - return 1; + return PM3_ETIMEOUT; } uint8_t isok = resp.oldarg[0] & 0xFF; if (!isok) { if (!silent) PrintAndLogEx(WARNING, "smart card select failed"); - return 1; + return PM3_ESOFT; } smart_card_atr_t card; @@ -731,7 +728,7 @@ static int CmdSmartInfo(const char *Cmd) { PrintAndLogEx(WARNING, "\t- Di or Fi is RFU."); }; - return 0; + return PM3_SUCCESS; } static int CmdSmartReader(const char *Cmd) { @@ -761,19 +758,19 @@ static int CmdSmartReader(const char *Cmd) { PacketResponseNG resp; if (!WaitForResponseTimeout(CMD_ACK, &resp, 2500)) { if (!silent) PrintAndLogEx(WARNING, "smart card select failed"); - return 1; + return PM3_ETIMEOUT; } uint8_t isok = resp.oldarg[0] & 0xFF; if (!isok) { if (!silent) PrintAndLogEx(WARNING, "smart card select failed"); - return 1; + return PM3_ESOFT; } smart_card_atr_t card; memcpy(&card, (smart_card_atr_t *)resp.data.asBytes, sizeof(smart_card_atr_t)); PrintAndLogEx(INFO, "ISO7816-3 ATR : %s", sprint_hex(card.atr, card.atr_len)); - return 0; + return PM3_SUCCESS; } static int CmdSmartSetClock(const char *Cmd) { @@ -806,13 +803,13 @@ static int CmdSmartSetClock(const char *Cmd) { PacketResponseNG resp; if (!WaitForResponseTimeout(CMD_ACK, &resp, 2500)) { PrintAndLogEx(WARNING, "smart card select failed"); - return 1; + return PM3_ETIMEOUT; } uint8_t isok = resp.oldarg[0] & 0xFF; if (!isok) { PrintAndLogEx(WARNING, "smart card set clock failed"); - return 1; + return PM3_ESOFT; } switch (clock1) { @@ -828,13 +825,13 @@ static int CmdSmartSetClock(const char *Cmd) { default: break; } - return 0; + return PM3_SUCCESS; } static int CmdSmartList(const char *Cmd) { (void)Cmd; // Cmd is not used so far CmdTraceList("7816"); - return 0; + return PM3_SUCCESS; } static void smart_brute_prim(void) { @@ -1000,12 +997,12 @@ static int CmdSmartBruteforceSFI(const char *Cmd) { uint8_t *buf = calloc(PM3_CMD_DATA_SIZE, sizeof(uint8_t)); if (!buf) - return 1; + return PM3_EMALLOC; PrintAndLogEx(INFO, "Selecting card"); if (!smart_select(false, NULL)) { free(buf); - return 1; + return PM3_ESOFT; } char *caid = NULL; @@ -1024,14 +1021,14 @@ static int CmdSmartBruteforceSFI(const char *Cmd) { if (!json_is_object(data)) { PrintAndLogEx(ERR, "data %d is not an object\n", i + 1); json_decref(root); - return 1; + return PM3_ESOFT; } jaid = json_object_get(data, "AID"); if (!json_is_string(jaid)) { PrintAndLogEx(ERR, "AID data [%d] is not a string", i + 1); json_decref(root); - return 1; + return PM3_ESOFT; } const char *aid = json_string_value(jaid); @@ -1093,7 +1090,7 @@ static int CmdSmartBruteforceSFI(const char *Cmd) { json_decref(root); PrintAndLogEx(SUCCESS, "\nSearch completed."); - return 0; + return PM3_SUCCESS; } static command_t CommandTable[] = { @@ -1111,7 +1108,7 @@ static command_t CommandTable[] = { static int CmdHelp(const char *Cmd) { (void)Cmd; // Cmd is not used so far CmdsHelp(CommandTable); - return 0; + return PM3_SUCCESS; } int CmdSmartcard(const char *Cmd) { @@ -1137,7 +1134,6 @@ int ExchangeAPDUSC(bool silent, uint8_t *datain, int datainlen, bool activateCar SendCommandOLD(CMD_SMART_RAW, flags, datainlen, 0, datain, datainlen); int len = smart_responseEx(dataout, silent); - if (len < 0) { return 1; } diff --git a/client/src/emv/emvcore.c b/client/src/emv/emvcore.c index 6647dbf8b..2f9c82b1d 100644 --- a/client/src/emv/emvcore.c +++ b/client/src/emv/emvcore.c @@ -306,10 +306,10 @@ static int EMVExchangeEx(EMVCommandChannel channel, bool ActivateField, bool Lea } break; case ECC_CONTACT: + res = 1; if (IfPm3Smartcard()) res = ExchangeAPDUSC(true, data, datalen, ActivateField, LeaveFieldON, Result, (int)MaxResultLen, (int *)ResultLen); - else - res = 1; + if (res) { return res; } From fde1fd8732c62eeb426bc44109549542f58c0605 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Fri, 5 Jun 2020 11:43:27 +0200 Subject: [PATCH 516/632] improved helptext --- pm3 | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/pm3 b/pm3 index 31ed0695b..73f2cac46 100755 --- a/pm3 +++ b/pm3 @@ -215,21 +215,41 @@ if [ "$SCRIPT" = "pm3" ]; then CMD() { $CLIENT "$@"; } HELP() { cat << EOF -Quick helper script for proxmark3 client when working with a Proxmark3 device connected via USB + +Quick helper script for proxmark3 client when working with a Proxmark3 device Description: The usage is the same as for the proxmark3 client, with the following differences: * the correct port name will be automatically guessed; * the script will wait for a Proxmark to be connected (same as option -w of the client). - You can also specify a first option -n N to access the Nth Proxmark3 connected on USB. - Don't use this script if you want to work offline or with the BT addon. + You can also specify a first option -n N to access the Nth Proxmark3 connected. + Don't use this script if you want to work offline. To see a list of available ports, use --list. Usage: $SCRIPT [-n <N>] [-f] [-c <command>]|[-l <lua_script_file>]|[-s <cmd_script_file>] [-i] - $SCRIPT --list + $SCRIPT [--list] [--help] + + +Arguments: + --help this help + --list list all detected com ports + -n <N> connect device refered to the N:th number on the --list output + -c 'cmd' execute the pm3 cmd in client and exit afterwards + -i interactive, stay in client after executing a cmd or script + -s 'script' execute a cmd script file and exit afterwards + -l 'luascript' execute a lua script file and exit afterwards + -w wait + -p <port> specifiy which port to connect to + + +Samples: + ./$SCRIPT -- Auto detect/ select com port in the following order BT, USB/CDC, BT DONGLE + ./$SCRIPT -p /dev/ttyACM0 -- connect to port /dev/ttyACM0 + ./$SCRIPT -n 2 -- use second item from the --list output + ./$SCRIPT -c 'lf search' -i -- run command and stay in client once completed + -See "$CLIENT -h" for more details on options. EOF } elif [ "$SCRIPT" = "pm3-flash" ]; then @@ -420,7 +440,16 @@ while true; do done if [ ${#PM3LIST} -lt "$N" ]; then - echo >&2 "[!!] No port found, abort" + HELP() { + cat << EOF +[!!] No port found, abort + +[?] Hint: try '$SCRIPT --list' to see list of available ports, and use the -n command like below +[?] $SCRIPT [-n <N>] + +EOF + } + HELP exit 1 fi From 8852e1f9cdfc6d8e42087899cd9e73ee35262bea Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Fri, 5 Jun 2020 13:13:27 +0200 Subject: [PATCH 517/632] Remove readline from libamiibo, no reason to be there --- client/deps/amiibo.cmake | 1 - 1 file changed, 1 deletion(-) diff --git a/client/deps/amiibo.cmake b/client/deps/amiibo.cmake index 23c7a7b57..234547cd1 100644 --- a/client/deps/amiibo.cmake +++ b/client/deps/amiibo.cmake @@ -16,7 +16,6 @@ if (NOT TARGET pm3rrg_rdv4_mbedtls) endif() find_library(pm3rrg_rdv4_mbedtls REQUIRED) target_link_libraries(pm3rrg_rdv4_amiibo PRIVATE - readline m pm3rrg_rdv4_mbedtls) target_include_directories(pm3rrg_rdv4_amiibo PRIVATE ../../include ../../common) From 5bd300bb5974f06d12d81d34e675746b7e18c1e0 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Fri, 5 Jun 2020 14:20:52 +0200 Subject: [PATCH 518/632] hint on failed serial port --- client/src/comms.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/src/comms.c b/client/src/comms.c index f2788ad19..d67fccc11 100644 --- a/client/src/comms.c +++ b/client/src/comms.c @@ -556,10 +556,13 @@ bool OpenProxmark(char *port, bool wait_for_port, int timeout, bool flash_mode, // check result of uart opening if (sp == INVALID_SERIAL_PORT) { PrintAndLogEx(WARNING, "\n" _RED_("ERROR:") " invalid serial port " _YELLOW_("%s"), port); + PrintAndLogEx(HINT, "Try the shell script " _YELLOW_("`./pm3 --list`") " to get a list of possible serial ports"); sp = NULL; return false; } else if (sp == CLAIMED_SERIAL_PORT) { PrintAndLogEx(WARNING, "\n" _RED_("ERROR:") " serial port " _YELLOW_("%s") " is claimed by another process", port); + PrintAndLogEx(HINT, "Try the shell script " _YELLOW_("`./pm3 --list`") " to get a list of possible serial ports"); + sp = NULL; return false; } else { From 1a8eff5d4230814ca59ac4b073251aba7b590b9b Mon Sep 17 00:00:00 2001 From: slurdge <slurdge@slurdge.org> Date: Fri, 5 Jun 2020 16:24:05 +0200 Subject: [PATCH 519/632] add lz4 to arm side --- armsrc/Makefile | 16 ++++---- armsrc/fpgaloader.c | 81 +++++++++++++++++++------------------- armsrc/start.c | 39 +++++------------- common/lz4/lz4.c | 19 +++++++++ common_arm/Makefile.common | 2 +- 5 files changed, 78 insertions(+), 79 deletions(-) diff --git a/armsrc/Makefile b/armsrc/Makefile index 23ac247c3..14747c7ed 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -75,13 +75,13 @@ include Standalone/Makefile.inc #the FPGA bitstream files. Note: order matters! FPGA_BITSTREAMS = fpga_lf.bit fpga_hf.bit -#the zlib source files required for decompressing the fpga config at run time -SRC_ZLIB = inflate.c inffast.c inftrees.c adler32.c zutil.c -#additional defines required to compile zlib -ZLIB_CFLAGS = -DZ_SOLO -DZ_PREFIX -DNO_GZIP -DZLIB_PM3_TUNED -APP_CFLAGS += $(ZLIB_CFLAGS) -# zlib includes: -APP_CFLAGS += -I../common/zlib +#the lz4 source files required for decompressing the fpga config at run time +SRC_LZ4 = lz4.c +#additional defines required to compile lz4 +LZ4_CFLAGS = -DNEED_MEMMOVE -DLZ4_MEMORY_USAGE=8 +APP_CFLAGS += $(LZ4_CFLAGS) +# lz4 includes: +APP_CFLAGS += -I../common/lz4 # stdint.h provided locally until GCC 4.5 becomes C99 compliant, # stack-protect , no-pie reduces size on Gentoo Hardened 8.2 gcc @@ -93,7 +93,7 @@ THUMBSRC = start.c \ $(SRC_ISO15693) \ $(SRC_NFCBARCODE) \ $(SRC_LF) \ - $(SRC_ZLIB) \ + $(SRC_LZ4) \ $(SRC_LEGIC) \ $(SRC_FLASH) \ $(SRC_SMARTCARD) \ diff --git a/armsrc/fpgaloader.c b/armsrc/fpgaloader.c index 196364d98..0b7b24cbd 100644 --- a/armsrc/fpgaloader.c +++ b/armsrc/fpgaloader.c @@ -17,10 +17,19 @@ #include "ticks.h" #include "dbprint.h" #include "util.h" -#include "zlib.h" #include "fpga.h" #include "string.h" +#include "lz4.h" // uncompress + +typedef struct lz4_stream_s { + LZ4_streamDecode_t* lz4StreamDecode; + char * next_in; + int avail_in; +} lz4_stream; + +typedef lz4_stream* lz4_streamp; + // remember which version of the bitstream we have already downloaded to the FPGA static int downloaded_bitstream = 0; @@ -30,8 +39,6 @@ extern uint8_t _binary_obj_fpga_all_bit_z_start, _binary_obj_fpga_all_bit_z_end; static uint8_t *fpga_image_ptr = NULL; static uint32_t uncompressed_bytes_cnt; -#define OUTPUT_BUFFER_LEN 80 - //----------------------------------------------------------------------------- // Set up the Serial Peripheral Interface as master // Used to write the FPGA config word @@ -180,18 +187,25 @@ bool FpgaSetupSscDma(uint8_t *buf, int len) { // Uncompress (inflate) the FPGA data. Returns one decompressed byte with // each call. //---------------------------------------------------------------------------- -static int get_from_fpga_combined_stream(z_streamp compressed_fpga_stream, uint8_t *output_buffer) { - if (fpga_image_ptr == compressed_fpga_stream->next_out) { // need more data - compressed_fpga_stream->next_out = output_buffer; - compressed_fpga_stream->avail_out = OUTPUT_BUFFER_LEN; +static int get_from_fpga_combined_stream(lz4_streamp compressed_fpga_stream, uint8_t *output_buffer) { + if (fpga_image_ptr == output_buffer + FPGA_RING_BUFFER_BYTES) { // need more data fpga_image_ptr = output_buffer; - int res = inflate(compressed_fpga_stream, Z_SYNC_FLUSH); - - if (res != Z_OK) - Dbprintf("inflate returned: %d, %s", res, compressed_fpga_stream->msg); - - if (res < 0) + int cmp_bytes = *(compressed_fpga_stream->next_in + 3); + cmp_bytes = (cmp_bytes << 8) + *(compressed_fpga_stream->next_in+2); + cmp_bytes = (cmp_bytes << 8) + *(compressed_fpga_stream->next_in+1); + cmp_bytes = (cmp_bytes << 8) + *(compressed_fpga_stream->next_in+0); + compressed_fpga_stream->next_in += 4; + compressed_fpga_stream->avail_in -= cmp_bytes + 4; + int res = LZ4_decompress_safe_continue(compressed_fpga_stream->lz4StreamDecode, + compressed_fpga_stream->next_in, + (char*)output_buffer, + cmp_bytes, + FPGA_RING_BUFFER_BYTES); + if (res <= 0) { + Dbprintf("inflate returned: %d", res); return res; + } + compressed_fpga_stream->next_in += cmp_bytes; } uncompressed_bytes_cnt++; return *fpga_image_ptr++; @@ -202,7 +216,7 @@ static int get_from_fpga_combined_stream(z_streamp compressed_fpga_stream, uint8 // are combined into one big file: // 288 bytes from FPGA file 1, followed by 288 bytes from FGPA file 2, etc. //---------------------------------------------------------------------------- -static int get_from_fpga_stream(int bitstream_version, z_streamp compressed_fpga_stream, uint8_t *output_buffer) { +static int get_from_fpga_stream(int bitstream_version, lz4_streamp compressed_fpga_stream, uint8_t *output_buffer) { while ((uncompressed_bytes_cnt / FPGA_INTERLEAVE_SIZE) % g_fpga_bitstream_num != (bitstream_version - 1)) { // skip undesired data belonging to other bitstream_versions get_from_fpga_combined_stream(compressed_fpga_stream, output_buffer); @@ -211,37 +225,23 @@ static int get_from_fpga_stream(int bitstream_version, z_streamp compressed_fpga return get_from_fpga_combined_stream(compressed_fpga_stream, output_buffer); } -static voidpf fpga_inflate_malloc(voidpf opaque, uInt items, uInt size) { - return BigBuf_malloc(items * size); -} - -// free eventually allocated BigBuf memory -static void fpga_inflate_free(voidpf opaque, voidpf address) { - BigBuf_free(); - BigBuf_Clear_ext(false); -} - //---------------------------------------------------------------------------- // Initialize decompression of the respective (HF or LF) FPGA stream //---------------------------------------------------------------------------- -static bool reset_fpga_stream(int bitstream_version, z_streamp compressed_fpga_stream, uint8_t *output_buffer) { +static bool reset_fpga_stream(int bitstream_version, lz4_streamp compressed_fpga_stream, uint8_t *output_buffer) { uint8_t header[FPGA_BITSTREAM_FIXED_HEADER_SIZE]; uncompressed_bytes_cnt = 0; // initialize z_stream structure for inflate: - compressed_fpga_stream->next_in = &_binary_obj_fpga_all_bit_z_start; + compressed_fpga_stream->next_in = (char*)&_binary_obj_fpga_all_bit_z_start; compressed_fpga_stream->avail_in = &_binary_obj_fpga_all_bit_z_end - &_binary_obj_fpga_all_bit_z_start; - compressed_fpga_stream->next_out = output_buffer; - compressed_fpga_stream->avail_out = OUTPUT_BUFFER_LEN; - compressed_fpga_stream->zalloc = &fpga_inflate_malloc; - compressed_fpga_stream->zfree = &fpga_inflate_free; - - int res = inflateInit2(compressed_fpga_stream, 0); - if (res < 0) + + int res = LZ4_setStreamDecode(compressed_fpga_stream->lz4StreamDecode, NULL, 0); + if (res == 0) return false; - fpga_image_ptr = output_buffer; + fpga_image_ptr = output_buffer + FPGA_RING_BUFFER_BYTES; for (uint16_t i = 0; i < FPGA_BITSTREAM_FIXED_HEADER_SIZE; i++) header[i] = get_from_fpga_stream(bitstream_version, compressed_fpga_stream, output_buffer); @@ -266,7 +266,7 @@ static void DownloadFPGA_byte(uint8_t w) { } // Download the fpga image starting at current stream position with length FpgaImageLen bytes -static void DownloadFPGA(int bitstream_version, int FpgaImageLen, z_streamp compressed_fpga_stream, uint8_t *output_buffer) { +static void DownloadFPGA(int bitstream_version, int FpgaImageLen, lz4_streamp compressed_fpga_stream, uint8_t *output_buffer) { int i = 0; AT91C_BASE_PIOA->PIO_OER = GPIO_FPGA_ON; @@ -348,7 +348,7 @@ static void DownloadFPGA(int bitstream_version, int FpgaImageLen, z_streamp comp * (big endian), <length> bytes content. Except for section 'e' which has 4 bytes * length. */ -static int bitparse_find_section(int bitstream_version, char section_name, uint32_t *section_length, z_streamp compressed_fpga_stream, uint8_t *output_buffer) { +static int bitparse_find_section(int bitstream_version, char section_name, uint32_t *section_length, lz4_streamp compressed_fpga_stream, uint8_t *output_buffer) { int result = 0; #define MAX_FPGA_BIT_STREAM_HEADER_SEARCH 100 // maximum number of bytes to search for the requested section uint16_t numbytes = 0; @@ -407,8 +407,6 @@ void FpgaDownloadAndGo(int bitstream_version) { // Send waiting time extension request as this will take a while send_wtx(1500); - z_stream compressed_fpga_stream; - uint8_t output_buffer[OUTPUT_BUFFER_LEN] = {0x00}; bool verbose = (DBGLEVEL > 3); @@ -416,6 +414,11 @@ void FpgaDownloadAndGo(int bitstream_version) { BigBuf_free(); BigBuf_Clear_ext(verbose); + lz4_stream compressed_fpga_stream; + LZ4_streamDecode_t lz4StreamDecode_body = {{ 0 }}; + compressed_fpga_stream.lz4StreamDecode = &lz4StreamDecode_body; + uint8_t * output_buffer = BigBuf_malloc(FPGA_RING_BUFFER_BYTES); + if (!reset_fpga_stream(bitstream_version, &compressed_fpga_stream, output_buffer)) return; @@ -425,8 +428,6 @@ void FpgaDownloadAndGo(int bitstream_version) { downloaded_bitstream = bitstream_version; } - inflateEnd(&compressed_fpga_stream); - // turn off antenna FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); diff --git a/armsrc/start.c b/armsrc/start.c index f0f4ea56c..8c769f56a 100644 --- a/armsrc/start.c +++ b/armsrc/start.c @@ -14,49 +14,28 @@ #include "proxmark3_arm.h" #include "appmain.h" -#include "zlib.h" +#include "lz4.h" #include "BigBuf.h" static uint8_t *next_free_memory; extern struct common_area common_area; extern char __data_src_start__, __data_start__, __data_end__, __bss_start__, __bss_end__; -static voidpf inflate_malloc(voidpf opaque, uInt items, uInt size) { - uint8_t *allocated_memory; - - allocated_memory = next_free_memory; - next_free_memory += items * size; - return allocated_memory; -} - -static void inflate_free(voidpf opaque, voidpf address) { - // nothing to do -} - static void uncompress_data_section(void) { - z_stream data_section; - next_free_memory = BigBuf_get_addr(); - // initialize zstream structure - data_section.next_in = (uint8_t *) &__data_src_start__; - data_section.avail_in = &__data_end__ - &__data_start__; // uncompressed size. Wrong but doesn't matter. - data_section.next_out = (uint8_t *) &__data_start__; - data_section.avail_out = &__data_end__ - &__data_start__; // uncompressed size. Correct. - data_section.zalloc = &inflate_malloc; - data_section.zfree = &inflate_free; - data_section.opaque = NULL; + int avail_in = *(&__data_start__ + 3); + avail_in = (avail_in << 8) + *(&__data_start__+2); + avail_in = (avail_in << 8) + *(&__data_start__+1); + avail_in = (avail_in << 8) + *(&__data_start__+0); // compressed size. Correct. + int avail_out = &__data_end__ - &__data_start__; // uncompressed size. Correct. + // uncompress data segment to RAM + int res = LZ4_decompress_safe(&__data_src_start__ + 4, &__data_start__, avail_in, avail_out); - // initialize zlib for inflate - int res = inflateInit2(&data_section, 15); if (res < 0) return; - - // uncompress data segment to RAM - inflate(&data_section, Z_FINISH); - // save the size of the compressed data section - common_area.arg1 = data_section.total_in; + common_area.arg1 = res; } void __attribute__((section(".startos"))) Vector(void); diff --git a/common/lz4/lz4.c b/common/lz4/lz4.c index 9808d70ae..8fb99d913 100644 --- a/common/lz4/lz4.c +++ b/common/lz4/lz4.c @@ -182,6 +182,25 @@ #include <string.h> /* memset, memcpy */ #define MEM_INIT(p,v,s) memset((p),(v),(s)) +#ifdef NEED_MEMMOVE +void * +memmove (void *dest, const void *src, size_t len) +{ + char *d = dest; + const char *s = src; + if (d < s) + while (len--) + *d++ = *s++; + else + { + char *lasts = (char*)s + (len-1); + char *lastd = d + (len-1); + while (len--) + *lastd-- = *lasts--; + } + return dest; +} +#endif /*-************************************ * Common Constants diff --git a/common_arm/Makefile.common b/common_arm/Makefile.common index c8dceead5..d6415dcda 100644 --- a/common_arm/Makefile.common +++ b/common_arm/Makefile.common @@ -35,7 +35,7 @@ OBJDIR = obj INCLUDE = -I../include -I../common_arm -I../common_fpga -I../common -I. # Also search prerequisites in the common directory (for usb.c), the fpga directory (for fpga.bit), and the zlib directory -VPATH = . ../common_arm ../common ../common/crapto1 ../common/mbedtls ../common/zlib ../fpga ../armsrc/Standalone +VPATH = . ../common_arm ../common ../common/crapto1 ../common/mbedtls ../common/lz4 ../fpga ../armsrc/Standalone INCLUDES = ../include/proxmark3_arm.h ../include/at91sam7s512.h ../include/config_gpio.h ../include/pm3_cmd.h From cce2e7aad315f17923bbb28ea24c1ba9f4ef8f7d Mon Sep 17 00:00:00 2001 From: slurdge <slurdge@slurdge.org> Date: Sat, 6 Jun 2020 15:34:25 +0200 Subject: [PATCH 520/632] Remove inline to save 2.5Kb of flash --- common/lz4/lz4.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/lz4/lz4.c b/common/lz4/lz4.c index 8fb99d913..25be146fd 100644 --- a/common/lz4/lz4.c +++ b/common/lz4/lz4.c @@ -1669,7 +1669,7 @@ read_variable_length(const BYTE**ip, const BYTE* lencheck, int loop_check, int i * Note that it is important for performance that this function really get inlined, * in order to remove useless branches during compilation optimization. */ -LZ4_FORCE_INLINE int +int LZ4_decompress_generic( const char* const src, char* const dst, From c84f81de76ae5bbeac39efa89cae658b111e389e Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Sat, 6 Jun 2020 23:32:09 +0200 Subject: [PATCH 521/632] chg: 'sc raw' - print response bytes --- client/src/cmdsmartcard.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/client/src/cmdsmartcard.c b/client/src/cmdsmartcard.c index f03617d3a..9fe192e6b 100644 --- a/client/src/cmdsmartcard.c +++ b/client/src/cmdsmartcard.c @@ -499,7 +499,7 @@ static int CmdSmartRaw(const char *Cmd) { data[4] = buf[1]; clearCommandBuffer(); - SendCommandOLD(CMD_SMART_RAW, 0, hexlen, 0, data, hexlen); + SendCommandMIX(CMD_SMART_RAW, 0, hexlen, 0, data, hexlen); len = smart_response(buf); data[4] = 0; @@ -507,6 +507,15 @@ static int CmdSmartRaw(const char *Cmd) { if (decodeTLV && len > 4) TLVPrintFromBuffer(buf, len - 2); + else { + if (len > 16) { + for (int i=0; i<len; i += 16) { + PrintAndLogEx(SUCCESS, "%s", sprint_hex_ascii(buf + i, 16)) ; + } + } else { + PrintAndLogEx(SUCCESS, "%s", sprint_hex_ascii(buf, len)) ; + } + } free(buf); } From d48fcbf5eb3f8f2d388b15cc9aca91a0c5571beb Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Sun, 7 Jun 2020 12:46:05 +0200 Subject: [PATCH 522/632] lz4stream info to int: use memcpy --- armsrc/fpgaloader.c | 6 ++---- armsrc/start.c | 8 +++----- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/armsrc/fpgaloader.c b/armsrc/fpgaloader.c index 0b7b24cbd..bb50375f9 100644 --- a/armsrc/fpgaloader.c +++ b/armsrc/fpgaloader.c @@ -190,10 +190,8 @@ bool FpgaSetupSscDma(uint8_t *buf, int len) { static int get_from_fpga_combined_stream(lz4_streamp compressed_fpga_stream, uint8_t *output_buffer) { if (fpga_image_ptr == output_buffer + FPGA_RING_BUFFER_BYTES) { // need more data fpga_image_ptr = output_buffer; - int cmp_bytes = *(compressed_fpga_stream->next_in + 3); - cmp_bytes = (cmp_bytes << 8) + *(compressed_fpga_stream->next_in+2); - cmp_bytes = (cmp_bytes << 8) + *(compressed_fpga_stream->next_in+1); - cmp_bytes = (cmp_bytes << 8) + *(compressed_fpga_stream->next_in+0); + int cmp_bytes; + memcpy(&cmp_bytes, compressed_fpga_stream->next_in, sizeof(int)); compressed_fpga_stream->next_in += 4; compressed_fpga_stream->avail_in -= cmp_bytes + 4; int res = LZ4_decompress_safe_continue(compressed_fpga_stream->lz4StreamDecode, diff --git a/armsrc/start.c b/armsrc/start.c index 8c769f56a..25bfb2ade 100644 --- a/armsrc/start.c +++ b/armsrc/start.c @@ -16,6 +16,7 @@ #include "appmain.h" #include "lz4.h" #include "BigBuf.h" +#include "string.h" static uint8_t *next_free_memory; extern struct common_area common_area; @@ -23,11 +24,8 @@ extern char __data_src_start__, __data_start__, __data_end__, __bss_start__, __b static void uncompress_data_section(void) { next_free_memory = BigBuf_get_addr(); - - int avail_in = *(&__data_start__ + 3); - avail_in = (avail_in << 8) + *(&__data_start__+2); - avail_in = (avail_in << 8) + *(&__data_start__+1); - avail_in = (avail_in << 8) + *(&__data_start__+0); // compressed size. Correct. + int avail_in; + memcpy(&avail_in, &__data_start__, sizeof(int)); int avail_out = &__data_end__ - &__data_start__; // uncompressed size. Correct. // uncompress data segment to RAM int res = LZ4_decompress_safe(&__data_src_start__ + 4, &__data_start__, avail_in, avail_out); From 381b47f64eb65366eeda824814f9d0e4f3315a8f Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Sun, 7 Jun 2020 12:46:34 +0200 Subject: [PATCH 523/632] lz4: add memmove to arm string.c --- armsrc/Makefile | 2 +- armsrc/string.c | 17 +++++++++++++++++ armsrc/string.h | 1 + common/lz4/lz4.c | 20 -------------------- 4 files changed, 19 insertions(+), 21 deletions(-) diff --git a/armsrc/Makefile b/armsrc/Makefile index 14747c7ed..5544c1aca 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -78,7 +78,7 @@ FPGA_BITSTREAMS = fpga_lf.bit fpga_hf.bit #the lz4 source files required for decompressing the fpga config at run time SRC_LZ4 = lz4.c #additional defines required to compile lz4 -LZ4_CFLAGS = -DNEED_MEMMOVE -DLZ4_MEMORY_USAGE=8 +LZ4_CFLAGS = -DLZ4_MEMORY_USAGE=8 APP_CFLAGS += $(LZ4_CFLAGS) # lz4 includes: APP_CFLAGS += -I../common/lz4 diff --git a/armsrc/string.c b/armsrc/string.c index 8dbe26808..300e911df 100644 --- a/armsrc/string.c +++ b/armsrc/string.c @@ -20,6 +20,23 @@ void *memcpy(void *dest, const void *src, int len) { return dest; } +void *memmove (void *dest, const void *src, size_t len) +{ + char *d = dest; + const char *s = src; + if (d < s) + while (len--) + *d++ = *s++; + else + { + char *lasts = (char*)s + (len-1); + char *lastd = d + (len-1); + while (len--) + *lastd-- = *lasts--; + } + return dest; +} + void *memset(void *dest, int c, int len) { uint8_t *d = dest; while ((len--) > 0) { diff --git a/armsrc/string.h b/armsrc/string.h index f8388d0a1..53f8e8f71 100644 --- a/armsrc/string.h +++ b/armsrc/string.h @@ -16,6 +16,7 @@ int strlen(const char *str); void *memcpy(void *dest, const void *src, int len); +void *memmove (void *dest, const void *src, size_t len); void *memset(void *dest, int c, int len); int memcmp(const void *av, const void *bv, int len); void memxor(uint8_t *dest, uint8_t *src, size_t len); diff --git a/common/lz4/lz4.c b/common/lz4/lz4.c index 25be146fd..375287c8a 100644 --- a/common/lz4/lz4.c +++ b/common/lz4/lz4.c @@ -182,26 +182,6 @@ #include <string.h> /* memset, memcpy */ #define MEM_INIT(p,v,s) memset((p),(v),(s)) -#ifdef NEED_MEMMOVE -void * -memmove (void *dest, const void *src, size_t len) -{ - char *d = dest; - const char *s = src; - if (d < s) - while (len--) - *d++ = *s++; - else - { - char *lasts = (char*)s + (len-1); - char *lastd = d + (len-1); - while (len--) - *lastd-- = *lasts--; - } - return dest; -} -#endif - /*-************************************ * Common Constants **************************************/ From b2c7ded7fca73febb6950fee2a97135dca5583bc Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Sun, 7 Jun 2020 12:53:24 +0200 Subject: [PATCH 524/632] Adapt get_lz4.sh --- common/get_lz4.sh | 16 +++++++++++++++- common/lz4/lz4.c | 1 + 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/common/get_lz4.sh b/common/get_lz4.sh index ef4de2c7b..0daa62a80 100755 --- a/common/get_lz4.sh +++ b/common/get_lz4.sh @@ -2,4 +2,18 @@ version=1.9.2 mkdir -p lz4 wget https://github.com/lz4/lz4/archive/v$version.zip unzip -o -j v$version "lz4-$version/LICENSE" "lz4-$version/lib/lz4.h" "lz4-$version/lib/lz4.c" "lz4-$version/lib/lz4hc.h" "lz4-$version/lib/lz4hc.c" -d lz4 -rm v$version.zip \ No newline at end of file +rm v$version.zip +patch -p0 << EOF +diff -Naur lz4/lz4.c lz4/lz4.c +--- lz4/lz4.c 2019-08-15 13:59:59.000000000 +0200 ++++ lz4/lz4.c 2020-06-07 12:50:11.788924953 +0200 +@@ -1650,7 +1650,7 @@ + * Note that it is important for performance that this function really get inlined, + * in order to remove useless branches during compilation optimization. + */ +-LZ4_FORCE_INLINE int ++int + LZ4_decompress_generic( + const char* const src, + char* const dst, +EOF diff --git a/common/lz4/lz4.c b/common/lz4/lz4.c index 375287c8a..7c7ec93bd 100644 --- a/common/lz4/lz4.c +++ b/common/lz4/lz4.c @@ -182,6 +182,7 @@ #include <string.h> /* memset, memcpy */ #define MEM_INIT(p,v,s) memset((p),(v),(s)) + /*-************************************ * Common Constants **************************************/ From df9f34ba2b0a984abd500e7b2c35d63d8bffba8b Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Sun, 7 Jun 2020 13:02:51 +0200 Subject: [PATCH 525/632] lz4/fpga_compress: remove warning missing-braces fpga_compress.c:154:49: error: suggest braces around initialization of subobject [-Werror,-Wmissing-braces] LZ4_streamDecode_t lz4StreamDecode_body = { 0 }; ^ {} --- tools/fpga_compress/fpga_compress.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/fpga_compress/fpga_compress.c b/tools/fpga_compress/fpga_compress.c index fc136523d..5c5dc8cdb 100644 --- a/tools/fpga_compress/fpga_compress.c +++ b/tools/fpga_compress/fpga_compress.c @@ -151,7 +151,7 @@ typedef struct lz4_stream_s { static int zlib_decompress(FILE *infile, FILE *outfile) { - LZ4_streamDecode_t lz4StreamDecode_body = { 0 }; + LZ4_streamDecode_t lz4StreamDecode_body = {{ 0 }}; char outbuf[FPGA_RING_BUFFER_BYTES]; fseek(infile, 0L, SEEK_END); From ef6b775f9fc21788c5992a2fb689ae37fc36db2c Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Sun, 7 Jun 2020 13:10:59 +0200 Subject: [PATCH 526/632] lz4/fpga_compress: avoid alignment problems fpga_compress.c:176:32: warning: cast from 'char *' to 'int *' increases required alignment from 1 to 4 [-Wcast-align] const int cmp_bytes = *(int*)(compressed_fpga_stream.next_in); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --- tools/fpga_compress/fpga_compress.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/fpga_compress/fpga_compress.c b/tools/fpga_compress/fpga_compress.c index 5c5dc8cdb..7b5cdb2b2 100644 --- a/tools/fpga_compress/fpga_compress.c +++ b/tools/fpga_compress/fpga_compress.c @@ -173,7 +173,8 @@ static int zlib_decompress(FILE *infile, FILE *outfile) { int total_size = 0; while (compressed_fpga_stream.avail_in > 0) { - const int cmp_bytes = *(int*)(compressed_fpga_stream.next_in); + int cmp_bytes; + memcpy(&cmp_bytes, compressed_fpga_stream.next_in, sizeof(int)); compressed_fpga_stream.next_in += 4; compressed_fpga_stream.avail_in -= cmp_bytes + 4; const int decBytes = LZ4_decompress_safe_continue(compressed_fpga_stream.lz4StreamDecode, compressed_fpga_stream.next_in, outbuf, cmp_bytes, FPGA_RING_BUFFER_BYTES); From 09548ecf510f3d2a73a646bd57977c6d647c4478 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Sun, 7 Jun 2020 13:56:21 +0200 Subject: [PATCH 527/632] cleaning some code --- armsrc/start.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/armsrc/start.c b/armsrc/start.c index 25bfb2ade..e8de251bc 100644 --- a/armsrc/start.c +++ b/armsrc/start.c @@ -39,22 +39,14 @@ static void uncompress_data_section(void) { void __attribute__((section(".startos"))) Vector(void); void Vector(void) { /* Stack should have been set up by the bootloader */ - // char *src; - char *dst, *end; uncompress_data_section(); /* Set up (that is: clear) BSS. */ - dst = &__bss_start__; - end = &__bss_end__; + char *dst = &__bss_start__; + char *end = &__bss_end__; while (dst < end) *dst++ = 0; - // Set up data segment: Copy from flash to ram - // src = &__data_src_start__; - // dst = &__data_start__; - // end = &__data_end__; - // while(dst < end) *dst++ = *src++; - AppMain(); } #endif From 4e29909cc23418c6ad17638f5e4eda2e11408a18 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Sun, 7 Jun 2020 15:59:06 +0200 Subject: [PATCH 528/632] chg: pointer casting to sort out array out of bonds --- armsrc/start.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/armsrc/start.c b/armsrc/start.c index e8de251bc..11b1064ba 100644 --- a/armsrc/start.c +++ b/armsrc/start.c @@ -28,7 +28,8 @@ static void uncompress_data_section(void) { memcpy(&avail_in, &__data_start__, sizeof(int)); int avail_out = &__data_end__ - &__data_start__; // uncompressed size. Correct. // uncompress data segment to RAM - int res = LZ4_decompress_safe(&__data_src_start__ + 4, &__data_start__, avail_in, avail_out); + uintptr_t p = (uintptr_t)&__data_src_start__; + int res = LZ4_decompress_safe((char*)p + 4, &__data_start__, avail_in, avail_out); if (res < 0) return; From 33781b1fd8f6e8e69c39c4f57346b8548958da57 Mon Sep 17 00:00:00 2001 From: slurdge <slurdge@slurdge.org> Date: Sun, 7 Jun 2020 17:29:25 +0200 Subject: [PATCH 529/632] Move most of libs to thumb mode. --- armsrc/Makefile | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/armsrc/Makefile b/armsrc/Makefile index 23ac247c3..3647d8630 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -100,6 +100,14 @@ THUMBSRC = start.c \ $(SRC_FPC) \ $(SRC_HITAG) \ $(SRC_SPIFFS) \ + $(SRC_ISO14443a) \ + $(SRC_ISO14443b) \ + $(SRC_CRAPTO1) \ + $(SRC_ICLASS) \ + $(SRC_EMV) \ + $(SRC_CRC) \ + $(SRC_FELICA) \ + $(SRC_STANDALONE) \ appmain.c \ printf.c \ dbprint.c \ @@ -114,14 +122,6 @@ THUMBSRC = start.c \ # These are to be compiled in ARM mode ARMSRC = fpgaloader.c \ - $(SRC_ISO14443a) \ - $(SRC_ISO14443b) \ - $(SRC_CRAPTO1) \ - $(SRC_ICLASS) \ - $(SRC_EMV) \ - $(SRC_CRC) \ - $(SRC_FELICA) \ - $(SRC_STANDALONE) \ parity.c \ usb_cdc.c \ cmd.c From 7f5c9a2681c729a52cdd92b19705a274dbe24a46 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Sun, 7 Jun 2020 18:40:12 +0200 Subject: [PATCH 530/632] textual --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 448c7e88f..f0f70916b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Change pushed some ARM source to compile with THUMB. Saves a lot of space of ARM flash memory @slurdge + - Change from using ZLIB compression of FPGA images in ARM to LZ4. 15%+ speedups when swapping between HF & LF now @slurdge - Fix `emv scan -w` - hash mismatch, solution similar to below (@iceman1001) - Fix 'emv roca' - hash mismatch, merged from offical repo (@pwpiwi) - Fix 'lf ti demod' - now calculates correct crc (@iceman1001) From 07c6e124c58684ba6b80004ae5ef1747e6078323 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Sun, 7 Jun 2020 19:20:36 +0200 Subject: [PATCH 531/632] textual --- common_arm/Makefile.common | 2 +- doc/fpga_arm_notes.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/common_arm/Makefile.common b/common_arm/Makefile.common index d6415dcda..e6d1636e9 100644 --- a/common_arm/Makefile.common +++ b/common_arm/Makefile.common @@ -34,7 +34,7 @@ OBJDIR = obj INCLUDE = -I../include -I../common_arm -I../common_fpga -I../common -I. -# Also search prerequisites in the common directory (for usb.c), the fpga directory (for fpga.bit), and the zlib directory +# Also search prerequisites in the common directory (for usb.c), the fpga directory (for fpga.bit), and the lz4 directory VPATH = . ../common_arm ../common ../common/crapto1 ../common/mbedtls ../common/lz4 ../fpga ../armsrc/Standalone INCLUDES = ../include/proxmark3_arm.h ../include/at91sam7s512.h ../include/config_gpio.h ../include/pm3_cmd.h diff --git a/doc/fpga_arm_notes.md b/doc/fpga_arm_notes.md index 48891408e..c066b316b 100644 --- a/doc/fpga_arm_notes.md +++ b/doc/fpga_arm_notes.md @@ -46,7 +46,7 @@ There is very rarely changes to the images so there is no need to setup a fpga t Since the FPGA is very old, the Xilinix WebPack ISE 10.1 is the last working tool chain. You can download this legacy development on xilinix and register for a free product installation id. Or use mine `11LTAJ5ZJK3PXTUBMF0C0J6C4` The package to download is about 7Gb and linux based. Though I recently managed to install it on WSL for Windows 10. -In order to save space, these fpga images is zlib compressed and included in the fullimage.elf file when compiling the ARM SRC. `make armsrc` +In order to save space, these fpga images are LZ4 compressed and included in the fullimage.elf file when compiling the ARM SRC. `make armsrc` This means we save some precious space on the ARM but its a bit more complex when flashing to fpga since it has to decompress on the fly. @@ -246,4 +246,4 @@ IQ2 = -1,1 : 1, 1 (falling) | | (q1) -1,-1 | 1, -1 -``` \ No newline at end of file +``` From 79ce948bc32d3b8129cda76caa691088232e32b4 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Sun, 7 Jun 2020 19:23:48 +0200 Subject: [PATCH 532/632] warnings protype missing --- common/lz4/lz4.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/common/lz4/lz4.c b/common/lz4/lz4.c index 7c7ec93bd..9de0c00db 100644 --- a/common/lz4/lz4.c +++ b/common/lz4/lz4.c @@ -1270,6 +1270,7 @@ int LZ4_compress_default(const char* src, char* dst, int srcSize, int maxOutputS } +int LZ4_compress_fast_force(const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); /* hidden debug function */ /* strangely enough, gcc generates faster code when this function is uncommented, even if unused */ int LZ4_compress_fast_force(const char* src, char* dst, int srcSize, int dstCapacity, int acceleration) @@ -1644,6 +1645,9 @@ read_variable_length(const BYTE**ip, const BYTE* lencheck, int loop_check, int i return length; } +int LZ4_decompress_generic(const char* const src, char* const dst, int srcSize, int outputSize, endCondition_directive endOnInput, earlyEnd_directive partialDecoding, + dict_directive dict, const BYTE* const lowPrefix, const BYTE* const dictStart, const size_t dictSize ); + /*! LZ4_decompress_generic() : * This generic decompression function covers all use cases. * It shall be instantiated several times, using different sets of directives. From ae10e76cb51cdb00d1747881a09443f86c222f6c Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Sun, 7 Jun 2020 19:25:56 +0200 Subject: [PATCH 533/632] fix resource leak --- client/src/cmdhflto.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/src/cmdhflto.c b/client/src/cmdhflto.c index 74b724bb6..5add871b1 100644 --- a/client/src/cmdhflto.c +++ b/client/src/cmdhflto.c @@ -599,15 +599,17 @@ static int CmdHfLTRestore(const char *Cmd) { uint8_t *dump = NULL; if (loadFile_safe(filename, "", (void**)&dump, &dump_len) == PM3_SUCCESS) { restoreLTO(dump, true); - free(dump); } + free(dump); + } else if (str_endswith(lowstr, ".eml")) { uint8_t *dump = NULL; if (loadFileEML_safe(filename, (void**)&dump, &dump_len) == PM3_SUCCESS) { restoreLTO(dump, true); - free(dump); } + free(dump); + } else { PrintAndLogEx(WARNING, "Warning: invalid dump filename " _YELLOW_("%s") " to restore", filename); } From 8dd56a9004861223b6dd3c27a2c6bbd9b9ab5c64 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Sun, 7 Jun 2020 19:29:14 +0200 Subject: [PATCH 534/632] fix resource leak --- client/src/cmdsmartcard.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/client/src/cmdsmartcard.c b/client/src/cmdsmartcard.c index 9fe192e6b..63b32890e 100644 --- a/client/src/cmdsmartcard.c +++ b/client/src/cmdsmartcard.c @@ -593,6 +593,7 @@ static int CmdSmartUpgrade(const char *Cmd) { if (sha512_size < 128) { PrintAndLogEx(FAILED, "SHA-512 file wrong size"); + free(hashstring); free(firmware); return PM3_ESOFT; } @@ -601,6 +602,7 @@ static int CmdSmartUpgrade(const char *Cmd) { uint8_t hash_1[64]; if (param_gethex(hashstring, 0, hash_1, 128)) { PrintAndLogEx(FAILED, "Couldn't read SHA-512 file"); + free(hashstring); free(firmware); return PM3_ESOFT; } @@ -608,16 +610,19 @@ static int CmdSmartUpgrade(const char *Cmd) { uint8_t hash_2[64]; if (sha512hash(firmware, firmware_size, hash_2)) { PrintAndLogEx(FAILED, "Couldn't calculate SHA-512 of firmware"); + free(hashstring); free(firmware); return PM3_ESOFT; } if (memcmp(hash_1, hash_2, 64)) { PrintAndLogEx(FAILED, "Couldn't verify integrity of firmware file " _RED_("(wrong SHA-512 hash)")); + free(hashstring); free(firmware); return PM3_ESOFT; } - + free(hashstring); + PrintAndLogEx(SUCCESS, "Sim module firmware uploading to PM3"); //Send to device From 9a2a5496c01e9da5d864d834d2e4825d90afb880 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Sun, 7 Jun 2020 19:33:32 +0200 Subject: [PATCH 535/632] fix, resource leaks --- tools/fpga_compress/fpga_compress.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/tools/fpga_compress/fpga_compress.c b/tools/fpga_compress/fpga_compress.c index 7b5cdb2b2..278fb29c4 100644 --- a/tools/fpga_compress/fpga_compress.c +++ b/tools/fpga_compress/fpga_compress.c @@ -91,8 +91,10 @@ static int zlib_compress(FILE *infile[], uint8_t num_infiles, FILE *outfile, boo } while (!all_feof(infile, num_infiles)); uint32_t buffer_size = FPGA_RING_BUFFER_BYTES; + if (num_infiles == 1) buffer_size = 1024*1024; //1M for now + uint32_t outsize_max = LZ4_compressBound(buffer_size); char *outbuf = calloc(outsize_max, sizeof(char)); @@ -145,7 +147,7 @@ static int zlib_compress(FILE *infile[], uint8_t num_infiles, FILE *outfile, boo typedef struct lz4_stream_s { LZ4_streamDecode_t* lz4StreamDecode; - char * next_in; + char* next_in; int avail_in; } lz4_stream; @@ -158,10 +160,11 @@ static int zlib_decompress(FILE *infile, FILE *outfile) { long infile_size = ftell(infile); fseek(infile, 0L, SEEK_SET); - char * inbuf = calloc(infile_size, sizeof(char)); + char* inbuf = calloc(infile_size, sizeof(char)); size_t num_read = fread(inbuf, sizeof(char), infile_size, infile); if (num_read != infile_size) { + free(inbuf); return (EXIT_FAILURE); } @@ -188,6 +191,7 @@ static int zlib_decompress(FILE *infile, FILE *outfile) { printf("uncompressed %li input bytes to %i output bytes\n", infile_size, total_size); fclose(outfile); fclose(infile); + free(inbuf); return (EXIT_SUCCESS); } @@ -280,7 +284,7 @@ static int FpgaGatherVersion(FILE *infile, char *infile_name, char *dst, int len strncat(dst, " on ", len - strlen(dst) - 1); for (uint16_t i = 0; i < fpga_info_len; i++) { char c = (char)fgetc(infile); - if (i < sizeof(tempstr)) { + if (i < sizeof(tempstr)) { if (c == '/') c = '-'; if (c == ' ') c = '0'; tempstr[i] = c; @@ -314,8 +318,8 @@ static void print_version_info_preamble(FILE *outfile, int num_infiles) { fprintf(outfile, "//\n"); fprintf(outfile, "// This file is generated by fpga_compress. Don't edit!\n"); fprintf(outfile, "//-----------------------------------------------------------------------------\n"); - fprintf(outfile, "\n"); - fprintf(outfile, "\n"); + fprintf(outfile, "// slurdge, 2020\n"); + fprintf(outfile, "\n\n"); fprintf(outfile, "const int g_fpga_bitstream_num = %d;\n", num_infiles); fprintf(outfile, "const char *const g_fpga_version_information[%d] = {\n", num_infiles); } From 5c43caa6b1fe031338b5f3f0a2f4aa03df400eea Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Sun, 7 Jun 2020 19:36:48 +0200 Subject: [PATCH 536/632] fix: ftell uses long int --- tools/fpga_compress/fpga_compress.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/fpga_compress/fpga_compress.c b/tools/fpga_compress/fpga_compress.c index 278fb29c4..ec6cf596e 100644 --- a/tools/fpga_compress/fpga_compress.c +++ b/tools/fpga_compress/fpga_compress.c @@ -157,7 +157,7 @@ static int zlib_decompress(FILE *infile, FILE *outfile) { char outbuf[FPGA_RING_BUFFER_BYTES]; fseek(infile, 0L, SEEK_END); - long infile_size = ftell(infile); + long int infile_size = ftell(infile); fseek(infile, 0L, SEEK_SET); char* inbuf = calloc(infile_size, sizeof(char)); From a9d89c7d06e7041ee1186cee7f0673c614aea359 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Sun, 7 Jun 2020 19:46:41 +0200 Subject: [PATCH 537/632] fix: RAMFUNC --- include/common.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/include/common.h b/include/common.h index 9f04d75c7..3c6245e52 100644 --- a/include/common.h +++ b/include/common.h @@ -70,7 +70,10 @@ extern int DBGLEVEL; #ifndef ABS # define ABS(a) ( ((a)<0) ? -(a) : (a) ) #endif -#define RAMFUNC __attribute((long_call, section(".ramfunc"))) + + +//#define RAMFUNC __attribute((long_call, section(".ramfunc"))) +#define RAMFUNC __attribute((long_call, section(".ramfunc"))) __attribute__((target("arm"))) #ifndef ROTR # define ROTR(x,n) (((uintmax_t)(x) >> (n)) | ((uintmax_t)(x) << ((sizeof(x) * 8) - (n)))) From 307e39bb22d4f006264be04e0265eab0777e52e7 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Sun, 7 Jun 2020 19:47:36 +0200 Subject: [PATCH 538/632] exposing function --- client/src/fileutils.c | 6 ++---- client/src/fileutils.h | 1 + 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/client/src/fileutils.c b/client/src/fileutils.c index 3d3175859..6095132aa 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -225,7 +225,7 @@ static char *filenamemcopy(const char *preferredName, const char *suffix) { return fileName; } -static char *newfilenamemcopy(const char *preferredName, const char *suffix) { +char *newfilenamemcopy(const char *preferredName, const char *suffix) { if (preferredName == NULL) return NULL; if (suffix == NULL) return NULL; uint16_t preferredNameLen = strlen(preferredName); @@ -948,12 +948,10 @@ int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, siz if (fileName == NULL) return PM3_EMALLOC; *datalen = 0; - json_t *root; json_error_t error; - int retval = PM3_SUCCESS; - root = json_load_file(fileName, 0, &error); + json_t *root = json_load_file(fileName, 0, &error); if (!root) { PrintAndLogEx(ERR, "ERROR: json " _YELLOW_("%s") " error on line %d: %s", fileName, error.line, error.text); retval = PM3_ESOFT; diff --git a/client/src/fileutils.h b/client/src/fileutils.h index d3d757408..30dc00251 100644 --- a/client/src/fileutils.h +++ b/client/src/fileutils.h @@ -77,6 +77,7 @@ int fileExists(const char *filename); //bool create_path(const char *dirname); //bool setDefaultPath (savePaths_t pathIndex,const char *Path); // set a path in the path list session.defaultPaths +char *newfilenamemcopy(const char *preferredName, const char *suffix); /** * @brief Utility function to save data to a binary file. This method takes a preferred name, but if that From d0b22cbd957aab7731c45232bfcfddf3fc654f02 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Sun, 7 Jun 2020 20:11:36 +0200 Subject: [PATCH 539/632] coverty 290397, 290399 --- client/src/cmdhffido.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/client/src/cmdhffido.c b/client/src/cmdhffido.c index 4b58e1cba..1458c1f14 100644 --- a/client/src/cmdhffido.c +++ b/client/src/cmdhffido.c @@ -201,12 +201,14 @@ static int CmdHFFidoRegister(const char *cmd) { CLIGetStrWithReturn(ctx, 6, cdata, &chlen); if (chlen > 16) { PrintAndLogEx(ERR, "ERROR: challenge parameter length in ASCII mode must be less than 16 chars instead of: %d", chlen); + CLIParserFree(ctx); return PM3_EINVARG; } } else { CLIGetHexWithReturn(ctx, 6, cdata, &chlen); if (chlen && chlen != 32) { PrintAndLogEx(ERR, "ERROR: challenge parameter length must be 32 bytes only."); + CLIParserFree(ctx); return PM3_EINVARG; } } @@ -219,12 +221,14 @@ static int CmdHFFidoRegister(const char *cmd) { CLIGetStrWithReturn(ctx, 7, adata, &applen); if (applen > 16) { PrintAndLogEx(ERR, "ERROR: application parameter length in ASCII mode must be less than 16 chars instead of: %d", applen); + CLIParserFree(ctx); return PM3_EINVARG; } } else { CLIGetHexWithReturn(ctx, 7, adata, &applen); if (applen && applen != 32) { PrintAndLogEx(ERR, "ERROR: application parameter length must be 32 bytes only."); + CLIParserFree(ctx); return PM3_EINVARG; } } @@ -446,8 +450,10 @@ static int CmdHFFidoAuthenticate(const char *cmd) { CLIGetHexWithReturn(ctx, 8, hdata, &hdatalen); if (hdatalen && hdatalen != 65) { PrintAndLogEx(ERR, "ERROR: public key length must be 65 bytes only."); + CLIParserFree(ctx); return PM3_EINVARG; } + if (hdatalen) { memmove(public_key, hdata, hdatalen); public_key_loaded = true; @@ -456,8 +462,10 @@ static int CmdHFFidoAuthenticate(const char *cmd) { CLIGetHexWithReturn(ctx, 9, hdata, &hdatalen); if (hdatalen > 255) { PrintAndLogEx(ERR, "ERROR: application parameter length must be less than 255."); + CLIParserFree(ctx); return PM3_EINVARG; } + if (hdatalen) { keyHandleLen = hdatalen; data[64] = keyHandleLen; @@ -469,15 +477,18 @@ static int CmdHFFidoAuthenticate(const char *cmd) { CLIGetStrWithReturn(ctx, 9, hdata, &hdatalen); if (hdatalen > 16) { PrintAndLogEx(ERR, "ERROR: challenge parameter length in ASCII mode must be less than 16 chars instead of: %d", hdatalen); + CLIParserFree(ctx); return PM3_EINVARG; } } else { CLIGetHexWithReturn(ctx, 10, hdata, &hdatalen); if (hdatalen && hdatalen != 32) { PrintAndLogEx(ERR, "ERROR: challenge parameter length must be 32 bytes only."); + CLIParserFree(ctx); return PM3_EINVARG; } } + if (hdatalen) memmove(data, hdata, 32); @@ -486,7 +497,7 @@ static int CmdHFFidoAuthenticate(const char *cmd) { CLIGetStrWithReturn(ctx, 11, hdata, &hdatalen); if (hdatalen > 16) { PrintAndLogEx(ERR, "ERROR: application parameter length in ASCII mode must be less than 16 chars instead of: %d", hdatalen); - CLIParserFree(ctx); + CLIParserFree(ctx); return PM3_EINVARG; } } else { @@ -497,6 +508,7 @@ static int CmdHFFidoAuthenticate(const char *cmd) { return PM3_EINVARG; } } + if (hdatalen) memmove(&data[32], hdata, 32); From 1bb7b041c0a9572bf6777fd2d5c43c36eab857d6 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Sun, 7 Jun 2020 20:45:55 +0200 Subject: [PATCH 540/632] resource leaks --- tools/fpga_compress/fpga_compress.c | 51 +++++++++++++++-------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/tools/fpga_compress/fpga_compress.c b/tools/fpga_compress/fpga_compress.c index ec6cf596e..7d574fb38 100644 --- a/tools/fpga_compress/fpga_compress.c +++ b/tools/fpga_compress/fpga_compress.c @@ -34,7 +34,6 @@ static void usage(void) { fprintf(stdout, " Compress hardnested table <infile>. Write result to <outfile>\n\n"); } - static bool all_feof(FILE *infile[], uint8_t num_infiles) { for (uint16_t i = 0; i < num_infiles; i++) { if (!feof(infile[i])) { @@ -44,17 +43,15 @@ static bool all_feof(FILE *infile[], uint8_t num_infiles) { return true; } - static int zlib_compress(FILE *infile[], uint8_t num_infiles, FILE *outfile, bool hardnested_mode) { uint8_t *fpga_config; - //int32_t ret; - uint8_t c; if (hardnested_mode) { fpga_config = calloc(num_infiles * HARDNESTED_TABLE_SIZE, sizeof(uint8_t)); } else { fpga_config = calloc(num_infiles * FPGA_CONFIG_SIZE, sizeof(uint8_t)); } + // read the input files. Interleave them into fpga_config[] uint32_t total_size = 0; do { @@ -79,7 +76,8 @@ static int zlib_compress(FILE *infile[], uint8_t num_infiles, FILE *outfile, boo for (uint16_t j = 0; j < num_infiles; j++) { for (uint16_t k = 0; k < FPGA_INTERLEAVE_SIZE; k++) { - c = (uint8_t)fgetc(infile[j]); + uint8_t c = (uint8_t)fgetc(infile[j]); + if (!feof(infile[j])) { fpga_config[total_size++] = c; } else if (num_infiles > 1) { @@ -93,7 +91,7 @@ static int zlib_compress(FILE *infile[], uint8_t num_infiles, FILE *outfile, boo uint32_t buffer_size = FPGA_RING_BUFFER_BYTES; if (num_infiles == 1) - buffer_size = 1024*1024; //1M for now + buffer_size = 1024 * 1024; //1M for now uint32_t outsize_max = LZ4_compressBound(buffer_size); @@ -109,40 +107,34 @@ static int zlib_compress(FILE *infile[], uint8_t num_infiles, FILE *outfile, boo int bytes_to_copy = FPGA_RING_BUFFER_BYTES; if (total_size - current_in < FPGA_RING_BUFFER_BYTES) bytes_to_copy = total_size - current_in; + memcpy(ring_buffer, fpga_config + current_in, bytes_to_copy); int cmp_bytes = LZ4_compress_HC_continue(lz4_streamhc, ring_buffer, outbuf, bytes_to_copy, outsize_max); + fwrite(&cmp_bytes, sizeof(int), 1, outfile); fwrite(outbuf, sizeof(char), cmp_bytes, outfile); + current_in += bytes_to_copy; current_out += cmp_bytes; } free(ring_buffer); - + free(outbuf); + free(fpga_config); + + fclose(outfile); + for (uint16_t j = 0; j < num_infiles; j++) { + fclose(infile[j]); + } + LZ4_freeStreamHC(lz4_streamhc); + fprintf(stdout, "compressed %u input bytes to %u output bytes\n", total_size, current_out); if (current_out == 0) { fprintf(stderr, "Error in lz4"); - free(outbuf); - for (uint16_t j = 0; j < num_infiles; j++) { - fclose(infile[j]); - } - fclose(outfile); - free(fpga_config); return (EXIT_FAILURE); } - - free(outbuf); - - for (uint16_t j = 0; j < num_infiles; j++) { - fclose(infile[j]); - } - fclose(outfile); - LZ4_freeStreamHC(lz4_streamhc); - free(fpga_config); - return (EXIT_SUCCESS); - } typedef struct lz4_stream_s { @@ -157,13 +149,22 @@ static int zlib_decompress(FILE *infile, FILE *outfile) { char outbuf[FPGA_RING_BUFFER_BYTES]; fseek(infile, 0L, SEEK_END); - long int infile_size = ftell(infile); + long infile_size = ftell(infile); fseek(infile, 0L, SEEK_SET); + if (infile_size <= 0) { + printf("error, when getting filesize"); + fclose(outfile); + fclose(infile); + return (EXIT_FAILURE); + } + char* inbuf = calloc(infile_size, sizeof(char)); size_t num_read = fread(inbuf, sizeof(char), infile_size, infile); if (num_read != infile_size) { + fclose(outfile); + fclose(infile); free(inbuf); return (EXIT_FAILURE); } From 93dbb2410345066a5153e3b33668cf223bbbb2df Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Sun, 7 Jun 2020 20:46:29 +0200 Subject: [PATCH 541/632] ftell return signed --- client/src/fileutils.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/src/fileutils.c b/client/src/fileutils.c index 6095132aa..c27dc0a15 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -1143,7 +1143,8 @@ int loadFileDICTIONARYEx(const char *preferredName, void *data, size_t maxdatale // read file while (!feof(f)) { - size_t filepos = ftell(f); + long filepos = ftell(f); + if (!fgets(line, sizeof(line), f)) { if (endFilePosition) *endFilePosition = 0; From 690db96a7d732e3eaf4c8b9ecab87f31a95e6a9e Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Sun, 7 Jun 2020 22:05:54 +0200 Subject: [PATCH 542/632] fix: osx doesn't like target directive --- include/common.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/include/common.h b/include/common.h index 3c6245e52..cb0962b56 100644 --- a/include/common.h +++ b/include/common.h @@ -72,8 +72,12 @@ extern int DBGLEVEL; #endif -//#define RAMFUNC __attribute((long_call, section(".ramfunc"))) +#if defined(__APPLE__) +#define RAMFUNC __attribute((long_call, section(".ramfunc"))) +#else #define RAMFUNC __attribute((long_call, section(".ramfunc"))) __attribute__((target("arm"))) +#endif + #ifndef ROTR # define ROTR(x,n) (((uintmax_t)(x) >> (n)) | ((uintmax_t)(x) << ((sizeof(x) * 8) - (n)))) From 8418e8918026a9fd882e9eba8b85665321f56e83 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Mon, 8 Jun 2020 02:49:38 +0200 Subject: [PATCH 543/632] fix gitignore, was masking tools/fpga_compress --- .gitignore | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index bdd98d374..a89e3f6e9 100644 --- a/.gitignore +++ b/.gitignore @@ -61,9 +61,9 @@ flasher !flasher/ lua luac -fpga_compress -mfkey32 -mfkey64 +tools/fpga_compress/fpga_compress +tools/mfkey/mfkey32 +tools/mfkey/mfkey64 tools/nonce2key/nonce2key fpga/* From 15012198f9f1a57bb4e4fa12bc0b51db6575b9b8 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Sun, 7 Jun 2020 17:43:39 +0200 Subject: [PATCH 544/632] client: replace zlib by bzip2 --- .travis.yml | 1 + client/CMakeLists.txt | 2 +- client/Makefile | 43 ++------------ client/deps/CMakeLists.txt | 3 - client/deps/zlib.cmake | 14 ----- .../bitflip_0_001_states.bin.bz2 | Bin 0 -> 2801 bytes .../bitflip_0_001_states.bin.z | Bin 21464 -> 0 bytes .../bitflip_0_003_states.bin.bz2 | Bin 0 -> 1531 bytes .../bitflip_0_003_states.bin.z | Bin 11164 -> 0 bytes .../bitflip_0_005_states.bin.bz2 | Bin 0 -> 4901 bytes .../bitflip_0_005_states.bin.z | Bin 25606 -> 0 bytes .../bitflip_0_007_states.bin.bz2 | Bin 0 -> 1591 bytes .../bitflip_0_007_states.bin.z | Bin 11136 -> 0 bytes .../bitflip_0_009_states.bin.bz2 | Bin 0 -> 1780 bytes .../bitflip_0_009_states.bin.z | Bin 11407 -> 0 bytes .../bitflip_0_00b_states.bin.bz2 | Bin 0 -> 1069 bytes .../bitflip_0_00b_states.bin.z | Bin 5964 -> 0 bytes .../bitflip_0_00d_states.bin.bz2 | Bin 0 -> 2204 bytes .../bitflip_0_00d_states.bin.z | Bin 17232 -> 0 bytes .../bitflip_0_00f_states.bin.bz2 | Bin 0 -> 1214 bytes .../bitflip_0_00f_states.bin.z | Bin 7685 -> 0 bytes .../bitflip_0_010_states.bin.bz2 | Bin 0 -> 1557 bytes .../bitflip_0_010_states.bin.z | Bin 17328 -> 0 bytes .../bitflip_0_014_states.bin.bz2 | Bin 0 -> 3138 bytes .../bitflip_0_014_states.bin.z | Bin 21124 -> 0 bytes .../bitflip_0_01c_states.bin.bz2 | Bin 0 -> 1120 bytes .../bitflip_0_01c_states.bin.z | Bin 12840 -> 0 bytes .../bitflip_0_021_states.bin.bz2 | Bin 0 -> 7328 bytes .../bitflip_0_021_states.bin.z | Bin 33654 -> 0 bytes .../bitflip_0_023_states.bin.bz2 | Bin 0 -> 2080 bytes .../bitflip_0_023_states.bin.z | Bin 17592 -> 0 bytes .../bitflip_0_025_states.bin.bz2 | Bin 0 -> 13155 bytes .../bitflip_0_025_states.bin.z | 49 ---------------- .../bitflip_0_027_states.bin.bz2 | Bin 0 -> 2632 bytes .../bitflip_0_027_states.bin.z | Bin 21994 -> 0 bytes .../bitflip_0_029_states.bin.bz2 | Bin 0 -> 2402 bytes .../bitflip_0_029_states.bin.z | Bin 18850 -> 0 bytes .../bitflip_0_02b_states.bin.bz2 | Bin 0 -> 1408 bytes .../bitflip_0_02b_states.bin.z | Bin 9230 -> 0 bytes .../bitflip_0_02d_states.bin.bz2 | Bin 0 -> 3826 bytes .../bitflip_0_02d_states.bin.z | Bin 27896 -> 0 bytes .../bitflip_0_02f_states.bin.bz2 | Bin 0 -> 1660 bytes .../bitflip_0_02f_states.bin.z | Bin 14181 -> 0 bytes .../bitflip_0_030_states.bin.bz2 | Bin 0 -> 1119 bytes .../bitflip_0_030_states.bin.z | Bin 14726 -> 0 bytes .../bitflip_0_034_states.bin.bz2 | Bin 0 -> 1317 bytes .../bitflip_0_034_states.bin.z | Bin 15953 -> 0 bytes .../bitflip_0_03c_states.bin.bz2 | Bin 0 -> 924 bytes .../bitflip_0_03c_states.bin.z | Bin 9693 -> 0 bytes .../bitflip_0_040_states.bin.bz2 | Bin 0 -> 413 bytes .../bitflip_0_040_states.bin.z | Bin 9770 -> 0 bytes .../bitflip_0_044_states.bin.bz2 | Bin 0 -> 3460 bytes .../bitflip_0_044_states.bin.z | Bin 22156 -> 0 bytes .../bitflip_0_04c_states.bin.bz2 | Bin 0 -> 1219 bytes .../bitflip_0_04c_states.bin.z | Bin 14808 -> 0 bytes .../bitflip_0_051_states.bin.bz2 | Bin 0 -> 2568 bytes .../bitflip_0_051_states.bin.z | Bin 18194 -> 0 bytes .../bitflip_0_053_states.bin.bz2 | Bin 0 -> 1356 bytes .../bitflip_0_053_states.bin.z | Bin 9176 -> 0 bytes .../bitflip_0_055_states.bin.bz2 | Bin 0 -> 5503 bytes .../bitflip_0_055_states.bin.z | Bin 27783 -> 0 bytes .../bitflip_0_057_states.bin.bz2 | Bin 0 -> 1890 bytes .../bitflip_0_057_states.bin.z | Bin 14121 -> 0 bytes .../bitflip_0_059_states.bin.bz2 | Bin 0 -> 1820 bytes .../bitflip_0_059_states.bin.z | Bin 11331 -> 0 bytes .../bitflip_0_05b_states.bin.bz2 | Bin 0 -> 1077 bytes .../bitflip_0_05b_states.bin.z | Bin 5875 -> 0 bytes .../bitflip_0_05d_states.bin.bz2 | Bin 0 -> 2472 bytes .../bitflip_0_05d_states.bin.z | Bin 18417 -> 0 bytes .../bitflip_0_05f_states.bin.bz2 | Bin 0 -> 1448 bytes .../bitflip_0_05f_states.bin.z | Bin 9377 -> 0 bytes .../bitflip_0_064_states.bin.bz2 | Bin 0 -> 1324 bytes .../bitflip_0_064_states.bin.z | Bin 16059 -> 0 bytes .../bitflip_0_06c_states.bin.bz2 | Bin 0 -> 926 bytes .../bitflip_0_06c_states.bin.z | Bin 9733 -> 0 bytes .../bitflip_0_071_states.bin.bz2 | Bin 0 -> 6959 bytes .../bitflip_0_071_states.bin.z | Bin 31947 -> 0 bytes .../bitflip_0_073_states.bin.bz2 | Bin 0 -> 1861 bytes .../bitflip_0_073_states.bin.z | Bin 15941 -> 0 bytes .../bitflip_0_075_states.bin.bz2 | Bin 0 -> 12922 bytes .../bitflip_0_075_states.bin.z | Bin 42790 -> 0 bytes .../bitflip_0_077_states.bin.bz2 | Bin 0 -> 2916 bytes .../bitflip_0_077_states.bin.z | Bin 23984 -> 0 bytes .../bitflip_0_079_states.bin.bz2 | Bin 0 -> 2400 bytes .../bitflip_0_079_states.bin.z | Bin 18851 -> 0 bytes .../bitflip_0_07b_states.bin.bz2 | Bin 0 -> 1404 bytes .../bitflip_0_07b_states.bin.z | Bin 9229 -> 0 bytes .../bitflip_0_07f_states.bin.bz2 | Bin 0 -> 2054 bytes .../bitflip_0_07f_states.bin.z | Bin 16505 -> 0 bytes .../bitflip_0_081_states.bin.bz2 | Bin 0 -> 5982 bytes .../bitflip_0_081_states.bin.z | Bin 28820 -> 0 bytes .../bitflip_0_083_states.bin.bz2 | Bin 0 -> 2134 bytes .../bitflip_0_083_states.bin.z | Bin 15336 -> 0 bytes .../bitflip_0_085_states.bin.bz2 | Bin 0 -> 2460 bytes .../bitflip_0_085_states.bin.z | Bin 19596 -> 0 bytes .../bitflip_0_087_states.bin.bz2 | Bin 0 -> 1352 bytes .../bitflip_0_087_states.bin.z | Bin 9176 -> 0 bytes .../bitflip_0_089_states.bin.bz2 | Bin 0 -> 2505 bytes .../bitflip_0_089_states.bin.z | Bin 18253 -> 0 bytes .../bitflip_0_08b_states.bin.bz2 | Bin 0 -> 1469 bytes .../bitflip_0_08b_states.bin.z | Bin 9416 -> 0 bytes .../bitflip_0_08d_states.bin.bz2 | Bin 0 -> 1788 bytes .../bitflip_0_08d_states.bin.z | Bin 11330 -> 0 bytes .../bitflip_0_08f_states.bin.bz2 | Bin 0 -> 1080 bytes .../bitflip_0_08f_states.bin.z | Bin 5875 -> 0 bytes .../bitflip_0_090_states.bin.bz2 | Bin 0 -> 1281 bytes .../bitflip_0_090_states.bin.z | Bin 15272 -> 0 bytes .../bitflip_0_094_states.bin.bz2 | Bin 0 -> 6279 bytes .../bitflip_0_094_states.bin.z | Bin 27477 -> 0 bytes .../bitflip_0_09c_states.bin.bz2 | Bin 0 -> 1431 bytes .../bitflip_0_09c_states.bin.z | Bin 18443 -> 0 bytes .../bitflip_0_0a1_states.bin.bz2 | Bin 0 -> 13572 bytes .../bitflip_0_0a1_states.bin.z | Bin 43080 -> 0 bytes .../bitflip_0_0a3_states.bin.bz2 | Bin 0 -> 2973 bytes .../bitflip_0_0a3_states.bin.z | Bin 24297 -> 0 bytes .../bitflip_0_0a5_states.bin.bz2 | Bin 0 -> 6943 bytes .../bitflip_0_0a5_states.bin.z | Bin 32404 -> 0 bytes .../bitflip_0_0a7_states.bin.bz2 | Bin 0 -> 1863 bytes .../bitflip_0_0a7_states.bin.z | Bin 15903 -> 0 bytes .../bitflip_0_0a9_states.bin.bz2 | Bin 0 -> 3825 bytes .../bitflip_0_0a9_states.bin.z | Bin 28223 -> 0 bytes .../bitflip_0_0ab_states.bin.bz2 | Bin 0 -> 1924 bytes .../bitflip_0_0ab_states.bin.z | Bin 15110 -> 0 bytes .../bitflip_0_0ad_states.bin.bz2 | Bin 0 -> 2419 bytes .../bitflip_0_0ad_states.bin.z | Bin 18794 -> 0 bytes .../bitflip_0_0af_states.bin.bz2 | Bin 0 -> 1409 bytes .../bitflip_0_0af_states.bin.z | Bin 9191 -> 0 bytes .../bitflip_0_0b0_states.bin.bz2 | Bin 0 -> 513 bytes .../bitflip_0_0b0_states.bin.z | Bin 12014 -> 0 bytes .../bitflip_0_0b4_states.bin.bz2 | Bin 0 -> 3041 bytes .../bitflip_0_0b4_states.bin.z | Bin 21106 -> 0 bytes .../bitflip_0_0bc_states.bin.bz2 | Bin 0 -> 1129 bytes .../bitflip_0_0bc_states.bin.z | Bin 14387 -> 0 bytes .../bitflip_0_0c0_states.bin.bz2 | Bin 0 -> 415 bytes .../bitflip_0_0c0_states.bin.z | Bin 9771 -> 0 bytes .../bitflip_0_0c4_states.bin.bz2 | Bin 0 -> 5975 bytes .../bitflip_0_0c4_states.bin.z | Bin 27220 -> 0 bytes .../bitflip_0_0cc_states.bin.bz2 | Bin 0 -> 1614 bytes .../bitflip_0_0cc_states.bin.z | Bin 19919 -> 0 bytes .../bitflip_0_0d1_states.bin.bz2 | Bin 0 -> 5983 bytes .../bitflip_0_0d1_states.bin.z | Bin 28438 -> 0 bytes .../bitflip_0_0d3_states.bin.bz2 | Bin 0 -> 2082 bytes .../bitflip_0_0d3_states.bin.z | Bin 16025 -> 0 bytes .../bitflip_0_0d5_states.bin.bz2 | Bin 0 -> 2460 bytes .../bitflip_0_0d5_states.bin.z | Bin 19686 -> 0 bytes .../bitflip_0_0d7_states.bin.bz2 | Bin 0 -> 1352 bytes .../bitflip_0_0d7_states.bin.z | Bin 9175 -> 0 bytes .../bitflip_0_0d9_states.bin.bz2 | Bin 0 -> 2498 bytes .../bitflip_0_0d9_states.bin.z | Bin 18323 -> 0 bytes .../bitflip_0_0db_states.bin.bz2 | Bin 0 -> 1444 bytes .../bitflip_0_0db_states.bin.z | Bin 9514 -> 0 bytes .../bitflip_0_0dd_states.bin.bz2 | Bin 0 -> 1792 bytes .../bitflip_0_0dd_states.bin.z | Bin 11481 -> 0 bytes .../bitflip_0_0df_states.bin.bz2 | Bin 0 -> 1084 bytes .../bitflip_0_0df_states.bin.z | Bin 5873 -> 0 bytes .../bitflip_0_0e4_states.bin.bz2 | Bin 0 -> 2793 bytes .../bitflip_0_0e4_states.bin.z | Bin 20539 -> 0 bytes .../bitflip_0_0ec_states.bin.bz2 | Bin 0 -> 1145 bytes .../bitflip_0_0ec_states.bin.z | Bin 13972 -> 0 bytes .../bitflip_0_0f1_states.bin.bz2 | Bin 0 -> 13180 bytes .../bitflip_0_0f1_states.bin.z | 28 --------- .../bitflip_0_0f3_states.bin.bz2 | Bin 0 -> 3234 bytes .../bitflip_0_0f3_states.bin.z | Bin 25591 -> 0 bytes .../bitflip_0_0f5_states.bin.bz2 | Bin 0 -> 7153 bytes .../bitflip_0_0f5_states.bin.z | Bin 33164 -> 0 bytes .../bitflip_0_0f7_states.bin.bz2 | Bin 0 -> 1983 bytes .../bitflip_0_0f7_states.bin.z | Bin 17201 -> 0 bytes .../bitflip_0_0f9_states.bin.bz2 | Bin 0 -> 3834 bytes .../bitflip_0_0f9_states.bin.z | Bin 28243 -> 0 bytes .../bitflip_0_0fb_states.bin.bz2 | Bin 0 -> 1940 bytes .../bitflip_0_0fb_states.bin.z | Bin 15124 -> 0 bytes .../bitflip_0_0fd_states.bin.bz2 | Bin 0 -> 2702 bytes .../bitflip_0_0fd_states.bin.z | Bin 20509 -> 0 bytes .../bitflip_0_0ff_states.bin.bz2 | Bin 0 -> 1569 bytes .../bitflip_0_0ff_states.bin.z | Bin 10894 -> 0 bytes .../bitflip_0_104_states.bin.bz2 | Bin 0 -> 3524 bytes .../bitflip_0_104_states.bin.z | Bin 22230 -> 0 bytes .../bitflip_0_10c_states.bin.bz2 | Bin 0 -> 1230 bytes .../bitflip_0_10c_states.bin.z | Bin 14808 -> 0 bytes .../bitflip_0_111_states.bin.bz2 | Bin 0 -> 2568 bytes .../bitflip_0_111_states.bin.z | Bin 18193 -> 0 bytes .../bitflip_0_113_states.bin.bz2 | Bin 0 -> 1352 bytes .../bitflip_0_113_states.bin.z | Bin 9176 -> 0 bytes .../bitflip_0_115_states.bin.bz2 | Bin 0 -> 5503 bytes .../bitflip_0_115_states.bin.z | Bin 27783 -> 0 bytes .../bitflip_0_117_states.bin.bz2 | Bin 0 -> 1888 bytes .../bitflip_0_117_states.bin.z | Bin 14119 -> 0 bytes .../bitflip_0_119_states.bin.bz2 | Bin 0 -> 1806 bytes .../bitflip_0_119_states.bin.z | Bin 11331 -> 0 bytes .../bitflip_0_11b_states.bin.bz2 | Bin 0 -> 1077 bytes .../bitflip_0_11b_states.bin.z | Bin 5875 -> 0 bytes .../bitflip_0_11d_states.bin.bz2 | Bin 0 -> 2469 bytes .../bitflip_0_11d_states.bin.z | Bin 18417 -> 0 bytes .../bitflip_0_11f_states.bin.bz2 | Bin 0 -> 1448 bytes .../bitflip_0_11f_states.bin.z | Bin 9377 -> 0 bytes .../bitflip_0_124_states.bin.bz2 | Bin 0 -> 1327 bytes .../bitflip_0_124_states.bin.z | Bin 16060 -> 0 bytes .../bitflip_0_12c_states.bin.bz2 | Bin 0 -> 922 bytes .../bitflip_0_12c_states.bin.z | Bin 9734 -> 0 bytes .../bitflip_0_131_states.bin.bz2 | Bin 0 -> 6964 bytes .../bitflip_0_131_states.bin.z | Bin 31946 -> 0 bytes .../bitflip_0_133_states.bin.bz2 | Bin 0 -> 1861 bytes .../bitflip_0_133_states.bin.z | Bin 15941 -> 0 bytes .../bitflip_0_135_states.bin.bz2 | Bin 0 -> 12922 bytes .../bitflip_0_135_states.bin.z | Bin 42791 -> 0 bytes .../bitflip_0_137_states.bin.bz2 | Bin 0 -> 2914 bytes .../bitflip_0_137_states.bin.z | Bin 23984 -> 0 bytes .../bitflip_0_139_states.bin.bz2 | Bin 0 -> 2400 bytes .../bitflip_0_139_states.bin.z | Bin 18850 -> 0 bytes .../bitflip_0_13b_states.bin.bz2 | Bin 0 -> 1405 bytes .../bitflip_0_13b_states.bin.z | Bin 9228 -> 0 bytes .../bitflip_0_13d_states.bin.bz2 | Bin 0 -> 4000 bytes .../bitflip_0_13d_states.bin.z | Bin 29602 -> 0 bytes .../bitflip_0_13f_states.bin.bz2 | Bin 0 -> 2056 bytes .../bitflip_0_13f_states.bin.z | Bin 16504 -> 0 bytes .../bitflip_0_141_states.bin.bz2 | Bin 0 -> 2798 bytes .../bitflip_0_141_states.bin.z | Bin 21419 -> 0 bytes .../bitflip_0_143_states.bin.bz2 | Bin 0 -> 1533 bytes .../bitflip_0_143_states.bin.z | Bin 11143 -> 0 bytes .../bitflip_0_145_states.bin.bz2 | Bin 0 -> 5397 bytes .../bitflip_0_145_states.bin.z | Bin 27056 -> 0 bytes .../bitflip_0_147_states.bin.bz2 | Bin 0 -> 1057 bytes .../bitflip_0_147_states.bin.z | Bin 9834 -> 0 bytes .../bitflip_0_149_states.bin.bz2 | Bin 0 -> 1763 bytes .../bitflip_0_149_states.bin.z | Bin 11380 -> 0 bytes .../bitflip_0_14b_states.bin.bz2 | Bin 0 -> 1058 bytes .../bitflip_0_14b_states.bin.z | Bin 5946 -> 0 bytes .../bitflip_0_14d_states.bin.bz2 | Bin 0 -> 1196 bytes .../bitflip_0_14d_states.bin.z | Bin 12555 -> 0 bytes .../bitflip_0_14f_states.bin.bz2 | Bin 0 -> 895 bytes .../bitflip_0_14f_states.bin.z | Bin 7283 -> 0 bytes .../bitflip_0_150_states.bin.bz2 | Bin 0 -> 1557 bytes .../bitflip_0_150_states.bin.z | Bin 17328 -> 0 bytes .../bitflip_0_154_states.bin.bz2 | Bin 0 -> 3137 bytes .../bitflip_0_154_states.bin.z | Bin 21125 -> 0 bytes .../bitflip_0_15c_states.bin.bz2 | Bin 0 -> 1122 bytes .../bitflip_0_15c_states.bin.z | Bin 12840 -> 0 bytes .../bitflip_0_161_states.bin.bz2 | Bin 0 -> 7268 bytes .../bitflip_0_161_states.bin.z | Bin 33424 -> 0 bytes .../bitflip_0_163_states.bin.bz2 | Bin 0 -> 2071 bytes .../bitflip_0_163_states.bin.z | Bin 17490 -> 0 bytes .../bitflip_0_165_states.bin.bz2 | Bin 0 -> 12956 bytes .../bitflip_0_165_states.bin.z | 31 ---------- .../bitflip_0_167_states.bin.bz2 | Bin 0 -> 2901 bytes .../bitflip_0_167_states.bin.z | Bin 23886 -> 0 bytes .../bitflip_0_169_states.bin.bz2 | Bin 0 -> 2437 bytes .../bitflip_0_169_states.bin.z | Bin 18794 -> 0 bytes .../bitflip_0_16b_states.bin.bz2 | Bin 0 -> 1400 bytes .../bitflip_0_16b_states.bin.z | Bin 9190 -> 0 bytes .../bitflip_0_16d_states.bin.bz2 | Bin 0 -> 3478 bytes .../bitflip_0_16d_states.bin.z | Bin 25731 -> 0 bytes .../bitflip_0_16f_states.bin.bz2 | Bin 0 -> 1526 bytes .../bitflip_0_16f_states.bin.z | Bin 13553 -> 0 bytes .../bitflip_0_170_states.bin.bz2 | Bin 0 -> 1119 bytes .../bitflip_0_170_states.bin.z | Bin 14725 -> 0 bytes .../bitflip_0_174_states.bin.bz2 | Bin 0 -> 1314 bytes .../bitflip_0_174_states.bin.z | Bin 15952 -> 0 bytes .../bitflip_0_17c_states.bin.bz2 | Bin 0 -> 919 bytes .../bitflip_0_17c_states.bin.z | Bin 9694 -> 0 bytes .../bitflip_0_184_states.bin.bz2 | Bin 0 -> 6184 bytes .../bitflip_0_184_states.bin.z | Bin 27244 -> 0 bytes .../bitflip_0_18c_states.bin.bz2 | Bin 0 -> 1614 bytes .../bitflip_0_18c_states.bin.z | Bin 19919 -> 0 bytes .../bitflip_0_191_states.bin.bz2 | Bin 0 -> 5983 bytes .../bitflip_0_191_states.bin.z | Bin 28438 -> 0 bytes .../bitflip_0_193_states.bin.bz2 | Bin 0 -> 2082 bytes .../bitflip_0_193_states.bin.z | Bin 16026 -> 0 bytes .../bitflip_0_195_states.bin.bz2 | Bin 0 -> 2462 bytes .../bitflip_0_195_states.bin.z | Bin 19686 -> 0 bytes .../bitflip_0_197_states.bin.bz2 | Bin 0 -> 1352 bytes .../bitflip_0_197_states.bin.z | Bin 9175 -> 0 bytes .../bitflip_0_199_states.bin.bz2 | Bin 0 -> 2498 bytes .../bitflip_0_199_states.bin.z | Bin 18323 -> 0 bytes .../bitflip_0_19b_states.bin.bz2 | Bin 0 -> 1444 bytes .../bitflip_0_19b_states.bin.z | Bin 9515 -> 0 bytes .../bitflip_0_19d_states.bin.bz2 | Bin 0 -> 1784 bytes .../bitflip_0_19d_states.bin.z | Bin 11481 -> 0 bytes .../bitflip_0_19f_states.bin.bz2 | Bin 0 -> 1084 bytes .../bitflip_0_19f_states.bin.z | Bin 5874 -> 0 bytes .../bitflip_0_1a4_states.bin.bz2 | Bin 0 -> 2795 bytes .../bitflip_0_1a4_states.bin.z | Bin 20539 -> 0 bytes .../bitflip_0_1ac_states.bin.bz2 | Bin 0 -> 1141 bytes .../bitflip_0_1ac_states.bin.z | Bin 13972 -> 0 bytes .../bitflip_0_1b1_states.bin.bz2 | Bin 0 -> 13188 bytes .../bitflip_0_1b1_states.bin.z | Bin 43310 -> 0 bytes .../bitflip_0_1b3_states.bin.bz2 | Bin 0 -> 3233 bytes .../bitflip_0_1b3_states.bin.z | Bin 25592 -> 0 bytes .../bitflip_0_1b5_states.bin.bz2 | Bin 0 -> 7149 bytes .../bitflip_0_1b5_states.bin.z | Bin 33164 -> 0 bytes .../bitflip_0_1b7_states.bin.bz2 | Bin 0 -> 1984 bytes .../bitflip_0_1b7_states.bin.z | Bin 17201 -> 0 bytes .../bitflip_0_1b9_states.bin.bz2 | Bin 0 -> 3840 bytes .../bitflip_0_1b9_states.bin.z | Bin 28244 -> 0 bytes .../bitflip_0_1bb_states.bin.bz2 | Bin 0 -> 1940 bytes .../bitflip_0_1bb_states.bin.z | Bin 15124 -> 0 bytes .../bitflip_0_1bd_states.bin.bz2 | Bin 0 -> 2706 bytes .../bitflip_0_1bd_states.bin.z | Bin 20510 -> 0 bytes .../bitflip_0_1bf_states.bin.bz2 | Bin 0 -> 1567 bytes .../bitflip_0_1bf_states.bin.z | Bin 10895 -> 0 bytes .../bitflip_0_1c1_states.bin.bz2 | Bin 0 -> 5975 bytes .../bitflip_0_1c1_states.bin.z | Bin 28780 -> 0 bytes .../bitflip_0_1c3_states.bin.bz2 | Bin 0 -> 2125 bytes .../bitflip_0_1c3_states.bin.z | Bin 15311 -> 0 bytes .../bitflip_0_1c5_states.bin.bz2 | Bin 0 -> 472 bytes .../bitflip_0_1c5_states.bin.z | Bin 11486 -> 0 bytes .../bitflip_0_1c9_states.bin.bz2 | Bin 0 -> 2501 bytes .../bitflip_0_1c9_states.bin.z | Bin 18237 -> 0 bytes .../bitflip_0_1cb_states.bin.bz2 | Bin 0 -> 1466 bytes .../bitflip_0_1cb_states.bin.z | Bin 9394 -> 0 bytes .../bitflip_0_1d0_states.bin.bz2 | Bin 0 -> 1281 bytes .../bitflip_0_1d0_states.bin.z | Bin 15272 -> 0 bytes .../bitflip_0_1d4_states.bin.bz2 | Bin 0 -> 6278 bytes .../bitflip_0_1d4_states.bin.z | Bin 27477 -> 0 bytes .../bitflip_0_1dc_states.bin.bz2 | Bin 0 -> 1436 bytes .../bitflip_0_1dc_states.bin.z | Bin 18443 -> 0 bytes .../bitflip_0_1e1_states.bin.bz2 | Bin 0 -> 13795 bytes .../bitflip_0_1e1_states.bin.z | Bin 42909 -> 0 bytes .../bitflip_0_1e3_states.bin.bz2 | Bin 0 -> 2971 bytes .../bitflip_0_1e3_states.bin.z | Bin 24210 -> 0 bytes .../bitflip_0_1e5_states.bin.bz2 | Bin 0 -> 6318 bytes .../bitflip_0_1e5_states.bin.z | Bin 28272 -> 0 bytes .../bitflip_0_1e7_states.bin.bz2 | Bin 0 -> 676 bytes .../bitflip_0_1e7_states.bin.z | Bin 10545 -> 0 bytes .../bitflip_0_1e9_states.bin.bz2 | Bin 0 -> 3842 bytes .../bitflip_0_1e9_states.bin.z | Bin 28161 -> 0 bytes .../bitflip_0_1eb_states.bin.bz2 | Bin 0 -> 1928 bytes .../bitflip_0_1eb_states.bin.z | Bin 15053 -> 0 bytes .../bitflip_0_1ed_states.bin.bz2 | Bin 0 -> 724 bytes .../bitflip_0_1ed_states.bin.z | Bin 10353 -> 0 bytes .../bitflip_0_1ef_states.bin.bz2 | Bin 0 -> 414 bytes .../bitflip_0_1ef_states.bin.z | Bin 4125 -> 0 bytes .../bitflip_0_1f0_states.bin.bz2 | Bin 0 -> 511 bytes .../bitflip_0_1f0_states.bin.z | Bin 12014 -> 0 bytes .../bitflip_0_1f4_states.bin.bz2 | Bin 0 -> 3035 bytes .../bitflip_0_1f4_states.bin.z | Bin 21104 -> 0 bytes .../bitflip_0_1fc_states.bin.bz2 | Bin 0 -> 1127 bytes .../bitflip_0_1fc_states.bin.z | Bin 14387 -> 0 bytes .../bitflip_0_210_states.bin.bz2 | Bin 0 -> 1680 bytes .../bitflip_0_210_states.bin.z | 1 - .../bitflip_0_225_states.bin.bz2 | Bin 0 -> 12468 bytes .../bitflip_0_225_states.bin.z | Bin 77058 -> 0 bytes .../bitflip_0_227_states.bin.bz2 | Bin 0 -> 2268 bytes .../bitflip_0_227_states.bin.z | Bin 44320 -> 0 bytes .../bitflip_0_22d_states.bin.bz2 | Bin 0 -> 4981 bytes .../bitflip_0_22d_states.bin.z | Bin 46813 -> 0 bytes .../bitflip_0_22f_states.bin.bz2 | Bin 0 -> 1135 bytes .../bitflip_0_22f_states.bin.z | Bin 23650 -> 0 bytes .../bitflip_0_240_states.bin.bz2 | Bin 0 -> 369 bytes .../bitflip_0_240_states.bin.z | 2 - .../bitflip_0_275_states.bin.bz2 | Bin 0 -> 12468 bytes .../bitflip_0_275_states.bin.z | Bin 77058 -> 0 bytes .../bitflip_0_277_states.bin.bz2 | Bin 0 -> 2268 bytes .../bitflip_0_277_states.bin.z | Bin 44320 -> 0 bytes .../bitflip_0_27f_states.bin.bz2 | Bin 0 -> 1135 bytes .../bitflip_0_27f_states.bin.z | Bin 23650 -> 0 bytes .../bitflip_0_294_states.bin.bz2 | Bin 0 -> 5424 bytes .../bitflip_0_294_states.bin.z | 1 - .../bitflip_0_2a1_states.bin.bz2 | Bin 0 -> 12468 bytes .../bitflip_0_2a1_states.bin.z | Bin 77058 -> 0 bytes .../bitflip_0_2a3_states.bin.bz2 | Bin 0 -> 2268 bytes .../bitflip_0_2a3_states.bin.z | Bin 44320 -> 0 bytes .../bitflip_0_2a9_states.bin.bz2 | Bin 0 -> 4981 bytes .../bitflip_0_2a9_states.bin.z | Bin 46813 -> 0 bytes .../bitflip_0_2ab_states.bin.bz2 | Bin 0 -> 1135 bytes .../bitflip_0_2ab_states.bin.z | Bin 23650 -> 0 bytes .../bitflip_0_2c4_states.bin.bz2 | Bin 0 -> 5424 bytes .../bitflip_0_2c4_states.bin.z | 1 - .../bitflip_0_2f1_states.bin.bz2 | Bin 0 -> 12468 bytes .../bitflip_0_2f1_states.bin.z | Bin 77058 -> 0 bytes .../bitflip_0_2f3_states.bin.bz2 | Bin 0 -> 2268 bytes .../bitflip_0_2f3_states.bin.z | Bin 44320 -> 0 bytes .../bitflip_0_2f9_states.bin.bz2 | Bin 0 -> 4981 bytes .../bitflip_0_2f9_states.bin.z | Bin 46813 -> 0 bytes .../bitflip_0_2fb_states.bin.bz2 | Bin 0 -> 1135 bytes .../bitflip_0_2fb_states.bin.z | Bin 23650 -> 0 bytes .../bitflip_0_335_states.bin.bz2 | Bin 0 -> 12468 bytes .../bitflip_0_335_states.bin.z | Bin 77058 -> 0 bytes .../bitflip_0_337_states.bin.bz2 | Bin 0 -> 2268 bytes .../bitflip_0_337_states.bin.z | Bin 44320 -> 0 bytes .../bitflip_0_33d_states.bin.bz2 | Bin 0 -> 4981 bytes .../bitflip_0_33d_states.bin.z | Bin 46813 -> 0 bytes .../bitflip_0_33f_states.bin.bz2 | Bin 0 -> 1135 bytes .../bitflip_0_33f_states.bin.z | Bin 23650 -> 0 bytes .../bitflip_0_350_states.bin.bz2 | Bin 0 -> 1680 bytes .../bitflip_0_350_states.bin.z | 1 - .../bitflip_0_365_states.bin.bz2 | Bin 0 -> 12468 bytes .../bitflip_0_365_states.bin.z | Bin 77058 -> 0 bytes .../bitflip_0_367_states.bin.bz2 | Bin 0 -> 2268 bytes .../bitflip_0_367_states.bin.z | Bin 44320 -> 0 bytes .../bitflip_0_36d_states.bin.bz2 | Bin 0 -> 4981 bytes .../bitflip_0_36d_states.bin.z | Bin 46813 -> 0 bytes .../bitflip_0_36f_states.bin.bz2 | Bin 0 -> 1135 bytes .../bitflip_0_36f_states.bin.z | Bin 23650 -> 0 bytes .../bitflip_0_384_states.bin.bz2 | Bin 0 -> 5424 bytes .../bitflip_0_384_states.bin.z | 1 - .../bitflip_0_3b1_states.bin.bz2 | Bin 0 -> 12468 bytes .../bitflip_0_3b1_states.bin.z | Bin 77058 -> 0 bytes .../bitflip_0_3b3_states.bin.bz2 | Bin 0 -> 2268 bytes .../bitflip_0_3b3_states.bin.z | Bin 44320 -> 0 bytes .../bitflip_0_3b9_states.bin.bz2 | Bin 0 -> 4981 bytes .../bitflip_0_3b9_states.bin.z | Bin 46813 -> 0 bytes .../bitflip_0_3bb_states.bin.bz2 | Bin 0 -> 1135 bytes .../bitflip_0_3bb_states.bin.z | Bin 23650 -> 0 bytes .../bitflip_0_3d4_states.bin.bz2 | Bin 0 -> 5424 bytes .../bitflip_0_3d4_states.bin.z | 1 - .../bitflip_0_3e1_states.bin.bz2 | Bin 0 -> 12468 bytes .../bitflip_0_3e1_states.bin.z | Bin 77058 -> 0 bytes .../bitflip_0_3e3_states.bin.bz2 | Bin 0 -> 2268 bytes .../bitflip_0_3e3_states.bin.z | Bin 44320 -> 0 bytes .../bitflip_0_3e9_states.bin.bz2 | Bin 0 -> 4981 bytes .../bitflip_0_3e9_states.bin.z | Bin 46813 -> 0 bytes .../bitflip_0_3eb_states.bin.bz2 | Bin 0 -> 1135 bytes .../bitflip_0_3eb_states.bin.z | Bin 23650 -> 0 bytes .../bitflip_1_002_states.bin.bz2 | Bin 0 -> 7733 bytes .../bitflip_1_002_states.bin.z | Bin 34594 -> 0 bytes .../bitflip_1_008_states.bin.bz2 | Bin 0 -> 6132 bytes .../bitflip_1_008_states.bin.z | Bin 27612 -> 0 bytes .../bitflip_1_00a_states.bin.bz2 | Bin 0 -> 8688 bytes .../bitflip_1_00a_states.bin.z | Bin 35498 -> 0 bytes .../bitflip_1_012_states.bin.bz2 | Bin 0 -> 2678 bytes .../bitflip_1_012_states.bin.z | Bin 20925 -> 0 bytes .../bitflip_1_018_states.bin.bz2 | Bin 0 -> 1623 bytes .../bitflip_1_018_states.bin.z | Bin 20107 -> 0 bytes .../bitflip_1_01a_states.bin.bz2 | Bin 0 -> 3415 bytes .../bitflip_1_01a_states.bin.z | Bin 26647 -> 0 bytes .../bitflip_1_020_states.bin.bz2 | Bin 0 -> 1536 bytes .../bitflip_1_020_states.bin.z | Bin 17327 -> 0 bytes .../bitflip_1_028_states.bin.bz2 | Bin 0 -> 3493 bytes .../bitflip_1_028_states.bin.z | Bin 22552 -> 0 bytes .../bitflip_1_02a_states.bin.bz2 | Bin 0 -> 6158 bytes .../bitflip_1_02a_states.bin.z | Bin 30656 -> 0 bytes .../bitflip_1_02e_states.bin.bz2 | Bin 0 -> 2012 bytes .../bitflip_1_02e_states.bin.z | Bin 14873 -> 0 bytes .../bitflip_1_032_states.bin.bz2 | Bin 0 -> 3614 bytes .../bitflip_1_032_states.bin.z | Bin 27648 -> 0 bytes .../bitflip_1_036_states.bin.bz2 | Bin 0 -> 1975 bytes .../bitflip_1_036_states.bin.z | Bin 14397 -> 0 bytes .../bitflip_1_038_states.bin.bz2 | Bin 0 -> 1274 bytes .../bitflip_1_038_states.bin.z | Bin 15087 -> 0 bytes .../bitflip_1_03a_states.bin.bz2 | Bin 0 -> 2736 bytes .../bitflip_1_03a_states.bin.z | Bin 21014 -> 0 bytes .../bitflip_1_03e_states.bin.bz2 | Bin 0 -> 1515 bytes .../bitflip_1_03e_states.bin.z | Bin 10863 -> 0 bytes .../bitflip_1_040_states.bin.bz2 | Bin 0 -> 415 bytes .../bitflip_1_040_states.bin.z | Bin 9771 -> 0 bytes .../bitflip_1_042_states.bin.bz2 | Bin 0 -> 7642 bytes .../bitflip_1_042_states.bin.z | Bin 34648 -> 0 bytes .../bitflip_1_046_states.bin.bz2 | Bin 0 -> 2351 bytes .../bitflip_1_046_states.bin.z | Bin 18495 -> 0 bytes .../bitflip_1_048_states.bin.bz2 | Bin 0 -> 4419 bytes .../bitflip_1_048_states.bin.z | Bin 26711 -> 0 bytes .../bitflip_1_04a_states.bin.bz2 | Bin 0 -> 13641 bytes .../bitflip_1_04a_states.bin.z | Bin 43565 -> 0 bytes .../bitflip_1_04e_states.bin.bz2 | Bin 0 -> 2913 bytes .../bitflip_1_04e_states.bin.z | Bin 23874 -> 0 bytes .../bitflip_1_052_states.bin.bz2 | Bin 0 -> 2732 bytes .../bitflip_1_052_states.bin.z | Bin 20931 -> 0 bytes .../bitflip_1_056_states.bin.bz2 | Bin 0 -> 1540 bytes .../bitflip_1_056_states.bin.z | Bin 10868 -> 0 bytes .../bitflip_1_058_states.bin.bz2 | Bin 0 -> 1573 bytes .../bitflip_1_058_states.bin.z | Bin 19459 -> 0 bytes .../bitflip_1_05a_states.bin.bz2 | Bin 0 -> 4469 bytes .../bitflip_1_05a_states.bin.z | Bin 29724 -> 0 bytes .../bitflip_1_05e_states.bin.bz2 | Bin 0 -> 2026 bytes .../bitflip_1_05e_states.bin.z | Bin 15828 -> 0 bytes .../bitflip_1_060_states.bin.bz2 | Bin 0 -> 1534 bytes .../bitflip_1_060_states.bin.z | Bin 17332 -> 0 bytes .../bitflip_1_062_states.bin.bz2 | Bin 0 -> 13374 bytes .../bitflip_1_062_states.bin.z | Bin 43839 -> 0 bytes .../bitflip_1_066_states.bin.bz2 | Bin 0 -> 3290 bytes .../bitflip_1_066_states.bin.z | Bin 25704 -> 0 bytes .../bitflip_1_068_states.bin.bz2 | Bin 0 -> 3548 bytes .../bitflip_1_068_states.bin.z | Bin 22536 -> 0 bytes .../bitflip_1_06a_states.bin.bz2 | Bin 0 -> 7596 bytes .../bitflip_1_06a_states.bin.z | Bin 34536 -> 0 bytes .../bitflip_1_06e_states.bin.bz2 | Bin 0 -> 1976 bytes .../bitflip_1_06e_states.bin.z | Bin 17200 -> 0 bytes .../bitflip_1_072_states.bin.bz2 | Bin 0 -> 4289 bytes .../bitflip_1_072_states.bin.z | Bin 29569 -> 0 bytes .../bitflip_1_076_states.bin.bz2 | Bin 0 -> 2101 bytes .../bitflip_1_076_states.bin.z | Bin 16139 -> 0 bytes .../bitflip_1_078_states.bin.bz2 | Bin 0 -> 1284 bytes .../bitflip_1_078_states.bin.z | Bin 15066 -> 0 bytes .../bitflip_1_07a_states.bin.bz2 | Bin 0 -> 2730 bytes .../bitflip_1_07a_states.bin.z | Bin 21102 -> 0 bytes .../bitflip_1_07e_states.bin.bz2 | Bin 0 -> 1565 bytes .../bitflip_1_07e_states.bin.z | Bin 10895 -> 0 bytes .../bitflip_1_080_states.bin.bz2 | Bin 0 -> 413 bytes .../bitflip_1_080_states.bin.z | Bin 9770 -> 0 bytes .../bitflip_1_082_states.bin.bz2 | Bin 0 -> 10172 bytes .../bitflip_1_082_states.bin.z | Bin 41837 -> 0 bytes .../bitflip_1_086_states.bin.bz2 | Bin 0 -> 2874 bytes .../bitflip_1_086_states.bin.z | Bin 22500 -> 0 bytes .../bitflip_1_088_states.bin.bz2 | Bin 0 -> 3510 bytes .../bitflip_1_088_states.bin.z | Bin 22467 -> 0 bytes .../bitflip_1_08a_states.bin.bz2 | Bin 0 -> 4415 bytes .../bitflip_1_08a_states.bin.z | Bin 26137 -> 0 bytes .../bitflip_1_08e_states.bin.bz2 | Bin 0 -> 1569 bytes .../bitflip_1_08e_states.bin.z | Bin 9989 -> 0 bytes .../bitflip_1_092_states.bin.bz2 | Bin 0 -> 3608 bytes .../bitflip_1_092_states.bin.z | Bin 27596 -> 0 bytes .../bitflip_1_096_states.bin.bz2 | Bin 0 -> 2013 bytes .../bitflip_1_096_states.bin.z | Bin 14356 -> 0 bytes .../bitflip_1_098_states.bin.bz2 | Bin 0 -> 1255 bytes .../bitflip_1_098_states.bin.z | Bin 15035 -> 0 bytes .../bitflip_1_09a_states.bin.bz2 | Bin 0 -> 2287 bytes .../bitflip_1_09a_states.bin.z | Bin 17264 -> 0 bytes .../bitflip_1_09e_states.bin.bz2 | Bin 0 -> 1236 bytes .../bitflip_1_09e_states.bin.z | Bin 8388 -> 0 bytes .../bitflip_1_0a0_states.bin.bz2 | Bin 0 -> 1303 bytes .../bitflip_1_0a0_states.bin.z | Bin 15177 -> 0 bytes .../bitflip_1_0a2_states.bin.bz2 | Bin 0 -> 7248 bytes .../bitflip_1_0a2_states.bin.z | Bin 32901 -> 0 bytes .../bitflip_1_0a6_states.bin.bz2 | Bin 0 -> 2013 bytes .../bitflip_1_0a6_states.bin.z | Bin 17054 -> 0 bytes .../bitflip_1_0a8_states.bin.bz2 | Bin 0 -> 6270 bytes .../bitflip_1_0a8_states.bin.z | Bin 27841 -> 0 bytes .../bitflip_1_0aa_states.bin.bz2 | Bin 0 -> 8940 bytes .../bitflip_1_0aa_states.bin.z | Bin 37384 -> 0 bytes .../bitflip_1_0ae_states.bin.bz2 | Bin 0 -> 2675 bytes .../bitflip_1_0ae_states.bin.z | Bin 19385 -> 0 bytes .../bitflip_1_0b2_states.bin.bz2 | Bin 0 -> 2723 bytes .../bitflip_1_0b2_states.bin.z | Bin 20919 -> 0 bytes .../bitflip_1_0b6_states.bin.bz2 | Bin 0 -> 1541 bytes .../bitflip_1_0b6_states.bin.z | Bin 10867 -> 0 bytes .../bitflip_1_0b8_states.bin.bz2 | Bin 0 -> 1630 bytes .../bitflip_1_0b8_states.bin.z | Bin 20353 -> 0 bytes .../bitflip_1_0ba_states.bin.bz2 | Bin 0 -> 3614 bytes .../bitflip_1_0ba_states.bin.z | Bin 27768 -> 0 bytes .../bitflip_1_0be_states.bin.bz2 | Bin 0 -> 1951 bytes .../bitflip_1_0be_states.bin.z | Bin 14338 -> 0 bytes .../bitflip_1_0c0_states.bin.bz2 | Bin 0 -> 415 bytes .../bitflip_1_0c0_states.bin.z | Bin 9771 -> 0 bytes .../bitflip_1_0c2_states.bin.bz2 | Bin 0 -> 13885 bytes .../bitflip_1_0c2_states.bin.z | Bin 43691 -> 0 bytes .../bitflip_1_0c6_states.bin.bz2 | Bin 0 -> 3025 bytes .../bitflip_1_0c6_states.bin.z | Bin 24543 -> 0 bytes .../bitflip_1_0c8_states.bin.bz2 | Bin 0 -> 3523 bytes .../bitflip_1_0c8_states.bin.z | Bin 22541 -> 0 bytes .../bitflip_1_0ca_states.bin.bz2 | Bin 0 -> 7147 bytes .../bitflip_1_0ca_states.bin.z | Bin 32059 -> 0 bytes .../bitflip_1_0ce_states.bin.bz2 | Bin 0 -> 1663 bytes .../bitflip_1_0ce_states.bin.z | Bin 15142 -> 0 bytes .../bitflip_1_0d2_states.bin.bz2 | Bin 0 -> 4937 bytes .../bitflip_1_0d2_states.bin.z | Bin 29524 -> 0 bytes .../bitflip_1_0d6_states.bin.bz2 | Bin 0 -> 2083 bytes .../bitflip_1_0d6_states.bin.z | Bin 16085 -> 0 bytes .../bitflip_1_0d8_states.bin.bz2 | Bin 0 -> 1270 bytes .../bitflip_1_0d8_states.bin.z | Bin 15061 -> 0 bytes .../bitflip_1_0da_states.bin.bz2 | Bin 0 -> 2316 bytes .../bitflip_1_0da_states.bin.z | Bin 16636 -> 0 bytes .../bitflip_1_0de_states.bin.bz2 | Bin 0 -> 1273 bytes .../bitflip_1_0de_states.bin.z | Bin 7526 -> 0 bytes .../bitflip_1_0e0_states.bin.bz2 | Bin 0 -> 1292 bytes .../bitflip_1_0e0_states.bin.z | Bin 15173 -> 0 bytes .../bitflip_1_0e8_states.bin.bz2 | Bin 0 -> 4522 bytes .../bitflip_1_0e8_states.bin.z | Bin 26952 -> 0 bytes .../bitflip_1_0f8_states.bin.bz2 | Bin 0 -> 1589 bytes .../bitflip_1_0f8_states.bin.z | Bin 19601 -> 0 bytes .../bitflip_1_108_states.bin.bz2 | Bin 0 -> 3508 bytes .../bitflip_1_108_states.bin.z | Bin 22550 -> 0 bytes .../bitflip_1_111_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_111_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_113_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_113_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_115_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_115_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_117_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_117_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_118_states.bin.bz2 | Bin 0 -> 1261 bytes .../bitflip_1_118_states.bin.z | Bin 15035 -> 0 bytes .../bitflip_1_11a_states.bin.bz2 | Bin 0 -> 1788 bytes .../bitflip_1_11a_states.bin.z | Bin 11330 -> 0 bytes .../bitflip_1_11b_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_11b_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_120_states.bin.bz2 | Bin 0 -> 1301 bytes .../bitflip_1_120_states.bin.z | Bin 15177 -> 0 bytes .../bitflip_1_122_states.bin.bz2 | Bin 0 -> 7248 bytes .../bitflip_1_122_states.bin.z | Bin 32904 -> 0 bytes .../bitflip_1_128_states.bin.bz2 | Bin 0 -> 6269 bytes .../bitflip_1_128_states.bin.z | Bin 27841 -> 0 bytes .../bitflip_1_131_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_131_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_135_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_135_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_138_states.bin.bz2 | Bin 0 -> 1656 bytes .../bitflip_1_138_states.bin.z | Bin 20356 -> 0 bytes .../bitflip_1_145_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_145_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_147_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_147_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_148_states.bin.bz2 | Bin 0 -> 3546 bytes .../bitflip_1_148_states.bin.z | Bin 22543 -> 0 bytes .../bitflip_1_158_states.bin.bz2 | Bin 0 -> 1263 bytes .../bitflip_1_158_states.bin.z | Bin 15061 -> 0 bytes .../bitflip_1_160_states.bin.bz2 | Bin 0 -> 1300 bytes .../bitflip_1_160_states.bin.z | Bin 15178 -> 0 bytes .../bitflip_1_161_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_161_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_163_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_163_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_165_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_165_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_168_states.bin.bz2 | Bin 0 -> 4419 bytes .../bitflip_1_168_states.bin.z | Bin 26952 -> 0 bytes .../bitflip_1_178_states.bin.bz2 | Bin 0 -> 1617 bytes .../bitflip_1_178_states.bin.z | Bin 19601 -> 0 bytes .../bitflip_1_180_states.bin.bz2 | Bin 0 -> 415 bytes .../bitflip_1_180_states.bin.z | Bin 9771 -> 0 bytes .../bitflip_1_188_states.bin.bz2 | Bin 0 -> 5993 bytes .../bitflip_1_188_states.bin.z | Bin 27588 -> 0 bytes .../bitflip_1_191_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_191_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_198_states.bin.bz2 | Bin 0 -> 1605 bytes .../bitflip_1_198_states.bin.z | Bin 20107 -> 0 bytes .../bitflip_1_199_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_199_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_19d_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_19d_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_19f_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_19f_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_1a0_states.bin.bz2 | Bin 0 -> 1541 bytes .../bitflip_1_1a0_states.bin.z | 1 - .../bitflip_1_1a8_states.bin.bz2 | Bin 0 -> 3543 bytes .../bitflip_1_1a8_states.bin.z | Bin 22553 -> 0 bytes .../bitflip_1_1b3_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_1b3_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_1b5_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_1b5_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_1b7_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_1b7_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_1b8_states.bin.bz2 | Bin 0 -> 1284 bytes .../bitflip_1_1b8_states.bin.z | Bin 15087 -> 0 bytes .../bitflip_1_1b9_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_1b9_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_1bd_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_1bd_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_1c1_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_1c1_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_1c3_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_1c3_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_1c8_states.bin.bz2 | Bin 0 -> 4359 bytes .../bitflip_1_1c8_states.bin.z | Bin 26711 -> 0 bytes .../bitflip_1_1c9_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_1c9_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_1cd_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_1cd_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_1cf_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_1cf_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_1d8_states.bin.bz2 | Bin 0 -> 1561 bytes .../bitflip_1_1d8_states.bin.z | Bin 19459 -> 0 bytes .../bitflip_1_1e0_states.bin.bz2 | Bin 0 -> 1535 bytes .../bitflip_1_1e0_states.bin.z | 1 - .../bitflip_1_1e1_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_1e1_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_1e5_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_1e5_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_1e7_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_1e7_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_1e8_states.bin.bz2 | Bin 0 -> 3479 bytes .../bitflip_1_1e8_states.bin.z | Bin 22539 -> 0 bytes .../bitflip_1_1e9_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_1e9_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_1eb_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_1eb_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_1ed_states.bin.bz2 | Bin 0 -> 821 bytes .../bitflip_1_1ed_states.bin.z | Bin 7078 -> 0 bytes .../bitflip_1_1f8_states.bin.bz2 | Bin 0 -> 1274 bytes .../bitflip_1_1f8_states.bin.z | Bin 15065 -> 0 bytes .../bitflip_1_208_states.bin.bz2 | Bin 0 -> 5424 bytes .../bitflip_1_208_states.bin.z | 1 - .../bitflip_1_220_states.bin.bz2 | Bin 0 -> 1680 bytes .../bitflip_1_220_states.bin.z | 1 - .../bitflip_1_24a_states.bin.bz2 | Bin 0 -> 12468 bytes .../bitflip_1_24a_states.bin.z | Bin 77058 -> 0 bytes .../bitflip_1_24e_states.bin.bz2 | Bin 0 -> 2268 bytes .../bitflip_1_24e_states.bin.z | Bin 44320 -> 0 bytes .../bitflip_1_25a_states.bin.bz2 | Bin 0 -> 4981 bytes .../bitflip_1_25a_states.bin.z | Bin 46813 -> 0 bytes .../bitflip_1_25e_states.bin.bz2 | Bin 0 -> 1135 bytes .../bitflip_1_25e_states.bin.z | Bin 23650 -> 0 bytes .../bitflip_1_262_states.bin.bz2 | Bin 0 -> 12468 bytes .../bitflip_1_262_states.bin.z | Bin 77058 -> 0 bytes .../bitflip_1_266_states.bin.bz2 | Bin 0 -> 2268 bytes .../bitflip_1_266_states.bin.z | Bin 44320 -> 0 bytes .../bitflip_1_272_states.bin.bz2 | Bin 0 -> 4981 bytes .../bitflip_1_272_states.bin.z | Bin 46813 -> 0 bytes .../bitflip_1_276_states.bin.bz2 | Bin 0 -> 1135 bytes .../bitflip_1_276_states.bin.z | Bin 23650 -> 0 bytes .../bitflip_1_280_states.bin.bz2 | Bin 0 -> 369 bytes .../bitflip_1_280_states.bin.z | 2 - .../bitflip_1_2a8_states.bin.bz2 | Bin 0 -> 5424 bytes .../bitflip_1_2a8_states.bin.z | 1 - .../bitflip_1_2c2_states.bin.bz2 | Bin 0 -> 12468 bytes .../bitflip_1_2c2_states.bin.z | Bin 77058 -> 0 bytes .../bitflip_1_2c6_states.bin.bz2 | Bin 0 -> 2268 bytes .../bitflip_1_2c6_states.bin.z | Bin 44320 -> 0 bytes .../bitflip_1_2d2_states.bin.bz2 | Bin 0 -> 4981 bytes .../bitflip_1_2d2_states.bin.z | Bin 46813 -> 0 bytes .../bitflip_1_2d6_states.bin.bz2 | Bin 0 -> 1135 bytes .../bitflip_1_2d6_states.bin.z | Bin 23650 -> 0 bytes .../bitflip_1_328_states.bin.bz2 | Bin 0 -> 5424 bytes .../bitflip_1_328_states.bin.z | 1 - .../bitflip_1_388_states.bin.bz2 | Bin 0 -> 5424 bytes .../bitflip_1_388_states.bin.z | 1 - .../bitflip_1_3a0_states.bin.bz2 | Bin 0 -> 1680 bytes .../bitflip_1_3a0_states.bin.z | 1 - client/src/cmdhfmfhard.c | 53 ++++++++---------- doc/md/Development/Maintainers.md | 1 - .../Linux-Installation-Instructions.md | 2 +- .../Windows-Installation-Instructions.md | 2 +- tools/pm3_tests.sh | 2 +- 712 files changed, 32 insertions(+), 217 deletions(-) delete mode 100644 client/deps/zlib.cmake create mode 100644 client/resources/hardnested_tables/bitflip_0_001_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_001_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_003_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_003_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_005_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_005_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_007_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_007_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_009_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_009_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_00b_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_00b_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_00d_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_00d_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_00f_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_00f_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_010_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_010_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_014_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_014_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_01c_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_01c_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_021_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_021_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_023_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_023_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_025_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_025_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_027_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_027_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_029_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_029_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_02b_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_02b_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_02d_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_02d_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_02f_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_02f_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_030_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_030_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_034_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_034_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_03c_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_03c_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_040_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_040_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_044_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_044_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_04c_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_04c_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_051_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_051_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_053_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_053_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_055_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_055_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_057_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_057_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_059_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_059_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_05b_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_05b_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_05d_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_05d_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_05f_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_05f_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_064_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_064_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_06c_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_06c_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_071_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_071_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_073_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_073_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_075_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_075_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_077_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_077_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_079_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_079_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_07b_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_07b_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_07f_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_07f_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_081_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_081_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_083_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_083_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_085_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_085_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_087_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_087_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_089_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_089_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_08b_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_08b_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_08d_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_08d_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_08f_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_08f_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_090_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_090_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_094_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_094_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_09c_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_09c_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0a1_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0a1_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0a3_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0a3_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0a5_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0a5_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0a7_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0a7_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0a9_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0a9_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0ab_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0ab_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0ad_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0ad_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0af_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0af_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0b0_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0b0_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0b4_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0b4_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0bc_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0bc_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0c0_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0c0_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0c4_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0c4_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0cc_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0cc_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0d1_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0d1_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0d3_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0d3_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0d5_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0d5_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0d7_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0d7_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0d9_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0d9_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0db_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0db_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0dd_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0dd_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0df_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0df_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0e4_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0e4_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0ec_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0ec_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0f1_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0f1_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0f3_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0f3_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0f5_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0f5_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0f7_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0f7_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0f9_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0f9_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0fb_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0fb_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0fd_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0fd_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_0ff_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0ff_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_104_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_104_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_10c_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_10c_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_111_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_111_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_113_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_113_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_115_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_115_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_117_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_117_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_119_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_119_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_11b_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_11b_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_11d_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_11d_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_11f_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_11f_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_124_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_124_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_12c_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_12c_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_131_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_131_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_133_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_133_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_135_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_135_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_137_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_137_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_139_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_139_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_13b_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_13b_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_13d_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_13d_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_13f_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_13f_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_141_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_141_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_143_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_143_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_145_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_145_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_147_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_147_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_149_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_149_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_14b_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_14b_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_14d_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_14d_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_14f_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_14f_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_150_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_150_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_154_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_154_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_15c_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_15c_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_161_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_161_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_163_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_163_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_165_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_165_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_167_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_167_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_169_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_169_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_16b_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_16b_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_16d_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_16d_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_16f_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_16f_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_170_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_170_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_174_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_174_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_17c_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_17c_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_184_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_184_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_18c_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_18c_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_191_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_191_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_193_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_193_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_195_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_195_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_197_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_197_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_199_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_199_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_19b_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_19b_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_19d_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_19d_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_19f_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_19f_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1a4_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1a4_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1ac_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1ac_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1b1_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1b1_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1b3_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1b3_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1b5_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1b5_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1b7_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1b7_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1b9_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1b9_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1bb_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1bb_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1bd_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1bd_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1bf_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1bf_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1c1_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1c1_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1c3_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1c3_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1c5_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1c5_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1c9_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1c9_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1cb_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1cb_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1d0_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1d0_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1d4_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1d4_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1dc_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1dc_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1e1_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1e1_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1e3_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1e3_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1e5_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1e5_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1e7_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1e7_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1e9_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1e9_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1eb_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1eb_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1ed_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1ed_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1ef_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1ef_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1f0_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1f0_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1f4_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1f4_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_1fc_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1fc_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_210_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_210_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_225_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_225_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_227_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_227_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_22d_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_22d_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_22f_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_22f_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_240_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_240_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_275_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_275_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_277_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_277_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_27f_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_27f_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_294_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_294_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_2a1_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_2a1_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_2a3_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_2a3_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_2a9_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_2a9_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_2ab_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_2ab_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_2c4_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_2c4_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_2f1_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_2f1_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_2f3_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_2f3_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_2f9_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_2f9_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_2fb_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_2fb_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_335_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_335_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_337_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_337_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_33d_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_33d_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_33f_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_33f_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_350_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_350_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_365_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_365_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_367_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_367_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_36d_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_36d_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_36f_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_36f_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_384_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_384_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_3b1_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_3b1_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_3b3_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_3b3_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_3b9_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_3b9_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_3bb_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_3bb_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_3d4_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_3d4_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_3e1_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_3e1_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_3e3_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_3e3_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_3e9_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_3e9_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_0_3eb_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_0_3eb_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_002_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_002_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_008_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_008_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_00a_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_00a_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_012_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_012_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_018_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_018_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_01a_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_01a_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_020_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_020_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_028_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_028_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_02a_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_02a_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_02e_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_02e_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_032_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_032_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_036_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_036_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_038_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_038_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_03a_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_03a_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_03e_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_03e_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_040_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_040_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_042_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_042_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_046_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_046_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_048_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_048_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_04a_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_04a_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_04e_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_04e_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_052_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_052_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_056_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_056_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_058_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_058_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_05a_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_05a_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_05e_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_05e_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_060_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_060_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_062_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_062_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_066_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_066_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_068_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_068_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_06a_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_06a_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_06e_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_06e_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_072_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_072_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_076_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_076_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_078_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_078_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_07a_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_07a_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_07e_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_07e_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_080_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_080_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_082_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_082_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_086_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_086_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_088_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_088_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_08a_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_08a_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_08e_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_08e_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_092_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_092_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_096_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_096_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_098_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_098_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_09a_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_09a_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_09e_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_09e_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_0a0_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0a0_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_0a2_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0a2_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_0a6_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0a6_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_0a8_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0a8_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_0aa_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0aa_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_0ae_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0ae_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_0b2_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0b2_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_0b6_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0b6_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_0b8_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0b8_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_0ba_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0ba_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_0be_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0be_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_0c0_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0c0_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_0c2_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0c2_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_0c6_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0c6_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_0c8_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0c8_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_0ca_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0ca_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_0ce_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0ce_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_0d2_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0d2_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_0d6_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0d6_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_0d8_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0d8_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_0da_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0da_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_0de_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0de_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_0e0_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0e0_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_0e8_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0e8_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_0f8_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0f8_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_108_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_108_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_111_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_111_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_113_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_113_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_115_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_115_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_117_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_117_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_118_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_118_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_11a_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_11a_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_11b_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_11b_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_120_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_120_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_122_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_122_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_128_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_128_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_131_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_131_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_135_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_135_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_138_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_138_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_145_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_145_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_147_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_147_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_148_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_148_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_158_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_158_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_160_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_160_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_161_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_161_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_163_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_163_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_165_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_165_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_168_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_168_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_178_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_178_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_180_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_180_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_188_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_188_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_191_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_191_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_198_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_198_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_199_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_199_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_19d_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_19d_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_19f_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_19f_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_1a0_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1a0_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_1a8_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1a8_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_1b3_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1b3_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_1b5_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1b5_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_1b7_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1b7_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_1b8_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1b8_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_1b9_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1b9_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_1bd_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1bd_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_1c1_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1c1_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_1c3_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1c3_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_1c8_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1c8_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_1c9_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1c9_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_1cd_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1cd_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_1cf_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1cf_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_1d8_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1d8_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_1e0_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1e0_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_1e1_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1e1_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_1e5_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1e5_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_1e7_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1e7_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_1e8_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1e8_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_1e9_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1e9_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_1eb_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1eb_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_1ed_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1ed_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_1f8_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1f8_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_208_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_208_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_220_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_220_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_24a_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_24a_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_24e_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_24e_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_25a_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_25a_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_25e_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_25e_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_262_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_262_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_266_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_266_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_272_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_272_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_276_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_276_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_280_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_280_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_2a8_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_2a8_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_2c2_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_2c2_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_2c6_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_2c6_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_2d2_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_2d2_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_2d6_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_2d6_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_328_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_328_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_388_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_388_states.bin.z create mode 100644 client/resources/hardnested_tables/bitflip_1_3a0_states.bin.bz2 delete mode 100644 client/resources/hardnested_tables/bitflip_1_3a0_states.bin.z diff --git a/.travis.yml b/.travis.yml index 7f3d79a46..c8d6c8dfd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,6 +29,7 @@ addons: - libnewlib-dev - libbluetooth-dev - python3-dev + - libbz2-dev homebrew: packages: - readline diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 0b8fea18d..336cac4c1 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -288,6 +288,7 @@ find_library(pm3rrg_rdv4_hardnested REQUIRED) find_library(pm3rrg_rdv4_whereami REQUIRED) target_link_libraries(proxmark3 PRIVATE + bz2 readline pthread m @@ -298,7 +299,6 @@ target_link_libraries(proxmark3 PRIVATE pm3rrg_rdv4_tinycbor pm3rrg_rdv4_amiibo pm3rrg_rdv4_reveng - pm3rrg_rdv4_z pm3rrg_rdv4_hardnested pm3rrg_rdv4_whereami ${ADDITIONAL_LNK}) diff --git a/client/Makefile b/client/Makefile index 52ccfc23f..102bf62dd 100644 --- a/client/Makefile +++ b/client/Makefile @@ -85,11 +85,6 @@ MBEDTLSLIBPATH = ../common/mbedtls MBEDTLSLIBINC = -I$(MBEDTLSLIBPATH) MBEDTLSLIB = $(OBJDIR)/libmbedtls.a -## Zlib -ZLIBPATH = ../common/zlib -ZLIBINC = -I$(ZLIBPATH) -ZLIB = $(OBJDIR)/libz.a - ######################################################## # optional system libraries to replace local libraries # ######################################################## @@ -161,20 +156,6 @@ endif LDLIBS += $(WHEREAMILIB) INCLUDES += $(WHEREAMILIBINC) -## Zlib -# system library useable? Need to recompress hardnested tables? -ifneq ($(SKIPZLIBSYSTEM),1) - ZLIBINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags zlib 2>/dev/null) - ZLIBLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs zlib 2>/dev/null) - ifneq ($(ZLIBLDLIBS),) - ZLIB = $(ZLIBLDLIBS) - ZLIBINC = $(ZLIBINCLUDES) - ZLIB_FOUND = 1 - endif -endif -LDLIBS +=$(ZLIB) -INCLUDES += $(ZLIBINC) - #################### # system libraries # #################### @@ -187,6 +168,9 @@ ifneq ($(platform),Darwin) LDLIBS += -Wl,--as-needed -latomic -Wl,--no-as-needed endif +## BZIP2 +LDLIBS += -lbz2 + ## Bluez (optional) ifneq ($(SKIPBT),1) BTINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags bluez 2>/dev/null) @@ -392,16 +376,6 @@ else endif endif -ifeq ($(SKIPZLIBSYSTEM),1) - $(info Zlib library: local library forced) -else - ifeq ($(ZLIB_FOUND),1) - $(info Zlib library: system library found) - else - $(info Zlib library: system library not found, using local library) - endif -endif - $(info compiler version: $(shell $(CC) --version|head -n 1)) $(info ===================================================================) @@ -585,7 +559,7 @@ all: $(BINS) all-static: LDLIBS:=-static $(LDLIBS) all-static: $(BINS) -proxmark3: $(OBJS) amiibo cliparser jansson hardnested lua mbedtls reveng tinycbor whereami zlib lualibs/pm3_cmd.lua lualibs/mfc_default_keys.lua +proxmark3: $(OBJS) amiibo cliparser jansson hardnested lua mbedtls reveng tinycbor whereami lualibs/pm3_cmd.lua lualibs/mfc_default_keys.lua $(info [=] LD $@) $(Q)$(LD) $(PM3LDFLAGS) $(OBJS) $(LDLIBS) -o $@ @@ -620,7 +594,6 @@ clean: $(Q)$(MAKE) --no-print-directory -C $(WHEREAMILIBPATH) clean @# Just in case someone compiled within these dirs: $(Q)$(MAKE) --no-print-directory -C $(MBEDTLSLIBPATH) clean - $(Q)$(MAKE) --no-print-directory -C $(ZLIBPATH) clean install: all $(info [@] Installing client to $(DESTDIR)$(PREFIX)...) @@ -694,17 +667,11 @@ ifneq ($(WHEREAMI_FOUND),1) $(Q)$(MAKE) --no-print-directory -C $(WHEREAMILIBPATH) all endif -zlib: -ifneq ($(ZLIB_FOUND),1) - $(info [*] MAKE $@) - $(Q)$(MAKE) --no-print-directory -C $(ZLIBPATH) OBJDIR=$(ROOT_DIR)$(OBJDIR) BINDIR=$(ROOT_DIR)$(OBJDIR) all -endif - ######## # misc # ######## -.PHONY: all clean install uninstall tarbin amiibo cliparser hardnested jansson lua mbedtls reveng tinycbor whereami zlib +.PHONY: all clean install uninstall tarbin amiibo cliparser hardnested jansson lua mbedtls reveng tinycbor whereami # version.c should be remade on every compilation src/version.c: default_version.c diff --git a/client/deps/CMakeLists.txt b/client/deps/CMakeLists.txt index a3908ec26..f7b96a7ea 100644 --- a/client/deps/CMakeLists.txt +++ b/client/deps/CMakeLists.txt @@ -25,6 +25,3 @@ endif() if (NOT TARGET pm3rrg_rdv4_whereami) include(whereami.cmake) endif() -if (NOT TARGET pm3rrg_rdv4_z) - include(zlib.cmake) -endif() diff --git a/client/deps/zlib.cmake b/client/deps/zlib.cmake deleted file mode 100644 index 3a77c35aa..000000000 --- a/client/deps/zlib.cmake +++ /dev/null @@ -1,14 +0,0 @@ -add_library(pm3rrg_rdv4_z STATIC - ../../common/zlib/deflate.c - ../../common/zlib/adler32.c - ../../common/zlib/trees.c - ../../common/zlib/zutil.c - ../../common/zlib/inflate.c - ../../common/zlib/inffast.c - ../../common/zlib/inftrees.c -) - -target_compile_definitions(pm3rrg_rdv4_z PRIVATE Z_SOLO NO_GZIP ZLIB_PM3_TUNED) -target_include_directories(pm3rrg_rdv4_z INTERFACE ../../common/zlib) -target_compile_options(pm3rrg_rdv4_z PRIVATE -Wall -Werror -O3) -set_property(TARGET pm3rrg_rdv4_z PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/resources/hardnested_tables/bitflip_0_001_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_001_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..e65f2247125203d5685229230b8a857e03ce5c57 GIT binary patch literal 2801 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_001_states.bin.z b/client/resources/hardnested_tables/bitflip_0_001_states.bin.z deleted file mode 100644 index d697d83cebf0609ca78e17c5d01bb6738bbe6eb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21464 zcmeIaeRx#mwLU!l{PozLzAd%(NEKmhIY^P>97Re2lg+8xR3lCcLL>pUN;N`+5n>D> z$vm9X53vX%@)7w6+lmlFNJb1v2>Ezy1tuYoEretsA=%0#8Is9loSDqW{(9EC_9R;M z*j~T)J?~%db@t}U1z|FKXZEw!y4QW*>)Fuh?_RKWXzsXoeKRl3+kF4H*H<mJ6yLu@ z+)=B~z5LC=%H@5edG}9~E#LcX`TAw=KeprTU!^M)BmiP>6m~q&c;MSFEr(pN3nHOv zYe1GK5owN}ngiej#oPc6r>K4!-&h#)NguAvQ$dQ&sG=PJ_T5fWparX(;Od0fyn5n^ zHVc}sk~}!)fyU&(VoCf&iuhyR-0l(iL$S+8j_6`8NFu(r5g=)wAc9XTYNQ7~`2<|V zoiiswD)cHwR=Cwj%=L;85!#4iPJ@V~Why5-x`a9=1dcQB8tU6E&IVOJFsZ1-<*W}m zFMv5p{PMn&tWQnzhPfe^8i)mTZ+^3#*u_xHJ)4;a@bWFWAc#-MKZGmrMwD~v{*#A% z<6$OCnFM&}r{OegYqAYb@`uTB;*9n|#t77Si9(4ZU=gLm9#H*(y5i+#x_c;)4mJJ4 zLO&FSNLz?YW`PFK^*hdz0mUWL0k(4^TYVfj>6kbkuFNEl)Irr{@Q10l^01n#%U&<^ za($c(RUPy--T4I2TVZMy9O|+blTug&DbNlNSCR`JdW{(8IuEJU=)nk7^^yS&c*bif z_`#?!NbAAMe&ZpBB$%eNMI$jN0*)1zvAVlJQpvOUA~G$8UwZIuo%#cjT#d+MXB6~0 z=kxR-y(Vs!Q(7Pl*E!ks2Dj<NJ7;M4xRkSsSy>!v1A%r6lm}ng9}-p*hvwV@fkL)P ziNLQ|?G#nmOB)XAH<^A2sUoZn!B#L`hWmoFJ{sGg6JOBmAwxl48$HdNH1TI@yPZva z8}IuJ*$kh;0B5?hU$g3h#+jnDKiV<`ZoB3@t{ogA&ESDoVGG<i|D0wmjF1aH(g&}> z_uyW*1#U9E2|<wYdL+mNIS(hdkx&U}#AJFgpxH(g?@1poN|5DakvR +DJc30zpM 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⪒+)ql_k z#^763aa%AhL~4xiOdQ|!@=*%<0di#@cQOrpEu@%-y2b3-VTj9J>vfO9ZA1#-85O3n z{BJYT?6VXifr-cidVIDlX1>BMkVFf^DdZevJq>2$kTBjiPl8Hj+m9DR_F0$OjKq=J z03A?VNlZ^^MM#br^cWsN$nK}HAu<wod<llma8WF;R%SH2BWBZZ^D$+hAUZQgf9nZV zNayUah@*+CMwVwB=o{CX`BaxmTaab<mmJ^<3*x!>Gk3E59Aun9@aii)oJkIpb%`^{ zmMlnZp~tnO<ikY2F%?#Z=r8T1e(!F|d}N+Z{DDw<YMu@rp<Lcot33uu9-qLM$ojk@ zk#H>D>4rm^yFdkdO+cvLP1DzMvtU;$OA$a6R>p{Ltb3$d>UDAi5Y1ln@xQErLotG2 zU{Q?hlgP(XV7Go#pq6E=kSocM8E657WkJ<oi6Y#MsTl;!Q)LLcMk%`2;9gfE;gZMn zo4!|cF|sA+Qs4;u7~YJ~&F6n^>CWM#maxMeL@Zl=e%vCFpSKo%W7;H3{qY?!a{C^* z0hcd11x*M!1*8C*k>r}sO7PF#h;UdjuhO_TxVn7Q2Fyd`s!Wl#|3I_(G$+*U57O@^ z;A<l8(%KaGmdARF&xrZi;5-FoNMr_yN<tVB^L_iP*`F2nExPNL4wCUC3})*`>XFN0 z6R>Vvh;ZxShWX6q(7WG*t-2%kIFa<vS}h?SW14lfrmfJ6U|$j0qY44}8(4&{Lk1lG zIO2ZKUaoLhbyoIM3@63HrsA0b4%z6Z+Kdkk&Uu})0OciG%!=-S)GoLbB#k<uU0y3P zN6+>OCz*Rg;UTwo`Rqcwdx4WKajBM+4tjPKEb2mX)$j2|RIA<Tts>PbW`zph`ayUi zKSQA}vy0+;&=nz?_8s@b``bVW4CF6TWJ@{BxI!n3@M|Uy!+w_AeNo9p1p>GzD{J+_ zO#(dI#re0X&f8#cJMwjb<S2AT#YTIO3t6rtCsL1<P3awX=RHx_Gk_&>w`W`wR{erK z1u+if4z9eJ8BLZfMZ)y^V+rsKGnbLp+0ar61rt=^hv3;dMhs!B2TypFTyGq1_H(EJ z`~`EBA;&z9gq@I(V}7rneTqzflKgqAW_#6VnL#g#=Fd~$_ArMW`zeK&IS+RV!y3DI zqy4sNU)O&BGEDz{PzWrAy}1yM=>vl3SKWQrNwXfiPSW+1b1^>DPVdNomjb%D9D26t zH=1OQkyAm`g5KtgykvUuS#91FX#1;@l4T@6{=QMr@L~fJsN-jkB2gVNAkxWF-~ggP z+n%(K;D?G6S1Yes)@p$#wMS5g;eV^!%J4hH$$G0uBIkX4HlFGB@8g#J8`M6p8|p~n zFqD}=I5}JiAMQPNQFhAFmP_z*w;UrGdSB|}Ep9Hk0;_@Pp(yxa-8<l~hstMJSZ0s8 z+wX(DF>tv>WYsdy(Tq1CrTXjoZ~^#ExYQV}LSB(PtY&t??VZ>_JO9E)Vt=OQv`K;^ z_2uqmkbQuwZ*;l6y1(x-4@+b4E7j+v$&eBD=`yFxi!f_pV8e1}AEU{_JhGu+IE*VV zulayam<M|NBYTIU6?MS8PFg3yyHQa)xQsdfsO65}Q$MIe!?OH3C9mA&x1p5joi#v4 zf)<Ci$j>)=1M&kG;Y1WGKYfW6=~H26M5<|q?$*#4_FTbCm*9@AX4KaTFDPQEp1Kv> zcN?N%WtTJ=js}U(G5JN^yEs~Qm&!@-vL9DUoZraOc8so;qE})0vt;I0uEq{m;^tg! zJT?u+iK&17kVcmKgb+2jhr|)><rCCpg77#Mgvn0sd9Y#qE`jYv;uxR_83z-ikqPm~ zHbp(Oi^Ja8gRpY!*p$&v2CqX<7t(jZdbYrLil*mtS#}S@s&D!pl =CapmP{5Ke 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 M4&(fv9G>`p19S~fIsgCw diff --git a/client/resources/hardnested_tables/bitflip_0_003_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_003_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..5ae156039949ae3c952511b0bdf88dd30874a4f3 GIT binary patch literal 1531 zcmaKiSx^%P0EXkBLd?pkVRsr}G?D<>iMy*0k*i(>g$xQv*mY1yHXCT2j@gz$Mb1Q` zkTjfuWQKYHBH~yQAG{UFAxRtt@u+sd5}+WKqKFr$rJc6V{a?QCoB6ly&D(@-A$aM8 z;lqm`84z!A@jkSomT71K%fPabvRZ~eBP7Fzu_S=8ba$CZ<>Ld50E>)&R~+#VzyB{8 z|0C-<&JPSQR@QlKW-tcwRyEWHV0rbu2Y07Vbj(MdY;V0^RrvMB!c*5izG#aog(G*C zTwD9uzqP%uy2c&$O`IZLUYMG_H$D|<_rJ|$dDH5#&_|1xY||1DDf03oyAKtV>^g95 zWEKjYL-nj*GCP#=>cX(@U1_aFmHX`SoUYd_{}G~F+M^c=c%X&ATnZ9a8k@XSQj%#% ze3Egr&RM^}gHhC=uN_JkzQCJ(A>5I!I_bR~7oErBr6+pw<G3s4bRoXns`zDto*Zd~ z20-*~wb1<#SMDEsT<m4Lnc6VtJzv5Peqy{6pnthMn_1)0L(N$tk8KRn!zTHAW_Lb_ z%c{+S^4{o_W3JB0L^>oKkjF%2k6Wy5LZ6;te1>mRT4KFf0IAgmwOTwTy{G`C2I&|c zU{M|ta_!V{ddRN6UO-Tls4Rv@Hv)(F2{1pAy{rOa6FAq>`wH|OJKj}H&PMw!jb%1Q zR!(H$=Ji{SsDs-|EsK-No5|~(wMHkE>$)jHtS}ZT7>H}HU$`98^6XRf{n6;yYEf($ zZ7pwF$nG8~78fTAzqAgFeY}%-Z(en(F75yeMx;8EQIX>y8l`jEK5-1!E087uM5@VX z8qlh;K)B0%j8dQ)G+)%xdbu@Ys6*c5Pi|mMFK0(7N6jLWhN3jGd%4UW8qa*#F?bJu zx2k}jv}<*C2ZG_k;GuKktOPNoM)JXggz(A+H;BO~HL-pAtKm$ew8nuUWFQ?VBLM9p zCj>CMq5b8dEE}<J-77+`ZUHW-JZL6!P}%gIa~PloJu!lowqa#KZqk^BJoB`vsvzhZ zb)Sj_SRmf(0I~M1a(@4G7C9w)U7#%G(bUlV&*me+`7`9pP*zppuSZAr({DSc3Pbn_ z%Dblz>jmnt1HTu^3img7h9?i->_6G!H0aJ{mRH(J1EPKXxc$#>bRPEwoqBiKR7%|B z1oc7KJ8ebg#q*E%J@^!+zW!>L>=jN5{n|{Yd~P?;>KopU&ePLf(^BhDY0&zLIOmg- zk>j@xlC2+@Z}`s^uOuxzl{R(MUzxf)^ZwSP`m)VFUUcBuEv?_vS?2h~pH}5)d@lJd z0kty1m9Tbe+PAYiP}SkMA2z%za*xU0gw2%p{1N})#!GZGe%o)+eA4nRy3{qL$gR7@ z?Y|>^>-Q#hlu?$#IKM{35uBAQ1JADP-k7@dY~EbxnfHJNTv*nK-Fa^Edybk698n2% z^f(i<^3py9+00fBTOzaTP*d2@7^IW;SNnJA_!BcJ{oT{;zCyUm`abYNNsb{!R<-%F zD;k6#NCQeRE<1sU*Z`Q)HU*x@e)#!%MnnOSA#RC4KvuX;v%>+}4XE59t_8)08oLHF zOI0TJ4ij$=>C=VQd#&r!G3#s=ms7!IBWQ!noa4lB%eg&dcz#<YCunt6s(q(udk^Mv zv&9w|m*qGB&<#<#Mgn&^!~_a!A+ZCo8^viT8xkVCfO4h$0vWl1Ndlcg5N!JUrl9H7 zGUNFyoWP9k<q|l^hZc!24C!-V7BdXnnmK!#3A7P5${Z3LhYa-)YEno6Cy5basnH~N za4`jJyzIRKN}@A^1B8(cuvC!@q6WDexJZWgZ2O{82(#0%O?yb4UKlAwblU<PoV9%; zc8!>G?CPb+zII>Hg;Cvw9%?5>*Q=-$%xsVHU;=*d3O!3JsQAjzfSDj5O0mX>*&&LD zOC)Sb8d?EcSa34XhTCMG?t0zXdtxdJON8*gW+>?@Vlphx{!=(!r987nF#9O_FP2c0 A)&Kwi literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_003_states.bin.z b/client/resources/hardnested_tables/bitflip_0_003_states.bin.z deleted file mode 100644 index 2973d69cb2127c9a5768fa29dd41b18c2d8f4343..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11164 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 diff --git a/client/resources/hardnested_tables/bitflip_0_005_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_005_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..473c32fcad7f574c6b3b1f1ab98bbab50961e65d GIT binary patch literal 4901 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 S{g3=&Qg>PbZ$o@X*#86RrkWZ6 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_005_states.bin.z b/client/resources/hardnested_tables/bitflip_0_005_states.bin.z deleted file mode 100644 index 01b274abed8c01a66e25a759c7e353b24f2a8161..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25606 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 diff --git a/client/resources/hardnested_tables/bitflip_0_007_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_007_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..0cfda87cb7ecf925a5280777a88cf09bc69db73c GIT binary patch literal 1591 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_007_states.bin.z b/client/resources/hardnested_tables/bitflip_0_007_states.bin.z deleted file mode 100644 index 8a2ee553094df269dfe89aa07f950adf96f64731..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11136 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 diff --git a/client/resources/hardnested_tables/bitflip_0_009_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_009_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..1103e29bc6263b22d3155916d735792bee147b5c GIT binary patch literal 1780 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 W!jpp%oH20!_`8xR!i0o~VJztO+gs)U literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_009_states.bin.z b/client/resources/hardnested_tables/bitflip_0_009_states.bin.z deleted file mode 100644 index f1de49a746fee8866eb0dbee4efc1d65cf89bbe3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11407 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 UB(@>eh|O{5as@UlS@H3|1Mn*`BLDyZ diff --git a/client/resources/hardnested_tables/bitflip_0_00b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_00b_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..2e1c29d8784bac460b96057ffb7a63cfcaf72784 GIT binary patch literal 1069 zcmV+|1k(FLT4*^jL0KkKS=gkEkN^mofB*Z{ZIgjF0hB=*0GR*~02l%pK@b5D0RRM8 z5SWS?&G_I3-v9sr00004b4-keOc2q8!5V1Mh#F+bzyL#<WMnd6hKwc%(?*Oy(<Vj$ z0vyvLA(I3&VK7FTG-3vsGB5xT=9w7`m?5JHf;7>i5H!h=fB=Uy$jD^D4H!%jri~bZ zrc8_g1PW46jRHL;nrPB8jWbOl>OCMmOaeBVj~b_RQls64>{6+YVq+4px(rjq*qRm$ zRJzvIF^w3sC(76-p<+YQCIPuvqfI81X@!hn#3}Ij2~{*y^Slc5zAcB;eJQwkk85%I zv5o8;jzgvDJx9RWztg3st>`<4%sLIr*c~ro>0)@z92{olg6LzsyT&g1`j@2YKQY)2 zgVg784)Y9n#x%wZVsJk)>Nq-B$4jkg+|h?(<XjF3$iI>3Z(PfW;v8$nIafi@+-zHo zHZkKd;THpgao~OL!MXT2*7qYAzhR-G;PAQ48z14PVcNf<``2pXbDZOmJ*L5<snq8& z^ST(cXz(<6O*`hrbB<FCInGxpro$5p7Q+WJ=WsWd+|cD71MV2E1J<u&PF2i1;e+g3 z-(!_u<-vKE0px62Oc-??r_d%2^TfsNKGWE2I!rw0VWQYz-eGc<*OlaLd5&f1SNt7g za=6uq!{jzE)O(lKw7t&(`aA3KJC3FK8_x5sb+LVBE9zq#O{v=4#f%$PnCdaH=UC`@ z8a&3p)2%zhna*MIFH-GK;F>-Q-s49qZ+Xv@<b7@>&c$)3=-6A=iD8L0p5^nH#>Ru( zU|oZ0#$v-0MY&?*Ff16-#M-gA#uz<jF&Z>tZa0{2Oj5zbtrT&FmlDN_F>F{S)X=9} zYfmAkV@qkVV-KZvn8y*Z&atpLoJRH?uLrlv?rt}yv7_Go#`VDc7a{VFHNkf@X?afi z{$`(R*7Kes@dsc$ro#+aW6GzL+LzirEAcs(z2RMNSogk%iRLjoM+K#h@jhjvVWEkq zO4{i8lg8G;$hgNC#A&43KZ&(|P9vOQu;X0D_c7f182Gr$c-&}nwjEVeiu|&bNo-iK z!HWhf0~P?3d{tFqs3g*iDk8E~^Wi&{ELcMcfVPMl7#0IU!C;yQX=4*Wv7$o;Gz~OV zVQA7rNsALoT2*MoEJhSzO$mz9qX@-JNr+fWKxC~XSrBP4VTCl9n8pS$7?ukfO(~*c ztW!m1ieyz|B3MR3hB1p4n1+>+h-F1$#bXv>GFXaY!m*067>Zb6EhYtn0||*H7_BT) zG{L2Uj2M)}!k94%(Tamc1z0f#m>MxE(S)=xSYoijCMFWaiqk_%lM@JxVJV{mv5J<4 nB*O~E31Y=m(+IS{8ep1Ws%XH&0-9n=PvY)KrwS4q6p@ku+xGSe literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_00b_states.bin.z b/client/resources/hardnested_tables/bitflip_0_00b_states.bin.z deleted file mode 100644 index 8c919a282f23238a92eb2b65bfe0d11231e4eed4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5964 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 G|NIX-`Sh6p diff --git a/client/resources/hardnested_tables/bitflip_0_00d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_00d_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..c763016381ad805e6c5bccac58280e495fd192c5 GIT binary patch literal 2204 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_00d_states.bin.z b/client/resources/hardnested_tables/bitflip_0_00d_states.bin.z deleted file mode 100644 index 214457920b7145ba903c0a6da7a2a1fba9a2addb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17232 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 E4dr0LI{*Lx diff --git a/client/resources/hardnested_tables/bitflip_0_00f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_00f_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..39e7afc470e0d56ea57eb3b710dfb73e6a1a0452 GIT binary patch literal 1214 zcmV;v1VQ^kT4*^jL0KkKS<apS$^aI!|Nh}oC7%)hRTjiiAshhE01!c$k^Xj2_8bs6 zfS8Ne;0Qke000000000S83v62WYZASL6Bk?K+qa7F&Y2>I5G_y0Li8yrh_2FFoB>n zVq!D^0B~d)Gy#)LLrn%jh+zXjXvD;5007{~G-v}Rn1-4RgAl?7fYFJF&;S9!kZ8~b zO)(8L83rMQ4FRJQ5ugA7q^N=*nh0e*G7+?y9--<Urj0X10ksb#+DE8(3Vo7DuTbbO z%;EXRnD^g+^w(3moT~|!Q{i3LfOa~Af$W^WDB$7BtGetzYxO@-;;ME%QQXEckJS9@ zqW`DZe&<J>b${aOzT$mn{-22OFI<mY@+_}OJqNtMiDTPc6@71g!XJJ7Zxs(AkUeGX z9F7;2hq$rq40x<wRq?&%aP&Nh<Xw}47wjKF<{uIF-~8|$)#iT3SIFppTh>*=_EuaE z1^&lFqw8O6>bZ3>{ED8?nI5wC*?a1IC7d~9lH_nYBdDt)%3~>o4>2&i9`V9Qod1Nl zELc0N8FV_H>5ued@}B|n9gdF9<{TfT!p?`lJ_Yozc|FtiyoZa_GnbX=r{h*12<ond z^u8nPFNpaEvWNP-hol^=uWZZ6&Jme8NOdw#Xdi(^mP*NXS0$IOVlvAt9Hj6#PJ<Xa z7|M>!V&G+r#x53M<fq#?IvlBv7ej@@%P8R;7#t=u(tAe;^RL!_y7<nC<_Dp0dDjCb zLno|QV8wY%C#15;iSd=@VT#JJcO~ww>%e2XG3*)o%d&Wq^-Qp_cV;sygMp3%EVF^g zvxZ|R!z#rwWqnT+?(lfH7mKS0vcC%bDe|8S_a~i`vGbfKC*4aW=uQQY`_2U5WO>iH z74*11)6^5eipChr46tItxiE0cgMek}hvOWcu<Yc^g5|;3aInSD=r}WzJx?BogS)Gf z4)2-spYrJFcTNfFue5$g(Eqcu%6W{hK)sRkjvgji<QzVi%089+$3;9-JF?(DR!0V8 zy@T0SSDgE+s$}#I&tX<OosLR>0zU|QftA1x?98XQ&gTiqT&2}vOQFi07X}=zRxVyA z)c$wod7Vu8j^_pai-({x<zn&@^bDMjK;?_tbu4}(%=HICdL2#^4qP}{;=MD4jI8vF zmG_<2d6PVjT)1%VtTEL)iP>DL?0M0daL19t>^L|)PE*e1-@4^E<mz(2pv#o-XJzyc z1o@B1^A1z0c}LKB7gX_2P0N+p<vSgn**J3OaO^rf=S9_LF9qF?2ZN|mzRab4SR%fl zQkI28zP%|x?u?}wil$hlm?8`8B8LVGELg*VR7B#Z1X29CRN+{ntYns1KxC{8V3R8X zFflV3460Tu60u|?#9&xtnK4XQMU^tDn5kl6j9AdiD=BG163Vc|Su$9r1}R{y#gV2= ztQMkV#KDz?l`^qqGGU^uWW{Pr7>qLpqO!DxWUR?av6f9t6fu;e7|DXnV+D-M3T8sg zWf-Ytl(B%uC6+8Os~JdTkjaUL6*DC>5W^zORx+`aGb)*o$%STAEW`|8EXcz%1&jk2 cteIv8VOYjuq{c-vBR~9I$rRy2Lppc^C|HV2bN~PV literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_00f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_00f_states.bin.z deleted file mode 100644 index 07f00ab05a6a7b3d39c59ef8e6b0697b7bcb6b32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7685 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 diff --git a/client/resources/hardnested_tables/bitflip_0_010_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_010_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..74890f1ff19c2f6ccc65df6537a882cf812eef71 GIT binary patch literal 1557 zcmXxj{ZE>S0l;xY!G{N`^77!LaaU1Lc;wm#gNePXDJW<~eBtGhr>5<ADBjQ?F4mZ( z+1eE!p%u#Y3O-nCx}AqW0de<ScfH&#>jKZt9-3uCtI2J<A82B7z1NwgxprM{nLphA zhVS>&J?1%~(VuCtoq12u|CjRb-J^zoOx3W2EFJ47UOlTDZ~|AWsTA8QV^!!l0?TTn z=W%oQTXp5Vcj_gcLcO+7T<z6uCws|B>w<ozTo;eoZ2jKhRz{+_%rO$>oXWyd8q=W4 zvmAUNBkS?qysi5aSB(w{9Oaee*N(-)id3qD9qq6hiWz819$Yu-DSgmqq0(xRwcyiY z+|>EM>u&12GgJx<w$E$RlL+N8L6=L{*(SVSjNF1Uk(RjrDfS)y-rqt*sB8uo;vqO6 zf|sO1{|&xCJu3NWc(e*2s`%`?Aaha*UF!QxbG`H_?}gxM-^Z4x8lw6l=0gX7w?A6@ z>KN#_`b6OyR|u>f`diBZBaZY>Df~K=Uxw^KE^01phb5}~rCRb8(abd{K%f^m4g5UZ zLsnT5SE^4`A5mPaQ|*siF4k+^N#WL7ILJ&4*1HM!csS;E&Gc3L+y*eOk4z`d3|J3d zhOT~5-CbP{J_PcFjqHRz2{P@nd>t>IrFMR^DsF9ZjSq+oyP4>CjVsuY>EQSsyZ{tP z3{dfPF<51Ia>B3={qp&4%~05BMlJvhj1ic{nT0AC6hcD~N$cCA3ZFa9v^VCm@%U~E zd1`m8tmG|tqM7Xv94{%)ld<1}wF57B!Fz1_CN#(As#_|b;dl8`Xa>!yk+V{;<a~SX z9`A-&!r1aBIos!?g4V+K&^N8uy$}6Py!P`dQD@C6JFh2t%W#KrEV1Sz6Tc7%&&|pv zks}~-e_m@a{j)-NR^IesaAgBrmt?j?HZBWC&1xje2W?=E&Z0|E0Sv=_0@g98T7_m9 zdYxNmPl_uR!95AnK2OtJ5P#J)zh<A~HRW+09}cOx0vOkrO^OaoY$tbHgz3gT`=HO$ zqB0Oo+rV;aOx6-LX-;pW57^GpOl(}l7;oKaTDKm-4Ed&lIgngl><v*n8!=&eQr@97 zos<00Mcy|je`o#r&F{d?pJiu1EH$#4SYFoaEMHBo=2w+WnckpdDOqs|GqIxmMCE&| zo0zxplHSKPN%3G=vT>P8uS|qjb#cmK7Ow7GK{BG3V36U0)ukULfb{Kvp(pT4t(TaS z!mR=ax2j5WDHUl^s9bV>1$CbzE6#Eis!9K=rd!eY>|{Lfu1xD)hQubMQYLGsl8{)p z>qm0wW=uY452F=f(uAk2&#-^}NZ^th$o2}Hj|65uz-;)hN!!5V#kI;q0#Z(A8}JOr zzC1eh=;%VjaN)v#kGfX(4++p223Gj`ULgOu;cq*TKNLpNW8UI2x7*Y)5}8hSV62>) z4Ug;u)6<x>h*_9t#|>TbgZ~q#jiJ|p*YJ1tqEFJp7}b>}ryopi!470<cXBcI$g}mq z8=>COR<hGUq1m>=ZKHaj|J&#FR~jzQcL|Vx3rXf4Q2MR4KH=#@v;t!+i+!tJJl5}~ z+s6h*;)F%ZzMIjQwuV&kp8lu<f+8Mr|JSXeY1vC8I^ds0)1hX7!2Fnzr0rrLXJ^n+ zFki8WB!yJ3Flx$Wsb*#17#Ms33Lq$GMU{Bu2hx84L5BcpzY#-2Ak&#WoQXhBZM&v$ zdM(G$bb5+*aDkU6JD1+qm=#^(;(71@N8iaGw3UX3^_LH~Jzi)yUGl?HkPo6D^9Pyl z(|+shbA{nljq*-Y3#DXY6G-J9k+n0;`C(so&UhGA9YxG=nKO^l8CtC}x3L+TaoJI) z(*^m6av(>?nKh7kU~adgOQ3UIh=w9&bs4$HKkXZx&&qFboN~1brD2qCZfKNLQ5cI% z^Z+~HwqzWeAKBv(`q7Lu!b#{pc-Or=hzP)<FtPwHAlZa8P=}fJy2rTSpEo^^g73SS a)TUd$X(hk3oZ9$2JS35K{dMy-@BaXMe^H(Q literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_010_states.bin.z b/client/resources/hardnested_tables/bitflip_0_010_states.bin.z deleted file mode 100644 index 3b5f8c3d1c4f00f23457f5a3494434d4fd450183..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17328 zcmeHueQ;aVo%TD+cKL(tdUom5+Xm3PrPMF&P)!?WO-S(Foi0mha5N<^bx8>K-ATa} zCQ(TUCULAYY^P1Bo2bO4Zk#xGw<XpF$I*fv8!+~v4T&)MP#Y18*w~juc2rw-u4P#t zSNERtdw=I%<%?J*9_D4{onbCBNQoldd(Q9U`905bo*9@Ns@O5|_PW3PVDYZy|8Z;e z-sG`=t=;#|OTP+hcf8X2`)`+=q(A)KL#O}GFMsgIvH$TGKT{y5K{hTyOancxh2p?@ zHWQIa9ZzLs6(-dY0xSh}rZO`YR`<iJT-OwsEY>Nj%W=OV)sgHWxFsD;E~X=DF7PXl z1}8F7&w(hkt5VX;`rx=3A<^q|N61;i6^MaO(h6&YA4}$$B9iTT3-Ft@ZQxHSZg%@x z{J(!6tArJ>hW@!84nwb;n;C0`eefK<!LJ*~Ynn_GQv#oOpLHqab-8hAT$<WS&3aSG z$|nA)6P(~udhtz&PXm59#M@zNtN2lP+LX8fGCTpM2fhjsIu`cR2gqICrbj{(k<cE< zC1Nu=`2o2uvN!9<^5qiA8F)KtkW+5-G_oMUdukl_2PT=E<%jX>d1hLMZ7_mY7M9z0 zc2<0<75)oKgJh}^8t^KHsKk%LQCJ}Tv5emcN$bv_9VV#hu-4;{%*6AYgC?lrO3nc; zncs^Kgp1V0Wfn4}1kFjj6$~zZ41bQqA>n|86art#rlqN<bN%}1ztU&aF+=h48HUe$ z6CX?ZJ2S*Els)nyjik*x%pk1eH5u7-tusrw*c9BGDmYDaDSODlr?!F-buC{${8gpj zbuJp%&zk#{a~W$}l(!GVS)!IKUi?~4$>o<jzysU~B@o0%5}V?K%DzPv@wIN_8;o_- zy}yo}QMZvT@CRHm&VxqfHeDHp&q9JWLW)I7qf!F5$XX90ge&xWaSymzcn|A%Kqu#5 zCsZ-#Ybof*CB&Z=FIIw+cX0=_L5B5#xDwW1^C+&SxIJIamn0vE`zpbY28r2-pM1VS zgq4U0{J9Cqz#z1qm@-&Yv7{4%KZ00-hsT)QVz`PX1B^~Wn>!7!Kx2!0poIk{p(n@c zVG?(_$Ls=XDtI|SeI3d;Zf`v_9ue6RIt_<1k_Xx|_#mD&(#c4gJGTJ!QYAh@dqZl2 zd=yG3`9R0*+ocEKNYTtTc<Zt|bHercdxM^g@>`d}7a0<qUerc^kRf|A+Uv=NmQ*Y5 z^I3AvSi;OP&BuOAYXFiN(rgE5*Lc<0P-YBs(uun)Ry*f0#c~9pCPz$M5^aR)$(gZT zP|X{4d8&&CbB;JJDgIR#59Or7soP4!eiy7h3;)Kd9wy%z1UGa45Kh6n@SZbwmL#aw zC^D0bW9BC$+>{(%)>4H;8sL9E6@m>*_v8}Aix+SD@s^x6!(5naxb@_3V1}<5G$>=P zOrR+vb;IX*l$1fY;p8O+QU_R~q@=|2f<NTEZ&1a%@sgC3lG4vTY&v<SZbw7ITy@0B zUvw$nVXjaZi@8(`K)RLv=DhM0<IB2pG|60ncorryp{025WFe%~?6bWIC2Q9-uCOW? zg%9j#(&}llXe?aA8<S)=L`_GGggu=Q0I&8aBt(Mm&7FV)OJJpmYeAgi%Us;Wec-tp z7KnU4EHb_lz6)d9;K~SYgfj1c;3ndJUX`_28tQU0$6*m*p-4$w={0>>2Vi~kFq%_z z+=&!1E3e8IvIiWl>1W1+^2o@@XQ#(#I3r;^8JHN0&2Y@MR)cg#x|=>e3={e)%<dsm zJ5RI9`&k!0fL+C~zD|>Th0O$&-Mim-u)Iw<7L*?{mb6L7wE*|?VEOY_O?Rzdzg}!j zg5upJWQLdZ^cbS}-T{Ff)lL0_C(~<khTC{`i2s2ufGqzB#)HXxnZOs5QV%S^U2sC& z2)GNhmP2?C@0)TGj=@3*<>d8tSmRHN7YDg)dYHslfo6!(+yGHK>Vp`pxQL$pN($VD zLa_>wA|s*imZv?e@|~^>i5bcxkp!I9luceNq>u49O<Y%3poFQ#kTP6<!c6%sQ%E`X z7@a9qtovR5R|l3Qq$$>nRXP*&{z>iuIAhR$Obq<_WvQ@TFR*JmpjMOzVzoWu7pWP9 zvspP@8Y7G0u<o3y;Z>{5?|S*@o!*<1(%t+J=JhB|l10a7-yo80XlPghM|J50Jjp|+ zREO~|dtUHUwG^hr&Mo3K*d28BEQw*rI5F!&*tA4_?ZLaj4O*fH+)X+?M|Q$zNSy44 zm$_=ylQ`^$aG`R3N?lYjcoX<TWcg*)qO=0jGg4Zy0-OGgP%pmz6kelNbF+Ug0sm_H zvHq=N6I{Z|JS}Rf_HR<Tl3d2y;5&MnYg-^3zl%!-TNuIyq#h%zaGsE5Cc*|boFyw^ zXTNeXO;(bo0b*5)dI1_VV=tnIx%wNXr$4}d$FC#Vqx9_y=wuqEF>ytVPdGo+U_3#> z^cDEe=%39-#iz7Xa<lOv`1(QmZ2SSUXbV9!#n{X8Or-)FvpjGR1hiofu$hBBaD$53 z20?g4#F}FFn=!Fc32fn5Pg0JQaxPoMMTktpSy9<_yyht0fW=$2vttE@{@79YnO&Ls zp%t5L39rOBOA%H4m}qYzSFmKqbVz*J=l7cTAUgP;3SUwO;gHgcNunH*>iD~9?jaCP zww`05J@hBI569s=w#2>yosAH)udi>_XgJrm#eCr)4d=op7cFDr#@DQE_;N{!Kph3+ z;;XN<xO?tcE45Ii(>FNjG`kZ%O@6fpj;insyz~tS8}y8TXS5fZ9-F;tO5z^!MKg)< zds~+k%-BoB3ptLviKv67pjXnZD<A6!CvFwD_g&1PB2&cc2!0f+<1~J9{dz2Jm-Pk# zb_LErz|i6jrs40;!_r}L7vAVoF!rD9AapUh=s1_taI&;wumcV<T1iQQG7w!m4K{#` z!m12b0^HsNoXj?0BUx;aERRi+v;b{uC+^J+48u<}h-jG&&1NK{*G^aKFp?>{hORY5 zGu#T$#~>zkx1<^;cqqwN*LY8Mco)^d3Nv&mNHgbwa2{y4gY<jsep4@Js?H06;byap z>?yBHlH>4AxPkY>_hAjgCB@b1hlilb{3q;yv-J{^szDe{mzmOj_(k01Hl#M`vy&84 z(_!2ri^k4Q`du<}F&DnU(pU+V)?!6Lw*XEM5(Yf8Be+81UqW>7OBXcvUg+?lGs-Y| zq87Ta=ko`Xyegyq0ZZpOQiB^gQlPI;iDQ>+o1W2cbI-rE9k#IHAY!x&9X9jdjxcLD zpb~c_)Zndcycrb6cgFBpJm)AcJSsq4qK5xN9U_VK9D%L?8lK$oG^A9mXF}qb;Pij1 zy1FqY*Ne5lj=&dS5f^2=Ek*<c!w3}+4Tq<mgyYHxo}L4bRst5|UM&AuD6pwRxDoyq zthUvLi@y+DW&okg_*MB5N<#F$TU;z#k3Hs}%UR9E5mMSpa^}8CrgH9&RUS8#yU7h0 z_`6_;6+^=UEUy;UiQ$BjmU)pq8~_(>tm_?rszJ|wt(xHIs51+HmWbq2GxsfDegIKN z3Ag61RxE6G6T^8;JUu+Pz9PJN)qwYYBCU0F4a(V?s6(Ycs)a@h3I5<3?#~dbm6AG` zvy}?;tcWS)Ay~G~3TrXA;0xN14NZXQIMj*KjF)Lgeb&iEN86Ta=h9k?hL6|Kz&K02 za64v-+yTi@&=vj~h2(zHIH10{@pgWFFU2a&IRf+63`kobGC)K__3rc9^+Lwfy8?%5 zGa@y!@=Z|Pbk20f=$-HxegdATm);4{n}Pvcn;^kY^q4g~(DH@ZH>ijp*b*2eD1gRm zI7BONw@=SxcAax@v2#b@1e`C2Ri<XTFg!8quxVk1<urofg!rxmN3w+wF`Y^Jfrt50 zQa`K`!?lMgDN?AM(_D9pdsh@@^w4G1LTM2MLQ{)-u7O1TnSkADn=%9?J+O?6ntJy{ zFt)+lM^p0c>M%5GWb^7ER8ey7qvtlya{_v+3&0hZ!nqX#+!c4NFf1VK{ZlbUMjf?K ze&PNm(sSk%d6(c|p%?2?9x!v6<KKt|!$xt<tl=ZyU?#HxiToV@S#dK=ClleBcNF+$ zT-}>4`_by3!?T(;lk`(5UC+mp^lwx+n6}0P`6Z<n8G<uLF(k2RA4TxQZA`qx?)&xP zNd(>r-vqyx5v;oqKjTgap2agq@fI9NK0C&VDb?u?90djR$dQzk#Bp~VvH|{K2o6g@ z+B1@P*GJ#(>sv4qCVq|N^sq>h4OxFk!5%k>8{s|m2AocIO*x=jSBFSKdackr=0nb4 zQ|p$M(oP?JC0&DPPZcf0SNA1r8x$<)bH#;xTcotDYwu)mCKFCS+0A}J%6Nj^fU|&Z zI5c_DIkFkb5R^Z{BN;jTivm-;;4SQ;iPTPtj@ZGBKP_HVGptw$p%HRq#DFeFbSu^o zP7rZ>Sfo$Dv($oPG%JuFe)8VsU&rEhiAF*kX5)-BL`o;$<Bmg22^ub}V>{1FcX!Y< zbV66lX*kMdOod%(+6kF)<OaGxU?i2}Z&@{p#JMW+-^t}K66~*16%?uP1`7>~xp*7< zwv4mb6oVY|9%z7EIdOUK0LA3bestGz@XW9kppgkMt0EnI#}I59rtuT5rv5;SMt%-E zF9qo^gOCav?I2ZOQl67kKP)K-hG_$w3*oSfl#zUn{9Z*WgX{;v5hc`|6o+3p{#>A! z1o(0U+cnR@)|B#Oo`?L;dGU~vcdi-Q@Yyr;kTpZ|YoDR_l+!P-op)=a7B<{uAV#}H z(yn=(oJ<+c$?^G7wA9H@NH4lnT^7Tl1vDz?X?_J2x&*q<o7D-);>3{emFzN}GChK0 zDi*_r%<g6WGX7(Fc?4q&7iLk$MKLbJ@{fh$UC5H$w1kt5fF3Cr$7cH+PKih!T$L}I zI9b{k-RB_BH#C&J?T6(mVA0bsF=A6LMZ$4v5dXw{X%n=^JUATGBxyICCF=`K@D6Na z)8ErOyx(+?M<=xoUP^8J`7a{*jB=bF1nPJTzXP8(g_rg8IImd%lz!)cd!=XDpl?j` zPez|MZh&=W)F@u3!E{C%rjH*(s>@@w(tt+iY^4G{Bb8xFanjdjg*E=PcoE5wgn$*u z@@S$o3ns~m`aF?DU-tHce-fkN<25uQn-NXA2Q#HUO}L(QZyrS^GNnCWEO_<nhvCgk z4OVF+6Ye1?4qG)?X;{p)^OVc37gyoXW_!M`kCKY;ZWuL-WAsf`SJo!()%C_`b|bD$ zwg|)obOKHlq7?*7d>%0h+$n%YCBflw)A#mpZ`eE}cCJ5*Ab2Q7>Y*7!rU#iT37eLv zubGP!Xp37g?vL_fvkj??U=Hyb4%cna&RvDdc_oRIuH9fN<*?XNE$nI$F2$~l%uK~x z1IYr50_;w;8}MR=^yRt6?3NQwy^DWs6ie&8*v307!m2ik1Z>sHJQ4di=Ek)Xv6!C7 zcKC8d<{2k^35WlSLPgl`#5e8K;>%H|$Tt{zGo)fRtCf_!<$~2p%8$*)YSr<`wX<5- z!t;2iDJo?JSnorWggY^c*S0x|x8OkR?7*fDeka_DqaZ?$RS@9VY_l>Gq|%2WxDuO- zf7VyvMj-zj68v*5zjprF6)#C9D*O5JxGQN0%K2s2h{cCD?B4zGTyfDl($tdb>|np) z-huLUU35x2BK49ps2dQ7veqM}OM{;Zcm_FM-BbYUOd)TPFPg_NejDGnf?05(_=2>d z1|?uc|5XB#%zfha?q!%mSISief4fg;J}438<vYY-7S2Gx(A0ACAgp;6lFz`{40nc^ ze``9z)im^%8ss!A3zx19^GF&VVf-+pG3g%RgJ1(lA9#i?u-(g|F5Irz1X7?%7n~N% zbJxp`vFchV?gg2up^ekB8q@j$qtKvAQy(oX9)e+;c5Pw`Of>b&uNYFus2S4l3+GOu z&XACj7pYgZ8$dVc37iTs{8ptFCSt}6(!7PhaLu%8ZnAmyqoy;v3aJdAtxO@ET*Z{a zZ15=+VKjU_0sqYx9+37<0ydKlY-UJ!6$?DCW|m<j&qa*~wK-<!&G524LmOg-9-7At z9ga1=IRDmGY+*x>z-ajns~+;+pK-nJg}ti<9psN}G)da1+Jgv;?iAuvA)W^^hgE&+ z%-BU%+LxqbWrGkQH1mqhGCfciBavou2mg?g)wKtuS8Sjc1=pD)<jM&CRB-)&Ex1}l zQdxf}2OTW*aT}UekAsE(&tX6L6AwuasUl$VP&;4!_=gqwz%alRldEm!dT-9I7uZEU zghRt%(FsqQs9GfHZa8ZeXO}?x9sGYuu>K~xT~}@aizQZdT8LJ#SmI{HC=LNMV&fVP zkD+(Ms;7x$g;f4UKoD%0o&-%w0<a9R7&a~82Y3YU2E!BS*wW+3xYJ|s?^IA3-?vG1 znj-z+E>zCPwWgM}+aVm2{FhaWrmtXEu5N1CH-|BT+$sib(&c>`6s*j;sHw;`Dk1$g z=qG!()XtA>q_+ve%Ih(uHn=}e#8%9Uh!qXl(lnoy%u#vd0$>(GMQ%nkm~`WZ8cbJ| za?@h9p5jL>R*UeXv$9$txa-<kEsJ^+c*nKDyxs!qI>rprp(b8)6mLsNwe1M|AOSO@ z<SnZ*)x{B997B<!6=j0lRS-OB&cQ#IlgDlTSr`0sXde8toBg1izcVmzp_{z$aJXam z*PV{A>KY7Ari=MdHkfg~KMbQ9d4rt#4U92$N{EiKN-7reS#2r~!GY&pDmupRj#XAL zBdaG~1X8%02%**7RRYpcz^P2QV(x_Nxy3f%M{#V@iRxG^G@r}#WLr%pSp*E>jx`4P z>kPR?lbVO&(br+-k9+_Ix!Uv?I1S>)BpHAKuC^jKfT%=JScb*+T5PvLY_^-Y&HHe8 z+0BpwO{S$<lw{x^)3?^)Z2pG~#52Zg%X!=|@752RWZJm?qq`Q#s<k%l+73x&bvU=| zX^3q?WnXfyq)okWJFmJ#z1AZ2N+5FDre0gUU*TI6p<5P`c$f2ClFhS|*<{v*bJzfu zAdXRQ<BooEB<1g5O26{cv_*Ka-wHf$cr7+>4r)Bh=9r;1sneRFp8_#M8`nNVZ_1fF zI_B>sI%{FWNyKOuEKRlV`NsHt5sh}VA{_)XuWyHt7mg)yo6C~u#40!{Kra^lUzQ`1 z$g|Q<@-p_Afj+p*BNwPp%|vTW;3_4nKS{3?T!%juTt8vK)gqGMNbVs}Ix!kPUPD9q zOs4QT%oOJU=&`7O>;)Az_0wgOo)2FC99*ZW=mSDBp_rXAz|jlUlX*=|vg<`5N0oCs zsumm2`Xld#zd!>;=V8ZaOx_-ipcoyMES7i)R2HHYwhES5U=-mRf``!&;2L>oQ_iSJ z7J-n;qxg+A3fzGXjS?YicLO#p#dLsbQ5FfLK$}{27IJeHD(5m=9qu@uKoKr>S+#J5 z1*cUJE}d&2@w_Gay4D{$4-La`8xb}2|2soyM6p?|6GXRItq|EcE32i;^I)|udbr%% zKlN~Z!X7Ri4H)au6@xkSrp-3w<toj%wM1w>m-OVk)wBo!Lv_>BPk`?X4@H?DjU)GG zlv@U5gABr|@B};x&WdnHg&_|@Z3?-8K@b?p12%w^INgX!n8kKGw@KJvm3E{+$uO@H z%(HsL`=V_ZCd?~E`beEZOX#n`<%Kstx@#3dtxdaDBkkH=y^{2ydqhKJzoa5wiC(?K zaO@KGs&R;EaF<QJdQOGjQnWDYmI7JLCh@9$BpI`L_E}}t!nV{(f&&5XehUueLa*{) zbppC~{>UxDOSbU5>J)6=9Mrgj&ShF=LEE%^UYM4jhHE!1yA*jx=e)f{vV{%bV2IK3 zmL~N5ePc)(%dy6%Q}cEGk(lG8U%SXkpMVzi36OyeAGKMgWvOOZUBeG%Q6{*;*0q`E zZNwJ@*9GvY;QGl5t`?D`ejf$Ha9aAf4Grb9xb5D)$B<x)S=uv=Ok}QRAN%aXjc3UR zmz>+10UhI{?HZ3498RE-Ojv*Flkx|e8S2db&NPocY2Jlmw7J!qfMW1?AzDGO#24+! zN-H`7o?H4g7ol!`Mo8t=XvxsdC+T6-UEad*tjQ=K9B5Ifwfz7!(<pKja&!3$S#n!x zbyMeJ?owd)W!1vngkv8vGc9v@b+%b<$f4Y6Mot=Z#Hy)>yj#j+jpizNVH#=Ad9jVZ zwg{`91QM_d+ww&0!Fds}n4XrVc|D(MB+p-PC<>usEG!z#Y1!h-(Xf<nFzR;5C2dwq zciOC$?wpm?Du?*Bvs(0`hwJ#K9<EQ?!v*&Wi`nlug7quqsyg&+h+_|M@lXp6D;A%D zfT1G1eG<O$K5Tjep4tqJV?6vVqZ&L0scvF)0`|I_I^9rhkboEAw_$bdNlUU6qGi|l zJlhR>6D8PRH>8mQ4GqGCIO;R_p3k-mLqOGHcj*BwnHh;pL!ah&=A*spXNYFguE%+Z zJY5lYo@Ppnp|by?n>~(Ry{w{NJPf4`0hmm#vZ>d$+|F#WPMne`B=IiMJ$$KsuxU1# zH8h6}KttM)G-k>7;R_MltNq0RG9RyYG&6^3xd+~}P0LJ}me0?_v^<tvc5?n+qIwG( zb|FT)U}-`ldy7%Bn!?Eg^Ruy|>rXSkm7BT9N(XgyX4fRdsal(7nfCQ2(ON@44<E91 ztqSFB#1{nD&7TUcpS0j=ok3U-uVQ3?$3AXD%N!=mc5nX>V%G5jFT`d&UZ4Rw#;^5w z0lgECW*kTB4|$T`U^c_)&y!y%Wbt-6Xu5o0vBa7w7ors`miVGQc|$6L2Y{+Z$F#EJ zk|~aAZ9_}OP#y0=hlV0#?ejbdw*M?(nP*@*>fDbNa&wgyI^B}0sR;jL5XO>9Se)$0 zSBna9h+t7g_}w`M68g7-<EN{nZg62`HbqTEt}zrdcaS)Jptom!Y@_;j!udqYxYAEr z@<eRQyogwlp4K7KHywQ1IZg6M>5%imzY%YYqnO&JWQ2IW!3-v3!Yx+oE*P~~EeRf- zmDP%oo3EYKy5!+n{Hce__+&j?qkuM8;R4<b*V$|XZoDN|X};a!aN}i10qw)Ak~s+h z_rS|c`l%uLGRkrdzBxoT|By_=TJTh~LnEW5m?V>AEoi5Z8$eVd4hS$yvJ|3aKg+Y- zwA4Bnd4eMay2(&_(E33Z7|+{wVLaQ$9xj1Y9p7WF<dV*=`{=`0lBxArv}@or=%E8{ zc3U?j-#}$wDQ%N0RQMb$yhOeB7@$yy=Z`ZyDBVbUU8q|MWF^e!m#l_)iMIrfEB3*r zS!LEQ%yI6z8BNpL-$7AaisrrA-<p?Ko0xnK({jc!XqlE@C&IMMuHCe}w9b3qz`VUg z#KMNjG-9;;ky>G7e+piVXXJrX^Ruy|>#v!7TR|j|XQl6iUEX#^Sf<u_!QhAI1&8#= zRZ3P|S5f)4&pKFwtLIa}^%E9cE$2R2!}fz~5ToJaH8hmZ0;+wyU=mF0c!35>XFXoP zgk$_#j~5gNQMFi%2U49U$g^mm7(DBnPCA2$IEv8;2N%3$Gqe_>6|9rK7wyRh@SID@ z^!}xcwdh*`W$HGxWYF#qd>$PdHzH+=M+NWzh49E~)&aCEQlJ&#V|Z$MRyS86OKyN4 ma1Wfz;;F|C1L9<dT`l}>VfAZqH_df;w73&K^Y~Zpto^?=cqj${ diff --git a/client/resources/hardnested_tables/bitflip_0_014_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_014_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b7fb646d18515f8e17187e3b5a6a7295abe679f8 GIT binary patch literal 3138 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 T0)uZ-uI5}ISJltHcL?!+RbPMp literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_014_states.bin.z b/client/resources/hardnested_tables/bitflip_0_014_states.bin.z deleted file mode 100644 index ec220c70416c0d069c429e3b2042cd196aa1a934..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21124 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 diff --git a/client/resources/hardnested_tables/bitflip_0_01c_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_01c_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..c865be04e9263ddb81adbdf2a07c538c4b9af18b GIT binary patch literal 1120 zcmX|=ZA=qq0D!O7)_$CIaJ}ohgo>`xAza{XVzLg<M6jSxaagFQnQ-@ZSv1*?i!**e zf^yJGKT>2Cy)9&$I8<iidj7(XvFp*(Wg!a0EdJ<^mMxRH%_w1Ff@9;?p5M>U=czq( z<bBu9gHGSU_pTYMv5%X&yPuWcjsJuhWCOMdH(a^%=vE{m8{XO!vzl_I4(xv{EcQ9X zL@!}r4e~mOc}2|YH1@%@tX9OFUd&0XRlpjknZgJsMi>PS*8uD{%y<Da_N8G6i(%Hp z;9iIC==yD$AGggsgL}6f`RJ3!N4K9z3|c#!#L8Ur-2QulrvE$sz;F_Av4DB1K_j#5 zqQ#=sj^uf_-#lMbLH6oi+NL_PuNx9~<G<WKWt;A3Q5I}JA0{%VYzgU1?WCS~xb{w2 z`%Ik)C0plxYp#~CK0zGhqI!_>yO;n4l_ZK6N^AzX%dNST$nl*6oA_K_Ne?8dFX2tM zJ4zP@r>j8H@3=f;H;)`W@M#+_UYpw<u$<c&ApZb2DXORloV3_>-QUPHc3s}GRJ&-8 zo<*4e`PY|1F7seG)t-Cq>#5v4$KUvR614R6YNc#0HxCsl>~+;tWUF8`;3b-iaRcJ= zxs_^dDzg+VP_Ff(;({mNpI2Yl!Gg^*bNb<fSMI})h{rYiG$$&FsmlI|%jwSg%H5fz zbT-ARjKn1A)`fxVU7i(Bwq`Wgr7T?9a9--tWhV+wnSbDy9~^r&Ut_k%s$gDuqdvK} zYBkx_5M6vE|7Oj^EwS}#>BR!a8#3E4>*-Hh40+y=uluu@E3!w_rdh~{F%BXwZYEEX zZl8HYgBD2#)}Yf{<?BjlOUA{l^Kgd+-l_`xRpXAFGQ71%S)P=4ym+~x@VW0PwKcbY zyQk}&;WBZ*f>e}b5(^h`P(k4!8ge}B9C#Hd2Fv?4*93F;p6&~})00oDzk0hf9uLk1 zdgZQlv&T<teDbbXlkV2d@Nqn#r<s4y*a@>)YlRGQmIE%Nr;pc;@A&|QN^jU?>rmQm zrf5G!`t^k(7y`gHq3LnqC8!XEVA4qnstYO5ZW?`U8V%M3wG!Tb>`uAWOOR3A3q*h% zTEZ9(B0WfC)No`{5ANgjCE>Gj28<QiYME7KG@`m3CYJU#A`WMgU@VLngv1of%Bmnk z#YJ1wf&_3xgKrcCiuDu???dGBHfbsPL$dK^AIH_{1SXYq;xMtA<GEcot!=#{3Sdxl zq(WQZb~6k!-a78)VvH|X1)42IWxUHXjZmKVgG)F_jeARTLv=5w`$qnbgzFpIT9|JW z8`?FtU)%ZxMHy@B#pqV#cX=48Oaed*j|#|NcIZ01pc9lyf@G8RpQQ!#MUdl=EN2ce z(KgpsBr_6JV1Uq5gh|CAE0x4>yq+>-)L_I30u)FoG)uuNI1|8khDuW?K(0RJgzCR) OcCgvHW&Q6;v-}_0I>G}0 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_01c_states.bin.z b/client/resources/hardnested_tables/bitflip_0_01c_states.bin.z deleted file mode 100644 index 3d38583d34fdb2b0bd944e41b363985a2b6cfb05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12840 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 VZD;EC21J7Yz6o-_GxmPve*!#KbL9X4 diff --git a/client/resources/hardnested_tables/bitflip_0_021_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_021_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b2fef5781e88b30b5e63963a650864fae5102c55 GIT binary patch literal 7328 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_021_states.bin.z b/client/resources/hardnested_tables/bitflip_0_021_states.bin.z deleted file mode 100644 index 39fc37c15adfb3d7d166aa4c1ab8cc6419bc3b0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33654 zcmeFadw5f2x;9?7-;8^IZl^Q49k!xm9AzqU$Os}L&^0sYAXbc0u|R>PcCbPzRVrX9 z$?F`nItW!xk>e7f)B+`x(nculVg{kmNFzO^ZD^O!rlC#Kkfb@Rto6Rn_pB5ho#X!f zuJ51ky1ck93$-U!-uHR#=YH<{=8bmmu31M*#~lhwe`;I(#42waN$UFHD;@JLO@7tW zG!9JneDtT=e=fS44wpM#e(?{#`1hGV0R_MflihH-brx*`TB92K&n_RUs}ciwbHz!C zknHmqjGwY5y>NDUO6G{V2ChXYm`3wj8;j{NX}Mw+idgGdqC~38(rs`R6h(^cuX#*? zY4`q`Yi7^UY&jrH;H=zI1P;BMrC)`Mb4>+sP5i!WJ(i(FM7PdnmC}28bM0=}6;5%H z<1CUaa84ob5wg1=R}RC9ApFsEfR@B+Bhz4)Y*(#QU<s!P2V<$a2c(8batnKvhI}Pq zZZA2+CHiCiaJWS*;mp1enG9Jikb9PYgBFH_h@Umy0S-^@Q*4bsonOjB(5c@-TruvF zcnA(b>3PTuM4~MC!+g?D4#8Fji6%lBWPq($+$9Fz=iy2Cttoxb59C>}M_`{ip;IaY z$t)^<K{UPP^3m{H)G%9?Hh}&TXK)q1zP2MDJie^;;&vC=P5Y`sWzgNv|AzAGRJ#N& z5%e)%Bt-BPfOp|GDpp3#8(pERTtj$Cqj^Al2kvEsvOyIl%9$N(9ZghpVXi7H&W=fq zQJAlapOZnNLMwTN^VY(2b(mkgrc;CgSx1A07CRIq`#^s?EZocNGFK0;vBDt!)!rd+ z0&b!@ssoPUr=NpQRcV0lEVkSM>uDlO_rqRz5H5>j*^LSPzgi08ro((wkw?seH^K~G zl9<dTidUeV5eI{1s>{PAG>r!#Dv0-ia4{zxKP}+}>ga@u68xYW6W)hM6>)W!ATEa& zskNGAKrJhzI)zI}0DDLDUX_zB!e!3GonpUdcJ(Iw?0lG^>KI8#2*54!$Sq=yn=4-q z2L<qTiqGc59{lwpewD<8gs}=~e-D&3s-AHz<V{*Ybz%Ixgnsw}F2W57=kRab3Ul%6 z2X$-$q+fw8#uY~U8|;G&<x0rzEikPcv`UKYH?Q3Vk*fydyjX24OAZY8^1X!}+wDu_ zlif+OVl^e3#LuEB7Y*xSXGE&WIW#SAFha%T%nNX|;pxT#DD{hDjI(4|rLH|tv+DRm zY|aCaWrr<wJpVCF4Eh#cfGOUTW^*#1s}^73_W2XrJ;E`1IU>aJDVMldfi_zFW0x+* zDZFRU=K;mI;dM1fNP8Jpu7$FjeYRFu;?^BDLdGw_e2p&#aRO`K46SekABFNenn(-f zM92<`FDoaXKfY3#ev<63*-XnX_`#$s9!#}MzD@Tr;a0}YqN9uHC<XH9_Sgb2+!BVh z(AIjl%)bQuUa)Uu_LxC6?}rm-sdzhZF(I2K%9&O4GiVEwX-=TjIHhx>->~inf(3k3 zD2X`(uG~5{j2DV)nwaHnO4bL(foP`3Pof~c1f|U^a*#SED2-D$2jGWbP{m3%`XW5} z8Dzys8E|D_QT0E9tCyxe;-*?L%I8*fPH|V~27kUP!(AQe#6M?D3gMf?R3H9v%A~~l z3%}3pEbM49R7db5a<zA5Oj`BTdkZ^SC!1TKG>Ru+)jbtt>mD)|X20QN%6ldjy9rN2 z!u%t<VV#U8=uIjaA($3|OW~PR#6PS0QN(seoL>QD%&DCm70;_`y%YZ3*rvKwgW@Ll zxy6*vc*j~M;laZi3OQvvgRm3aDyRLakilXqDB@x-UKUahuL2k3YQW84l}qQwqVgh~ zW|@<r_%Ybj!&#_`hm(RW#)Wn52E`BW!&@qcSD7Cxi&@8^>36hHA;-a5DNBD;%k#ju zx*HFQ-`CQ+7w>8p)IuTXWCL5>Pp(NVvTl&;;Z!%?pEt)o;gw1y*tirNKDf+soDoQH ze#s_nTie6<_%*57`_&~4i+l&@E1=?U?&+zInYdm^wyc{Wlg+~7tNOs?ljBnQd@hh_ zs+atl^k1QAn^+=@4eEXZR#D&8a(u2FtKJyo9^>b83u@?ypbozq6C@`b3z2O!Z4Hb~ zNH{hUY_g?0khUGpo}h*uFfs;*>3CotSZj4L{1qnsP#WOd*;Lk1#BYFOLYP!j&)r`H z-;d<MCJ%o+U?0OdmDz^}$PYwvl9j2^`~%ewLfVIHchAG5{y}(dH$3n(-v<wzf#NPu zgNGnjiu5V2v(g0S`J8NH`eqXHiO0sl%AnY5BlDQ`RrXuabpAZo+CwcP-CQ71E@1q0 z#nvlC2ElTSufwuCNP4&+ID$er17FJm>@ZSK%&ul)jmfUZ2k(mV^VHv9XZVc#iA;+n zG~EijL^vntR`=M0L9k1BayWb>VX_ln7koGYost;lqF_|;?~S!;FWi`L4PJ?nV?MI6 zlk134?qQ1e>4pGjCl}(sOGs$#0Ams)M(|^?%7%sQ17LPSdkt1&f-iNJhqOnqgC#-n zL?C_i&n~BrcKqgtdc!o*U)K<+=~phA+My$?ms&f?t#A^OvZ47lhru5%?kk2f&U}G& zxKER)<uvgsiRn4w>#E~*aE9oTTIFDP^}?A>OCAgl3UZE-r7ss(Qqp%iY#$w4XUyuG zZs)yxhB*`F*YI1}9Ay}`=1K~_NQvYYkI%P+r5$TVK}865hKtWibHrs*CPa*6=?3Ce zC&fJCA===V)-YWQ=@wt7QnKYeb(#&1EO;4eV>$V>04indB4C&edv>l+L0AS8!2TdP z9}Jr9-M;ErnY}^PV>jLpz7eE>iB;5RJRfn~McM;&8zrTyn|xiN;+ltJtz>sUgq1s% zKvun&sfaXc>lLHSQX!|+Ljl|dNimY;*UOROmKw3yM7%7C6-M!j`N{JxA+$nkFh`)R z0%nH9Tm7(|@jYCOi;11G&|(+AFttl-l!*?KE$bJ;>A}cDjY<+Ci;Aee3Ox1nNk_!e z{2F__-BhCL9S|817m}XKYTk%?mlGDd#mZpPQ~C}BQ&D?+XDP6ytl+E^*qN=aeuEik z9?L2uUK#F|Bg@o$%M>WJaf2iqCWM?JEDhEg7;Waf>(wlAC)eWOve`Tx@t%Vf3_nI6 z(6Ow>8896Wa3YX85-7akg%REGA67x-L^mgsgfBK>v9|LYp&P!JkZ_9G|A@^YG2s`? za}M56gA?TRaSS|Re2ttQPP?qFSln(*7}Ezwg9fh!DqWnKNpCtAzb<&%cQD-*xE4RH zugRi)N9boXKYXxBDewv9+0fV{9)lvcwDK>PAF)6i>>Uf)XW<HD(3@KES-%Jf5l*p0 z4Z>ixu8rS5t+`{5hZNONt#fS_5LaST|Is&2y0MDdCRNIYfwfyV=zD`jJ|eI(m<_Y- z1&}?|y~nMGt!Fud@k7??y2vGSi@>Ck2jZ>#9I3fr0JF#*1&4-}yN~NH!ge{bHT*QK zp=rSh53$)HtE*PFaBQ((*ATtQ8#1&r8gzsu59HnN1p5G2aX+GxHfg?Iw1{u7nq;p{ zTPnUz;C3P@O1W<Ujs+7vK61zdC)D!fzti2l0p7_znI)ZIkwZ{C)ZO{R)E2Qdh)bcV zpkKNb3Y(y~l(>#@i-D(4q>7Q?KFUpOg^{fMR)x$0VI>tpQY9qSf^jfS=h}7*Cc1@{ z*ZVwJz2Vy+(+QzvFey<9@wdW5i8ezG;}Tc*Ay^l=bo|EgCNK7=ITKjh8U$)!*_?%i zJ;K}j4Z&yX5Q=hsX!pad)bf}r?uTItY?8~HD_s6U5s$bprwtMlj;uREU+lAV*Is1T z9;PRil-Y_eODTBRh?nDrFRH+%46^JB-DVNEr^J4$I22vaP{s7bCWi7{d^7$e>k(hR zX*m!4dH$QA-MIzgSFcSa`RtdlFxKuTwVxgz@7CA*$>mQ^7G;wMUv)-W&%Sp?<@5aH zwb-q&qX~)#OKJkyZ_ZNre(G3J58b7t78Wa>reJZ+7^5%63u6y)#eP9O3D^c^$wFgi zQ?#nje2E=;P0ccA*~JzmQND@ZMfoW(V~1N1UuTo5p^dSpz~JQspZMn(xk@u)kk?W3 zs5JN#6nb=@Yd3f;EZh$(Be2z_i;$P%J;ffN96rL&<eO*Fb#fsqWR_C$D_!i1oM##Q zj_nAD-;Z6>F~?8H)`%KuJ1&_EI!WJjmoscWs56Oq=f;v^a9{2Sz(7L2ig)X@eIc2R zDAcYfud%}`#zm+FU(`sTJnYBPk-m|XM#MRCEt_tKwBLhsjdBr6JvhJhLrt}$99P#* z6W_*CPe-37CF<x&>?CP0RRwrESiJB!J5A10U!KYf<a6##R)E(M>x*BP@WQa!%BwSD zcSg7rXHo??>=0#gc5HPN-lpL7-}H;IL4LZa`JWCCIe$AmoEmWsK2Fi$w@p|Yg5oQN zbP30n8xj(Zz`by=LbW6$;Lo-le0R%Y@#qqG1h)89d%J25k>jd)aSOQZL$$AviqEr6 z<VW~ir$CZS&cSr1+ktP%h1jNgUI%<Tv<D6C$zGPh?t%Bo7da0C@A1N~*yDpFK*oc& zp4hyZbf^+Zfp6e|1i$z}^!zW_9?Kc*uUR|5;nkmlSJ;Gvhd!tyckI^X2oPDcig6t5 z3PlN)$gL4X1Z5|%M!pa~1c{0;?OTvQZHK+3Fw-Y2r%d=SI30tCh6aASSV0_cS*wlL zLR4798s-N9foDR3B5a_(v<Rd)gcizu2F}hnFkor@;16$tpeI0_#FoFl<8~ZtXFMas znsSb_@Zrs&Mcc1YeXWve`XzWHj{S*nncNb{IG)riWx7p#=Ncv5OL`3@vap7w`!wv6 zz8j87hnW<kjVof;_#jK8p|l9QxV=Z1C8r;zr4gL+0uTxC>1@7)@H(BxIdgG*BD9)T z_g`^y!bOhb7V%HQ18f~atB=?`Q+DXho%V=2!8vzt$oHUpyuo${l*En)_&&0+j!Xmo z4#sUEZedz=FgjC)E57^?UD4$`2Q&yKP!5fSq6pXBD>x#$eOE-`qP-A)%`BXUx$fs2 zeq|X9>k=zfgO!`e8Wb@kyJgEXR;ozX$j4l|Mdz@m#>~%wWijZp#n*v945w*|s`Hc2 z$rTs~x}5?02|7$0&HKsoUg8?$dga@)!P0>@)-LP%Qia$~NMh@Pa7~)6S`V{%g<#uH zecbR<m!Wl09#qfv*FK7H9(F>PisQjGgd91|@Oy@!erQDBO2NT`dm(UGtqa0Z1-$KW zD2V@4L&(vbcc5GM{Zmu-h27R*;Yl3BJDD|TZ`urx?|=qIPMd<^=#3x!Shj3}gCk_i z2joBToE@ow#)~j7J|f>OTSk+V!`#?*G8eKfpmlL=N>5BU1;KnMti;lD6Ta_;Zm|+4 zY^@4EQ^2^;o)v>IAMrrK?mFo?CYJ7u?NTMtywCI`dkM03!N`EL&?<f&BPP>W4;LRK z6)udQ9@ee%i=W|X#g=}Kgh}hry`2s-@cjNHJ|JZv!uy;=?JC>~mMfcDrjAwAdsCDa zA6-0tawWF_X{WKYM4tk4$ynaxY_xW=l0p$$&$lPi?Y%fYpHDxzc0`pid7mrD@>BVj zaF`zUv2Z82BahY~CZ*}0OxxotiopSXMek{n&GHeYeo!A%pCL=@$P(515R(tkJ&*Ky zgT7|YZYj~<1`q5a6T1l?Y%J{}=gFjyJK*xAuX&9v2$DUyk8@L5#A|4lw(5d8IPM#j zD_#0yrq6b-Hkqos_%)`V&EfNDzK5pw5>FtJ3e*w`7l*krI(r)}7+|&l(-(pJD!)Wd z_eE!b+0Q=!v)x2kFRDQic??d2ne!@;`_R~#Y*y?IuJ#tnVLn?)iV2^a<mZo9((JzM z%_)={sgmt6z7-w{Im5;MumtQOKoF3j^2#gN!yu&}vIb#Z10H~P;Y61undx0*y+TGa zGRQe&x`6#*;}uw@h%3TeZ9wsp5}NrA6BY?w@Km$G1F8CpIrk~zone?*k4zLitiihU z3TRmho4jJcb@X-mL5#eE=blf8Emz6N7Q-wU9fo77ld;d4FrW1NX|k_&d0%m-Qnq7_ zyXQ~G^ZvW4ENB{WGGam&vadQ~8nM4K-&ehQ`G}o6ZgQX0Rh0;9w9nXuf9iR$|7`v7 zyjSb-lVfGWr??wp8dZ^SYTUknJ3BV&WHvGGNLC9Vq3KmHV~_uw;F;}*0Yxt!0E2Nj z#WKln0&%0LkwarGfPFLrtfO&we_EMLG8DD2TV4IG0)0~v0mnytyEe(^GN{6f%H@=k zM<9{j8sj3wh7*)F{9k5d0B3ysDAM*7Tj!Lykum<=;INgu!TJy~QrQwD8m~^54nu*e z?}p#PDlZASfO%<grI%cSEQ;l`hl~#RhDV@%3%LrPiRn2wPiRzK6#S5m&?YFRTVbAC z^ai=Bcy}&y+5ouhmrFTp3B!76BToFMsZ{BM8!G=qb1HoV8M#x;kO652zrydWU>Zq^ zJchpu-qYpd=ZeazHo^>9ewbP%{`#~0Ihb<;kUYhl#<X_}8hw%gg>O?sIyfr0e@l3C zt7`6qYxS|N>Ze%ed6Ln=iZ8%3FwF(WO`S2)!T!xd2HA~++#sh73+XN{RAQi&o)of= znY{}yWG&ixjoQm1;sG*-W8<=g&8AVX1*Za)WU1AZwRahEnd3Fs_cNm>z)yl5Ol`ct zol>V`WB!DnZX8R4qrEv5_@KvnuzYy_;d~wn3Z1oGN!5_8I`m!KyYM@$HJ^rHa31+( zwjU0fs+n;LXIjmmO|3FPEBn)`_`q&cxO$k|fdxw=-n7x*zWX})rtytY@(|_LM7S-- z$%zhyj8X7j+}I6UU`PCS2?^1@Sk9!Ok-ZgqTglQBz%Pd^g<&_r!(l0fB@*N~n1LA% zGT2Ohx*&O#5-3||F5b<pTHKq@hbhv%fb4tDA**>GQoJ*rB=lJ*^(2zyy~H2xEG7{d zkF)0*e<zGxPhP3UL0WK&HBN|JkznAIRA_fCQbQZm3iS=gmSfbdl!pgXv2qo5h-b7e zF2Gi2&O#7kM`-Ym>?LV??2BNU;%IfXA+2sMBF*frWJSz|c#$n%Tl3Fm`6X&`6YLS0 ztzCaNi~@H#6Fu-7IzyWvyMlG+q;fUUwm6K0dnFR?IXm!B_~E{gu5MH<!1*vvbcX_- zHs-${e05TOC_~6?7uw;;ZnA@k`RYss2Et-wq=c;M5?drQ3>BTviiHj#)_yeu@{WSj zm${ExCc|zoguC>`a77VYdicqpV@RuCh0-(PU3AiT%9k%tXoVs~xhwD?d<OHjkQUo@ zn$E$Jny*up+u$nxTH_}3Irx>bgm}D;1yJEadLpq=YJAEke95VfD`G#hPLXf_v)$rW z*Bzs?WrPgA4q|1WpO%ADciOCAt0&oR!-tDb;7jHgDyq|gHmiy2Mb~6!)OSr4VnNk0 z0x>5{3HaKgkwvRnx*01$JIm~|day_45HN2B?g7W{|KU(S(M1~SVax@t`DIp|87}m7 z!~gc!7YAX1M&AGQI(a{~2g^vpshENBEm$uDusXnv0QD)hbsfM7S`d=Lu{d$BP5KE5 zND@Tg6%Sk`NLA{7!LpoKi|`91th@@B)%&l4Kf*iUpgO)tg9xV4U^{OaABf0GhK3D- z@8^goPmozT>NnW@t(0pINH60^sge0=Cg2Q#Ur^yR!Y$5`>B9Jb5EURe0KFgTk|(b! zixyUNmKpsqcX+z^cnm47#YZ360QrMBve67$u~uFmwhRJI4k>DFhSgqhbZzoKWb;p6 z_}-?E6Cu5e%!_RgfHx{XXY{UEq8@yXIo=234#9MXn8FU?f@z9X=WAev+DgF44!?@a zt_Pu|Srr>=o-_6aC)OfyF#S&WsG7}m>P%3AgKzMeN+=Au?^z@rR;NQIJ_Tl^M6`df z0ldMwesP13TXorZhazSM$U$<xo^PpvvX3AoYH0-N4w79*hNvdvpK!XW#Ya#n^X0}x z2QQtV_jGcpd>w1+i4u{HkCnK6k(sxG;Xgpw&$cwO%@j_WW*HAd@%I%{1Izk1sCp#b zFGA)_$fQXurI9S`V$vT$N9~oYKrQbu#k)UV8^&tx_HB$7KVD$R(Vf}jTfNDPVV%XE z$}feq(@Z=o^Q+bJP?S@FFVi4^(#$;D=#mjn%HM<lS70I)TR~`rG-iH>ypD}MXzJf@ z>Z{gG@$CwB4j}-o=j*Bv6Zooyf)b?uees6>7qk%UoQ&@((7OJ03{kthe`ksZo>%cu zRy|T@-n;e(X7eUpzWn-reW`AoWYTxC%t70<_^jCZ=T6hA@Xc@4`j&F{PbY1{AL#6j zv3#XgrrYrI6UO}NPG~s6grzVo7V!#5K+R#rs?Oe>Q-iY>L!LJr)AlSng=4~fFsgX! zqcuVyoRss;rsFb%!oIE~#~Vclqm~S{djec!^rgs!&7bI$osH~6$m(Cg&h!@3G{;~O z(~p9pfNLJ)^8q@sR;XNSHL*XPP#ra3$Y-xX!7|Wyz|unEaf=tRqm7K^|HoIA3bwJ6 zy9GQrA+>($)HdR3;<oA}s9_JTDhiX&;m2-x(DdBHtU@Cc{)(f#79C!dALNqx0T1sE zLK;>)t*qHYe6O053Pto7uB!fCVFNZM6lgnMzIMU&tu4>-z^d}@Zyw?<JKe!dWkRCc z9(;A2gp5&{f(u$w`Za-B*w1RO(Tr5xZg49%W!1rf2_W7JyVn!nO1HQYS$2z;>^D^* z28D2h;4HUyg;&ln(#9Sk<agkib%P@eKSlKWuyF`NT;qSQz3A_^i>|?yKJs)0jG#)G z7@2+gSk)Yc;bF+^((`Zwjz3t})seCeS0OGAU+5OHBZlK>LV|3$7rOj*e1(rk!Q%Yu z5$MQG0r7qK9&@_5Bg^4~T_oEGwec<GkGe_qE8+(l)6fmmWYH3d)0qJoYH+yfA-`p0 zBDkDgiHHvpaqxlXaYr))H$2XIn8|bj-1F4FjBk18R<Ic(C2GjIHss77Na-ey%`n+( zST7zlwbj^}Phm}WVL#Bx1z0$&I{+sKat}<3aWc0JR=Gu2xE$f@X@<;r9@Tab+u&h$ z91i<8mDVEj@I9E=d*es%W=6og4$P7`(nd0;X=?|pt=fJH3pBFnHz_(5YQBYLOkTLy zBJPug`6A5d<FY!C5!cQA{&l9|6w~J*Pq?@X1_MK6gKWuw#!fQRYbaIl@>{FH(E`V` zdw(95v;jB_!B_7R)9C7*pfE!-wmN#t7X`_K6MOZmPc8H5J3F@>rN%y}5oxCrQHebt zLd-=M{ya8_i#W?K*%+VfE6;Vi#Z<N{Y;6bVxS<kZx?8QD9hV9i^L#>Vinfx-WsRn= zE-h4?{9H{Dcw?&~<lt^H2I<%Uv!nv=l=~@hkfJ^=U01ioah%yY#Uhr8*u-%!kR(#3 z5fqCMT_eSu)5aoGSyG{C3>(*E8buFA6Wa@6cq~)SA3VK`%Yh$9V1ZApJi3BQJ{^cW z3MsqQTU=zOjg-L52k@4X#Zh>U?Gmbr$p~%~NPe2iIG=3;o_~j1FE~`gN(;Fhy;>D> z%d$T<8`sdSklRgOQ4RFC%Gk(yVw80`WT{#dA+;=++(|<35f7V$Fh-J!b&dAMI7{(3 zd{D`s0Nf<h#y*1|;Ym$mzB<TGXY;IZomM<dEt^@=H1e?*DyCpznG84LNFqe}D=0a5 z3n!V<F13)!NeA5!L;(R=VE%@HV3msZC_Mxp!S%f(h>HO#VC^XK00dRBosp_A=TUJd z8D{{8U*Y81gr6st7(cy_ma1#EB9>?AF*ZseR4w!g(tc6^Ijta#AexL|Vt3lC0Ng=w za}d9yUdn%cP0JyF5)1$B#BvQTt>^v>!Ml-gM8QEncNL*Oes*PqXdJ^$32ReXN)W2= zMe2EEiN2b<@HVw9M*IkyUZ(~Z_ZVm^5JWau{r^f%ApA=?!JM@X+lxnTCcjat#ixE& z8!qq&L2-=qPl$=Wh+Mc;eT*PQt@vgc-}Q^eMemrFs)FQ+vMf2AvnTwA8gn0xAm@v4 zPbB+LlrZB_PjEUd!G__N8lvul;espstadRCri%M(o>C9K&YE{aPM_W7RQVD%%a81{ z)T~NYeKPx%XGVXX+wGXbirksALlq9u+9_^f)^XY{0_Nk9g4<9D(?+fih+}-XgAg2e z@=FnRpgg7>=^_-EXroT~QhZDq>@;zz2B+KCt_ym__OM})+eQPWE3y@5lk<Laj64}d z(m^}|OZu!{LmM<Q!2?-Gpf)OoFSbKEGq-}{DwOZTt@CZLvX(chd>z~w(Yp6lQW@g9 zg={>ys5Ef(lMSv&7tB`dKcrlBaxH8-Ahba7qK~B~!ek;67&~!^2HDz6Y+b5}43eD0 zWn0`EyEpVrk-;HhyGC^`k*yT>eq06n{4dIZNg+)!5LX${sc-mb>-vtSd>@_ql%_fG zp&S8)26^17R4$}x4dSwc)2-`w<p#gp89_mUrZ^}HX{1TQn+u<aaEq_<J~I0aMYT_e z$qE-=WK@HvhWbX!*k$oZwnB%MBXhu>Ei`GI*E!f2uwIh6gBq+I?%~t|XoU|T5*1sf zRO%NY3;Ls2_C+_FG1@O)4oX><oC1t=kk?m2V@J?|>*ZY1+$?+E3nz6+Bi*9s5eV*t z*)ndqt^U)&_kpFTl0SJuwLk5kDy(t3T72Z>Fmap*Hx5bJ!YWPlMHTK-c<fh#V*dhy zAyE9tQl%V#tUi<>Wi^_^$Z&jsN(q?CLN`aq+^wX=i`6`SBC=pp9~l{ds}k7M8OVL` z{T#07yWk$!RG}KQu>eVoYA`Ess1s_bcr<MOZzz+MLx_WqL*z-e2f5DWyOMETdY$0- z0P+IjPO!E_b2KqS-E}d8^?dvhe<x=6PR#I~n4#f2F~k3m_xMiC@ST|9J2As|VutU; z4Bv?vz7sQiCuaCg%<!F<;r}HugCdL{v_!a3CymT~2UV#K`GJJ1ov>13ku56uO4Z;L zP}ShBH1uf{LpKuV=>w`TN6~r2^&xHP(GTY!U*$b_JBL}w?eOok@@g*Z-4d0q$-apL zUOQ~`a3@Yc?||$<nelP4uTNe1Yh{z)w=pQK+zEO0DEG^20cZ4b-Z_FwQr{cGw$A9m zIm}S)UEzsvo$GjWNDQl+Dh*X&;u)j5OXR0}>@@Q#$T6T%OEnwW3=>1TB}zqaiXtfD zIXI(|5fFPz;l|iFPniFfidrUvK3I$z_*~F`?TI))pCv^LH7kU-6Ks?`?}IMJ&r?#~ zgI3kpf`sQK$RCNU*1N>|wC<Y*r>Qbu59wLzBox@^xYWeBz~0#%C&<G-<V0pxfG2_k zw$-bUH?v=b9Zx0WcgBYqCeqg;DMhlNyuKagTj2<EE<%-(rjgQU!xx?f>8wF;oY|{# zb@uUt!{oabnMZ~q0Z^IdOygGh*}<8}oNtvA-v_5;e$BJs&|13aysZ0pXhVhG9sF)! z_jyTsO#GaUu7)2cB(!e?mzuUh9)01ulHyh*tWDbpocq>NL7$CJa-cz9OK`U!cCye9 zuI8OnPQv++Wr3WzRqz@|rA4>`3H8i#P3pAf&JSVqQ^b(FgL8jK9<Y<!i}fM0<q9<V z3B#B9_;mr@9k8-Td<x8cVl2YXH^T{88gz+cApH?I#f#nDx@AG;*m!*@VcA1ngZBIw zq_yi^$mYa2q~O6L8<e3nI&LO%zqy%Mp<2e6j?$>%iuk2C!kDo1U8t8xx4m#m5D9Q_ z`*QwA>j@NFv`4rhF{Ew><8TEiqt>A({yS9s3_#5$C{U1UJ4fzT46`C&^AeO<7*x@# zp!tBq|CYffXxt9qTYq*S$~^hApPuaE$C+9F4(9Y(W@#5_EOYnjOQPr9q4XT$p~7m? zj2?)Q?ZU@s9MHBcTeTfbx&wygH(xZZoI^$lv1jrQuqMZ^b<7uR83TOjoISpo3ZF|a zEI|@~VJPLDr?2|9cX2z(%P4|&m#dQ;a^|3e%u~{RMDslCR~=i$mdLl25uaVT?a!_v zK~sVh?=~o-iq{Um?RFbkQO_TZ6g_c8c<I*H=zr-@9$7|a!=~rLj?0j*-QLD}_^%QA z2LGg0k=+(#P?GP0wU6TxG4F1;vxO85TG|UKcM_%y+-Rxwlv8OU${NViN@|zB8qx(_ zpW%W(rvu(blVWQnv+RJm>9}VQ|G?0aw<XFs{iMY$;sUtp8(K&dHqE9bpT$Z_$b-0K zxCqW^<X6VNRNkP8m%n<l(^$T6QrFuYSW_=P;Y@M~&jV!M*h)z#m+d|Vsa#3;ys5># zoJP`u+>pjTuFtG+!|HC{LvvD*L(Gc7(rZMMNr_%6bTh}4$ie*snaw+(#UYMY&2{36 zF3Tk<KHM$t#=Q@$!!lYDmWoL?zWC2;GRnA+5;eLSkL$IgJmQY3qjK7AC)m2-cqKSK zfZ`vp6a{WkF5uOBbAC7SmO*nj`GoRjt>~g`vJVd7@4Cees$+{d(jolV%f&@4L#Buf zTtj>bay86IM*+w0k>yR$#Qdk@JGf7#quAz|$uTlk)1{4<tIpL;v@|U;<w3eE68%iN zSv|uXkHU27qtzjlVxW3C7|fc74|SP`XlhMOjWqW?EX|3a^Kidl<+#wmit;AaX;(46 z+(Y*$^2?ccntQ+;CASO5dX}`gb@SS-CZB%O`7(Mr<`i>!zqUX+ch`i%2BS)ApKdW- zbvy-<FQxN}E7<A{-ZNH+NIPP;b`j;|4{1}B6CHl)2zaGmdH=(xZ-z9w5rx@VK}k6} zSonI2yC9Z|8<;M!$Zt>cCZ3s@BM=MALqWo}Xj-p&@E%aM3(N0@6jp`03O$h;)&<?$ z;pSbVW0(D64mrRo)enhhDf2mp>ByeYz2TF=pyzIA2u>)8wR@y=pY$Ze6*B##)XG)B zyIyl$Klgfs-x?vKC^rM1v`K4f@pQb0+_?EsP|&q1pkh4(P)R}U2d-~Cvx8i=AZC%z zt+3R|U4-9+ZPvO9Z%%5?-UWRy>M}Go!Jk=iiByT^3WGupgXK?5*9Gk}vLNT%_DRRx zB;+TfAnOvu{j_Z@s2i{Bjaw_Wl*8n$QX!;xx#@#27`qEH518hIu;yLUy=~BZ1T3#H z#}%;t2pfiUfLfndgk`WrZ!Yqnw`0g!5wko7qsvT7V|*DDyQHwDd}@kK_`A!BNbpPa zNKRU%IVXcZM-!zFeU)E+(`uPIwCVUq{>j%i>u1RCKY)s>uP$xE-~hC@C${+W7L)sp zWX>P){|p&-e>7W3^~A^l8o8Q*s>7c^%0+Tr>x~^#Q>|jpgmOy%TlnvBqEjq!7cQI^ z>oglhi&a>0(3P@mbFQN7K3q?9UBv-a@5h$3+Q=p})jUUA#fhe6*^LkOjCFAv)lD(W zlTB!ZeE|MU$=xvA1aHs`*-tYfyQU2%8LNHrnt&9OZ$g=%!nkbNPIV{zwG-bXHdIp- zUWDnfc?*bmkhE067Oj%y4{%F>-$gDo3z0{2pCns-np@+^lVo>z+(lSy&t&2>kk;vp zJ51YRt6aiLMXxEoTcN)l_Qg`)4W*{SONdzZqPSjYDozfiZwB!rY!6xJ4!*{(1E;cg zYxS3+y?&Pfzdp|BYFGO|D0i>>bO+JG&=XZQs9C5`tV8+JEZ}cpIUer}ZKdw)EIQ_} zS?YXsj;3G*R^E{1KT%3zxfBhunTl5v#fz0N4E?~VUeSQyF9S+7VXr2-)P9t>VnX;U z#e}W@rkqBCGPqh@Ld7{$?z;8o;Tc67r|qc_@HG8PvG`X?iA^wkZUtQJv$V%1X}-@l zAAcX3^KCMZW?Yx}5J*!zg^}^-9RtY`A?>Q6gV&epFOYdJ(88Xtx3S_JmWrJ?+YR?Y zqUOrTn1F9B**3`NjJ?WYW$RqW&0%yQ*}l<GKj*r2fx;EIu9}|%!vgw`vA1uMb5KCH z9JL<W3l?|wqjxhd5I}?bPqzr87O+*S!*?aF0xb)hFGJ9M<F%jdyt!87U4n9ff)d%- zWbo<^)oS{-BPUU(U)Zdzi-%PIcm~=Kc76!g5OpTJ32q0|WmCg;C<!TqshOE{@Q)xK z2W7PeOHPgd6cSOZoRDx(5ihAl;vYd-$aDkPAYOpRGEM%eUr6RhaEF<bAJ>B_c*_x@ z90fe===B)M9d_|=u$jI5c_`r|-7l3TqBpGPJoJoB+Nz{(4RA4FHJ36Md`wBCd_kk3 zf}2CqO*P{E9ZVU7nClX`nR0j9d~x#-Y+bbsYSt&t`~M%s@S<{ctLc(y)nb0V!yHeE zc*7VbX&$Lbutj3H&YS3g$zA%Bnm*-1)pLzeagmS_aOAheW-Bp4LiNyS2g;`x(@dH( zi*cL8+K5ols$`%&z<LrJ7NUNg!Y5O&x~o8qrNt5logWthtc#(R4eyYjZJ<!2b`*jd z8a;;itonX*hM*OnTxNL>kbPaAPK76YmfAc9g8gYyX(3I@gr9m~em7xE50qRaq6MaW zr3$S$BW@mJnSlt$u%qU6c>F7~$D#Az8dSD4!0xkvm0BBAPz=GQD@!;uIL1X3t?;@X zt_tL+iE)E@KuV&%J3}Z9kB2bq#0xoHRUDMlgjbrXy9;KpS{JN>K(g_|(CSkY<7t-u z_16S7BjLk>CbsZxbi<$rc6KN8_tT&kLP0XZbOsfCaF{|{)aD=wpDbpapCdCFw^ypv zR7$5}mTJgK#ShY)6)VHUca}pP_G!&Sdp(Ci3rt`_m48N*)a-@Rh(6z>H_^Dd`&3x7 zx@y9@ZWta&d4Ndu<mC>Q#(`8#_J-N?zep$Mqq_eNh=iiNikB=wLB*4%62+DG9xRHQ zL0Q`xmudJzgCW+>V6@U5+wE8Htqq^?2+l<M<K7%GVm^Q65$3xn#1J}!90Av)cCkTM zHBo2`<efJJA~|%eYI@gi)|?!ZeWFpCn;*F9Q;4yCJ1j2Rg(juHE8W};qqm4Pk3m+C zRJ9#ex0?^>jWs<{!x{2Km+qK@TcVuyaiK_zjHnAkxndZr)!eYy(kr3pQMs!(ivHuz z8R|1KhIN|Dps}7?ps?ECG5uxnX&{+u#V7<}njAdxJq5ue`nR1u<U%;FbcH8e@CH0( z9HnIL=mHwHT`k@%N=Y--A&W*DV(c&k(a?CD33v8`%*xBA1jNsn_-hbGqEl0d>Sw{q zZ#gqoDepqL7uHl_;EJ;9WXcuc$9E_5ASqlbI#6xy%~W5LY%rEk{uTx9bdwIhy`>AT z0Xf6c526!Hv1Epe^X_-SJxqv_Y?}5lY<UM9gD4Lo7y%*kKV=uc@>Z0f8{_2a`uris z1ww~^?#{puJc)*lvna^C?%6;oXYROC4FnB^iHyN85mt1ql17lv2qofaNI3SwG#D1o z2T(+Xxh;Kg+`B18u<OYDY}6i;iltg1&`yq42;`iJD2g~L+hrkahbQWZ`5p1Ftm62A zLw+ukUcyA1$zUIHYv|&!3UQA{=(<OvhpYuV8V~DG_@-&*5CE=VhId)g1+qwy@o>ff zErMSQ8E%%zmt0t!A0UnuP=c>+1Xe&!c2K-s&I~ficMcEA6{!?`)H4v-#4TF^LG`u5 zmtv`A&(J(f6z@SgY82B&7}?A$-*RV+mp|81C-9mWXMA-@`-zCIfTfW2H}~|-$0-@k z85a#J48Z-I?F+s;_l<>Hn<N_qmEv}IkF}mrEI&gXRC*6i0Xc*}Tbf%I2<4A-lXq&4 znLb^sOpBXnQM+x0B_0^BSO!^oLc%L4%pBy;yDSgE`jv|CFr*B^LS-?d_vRELZ1~Ep zAs(Z7YE_DO7iRF_2~-?YK62mV3$i4KxWXmOGgU^47IeT}*RfdSx%>=f`8l0-A)D>Y zU?o#w&d!=9nDa+4)Pn4u2kshQbHuh@%v2rQ09E)0pid%87BWu{X*9!8HRrN=BcU5N zks}urKBb;uZ%?G++hKDf=j#Q2iMScdrzZC50gD?maPYO%rX2A?NWi3^Oy=B)58mb% zk4Ddjhddr@25<OeB%4Cu1CAT`TyVQV5b@*?d;$955p>OPSn0U14z(wsgz@i<wMz4( zeF+x_;S~w)t0pI~sV|G+eY&xm?1t^vZ5>CdKzVwoi({4T=O$v5h7~G|!1<xl7Z*YL zutlJ&Ba1<k@|NaLuR8yeMZ4Fq)-6RoV_Re|JqA@?zNV}i?qhj?=JA6`hlMNX%P_z? zYb2Rgp;7%BUjXe9U1g`KH)`o+R*%xSA(H0xo!D53cFReKYowTJy=3yl&<^eu(gueq zElmZx#dh)RI6JFYD~_QD!}`HC$X0NkOBL-Tw_=f3oD`bPvam=0jpS6$iBl3qU1CVZ zarPYPjiFlY4mp1-ym<Wczfwc*W78+QqQJGWOeSQojcyb+o{yV0ie!FYK%52AG`5eD z)rzES^jRjeV=iTa0`q;JNVS+Wl|5JnQ`^vLI-!9%b`pD-D1LJz@l!r4XxWLFDTx^d zq2&r6@EJ;t<RH3%sNw70T*rA_-;yQ8<>p#K(jci0a-{;<Lyw7}aModH5AY{gL9cJg z{s?N6(4)++0>>_8%V8gXu<M(ajjI2PmJK7MjU(;DWrt}pIb=c9t2z8XKz<Kx9eg+X zM)sp#GOn0}&Csp8@zm6FaNBZDCMG)xK*C2!*G(Gd;bv{F7jDPqfM8QaYQi6NX9lbb zRCF-?HRUk32{R;wb{?{ASchWBK3>;GKCC%`HErZipesOxNuF7;NPk*MBvIlrooL!3 zOCZHAdN$w{7`ps7B%C^m<OOrS2WOCKO+13l{9kYk!Wyn_6lab%^`Cy@q${h?ytFJR zT$0D!%{RDHBuJ(iP{fLMCxY`z+<37tZe7|P`#CMM?ImkXCmBWk>~$B$+8qMZ6S|UF zN;C^nE+0==8tdH^Gb)yz%vaQ+z8qU&kSD6`FG)*^+v2_M!4Nvg(r1x2Di<pjnRs%G zclqu@OOvUWvC*t163LW0w5X*P3FbOrrJQN}d)?iIPS|I6)U2ewdFUsMcXx4ta@`(P zlGrAWWV#YSUtHZ1Qpd#D2m4Jv_e_N>J%SMxnIpp(6T*37oCj@Gh7F)xwItU~&;m%% zmQ3OfOw8)>CNX;@p!+FjMA#$V$CixPDy*es!~lx@a|o$q*PA@KAfspIx&dR9qY{?* z#NBN|&z{Xt5G7Zjq6@tP{JT*cBK2WN3T7V6vUTYQhBrylQP815|3&3=6Mw#NFTI={ z%Zr%zg(XKgF*}Br<HnCxgE`Vmo#>VzKt43JDG^JAyS{m731#&K>;8qMGJf@r$`Dq6 z&#DIThuQF2?&5lWXBYhWwY(H3d+EzcU)lOQ*2!Yv3S1c+$tIOR3aExpAlRjMM8#Ic z;@S!4(_sVH!j2NR#!z)451&4lJl(~~d4O$Tdw?shF7dB!)*q+yx}uJ8j@=k$fbAkS zIVP@Rg%8^~g6@Vj8uhS^3GF0VB5#G@3#E1tf+vhCYkIdaorC*OGhNB7>M8IHz*rkM z0H4Ksir`YneQ_V>_83AH+%53w@Q38VJ<`W2e2-3Ykz2kcPZ#xx)mVV*tX_Q@r<#KA zr?aQQe!9wqYV~jw?^c0O#r7cz6(W%?b)jp)fWkL(TYaufZx_FsS?|N5NDc-HX~Ax= zd>^c#@LouFfHk`fjQL_DS00{kx&=#pEbVP%w9=NVd9aV-Z2dL6xlxgVQ85`lBnd<2 z1N5a0tvfDn9Go~nwpJRJf<*v74LS#X*O1qQIIr0wzO5ekr^AC}`dd&k?R|LMoUCeg z+deRy5h`m?D2$Wx3pmxJWqo7r4-iAzY@C5ccgaG9toOhQS#LW8cHw&MQ%I?r1V6>+ zx{4Vze?)=GJsiZh+e1ma#AJpU78P#cn6aJK#x0*8NiQ+6#ffoQ>#kx(&2N}<7kU@% z=u(U00M|Ehz!h?@f75T(>BxWF#~cr%(}RB#E~=Rcul#fijGxMNCWEiKUnM3s#p6fZ zkTAxFh#+Gn*2q&sz#`1$e+v@G6&jnnX(*g&6e|dUFOCLmVVveqYo3ZPJqlN?7FG0U z=3v|=ad!_bkq&d;az|KNq05_uynzcUVQb{hs?kjF6@HW)Dv?%D@4``@>W3~X{Dw%e z`ZaM5cXrpVFf<^YL~BllG$TZVFgwVFRBNY(eXLVqiMWu8A*I+gcv<YBmYByfK=)3( z!0o_Raec=CJ}hHu1-@F;T7&S~hE9h<nnMR#&)7-wUbO9>tl7-wsKXFi{gRfe?R_^) z7JPDMW!bMiQbr)R$UK3ihH_nE6Wq52)-dGS(F9P><*#x3HwEC#^`NZ}Kyd?Qk$LGX z#YfIHauy%=#2Lcv6?Cv(<w*;*J!?AL6=`Govlx>kEFW??c!KsIpRcAz#LMs)sa(Vz z7K#V;C5*Q*z8$NzxBxdh=C3T99d5hz8?4-+cBtzm4Z$Sru2pzrg&?Pqa+7iMGt3Q_ z#iD4=LRvlo%(E1UJpATqD60;z{Guy`D-q7){7|bUCSFF!Asx`d5{GgaqA*qg3w6%` z*Ft%V8=Ax5tUx0+r`2qv)}$Z8dG0^o%)=Ezj$4<9WB5s$;}%f1zwTl5Rbk#qPdx7= zz$Zc4v;coE{5PJn7mQH+bqHI4Ph(pbkom{{ddG;gQbePbbTkn;)Em!{Y@Dz)-1^ZE zFm-FX>nc<X>Jk#BZV^jVl0G>!<y)JBly0$VIoTEhRh{25)L_D-A3wdH`*9a}7f&m; z^!K43n|l1-7O+CxAN&HplV&PP#0}RqT<48s{F$WEy!l~y#@2AD7O=Ep8Tpijed)1O zOiw6d^J~<~;+$%lsv}UgsX`Z<*ofovM(Z2$)K$vbCv0wt0imDaFs*+K(>Clrj5e%T zt5~1O|CN*yf;nP$1HxN1g1*grcZK9VtZ6eeM01v?!8ywG*BYE|=^)w7r}95za~_4I z=b)yiIK37&!g4e|*d*)V74>)z{L1}D(;KSKDI5^Tay`<C?Fi)0)bg*;cc%GNbxo}} zs6KU|CLD{jDAopOxgNRbHF(KOO3`>Fv4fgj6az@?7sZBvwbNh7^j+d}tf(H6hZEV2 zV)*a;5dR}Tgv*WwF3env4MjSAa+&F|$A4vmi14O4xb=Ei^9I-a49H0GEx%P7%SC@z zE;}2Rb?0T@tr2L>L%Je9;tNAji?F&2CX>#W;Z>%KjT|Hcu(blJwBi3Wg-hCuzZ2l- zSJ5n$LGt9Fc&l5Fi4HkSkg;>t07fYl)GS0+nLh_NYN0B9HlR+$knMy|!4bpqc>$j9 zmL?5A#poejL8nPeTpeQUtPen`n^>1ac|CEu$rl<R#vkIQgx23RnJ&eszCkI*iN8P* zap8R9vfnGxG6}vP2k&Q@<@vAhdl}Ft*^>^T<?n%aYasW7l#JCQp)e54j^&7GeAHYe zpS;NQ?rt!y8fQ_pcXLDWin?1A0oSux<bPo>s;sYu%ez9g`P<a$P1o}k_ptmr$fYN> z9pd*|;3~c8D$x=o%D`Gjw4|DBhnYP=_0Fp8j+2jER)h>6npIFVu&_OO6rIgR<5VC+ zOEh0w69_%3rHjp+6>D*c%h@C<7w;f%Y7RyAtoU|pe$1WLE-gjsFTDlJN6SB)&pmFg zy0F%;2IVCd{%qW<h^_f;aAQ`$@7k~6GI0%6R+-cR70Tt+l$Fund*cH;F8BU<QWAzI z4i1n9a^dx=2+R#@<IXu44U@i#Noo#B%ZEnxBO3AE^g4)_m?KQl;D(0-5nf{rNQbGQ z3eQu_E_m$Iwf$jN#;|W>%6*ldI5$T>)7S}{DxvRPPw^W{YN!#ec&iPV4}|tX$7S&$ zmVPIEu|_HC!t_R?6?|tz==iOu6KvH{&)ssC>_0quiDHjrdV7o8g#)@OvQF#b$uQQ6 zX>VNUMa6wPJySC=w8w1;Tgq(ZWSnL(J3wznqTR{jMfPQR?LV948={61m`<p<f`62y zGJ7U!N#J~}P@5oY-CI5oGiBXYTR-3`8{<%<hw)H!!OT8xbLs}bP#5G_=D8f@wCh<W zZ4o1VwaM;dxN6;U4ltH765SMr4lnVg)QCON#;ra(+Ow+nnsgQ}RB;jQioXG?WPbwX z4-5ljy|w()a0Z>h7sM5~5fP%eYfWEACdYDq6BA!Pjw`bW=SS<_gP2WI{s0^@U#IB~ zQ^SGlRONWk6a}GrIA&sRg&SFm({h|;*^r*l?H7x;b#i|qQC#P@(VW$R(SHzlyF6@( zQWQYQAXUL~x~(AS&U?h11Lj@OUN8K-`gMHCy11--D^m{2x;u$2x6&_NmbuVh#0FBi z-&Z}L#(i@Y)ZUciK!>A*`-4$Ho;y74e>l`Ht%H5LVBU6e;DTzf_v@tdaC?hj>w)7K zx$w#3*U9_z&#{aoycrTyF)k_qUpJY`<ZbHMVE`+YM33kV>CjP3G;x6zI%4vnO&6aC zQk5KX0+m>c@CzjLeF3NCXTN|hpLiJ3<i$@SWssmg&&-?n#ofMOq*hZExbKlnc`IRi zXY?Cv{uqTEbBPy_`zQDl$aa>f<u#)oN+aCj92uwW(hwDB;DC?ED)+zS*JV}z%Uorg z*)<Df?Q$V;vHXwO{Jb4E|Lk!cvz~>cgA-lg^apX-?`nvqm8cd}3_Q%y@g}pHmP*F0 zUe0wEQQcl#2`K79lraP{Sm{BT6dOxo4eqQBNE{SA#D1AiH&t>fOU1$0y=NKfB<#~q z)-03@m>r)2RbpTg?!6nF?k#QPZi)2&Ss5QD_HK9{HtrG+8NbV2{{Nc09M=upHBO(z zg#*1$@$nqsMJK8KsyRPCE1rC-n)de(``?99v+0?)*-`F4l%o4Wk#J!UB~{4&&;7$g ztY{_Wnpys!&&eSHbwD-9-0t(zS||un<azND;GPAqfy&LqWpUo?YdIa{1ta4q#>RWR zQmx^z|H(8zUmHE2$@Ws^%)pLO&vN0(#q>eII2(0cqd~D8?oFY%XGn3`%2}kQTglph zYJufc{ryVWVgw<qcCo}ZhMwx?5$M<@+J--6Fmmfxl?o=%ylEUB9FM#!?~S8SS3<^c zHDII}{ZD#vCp;Fn4C*J#)GVJyD14ivysYW5a34`~$syLe!NP`wQi4Zpz}#BY8!f?A z)!!>@K<D+j%5yX2Pq*fX)&_B$XsSU)LGYOaLvb_JcDFs8Iig;0U&iodGUBC(SmcBG zUuVwf+GycrrFMVvRE+#fY}pKRG8vh{rVWQqPklU{3{_H3(Nz>LyVr*vRhZ#w57x$F z#TPhFm*s9vPkBA_F*`N{AufyG#}`ct+qU(3I$`Hfeg?!;p<sSg?}bVIU_Z;(up56d zHh^_qP6==rBWlADB;gP|9Kxj|=DYB?1?>`$G+yBc{%>WLiQSlbaI<Q)krz7Hy;Gna z^Efo&<f)&YgEbdT_i9W7DqRDF_r>W<R}hRiTwQ>Fqp+0Oz7;AhsD)@%weEsVD%XvM z)xrz-R;(P0X4QdI*<+RatdUFRb8vVR<hBcUk~DhMC{QUvOD405>!HvX<TR86ne(r5 zAW>G<m6TqH%)`wrtKp_!+-4sD{V>prBxNhquTh6;>pzWxR<+zmGBe0km@wp(w46Xj zoICQL*O`VlDc^}aVcl8ibq$dX0lt<MSHs43Vg5I@1PHU^S^{K$dM-a=vc!Ckpr}AN zfUQm${t;%AWi{{vZ?<*vC#xqcR+J_%5~bRzp^^ymP@7Wq!XU=wMfu;W^E!hV1X*t< z#p)C-a|^0&T!t{+F6S5Z!0q%oCD6%*R%<JX9<`YEbBFs3#!uF!V0^T90G^))b88%c zlU6aqjN>*14#Shpq%wK)XiF|NSCbTKM{Hu5!Qg2O6a0%1Ksu_0j2cGJx$44C=<HaU zUw2FglLqa9$kl>2Qzsic0LME?_F|W5?b|NjN@kua53hrbTR{^<GLH;(*Puk5!mT#I zRMTuGb}7Xw=``Ps=ig%IlP$8)w+R01zqmStLET-UB3wh4f%_bM5fx&&GNmayAr{~| zSyME{2OFr{coO>VfEJpAFh&#&+<u`rq_Gt1*uB^DA`3(BUjLUIq%D}Hs^ULoaAt^B zT&VD)s9_Cz%n4bmaVE)SH{nQ<jM<3fM{qMvGU>JPf6U=|JGfE(!9E>_L<XYXcur)0 z6z`F>4}SU8-jNX-gDj9|v*(ywCKXf*mur!6C#l7csFOY$N_dW^v8KzRF^J`<b&%o$ zIwtER4)-%Z0O<&b)0ieB$U0})-VGCCxH*X5(RM}r`kG==_j1+yx9f&4;rMX!2XIe` z;fh~NYyJYk0e<!}AG{N1#G?CEa}VUtU_L2jHot~!zeV9~Dv7Y9-k4BF-WghfXix+3 z`nTi++`p6)9E|RpXh^vq&V}>Iwx>3D6CIqJ%+tch{}D0K<O}M?%I`8(`hQi=h&nM8 zzF1{(Hr;Ur*=O;fEavcQ)wfy-TZ8p>%W5^nZr|6JWg$7$WHilLsO=&!xr{Zjq)PsQ za`>Wy%<IG*1czZN8R^<T_wWGbG9X=423ja=W-~sfTBKVmWuek8Rd78{QsEV@lJSZw z-PInpmRO%17lO^#Foc1;h^oaLr*IUCDdzyk3sC4M-n|uI{dNMBXM-4vB9T6EK>Jq{ z;=0mvoO3X)G^lHXyKKH%C<+Vr#K;=s2AD91D+NRKW8w$>uoMFw9)T=BIJK8Jr&$vj z7%HL8Y-<S3==-L~U@kY2BGuU#$Wd_bN0$Dd_Rcl7sq>D*Y|>iw!^G5WO}nb{XiCGi z5$(7I;v<c<l^U^BgeHSRPTQ14G(~33SO`(_ekdKH6}T)lE|=7TW^tVhhXjHNfu43O z0g|#qn_!oi__T3?6B5UD9Q)vNdH?$#J205a#QOPs&4(zm<m32#pWpLn`@YxfsFZ() zQpiW!QU0Wqe~2C^3Dr=WZ?i?UyOL7KyDFgGA17Uxct6yB7f(2fC!-QcUSw2&w^9)c zCh&WOPP9S0h0uEH@R?ounb-R;bI8&b)fKMzd4!HJJ^qpo;Ru@I-(*kYDQG%UM}lU} zA0TIgy!WJ=ft({qxlw0(kdp#Tkk&Uuy^n-)J9)gS_Wp?mmm-sgx7?P%j^GT?>^Jy8 z<sY{NxP1ItaiY6PgsquX>peHs!b)XAk;rD)x!o)|4nc4fqyQh+oi5&9QXBHtWrpx@ z;c+A-pj;hI8;7IwpwWj<^JGgRC8-;PFL|)*-dPmxkW>|hW|Slx`qu(H#HfHw3D%qe zt3oz}G8fRIsI&(E4=#nUO<jR!o&8yr`gLjQfFm8EgJdaKnj)eOGuWnJ21_-*p>^Ss z0W%mdg8?%bFoOXz7%+nYGZ-*~0W%mdg9lZQ2Fzf<3{%-h17<K_21D*>$Q=#2qfx5- zKT4G#KDw(P2jx=j!MD2jbx&!MUK>e8NY<)C54$Q-EsSFD$D=S|T8|ru7mhQ};&4DW zU(Xk?#pOPNq;vhp+Vy(6${ag1v08I+yUeN>Y+6J4wGF=&t8q9gALzkDe2lmKtmcx4 zzWycf1wzn5al&#WDhzYb5_kJS-#n~LaPvu1_)aonXGg~N?i@z%Xy#@+;(5PMEP8Uz zUKl*czaGxn^G~MZi2-@G8S%&>sHGXMG43o#x|-El1GASG)&?wN<JqV}$gNyL6YtVz zv}hJx*a$C-u&pMAY=yF`_ZM2d#R^}7SVJ<A$!-I;ndx=x4~VDWrx>Md-lVaMq4@;f zGmr-~oaD`okP`uD6v$|V{Lh85yMk_)d!3(tq{GWMU)gP{WG-jEY8Z+gB)EL+Vwxxj z_Z>~TwX-*ZvuahST5A;g<uG>*wbVLepX4*KavVO7**mcg&k((naQPd+dCDa5Da-|p zD;qCZ*)P;Dh9(Xb*m`iglWkMTrt{>UHp+-cJoA?gQEs^#>=&REvs&qp`&i2CegN<D ze&AC19<x@jPn7Mkl@z+ps1wvZL7?z&^6bQW8n=b+kVU0p6j2PMm(i`<f_FDpJP2JN znTgbM^TP=Fo9?w?F~_{|Vo!^}v>dl+e)h@gBIRt%jS_@g6G(S<<!Hzu-%zYIjoKw{ zALT{+>5lGTvoE+}tvQVAotd2wFP|a1BBY87ATICY-|73gTv!jBJQKle?=@c9Fk%{M z6sE_VcmvZ(asm#n&-89JLeGU-RNXH>9pS!86s(}qLZ&~9+SM}TDp>mI-_wG^LP*Oh zm^>RGB34MJDi=S*EWJu5yQyt2AKQ&*%#YyNc;*%=;cAsZAICZRHr`R`&Z3*+$v!jY z#Xq#b<rCyETo|)kY$ZOi&i`CnFXa6LoG!rDdLF+C#}$q^tONFKjp>9|tA~nr&L_EL z^g2qUsrMwf2XLcztO+lB-|R_FE9MqM={(+qQXlfyVHk-m)$<m|5x06!d#(i<UIjLw zavfkvN390`l45C!Ggs(b_Ng2%ZaY%biWs|-7QCkQPV%ooZZ{v&$tPE=_&;fj+b%1@ z!OttOU^S+9t%9#&;>wS^N(^76GFJN3vMzPgaku^Cz$|w6#Eh4c@uk$`aN2M`w6>ZW zF{MLalxh7h@a>!$?mk`{cY0#5S_vb6bswU<_QP<K^*)2Fw+~-)D-<ir0`r1(Rc?|e znA%$=&txi9tc4lM@3wzED;Sru*Vll#Gj}M#4q!YvEUU$zAXL+gF{ZEk>WaR2xr;oJ z$cVAFPjCpkn!ckz78>bkL_RkWP|l4nt5`%k$NkaRARmiPM@%rTVSU%3Fn<nMOCE;3 zNK=?Th8>f~PSUCZXe@)d`jbq$O3-kd1^XMA@Rn;I(0L-kwT5jgEDx<e4Ba0IdeoCo zW8_8J(=nWJ-YJiAJ~-;EqaC=~dmdMJj4QYDx_cIoTM0w{A#h92&#(BLIBJ$Lu<I>N z33s*L<#9LcXYz5va4{l1mhd8>_yHNl;ST>RRrL6*)KY;mhMbL@owbQJ&J`@dC+{fM z2y=$mwn$K`j{9^do}@~<&OYLxNZQet5voW+m*3)_k|ZXW{~{*rSEl>xbaRB2nfAt> zsRHkzI9Z?ERA_D&y3>=v=evHtdS!}~$biL1-+(VKv#l{pa`*Y(uc1NO8|8mIZ44uK zlrQs`!W(c9KzR<;?+M2#zHlwOA6h<>O&4$7#*zlriJ!#ZQ>{36I`*v^D@yAw#oMWi z3HxmysQbuyX3#YBP*lIz%p7EY2N^g$5)q)gTIC_SI3w9z!|i4g5I}17**Q$!Ni}qX z6ZKZ+PoPNeaRr6@zgf8?Z8zb&80mnLH26FEm_Jx`zU`HA<n&Dq`gL*2#eo^-W2rtK zBjXQ2;Lr~xJAMOssP|G6!oTE^Ujiw`-=Y#dnYkG!{{-)+^Ci-j$U!xl)UGmDak=ps kbz;W?A<$Fw_&DBSig7(;*AvHgIogvjcmO~0KhV1G-w%e}B>(^b diff --git a/client/resources/hardnested_tables/bitflip_0_023_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_023_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..32c7adfd59bd1b0a0c6ab194de8ccb355f5708ff GIT binary patch literal 2080 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_023_states.bin.z b/client/resources/hardnested_tables/bitflip_0_023_states.bin.z deleted file mode 100644 index db4897a3507b07d0a76f2ac7b603911c19c2bb36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17592 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 CREK^5 diff --git a/client/resources/hardnested_tables/bitflip_0_025_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_025_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..e21a5ee9374aec68eaef5f2cb0a7cce6e3f82c17 GIT binary patch literal 13155 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 W;oF=g4Db7;dQ(_T=t@!k`u_nC*`cxk literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_025_states.bin.z b/client/resources/hardnested_tables/bitflip_0_025_states.bin.z deleted file mode 100644 index 339b9222f..000000000 --- a/client/resources/hardnested_tables/bitflip_0_025_states.bin.z +++ /dev/null @@ -1,49 +0,0 @@ -x밎-n  1WM9/điC$E߶=޿~{<۶pzᄒ̓߶o!v|m%ǿ~xsy967GCBG}?9K׏߶2??!?^/>Z=},??:,?scߧ響7>>俦i~????C:|}||{s^[^9;+K_*붭֓Ӷ;׊~?bjZm'??Ϻ?vRoVV'_B??矬r?i8w;cG;9o?ۣÿ{ {y~<<>?G误ח~ǻ篯;:]{~u{w[?!J~]k ?K鿆O߶?1{VoΣ~~{O׳m^O5ߨ߮???n%h_/cKC;;O1~|k~^[oڞ?}s'F0ml߲mbٶOHgj_+q?[!??\5z|{qݶ~B7GV\m :vr'y~%goy~yK_:|7υ-˟ozw^ΐj_?{/ſ=Kﯷ[?dO>XS_p#]ami_g?kOS?Km׭3y=2iO?z>z?[o?_?߶'vktOu<wnL?_G+޹?͍OJo'׎9 UO1>>9__𷍿)ſ&j_߮?צfû?c[n7mIK5,Ѷ_fm_s? -/_v?>8s{Fr?9c:Oo9Cy?3{Y_QԦ;?{?K!#[cП*PK=WOG٭cc[X{s꟯gS%KG?ǡw>SS//IC>Y~J?w -~m;_?k?/Yv/m;O]w{&O]-?۶G?}?GIet}_m_QvOO~o~~}~oGy]_ZO#>>oϢR[ _=RϜ륤?/j>߇ -sS-m{筿1ajֿ.iYt7/-Wu&#3Ko??;o=xti5?yէW؟=?_~?No[qgxP?#? Wy??cu?KgO?GϢGO:OS_cOOk<_ܷk}>U$R_!W~_tWV\j:u|z㟏υ?}o۹MN_}n׶[𯭿ܼ>Of/s?_þi3Y2??ۥ??U\'H'_2~rL/3/R_}??ӖcOe|/H_W2o'O忴OmѴt_{#'Ϫe g^-? ?__vHחz>82Vj—ֿ=?4|Hkſ4w>UzOq#=s?5ٔg69?i+s[#|??/_HW???z_?=z_gKJT]':+?ߙGA?_<iߏOwqCc\K?i<{9~m|.'/,yۑn=sУϿ[hGz_/#mcW?8U!??s [z=|:ם|}^<^ -vl_H'=KzÏߋskwy<=3W__~?ǟW__K?dOqpync?(Zo/_ߟ}OǺK??e_ ߺ76\s ^GӶő?Z{?-X^L:zϮGOdDmkSz?wg?'oFf̋G+6=O|Wï߶.?4CMs~X|O?9o??o# /KyU?1il|7~]/{?e?oY> 5zqܜt^^:ǫj=?~wvc.} O,$ז5|k/7/׾w?;;=?Oz2gj|?ϝo+ֿߚ'?f?m m?7_ >?z]7>|?Εw_5?7Ok#}𫭿km[v~:}[?~}q;:߮Cmt_uo`az_=_i߼cng9~R0x~??gK -?eߵj^5KjZ?w+{??|П~o-t7{8~R}w_б~:sK's_;??/?5o]Z>߶u˱POm___~ο6IӞ?]O쿈OO.[%'FڦυCkY;9J/_W?#g=_ٺ-?s?6n͵=翡MS -uHVYy?i'Ugߵz?+?/ٍcٶ#/\O+Y_%MwNQOO!}<g<?>Kr.W?6|u_'}~owi9|[U[]/_IGk֕?K|bx;/ߌ/pXǿrQ4MKORC۶6-=~KyN/f_ߓ'iJז|c^o?y%Ry_ϧ?gIϟh??xs/C:O։_+~'?ֱ8G'o[#-Uh?ƻbo}ُ#h]eU3?ͳ|RkZצ$,uV1cױ?Y?)t_GȿϿMiyGAw -go>mw~K<^ -?S_ -??b^E_?x/m{GK?}~GϏ?/qUg??MZJ?ݾ]Gyְl_o!???__|,?zmmџy~.x~gQceG#׿':!~Ea?|_[犟?쿜>_ܼ‡c8ԖoYs -zgz>?i9W/k?QJG~gk+No]`o_Ys1+G?CYaYo5l!_^q];K?w?z,%OWOzW[cٶۆO]?ޝǗCbHW?+d}zόkIvKG+6=×ʟz5|Y}9߂oi߭Zy^oO{f̿fu2]ߺeO?s?g[??9s[P?g7cycۮ|n/v~oS?ڮIݿm'Oߦݺ:mCNGv׮GooǶ_~s?uSD?n9g<|?SN~m!?=߭{y_5mo˼[ -?_~?/¿DciA[?;~^?qI?>sǗ[w^MIKoWKu/`}M6s__]϶xxzO뢤?<>N<~%)]W?ϿuM?ڟoGtdx??y]'_ -,|֯_n^{9S_?L`oPg+GqߺMB?4돬իJ?Yg,BWG7Ezo6_'GOghF[by$NS[TH?Y_jרoOOדd?=S{ܷk}>o_9|I?Bx5k2{߲/]m俿??׺o߂.?sO<>bg~?>K׿&>7Rk-_n^b{}Χ+ 3_)96O?_G͐goTs#_c+Ɨ^Gg>KƟ_si1_>dg+Gkn7M'_JWk>GOUgݿ??7#_7cck_[K~]}9W__̓Rwg)xƗJ߲^)>sxcןt_=?gW_^6y/?n_?џ49O/eHRl?_cy?{o59Ou_W3G?/+O5׉h[ik_c;<>79~RC?~~U??>WV?9ygyߴ=7O.<?߲5֟gk=ڟc/m/?O??O?Rz|{qݶ~Q_w|-i|̅w׏o[W~Op9SFumSM1|x3~}qj[m'G?s?|ۖZo7g?qNl\wcߧo[?g~zek/{?Տ8g|Vf+,4+-lĿmO_39y|ܘ~[ml='Ws!^O?&fo?zz m{_—|sz,??~ u5C\s WK|uOϟtS~CX9C?)u|~n~9^K4EJmmI_ -_tE#-1&?K:3/]m :϶#JfZ6\Ϧsů/)el%ϯWXccK?f?wmZOz[Ϻ?2/\6/Ku>{i?*_'ο^4kd^V9K~׮?_[3~~||_i:ѿ^VKKcn^ZRQ?Gxfj~DzW?3U׵׿uM?>^_;kҨuW?o/q~u:x\^~2/5EcAנXYJu -'?ϞC _g͒9Rc#_go]u1;3]H?? 5W9?l¾~+=CQ%3/ok?MD_w}Oc>^mbٶ#??CXCk[:3:X\Caww?7??o ???|x>sIׄ/?[?;R[׬q[9C篱9[a.gs#ioOO3e3_7gGێPv϶GOo^RZ_%5G?i -rpwWC<ޭx|wW'%wo?=_kC ];[]<$>r s.x痊?uߙ/tװ_oFǟ{}-/}?ד?-IO |9ꌿ~*rSZ'sR6RT_*>w۶I]?{miy04[a[ngk?Rۿ'??VsYWZ]' >"sW'ο?qO?6_k]U ??q^aO#5>cUyW;#~f_ ~??G%??s?2?|o?~?{-ەS?R??|Z󏮅$? op}^/}GFRxs{ֿ>Q&kߺ|6]?U߲9zjۿ'|߱4V_+q?OOC/+:n|o[8?>߹Qcevt'z~E~?ïs_I}/n^ZCm\1W<_-N^7_ǜn^~e_c~(ix;Ϳuek~iCwe}\?JO5?V[?j?W\i4mO~@9y=S~Hmbϒ''^ms+-lĿm'vktӮ^N[?K!o+~R׾Ko=gFWG;E_O?Oz^J?~.K?RkW߾_nǺm? {{'/=VGz?Yn?cF#ג2;Uߎ?nƗ/˿mto_U:=z}o?!F;[q=3;y׭_Ϳ6IӞ_O{ g?[a[YϮOb_/? /?٬g _>xRwOO?Mύ[c&GO?[K {rm[ Ƕ_ϭ?_?OK%;_7'?wo~x?C}K_8_ʗ|:v>1א^~w_*35vLOïS??[m|w4>,3*ߟǿ^iݥ?8x  f?ϻߎW6G}|}:7E? Я<?[eϩz|9KI_|>~/wZW-/)eۤ[c?լi]kӖon^ZޯLG!ױg؟#u.?vz#9I$ k¿9gO?{z4msY߷[ 8GmOY4H&+J_ϫٟ:??S?E7?_uP[TH?/ש'zxu?okK|IX9|I?Bx5k2{_uչu?o 9ο'?13_ ߶sHm_[y}8_ -_ w?t}f߳Oe?K׹NCOܿd_gd_>/~~-.8s=_οe<7Owiږi>GOUgݿ??7#_7cck_[K~]}/|Yqe<//{i:K<׊i||-_?G{>j~O׿)όmsiW_{g}Gϋk-_?CYy?{?ߕ>?ױ9Ou_W3G?y_G[?Ӿ]gV㾇&xƿs\O_YJ#z寯s8Go_g/43_^G%q?C??oD/zu;6}vx~zOz>Kח_U?הoy+{~kgeRR'׿>*w=?S6޿:jQa~~ _U/ۿ?vau_~=??>CQuol?;4mο#9?~,K}-Z߱t?]7?/;'n⟥#o;W?͋Oj=ߌ/ױ:W]m|{?<9_ÿm]h‡_qjw7?sï߲,:şGw?_,_+~7c1o_w?E.o]C߲}j5⼹9/鼼tW-Ֆ'6#{'5)y9Su\>koAY^I-k_n^Zs}]>?_ww^{~e;4f_W5GO٭3nXoW_>o(:|5~y8>?o|~+qjejon&KF?_W[sX?w.?umO~׿wxuֿ]7R7oGF0b{ԿҮy|oiKwrwa^4/~kY?jTh?kkjǗԶ~oW[N;GH??>?[uop|s{?<6́/_K]c}uO̿v'GCG^~Zkߺ'e5}~u?mmc믽|?CXCk޿.m=3]???Ko=9}/Oߍ?M} ?8w?s72<_6#~Gzu[:?l?&}k?9?{??Cꐬ.H+OwώkV?_mFg7%_:g^S-WD9J?G;v?Bϗyx|\$]\?]~~mʏ;{ϿO_?oߦr_կ? -9._ר+o1xw>+=^ -?Ŀ_Z^7>3-?i|Ɵ_o;2mm[-{_Vt?ӿ='OL-o߈bbKjK?=OOg7?ю0?_uΟѿWNNc?q?'O߶?GW[W;O'[kфw05[_RG8N9<f~Wg~ߵMIY:cxcRIϑwӖG?/:/?ϦߺO{?ouE |^!{y~<<>1w?>~<~)-9_>Oo5~z9~ӏ6'__8sZ~|[-F}abٶ>k[bgg1C???^X~џw7u}/<?\xw??w~GOtCr>37 ?9} -/<yispS-߲X??}|?sJ_ׂ1?K_qKϴW<ߺc2Oi4gcW`+[}2k~cWC濼⺶Mw^?mJO]#Y?K?x͍m ?Oz;mL/χľVK-W_._)++׏~!?a?>{(}oxWm/Hj_}g ~Cmk?;39&N7|}⦅ZRj?mI^e?_KV;Cv_SFo.Ǐ_뿥~UYotߊ]^/]6'O{?v׶$kß1omg??7~_Z'g2gKߙ? >??6?7b7?o%CW?/_o<^o/%[k??Rn7?k?S|=?-_ߜ??߭=?O/I*_)'S!Soze>Ϸ?_C{޿7=ly|[3? Om|?o߶?wsф?BO/kόbZƿn{ߎw~35<~~;ߏ_^?$B^o_?r|\/%U9i|P>S+߅j_ǿm?o_ WuM[yi?x3_a_JC??'O;/ _fY>AQugKro/?s?Fq?_gӼ#=;TOS)>_?gL??ƿFCGoR#On_?Zxjp\~~mkѿ~O;wUiuWxzCo;4dwԿ-_n^RpRk߹󑓟cogVX>俦ז?K^aÑ>x)'9Oiş -qKvz#3Ow3S^Zc<|j7z_?_YS7csOxCAԽs_|Iy}\u/Pmץy:Ϛ_ ѿ{eǻ_?G}m?ocI꿶Wg]K߼7=v<~?)rY? E[_nS?_u]1k36c)߿<צ$,u -'?Z_\gK#>6_-?_>ߩu?+_Mu?}߽>C/x)xOy|c\_ -??b^E_?x/m{GK?}~GϏ?~UmoUο箿<~kؿ?|sZ?ms?uOOCsW>tgy=ݶ{]߶p OqO~?~<]?3Gݨ12ߑ_\M>ïs_N}/n^ZCm\1w|jy,9x=G3=s_g~4}xe%RtW\3.mS/?q?!J__???L/ץiO;ǟRhyy=S~Hmbϒ''^ms+-lĿm'vktӮ^N[?K!o+~R׾Ko=gFWG;Eu^x}%WÿCk+$w>~}/}@6_Gk֟돮%}M-oq~bz¯ݿ>[zr?>2?¯6rϟ%~$yIWsƏ_*_ÿ4fEz'@ӗ?^a[>}Wcg׵dϳkmPgxګkuWß%g'fOM W_g<o(׆u^ǹ -7RRy{>w1~_O -z!o<kk5Fϑw_3F:.^lI_-9ʿy/j׎"#5_]Ͽ/?q{usx6̫?^Zצ$,u -'?Z_\gK#>6_-?ŋП#_?ok8ẃ{?)ǟ?A7w*_3O??Lvmkߺ'g5uҿV9jۿ?u[If_ۖqTm+ο_[yII}!\NEv&GߙΟ/׳v'_пk;l?(#_ -_8/V$o<~u???ۥ?lGXzTo$#PIi?]Ht,_׍Y_mBg7UX_iR'oӮ/??nI -nT[w/R)Ï]m+~>sLJZ0y967GCBG}?9K׏ܾ!~5j2~VeG㟏xGis_/<ϟ?i↑_ϡ)Go_?mk?'mǜW~|Nƿʟ~!m+_ο6?vO忴_c#_t#'Ϫ]'C߶O'O?8?!|%N>w_OW{y~<<^YG_LwkuOna+?Rw_C<,?#[?[ϳ?YO9Ru?_{?ۖwfy-m3g??-sn#Y{oտi{nٟä]Ӧ;ןgO?#qqg#m'?s??)wϿk/ ?!m pZ?s-o۹џ -jk-?m;q?.m|y]:CwW/o?h?)>;cO??-}t}3g?ǦCw?Oa.+^(\_?mpoͲWYiƯW[cٶƟ?g?r<>޹1<w_;zO{47C?+ٿ4_;L͊'83^sW=} 6Rw ~_na? {{'/=Gz׿v+LCGsOs?9o?msYcf?v?FS?RW$,w?cc';?o%CSП7B-5Q^?fmb5[SͩOSJw/joN?rqߧOOp ?$/g)Ͽ)u|=|2c_!ds_Tϛgj<>uݭ_ç6>u~o9h'}}YgFU??-O~oK|q~w?ǯvi?mkuo??Ko_/y𷂿ʟSJ9>sǿ4>|)_OįZ_RIyϿRYҺ-eܼ_יCacϰ?G/???]mGsIׄ/3sW^a Oi:οo9q_[9C_8aП/^i^LW'֩ƿWG/ͳ?u?o?v_#ws?#WN'_7_fS??_O|^sߦ¯ݿ?W-Is~j_e|Ck?;^Zs9./sO<>bg~?>m79}_or#p>5׿vֿ͐goTs#17lH=}{_2O[]>qlƗz#p?#]? _wyo?^?-G}~'??Ϻ?2oFn:s/{4 C-Km#]_H׳ZXy_ -_ZL?t?y W[=Ǚ׿6|̝gSaǟ?Ӯo]i׎"ZCi#_-?V jV1/+}RcusT?<&g?=O俎.?}?Ϻ ?߭}s/M#쳔~oG<S__o[qC#>>oϢ_ig̿K_?V'?/m^?\?_w?mzx){" |/?ګv/υ)篯W>?>?_O}U{__m=/?h?)?u?VԢgkz뫶_?.{}}&|sw.3!yiO?Gr~X?kgG[Ŀcy3k?o?v_wOO?KGjw=$O5!{_#3/c?u$+>?x>r%?\ Є6c?o?_ǿeYu?4|οX.UVo寓cu2]ߺeo3kyss_yy;Z-~OmFKOj/SrBue}߂?糼_[𭭿ܼ_6}<I[?ʜ7J% ?wi/6￯Xk[g/߶|Pu5kq|*w=8W/6L>s߯8<yïZ>~o]ٵuoc۶=naooǷӉk?^a??S]:Iüi_߳/і)ǟ!~^{y//}?g7wmk߮cw|C9?ok{IK/ylk?O_ϻ~A .?/̙O<K?;u?OkjV?k/_{Cm?/V?׶}]:'O{?wwg?"??o ???z#s^Ο<*k>~L}qe?oex>(UlF]gtgج3~M6:s?6O?+!Yf]VVGg7g#'nKڿts??[{gs59Gv??=/G1.I˹~ʻ_?וw^;韜k2MnWm_t s]<~%;?Q[WZ.s;c|Vz~* 3ýbso|E=gZ~߷6/?IweoZy/e3;忬C9{ ~O7?+_[߾_{[/-Kz~#'>.Ϣo'=a<8-?Y'ei<X'-c'OmWȯvVO?? ヒa?kg?qt ߗW~Wsx6Hk7ׯ?_tבZ?_\gK#>6_-?_>ߩu?+_Mu?}߽>C/x)xOy|c|#O)xSx=[_s}}ok.s>mO -??\p>WM6k}*[w>w=s[m|Ck۟+c'??.}?Io_xGQ>F\bן}go~m+~r^~ys -kS[e)~~>Ɵ:hO+l_t?Gc~(ix;Ϳuek~iCwe}䯿? W:;"gge>yum6.H9GGo?_=m_qo)g#m>_vߗzwں7_}#_[]?3?R'?W-/=_W?^o?+>_*_j?צf[ m][kKyU?1g+w_C?8Qor?9c[;o79CSߌKo?|Okz'wm'O?zw?;[sDzs_J>_ASov7ϭi]ԵOS߆_3G?N<g]LJO9¿C迆;>-<?[mO?g.o)x|xj~ -%珥mԏ{w]|_{?%ρ__oyz6'/]/1C?6S׳]}ot_??c<?i%\zZ;9~Rtv]O׫?^v7m?�!k{?M߮[[?;$ ???w?+|էq[~}yOm|m@3/q]9C9ct?6? Ҭ?W*d -{}^L}?GϢGo=r:OoR#Of7^]??_OO_sߦ¯ݿ?}m[% -𯍯?:tů{_Z~ \jV<>_ [Ow?8?\gCߧ/]Hm_[y}8_)%ϐ?6CZ.C]'Suj|5_gz?%>/~~-.;s=_οe<7Ow)_O?Vu.?,dߌ?u_? m/iwZ0W?̿_w1OKKߝGw>__;*{8ϑ_ol?3o_U^|]{[#|??/G_N4?뿘U#Hv<z şӖva!?nuֿEk?[]_9yLo?R??_'mcAoon_I]U(ϟ_[{?kM_?}?_somV߶venX/m??sN?}k_Y???`c?G?K?)wϿkG} ߶p1~<]?s:vma?_[>m߶sL>זϷO=;K_gU7eO͜RٶǹV{𫍗_o?}|̝xQo[ak~s߿ߜW>}:{rM:Y~?]kWnPݿHW?YedҌ_m?_y|scyo -v?]WinW{?ivO1}}O -_{%Oc5|j{uts\-}sבR?=ONc}@a~/߶u6ߺ {,}o3)'j+ _דǘmC[.ҟ\to/y?Vʿ:Oď+՛ir=^×ƿʗ??Ӗ? uh^a[>/gkn$_md6>>Ӿ?k?#ϓm?]Ys/ccۿR WkO?ע;׻zЯ_z[Я/}|_]_|n}ϔRu|!霚GzMRZ//?돹yi?JG7y1?_=?gW_^6y/?K_IԦu׿Ǒ~^?sz? TϿ_cg)ב)o?{37K<K~Ou.uv#O#?/d_6ײ Oyj÷s Gm9~/6;&?]xi˫ןgOcm}o_׫+_n^bySsk?o-?[OJדv'__=Ͽ;lH?Fo"_ -_8?o-~,??oCc?y??I?8uo;C??o?v_cy_WJGjMKY~+OO_~oXߙ] xu]xW9|5vlw!x{Wۖn61^sϝc_*gܶ__~~~7:_OC[(%?-3R' wOj˿J_oK]JORC뇟?_?zo'uJcoo=FۺgeHo<?zVoYͱf_i_v/'__?矬;?8?"v??v߇VVO/Jz}'>uwN[\U[K_?_<_]%_߳MsTh?kkjǗԶ~oW[N;GH??�>i?^ǒ/ߪU]{y?sw\w?yK#Ͻm[9gGϏ_OulVmb?|?Zqg3߶C??__|,?zmm˿o[?>Fo۹џ -}Nfor ?%} -/<yisp_|jy,9x=G3=s_gߺBz՗sJ)_Jw_z~}4J9vs(g?YaYo5l!_^q];K?w?O]#Y?K?x͍m ?Oz;mL/χľVK-W_._)++׏~!?a?>{(}oxWm/Hj_}g ~Cmk?;39&N7|}⦅ZRj?mI^e?_KV;Cv_SFo.Ǐ_뿥~UYotߊ]^/]6'O{?v׶$kß1omg??7~_Z'g2gKߙ? >??6?7b7?o%CW?/_o<^o/%[k??Rn7?k?S|=?-_ߜ??߭=?O/I*_)'S!Soze>Ϸ?_C{޿7=ly|[3? Om|?o߶?wsф?BO/kόbZƿn{ߎw~35<~~;ߏ_^?$B^o_?r|\/%U9i|P>S+߅j_ǿm?o_ WuM[yi?x3_a_JC??'O;/ _fY>AQugKro/?s?Fq?_gӼ#=;TOS)>_?gL??ƿFCGoR#On_?ZEM_?/_?.Z$a% -𯍯?:׮xw׵WZWsש]/'_;˟x?|~.3!|or*s#߂m%G|j7+ 3ߝM!?-.?\:G?qco|ٞ{Sοd5ן||ؾύ/#G~F:d+?b-~j[O?Vu.?,dߌ?u_? m/iwZڶGgW!,@ -^+{3km7^;?]ΦW?3I]ߺӦw?/ECcavGZ\Ae_Ֆb!?c:_WJM_G?[]_9yLo?R??zo]CO~t%u?[[_GIks5?g)f?ϻߎwyo߶՟G}|}:7E??Ϙyo3?οa#O?_?<׹~R>gE?,]_K~<W^ _S__|f|\?JJ\|>9Lxz_!Rs?sE~5|IWmԿ*?os?]Y_-GM\gC?58./#i*gזv?ƿ$%؟l[ף{?[#I_Mk4/C?35Gg^_'?H_Ww|~|K~ w CmO_Ozߜ ?oi߭|]:ϫiߌO_'gǼe/?u?g朿8w>^W[_ی_OO]׵?sZgy%[[yi׿um!y?y9o|SK~|Ә_?m_?gϸ7ci_?m_}j?נTzqͿ_m,}:ο_qx|> _m}^ckߺkm{(?Î_YvK߼o׎"{�?ףQJuϿ/Ku?%yg!?_R-S?;C!/V__~oSɿϿ]o=;#O# {ms׵6cϽ—;^7~<-w]_?3y\y~viT֦_/?_>cmztO?bEv-G ?y|7U$6}.w_zޙ\|P~ٌRy;=o9Ygwumu???8 mҟ?VCʻ4#`I?I߭R/?;׋YQn϶GOzO_3+kڿs׏/{<_c<q]tswC+?~w=?9eOCW*~yJww?_C]ws?x)Tf|i{?zϴto_m_߶o<_fv?wY6Lro?1KlWǿ}#_[//ϛGO_?}>]E<OzD;k9x3q[9N˦/G^9;yO?8?['O?_m_??ҟ?oF1}Ìxo}K~G^/˯:_m??_o_?6%g#?׿I7o':?_?G}m?O[?R?|SV???'m?{}s_RGFRzhп6+I;~iv??\}>O?~~|M[|˯?kmoU}{>g>Z#׶?Wo=c[O??\zcOGדmwm ǿ׏$s>?|ߍ+?Ů?+ -Xa3??Wa)>צυqOͧSc|?1'u?ОN߇Wپ*^ :P/?J;/=?>^[]w?Ҝ/o_^a?JtwlEϪ:Cg}_m'7my]s)?w}f+,z67R϶G6|lǿF?/uo3=d?F[m-]'֣f'^O[_z'\?CDUO1>>9__𷍿t#ſ1?X9~R߳k?K鿪|'iC{hk:3ֿ~g?-/Y#o_n|9OGK?J?Uףg?3Ngÿu3]+wzǾuk?{Pg~G^_ S_u/?$ߌ?'C'k??/gȿ$#?mҟ\Կ|qx꿔o'QH7߰lQzoNSWU[s8>=ާj~Jc%|~ȧ?O)|N_m? %˟{ww?Smn}4>eH~?ϱG?i?m?3߮iy}|;]Ϗo?~5O__K?Xid_{ccY_ zϣ?}]VWsT<AOw>%~__M:}{7F3_v7m/?楥9b)_o[?o?2ϟ?O򿠿&;yg6Ͽ -yKG=u-}5οpp?ߖO?gR?Yg,N45?:il#3cY#[UO:uK4C?2o,i-zusK_WÿCE6?9>}Wÿ&_rO<W5^ҐI_S_[yII}3GN~YaK_[C[.ybG~Bk_O?%Ҳk_+/Ez'\~?OٿRgaziחuk믾߈bc?ַdϳ5g;:[+g'fO??a<'׆S*zW%q5οC]O -z!o<kk5F!kmw)5kĿo{'^_VUw[s/߼{_?ܿe&wo}OL^~w?L'ק~?7ׯ?_tב)o?ks/OoOu.۔]??׉`aA6y+O?۶=|_瞿4~?9;οs)O)xSx=[_s}}ok.s>mO -???SWMWǷ_U߲S:^}abٶ>k[bgg1C???^X~џw7u}/<?\xw??w~GOtCr>37 ?9} -/<yispS-߲X??}|?sJ_ׂ1?K_qKϴW<ߺc2Oi4gcW`+[}2k~cWC濼⺶Mw^?mJO]#Y?K?x͍m ?Oz;mL/χľVK-W_._)++ye˗X>Ԯ_ ׆˯>~l?9eW??[׾Kο_[R׮?G#5忶e]'[<^ -vtn{_Z/_Lg -=%_?NK ~-뽿~[O_SC3xo71l__ٟe_?7Cmo|5k~^ ߖe~?5/_}1񌿡_>?׹z*xWKJ~]J?)9ӯ?_Q?G}m?ocx _'}W_*歿{_;}????i֟w>׿Ǒ~u?1S<0xk7ׯ?_tב)o?ks/OoOu.۔]??ċ/C~kmߏrO7~<>2WOW>ߌcIek?93᷍T>KZzkmbٶ?"׹n'Cm[uS뷭^:m%'=Cqb9 C]~g:2ޛ_Ac{}E~~{\\_~ܿ~Gg+m[ş?n?S??,omiYcR4B'It!}z_7gG~Qv϶ OWmcJSEOTϿOv'?+OO=Hj \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_0_027_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_027_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..7b51fd6b164ffc0f88bfd552eb8e808ed6b3a12c GIT binary patch literal 2632 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_027_states.bin.z b/client/resources/hardnested_tables/bitflip_0_027_states.bin.z deleted file mode 100644 index 365da68043858e5bd86c62bc84e4d8ce53db0307..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21994 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 UrVOnA{~B29Qux!pQ(tfX-)Hx=XaE2J diff --git a/client/resources/hardnested_tables/bitflip_0_029_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_029_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b5555669281a061aa00ffa30d77d5ec7ef037a8f GIT binary patch literal 2402 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_029_states.bin.z b/client/resources/hardnested_tables/bitflip_0_029_states.bin.z deleted file mode 100644 index 32da125713e82d04dc723b5b245be466a44a315e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18850 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 EH_6grZvX%Q diff --git a/client/resources/hardnested_tables/bitflip_0_02b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_02b_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..f22242565473c84eec370af5c14a69f582997692 GIT binary patch literal 1408 zcmV-`1%LWNT4*^jL0KkKSvLX@1^^4efB*ZFxw`>9)g1*D0nh;u0T_YN0TDqF5EtPP z6;J?G%vs<HUjP6A000000000EXwjjj5DhRUngGaXVgS*I(7_o1Iip5~m_RhZnrH(d zp@;)UBSQpa0OpMv8ess_0%@QOhK3*w7>x`OkOP`DXlaB4ObModG8!0wG-5O`MnDc| z(V?ag4KOB}0LW-!0MUrh!5IJwN=TCtQ}k+^MD*0mQ%y7mO+7%!WNkniWc56g!B4B} zfU10$g;(TK6ADrO>Qylj>K?L}6;i^OP8h6xux2xZCN392_(Yv6hEYBgd+eXQJ`u$3 zWz+8uy1Gx1l)5oK1G&S%Wj_h%U$kQBf0^?hr)OdH9hVmj$(Ii$a5Bne>0B-t$>NVA zGWC<D71Po$GahDtDUWQ-voj>{KSAbk;+GB&6DNt&vaIy8`xj3`()O6VVo&DB)I^~4 zr=d@PA7x*G9gd2^W7sG3jsekK%fUETfj`)?#xcTvQQ#+KbRV%{W(;LzgDjZDdIK!{ zV~Lj)#g64Y!m!1a(8`aA;^I8Pl*Gx|TomGDtYd?R0x-aFJ;9O0$CCKh(7tr^pX$8N z6+MJ`C$yO|VRT}7rd918<LYDbos-a6GO}30_6g*#Bi~oR;Ptro6!AVamK;_bRoxfN z_MR_|)2FDHa#)ANKJ)xfwm&=GUzyWAhnmNdxM2HFh4LSv^S@d8Pj#Luc^NW&m0U-p z%FdtG`;I>Q>34V&&|St{P8=D<oEi5DU%*oPWrAWcOA@XnOr?xvm4%gsz`gYQrc&uK zz_2bEWsI1vhB%mvR!mHonK3e0GE*5DdJ~E;$Z)cb=vZ**;GKlarG?#0Q;QXhaLb`P zqW9CdpBlK5!ILL((zvcCNr?X=)_f(|WtLdODtB2+ix(J-W!%BXlaIbxaOqv01B;8J zqo)|@ofjGUT{!6SGG3ztqZ2N{*!dlXVsU3=;g<$>ab{Nz8BDH|r%KFp^f<W6=wxuR zU5<kASa3MFmKeMqr+0w#8QgqH-NAU7coFG4IIl>>c|9!8pmZm8S7R&8!u?C9%D!g~ z!vDj%d=5DI8FpQsv&kOE2c_&>U6+BA>>b?)L-nk89o!Bp>^uvFg!@XR_nb-6{t<^2 z*cMC8e5=6yXJpCXoGuKq%Ab*N;&xc+c^$_?(&LHbR}L<h8N}dm<aat=YtXnmvhn|} zFVyf~iF~WUf5Y89N8mBpdt=S*i`y3*NBpmx{fDq#qxL#qsp(FhW7M$qnR=O6og7TK z;;(p|W8Qn`M0=;USAzAKdmoL$xsU#Hi{@v7x=*EfA@sgg^B+L{wE5p?<H`7y>@PG} z#|Ci8V<LMND!pXl;=2sPEV?cl`z<(jbe~H3*JBT%;JRh+94`Ulc)OjJJ1m)TaboCa z89FgLF~=Mo9Ak{>!0#zReOM6_>rGi;NUQURmQ@&wAh>B#rCLoXL12ApEAax#CKD1c zSYa}YDTKyVjIx#{CQP!KmKln|$io;ixU#MoCuF2uEKp+l^RjjsFl8x>Q;UunV#(P` zr%MIW4w$nnm@$!zuwrIbOl6E`P8Ui^ag3>Cs>)Xh(y??EOQ23Ez??FvWVjf_;Z7K; zrbCN3Sh%>3DT>Au6^xEI6-=2~97htIiF9R$2{=Yj%CM}cWXV;Lk%@y8Vyi6^CPob^ ztkGE1rbb3411z$_##O5;QI%E}Rc1tGk(jKo#zbY6Wn@^zEU^nLs$&^tQpRHmmQ-d* z46-I!L78QgV=0)bW*EvwVP*)!1!hvl46qnvvcocwjH5E9VzA0qGO3s{!e&NbEHDcX O{}*yaI8cx`0uTmV1eR3* literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_02b_states.bin.z b/client/resources/hardnested_tables/bitflip_0_02b_states.bin.z deleted file mode 100644 index 3cb26a7eec4b823aa3f3e1fc9f6199cf38d41b86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9230 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 diff --git a/client/resources/hardnested_tables/bitflip_0_02d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_02d_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..54170b83b35031af02b477d6a26d694d3528b39f GIT binary patch literal 3826 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 aF7s=|nY_g2^WPuc@(tWNa`m&RWB&_8CrQ5m literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_02d_states.bin.z b/client/resources/hardnested_tables/bitflip_0_02d_states.bin.z deleted file mode 100644 index 84db51d15eb194922e305090978ca5c7a6d6a9c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27896 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 benT~Q3GGwea4?U30ZUhcqwS|3e(iq%XD%nn diff --git a/client/resources/hardnested_tables/bitflip_0_02f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_02f_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..e20b10f3d944a193fa743956d646b035b01a5634 GIT binary patch literal 1660 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_02f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_02f_states.bin.z deleted file mode 100644 index 8858e63b4726e50df0f2174cffd24e27fcf6f17d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14181 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 Yb|Ru<oS)*?Fr42y3%8ct|6KTg0VBX8u>b%7 diff --git a/client/resources/hardnested_tables/bitflip_0_030_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_030_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..8042c6366ab8fb138f7e7da09b1b16042e104a6e GIT binary patch literal 1119 zcmV-l1fcsuT4*^jL0KkKSzSS^!2)6X?m^kz!~g&wL4W`Nfq(!400`g)-h5D1QdFTR zN(mqo0Ae)LMuh+vjWp4rKn5dCG-yx(h|^6P38^YgKr{?MQc^;mqYz}rzxqldk0P3= zQ&d%;7KJj9Mij!DO2JeHg)}LUriC#?ybO?XRunb}Sf;47ttwyWjUcpBM0AVnk5qb^ zuQXm!k-ku-gs1*W$diOg>_U|ER3x~R2)c?$YN}FN1gu0N)KzGrmmx(hR1rA}DR@Ff zI6;aPEU2*tAjC>d3TY~XN=rhTDy*oqAuxjyCL)D>1x8S03sp>_%8W5hBO*+sRWc-0 z<rGa70ZbG7>D5JDB!U=&^ocT}#2Ha)Mp87WWhiP!C1hG4tb+<_460c{?4tNZ;+0+y zi}w#<!VakzRfSnVVOFTC!K%k&qE|ywQo|HwTA=PFl?GH;OQer=Uj)3V+)Kh!!jQb8 zSQ5PyQ9M+XmkO*vG^R?bWic&8$}p=+Xe+X!>_OD0MM3xp<fa@+C!!%A6)H~TLOg;e zYSNiTRZ*g=RSX)6SY=dLXlS%FFwoG^Sfa|6qA7?n3rcBC1z||JN|A&e3S|YO8lu!% z85WYXI-))FkODXgRIh~;Oaw(`MH3}NSwyHfry`14LKOMbB8oai6tz?ii6Z2tRHdX@ z7DcE@q*+B3l8Ts=z?8{NDIjnmPErX@QlmjxP-R7x7J+4CjHPO+8l_31D-dcR(hLPO zCXtlNYSk5FSfN%LqR7b5)LJbKMUkk=Rz^y!p=yw6OrjLNiDgB?3_+rl)kSGpQj7yA zGE!p!Rb>`}no81E8B!_9CsLv;ja3mkQl)THi5!&{l`SY(Xctux$mnrOt}<4O1mzZ@ zHC$sx8n5|^3du5>&G0aPxB#y=G6c@<AOH*i00ayG07ifx_mEP8fj}vf6ClXKnK3d9 zj46{7AjrWrDv9YbW}wh1B}6oU(@(V$M~J}~Sq4U_3o9#3q>BtRFw&;9OIE8fT$+`P zab4bCc&-}vM<Dv9s^YK7RbMEP${={Esi2{%CMpJ$)dQ-5qD9p}_*E+6#8Hup7ATC2 zr6yI8kjT|j3l!8z-AfA<YO#&0STvMnL^_~ks)I!`luTbLvN2?7lTngsrnHL|R;CzV zhx4sEm0aJwD)BJGB*R0)CoxT?X!aQy7<gaT(dq0x*Sc4wXkKaufeWKZYbdiCW*XIb zN0RY)Bj9>DOXX61M7@fW&{v&iMUw`^+7{Net*vV&7)?zXm}r+&hKb0)$&A)n)k#V; z1YhcbfJ;>a6;-MdbE*avDqN@<DaBV=7FyOJmZ%v*#erq0sNk!lrF5FCjEs#|Ws^aa zm{z7mi&a)LTG&i!Q(>)UGcl}c)-6*))`cH=DlBAiV%04ZSt|yqsci_=kjpKqmB`|% lwSf*)oeq<!Sy&qf1nZqC+RYtUo!P(Q?ntK!5&)2^4xpKC(JcS~ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_030_states.bin.z b/client/resources/hardnested_tables/bitflip_0_030_states.bin.z deleted file mode 100644 index a9643322a69bd4da814425d85f46580b0a9910f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14726 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 YN~DxXDUtuLhd$I_V#N*LUvuX_0n$Hjf&c&j diff --git a/client/resources/hardnested_tables/bitflip_0_034_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_034_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..06fc562c4c492622d08b6480a36e622262e4c908 GIT binary patch literal 1317 zcmYkuT}%@P007{Y(!;iAwa}K+ASjel+NRtY9y-BIih#%o16nv2CU;j8(fH69!jS0f z55>}6V6cM3`2$Q~2qAaN9*RTOUhfc>CBwM~vJlt0xpmGl#os9#+vC2c&+=Z&TS&=a zZT;c)SIa%Z;gt1b8*g4od`^K=<`iv&1(N>;3I&TX@JGS_g#~xUox58$1N&Ma!S=!> z;E-^5akEGuD!(YWJzTg=IE)Kg?(W-G2zYiDf`ZN4TSQvt(ow)!SGWJ-3DRD-{pj68 zz-{;w%|Bw{(}?xphiqAS_Lcr8IcbYzEYT?01K(PM=V^WkqWSZuI5V_Lm>p)M3#Oxg z?pzn2>t8JbayZ5@j<kbq>2tv~rQv%WX!W(_76V(d<M!_goL?<JDd6n%k<$Cv>ig;P zxZ|d`Cc7pZ!pZ1JA~R>{?VM1tNYcCSwaD#&Q2?x0#^?ln3F*p9kxS#9G48>mcvRlQ zIa<$7{OmaE8ICzFf4vG{89AH#Y~an+_D5TAB-8oKleS_CFlYE!^W?+gnncI#n(P;S z-sKzebPLU}ju^{3vS#=GG~37#5VMS-V5YeD^y$Hj6neh@X~FK(7eYmzhXo~BTc7uc zWTJc6&0m*`B!A=$y_A7lkaM;A`4J0!9TzEsuQ>+Vg+mxkkYnVOk_mtig1|V*k(#K4 zLLr2t>2g^TEr+_vsDeVVYb*re3_L{g<r<#k!dwW%^gL?wNGLcA@d!n988MRN77VID zGC^UZtTlEWv0?sq!WUj9^9?#0wX#V(L6VHG&tI>qivn6uo8Of5St9TFyR=<F;gNuv z!NPpLm!NQ-0+Qw*`@_M6g|YTLXv^k1q1u3(9aQ*3C<+=IbeCY3uAnb~^|OSJ<r|bS zJLF&*Qvj1l;#{w6waWxFQxdDqarrL?!d2l<J2P~Tb|`0L>KqqaEVip52AlFEIhY-M zXQZ_%b$wIZlp67sy0Nl`<T#{TGd#%>Mn}_0#I{0H7($UG@y>4r-!RQ1Cca(ehHOZI zt0YUP50#ZG4V&gFNvvMc-QJHQhEy0E1k3&k;_OYq8?gB}{&#s%aN=R@@2dM1mMeYm z*xvnS?Bm7BXVMAF<O)?PZ9~)uWg|Y2xk$*Aa>{J&;P5ZSUWAOet9hpbNx#<Ggm?gX zSDtK#pXEKH<Yf@PmB{)iapah*C?Mmin2yRGHcavWSd}IlMNw#yr6*Y<)_84dbf{w? z(-r+;Ps$g>S{Ad>yLGO2S4M6mf;9+zEg|TZ^nuJBi>HHd+-!4%szvvXd_FN}SZNpD zxx==CSX2(p1kNwM2r7ONJWkC>o!W$`AYHggz}G%^ayH^%3{X|4vNwch++veg=<~w1 za*cRRqgdy1-1@O4!)O8<H0E~`Bs|n84K+a&5piG?M#hPgC;0Aws@u<F3-E$WZNwOg zi~>lc+TR~b@L_AB*;sJ(e6B+HQfLr+OI7X#(5Ro*=GsU;*T)|i)M|{Vm2Xf3Y7jxi zXg+Ek*Asp_gpDh?0Ud*tsyZVCHu0^;rNGrHv<xZ%WMR#aC5S2DI=RX+vvs7iuX#aV z>0*O84>Q(jt&ZgyrU~4hOe1QOL_dw>dpq~jGt$Yhz9%I)*Ud<A$3TS?%f|;uQL0%F vH>uUikOtE#P%xh~rMa3^?m>OroD`#3ddwY$VVP(nFq?fzccA#p$qK>0&~zUh literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_034_states.bin.z b/client/resources/hardnested_tables/bitflip_0_034_states.bin.z deleted file mode 100644 index 959af96a9325d0333bafc7311ac45ec254bb3823..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15953 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 diff --git a/client/resources/hardnested_tables/bitflip_0_03c_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_03c_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..1a354ec8a441b7e60d1c5d2e50c2669d27a52b6b GIT binary patch literal 924 zcmV;N17rL`T4*^jL0KkKS^H&50{{?Y|Ihksz6}T{7y=8hu#BJp1CT>&00IjT0D%f9 z1E}B!UjP6A`Tzg`06BmHWWWMpFiatUBLE!00Wx3#FqkF~z!88BU;vpg0GLb@2w(`n z2QUCkm;g*B34|~NU;!#oh&0d!fMPNlG8zV$hD|aBB`88BQ^`FVnrZ1YG|`A?(?-%^ z8I<<KP(LhE5bwnb>Ji*3uwGKUWrOvGA&M}a1v-+3BNZ?f0g8%w2XJ1Z;XWYpk5N4Z z@0XCT09+#hV!Iv#7-4*c=`Rs=Db(;U7{}5t0w;(%mtgK8!-sJmvll}QaQg#?Lmdl) z9e}$Sd<G+hipAnCqP@f14#o}_*ckcGw0x!>V4h&b7+8t!7l>l_ig2+%5$hhY^N%>} zQ|b&S&^_Y}FnEQE{|DASqp3QR$~Z58@G)WblgwU0i_Ba<GU!}Ag7y{{(qBNwL3+jQ z7ur1KPdN9;{6hIjPuO09u^owe3lqpN_l1j~#|r}k;|J7T#fMP4i}ZukUg>bW<?oZB zedYC@1b7Pr76vbn`G=&w^6Dp~d!^_ekzs-S#pntyqxYD`D#I2g7+^7aONRvR7Y-g% zq0q+%pd1|u-WcJDbugS5UX#&yya#z5h~ama;C;vW9fP>+P7{LmpBayUzd>{_V5JPe zDhvQ$0F)3u1+YUPXapo5Kv;W4<}YdY9|(BLdQZUdp2Ml|j85~10r{Aops(CZg-#WC z%jOrvUlD%t#ojLQbD?(=mw32c3%p!9mtyQVE`q}y3xgLz>Nrk^L;eU11&Ms+U-ZH; zFj!b7BNbf<JIGTM>R2Vze-jv3QgFB~0-jR3j98d4SQ8MZ<WiWG*ircfTnaAmUIm1X zp@6|j&{akN{KR(<@GMLWBZW)2Sg}k_7AnNSior%0rv+j$V#S2VV2nucCj+=kuuh`v z6BZHPF2FnqIu&p(!-EVv%yc6T;&4-h#f}q#yAjZExLCMhiG!$c;TSQ8Lx*^vFJ>i0 z4```k!A1NqsaFaTsqvN+N>(lrR9ImpMl2}C3am+lm4L)bv5Jvkj1hujMkR@fh%6={ zfr&8-5@Hyu5@4{F1|qS9V*;@l5@Cs0m@F(X7!wl}V!&enVqsy7Mii`A7>p@lg0W&^ y!ZBe?U|3*cVv5EIVTD-1STT$i7zP*^Sh0m+hA^bV5}3u0{x0N-aG@dg%9IAJmVe&> literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_03c_states.bin.z b/client/resources/hardnested_tables/bitflip_0_03c_states.bin.z deleted file mode 100644 index 7ee384996119f001684c76cb729512ebfaaea401..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9693 zcmeHNe{@vUoqsXMlRbNOjp%VvQHRQQ@sw_(<v{qEm+kJ6Zf%V$g*1dRSayw?!W>8; zKz`ix)VgYbu#1#MG%u&vf{x*d(MAZ#<*b-Ne&p4X$$&9=Z6?XcOp@p1@#f9@aqoA( zZzfW${iEmXzqyygFvHyYz3+a%-_Q5+{Ukd+8Xx$l|Bfy?F8r3hJc}RE7cF?`!^XW^ zfBoHmeev73?g)H%*UHtK%f5Bn-{+KZ1;C=>xB_pBk#)@Mg#FQ_T~T>ieZQL?A6>e4 zYi)8S7}n8ks$wR>HFb~Fb7wtlPo$%zkB_BeYN@8|AyGP+uI4FUXhnK?{}c6f22-`@ zWM{&+iNQ`@s=`>pyqFLpkGDZlk1N{TJk3XmB|glhS4bEx!hsk`&LjrJ4KY+*8<IP? zZya`~q%|@4kY9e1N8mE7f>LP5IiC-UmXaKRDEB2uf<)DHHAtM=k}X-P8*pbqH%-d? z59z&Hx>BQS>uOE%JWY$Gq>NcoSR${l2WsnwIC<Hi3S7DeieP5c4njX!)Wsx&^31gS z{2+wktlxbf|A^)8PftCZ2vw#;y$2>7u^gK2hGPy4!loYX`{pQE*1R>G)<4@3Bf>>U zm}E;IjFMvRUj>H`5PZ<Hsw*AgK`!IW-`5Fk{Y(iexVLX|0$L%bWzbd`v7y1G_k(;5 z8mUFMf@hxjilJgV%;i=i<-RM>53fP)1{PrXvmpr2Q_Jt}A<06XBYe{!1MpHb9qFP) zib?K*ZsICpXEh7PL_sH)+)5VUd4h24ZJ_<|!M}m_3Q5`UBzzC@g$)`%=)lv4`Y}}C zE$S+D;5uHx&?_`^u|YHzgj}KcxE&bK;3mNv=RSh6ZBT0HO<O^BKoGvx3d^C!u={P* zR?~(2UfQRjYd-IseBsU4`G`f|i9j=&D!mV1f;_(kWSpBb=UWHz79JN*q;SVGdmS-B z1cTPa{X?4FNNt?Se9wBE*rG5=-FX;K7(s&YCdhBYbGH!{7H;R&l$=TLhhfqCsv!K{ z;u{mGIht{y%^*3MkFJxqUKWdwyPB>F8z9C-!GZy|0A7MiFobT(d@1Pox*%lWwcQvS zo~@7|T*DO6v<}{x1b1gjjV%F(lFkV6%~)AP77{mho*d7bj;l+XGiEH=Gvkn)VW`%r zTgeO2&G-m7il4FD@&1O1RqCSg0*;@hND7}RGi-YCIe6!}7idy*f0+I7I(a#>c4Z&! zlTu_T;6^@%4#>AuO-eV?bPx^$KBl4G>G-mn>|!%b81IFrul11Y>CQ;v!JCA$KOk#F z%%f~3xi3)?$2m%Ln#|^sA$yQ;0jeg+i&5NGR>bj;@js5aqT<Rekh&THhc~mj&U&WZ zOHKPoqW4*{cReiJ!DE9Zn%flJI>F2#JEdt=6oMgWwgP6tUkF#H(#;?vZh0M_4;NsP z+L@E1m5L_u_gv~Qq6-{pXN;IkYK0YhNG~HAEUbY1yL52fJLZ93d~ZM(g;6jZx+p<( zaW=@W!KL$5=@EwlTv-XL5jaXAPiWZ9V4!F!Y>Q<Wa>({L*~yh~^{emwm2m4uR>s^` z%tQn<HCf5|YnWz-Fc1(<yqmz_`Xw(LvG5<>u*H-1f+H%t7<HG!EI}B9K^4j%_ZW<? zg4;;M?}jmV_GDaTNasQ`f$)SSZ^UP@j-2TBC%Pmp5;W}{v`}fLi6)n>;&<S!V=@Q3 z(O(8Jh(jFuf&r(J)hrvY=OP%I*6mFGHq(MhRlLQ9`5^?clU}q4!uO96Z95lEPEv*B zHZXsf`5Iht9$cWFKQSP3i(lbN-0HJS+*b2JKBt#FZ2H@p#T;RA1jZAm4-uv=JXtSX zorE{sAg|!^G7L~$Sl*Oti($m6dc<1E@>wb`VLl;~n3kWFcp)2b8@;rAtOF7}a!)95 zv~NV;OANP0ZvWpxt}cQB8Q<k?;PN5TiuZ~KK9GWHM=Xm&r>?9A-#ER75j!>jh<mO4 zumihElyE1D@BY(zAx88byccgG^sI(fhxs#4E|fW9Z~|Vh=PM^*8~B9cUl}w;<n^Q+ z%E2oM(TL4fVHKI5*#oPFhnH)@bQ!d#Y*mNda6YQ)Bn&y%!2m<eo-Y9ldi-o|A4iW| z*#Z?TzlFD#utzWllU`VPn_%v;638p&2g&=YTfm19Hd1gP<y$$VIchhS3p4*tGAX%J z2(nBiKOU$b?yTSW8(xq(eFHD~g`Rir0MzkW7)T#O-fW<UVZ@&a2RxGZtqt4YJrmx| zdOEXA5H5Z?rqf+ASg|6wZ4Q@2g*)qF1WehqwK?~nk13-~u+CDl;8o0OLK!p5;SMxY z3k3}>;_X3l2@pOpM;eweDXg~|Qo3Aw++A@Dc2CeJmXn)=t;eB1vU5JzbkkNQyfp%4 zRw+|l|4u&BTiAYI-gWZ&0F*N>GEo;NDU%S@Qlt+MoiV2m!~1G_CW-olmhBK>^5VVf zqpcTW_d?t<*9U$caOoD_;m3FRXI%e$Ser$zuZ@G2B5(CVO-$<K;z#5%R-Y>!Fv96t zR%im2H*if2Z4!g-hy@T$XF)tOr|#!-FC{ix><^VZV)N6#9!xYf_YYf5!6;bz7*)3N zV6*sl2`i|F$Z<Dj=X&c}cxTkg9li*<qtrBu!W9IAoX_C-v)b@E1A_2rdt5=F@y2iA zgD@oPL_xqb+~cKTftN@g*xw0N7>ypw5~o?#pRlZl-8%oxZ+7v{Ct$wjYF*G~z_Dc0 zDbScYItE|a$R&yXXao`!@7D0VGcK)%nH3(T8HNQ0Ewjw4)(V88#c?_n23H-iV*pOu z9*O&k##P%V#9Ltijza!9m^TS8af-n?&jkE`FZIb2CK-}wIsrdr*&yzNF9-4LRoNgW z<4!`ag@afhLf~GmiO^j<_d$qUq#pM}-+#w}4kmrwfI+K5hNhHy9S|EP$Vrgbz$Heo zw1~hupalG^V9+|8sWu+H@i@Wo>(IwOLx?w+wAv)AMR>r3Q%KfYeutn%OJ(}UipBVs zDpoM=Z-(+3rdgz$j3hM+??tcyr<OV2c?0f_$^7<8+))^N7utB<W6*z;f0ZBiP(O(I z<VAA}KMJ|Cv5a6v#e~NYci=lt(*sG91-ydh<n0!%5}rvLL1@;*-)t5q*VAR?Fw<Ku z6vNyLm`dl7Y5y&v!UW{*0|eMf8F^&^$0K>;%~S9PhpZ!+H&cH-u_I;qJ0sv$N#yw% zphy)^cU-67L~58hW5$SH@n<sjJkrU(Ml)S7vzU{@&s9Hf*MB)ikRyEotT#Z#RN4wH zaA9}a-*_xN3wqQk)P#`b(cWACgH^JpkcD@XON=_O4;aV3!lR>>PY@o1Jtwk2Ewn_) z7Em8$@-HUb6-{bQ=Ph%D;@w7tp||sPUdZ>5kZd_e`B5ye9%N+*Mma3$LR4_Yxv*k! zSGo~w_j3KZrjvyH<k|6015zEMns!x<BqA`FtdYf2k8VoGJ~0A6i;)R-y$2S3BQ{71 zjt77jnGW6MYKLGu<=b?L{b#fviAgz>_Rw%lMA}(^j?J7r-AGdD+zB{YF0OBbL)E-m zg{wB{O|KXLlLx9&u<s#I6#t1yFy?=}9C9~sKZV9NJasPSj;+4oI%Dn}J_`33{u^ca z3aI0Hwy+7;?Sd|-ILZ&kU|rpcCA$UTp*|_Bs5hE}(Jwa#!o0Y&y4j0J94)Xv=$~)1 zlEpn3?>WL5t}$%V#0Fa}G769wVSD6fYTAR{$Kd(e+9bqiGb};&FNt?oy6;RlR(<C# zxyh{2$E*&14wjDilOB<HpFZv8;F@e(8T<jrvq%ITiKC&G$(AI32ru+P*WJLPEg)98 zjw>ZHhbsQLZElX`@0$mXTZnaG^#J6YgEs6#ZV>w3Yw$*MpcT%lyYi#rw^+qbU_rvV zUD#K})UKYxRs=TfPvq_UM^MgFWZQ5a>6sTv#-bKjHO|$z3D>aR{1=QvFXX)GCFVY) zlh{KR@NSCHDG2X4bb?&k;%<NXhecYtRH5dsd9_j4qpQp=RR~hzm#m1bx_IQro&wSi z`+vpNr7&h-Pkk8q%$Y$}U_v-fPlAGEC`O5AGYIc5B}hBev`23;ym_6Wo>JlF%+2h3 z2ioFXj>mi>+;3vMe}661a5HYS8`SW4^3wWNRWxvB_V8jIi~fey?1D}zW$X-<w7iTj zhf=Sn_2V4KobM#}N8K>_(KzndaIfj{hB$G0=~>l4T>vL;f}<C%lP`2g8^He*%=jwr zf=y$tRu2uyx$ptWoK!fYvrymoiowLeio_J_{{;ShF=<$5sWF;!hAWH+lhA=BXn_|F z*k)%It}(@0Xv%szyOVI{Z<HcHt}c-Yz2KptENR%rO#;ZhithhqE&nl3D+gc-yn1Q% zvWyws@0l^-rgMOJYeifSK9RZ}y9{N^)wP&}#(mx78C&^;SN7?1h1oHi*1b}w%h3N1 zk^I@^TsnY+^oBk{5?hMl=tqo(H55eV!<;E4z@w#qssuc3W|e^P-cz-MNx7M5#+r0D z%!*ORkedM|iUqoCWRR=ncN{ju+(#I#=2sJNgcUMTXy|nO6A%oODv;2v3V{i<SqhES z*lJ^M=&2Zgjs$)Bsw(N*+_zuVl*)J~|K#NNn&I6gS!Vk67>!#SPc+jdUv7?37ou=F zW?|bRS-u<aJXIT}{4n)Gg4~^QGLzOZpK4;|xdP!UUK&n%iG;Q5XGyWbMV7Uc+tKz* zP3q>Z=mQ}vUVe$JHCZiP-x+Bij#14BwC@$`@95r3c%8vN#!Q&kL}CHhQu~bBwrMni z@)axkhT6eD>;oxA45oC|E2nwYy$c;JdJ&FjL`eitD%v;<SHD1t<@Hci8>)6sB{1QX zC*i4WsA`FOMhO#{=*6@{95GtL_rpCZ6DQ!rRBgy+;TKxZxDU0gy)?yx;ZQXk#Ntq8 z91Kf<g4WTv0YOo^2B9)UBlTiZ)5$}}5lN<CKLOsvUV>!WG*8R&yBp7{=4v64P^aar zX*mm%YFf^kmb0eitZ6xGTF#o5v;Ii6rsb^v?+*>9<t)@Trsb>~DK#x;P0Lx+a@Mq* dH7#d(zwR?FXJre+UnFP!^9;DT?z_Rt{{wr198drN diff --git a/client/resources/hardnested_tables/bitflip_0_040_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_040_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..54b71e2cef53a5594ccb5dbe9a8589c3607d7cb9 GIT binary patch literal 413 zcmZ>Y%CIzaj8qGbl$~w=kFjoTiOWS61_uEK0R~YA2L=WX2gW}ooGi=^K*W?4%Ix@x zRaMl)R&B1TQ|L!EFOO5oElr-2Rvz+Mu}0;PkLN+H5WfdPg$fgsS~+cAc`VfnRpeUB zs2;?r=Akk(L~GSamdURQJ)1lmlDsPYURo^knKb3qWTr`3zA6_aJy)7c<}_8AzhJV; zQ<Yg0)kDKSs(C(FIXPKd%zF!8P?YzS=>dzcOq()eQml|S2tH7G<Y42WGItV_Uy$dj zhR`XK5|&I3@;spOAL654YhypAuUc1tK0@}-?iEV|nH?@DWJob(g}6C8ESais@#R^O zj!LmE(Iw#`j-FHWG$)3M9GbD5X~MJ)l`Soc!lybkB#1oKnv|+FDMgEM$|}!EwT^LL zTni+YTCJIxs_ExB)l+AhYU7ek5z|&=s{Ca&nyWI)%iqKPRH~`%nN632CsYJ$J{2!& z56tkH6uV@ar?1L9ra4R5KTY+t4QljmnRKe5S7q9&AYYX^tajWxmF8%8M6)f6WB>pt Cew&K` literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_040_states.bin.z b/client/resources/hardnested_tables/bitflip_0_040_states.bin.z deleted file mode 100644 index 372d2d4ad490b57c710077d9a5bc3e86de1eb2e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9770 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 diff --git a/client/resources/hardnested_tables/bitflip_0_044_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_044_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b268ec93500e24a292f5824337fb80b961bcace5 GIT binary patch literal 3460 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_044_states.bin.z b/client/resources/hardnested_tables/bitflip_0_044_states.bin.z deleted file mode 100644 index ea9324375329e75acff6dffbddff51f4578d3c4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22156 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 diff --git a/client/resources/hardnested_tables/bitflip_0_04c_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_04c_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..26977703dab9ae6fa24c536cf8c22d0279e5ea5f GIT binary patch literal 1219 zcmYk+-%k^F008jP+OzH5(Ar*mM1BeMq`iiI&umF23_;dvp;57br-6BQ^}&}VmxY+2 zs6c<va*g1ou1nm;7(|LhuFD>}MYrDdicCxf&O{%0Xq`GXm8m1qO{3f1_W2_|+YcOm zn{3>V`}V88e)Lm;YU7F3W#YR?WJ*(A-JobtXf$6<j*V4o6pHE`{95rp^r0dJRM|K( zhkz|epGrSEcL>6YpoW6T!l5lH1PPQY<ilHv3c^t1h=P5y2<c0Yk4Ku19<B8KIP^Y# z6Z^Do@YY{ejpJO!=~`{`N;%e=Ym71MBuf&y@zqdWkV^bvOedmLf7-h@=e1!mFLpYT zoAwPz+$G3agAP4Ms922(!3~D>S@ygM4if=Xk}`n+(n*wrtho(d<L63!niT^mn`H&T zjZhtxnEinJ4IgCpBTS#jV-zd$10JTG^t9aA=W=XviN!VOT3xCC`l-S!JMk(E8z8a+ z@sc8Y>0V2yKIae;CF<(j)H$Ub4-;x)6eIzUhK^{{K9g38S3QHwI=a&l|8Vg7Ht>34 ziAaz4UR%|1Q%sANM~9NEPZsDjH*L+R@As}-nBB%at<&b3WNh+94832LSb8ykx4YZ1 zaCL2Dwd~u)+egKBHvI-aui=B7A0yeTsV{HaNdp=K8PymnH7A>NJIP+<M=8%DHf?Xk zux6TVqv>aT?5Jdv{o0@;P<Br+51DLPa8YGYZ4gK{Td}OmH{=m&qVC$Vdksq{0SV&q zj&dgI^>$!j)<o!|EDcDg>Y_$s69ZZIrWkdGmHh~gfQ$*pgp3hmqA}bOqorx8b)juJ zenyrsftILqmN0JRAy|=tRBL1*jCdj<84avqSRrn=Q%sD`jH){=jEBxMh@EW9k_@}m zva1mDo2r+)aWHH93|(~Ea@={{i6u*YMPh)L+iQm=hPZ4f3?yl`@E7&U)|vudAKQ2T z_=Ff8R*F5R?m4Z2^)Kg>Qf;X#6N-uw=Pw!Lt|+?9(B^la6q>i6l(O~?OSJ2nyi3RJ zLTUNJ=@OMd7Lydn0p||5j}vC1H1pKKJR9!mKFA!Kf9&ky?{*pHd^a3D;QK`$+4Jhx zn|aIcBmndgkmFcCmUUw@8*fPu*%O=Z)DKQxy0_E=>uB-Vy8S2V?1Qc3oi4L$rM4^~ ztsLJSe>to_;z&HIx;%f=(b_vdCOvfL-&*AIF)Gz*hSj$}arKAcTz%!E(*7qU@?*q= zJw=>lBG|nIW|V)z@En_&yE5_6{LOodtEKtDk;_-dhf@y5H@5F?hizsKCo~89cc`=r zUo^<1yHL77U(g1VwaUStbyH^#wpJJ(L_1MWxwQ9(0iPa1y;iR=PAJ6oCZkAFf)L02 z8XPfcdCcBCi;0nOOhmmZg)kK#nReNC(n2~0BQVm=>sU#SQ!NO^w%OYoc`Qm<EB~^A z_F~-ju~8DE(NI8>LbODvMR}G>8A0w8Y|Pf6Av?FX6Ll6>r2uZ>HzbK*{4AKvJ6m7_ ztPcaKDG1@(jGhbIaALjqZvt8`O`4QRmI6Gcjx~m@0SyyOVZKmA><|2H{=ntjGxA?r F{{S7z=AQrn literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_04c_states.bin.z b/client/resources/hardnested_tables/bitflip_0_04c_states.bin.z deleted file mode 100644 index 2bf23856d4222582b682689bf181daf952f7af5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14808 zcmeHue{@vUz3))k$9=DTk6NC!iZEWSmtL_iwOr)#BOKqWZC=&BNCm<V<#^>vDgozK zj427p=04YIMTF6MBLbRZn^urXa?}{2V6y4Gz$hV%2s0yz$?0PV2Qy60noQ1|IY0LP zzVALs1iP^7t+&?u<8_(I$`U7;IeVY){(e8d<`+GgzPq0|_xDXVe9->ORrN1?P;>H_ z_MMs!H{Np7zrMNfAHROX&yB+~x*k6DjXR(H(zPD~lfacoUV<LJ4j}y;)odI7-nC=U zQk$ueIvHE!uKXw0pn5^K&SkdJLR42`1nN4sQxabhl?+>ZGECdp9{q=q1d~J!o-%bS zNFH*3M&gQE2UZ<lMM3ju(vIB@A?B7SbfHA%1>IpQ_Y5=>cuCg^MWDY2jXBj(vUIpm z#Luc+?%;dyBIuAORkOdH2kk9V+j){E2{;XL=!1iB3eHJ(shfw7U^NeM71EH0<xmFq z!7M%%uZGEZQE}-lwKh|7k-iBP&9+jAK;Q220mr+C#<ayMXsoB4Nik2;;YOFn!1fe} z=G#K}f+40k)FdhD6#*`N^xJw$y0@%?y&ZCO+o)n`C<Pudp(#tMfo1Xr@4T1{p8Et+ zxv~}yHhK}A1fGGcMK+#?qvQ@Aehs!AqqR}R9+ZwkPl`ID59vX+XFZ&pmzHMha5m(X zu&5`)q*u-|h2fef*wT#<ZGs3~3o})5IT8Ht2?_Ee6%HHF3Q63$pc%BtAOzlqSuh7C zog=1XN-0`M!&wz#*F%z8gFM{a>rN6|5^bl&Yspt1g+Z-yq;uB-aeGS+OAbqwM5RHu z9|}g&HB_ULH}=!Y(_l=O)5@;E3rLw6mI=u(bkDl`vo?ixND=I|~Urj9bUQDx7N z#q74U6-fs7DR4`Yq@7aL*|?Z@RC`spXL9RlP?~957?vmD88`~ZOyy)cdFDJUNq{No zGLQ6j;?lK?xVjjZTxf#iG-!>(j|Q|=snQB|vJmph@OFy_^cM_!^`Z9RQZ*kfCO03b z&0a&E`YB_wBL#+FC>bt$8A8v$ByEll!(K1K%RO}g_qVYN7P*tfhLrch{70ee1S5Ia z{xoG|ZY~_7iR;KFPBVo~oHTRY+fB+|gc@G8-EOz3O|j}KXu{mX_uwne;c0Nh|B8^G z$!<^h0m$+lYi-$!!vZK{S`OAW<KKqX@nKIk$M(*zvCLE$Aoz<%M!%`-6<2=kXDU&L zy&bJ7;#jd^FBpUE9sGu0>$Gi}qQjT|$U`sNG#h*tRu7WK;m}B7wSNVJARYnydVK{8 z?N61##B;<h^R_{&OwJbJGk@g98IN@8($hfYD20kd$}sr^R?46E|1J>N%+rbjytZRg zTdEzViWdvK&hN_<njuhep2SEipS;<nYb_#bI#>?_a*AffLMPyFzCx4L@i>!Lwp*ol zwij_#&-B|0cANE4V!nHQN73JM$KuLIDT@bh(cywOljH5jLQQU$0s(RLLwLaB2SDwC zmx%x7fu$e1wp^ts1G%EPXKB?Icvpd*sVZ$%z-4|_$}?f^=;a^p;5w5M!GEqFmeWqo zi59`cKk^us3!VvoCpJ*{5tCU^y!NtI9s<Rjf$MmFd>u#dnL|u*rO`Lvd@@a~q$C4G zGQgmT=AQ=s9o{>lgIQf&$6jXM3nNZ=2;w=}%uU8WI`pDbzL+gy^a<|)m^%ndlB8!l ztz{)FXvYeY?zEe5CJEiRzQH%4)SIcn87Oo4DK4FZx4q!Y<cKy_-jfbF+9|uluj{#f zUBB4O-#O+6O%nJRI+A~gQ99_6-RHasO)o&nfQ)CJ4B*W;A~TsAQ^3wch3qZ_xe7ui zBPX+Xq+@k;rPb`=ZfRxKD4R-F(ESZ?fhVgsozzR=d2FniSl&K07!`d`G}az<BYO>A z!|t<fw8YbJp7ta=^8;|3E#2*&E#g^QXPchkoDkqC+3S2X?&=aS*BtK1K@-a<l3QCU z-lrp5P#ShLa=2(n+-48<%}$%aKG2U7yqO2=82eSe4|c+CJc=|P#Ri7`Hv(HmJ20%s zTBmP&MP>&>Zc3paR&Q$lzv;dkHS(yZ&gG(uipNCr7jXAFv5aRc7<|G{*+VcQ_ID#x zv|02^!(_iF-2(e?13KV=(XF-k53&8Z^j*-0oE;WCvtDz_(c`284je5^VchxbhStFF z{eNyh8(rz%9Zb%XEjWgLdY`F->jklQ9mgt}V9UG=rVwmu_?;t%oKo$cZ@x@cYVdci z6V}O8SOi;+$qn%D0_G50go*dU*7s;!gLR%-d})<fnejoWY=B!i)J+2~wmeLexsnYg z^{4uY;rG|ss#$oMoP(X>myQxVm1W!T7>u9FCD?`2<iyy)NVh;3ye+1BPg+Y!@Q+M7 z<+O?+isuKv5->Ooj3((zt><ahfL)owfY?(}M4R!ZK25V^NY`Ey`~M)*-L!NvSCo^o zRj|cVeuHPBhBEKpv*6}>1M<O=rsm@wQLb3#Y%+GI^?rFLaG1P@4dgUT_$MgG@}2x1 z43a@?RM{jPkwKoxRbs?h5W7=&t!UFBQgfPr^J5;TX|_PGz=I>*$h97cn0k0SIc;s| zAjK_=eY;N8qyzof7qNix{LnLBjKnWS;$PlKOiP*!TN=nt*h1aXbMQ4&$!l&#FTDVP zrcKZefB(?>htGriZGG~CZR1UGW*D${Vv``7O=Yc1B8W*55tZ;N*dw3<Ld6^+g;8w2 zmGUC)U?(T6Mje8W4s?*kZcnmqliS;vZ~tRn<qsJ8Tv>GEtFn;bc0?kNdySn+nx%i9 zF=k|I7(Z!p&oj0~Nj~Rxb7B=%&@~5nqYJm%p?pp*#sPvu?>wA`**O(qlFWA?Z8$uJ zuO9Lm2gA!La*TVKSN0BHnIzTmSmUq}Pf^#B*{<JnSjU=cz1RUC*Oj%vGpp!{+d+L3 z$KhNUmizJ<T;Uo(be_l2UC!uGL22f5Zh`!DWJNkGI_DU)2kR(_1t(%Z-1};XJyM^t zJlqO+g6|;PkP~1-4+LIZ&m~O{9)_6mo=&=}y@&*jcfkfO@DyT{_v?m@Mt}>@ySpa{ z-ux{6X0jry7+#4)ZcXOOq879bD?aoH9NLv8k>GgWO_;hFmiZ)vGg+;G&2U&POvUT< zo<s^EE-Fxw<;j|;%D+1P9OZ{)eB(n*YqhB*$F74`D;Z=E`4|??N8CTa<|Pp#=%Y<O za3SL4AcK=fd^JH++pqr@TYblp23Ugt%fjus7Uvhab9}jF@T)T}ur#(_am!u*mTM%I zjT!Iv;(QCoB!r%9)63m6*6b#4O^0`NGI=3S<dueNd`35oy5Xdv5pPSTku4#e4%1v4 zOM>KJl`i#q)HH&%-0{3mHeKw}VzYQVXB!&uet61F5I#Y17Wim$D|LwJDET&(9mv52 zbI%1&JHSuxf@Wlq_aUjM0)vmCp<Y-G;W5D9i@PVYQYHYUAia1|W$-~~zAg9$9OEjo zRHUy}p@#Z&ZWdce?(4wvtWZo?kRu9gy$B0I&mm1i^dw%;Bxy+CKpaMx!?EJUH<5V1 zG+`t{to6imt5$^7Hm=O(r3R&ayieP~oF^ABq$S7dK?)Poo4h$IabAQhR@~s*OuEQ! zHwv>{SK9{hqr@D0AZqC4jg<+q_5>ij3_G|YKKYI#t|Z9S#9_QgVZong@v>EbcR~=W ziA`AfutkG%P!U*4gVN`ZR%Py`(K^{@K$nfy3$?R1_K4g26d7@&{$TBZtfpF;tfjq@ z4wBvrT5)GWJ=20nRJxn*#*-N%=g0PmbbA#%<n4d~VoIYhD64)8_ByK*Mwu!tmS9N> zBur(MncM5tm<5BgGP>q9kXDk4Ahfplprbx5H73>8ZiqAif*9(Rwb$a(agvvh9^~bq z&gbP3LD4&oDha0%kBrJkA2{~4Ty%42Kv|Uu*YLX@7yaq$zjs{f1I0cysLliJZ|0If zWB?Y~Wmq5bM$g~I9nhE$iVcbFhpLac`jU$fZQ9kug~!eZ71BJL7d+CNwLMtDV)h(p z`5suFaeXc%x~8c4y5@B06)Wx_PqCu-u#f{ba@C<a#8=?oY9Dz6HvLSE^^EfKF?PO{ z&_d1Nw?0?}s|M_%@+gcL%7863z_c3nU%wqA74sLy;49bx=H*CAx&fl61?|3&jruho z$5uK@^&V_<v~}1!CS9p_z@`}a&p_yQ0?DSRmSz(j#hc+%MC=qSDG7Q|ZLf`nV2<BB zPy^}7u0&bmIE;6X_z>c`&0@@SQ6G(tHmy5|YVM1;bpNA<^3<cUC&zj_a;Rn@%Ywm; zbF1Z_dZxjoH=_7s@d-HTv%dN$$*R+^+m0(pkxG!;##v*a>33F+4lR_rbosHv#P|km zl%Q?SDpD?i<@!}gm-4ZW{9+A@xdf5z%mJkTSL(2O9c;q^Ac=*&zJ_UBN|)j~{$_j~ zTk#p3ixysv|J9fzhDtg)l=XrO%Sq;HV2ix=PhyZZM?7b~Yk&6>L6agn9rQcz=G)BJ zUZ>F^nZiN7;WR{A;H_x{*?=PrD_L^F45gt}MH)31PCpDvp{x^HLCv#0jJyXwx21Uk ze~*^;<jp4ClMDNG{g_|Z-&@Hx)LW7-Ce^4<Dul#sxcz;5;<E2T_}JwwlzQ3>p34Ao z!CFp-xHjm*Z&P@r73MXJI9<EQ{<E5TJAbQgeKDM5$S!^xQ}_&cpY$l1+@5$?Ljg$$ zb!~Faxexp9W!hagX+vG63sw)47xJi$q;fIW{uX1vIg8RlZQnjCM!0LG2WoU!j&zgc z-3IYKHL0vrTvWo~433GM`-cM+iL`V8Vmo1t1eH0(ot!!7i)89cBoan$a5=w%wzI}- ztM8yrm6nf6<o9M_MH-f;V1&E98I9GRQKk1zK~z`ow;@+3i$UO9kTPKSxKC?>_rcV9 z;%=96o$zr%-tehJHE9slppV2d{yOQvDYhrq2cHPBF2|E=4f2(9u+Aon`4ZfK8aRmO z)S;fiw&IvT@epEtW|0Bc_I4uA+zHiCxh*@xVdiHy)Zzp0Z2vR+Sz?h_{)<a5!Z&ad z{r=U#7+AK1giMg_i8z2%K4WYIod?8mojY%x2m3qWk-UlG)9t*GPpPL1;6DZi`w;R> zdWB!}9EngkQ;=&etrClQUmVg4V7Uiu9=Da&=|t7T=LhjE#Z(`7{tT)z+4)G)W)<Tv z`4C9G?($Q)4AkVO!cXD>2!cH&E$>XwDB<rr<W;j=fgE1A_-caqe6B4gUtZHqQX0(e z&35?$C<?$6@TOi(Qt)w%ifN8IO3X@<-|8|BXoF9&r61r~u<BfU3Z7CFU^3G7Wh-~u zu<(jy?gT}5^2@skhskrOP`&2MN?5+A!NrkqJ|lEi1h;f47Ic5am9RSn;{q6HJinKH z_iYv-Nq6IkWM^S3xznR<gb&7o(_pWmS3~vvuKQze6(x^%U|+-n#`9Cx`o&26VkG|M zjl=}$q<l&-d><t(OL-5j9h5TE>WwKMz=UNs55dn5_Z&M8){jpF53L<<ie=MLzCndK z4uP~3&%;v0q=>P?9)fhAXb7^m8GD$J;;%v2<eAvX!Le5L!5ft|uvY;6LcYBu6Z%62 z^~3(yhECCqZ#oOjELTSOg+fWKlysA+9<B7O<*>#yvu$l^7%uA8ZU#fywz}>oScwJ8 zhqa43t>&}D(CbEduHw9mFzGWoB{@<ki3eNjXf^wdW2=v`_7)h~r<4q6ktneY>dd|y zr<1eNEhv>flTh!6Ydh**UeD!+5%F!{1N1;fFpX|uefS=TL;AAPN)}qoGqd?yiJ<75 zW6&OqZO|YI26pdHH0RVUQNzZqfDDRk*Wpw`pc)8#uNO7{nDi7V(sMD`WfpMBCG}`& z_#`m!`mfnJtpwmCw9jcnUAF2h`EE<{tfblDI=-w$SGOBbF)&8@HqTDNQfa*JHm76h zAVn79O6US$GaQh!b9l_LCn1HHB)W9sEK{xRGP`E{xjMFm;v1ufP@W?OZJ5o=4OMcW z>>a3m0&#zrTiJpTVO(eYpbX{EUYtDQYZ)xBxcT4Q=;nP3pxd{1F5=9bI1EpXFIVN0 zTP<*tXyl1oZuz&ILPJW?o<~38EMo432tDn2yGxJX4nHgA8)Gnilh>R<(BK<5^Xsgj zDp4p*=`C?1e3R)?D~Bb471nWr?6*l;lN`^q?NjzgJE&6bp|Pni!24lKB|P{tiQ_B~ zX!9Ck!k{T-P>QJ3;bgk>q)jW?YqMb`iU)g;SQuPmV`!)yqC7YT_}d|d*ik`G4*?p= z@8Y8PZ-giN5Y#idq8pVAX7n$ZnbgajTK;M^mS=Kd8qj212-lo}S{~DJAR&4ZFDM9R zGkn%!f;z8*eCa|N4E6GYWxO?Au3%Dyr}PtYkR7B&t~qI=0|l>sCXnecXa@r+;xW15 za>q%_mgg-x6(ZX}$iw1+s9`@VNjJgimv9maM-mB4aP!kb23U@kB;KQ7E3O6Yw|7wl zLZXb^VHs9FpF+{)lhcUBPLq#6ceF|yE*q^r=e}&To^;m^za?((RdB%y`-8OxQdCCT z+?lk))sR>Ov}RMY-1-0_QSyQ}$F<c46xc`i33k~@WY9&>g)-I{6PIt}i_B<~rmiA; z(ek_>n$uFppuWhq2D2J-)w=GV0@=?K3wikiK60IzL`zmKNAqGiV%nF8tv-ql^>Q-i zVd6pNa+McbDnMe*HmTVx5ylzn3F3icpX%WW+A*o4Cun)~7kspMmuV3nC?1rhRh69n z<S`yt+69fnm)qq<P?C|vhA8X7c$>*{Ere+EZ{c|uI4&)O6%}6AhW)9W4Q-B+3-Jg3 zfg83q_q-;$rYJAAB8l~Og^GKEMO}H{fRF=n!nTY-qz(U;zF~Leu+T57v9?iuKE}?k zfjZx+>EIp5a`K7o@QEhjUo3$6dFRRh-T;XwHZ{Oku>(|I?u?&Ih5eczvt{tOA6jeD zGuS&OU#WM1-2mV5y$r4jFT<TQBH5*Uw50_cmDC|UFo)yYH6HSt2WlW_Y4V9pJE3^2 zd+h5QRj3y8F+py$X>I1K(o4!Lvc9ihx~i|UKpWa?biyrUS?KdUHq!aKLRxdlLt*@} z_a%{DC`<*RgUa)<+wMhE;~*+XWob^=UefV?Z0Mw~w(f-(J@*v!-^_D$ydv~2KT*dG zYqTnxy|Iq`J<CxnSVq3Q^ceY^4$JsdF#yEE9_)4~y5&m1Cijf5LkNo~zzu=F@<0Hy z0{t><VxaB^3k$JlCU+YPp;HQ4I-l5PRX(@!LqU^Jc8SM)c)fa1S!9-&(37oV`d%n| z03MmokqwySoRor>(pmz_WtfBOd##I0S#=W%DRRawb>Ue^4U@+O{vIvwU?5FO^`KwZ z1Ablq!+uA<#UQ><W38Gb0pFK{^}o(ddVK{t%9poLV$)Jj?*-(7u1ES9ja%@;C?-lI z*Dn6V+%X&09ij4i?-ABhjS?`jiytbI?`FRx_3EXOApO*;KmVsz{caE*&<=>6gImV} zE>`X~2L(#zhDp{vu*6Wnvy5bybpl%RNH;H9#o~ReqbX9oYP$oiI3{%K$;xDtpN*I$ zvJvU?k`?T!^8F`yE-Ve=JopU1syL$E7u{TE8l9Oi;diC8Z3$>S3ZF2my_dS~n=*NJ z4}@d#JHw!7u}4k#9*=4;uoJsDMnPWnb>?a0d@a0_rRP7Ds3xCAHRuhoj32a^u*WUc zMM?&JFrBIKe)tdX!I|;&gT<@FbRxFqUV}#%=_^+brsaN^wIBa+?JO{P`npu<h@1ZG zh8nDE!?ZuMpJ;;L@j#xOft&e4xcet@1&kcIlt{5rI2}tlpsSgdYG*BfoUgBiQy0@H zKCQ>t%ZyvdMm{xg`XIEz<U3f=jj)tJYnJ9OtrE+5aRibZd20dON-rms7xPuIV0Rpc zpP1@hGg?uVNmcRZpu8G?X{vxg^6bk`<r`cUI{xUvXgbIxo|}=N-)|;pXFhMjJ?WUQ z()!OYgGiM}Tlrrd-vvi8EwMkf!}k_3Z6Qdr2rs;&5HZbBM^OwF?u^mna9CqAhRH9T zQrBSl+ziwRmv%xgx&Dp)-_Jqq70cX|M0fJbdpQo1o3Mf0hqRR`SiY#iMQ|!!D=bU| zx1_m1c?Wi<b=aNujfS-{epssvTCChlD&}9{sRF40FRn=Q_#!Q4a`WxH^?aeD4lYz< zU&I2&^TXDBF%rKRiGO(`u?aR2Hlvz9jFQ%n^c>7OO?rsYu1LRuiLVc%9GiNot$rsM zSB!-D$+~?RXzoNDu4IEYf^?r~jAb!=DIP6M5v{8@0;bV%09L2-e31b9*-R+hqy5ib z)DJrpebZ>H4pzFl%Dt1>uv6D!snIs795zh1B<bdIbk1}*6Eo(x(3h%UyD}n3)OwDd ziJ`Mo&T;7NMtLrIoC=uq8J+U!Y<QovhSizQ56qlA;DjE4PnJk1&z6N@NF!#&3pkz3 z_Iy@K`?yYihtH~J^UxtXhKNu1x=3ZOU>du}JWNbM!GRRn?`V6y-U{!LW=W98acHki zg<|qG?1-=I>NNK(*{<bq6hSXu(QFjkkVsDmJh<P6O$zxsNaRKZW~Z~b<nS$MY4{{C z@Zinv`!vj<5kjH0sLL9MVa5IG5z?6pGVhK1WAZc&lE=nLUquTv*NyjG1gA-<4q1pu zoC!msi(*Jp!LSul2obmnG#zneV;Xge#-C%(6e8Z(BC+$(Pl_wNSiek0Kz$6{iv_h| zhn2n`qfX-ivsYA<Loa3BS`&Bu(h5&lvXSrhb5>{(VR{U%`gFN0xW)iW#T1{o<%WOD z2^2>qIwK?^Bnx2^LeE^~?FxFkC#$_&0~8kuD|-<%j1Xk_Ro;-aiqt`N#{O`=jM;-0 zF?1{mloM)RhIKheP%>htbGbdaH;RZ9D`=Pk+{n==B-=d{??n`8+;xwqiO6E5Pe5Z* z`7IJY=e`PbJ<G99Wu`Iej-jCtgqbu3_(kT8j0QxrGEx=cW3nFzPxdgM>C(h5wErEg zW8>16SZu`gequV%r`9GQcO2Pe(VG}fQerreaP{H^1;Jc776Bc%n1B^(;L9JVysw>Q z4eb#$_Z*TaNFBhRaI1)%Pfs2mfvi2VjKcyR&q;x!P;e>Qq?a70&Q$E8LFVwXsW56f zq3x8G*1O@va(HbnPD0^GB7u<tR~tel5ow>RY&;aQZ@-}kBvNo99)y)YqYhm@Dgr`# z;qA{Kt>-Trt*`vaXl=CO=N=Ka_eOrw2>OH7;!#48HrJ}TpvjvX|Gx+$bk>vVHfhM7 zdD2IV|1xO6hXT}8(Ykj(KTH_zA^wK+a_#3XeGJ<aR4w*0(6tlI=(a>5g#bRP=b!@f zyP9|KUp*~HHyo!zA`|81wzWuCthkF#*rJQOP(J6nuq_(^Bi34utj_JwvCuE8v5HZC zKE}?AIP<NV8dg)U)0d{fDN0_@;TOE>qB-fg1<;%+EP!jU1EeqaW*VbGK}ygP5D(Fs zHpd4^EB21y6?;dn7#8_n29t%CVNJe3h81tLr3FT0@Q@y)2O`rb(?lZ*hy+YD#3n79 zg<;>(?y&^jCZSO6y-cAJzsfoik(MFoInY6F#Aqie4k63%48gK6W^tkR$63s5!{O=p z<KDSYq6=M3=%5%Yoe;PeuU<qH)C42(%XGZ{7#wiDTNU#DRnT#_r!z0v{|k{()r@jK zBD2CC>&OodnUVo-@V{#M7x<hG>#{jw0Emk{w96#umP-?c;l=TF2w@R3iXV@gx|kK{ zpxkyqMi~Ot%eFGlD#>cEN@(ev%B78qdi(DLO+reuPa)z}kDit=i!%sqDZ_~^0`&kt z^@Nv6OM~zp<}~IeX*0w+c?j2c-wsC3$~KR2+G8ns_-lv`jE0AiWcpTX0vb+8eqDF@ zb^UMa%-E8CJnb0&H9G!N9cN2WM!aHhX_zR5SUVsWv~1iy5n$T7ov1m?7u9^2E~?;X zo+h-XaLQ>jy%G!A#ny$yce5WM`(w&dsqRy&zWYzD`Z*vxpdtvr56gQ*0wN|E`sxuB zC|xTEXRXRezXZ0SsXL69p*(|h^Ndj=-Us7NF!Jv8CX^Gvbj+l5%W_p@Bg#cKBH2xb zq_+%?p%0Hf#+w)NYe8hlKjl}+r|F*U6WE|u+lz^z`b4Ut8Opc8Dc1<K6U%y-@*7Ga zsL;m-AeO?w)Wiq9FoiDs=m1tKxyRR;=kwz(-;g5RpGs80y{HB~Byu{xx*tFMU@0ds z;pO{at{mxrtDl9|@$`ei3_PcUNPMj#B-#Biz@(}q#%0Ub;Xh`r;c1qfeN?$%B|p2N zn!7`v_h<GKP4Is{a1q{wyS-YzW7j?jG#vt;hCMI)3<A2E3F54I^Mcpw@I7aeC_eRK z?4@)u2Jq(u_98!r;ATg@lQ(l-o+6n`tHi?GyA;%%SDpncUC_yiYOkX~+7-d!C#L!f zrE9uKbJXx|g4hWD(i{PS=-SIq<wK0Fx+MHmG2-c^P2}MfFdgg}Y1o-ie3e$50nFBy z83j_#u6l7cY$K3dcZJBh1pfmk8R{sK_C-GL|3N<Qi;?)nNJJg=|9m7a1DiXgBVLzR z>h+Nup?ojA1^pq3{5P2N;DAe6^s0)Pvp}11rAU~ctXtd*D{B#lODSm>LAp;g#<Cc` z6pt3BNUbNIhO|~w3DHD`H431g>eZ&V(XX@<)2NnWwm(#!g7$n&W_DvLXtMhaIb1=c zEn3<Nw^+JPLJN4SqJ{EsFq(8`_lh7<`TOGY7K3)o!=X0^MO<|!=|;Zy8J+U#RB#D7 z?yy1gSA#k|W@13{RHSZtJyEAaABDl>tvH?1p-hS-a1}I5A7kYsP9-{I^@#Xl_6``_ zFPH|BTi?UP6ckiOVVxgQOcqY9Ab*FQa~#^!IlP8{3;W?6vuo3(k?X0Bu@q>}QLh5U zHk36d1`Z)JvKPV)obWpricc=#l7mao((p-O;Lu(9=Sh%3326PNc|q5<K-=4^w!$V| za_rUbG|+jSpw^F*zQp~ol8yIW1g9$ThQ-Il@Z)Hh(A^<EgCnIel`GmVel6Q-(f;{$ zrab<fYtG=q_{Kxf&<!0>ohT@XelCDKz^yY`xwyzkzJpPxah>rF8RgJRS-0}$`mY(m giTiLCrA1~1Eg})$ya{i>=yDzDYZe5o!|iSV8!2qU3;+NC diff --git a/client/resources/hardnested_tables/bitflip_0_051_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_051_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..3c889d07cc75ba1944dcf73cce55cd0da73b48dc GIT binary patch literal 2568 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 Lc(o)tu)XYm{7RK; literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_051_states.bin.z b/client/resources/hardnested_tables/bitflip_0_051_states.bin.z deleted file mode 100644 index 0b78915aad9061a73fac374c3f78ba836b888c8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18194 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 diff --git a/client/resources/hardnested_tables/bitflip_0_053_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_053_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..751724d3d866193c6811d7a55f2d58155109fa41 GIT binary patch literal 1356 zcmV-S1+)4>T4*^jL0KkKS*>MckN^}4|Np~X9UbwXuQ>>~;~$8Tz#qUJRS|$4T?hbx z062g_?1|tBzW@LL000000005QKmarv4FQ4xXlbTEG&E_D0}wO-aL@n^27^FgfEpTU zkPQtQWB|ks030*`13{qB7$63Qnq&h*MwtLH13(82007WvGzJI(p{AJt(9xzq3_#EU z!$1Hu8Vv!00BC8ZKr}RIkOL4j02GxG0!)dTDY9t?r=%K<Hlu1Z$kFKoPg6rrB0Wu% z)7niMpH1}WKu?oUK0KbnJ%cQL^nXE*Wga9~+efS>6yXP=9YzmGekJre6QNjO!Qe3b z4#CyY_uusDb~{E#z-BSPz2W#qFGX@PN5F@W9G;jsDp+KfsFld9j2FJX!!yi%voEf@ z0q+cs(7Ro%&v}j&!}1(B9Y<09?t_JQrXKnE9m}ab)2dzxm&Cd+%01UcW1`2PA8_E8 z0&pfrX?sl1@m_Sv&<90T!e1+d;W{tUW&0eL<rtqqm5$_ig*%trL(^n*CqVErv5b$v za#ti?$v9Lj9zlq~ay_Aie)z%2;c%n)7b}v$<Y8fh3?ri8Wy<px0Qe8YebL%os<NHI z=YE5Q@g^_OG5$h!gUA?IVvkKLfZ&ewICK!p++ITHa%EYS9g3*NQP`<@%Pcu7g_A4{ zrdbva)nn?e;r5Y?cby9(xNulw9Ih8B!IuND#g|peVajz(8F(%X#n?{b;T{VgxbGdN zEFB#V^u>d;<Z^N@<<T(548E2+795kR;KvRQT}~Vr$(hTC1wCMR35*BGu)P6*>>MB3 zJ>l*ghm2jR-d)CC`D8q6m5T|&#p5p!c83M(FI|4~qU;Xy4&xR%SmZKZAn05UjAH+T zp>XJQP97qj$$U!&OvWDp^BkNn&Yv1`y0WtRix^>+84swuqx{dR_gS4$`JbryU89rC zcZ0F`&JF`Fp?zb3_89vsE*@8j!}GuO!`MYX<sV^TWrhqfhpI1NOgbYhCQBtaSi=k$ zVU%U{k#LaUWtJt3NtKw)%(0bK)Tv~bRd6z{QoWF3^}`$m!ph4RRl?zLaK;^`I9XgW z{YA>SGxK~rxiQh73)*>Kc>f1$wDb$Pe1oHhjIwYX6R`G|`Yukz!1o_$UtLcHn7DBJ z#U7yX6RIoK9IEk?10{)mwev0xrTpq-#lkXUEKJ4JFpQ3=)qkq}FO}Yf-Yc+q)$co= z1b8LYaIcKze5OuNyo$Y1h8>1j%PtNKj)BN<eCO+3SI)83dB;J?{>OsgyA#n=due1Z zC}Bn&33;AJkY$%q<Q}tx;LF=doEgD+2cj<n7{)Q>PmJa19#ZNu`QEd=JP#W323b8f z&~S7~)qU5_@}Gt6zK8q1XL;ZrGbUUl;futaj#CUdRdVE>PdeW_vDj1B9jhEJ6^2$> zn916*xHud<ZmXdEi=&4_=y{p@T)MiMkJ@*;)%H(?3QB2E7w*zQQu<Ly)G8G8tAYw; zkOh&7Vq`>PBABl?2wWt{RK;agVPd70P%M>Ul*$ZK6-y*!Rgr?GNXZseWlUL8)J90e z%4&=mOw3F&OktHWm6lAH!enBsS&@Ze$g->|%*Mrv%Sgr;$}AX6875372BBuDV+=7F zG(m={88WOH85mfm2+XC7rVOF07P3*9lNJ^rv4%4;OfY4cF*2}>VOYVHg3K|IV=EXF z7|bRzOtM(TR!lL4hC*gc%2O;xF^r^TlCvu^V;N&GLoiIj#tE3S48kTbt1^`tj4?|e O{x0N-aG@bu%E=&1w`zX? literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_053_states.bin.z b/client/resources/hardnested_tables/bitflip_0_053_states.bin.z deleted file mode 100644 index 700af31b9b53a36ccfd36fd5de5d178e5cde313f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9176 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 T2CIR>pS6{KhuziWT%Yz|$PnpY diff --git a/client/resources/hardnested_tables/bitflip_0_055_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_055_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..1cf3f2ad935916102ba1f429ad761ae628fdd45e GIT binary patch literal 5503 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_055_states.bin.z b/client/resources/hardnested_tables/bitflip_0_055_states.bin.z deleted file mode 100644 index 307828e6489d175e598ab9ef179c78ebb9442fa0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27783 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 Cw8Dg$tJmjW@go|wFWr6YZ1vfw&2QTpkdi4E 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 GL;oEL7^Y$X diff --git a/client/resources/hardnested_tables/bitflip_0_057_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_057_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..099cc0e389fb33d6f70aa3e70a58abd6935c23b3 GIT binary patch literal 1890 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_057_states.bin.z b/client/resources/hardnested_tables/bitflip_0_057_states.bin.z deleted file mode 100644 index 3e8d1b279c492518a2bd1614cb3b559a67cc5002..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14121 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 BpeX<V diff --git a/client/resources/hardnested_tables/bitflip_0_059_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_059_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..fea5cf3e8286222bb847d6e2c392d72fb2853361 GIT binary patch literal 1820 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 KaG@cMl)5;~NPPPM literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_059_states.bin.z b/client/resources/hardnested_tables/bitflip_0_059_states.bin.z deleted file mode 100644 index 1356800e09d8cac602a93e29e857d912eceacb56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11331 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 NT`HUI`O3d-`w!d*`ZfRn diff --git a/client/resources/hardnested_tables/bitflip_0_05b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_05b_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..4dd885ec3ec6446a721dc82f6a42858f71069e03 GIT binary patch literal 1077 zcmbWr?K7JP008iZ2sg=vA{V*y*6Ag;lS`9_%}XkVq26^$JzW!t$k7_h1wkxS4U^@H z#!KSRx~S3WI$XPOXFQTrB9WSExt?=T)_NJKMlnP7VgJE?AAb>7bAzej5Fr)vc~f2m zAPJS$e_rNGs{(DB!|{L|a0c9M@!`%k&Ncwx;Vcv5x0NP)D*zk;DF9#_q?0C6<amTF zHGn1Y`J)%G`+wt-7GQsK7Wj|tot}2P7m36N`S(K|%Tp76?*B93ql4mNesbhodwytQ zvaz|(+JQAsr~M`HdskWFyB>D6&?{!da13>ROY^MzX^XB{E;_$#jd2>>4x{cm1<#1! z4Uv9MXX)_5DB342!(%0KA<j4sy{SNGy$Ux=Xb$E0Exd|i=yEVIiPdw4z2C7a3y-4{ zoJYVk+<ZAB&oG+QG(X09QudrC*A)iwbJm4AxgTzhOaJYhDTB+gT`xnacZ=_$4(SJh z%bSdXS6qt+2Blfs2@0k!II-6=vrbW~4DzZ{Kvb>;U0{+|!!+->F#J9!EL=6qzrx$5 z-d=t3nzxp%Y4ddgcS=3E)&hszL#HD=6S42NuM|9{?Ad$sw?xL5qQ}T>CSq@d?20b! zQf;`_d>HosRew+Dl`uAC4!f>BM3*N+FrTt@0fq%_fzS3sygyqS*JT<?F*i2Tqv?^2 zqg9L0R}=T@1)tW1cjr5GyC<m&>?6(`($uGU$Svm6Oy%^6#Hi?|$9w_RMXYowg6Z6@ zwr8f37@w85$rmj&$@dRW7PNP>cop$SqfM_nzmx5EHY{y048Qao1k+&Yps*E8%Gt|| zmFp%dBa!oEm>j4T<T3on!^m3RP!Vav-(A$3%`5&yYjnlME^_XJt)6iv#XOP4XXKF- z<eDGeb~qN>Y!>n>q;=oa%<`dzN9AavRB9Y<ED1?^8rtAJHDWFdd12-WNeDOqtJWsl zEVkp|o2=9b=fP?R#MuvBnlfCY5Z?8Wa3y=h&*{GH*TlyTug0eM#~llk)~dhhb^WLI z$*lL+NaoD`77IBhd_t!(F)*jiAC+q~T*{_r>@p^vS`^~iQ{>H_sUR<~4VK%OoU9!h zlhbb&p$|s&-2#lX(L!5VTB_xZkM_sScl$kzs|g+ubI^lawl7J1tAa~N#e&%i(q&Bw z(UF=Kb^XfodfnH0XZ7TzS`-3>a+C}ckg`VASy`W^1uf534`h=hm&9yvNO7hGOsJ`6 z1q?LhRueKbV7394;Yp+k_4JVJkvR9kjEg!q#h@o?xw+aKV!a=@*bcervGVljC=v^z zWU$ma0ys1s&2DvL-;q-jK&+&XdTRhg!;%(`iwcF$m`sqhLJ-)a`%$9qrKEG?(Ngz; hNr-#d5GAu``#bhhI7t6<gU1Y=+e*Zj)%81e{{q=@^j!b| literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_05b_states.bin.z b/client/resources/hardnested_tables/bitflip_0_05b_states.bin.z deleted file mode 100644 index efe41d5036d3582bbb56024b59aa010d317fb9d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5875 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 diff --git a/client/resources/hardnested_tables/bitflip_0_05d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_05d_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..7ea71a9c6a21618fc2cf146b821a0502248669bb GIT binary patch literal 2472 zcmZXWYg1YW0){bK42HoN6%QG6u_}t3Q8=_6)_6%`)T(E_aq-a6C<hLv?aq$wFixV0 z)gYk2Y7{}}CiSjW92HEbZZxSVprG4mY_^Hbc0p}M9Zl0TTGMXKc0cbk^ZtNm-Y?Jj z4=(+Ic}_s(2-5B?y~N$6y;*<AJE$7V#T{+M9mUoCZ$1d_5H2&;P5w6y=e>dZf4sfA z!#bwDI*wn$5%C&@>@dFO!wwwdICPwN`nXqL4Q}ev+$BcMCH$v2FIwL95<)jlc6jQK z3>qzHuJ7<-(DFCC@BKBfvd<9sdNB7ZM<h4)+g~s4+U*KZ5L_<c5j%eZ=uhI2iaY*Y z6FC>0NU!{wO1qQE0ET#I+x5>kgD?eXnIzO>Hx42dfZ^W9&x)(Q;8?}Q=MTECZ<dIn zKl{N!|7H~3=v~Tsj0w+N^;)^ZM~oOIzV=i?crZHiYvaSkHUIRd38dwRXDUZ8Gj@sn zcwWU#?i!s$@(qQDnLyc1@E+lT`1P#yMe^A0<&y*3pM9;&*7mI4fro>q-JaQyw={{) z7fD|RD*t((VB1_yivG$&LpqthmhPGn0@_bt$NCLNtU(q`0y_;0pWGf;@0scgtCz}` zSwyk~lPf>!t1#|{#;0^_{>M;enOWS?B%biM7Ia-M^6k1>@16u-wO{#}JwD!kY<rI$ z=U?6y^2BOgRwM>1v$}uGaX$|O7^mL}(35I6(rTpHXFHk*X2#>1)%Fic2R)kcd&^t? z#-DROeKl;~OPUS2ZvC<9`?<V*oJ9v;PjUy!!Du@qN4%{`UbQWd7#h@Mon8=|Q5(^c zD^y4T1j|76+##JD67wZ|4vW}L?DspNCibOJGf<ahbYTb**1M(*mT4z6WI7V8vDdpW zSU?92224w*X(^~AOdX*1hRlC^kB?5%R&G?Q(mUbS>Qvy=ASnpFnV{Rlb3g=w?Dn{` zHj`WmNCTv)&}EufzyZf1a|R0O;S>%j5@n2e8Cf87lhdG?k6CbPx|x#Xt}-VD1H}SN zA6$`F;45LOqn&MkT5yYns1xH09EFrJwqX?=$CLq@ab!xw@=eS6Eia-FjCM8~L`NNA z`tzdbJ~1Cwb<?zAS`ZP4=uunp(DQA_485&_bHJ2{%&=ph=px>{Z{;I;@H!LI4E9)h z)#NljQ%wi#Tq{OIkmxyp0zoEPvs@*pae{n&jHOqFXh90h0-0*CkDsStn8ow7lHhu6 zOr#3V7iKg^Hn6$30yJj*IYp#`iIUMFXdw+`GUj8do#^M&CimxMy*40oO5C#1Y9<nO zbtQ;x1}KZVfMv_&>h7iJ^dL5XI(f1URn$RGW8Ez>g<;w5&52+h!RMMfc`c2>ss*Ni z55^3Nc{Q@B1hwmmK!iu^hA%!fVp?#F#flH9U0*QKnX2bL9^wFF)EJO-JIk4gWr+Ft zBkSt#2U;No*GvTknC*tk(0O%fj||>R-6Mx0Qj?5UHl78>x#74uadPc`DEGxlK1IP; zV<!x2oz*WZs?R6Hr9v~kzxgkEDtmU|q^7(_8$%Q9_J1(tE1!g%dx12G_fDo?*oBap zCHY0qGI7>oR*on5KV=USJwl~#?UM9)VMyjgNP4QrALpK@77D8poA_5QY9=)&vmV-J zNX%!6p=9BA^e;oR!L|5g&cSE%Pbyv(!owgm>$mo3lYP-dv$k$CWo(B?B>~EXHc6a# z^H+=Kr{sd>mFH#H6}TWRtz0CFn!J{7Z>pa-lij|#J6IL_ZP)nSwXHb&{?Jg<TR-^6 z(N84KJYg4sdlZ{}+rEA$rOEa(TQf55sbaYcOO=_PWtGSNV55n*9JAlM)SMWw8`yJM zL@8bGd=?lrP&NT7S7IrposVaUlDMg%VxPHRz!96!eMQ9ZJf4LYCMT|(3Oe{W%Cdd8 zK%01^vDxs8{)7>EbuwqmTrp90)p4=kJ;J*jRjX-AvA)h$y-ezKyT`{%y#eX(WS{ar zxtIM&dVhJAI4ddr^Ub1De@_^B_^kNCeHB*OzqEBPOZjx7;;v_xpbQ~J1vb1IDzH|D zNXm^bvQMo$1V2@MYfnyDKlSeRWdC64qw1e~_M_(Zm2<CW$NEPd<w@cF*-ewuwYa?R zWDob7!dEN$yYAaIR*Mo?%C6^@%DBm$ttvK)&0Y&FthDS(O=@+Ir*v|2*|k^v;o~g{ zbg;I5vcTLn`YL9m84nV5E4y3@7JI1Zt?JC=caY)>;|5)w?PeM^2cNNgB8tLBn>gm8 zL%-kHtA6I+aZ5F<An6o2%I)0tvt*z2kB<OZAXBI50UR8_#y~B)I+uxNBs502V*v|H zxE7EHm^AH6++S4gTQM6cz4W*3Eo^#^ZHHHu^0YapGuYN9q9VeU`J+xfDtyqfnPuVJ z9>fAF!#wb8SJ~>z!t!{jQ4ce*7ORX7TI?E)fzp<(Od&N=7B}OIKo$}Hx?$s@ublL~ z=1hE^3{bT{I?J^m_za})SfiVsM{wV;TVjegQ_tVY2x?v#h#3v~&6c|w(-))mVM@SG zwI8hTJ)D=<5Opk#YvD;i46#hRW*|&~7*HcZMOZ|eJq4deVG4u_ctFDm2LXet_+NpK zY($ADSOtNUk~x<moXmrn3P9}0qG+^-r5TGYt6V9e&Jn9SwlT(l88g8xDC%lxXhkrc z4mO2py<_IY=6p%!d;n}=xTvrm;6wSSYbH#f1{!2!P)#(GvwUX2X-uF%O6)px&H*@x z9DKf5$8c&W8Z&?j8YG#{mLm;h9=(=HX8UHy@MLJ9#l|_b`L;By4w^DC^!#%wo4K~d z+Q15@dg%pJI%tN?FcnD&at-y&*+$>xzhf{Ai5<Vo(eV^xiRswr(13`^31|>gviyW% zija0-D-UX9I3iFBD_Fu1s##P4;>3&?s6A@e;V}gdV=!&9+mTwTAbO`{!NIKmn(e`w zjXEPDUVt2^zGMLr83m1ygcTCXW>JMRjj{P>xVLImn2exPkqEYMz%MpD!d^Do;~H+D zl5Eacd%m!_02QWq`&l}s9nh$mfwIiOj|G64PsPAN7dmRQVU07YZp9J&`wlqDyDQ|Q z{EZ5eZ>H3!^->2bPH!CB=1n*1w17|#%m>J2ASqyR0zw>uvfSxy^Wt{4#utsOv(jXT t#?(|_zfFcRRhX(nC*VUKVNoN)In7Z7)=e==$o_9a{*ubhz45;?`!78MV5a~8 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_05d_states.bin.z b/client/resources/hardnested_tables/bitflip_0_05d_states.bin.z deleted file mode 100644 index 2830ce68674c4d7a2548ad10fb6bded69528c6f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18417 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 diff --git a/client/resources/hardnested_tables/bitflip_0_05f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_05f_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..bda71a64e2f95bb8fa9d600b29c13fa68e27ec6a GIT binary patch literal 1448 zcmV;Z1y}k)T4*^jL0KkKS(fx@)Bqz{|Nr$@L9>bUK@`9d5D)+mL;!)90r6lFKm-&y z0Dy=91K!{ZKL7v#00000000009MO{#022{`8el<)!7^YGhcslwzy!o#Mwk#{Fie;P zVa*vaFaa?b5vBwfj1wjS7;{EUOaM$q1ZjZ=BLvBSMjX+T695wtff`^zh`};o5rIic z5RFDgnomU3^l3j*JwwT<>VBpuVt6U$si*f;LV8Z&eJ(zs=Reu|k4kr`#bGk)eapFc z2Z7j*50vP~(m3d<?_I<Gp2x8AB|DEvS@o>HtMxyltK40mg7&Z2p40L_(C{x&9;3># zy(#BElKK`udg`m%`rJeLK4+Bjh`t5#od*|-51nKB40#qW75Y9Ff9vOXyOS7U;<$U` z^gYq|A2alKj`e+y$@#mTPrdM};{OGg2ZH>Lr&qOlj?1I5kEv7l36b|NnTq^N9Akxp zqB@|)MU=5j6lGRiI=Y-PW-}P*oke8ItYTuAGF3cDkxLU9PXJ7(aX!Nliz#K3EU}8r zF_pxfS3|LsGQeXMmRV&(p&q5xVUr<&KJu3ngE5sd2MA<8vRPGOWUBBfb_(J^${&h5 z2YSOMTmj@}V&QaHjs?)H%ZrM`BMhmGI2mPwj4Uv?Sz{fMaI3*MJBif071-crCkumt zj9p523B_C&R~ea^oy_QrWn|3koEK#1%ZrT3oktu-XGRDguX*;KXNll(!=d%Or*Sx9 zn0$-4y=%bF;$4XHI|<az!=o9NdRdnaItkTdqYmZRo$uzb_}@6sE5yl$Qy9hvl=Pn& z?lR0TF?2ef>6~9t{g2S-tFY{4!|)%1?_WZHQ^nqQyDv%ftJps=-mh7D$G(T9;#Z09 z2kknX9};#rkIc(2FnlY}zSPIw?4JAo59V}FLE^l}pg(!<1v-bwF=dR(#vX%*yqym7 zxU-4p`}leo`X0macsnO$$L(KY{a^BSd7gH8oenSJ^(^~G<olPb?@se4Rxj9>#JCwa zUi0E#z;SgQlb-5s<BPG?)O1`p&Zb;=IxFBhv!U~+QPI)anZ_UL?sPNOIPCI=q1pat z%6W%H?!I?Z);$Bn?_T(LIy;wT>pe$Q_Za>H@-J}9&^`cooy_d&x;h+B74jVy=6tVt zbUiH0nVFZ7<Z*Ol^qC$h)p(p8&vAMORor$vIxdGp&h|1srY2!nv5LAD7^Ve-xhTdH z)Lz3K6<iF$#XZ+xJ&Oze6fis2d4kM~xM0FpL{>`nB;uV_&>c&mJ36NnaCUK7Fra&K zqN4o)N?z4cmBc-{RFx<HB7bu#CMs4I86zc&77VatrHrOCC6R_qhB6sq$&rdoOBt3j zv0}p*W@ck67+7UkOj%gQOC@G27-K9l!HWTyWrj?wQy3;oBQa$#!xfClWirMrrdcq= z$(4*VQ!PsvWtL*gEY1WBs;fwXPpD6iDb)dWVi}68nOI?9nOT-%!xfB+7AqLWW?_<< zF(yomWXmNuu;Gkj7!t-zVquIdW-?10ET;n`WtEu4WWvTO$g*Z;Qz?pY;UkP0jLKz} zShFq^Wy30|k};Cui-OAxmkGr}<08gV!GjrCOsR~_iw0vc!EmVIgE7Yd<ApI3j10+Q z!GkGSCk2$aR$+?DuuQ8JFvBvlF_#Aw6NxgGSjCbumQ>>=7!DIGqlCCr<0@H(GA1lc z#b!v%GRaJsqmn}u;g&}!Ck4YQ##wPLCRH%FF@=;I6yalwhFNkPM-wZQlPShW2+Fll zg{o5q31%ZQq-<zlQH-Q<F&7RF4kr}imBhkl4k}z?m6IwsWy2X*C1sRk;NXjnIF)6A z#foK;S%|pffXS3AFiVC=W(wfOV6lK>6_YH%#ubdNF(l!Xrx{#-_`8xR!i0pkqeh_b Cx1gs0 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_05f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_05f_states.bin.z deleted file mode 100644 index 890893050dbc1d08b2158664cf15ac539925a33f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9377 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 diff --git a/client/resources/hardnested_tables/bitflip_0_064_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_064_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..3bec7c36b875fd207423affb005f0e7326e60d4e GIT binary patch literal 1324 zcmajdYfKXd0KoC9g)40@yxP0o3=hlGwimcd_MwV0LCVWchEO;c(7R*H^uv<65EMZI zv`1f;szb3e8dT&Vka?HQq$7K@M-ND5GECe;j7!=D95Wk30!+cl_Hp0#|M>g-FMa>i zKBDA!UfuDl6+bV@2LJ5*XlMJS(%lVoCxzrYAwcE?4naViI|}Up|BV8#zrC9Q0NEuF zI6YJ{vIhX(0{#bORaME?-`)Ljr3gNTtk=(fFc`d5Y_`?+$DE$ky}bhfe!12?`q_DR zWP@u;SH<$n(KmUzC+L(MLHQNZB~O2tpQr%w83gT^duQ(cdh;w5X-5jQGleq0xSo4J zQf;c_a8|mfM&@`JBsbJ=)T<emS5TY!Vb_QLrAPJ^o%&Z}`={-frsYU_Qp)0iif2WR z5FU7u!AEaE8ks{YnX&y?K16%M)4f63Ozi7?ZKfYB_!BQa>vAd9(iL*&O5+*lD|THs z-x%4Rr8=XLbFMLTuyU$ETGRD(CI!}tzgVblzxE|pAkEvSVAij3frzR5W&hKnt6hf^ zB)=$9)GF5Do9Cm&pKPh;zfmrqtURlDd?Kf-<o7fXQ3QpKi@`R{lbVusACy#b;g0P> zDNEOfK!agZ$>60ST%bg$T52$~ASli-R7i41s`@l&0B0nc;*fYMjYyUHveAH0<;3wY zL*tT{tMW>o9*-U6ZQj5Hs6pv&!rOvQLnI%OJY0hbNti|ji}PN%o*5Uk9g*+&JfmRg zWk!+_lUf6FW!$mA_y9`aG*KOeD@uy0SqI9sfDrk>I|CZ5Ca49(sN%Ke)W0r^O}UO_ zR~+x1REl`*V&itEJN8H|pyMlKIfl*<1U`7XaErYE`iO8Mp6Y|GM^^V{ucl5o>*-S7 zH#d;W66m$ddGb^tJKjS@PTnquOp(mfz7;G}=3g>wUFnE#PnjPbvl?mwE_G`A)q~8v z`SG*a$>L4U!nMF;vlu1&)ICrAa7Gv{2-8-Qr}_md4YE8>*FjX+aoZ!#GQ2=72SyJ= z#FpZh{kq_4{u#Pm*;ZIfERYa+E9_zD)+&z!HaEa#i%+!yx7H<5(-HfozvmCM)AhWw zX3y6@5NWyLFxen;p9-S0swH)AG^T^_nAv6z9+f{mA&v%3za0RUmt*@ujCMhdmg&Wg z>V$RRoH9{qbD~~OOBDdj*!CgD$Pe4)s!=7~4160h&1LafZCX&q>Y00J%EJ9pj4WZ% zDMZV2Hj$xdMktH*!Mz6;gUrqEp>o8?kIK<$)*CbvcGRi}U8?v=pD7eP!+Et@n_<xx z>1c-JM{-%WNH-Z{c7|}phZ%zQv8*tG<Y5hYCiveSP>d9q8Nvslv()mH)k1w?mOt4( z#J3&`Vx(V@um*D^BQc*tN-=USNuzU5X?_fMwvJUb&M8UEh)yCnP1|U~IDr_ja$}i5 z=ox0j$n!W)dnrgys_<d_F5^KRFfI`sre}%w>d8sHSETsKy3J^`jEraNQp$IYZS;_( z{4i0*8JWiT>RNjWo`BynmuV6pK+2gkR{s6sm^D#51R7ZHFin&rSr1y&ax}NcEiiZL z*f={=r;bzlRIJx-J1VQUoAns%u9K^-MDK=;5irMIPc><SIb>dn6*4ddnw}=Ocfc4k c?~3vwKinI_akYHM_f^)7y_MBND{I~V01RXgWB>pF literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_064_states.bin.z b/client/resources/hardnested_tables/bitflip_0_064_states.bin.z deleted file mode 100644 index 05cd17e54ea29edbd4ba0f2244a43a06dd2a8cd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16059 zcmeHtYj{-U+3rx<jc!|`(n_h7@e(zqXoE#X%3)!tL<>4nkcbF_atIi4RFDV>^QM(8 zmD7NT;UHNcwc(fn0>l8xLWLYi$TC1OVFFo_(<GS;<IH3Z>+rtMe%?t`_`YxNeSLrS zudH{j<jP!Y*1U)Nxu5&FpS<VxU7fMC`S*u*UK?~}S>5|CQ`I<a%*l$DBcabe{@b7L z7?%kz&uXaO`pZA>`r?kie@nmvOsrp|`T?%YdM|b{sMIH9w@5BIy<VXb3p?Q(mfaE_ zMc7p*(c2|pq@G1fq@}-*T?Et%)1leI#?*=P)J3Nb7`halQv@`k5Lj$`=(n&ZN~X^u zkYN`|ZE^Z$CV7d?@aLuZP85`khjuc7j<AOu&wa8E#G@-Bsv;}UUb8(0t950LK?FA3 zr3Bf`8vFFu1b;bX&w_tOMM#B=!|;gDX_!I044VYC0xF>03YvTmWY?0vdM(uv=_s4} zI@G`=XoeOzkE6}3m$G(6GkeJyXe62i4#E`3hE31}D*v-xpxN*ZF4?-6ZVp=;AQ4_s zrM4*fOd;oTKnUvlG-3%zQFtw^=;W|i0ozHNVpt3(<3omg=#&hziZjBO<$hvXHsrk7 zS_jk48H+-06*jrxZ6-}o$)6zaD%`22YzJ2+%X+>`IAeczF0495Os1cY1@92%fj)=e zQB|5BiT)Xe&t<DX_Tf6ZN1r{AIag|R!rZk`F2X9q5ffQo(_NKt09VxSG)sRC26sS^ z7^GFhxkv`i$`lsohsE1nFwYA6St*QXrG|x>O|w}d8vuQ0<FlI~MuNF`o^TdSru&|y zF3t4~OWPrZ18R7{TA|B$1h*-Jz}{9WzX_%+kQb7(U<f9>9@q*4YRE%n;9o}~2F#+q zU3cfQekRi}JC!x@Qdsapn?Msz*u8itEpXx<$i-!Opq)=opm?Wg!g=`jNVttZj$gCC z(k$hgb6^DWS#+my5c---zy1>|fT$W+gLCW>nd1O7#LtkQA|7BabeZvkK|`cM3-}-z zF{XP9z=@OG18WcvD&ddb@+ge?D%L`_$#~N*@Qq1NLVxI+WmuhRQqTkCR%T_msiz-q z73%EvOXRHAaa}aZ&23MC)UXxoW3v+k=T+kK=HgbVQbd*Bf}wCr7PU-=X9b+hVx0sn zj}VoF#YR21DB@12FYd}c%7W3%t%G&JITJR9($=q&y0oY!?X$nQ9459{z3ToIv|6_Q zi#dwn0sY<#=Gv^8cadwJgl~k1gI+9tKQcMsdAP|OW@{i+!nfca$q;d1EL?<(9LJkl zp-=NnmPWI~)@CuCCVez2OVOHw{iiAoRp!_8VEuc5_%)eALO_6oESiePQHG1dm(@rZ zM?FvYn2^>aH{;%%hrzpO0o;S<vjwI@DIijY)<aGN1V3r5gB@UL!;kY32aVh%sBHZB z17y(=s4u6Xq+gRZ#;2L+g36|Trm!?PviOLW?DvT2nJfVk_-QmX!(cgS;HyRl>EOpR z{4CVMOOVL$IE7rcAH%yGM}R*Emzc!N53)<MGJH*)WDQHRk|msjUR51mQE8B%q>)ht z@bd1cb)U~%vj_5Z<&g@nU-xL&23pmI7d5HIQycrM{d#GrkU2AL$zYw^P#!WLgyEN^ zYCoBvCo)$9Mzy$%m9iiyky$>*5`F`Ji4Q=+eSx3c=Yc1oR25#8&37z<zEQzfjx#f5 zsa9PTL!{4r4(d2AxngFI6oTd?h!56p*fTNVD`s2Q2x}vvp^`(Kh!RZCOoPMB!6SFX zaTrqr`7XpwFcE*KBp_hqei9ZJ=;GVdshJ@`HHQTJ&@cpS2uyWE6;y$VM!TS1<ae9O zX2LP{_;DE8p;+~td;cVLxOMX~b~lv|!uV4#HNbKUh-oLwzQE>3Nq6)%Be`B8^LwI~ z%%zhkp3Ke_Mj92vq!y}St!AU5CK=WS!@3u)0a7Mklm+^jOj$!hQvV%r3qMPK4Vyzt zHED)BOsc(Pq95ew(ma@V{xOqjTw_epB~NJ*at@xPaD?R!;<Wo?_*xC~Aku+kZvL7T zv`PD@e<yAQ4C<7R9C+-_n5zGJUK1p}LCA`VbCj+a)S<v|>MsDMi>ZrSR6#%4#hmnH zg1+3h7L@dcV-grw71!LO50~b_Ox+`A_sM|;)LhNh*&*L8gc9g>_z=Nc=(8<FeBZ?3 zi5moym#lAgq`IMSN#^G&Jl_KC#>u6S+)P>wg*BC(V)<KXM;S|42FOmC%r(W30fS^t zkeu)IKgd$oQ%ek1BAs*(Gw#n`FU<785cWUfyM;fVoJ!tiawN6`nvkhYSz8;4hlpk= zW;HM`L765lH@d9Mf*`?=;6Z>NnjJB0t(5P7_jQT1{z*F2W#m3vY6Ba-cN#&QVCp2> zi~(v73N4V@pIoCCF?dSfgmjWUSeK6aq)0e9ir`k>r?C@NemOf!PBvrimbyH@r-~j; zo5`7VYgmaP<?Qwgi`d;K!P6EXF}C~Ob|pCHmo}TvGYxc~?doM^XsMu44_t=Yh~Q@P zMT}cRP(7PD&x;Xvnv+>yh9L)qr|aQ@Hf1kO!KAebNqhv3-K5iuY#A16;h)_MKLgW5 z5~ku(1bcV*JCRJ&Y;kt8u-!%E!W24m4)f+R+LbZ%Zo(SM0+J?0;S_$##&#B|V$4eU z;L71Lh6_d(e~ClEZ}c^_sGi2_N}Y4QM>;i-d=g4s?OnB5cdnq<x?@|0jvr&&`j?*5 z?IcHO(FOSVLQvt#_lL{LGxu$pIGWuB8zsYB2j3Z%c4NPr^~bcdVJ<6Z|9Ss2@bwkJ zw55`bIBCbg74iY+l8x){yOZ^Q2|hdy16{BeH*GeOZ!;cmD`_Mc*OBh?Peh7mUC7fW z(?>3Hko>|2t5u8*;<1jVhWbt*=F*h0B&{W5l*d-osotU~0WEueR5(fdnwXGFf5lk? zFPx5bDr~(Eq!H|L2r|M2t6u(8L-d`FVXh{BbD^5pjr`lDb?YSWn}(>FnTQAs;=lzV z-XDkUtws`m9KW(|^$HJqrTKLrYs&k<0)~^E-4;`ra%0420AI;XSk5XBkqCSY1z<*? z`J4)qf`Am2#8LpI5I%Z#i4nb}DH|4!#hXUp8^f-}(H$g3tx}nYd&tQWX)%8b%+}S( z@GGZqf*<qFeiW9cGF^RTtZ`~79CLE1)C_J9d_|qcU{gexM-!>x-~y{$IA*j!4O#8y zI2GQ|FNhbk3MDjeeJ7k+N|URcBcEUwyowk0X)m_Zq|M}@$BD5ckd2z4u}z)novJmZ zgREr#OBBXIoe;6;x4V<iiur5FB|V9uK1I^A89~B_L7qqYMA2f|2K_dqtIn{smTV*q zVd<IcCcD>BVR>Oi#wfC<kd11j#E;uh31_(4iipUVgX0)Z<j4q%^+$C$uuj;-_XZp* zBMP(O`OIdi6!S$Eb-n=^Zoq)pItS93unWP)2g*KE*654StS9{9FgsSxY>81>nr-aT z`835>V7S9<x&-U%<nj)4kw_W>s?eP-)@}mFXld@sz<xw39#7>jVFt{hVhpJXKGmG@ zh~+Vh&%q^1G4gS2N`~*4BOe~oFtn;E3glHS!vBoIawF48eOFl8x(2fMIGMVe$=6B2 z!%oRBdRL`pwq&HV!!&V5(@?e0EPFI5SadHX8<!=@<S3Kp!UPEh`ox$u1H}w!Rn2+@ z3>0*kRlvr$3g1LNGK8!%w`G0Gsnr83$B=PHX~GpanyB;K)k=IGQUyQD8qLXSRulOY zsvxeIk*;FqEKR;8AjKRAi_@&sL;mWq)<ndesC^#@NzbKjxsRD!S)bE$Bhuw?1;*@F zdV}6Rtyzvz`3q*DnA>$5OGLH9v-TP;?&ApHDH|1cBhvYXQ>fU|7C=fR`D7j)1&!^P zs@9ZBwGdHf3{~n!67M`Y`5Rd8k{&w=mwjf_cQDfDjETUNGfoFS)8wD3P!y1JK-n*i zxzu=x$9ahpW!t6`910j(Pq})sczP46@b3^!2&HTcX}oh>^rG~warq?kNk79s<JVio zESSE+wJ~gk=cW*Ku5m5wT*sUXtoK8kZeBt0rokn!G2m%y8i4CUFq@|%Y((7uoAlby z|5C4=q`R+2Prf{jVUjsKNa&1bas6$De9O}1ri|j^!D4chw1z}lkYiT_SArZn7tOl> z2geqaqy+mH!%N8?X+j%JirBhzv6_7d$421(rslw5Of`X<Q+YY`edd&D&%<zKE}eWn ztlLV&dC=adz1o5jQlh0_GSMj@qS^&aoK9*a-OswKusAT<$p=TlAa8anIY{D_&A9bl z@+~@9E&Y&!Z?CcT;0!mW`9oC4J9NVq;MsFoSO~?i))7&u$D=;J=cljqKi#bJ!lwJ$ z1FxXwzoki>ZbX2~gG%_#d5n6~ec)Qe)}UmJrwV>z3Ff;MLcLblMUzNz<^uTmIK|q_ z_nRCi%#%M|uVGs8f5{%Mur<wVQJ~1|?U6|t!>`4Xi=ZN?>2~YERb!4%`#)FazTbXX z0v7jJ-SB(-(ADvrLC#YDqf9cxR<CUt<h?FEd{~S&!$c=Jqw@;5s181fq@YldJFz&$ zxM_hdC!wBoFwrY~9?o5$TVE!>KL%Xt^E}cDt)$CA=RlW@I>G`^b+}u#$Sd6tLWIU8 zPX%d1QRpmW=d>h0Y$ADvwM!SO{lYvM%<764sg#S-k{s6jRH~D)<QKXy;xK>kfog<c z{&d7^9MMSrL<%LCUfCcNe+K^urSJ2AWfrRW{~+$v@n!R2d}m5>gp}$1OsBsMNjZ%K zOJ?1?3DV}1q%L86D~bJ>{u!r><VYIREG026@5@lcAe`>|(vUSFOi+p?Mug9h97`cJ z?|b8-&kL|{8nnMft&y<QK@6dpRQ^Bm{w2cmzErEuFpF05Wo*2xd<I=oG%CK{0G*Kp zQw%<hq;REz2pad1N+#3Pe;CjZOO?T2qYQfe?Rc5h#8dpUGqJjMAZ_pT79dkune$`- zk0wU2{N=t%x7563*tUhF9*~+$4;_Gy55TrpLGY4<bBZP)1MO-e`c0bEPYEwgcyYqw zc>u%YAsKby6s9nOTCPB{>u?UMZcRdk)<a|iL(1T_R+g)xx>oQDPp{-<s;LaZ+u(kj zR2)&bsg<v>_kEsZnsSP@F$CJ*2X%pWhwAq%R=*3msjJwIVqgQLiEvv~3OY=6@Nrn| z3ZdXCKwWqV!zcxY6cd!A^pI~Nnnp=P&K`LLLhi76q|{m$Lqt1ae@DvaQE4hWmLs`c zW@<d$fxKrqq8#>+nS0?*ZGfGb5W97PZ`1<wuSnG&*<`;I6Kq_zOM&mp){!(0VqqaO zk85a=YRPnXnk{p|{e^vF2ZcWfPlbIxV^^!@|7R46kk5Z8?QXy<R@axvn-{M`{u68x zZlGcace#l!Rr9J-3?pt#5$Oo^F9ZnjqC-)CEIPPY3{HYge&Mk*n(HB5+HpmIe*{)t z=S)Q2q4H?E=>-_|nvl4kblKUmQV*sEe%QmFXF|~U=*|)+>-KV{7(7Z*kZKlK+#z8- zDBj3ujWD^<;ydOVTg7X)o~pw93H<H~cmtuLNWo&=`S^19+|4Gh(}a_7^~fn!O!CY* zfzAGzpTmq5Z?1DTd+eh{FPw`m?SiLUcZ`N=P1r>5p)B<%ey@+S;Z_gnOoCLSQ_zzj zIbN4r*t4h@?@BVg!yF+@;{78=pX!M47F^8f<mS>AI3~hK7+?z4!2&&F9U5_?z`{5K z1p)K#`zv8^C)ECq$qTrr)(_Ph5_Hzwu-OYS9=UULWeOECFkSY@byQCnxzl?D`#wzm z8{kn?%s=`n-DPdL$TkTyuC=a&tzPRKUHXjCWB$v#Li_WIV57%Y4OcYbjBfdrpDahB z=^#V8OVN1r<{0Ezn)*Rc^d{HJ@vQFV!eBb^q%QC2Vat~DfM(In0)5LLVN|v1_#tqI z*OCKp^7EN6pokT8G03!eG;8f7{H6!iBlI%tMh^iG_L7dkMRH^Ko`q|HTy6+I%59hZ zZn*u26!X`n4@Ai^`3VMJMWU{P16LHqvx`yTBG`4m1k0XC$$@+codCC_A9A{?Vz9z9 zQ`cpMu6S-j#XFsva*VLdf#0f*TDa4vv_*yebU1t?@zTu@>$`o5n^fIT)V_z9=Nb0i zzo|H}G-Vt3r!uihN{f=eu#_tB3F|Ap!uHEfRPGz138t(sJ!DMWs*DH^fvb|uYUJ+K z${*dU7C?I1aDpi{Ol-7$zhPP9!vj3<hC@+>Dt^P3AuOHUWIygLwP1?l)+vSr>L0Gg z=F2d@0nFb&WE@S+3*9zRCfk<$kkv7zpJut`WTVi7!Y=YeU_gU_!DH`?kZ3wm(Zu>6 z%&jqX4yV^(nYYF=y8;gM3JJ=fA|lm>xl*4F>yUD=0=d{~JFJuSgJ6|kaBpOf2onO4 zTKk(}Nny1+Xwf^yZUrfn+7`iXpDm)ALB>ovEAF2!#Im{rJ`ZEXGvz2vIw)**ldupL zcv%%9=s1<K!^F*1zN6cfkivv}%vi_Z68Oq<0m-x|(#>wof?H1<QzQMcRkC*|7OCL1 zfXBb?x3C{FKt^j6S`*ydcd3aFmE2g<Kw%K71k(#S<PX=`I{NxjR<S*hI+FbR3;Roj zfIQ6NvHhLlydk!q?k<gl5|&)A45jjhi1?#t9w*P=xX4#cNdYr1_wO`8hL5YHeLmqS zJl1Dh$@Z#YPZ>fb?VDBJN%Fnf=->{=X~xS+!PFuAy~lwQxdRtL)Bpc!oiFRQ&YfG} z;R-FCoxLcFNdp|@AoxNB(~1igv)YOr$4<D{Nfs`J{CdIkEi86hxf{zd^K2_T9Tsm5 zLPnD~2BZ{{vFB{O%vx*3T%GtX`so6K?fpDVykVkB*Go_>{Rc;Ga!6WO1wZ*7f?E!; zDMwh^2NW~@nBNgEXZH`*qrbc2hKQG<aU|b_<t?MpG_j~ehialJO!J}3onY!f$_#TU zgxCB^;uvOE#nuqf38$?7RXu_=?MK0iTsmxxns8h+hpho^w~idzZ}~UiOmCG$x#ep) zEo#*@%<AKqa|KJf0_TLE%!Vno<bn)bV2Q?*3M;eH+!*6H{rY$k9db}I##md+n4IP! z&BnGlO-V(ph&lIJH#flFRM&F$x|MW=2JGdARk^)12j2ahCAV2)YTvlrJnG-MVyZE+ zf=l5>I2Bi&CERG@WvizPxYq>#!fwH`Y<L;w(E+MwCah_`{o4Zeh4Isxf`ZVhZC+_` z14MBfxYHJQ{cf<A;`yQQxsxEfW5aO+NeG@<fIB_`0oO`uF<+o2ITw*~DF%c%GD1Ai zU&CPI0|k$%Y&f+P!#8($t=l_c={sQDR$@K@Jj}{@DbZ&f_5YK8dVp2ys^?x2zK)B% z(@&~U7MeKW*OG=vMfEf(AaOJ8Lmr^=Ug(Zk9<%ryT;du?{!lpPnx#LfqlCoJx{CEH zd5P_Q3!J5L)U8yZ%xt6Cuj|Q=cR(jg=T!qMw7*x9!ixr5xbX4fk3>C?nFm;-R>Od; z=|Lme``@X^$~d*Y%`A1Het)Tl)6|l21mfm}%g#K8)l@bI$;$sYD^>kyBXUVv!7J!J zu=Wo8U1ntoog|axE@3Y&f?K(n{zs@^^1-c*@alE5Y0`YyK2ze&kslg`sJCxD0QgmF zc_S)@9(*g(Q9Nr)F%<XRW+SF-blT!&Ub$DQl|G1&vqtLlS}By2V`rI#@1Zkp6QyIp zq8*`vS&_`2QvZ8&V!ke3WqnN8ieak(v4a;*Cutu{+5pNu(23=_RzLoc=efB)+t9?Y zu-A)Fz|b-;q1`plyCYDACm=Cn^2LD*GMSbL^tLLo$g8j!{E_j?gM!tSe(!V$E02Y< zEhXkz;BJG}kq3j=I;wWz$A-OTm<N*eW9?{Qa4>KD&lPAR9R4r$+86aghh5s=Q#S^_ zj%V>gbCmYGPNJiWJ>F5lWlJD+ES6Q?_9$IUzgz3f^rKhYu{bUBLE)P2cy|d)TlwEI zXwC)Y=W5M0uShW8m>v=TkY}ED9VKKv`E4htT4+*)8+Vo9mf`-MDl86+%`Ej9T?S7i zuH@oc4omN6VC^BujotJ8ZhiX#J=={l+?a7WF-27hWw;wRSrb$KlVQR4ymCyRNyUJ1 z*nMGTcg#c94P#r+es8Wjt9u;Ct2a21cw+F~s{!i5KC;;jK~Kf1h-G0t)?Ti>YpQ0A zRJQNIv=Z-U7*EXVwmurVWm4gY{_D{vl(_j7tyx|-2TfdbzfNMi9j>3K&C5s|jUk(Q zi8PIXx~e<hFyLRld>QPFS)2`LAms`SY63kV7P3#G{(X^(yYyuih7HE#Q(y?XvWD6g zk{0CCO61dcgVO?<i!{WrS3c!svidk?|J=XnT<RyH&0%9UmK^smQD43UgS$I6-S&}) z5ycUTSqLqSRa_Kq^EwYekfG6k4xW~vKV?&}4ZKlFsez2uC@lx<hXz<fU%|p<JVqSP zAAF!1xuN|?=BlGm82wCb8mc8dNphDnXbz*AzggVv5LUhs>1~<ErDku-ytie}^Gt8c z9Ft|YT<7Ykw`JbjGVg7fLvPERx0!oe=DjWR-j;c9%e=Q`-rF+oZJGDB%zInry)E<J zmO1`6dvD9Uw`JbjGVg7f_qNROUpumTTjsqjb8~OYytifE+cM`p@Be=-b100FHShdo G&i@9X+B~%Y diff --git a/client/resources/hardnested_tables/bitflip_0_06c_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_06c_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..ff80c223390f495eab4e1d2c27f54dcffb92dea8 GIT binary patch literal 926 zcmV;P17Z9^T4*^jL0KkKSub#q2>?x_f6w|Wz6}T{7y=9MuneF81CT>&00IjX009bU z1F7H#e*gdg000002Q<XMMwk(VU;qFDVHh0K69F1vMiGDj011R(b4*MGX@M9<0000c z5rNGyFcGE%VHf}a0GLJxG{nG0m=T0v0007E7zHILh|rVMQ_-fTWi-&!2pKfZBTq=! zr?|b?q>yw7>=jrq5naWD&KQO$!gLhsN*Ih(z*q(psOnYVFpNwV772*OR||uoj4UZI zuqop!pv8%U6@f7dd5TjN5cq^}hf>7A!Z=jBMT-=~;bN>z7_1awif~pV7A#mybqK_c z!f-l-=q{l#VI2TstQSGSh8;|FBMzkCrwNN3Ck1d}V+>3k1BVE~j4|9*>%|K3j2ED| zPe^$Opq<6>7lf|(E)jsSU59*Q3@_qda_%mrI-T<H41ZyF$eqE|y92a`4jrU=j9m;d z!|)Cr40J9Gb^&%6d}bqsipAVrMR-pLb{IHcfMe=E5%ZXM!g#|JVPYqQyM`}0P8KJu zdWWceW8WQxKG4E_W8g5u2XL`pVfPQT>Q1EhhXv<5<}5!Fc+12wc*}>dx)%><y@iGL z7xWnDFHpV0{71f2_s7CVtS_9D`3uTcBe0j0u{=W$fLOW=aIi2wP<_SPSal1uzgRs5 z<SrM!UkN%F<X?H;BfcyQSQx*7^p7!qMbu9)@)wkOg@y;vFDOxUA2Ez#tTAF?h65Lv zxNuI<aN+MA4u&{9py23E@MDH0)WUFKd5<mK-yPyR2;p~&{vVO|j==3Z3Bqt*)8#Se zFVtNN*e}fegTQ)2$RC+MnD>kJkC3__^mvbGyk+e@XT}}^o@4Vo2e9gVV-vh^;6FnX z&=vcMaH+zt0evF$m!!U8#oiZqT<Be-<=z(yp?8JDsdg7&;JOP8bS?~C3#j2b9R&`g zDS<E0D&Q}uu#wO(7*H^}2yjQc5UQU>0VsP#OBM<*+l5NFP?b-Ru%c42dx)wmIu${{ zEJ;{|u>!?Q5|rU^QH}s`D&Z#rhXqrBVxe$CIAE>-VwD^S!5AhaVpy1%I3<b>3Bhou z0f{jSgqVj4u_g-%U}7s6MldT8fhHK0iGsqz0f8|wRxAcE1|}95#9>Osfx<AQ!Gf`3 zaIlUR6vhRH1|}%1V3rtFj1_|z!C`=5frX10Rv2RnOff0L7Z3g}<ce^iAYS1h5;Mwt A{r~^~ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_06c_states.bin.z b/client/resources/hardnested_tables/bitflip_0_06c_states.bin.z deleted file mode 100644 index d787bcc998a3e3a5c6da32bc6f9ed2b0e33cf91d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9733 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 diff --git a/client/resources/hardnested_tables/bitflip_0_071_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_071_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..6073d4e520ee1da7f6c855bbe5b1354185bb6708 GIT binary patch literal 6959 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 W0a0eiJAeC!O&3x!W;R^n)c+4N`g(x? literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_071_states.bin.z b/client/resources/hardnested_tables/bitflip_0_071_states.bin.z deleted file mode 100644 index 2d2f4a1c2904dad0f2a351b60b88ab5a3686106c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31947 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 T7_vH%HQm|{06+cy>au?TwRJ2K diff --git a/client/resources/hardnested_tables/bitflip_0_073_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_073_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..d1ae56fec280cb0cbf79b40171a969adb049942d GIT binary patch literal 1861 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 Fe*t=46y^W` literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_073_states.bin.z b/client/resources/hardnested_tables/bitflip_0_073_states.bin.z deleted file mode 100644 index 552cff66cff82a6a15f9ad6b4136e32beee59d3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15941 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 diff --git a/client/resources/hardnested_tables/bitflip_0_075_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_075_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..6c8258ae36a59af7e479ed9ecefe4b3d4ac976be GIT binary patch literal 12922 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_075_states.bin.z b/client/resources/hardnested_tables/bitflip_0_075_states.bin.z deleted file mode 100644 index e37d90e2a4fdcfd8fea0537b6c9859f014e90648..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42790 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 diff --git a/client/resources/hardnested_tables/bitflip_0_077_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_077_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..acaf1e210cf5da1b8b11e7e23d53fe909c4cc29d GIT binary patch literal 2916 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_077_states.bin.z b/client/resources/hardnested_tables/bitflip_0_077_states.bin.z deleted file mode 100644 index f03f0bba6af590cc5c2cf4e440c0e7223b9da54d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23984 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≧(3CC?RhWwo+6Tsi4CrGlS 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 ZmvL+YIg>`a$RJF5B>)evxL{cNzX2>|U3vfj diff --git a/client/resources/hardnested_tables/bitflip_0_079_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_079_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..427506dd8b39649f2ae16f379ad4bf45d5f741e6 GIT binary patch literal 2400 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_079_states.bin.z b/client/resources/hardnested_tables/bitflip_0_079_states.bin.z deleted file mode 100644 index b05646ac516c6d2cbbd052571caeea594f2f08e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18851 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 Pp?EbL#uWYXKd$~Ccd>A; diff --git a/client/resources/hardnested_tables/bitflip_0_07b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_07b_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..bcc281932d01301ef2590d75eae5b657b218d844 GIT binary patch literal 1404 zcmV-?1%vuRT4*^jL0KkKS&~LAGXNGJ|Nr}wxw`>9)g1v90nh;uAsB&`0TDqF5Eo$( z6;Oax<QU)zUjP6A000000000EVKiiDXk;*r42GIC0Aey^0|*8Km`xcP8W{{DLm{S( z02qv!0Kx%)<`YInhK553(8y_{Kn5cwKrnz{IfT)Xp`nn%G%^}!&;f|akPILg4q-H8 zXlP_GjSPmGGyq~UWCI8W0HmaeFqHIaCzQ=ikq=O4G<uC13=j<-nwg_1wLYkVejQX2 zyoaGnim72tCk$3S@MbfECN392_k^7*hD0xgAH2!&4}@_$nRNSu;9V!o%3T<rZ0>OI z8Be@=m)0?KzcKpHTeGnJr)9;%GG)WbTnw_AdM+0XWbsFlnR^M-3hC%CGahDtDUWo_ zvoj>{KOyFE;+GB&6DNt&vaIxH_AZ{MqugTgDf8l!`_zQV{z_FegVvrZd?5GL@uRWP zSWJC!K0&}bE4g?l3h*cU7FfnOPr^I|?5>0LtSrHdtgvO17>`h8pL}sL;<&Ngr@U4e zvbq^j@;qEem@=4|J1c^mOqGmqaNtH54kx@aIGFNZm3=GdPec7znc}Ckk0kdKCQL4j zPc+KC!~37LkMKJusIp~bv4!mu$zDg@SMRtzjz4iv6Z0&v;;`bb=)Y6kc)v5JPgySH zu@8`ZZ^nJ0_}>EjPMPgI);yKN2fq7{nEbEU`A^P$mUyY;WXbO;;ynzk>G&UQ$HxEX zcY!@c+-1b!!JJvapKPW4MK82iCL<KFD&kbiSjJgcSy)^P;!lLiT_!jd1;Z?{lNHd% z6A_BZiIWp1CQAlNV<Rt8aYh*q7E#>`4jmj5u$gqQyQzwCVzG`HbSHFQ5_c2*6~vYd znLCb^#c?`JN98?--7d>4vc?%xy2@NwxWr>F<_<iZd}WsomD$iZxVkzzagLeMai5*j zj*lZH>o7VoGVC3Xnb>A07Isb<aA#*0WpLq?%IP|EtjAANi;S*@M++s`=r09_1B;1a zi^1!6cn?vX$KX!x3&hL7k3+MH^cb%vqci9o3Eh?0%JVS4rF8u(^*DAH=sTy}amUQd zvh4OANcOlr9@WL!co{yy-OzMCRgUAkfyI4?fpD;%`l){di8^1%Fygxc$$78RybsWJ zOr8nC;L9wj{ws$Qvd2rv?m8ZhIG#mt;^}dmP6r-GbEW3JOM|;FAJ4_|ycgeJrFbv- zeUsLI8IH@{9&dDB=(yrP>3+lKJ)-rWJEiiy6Q`K<tUZQawpJ%c6D~Nb;3pXP9}&?X zWcNz&Uc)bI`rIp+{cdr5?C@7f^sgj7m+D_R^bf9|L*F>^ef4`w%@#4ioHAI*p4E!4 zVK}(1!!XM(i-x`CoI5&CrF{#rhtlv}GWZS`fbl$C&dVK^Ot`qQbTf>d7@e5ojt-77 z#&qC!KWP$!N>E>06$qbFYRe^3EAj}INGwH)sl!T@D$;0F76-_ZzMxq|!eT}X3?@-! zFqq1*mQuvT$(B<x!!cM{7-I%k7FELp?39b8iVR;?c22`445cxOadE>eSvx6I>0r7+ z(-viu1~M_03{1+&jIoUA!s$saF_kQpSxVtLRxX06bP2^c6NXhRmjf7_DZ>?1$Z=;2 z7Z(x5F<8Q4v605&sgo-sh~iU`E{w3@CkV<JRuz>DnJTg}F)(6`Rb`@N$ibymnkyQV z$jHRNWtLc2%C%)`GOEJLtjLVAGZmH?$c(bAtcw_>mLX-8Ok*snSj=HE%8bb&mPE@a zGc2-<Wiu5_!x>1-EWsFHtjbuymIDlySY}c&lx9@SRvAjhRWk-yOvuayh5=#!;_gVN K3K9}X#in3uEs9M5 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_07b_states.bin.z b/client/resources/hardnested_tables/bitflip_0_07b_states.bin.z deleted file mode 100644 index 184354a449c1f7bb26097641d1388fe2a36b0685..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9229 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 HupRopSK<xk diff --git a/client/resources/hardnested_tables/bitflip_0_07f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_07f_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b56e0f7a0227fced7d53ea61f77645536cc678a7 GIT binary patch literal 2054 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_07f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_07f_states.bin.z deleted file mode 100644 index 87ac36ab23a5cbbf11b3e18f3e394a0c86ff32f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16505 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≶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 Pb^ZtY;oGhDQ=$J2l5!q; diff --git a/client/resources/hardnested_tables/bitflip_0_081_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_081_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..c5426ace646e99581c9bf3e599aea1c528cad147 GIT binary patch literal 5982 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 nCu1T<#&Jbt8vf3JPERN!i0IWH5AwEbTwjmw0z zY>-Ykun1iJiw3v+^P=oMzc3vQ+T4d%$5w?|3ORD1dFZ@BGx24OZR;W1K;N&$R~{rD zJX7YJ8~gF_^rij2;vb<i`saK0<k21<jeL;A{PoPUH{IH?mp?uBP5tq%_u$;~v8K<< zA0PSa(PY8p_dhgs=Gh;gitJ51Skm{`58IZXD0{!B?dp{CooDZFza8CtV5ar`*w(l2 zAK&^<<Hl>8H%EVc@Svve^@i2)dnVQN2J#GJ=G?y_FP;s*IJdV)_wL%ea_i6J7vFsQ zVD7`SBhP!VFP}V~`rZB^{1y3Kdl#GQrF{&6ZhcM58qeHyMYBgl9<Ih|q;wX#f9Dti z!celA+}lQ616YDck&aF^t3lPmp2)8Vq;MnF8h<jF5{7^jO5l3lC!U+c6iukZD1>0D z7^+!+e!XtZP{79ZK{~kxdT6bwMH`)(fYptWQN7*96lIs&3h%P|jO%R{MHQ<U)XF27 zS<GGvjO>E#RDsdhRE#_lGbH<$&EPX0@mkvZx$=dcIAo#iSbf&9GZbhsR7KKrIboA> zPw|o=mcPMAH0|rsf@b#duq_y0JCTg<Rpv^F)4&gI%|CL)|FF40H)lPG2OsT;LB#VQ z#VPoN=9XR$844qifRqk9OBNe(dC_ckT9GoWw8ICgTvf;<KMST|=#ATlb{n3}r-)RD z0o<Z{k`Apt;~PWRn}96?-3fm-q(ap=>SVV8fum0qGvd4)fxjdcYf4NP36uBrwovtE zB~wcfI90d#fOszb-x;eAP_29%IQ9r?I2ag=1$q-xtQTNJr{_ez-pQX)x(-4^NgG(h z+IxMy4i`#UC1atXax>4wm^22M(GwiRf4-(}EbSNX`w#0nF@Jv_9davb4m}4bM{PHw zEI0SvvzBtep5q0XTO`|k3H`@?`XW}fI-#5ENwd=txHg^;jY*l<VFgdqdxArTds5mb zkJoqD@aDB%5J9J{l=0R3+?0|u!>uA=Fpk~owGnL*BRmyn{l4Pu_9rR;Y2l>wvU~4t za8>bmlD@fUq$HlX>ZHa;if=FKZ(fcCh4+i<$G{DQ!ALX2_Qkp#CKBDqHqDW}Wf`*X zatF?yQYYB5JwG0B9bDZyd`Rqg_UL+|ai_&`2AMy#ch|?n+4}u$YtMBa`s4orRf7G` literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_081_states.bin.z b/client/resources/hardnested_tables/bitflip_0_081_states.bin.z deleted file mode 100644 index b8f66386b94b3d5f65a1c46a7b3d84a0fe4d0195..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28820 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 diff --git a/client/resources/hardnested_tables/bitflip_0_083_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_083_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..3421417ed6aa076fbff9b816bde26644e88992f2 GIT binary patch literal 2134 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 V<q(X{zIymUv7{$8j@s6t{U5t7wVeO} literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_083_states.bin.z b/client/resources/hardnested_tables/bitflip_0_083_states.bin.z deleted file mode 100644 index 81c4c59f9a1113bc54f27c95652cf791a7f0658c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15336 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 diff --git a/client/resources/hardnested_tables/bitflip_0_085_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_085_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..17f1aaeedc286771297c095efae707645c1e3cb6 GIT binary patch literal 2460 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_085_states.bin.z b/client/resources/hardnested_tables/bitflip_0_085_states.bin.z deleted file mode 100644 index e642accdf9f1a613ba375691cca2c3f9ed9ffa80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19596 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 diff --git a/client/resources/hardnested_tables/bitflip_0_087_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_087_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..5b9302627461b3b91a7215180682458fcea124b4 GIT binary patch literal 1352 zcmV-O1-JS_T4*^jL0KkKS>h9<VgM+`fB(Z>9UbwXuQ`ag;~$8Tz+b=}RS|$4T?hbx z062g_Xo%nm-v9sr000000002s(W5}nXbhNu$k50D4K&CA0APRz28|j9gFs}&21bTJ z0BNQ`00RU7I5cR`G#UdYATl&E00T`j000;u0l}k2fuPVCF#(aGkN_HKkN^O|01gcr zGz|uT$%qV%41fUBOn?9e2mln75duxBO_~!Xpn9GpdXH02N$NBhMn;~Y<c~?AwLM3G zQ|yvJdT8{_vF@Y!%zB9KMSCdp1j3vk^Mk0t<sa0(r$Tfq3>Z8HAJFU_T^{T8x}A>E zk?)y|a4*0=2*vi7BP4t1c!QJA2L($ElJpX}6_JAci}#tIzI!HKs_X~4GCM-;cC$U! zI9CtKaNu<vNB24o72cSBL-M<qQhSF~yb~{pbYGx*j*Q1ek2pP}f?Nr}nH{C;vp+KW z6DL3&6;}y-juV9Fzu?R1a$n*xKBFrg$npwzFXBVbWOOG$@G`NCk9g#+NWEfks8~Ek zBL&Fy#ufX62P1{TkKJ6ZO9PRGh72%{i-DIb*e(J7N8vre+Fh!$ox$`!QNs9>7wQ=N z!ghniFtEiQdRGC#9q4fAA(ytiOQFe?W>j`6qZvnHrSuk9a#sr`SQ$*REFG%H++D-( zBN*>G7DsU4u*NxDE>nXp2VsjYtCYi(>X<U{Tp5e7oyEdD7Cy7Qc9^hqbUV`)4%3mz z$h((B!yGdE80c7XPOF0)I5~AVaAPKCE*uo}f#4=E9~#2*h6Av0e`xoIwsIa(cBgrF z8GbUzc~>hI6NQV)UO?>*3(#Jo^xYR=cbIn=vC79GlJW;a;B;dbz;rGh4vE9aQ`Rqu zV9A)n^dBk7!uV7Ela<w#m)lsw46w+3wdNn3`;X>kbw|GahyFW9C$M*evG~po123(8 z(}49@_Lf{c&m)Jx`5Zk|Q{hMOEG)3WhA{L+>WPO$WrWFOrwbTigA6i^zUnR#91OC= zv57LX8JU(cs=AddlIpGoRmxYa3|^pPfVf#%V(PeDE)E#Ow8sl8hF`F`R|b3kr<W!= zGxWW8nfK4m?RK7VcQ1@|aPpQ;1A=xQy7$*7V&Hpkyf52R!DcQTKKVzWJcR0s^hYYZ zq`=8yU;4gP!PLJ3nK5vTn9CC}bqpgTs&!xJz9+`-LhlvWK4p8(=YbvxbzCd;oUe?@ z$`^{SL}7<vmNLtOgCn4F93MIIF01EQ>b_yna(oAZ;JXv;Dm|347nm@k4urjji^OG@ zQQ|!(3Bi}LlQ=Vi@gHbj1~H6d%%4Ha_Kz`j8GR2)-kt}Qc!pU#_tbE7N!5Fgo#sES z?7pYM|L1w&9#bY<B;kw5oQ_irIaPAxo<AzzGqKoH)E%oFE)|AWS(wS%vbZ=LJg%#t z`PWAdhtl>L_BnNRGapIb?^m=`eR)bRvsF|+#3?C(0{1k9NWP>}Fi{2P*8~*HAPXZD z#K?%oMKNC22wWt{RK;agVPd70P%M>Ul*$ZK6-y*!Rgr?GNXZseWlUL8)J90e%4&=m zOw3F&OktHWm6lAH!enBsS&@Ze$g->|%*Mrv%Sgr;$}AX6875372BBuDV+=7FG(m={ z88WOH85mfm2+XC7rVOF07P3*9lNJ^rv4%4;OfY4cF*2}>VOYVHg3K|IV=EXF7|bRz zOtM(TR!lL4hC*gc%2O;xF^r^TlCvu^V;N&GLoiIj#tE3S48kTbt1^`tj4?|e{x0N- KaG@c@CrHHaQe;v9 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_087_states.bin.z b/client/resources/hardnested_tables/bitflip_0_087_states.bin.z deleted file mode 100644 index 1a844e453fc1180d56773314918c336ba2e83408..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9176 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 diff --git a/client/resources/hardnested_tables/bitflip_0_089_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_089_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..9f37987c7e7a9c378ddd33bf4ede7ffb5e569f8f GIT binary patch literal 2505 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_089_states.bin.z b/client/resources/hardnested_tables/bitflip_0_089_states.bin.z deleted file mode 100644 index d02b3c777a1ff3dbcad6fdfba1ba2ba5fb2b172d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18253 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 diff --git a/client/resources/hardnested_tables/bitflip_0_08b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_08b_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..0f42f9246873f34d5cc5111e9a5fffad90e01ac9 GIT binary patch literal 1469 zcmV;u1w#5lT4*^jL0KkKS#FXyX8<X;|Nr$@L9>bUK@>m{5D)+mKmY-l0r6lFK!i{^ z0Dy=9N7>*DzW@LL00000000000nIToWYL7dF*Lv?0Spm=7!GNPlO~KN35liwFbH6b z2*7hpOqn!cFicG_34lWcU`7L)Vr0pq34&s2fJ_1yBLXlS(-S657)%orOafpK!59&M zDJeoBq{)*;l-iz}ns}$A^*v7}A{d%@XlkC+J-Sf}{IFgzGCk$#V!m?67~x>(j;Jw_ zWh_$#8C91KuBQx{jK(@AQCTvp7?`FE6kSQ@F&MIzSu)EQtiu^xTsj#;ECw-IWtLPv zCDCD%A%Q+pmlK0Al`;niVkLa&;B{DJ%YZwXn7CaQBY|`)GUDQ}$ipgQ4hC6Z;|mNf z7FfqrTq^9G9Sf;lP6lFdxHuTa(56*|(Z*(GXI6AZGO}iMP792)GG{@@5t;vll}0M~ zk3hbsA6WQLrSl#M-lr9W%c=iMxp;%bb|ZtzbYtoqbX9k*;r(B8?mTHu<K8PjlFR$Q zWBa<itF!Q4)%(-hen-}Li`GZ1@+_}XdC$Fls~<w@tJ?mKA@{$F$aw@_^7zh!i@}H1 zvHgZTYZrq39{W9yvEc4ZVTXd@=pUi(55WIN=<gls{?EzzyPZ$P@2cYeHJ1m8en(TQ z+P!CG(b&gwtDq(#{84bF#EXevu|ltJ+eLLg)4kq&2OK&dQ|3E~!xY2dUB&y?h|iF_ z5#x3fshx*LGc5D7E*x|ds>enh%dtD(V#Cz`QJzPElMJRYj1M96p84fvm|kM&bv?s4 zzLW7kQ=+cJv6l~E_Ad4GC*XKH&i7^NKZ?Gw`i}K{h4K$V9;bm`2f81)>TrB1*y2A^ zEWE+*uS)w<ADgmzAJqE}iRnBSnDmFpd!bID@eEmGGO>rG;qIqHyzVUGdH+5hmOh8p zevcEfc3ght{Fm(e&d)Q>&oiOL^F3=m(fYpS@}244Wa`E6CGf5WP8YiPSMVHNM`Y)? zo4Dfab#)yV4l}8j9w$Y6$5wPcgz7pvJ2N=L{oT%ne4~!fAbMS&?0jdKbYA1=bv{w) z9tV2#2Z_<#yDyaWom0xk@E47FOuZxC2Z7wq&a0!L#PDAc(SFCq_g6#I%*mOVc-}V` zMo&?Z;GI{2!QAq%Nb0+e$7e;*=y~48NBprf3dM{=psWiAa#4&Yti6UhD!3ViihGX0 zdlnbmp@H7J%ob!_!v+$%BC=PpClu<gfa+Zd+0{6sgR_dss-A?1GOHq)U`$y_V-pl% zEMl0L78Y56#V}SDRSYsKCQ8JzO(Zg!l4W651{B4Nni(}D%%K)cMTQwnsxgF?Far!C z%#~%5hGi)+k{OhfFsx)Lj6%<E2$fX+XrD=y6BR2943Uz>iw0OSQpQsmlE}j*Lm3RQ zWXQ!PC5+1%Sg~P@Gcz%jj4U#&CM>LDC6cohj4_rOV8wvUGQ%cTDU1^(k(jcWVT#6N zvYBHRQ!JQbWXi@Fsg|XTGRrY#mS-xHDyqm*sKR^sPtgHpA(*Pkm4+4xm6>KNF<8j4 zVzG>7W*I4y5@g86OtMofR9MN3T}KRK7{!J#v6#s&7`Ubkk(O3t6_X1Xt0KvnnM|e& zgp9$M%%)joi!#L-DLA-dGDb2?EU?O)R4mA`l(1mNRud{?Ga|v5%vM!gRl^2jAmbFo zOu)>REEqCyrNvQ-%rRM336)}|7-m*xGPtOjCQ{27vPM$MnUf9yiIz%mshLvDF_AH1 zW-BsAVU|i{#TrOrn9EA07BZ}5fs-nja5yoA#Rd|~8ETmsGPNY)nURR%tyE!Zl)-{o zh|H-Q8W<E~5HW)$C}hHBMP?~kFs3n;f>v2a69l-(PApT4B(o^9113<c!7B`A3m675 XSu)I2%%~h-|M7PuQ-uiz=_7V<3A&}= literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_08b_states.bin.z b/client/resources/hardnested_tables/bitflip_0_08b_states.bin.z deleted file mode 100644 index 9c546f94fc3137a76851670f94e39eea61efdc72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9416 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 Tw)+25K&sqBOh5j7$4&nWmslkP diff --git a/client/resources/hardnested_tables/bitflip_0_08d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_08d_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..f7e2d1674d4fce897625e0221dabbd6710bbdf9b GIT binary patch literal 1788 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_08d_states.bin.z b/client/resources/hardnested_tables/bitflip_0_08d_states.bin.z deleted file mode 100644 index e0e985fcf10bb10d009012d4875c141d69b68936..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11330 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 Wm@V)=E|r@KZ+7Xic`yB<_rCz82jY?d diff --git a/client/resources/hardnested_tables/bitflip_0_08f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_08f_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..f66b803eb3a6730a605ed054f1187db6273e5ae5 GIT binary patch literal 1080 zcmb`*`%}^f003}IXPY_n(kW~RQx@Xn7?NH1YNy`J2b1{-M;Xdjz}9U$mr5d<5%bOY zh*Z9vv9+m;#QDB-rpfS;O6su-Jl7JCJY<A6m3$%lVgJHDKYn5^UI`0{reV@(d+(}9 z5O+6+<KWphBK}#YI|?`igm^+=$7s=>PM%H>7nrBG20k;Sb9F%e^PLEDmq8@Dx&T)c zu;`!3khlM@@oxHP5p(yes5s2ctMz25%tS$BXG~`zt3}(=b?*!2!eBd6i?&n1u==9I z)`h2_M%lZ>U9pq~?uGjvjy?3y>@F<wR%i3GinuGqTYWsJ$MKY>3@+`(i0aYY(pb*K zkwEPcv>kCzFe=<}*NfQ{=Y8L5-By3(1~<<(6taG~c6>8=avSwQ7uPpI9p3T_r#t9n zei%L%N`6ECiJdsP1yb5)NIvi{$A3dM7D@2^FUtPh%)bF`*SuoWm3&3fD1KESvgGYZ zSUcT@vG>&0h)Uqbd4GlB^>z5Zgqn#!t_uDlaqAMTejOptIU~skp}5b;FkW78mOmEo zm!p(N6&W}8n`}dz?hm(IQKN;Ad4pLwijvN8o;B%vB{ERH@1idesw_kkGPk|OSUSCY zElP<BGL!Ieez^@Kyn1by{xH@U(W362D1u%!Q{&E|Zy!$EvWD|Up4laVhRv*To5XCU z7&ypW-G<k`+*ei%mQH18ROWCmLq1DffQOq-i<bK5cQa8TPe@#^`N+CeRKS7n#1Fls zPiGy_HjebtQi(LjTJY;yMrv6`U=fk?Nz7D&>QKALzLtjqZ<(XepoS%E^-Y|UD;TY~ zdndxlQ>Y<T9rS(}{C8kI!o8p)RVmB#E_Sg%le$=USc^TafAEukjDmhkDbZ{61&HPx zGrj+GoADpH(QjVVRex#vwUw7SKX8aZ>G$gfbtQlI>{h03(zVA==pyGVq_VTidma}@ zPpx}=an89>*ehYKNyqb(8naZTNe<{s`*ZE1gY$1nHey$a#nZR+xy5@Ree#Kk1Sj!o z@2{vOQbZ+S_KTH8C}!CB%9w&WfeoQGzTzMju(~x4es$0oF44{}92K_2So{M0jn{{V zhuw82?Zh^lE^YZi>L51J9@-QvW2V7awZZSendx2|K}4}kbP5i1e9R}MR5gTlnkI}g zRu#a&D&OLlmzT%UM8{O|j0ROYFk3<H1E@rwIP4?=q@`5Nf|!_zp7*Ko1JNQJ020~R zD)(leY=A{0Qzt_&u&aSkESuHLBn~joe8y@5zy2Io!>Unrq63-<I5Ca@Fhy`03r(1F zBg~M+9dNg)beMt)cg>zk?5$>$3*`(9ISD5RQ<)QSKpHHV*j|w!q%v@Q57+@JX98HB W1`D|b-ljPW)_AGgNtFL^CFEbVcL|ID literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_08f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_08f_states.bin.z deleted file mode 100644 index f5b38b5843d6b093109d6ab223f2a568313037d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5875 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 diff --git a/client/resources/hardnested_tables/bitflip_0_090_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_090_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..7f559b40cffa9346afc8c0b947457dc34d5a1ebd GIT binary patch literal 1281 zcmXAo`%fAN0Dvh9Dnf>Uj<Ky%IGCK!Ai-o!n-1h5k8_2CV?b()1RJ1R(z?0Yc55xI zRzN#>923%ZR)KLRZFSLP?Jq^D8_+fJf!(rni81?SP1dAI>$0WUX0qh_2fpO{Ivt+< z?FzfVY##~@{z*J|<_Y|qPA3qWjf6%yf#4?)*jqL49LnmO5f;E=z@16A%jIHi@R&?` zCc&PZ9F`TAmzSAvtn!*^io^#vndHaHS0?z%BU0zF=B#LjbTQ%;M~c~S7WRO4zE@{% z=HQr5?X)Sv#6?0$&#}bAtQkC{gX$SdU92TljLb>u5i7Zza*tIZ)+{*$lrjcJoRX_& zi2*k_#}0Ufsa&*ChN7Jhp*h^SK2f}hDpd;wmjQ7nL~(;iYIjN83I0h|g72<kh2*J9 zM66M&eYt=^fl<6w&6{<jGIrV&x%}P`Cv7F+Sfoi&yQQCL)Q`d0Vhj7G#VxlAEglS( zFuoYb126dp>V#9Auo&r9MH1XKCUJEd+{xk^KmQbWU6%?04!uj7glK}O*kZbf>2}yh z;H9@RGzsOqIjI9*nB?ddZUH?v?Yux6>#7pG>VFkI{Of+%_Ay{%`z+;bw6+X>o`w_$ zNdA$CEF2SaeZeKY-DLT4y;dU>Ixv!laJ`(?uY$Tkd52}$z*l>jl%`#qPvLC-uIgx? z9o*0LNU7RB8b4BYeVgcpGG?;bOwwf3J?E~Op&m<tI=mh1$H$R_`+hhv@yz~N{B1ry zzwPVq3P=WPP~%I1)^}$rT6=wIswhJpRLTI*TSHm(2D&D8UhmD{UV3svaT@S~I{<#@ zJYZ2i)6&nEQP7E)K1jo9xBQZYk-?{Ye*ej|2?eOJmLTepTD(jkw$|I;*Dzgb#6?Ii zB*blT8Y}OWt@|JjL^GKcm?W9D;^Ml?xru)wzw!IoX6_6FLhazS>d7eBRws!vF8pY; z>SB+Ne-e9hsBLS2bx>7Js3wq%yRDLCd#>EjV@6%)&=f^DMED;j9AP$OD0*#&tg`WU zfO}`Lvq{rL69i(g#xEL8hEd{*64XVyEt@n-AUMM3$#1dJ$f_f@<eI3I6d0;@=4~`$ zAG_(RTg(YfB`I?pAJ^HyC6^g)ui6ud2R%6`q;{s0kB6nwY@fC`K4N)fHc4}kZT`4b zR4mW8x254pG&s_lsJ3AOv4OWMOGORz)pDD0C7><SPa$n8wwM$X;i{8DP4f&RjB3a9 zt>vMdUXx9Y5pQ@8_v$@laQBUrBerHhB&}TmJ>NNegu5mfoo@=d78WJ$%47c+NA*Io zZR-+n^2qnp9662`JfV`Ip<q>=;sjRjd+(GU9{KQ>6Hi~%Z%Pv2*KQkjpdL}e9Xx&q zPqo0cH)vlW+;%Qos6mM5{O|%s>1m{?Q{6h6wqOR=>(+$qeXOINK3;6xiUi-F8QKJ* zgsc>$CY_oDyi>~cOJ>0Vu)o3o^sjgJ@wR^|d!9ob+Z(aL%-*UpZ&NzbmCrCvTW7&_ z4F~UGEGlCUIvUUHUHN(I_Jez8>hEdNM^`BCTY@!z(82p<9P}`_zgtEta=d_;_mElm z%;l61BpWX=tg}K+I3<j#GngnjQSd?nraIk=PjZr#^<M0fS}?1gF65ZpH4b_~xcqJd g-mWcaTBg4Nrz=vhFllD}8@kKA)~ba*GUkW=1Jl;~K>z>% literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_090_states.bin.z b/client/resources/hardnested_tables/bitflip_0_090_states.bin.z deleted file mode 100644 index f901235a3125f6dc8f137e3668e72f956974bc97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15272 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 XKYeU-+<TdK^591d2H(1o{`h|Z&NM}> diff --git a/client/resources/hardnested_tables/bitflip_0_094_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_094_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..bcdcbd26fad9f4a3ffa6105eb6ed2ab851d6e46b GIT binary patch literal 6279 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_094_states.bin.z b/client/resources/hardnested_tables/bitflip_0_094_states.bin.z deleted file mode 100644 index f97d41f4e75130be70d53fd7042ff9992554790f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27477 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 diff --git a/client/resources/hardnested_tables/bitflip_0_09c_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_09c_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..4b0316dc307db99d1790c4fc1e4b8fd22edb5571 GIT binary patch literal 1431 zcmZ9IO>EP40L9ZJ4M}XZ&^YdYQ`MAy(KH^7IZT-Z3`)O3GD=gD{+Srq|7a4sH77d8 zN4{JV*RYjR>H}&ig%;Xqwb`YUCgeCa8k)2*X_LljNj7QK)I&D0j*XA4*X_N-d$*_G z>wfq2TlB%>?Zd}S&hNfA_8k9^{T1W+q+&1|stny$gTWBD7Hfap%Kzx5;q+^J>;_9> zs_FmLcs10#C!2Y5s_t(8pUJt>xvL7zcFO3Iq!Eh7G06Rpifq|6<@Cu^r0u2nYOw$5 z#s1HJ=vV0Qb8%+JVDXsi^YBRZ@Vc~uSyk;GBY77s9U@JVbvl|d3V|J2CLf2Q5Dq;J zAL(4yBIfIzLYt*JZOR{DTi1?)&}z5yEU~g-yi@GB7wL%04qkO9l0kfc4z^%6UWB)m ze1d}z$iX2#=TB>T+Oji?Kt5$@4jv+j_U5yMmK(O<5nCb%r*YS=ZKiQ2uj_CDt4?9- z7i{WS#6wc>u#Tum(^GVQ_M4yIW;bTlIfJsgg?3<n`VQ)P6l~qQBMx(J)c7dL@)Dz8 z@ep2VqO#vwD!B}&-XACv54u%F7Y0;OfM~&P`qr)wi1VBuNXxTax8mKFymvl13Hg)i z^a~=7ggz%PE>>}9DlzcPeBB*ZdW%qSXER9j*4TTChG*3t)Asxp%KW&slmsGEEJw+9 z-1Uh*_~_NwT|G*{`Le#Ib^$1B;s~ddM^(MD+p}3OU--qPY>vpax0t`Ms*Cez$z*0; z%*>Zg;P^0xk<~oXX&{Z%)NbQOIHr(4fine=-#}}F-KesPO-$rts5on{e0*^I3e|<B z>hEi1luu+os@aWQdQuwex>a~W9bA9D?^-3`u$`N!uLrZMzD7JC_<x5d@fvzmANPq5 zzFM#BZTg$qH<^~uoLPr2W~!fgE9wJbpTlKbmiL=7<+WH-X+xy@%}ZQ%0!X^hUu%3x zY<eDVM)59oqyK(mfuC!B-l!Kxif~HF55F=lJhLx7cDfE)Y~jSI)zvRef5hGYB&X{) ziD|C0I28KSK0P|gYXRE?Aat}q=#f?}oUKE83n9C+%w4jRWhT=|)7zZ^bEJi!Q#k3c z=i{Oj{J^b*4Y62{h)1Z-b{wqOW!S_9L2kS2mYWTMI_UJe8+yw4fJg^0JIa&I>O!4o zM<SbseL&4YDc8%;0UJ_9Bt$4j)r1Yv2ub-A-U+9SVh{vLK(hfS-Dic1MoD?tBu;>4 zMh<(0UX&sPcSc#Tw71x0#Ims7VH5n>jGm=|;O&WS*ApRCT-G#|0*kmi<)qoDiFBs7 zwx-!08nckE`!9#bDHt=Zq)oQN<!Q*54xrnkhLS%HT5q_I*!>w!fk(j-@JbZCjt5VK z^>I@+O9ca@rDm6tmqby_?QYXXSw>HR5j@7|u_K;KB-Q6+ee=lznA8VuxOEO7Rh4|O zp@k&0HL9+tl#69A&DVHRj*QRii^YVYq{3#0Ie&wL_xez|aHZoX5CspZ&^2{>G!*Q` zxK6ESElkyg$~S$JT)@tf&P<0UhoMZ8lvfv^3EX1PN@A#xVRTxcF_7DOE(#X0I$h4; z!EiWvQ-^K5;O4af#?MqG3k02JST9R@EEEod6cC^!Qxv$f_y&s#W}SuOO)Bz&Lxj3B z%jd^2t4_8SEF?){M3lrC^pGUM#pJHILpfFnv5|IbaA;?7CVp4>0#ihe-)k=w@OBFg uWrkt*TF(HPy&T2zjfRG?D3Fyt-<qRgY*)NtjJ^2Vnbu*>W}x4D=jgwMO)&%j literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_09c_states.bin.z b/client/resources/hardnested_tables/bitflip_0_09c_states.bin.z deleted file mode 100644 index 7946dcf31bc8d372ff4d6eb34dcc8bbdaf66c424..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18443 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 M$N$Upzx?z62Ni3%X8-^I diff --git a/client/resources/hardnested_tables/bitflip_0_0a1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0a1_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..daa61d3b736109c5a4f1239f010d7152d9dc5aba GIT binary patch literal 13572 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0a1_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0a1_states.bin.z deleted file mode 100644 index 23198e8ae661b566d4ca31a0acd5797d272167f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43080 zcmb@u3sh9+xj%e*a#~N5SlT3wQKNHGYduL+niw@+VE<d&5JT*=nutntpVlZvf>Vov z3e1}{jl>w4c!PR@U86`1;zV&65oO1qj*2o7gb@ba;s65-!!R?<W#8WCdo~z*IqmnY zZ>|4Y5yHTRJ$t|J^Zahl-q`9by3yo$?%1E<I|~<Hy?Q8lZ+zhHV}X~Jw~aqtF=^ZT z=l|!&KlomL4IDer_s9Qv=8u2;<d1_4L_n#6NM!Rl*5p1pwJd`GIEirEXL7qnw}N_4 z;8ow+neKv+;64pJ2tJwCNgJtp4pd*3;Z>O~jHbe>?d`nqP|m;zQXQ2U0sMo4A}^12 zw9j!9>#+#~5czmQbh?tJTD>&LN2aV@*)IDU#78(#1sE&MgV7zF%@ulB73_Lv;q<j^ zbFQow`v`Bd!#JfRK-!c!No#pwrSuLIY=BKmBVK1@ox=Wst>v4UaXy+I)lq95+_j6P zHwk|C1*I)o7&^^o*wm7NMq0PIjSI4=kldV`eGKY)m<lSKqyZUjD6_KWlGz?6mMNN3 zz|RtkDjmg4kP7+y8+7}A;=XhvPt}R$Ng#I^X46%1W0)`#CUr71m`88H39!@(0pH2W zNNf-D1^;A@0{maVDw8#I@1dac4kat-B@dqqSL=jev{ThD6v;SXjmFKLruDf+V~H49 z<}s`mh1I-to8BVJ>SIre+|Q|%gH{`C7iA;(L>M6V;Ag;1p+9dZ-UfT;!H#>SBiYUL z2h<d0qFj_o3)s)7qhwu}=_8q5a%hmh6NRM;Kfp)~C4J1@7#bxX!Vl;uX(cqCgF^(a zNGi0sqq%P=k&h)N0;j>IGX1cQK0{T9%5+0FM8OX(NT9kp@QR(mf$1*(1pI_NPstz? z)k)4z!SnqNJMX@|)<=E5{)jVO=;tBQ0#o}*^|(k@|7rdSV=EY$e)bZXlK}J_-cYxn z7b2=*CWyL^zslrIA8_FqToZyYz1uJj^k#BYl|ySbWgQ=^`Vp)dgj4DSh7L@%09RzL z5vTHrUfn`5se)X1x$_b%m5CswImjoZ5B3cf-XR4I<VPasVUx*(PWafPQ)9#wQCazI zSSO`$@nz>|&^4!-NoZgn=G&Nvyck$n)Sm(SUm&>^Qaa%ID@+eHucOwf@G@La2hT3v zb&s?6F$?7wnUV3%_kniTSHiy$T<qzfpF)3oSmAC!&=b%}6<|6EyX||^?bWj>p9%?( z2kqpMu%QnQkk&raQRvN*-EQIpqru01%8$>v2Lr%`3F)qw0qtP8O@dx-FUYy?WQ&o@ z5De8GmJOVe?u#uat8dfN1<)$Ndb(Y2X42JBswo<yozLgwT_*ZCJnx6WTi`Z9#dz2T zCK=jDCuQ7tS2I8-=23%(GJfU)9E8VV1pZ4<h8D~%{0-y<`ViI5HCgfb&)xowqDJX< zSWxy|@JB}V71o?<7OcED_0&V~(Lmw!EwJ&D`hHIO`~0z$?WL;D{uGsy2S{z?`wJ^W z`kdUy*oha(F9`D+wdt;-nbbwCuDCBtM;hls`>caB@!jQlF{=3$I59B26G~m~G&M0w z%9f9T=k`E_13qgq>t29;p~!0r`4+#7^aQ6n$P_wn4E*^V%=g<(WU2i+oXjtR8m08f zPMyTKS<iso1O8bFXQ<UaHiN!qgN<GGRR`ddC&q51C;kkH-R5b)SJ30n;@$f-)Y8Z! zVP<$4AK{Ov>zXq?;XIc(It9*lNidhb7`3=<VRkE|{1NnvV9j}cHI_cMuC*8To~J@T z6Pz%<6zsiFaTqG_T9)+i#eT(b5ll2C8RpTJOSmna)Lau}b82>6Vm6JdSq>(ZvruOy zRIP?NcQ{)StbQ5nmm$N(B%7cX;Q6qy)JuffB-FxP5^=*$qHHqk=_V8I!E}|s1=)Sz zQlNg8yY1v`cblu~SY2<MtLH#Q{VeM-tk>e^SrPniV|+2b?y+d!6$Eb={;>5}J-$BG zb8>cM<7_t`Fva5%H$He-`~M^dlt&@A=3VEMdfnaNwCM6LNj{0xPx{^9IiHTO#yd}8 zq33z!^cOlM-4$yguldba_%W2Lgz$NT0Doo%9f$c$T3hCdT@Dp)F!u-x6-$sm4+H!v zYRzZd+&DUtv)6FB#ZS}>Mh?I-)xJ=&e+IE>&doa|VsY@9>i(7pjG+x75|WrcxD5Ks zWUn%A6s&2YHfmT2dGsrt%mg^u_l299uFK3$S(tFooKgdZI9iB{9^4e`Sryn-GPLql zp;;vX;;g|}bOF519rzRcby?duxD;fs#670!mqAWg1}vETMFnmVe2-p<`~`lh>bgy; zzKljDi~1?I@O%=f&=Q5`0`}EZ5O$DmxWF%h(W*|>0oGatE|Xq<CA?1y`r*%T9=_rf z{DTv~HF<CnbY?a4H|dn?P+9~fTgVhBzDdnRU{Zw2AfC)F*r6CQgZx2w2FuT_i=<f* zDmobJ3MkE_yRPy}LnMGdH1r!Gq>{z5U=4s{z+BE8Rr6F%#S1fBp*9Q(a_$^{{EAd) zahL{WeRQpyTLX)sE>!rX-AmT#uzC#;-_Mf8{?0}7X=z~5N8}SBlKmayNLU8{1@p3> z2II#>r`V=(aJg3Kg|Bpy{TZlCx#F^?utNoIp~$SIPQot--=ZtkJPTs@6CwSF;J)h^ zI2y8B^Zd0#cYXx%xViCQZzdafYa|kO--JWo=JP1u$gY7pS@&hcB03zfit18nayr-x z;5RKxck&J4K*~7UbDqdklR<Qc&&NjW>WY&<wiplDGPZ}ZelGGM_DWcY7pp_MM31n< z3aO2J3U$hkE;d_D_3+)KGK7mLN`5$4cu#nRuNbi1&?)D^;g1<zTxjuTC~HFI-O4m- zF<-5)!vP(vgHv&8)<|IjB#k#dnvu**DrcIy_}N=xLuC7>#3u>7)WvT&TOyc}N$#Md zo$RHtO(Ya#mleX9kTBTEAEU`N^#9B~a!7jLaSdkggdOBEGYF#xbfu)Y5y&^mv+51F zfyFioP9+9WgtiP<g0%|Q<^ZD@c0sv~Y2dV_>@#t@ZMrlYc?`a(hVHUKT6bAyf^AT- z37BiV;{%gjw@$ts1zfxB8Jzli=h``xbg0%qT*Y1=)_v>(2gu8?>>OOt7XR;HpNcPC zMoe%E{>)F5b&^hrQKxutjaH;HpESWvCu2TM6Yep3b<$BNwZY6qv@}!sQogJ(W5VPp zymOcyb>W%XsbLn~rr?{n0mphtl)nOcg<B3uf@tUKT-=}sKGBxy1?+2+fX`PA#R@d2 z3BB+P<)Y-e0t;31Bub9pc7vmkdL3Z=js4@3vGoMJ^fo-7v)^EjW4y5+u-UZ5{~i;C zsnqw@57*IMF1w#BR3dP3U`^B^IbhDE$Xunuj+KGUqpf0$IiFvz+IK_w0cOf|_WSNL zJMWqI!bogz<w1UxQtp8}D>hYM4A(uDV-Ny<mWt~@RiyCx92!~K?(>`4GpMsc@O|Qx zW|pYW(c33q>oJ#u^)BLyl1=j~-rM4Hi8tSZ){tQ^LPr0!Sdkve=iYfrtS*F2Ro6t5 zDuii_n%;=}l5(HXd2_r`z*`v)`epoKpsP3~&H>#Or|7mfDBB2G`SBY-Xb~9)Kf`!E zR60eF`=Fg>eI^u2Iwyqgu7sXhaM3-wM@b8?f*8AkObKS?(CRU;y@I&#Qg5Zi5-kiX zN7MbxX2}%BE{1*R9^6F)dF(3V2`}#>+InlT!2A&ZJwNQDY!pkE%KE6i$;Ts(V8@Z` zDw|9bBQRHaYPG8ThkB5IQe7qTl@a~DaI>;7*hYG;km(C)Vtb^EA4%%Yz}aJR*jwF4 z9R(yX(2F-k$A2j_6ZRgoNkMzdCE^wll`H0R)FMJw2P;T1gSweeCC2U46<`bJD`78n zgy0acpv?Tt*gC1#oV$x0^O4rUiW+)+0@y^bsQhKpZ61lJPDL~}==d`eiaiRis!7!z zPGWAtL2A0KHI2#$Nu`ZDLd4R^ha{{5mziw0uAUs~Wh31%t(>H)%b!)vi(n?9yZT|a z#K`<qfP4kN7~>|MfGNmTs=k+Lm7eBr1EvCA_2RGn8v5C&NqtB;uTvN^)b%slcf)L% zPZwj<7D#9zk~fim52kw&K;vdMsbiI`u-3xN9_7>}%Y_QNZy>uH=BQh73$Y;*lO9W& z+jR<@8yvHMzu~I7BvpT^#Dr`^xNoFPa*So$8IIIfs`~vjE-2jLjj$wZxVSaDn9s3r z)WRe5uHiPshG6hOY|2iU;Ua#lWSnengS(1N>w^>ED=5FGS7Q8H$HKmJ0lo)$co`7_ zhRK`=f0t+s>LU2QcdqBeMZsjsY>oVrZK%$mzGXjLr|z1@m3R`RoSvw?R_`{4S+DpN zEF084!Y-;wbnzvAJB?VA+xVA^LVvp)UPgo(8~db&@TT2lgyvG>FvmI|&~!4VNd8{X zyp-5o)yH0-6X~^bei@`^Uj@m7KmW{j^3@$U9F^U+Aa^ydRf+Z75`A@K&9CS|$f&X0 zF|HunVb^hU>!uz>^lUuqwx{sfwDCA|jL;Lu!P8)ur0OGzjcV^zh`oiE;V$Vm6w=mk zLVC10#Mg+rA<U=C<3U{#%~n=MP452&(@iKXCziWx1&m-CPF^w=pMjKb$@~Q}<DO#f zfr{e@`<!7o73CL^4bRyR2hCSVvkF5U2iv)S617)CnNJzTWxVaz`=%YvYdQj@?m`z$ zmBT`=45x#_qi(W*@~f4KP?SO9*l;`@8sjzaSFm9><VA7MT3j$u5<ZNQ1rQsC@pP+y z*Coctg3xID3<UR%*9CZ(ln70dqh>_>z<ZDz-6YSORTF1na>igMuMB3j(1Rm&(mb+2 zatHOLVp%OO2iU@(o*f5ec0!dM#lj!d|B558`pxIf?LsD<%n@7*!i$h><AMp}YeHEb zH^cLe){@}dGAew;g_Ze2U0~+rmQ!&B{7D+@hm(GG6>WhXFzqTBuCRTi4+<irJ4QVL z$%T-KWrhD3nCs*Vn4IH{@-MAjdrjSztFZA??XK{pHFNUQuie@KWmBl{shSJ$qY&v4 z;L3H9t*rVG=8Pe~byK~Qj`Eo6uhcs%?pV)~X#MutkbH||dU$D;v9N(%M6Gv|wc?yw zWFL(vvU&zA&!wN>Uu;u_bs^^XCJ+nzq1nzjNu&oX!4wdmH-q~UISjstw?RD;ufh^| z7c3$VO5AF?!46oLL}r*Qq|5@-&tU92_~|0}1NOTcU<v8(KBS8#?FQjpm@hI9<>1>* z`GheZfcR|r%1o!r&pQh@2;*JMaWc0iqNE2soi;csGBI$PH}HZh4AKTZ(ak{Hz-R5O zM+oO$<$qFd$>(n}>84KiF%P>RP<A*T4~si>?wB|b9z_NhJp{=PDB9MUvV?Iecho?Z z6LLq%8$p=?$pT#ZihT|)mGh^_Sen_%7X#~rZAu>9srb?dW9)iQ%%73|{Te~^vO#Vp z+?*a@Q{95{bdD!zSg9s@ZRWzh<#V9o2?UhvY%;;k+vty9gpJ>!bWc81gpr^#9Xi>5 zKm>bTY!5v&1u~)$6U+&YK+KBQTlWoCUY@PmeCd+g-Gv>*MMYmiF<dHUEFqFD!&?f8 z6SG31^}jWSy$0lbWn9%i)>pkcLA$y)Nhy5<b(WiOghsMdNcWc_p$HkYN_7oxLZ{Lm ztk^;=_7uS$uYZ`8vf<(C-Ox4@+C__d`+Hotl*WcwQ?H$8ouS9&m;<{+T?5@fp;;=F z^p~#jnM%T5`s@4y9s%kCu?)?OiYnv9i&kC-R3Z&3znDK($&oXZYm)4(gJiC=8A?5D zxSS75d96~c#HDM!D8NbEz8Fz+TjI1X6cZxvG~?&#vi_V=^;fUQuBX>F&Ux%a9l8PY z67cm#kz4$Hko1x-AyX7yq(ej=$!YQ(4H@D)yaLTG-FZ%qZG)`-myHd?F&5rj0T~w% zL8R@c_1iz-8icB+j2r3G5w@!ug5}Yae$YAiw@^IuOrJ{m#c(_m5|%;zW`z%{6`OpJ zd<JD6jTTXjB$0QzpofRsKO(h3)xETt5y@#JBg4g#`}uuv=xyK>a*J7gdESfr)$3QQ zZ^DESq<Tn$q;HV3GH#OJ_unF2&g>v5>=ces=6P(VjGsk7=|KUcq8#yG<w!&!P8yr4 zHoV}ri@n3humfxWo?*^=6=H9b!&G+<wu0j(NoY3vTF5EYJOm9}K-cAqOETt6lzhR2 zuQ)o${~pqh@BXClM;uJN&ILwBx$*pr;Vr1E-*oQTZoTjhKbs~Mk)E_Cz)=iGA8?U6 z3Aew#u6-UtP_rbP*U}q%qjpnpiBSq$$7Mc(+cP8Ms<1A~<_^^~p%7XF4oL%Z5`wuY z8kh_7zvCMP{p8!w_de=Zk%|DSj2V9Rt_k+jO=2e$SiHem@G;9Dj5}sOt2{ceteKRP zGNn-B4hL8}%-llH1q|>}yVs$=4q0>WH27@g{BG(G3ScD7g>X`dNtaSK(qd}!3%LVM z7rz7AV-K(k#nH_MLG*n{TLXMPNmrZfq+QIWjup_X8lub%t~|mt+tZ}NH-PI@VlSdh zh(JpeC*Icz`QV_KE~eb3+lHHeS(slZaf5VgB{-%c{>s4GFj$HNdMn(c%%JrND9?ts z$3x))Ss?2Z@0jYZ`hBll)Oj=*q45jSh5$sb@NYtlCN?Ud$%e^cC{*1?A#hAt6NEJ~ zcw6CEqYfBJ7smE$qOGBn!FHLpS3j}3l_sm@cHSF`wJ?Tuo3H12$X#G;>W-w!WVGpp zFsNtubeU(^1ETMQ?p4uuEy%oJ^oH`3mEh=$4KZ~QZc_*Uiuyt{M$A(V!J{5_9vnzj z6WN7Q>e*L{;jql-Q#&=+0Y5>jr>GgZnRJ;u{!c28Nqr>x#Rxhxf-<eClA7oUY+{I( zot4nTfvt#--$DKzi3D-d7<zy?uuYbIcYfCpe#)4tB&bDm`eRYh<OP#l=ojjL1xlV< zw!{DI?$KWM-QWdP>j@s1G8k)zvl72v5%%&gsI{9@<(%+2@1`*xc8f!e-)Y?JOBif1 zI;z2Xg?U!_J+xB8a$1N7dTP|O%5y%jNGXVioB1D+6L4LV1$B#{zUqX>u+-%CrEmSy zPvGa;-upG!=!hIFrodm1vK~K)BHOZfP1C~G@o-VJ=c_uplHTCUYbVjXC^LwdL*oh` zqCz%=4rN>kL*)n-(1`yR*5s$5!&7l~+LKY=c)f|UvNcYf{WST)9*KBs;<u6-4Me5F zSN$j;`QIboG0vu6mBo;|_D6-J|NeGp+q~Q#uq78zSVC8z8N!=pMJ*v-mxMo6qfX7! z_h(te*z1YU=X9GFp!WWyzWtBbMiwoi!<cfS;tH=PE1EOZh+;Xm@*Z2F%$%o2e#uQe zMp#&jx<8etoLwpPh0452_PMwbOgSk;hk!VXn}z56<YU1v)p>OZb|*tFg<{V!jm>N} z$Ty?r7oqvSk{ET=GYRgJ7u+$ogN2<zb^#b}@V$YVbD46OYZGmiH1;5R15N#)H31nZ ziN>Wrhou(mtf==0GgMPwMQ+%ZDVr<R$5s7mUU{RsQe7|>43<QdnV^t;5_<<aPONBt zQYN=yk&!!3$<N@&3BRV+LESpa-GG$&kb>%;=VN|$Zeatt6y(2;dq?XvV#?TfKdDsN zDQ@nRnxn8@W$*i7w4e!~dL%gc+ThqLqG3xAK32>=!0np{!e?sMVwvkxHsq|h?#(zS zBe<QXFn(M#W<)h7$Qp?~0gg@qacLM=TE*Xpg=h$&ig+@<*yKh*(d<y^|A)Hx*8@uN z$O9Q@D&fJU85>mLBSfr^y!yWo>q0S@irx^DPSlsQ5<b1hTtvEiwfb8U9`P&^dh7oJ zr2Jy}#QNftCP?--7BfB7nd;t65z?aFM@=&v-3iu?*uOPu%IipAh!V|Q?1NYPiRm)T zbgSeZd7u*x=`BOj;SJt<8>~BEzox)E1B?h)hQ&mrTDU9hzfkpC>CAid;(-WE@iP+d zRp1MR-wy;sgM-dwRiCemv7{sOGKUmC=!Z8u1VaZ{o<|C@6@ksPzgA1<ZfN%K$yQie z%6ny|8!7rh{HvQL!Gxf}vwRIx(8V>@^9yVFETue5yb9@n$|9t1#fqteRP0A-V`a@O zxb*>(Mh&XsZuY>bB8bnTH=FR(^%URwE&xXaG<6w;H8o)~eH#~;Mr5^aM#iZQpYGTC zSKV{d^{{|QjVKenujJId7R$XBVD@m_7U=P()uO;co)izNXRxy#0I#&6-gEsY<haGu z0j*k59>!&N@f5z>PrfC;2lZGL&V}6rIUwei9(@}MzSPTwUZLhXBP50%Q))!LZ1CGP zNwS@7<=+l7Rq&H!a9Ef%GO1Mf&JPAeqhK`%zKF}$NUQ9dJ$!!BcM9iHHOPF6u7gAF z=I&jkNiuEu5gZ;U;jPbu9AsXNz%rWGN@LAr<&bC6rtIkvX22{-=Y{(1%ZXPsoC>jn zj8p4I3Ug09#Hc-_g*Fu4gp=2so=$mvS@SekY)J2HB#HiAU+Oyfo%PtAxn%@#Mp$a> zgwX;0nlI5M+Th`Pg4|m58(%jc)iP*j&%<Xy6E!Tw%~u{|qQmP30Yn##!DczYFQ8a` z|C6?HZc0A%U9;&gdEKtUs~(o2yP~n(>?J<N_!{~=m41F&8@X{7rq!z0=is4p=Qt_! zu!q#?4#ssPj2#WSLHXbKOs=$<HyS@52aHXf=9TTuK3wZUSbQ(Y-<COT5!?SH3u>g! z{W)p5jb5K2nciQ_pK4+X&7%dHw%k&QWQ*Hxqh*CeUrigI0=)?g`HH^ojLm$V#=i)r zEh^Cq2VinKvmdG#ppuI4E(NSl!_O&l*lw~o#3(`s)-L;TD9fZR9($ahq>Bj~{s#2n ziX0~kb44h5P>S~97ZS^>oAMRN^dh!D)eFSbJ!M*Dcu_3(uLVIc%Eq|jbk2n$fe*H| zHw~CWX2|;3w<(&!#h`Na9ks+SG(_`;Oo?>rsR)v(R8>72bEUIUr@l&gbHae&wtv)) zGJ1%)%6}7YP_u@|n?uClJA3;#a>}=BtOhX}3(9FQ8gsK}$Af%gAQH6=%!2eDU)JSc z@<-0H7y0DH&#IOXJgKC4%rC{J&iHB|cP_Wj!;XPxL!{dWFDfM-z6<*HLj~1`Ne7SD zm7Dnr?e8Qjre@&%u%3f?#5st&5=uXVuYNIy0(XJ8!{Z&OslKoWQaXKAG=WPV!1_2b zfYKeGF?dvl`g*9M7Ju4tCSAOf0$Ed=8INl6!sdY!s0YEl;K%FfbkU4bgqbf8=fuPE z?Qp4u_hXy?8Su-L#9n?!5A6HDtQHEW7G4!=^LrDoWk5+Oz4)pa`+=|@rYciBG<dS# zY4x3yQD(e?b`k3#%EKfXa<@W;$IhgTg(5esx*f!==I8=6S#mv0A^GL(f1wv9?E!X; zqf6(Jxf$v)Gw->KHa2>*vFOOA)h56^EZf*ty7eluKyI){ucoOIvoFMV9fbq6$dZ2d zwpzL_G%6!>GQSrFoy_5Yo~Mozw9Se*Rfl{RCWmy{ihY6yQtQaJ5LWO{NTr=Q0P8)( zUO}fc^G9gx|8EVk?j!Yaq=fk@YlB1Oh`oP8H2WSZy+m?@OSY%fv$+ut;g@hy)hV-J zx1YZq_5vMu7cxOn46@+!s)>V+_mQv`4B^VEP<FMY9{MC=R3fq;BM=+uPu1cv;J9lI zX|Pmx1$?>9U3}QzC1f{~Tu94f`Xd%~ra<?KykM&=BqqhM2aYPe0>Q{bHnc|X15A^e zHC<lyEbO}@H8ztQ@Qw%jl%|iM6>bB=H0s!_=qM9L+}6wGhGWy^Nq!b9g%gc+(xD5) zs9aQck9>vd3BIKvS$f#`NEvd;v3dC1#N_in>GIhk^-J#Z**2o6-;_%X=1{~N&;P+N zf_}d}HtkXHe=Ls>Tfaq?+OVJGWpZ4tDMk_a<;|z5-!<AX&(AdqrX^%LVoTh}-i@Y# z)c19Evhf#xfwSe`T=f3Gbf2f)B&bbBJPrrHtU0&Zao9TW!yx$&#srmcvRN`X8>Qrl zlzE>m=Lf}o9{#TarQ60Ib9dnx)st4T)FeCikZyEd%4<<0wz;3~k%V}|HSzgz;M&U+ zuA`n^aDq;(BC}-C_6H46)}yWa&xFeTbYIxE)LHJ-<-1c3sKI?62uADfI*N5pGLdrM zqs#)e?3>uG2~Vb^m1!C!sfKH&jRz=G2KJrEd-O`-5!n3q5EA$PJ2EfT6TkS%80gp# z%~bKmY41>V?^Asn$@na~zg=M_fPEai6NhaJ%(qC21#&$~Qwka59yW2()uc~h`-k8d zgx`Sg1ek&_2i@iSxDTNq0>2@*dI&#uws|_+&}zol&5og{5wY$cf|viy%<lQx<3?k< z=dI;ny$6x%ckQ;X!eXD$;-250NMca-ehA*EIUJZJ6kjzNm2)`(_ytz-VfWE7;Cr8h zMKmrwUoppZPf3M=7;i9T%hSJ<-35|;0=A4q2QkvaL9Py-h<uxGYqftVO>WUGl;3*- z{)ay;WDKOCmoY-Nsl{U%B?gkah$outK$rXr%_U#*2Oabm=?A*A1%}orXJ5ds;I@4e zJ5KCEDa`{Ic=G7iz|9rVD%wNCPLY{~cZUN-Y19-iI{V>s<3H5?*GOw>>;PI=R=;m) z)D^`hYjRC${LATFC20)P;$}XwW$iW`Sw+{Vrg+509k6+BGM%%9jj(IG<WiJggp z!g<)Se3#T%;A{3VOHjoS;go1nbY~)5$`UB>kwaK=5(gvSldyUniZgmeUnA#|r|b;r z`hAnr>|$97X)Vr&v(&#ae>PH^qz+h53d@NXO*B*xYVIot)nVo+Eo6x)rG{?W3MR4h zEVb~!cD+92Eb&ROCjiq!?7#>R&a)ZdC_o#KiD9-ZWtg9!pYwBcB`?}9dcH3iI#>QS zMm$$3y6=VMI8;JR9J=GjXVkov{gLn#_7Aq7t2D?4xR>*xvu)WrIUJ`+eIcdxy$80_ z+oCQg+J3Y5ce}~&j!5R&3d{+Z4eAKVv>)1(@mFH%un=Lrd>xQ2-2gM8WvD$_(t@TC zIxNO!hp?dol}R+DMxmo)X+LydFC8=JsD}+9C8<Fvl|;tUV;Dznqhvue$s%=sMwPu) z<kF%(n+_vNXjd1w%jVh>)Wr2WoKO-lujVhCx%CQH0g-YHIgAi()Vv?~Qo4G8N$g>E zDTsiz&=OxSVZ)+J<KcJI=_y>ORxAfDRkd!nDm%5*k~=cNj<O`1fS}9Ksr5$u!lj@% zu#PrX!Z;ffxgxCdLrPfp50QYQ<Y#IYy8gWwSNJ9x0=;Ar$kW2Q7BvYumYexnRJD{t zc6NJ}v`gMxY@sC**Ej?gl%WX|;)-YfRgUwQZl{MJlT6>h!CPNRknrS5K;NjUOX z-^wnpS9zAv{CETU@rfSRxcTo4`M)6iy=$=2Ng)hb%u{vy@iR$JrgBciB88lrL(aL8 z3B7#U)vxhX&(z0jOzuS)YFdy9pwL6{V4=wmA4ozs!o@#=H-Oe|%TPl?D0NoD*+X9X z);#w#Ee;}#Wu9HGZ}oE*$WO?EsN*cW*iTKF3Vt&?0H$r=tK*yQV1DJ)c)(S+0<;v# zX|RiV!Sd^N4MUqcWk(14u}nZG$Ap<~!wtmEBVZn>#%KrUwdV#&_4bowMTTmsW#_=Q z`$8!@B$N^<#Jx?Y9aV0GVW|UJAYCSxA;mcy7^;Qzu@7ppE5NUD3=>byB{YO8(EO8? ziRB1G;JcdEc7#6P1c#BpQ?^gT%6&lWjoBmLaTpHp6RxpW;ny@xt(8o{ng6DXe&P6| zFXM}Mf};!>N8SOIu2QP?wP^LsK!0Rb{WlNApgn~7OOwv6ZNX64X|<e9Z`UDpi)6Ra zIZ+n%^15$4d9HAUENs6Ak11nly33raF_{@6!V=Oa^X{yn%q8nZ?l)>sIThCook6CQ z>IVA8LZr*^2As`NSIBS4sCYT{6GXo-H-Oh2GmA3cscHrldPZKN`kC~B+F)a}Y%b<X ztD-T8EJiA4m64%^Va_UylgU+gtovRtX$iMUOg;_`KOz|+wl~1`lATuxdL&Otk*mC# zu`=qHQvFckGK+9vY&BgdX+qpV+Sn#@rbs~#mkQryR@5TRYSqbPn_@4ADS3k&o8M!O z1(V-g&P!r!5#!Ex8@7bdTHOMVtImg&H~7|G_XaibGq8UOulfs%!FHXr4nY}BHG7R3 zod1}_WO~%c)4{x)CSd9)X5hV;oO@*JP!cl(khq${>LgDDoI=7yoxS91LDfY$<Z^yk ztOYSOJ=KL$xuFHvFeissh(Z@Mg~4e-y#N*0L8cGB62_~+&?MTl=RY_6s3ClsUNEBy znGwop?KN~rg}sLB4-1mwTmlPazh`2$mfKR9biiEK{s%tKe|7R>6cr&#iWj&Q=v0Jt z3!)P`3)jPq0+^-9HYgI`N8o#zxodjYtR6o{U6C1TFe6CDBNbP)!nD%PwMzUs6)6^9 ztW--%@@{efRwHakp!sd&a99_{d;eD-{TrxEq8i@#BpFPNZl=1iLmA4I<U9(m+WM;W z3b&xVSd&@jjB>^l?P}3A()w|c!Y{M>52&X;hRl4)&CC@D9dYP&@~m=-@skVCgn`gJ z%@lGLm!6=0aCBFw$Fsn&i!6+GQj02_QG8~YbQ{tlT$+q_4zzp@*As`Mm8CTy)Y5;M zjPmIO`VfjEjOIjLfY%geAvC__C(VCjuDg{XH)R@h3zhwt0-UGlBs_(Iq0`V(hIy(< zg+d>}2pkrpZIFAm(fg#05v9p+3G&~3G?YN;AJo8Yih;_9j5WN05M8m4Fi#p=5#_e? zNJk%2)++~-bo2{ubdC9!C(B8P=W+45i8Mp0UN!Cn<{j(KV>U%S-Qdp)d$VTc{GKnn zPEuDaLxUq-nltlB<HM8YGBde-0VJYRwv(ytI%}yMJX!4F-R4!}9*5^T`4$g|uZ2sb zkVTx*ljIZ~#~|q*JjJ_0g-#~F*h=Wf9(FT1f_f*79M#O;@;a1?>-lCsQqlbS#Fh2B zGw#?rH{+Gu83)Ka9(W8f2$!j*b>J$}A}7aM?>q1NX+pRqUS3(PCOPR=I;ny+ezx36 zk8B5PYsq~;8|x#1C9!GSRK6dc<?a6i%%|i}hkgvnk_iKo-Ct)eH(X+iYOr~_M3feF zs=botDHX#`ler+MZ#BkKb0)oZo*>D^;N=FDES)HA?@(seisTiFa#-?5T6t}vbIMeG zCY>E`?h04kd5};V2Di7E>6#1W2^eHwyo{`J>0<YR?74*-mKNd1rm9sN)-KiAZNbp8 zW{1Z}=IZRLHuU2c_|fOf%vig$DEXfr(1=IYSJ^VOgBz>PP>hcHJRh{JU8jDR<t{I} zf)e?^&R)i0@xd#<CQ2l#*D2wk4qeiHgO1~5;|5e2NLVsig4QPpDw5i|+Y99`yO@$k zYTXsS6mHT7v1*(fCDe-Dw4xX4S}ThW(-?1v-37U!Jg0}T*I=ly@HifBA68TO*J*w= zr2KsX6Q0Hvv%vp+h{-4aK`nQ8!Hw4x1EpCXvN<xlOid6K;`XsN4?mH-*+VxxLM_p( zE2?i+KMXdq&k?DMjAhOq^SWX<SI+9q9>Zdh^i%4yB->%*RO9j)(5g(jsL!S~0u>cq z2lEV!mUyGeJ*gGov|a|i;Pyl}r?5BCluviV=ab=>liYXg9duF?ymAw6*x?bxxw~ML z920$?p}JmXX&L;7dIIALj<u8xz|wk1pn_3JIEFjkyB|(5BDsR7QJJTxvF8&Y0c)=b zbif2qw?l?gk7+A4MoO;2kf+xD_ha|hVT$B1BgSIFxFl>yrHogJMf5L54*#uO%Y7}^ zqKuDD!c<z(1;rDgDkL$MAom8n{u!Ppr{zT_A>Z;rMJv?o0e%bGeDnW4fMh-dcYIDU zH1L{iuQ47L$d_48Ur@D5>~YN8uZ3+gCb`~+>`ARxv+irS3zhekny(p+sB3jaBP$j8 zE>kQj3FGNvwEey!-w~~GiQ`GUye9ijlfUpPtP2Vh1G0pB?T)HS80l2jP7s+9{1$yV zsfqhohfdfO6gZO^7>triS|*=6$6K|&zaSbn2t{<Ej84aQYs}aA8X6mfSA)WkvOB7- zey6ghvXJo%=wqlet3|Ri))-?I>5uGGVcOu>xZ<>9{PS0#9A3k8@fD#QmMnuyXC7pr zaBX<>T8$pIxM0FT{t1{N6@9?uQyg~S^U39bv&T>tOe!NK9h~2s`(|-2bt_SmT<Y!N z)1u==J}|KIPflr8s(N$=G`)~>6w;nhvmHR2X5x04q8i&I&msOhP&Y`9(lQPj&M1y@ zI1&r1LP8)k;@%76nsjGZQ^yX)q|C!KlKowHSq&bb@O(6}$8^7e30<g-U>AtdaL#q~ z+O&-Qeg%`tJE#^^CPX<rmoAwzB>S32z`h9k${pD2rX1#ze@)L#&B>u3IukB|Re%^y z?kjX=I{h%g$M5m&y`F;!FM_{CsTCc)s=gmx^*q_phc6`{qdbq+<&>8DRd*?_C@x)o z?-(s?qnj><n8#pKFEd|d;wZm2z*t<P?j&@<jn5%bO_>nVj{_aWMqQ`5__Z2BeG@+| zpa^mLBuzD-%g4iE7V?IcDt2l{gbjTp*a3z8*d=59Xbq=zL18b6^TV`G^cnQ3K8-@; z!#jhw?)hwmhKP@{?arKRub7H$yESOfk5SG;mY=wPur<g%P4Z#aJsx7WB%yi7Q{jag zcRQCGk40`a(y;qQ?ucUOR8mvvXD>VUJb`AuK`V7dFvVq94w3Lx=afpe;BK~DV1j_% zB>UVBYpE;9>mDH{@+cP+3aBx!t(kw;o8<Quy!jgLF>JQ2((~67_l<lhM`thXlCYj0 z;-L;pA(S~#=t|H+k>22?%fdOuUbm_qkqkx+yAAv4EyQSVgmkT`m}uA)jffbIn5af# z<&Gi6wj{(J{+D`fOoU&g*4%_!)I35b>+ND}y!}--)?!Vak<#|^uAtBqH5^dKqNuJP zgtCkLDYrg-8{B9lr)=gpyw=|v8s|uPlP<OTelzS*9ar_A-B)J51Z|jSbA%i>!Z-0M z_eRtDG19=E0e8FY#~$}2^xQ1nv2|cMM;^0Uy9)QYX`-H%?Fb;>oC)dC<Yv{q>NeUi zt0H`*vMVpi#y3Os`?QkEkAb@x!-+HK96QvVaT9OId|h+drDpPHI4#<*`*tW;mcPR6 zrhSk<j$IlgH~*_pWBjj(cfYbS7aEUnp-|R1k*No>7fl32Ezxc=WP$PDQje1P*pK<v z<;Ze|ay5O;cpp$GPYiPT$1pMm<qoU@IBzir3G>)D;Y@-?mlHj{*Lp~i#EU_0JveS4 z-P)k#PPH#y#!MQ5(o<ey^V@R+S#K$@S4~)hzxHnou|6GEk-M--Wiui5u;M_vR!6$+ zl(|Y94XiX$F@HVW(<j{3D_LdgjjCJpRx95D4Sy8ofzYEzEfhY3?B8aK72koo;45+b zR@y$^KD}A^ekb`0^P}6Eym|{<!Q^yBR5DQXZ5{OOg)j}twlnvO+jw{n4LTh~?SyzJ z!92D*XVxyoI{L5kJtO{RzUTYo9uAGn!*vovCuw<);jr%sa8`llYYgyHD4Hq@OjD>a z=Tu|OKiP&ptDiW2u+_sI5GOBZ8{CODGTu0wSYQpts~w-hlIXs`@*yA@=K0(AXo+9W zj1jC33AGq{GMaQ$;SN%<GG47V=2p={b3v!4&GaX7UCJIWtlI96^{1>=n^0z4L>(-g zjK-uY?}zE6ivq(G!yEB8hZR(oF50Ha#liAWI4Gr|%#hnupXj!;Hdh=rr`th9mcLem zrVT1vs3|tnI}xU9@6~wz0V8)*GHYtB$02kbUY6a{9q_WE`fOhcE?q5|n;>G=h)Ew- zPMPSAg6ZMlO_iB;3ntQv?_nwvxD7Z?Ayh)?MJSTW7H#@b5m`Vh`VkBa2b#7c#77f8 z*Ud){OxQ*?bI-&bn}Ow&e>$RfTA|;GSrKi#Ck>@97gugWmkjn~V(26+mf7j4V}}&x z0ul!EIEcLguVA^95V%AJ^dECCQNJufar|Nx;!ST$G%5PLdc2tr$02uAe6@C`?yBE= zRBdlWZPHrA*M(!!qbPBvH832ReVrXgZ{r}s0U`|<=s~w>P<gU%M2|S{BQkO*5sLG0 z58+xU5QW(oU<nMA^Vq#b^<4ARBKOh|ELO0(NGl33i+IF)LfI4IvY>D~JQuW6lfwOq zl0^C&%p6<KBJ#n>801pcY%D9Q6iCGpvXu5T8<eceSlQ3^xgfA^(|GI5#m;r_th|)3 zu<3qc8<<FE9)(1pdK?{b#m-ZN8_{`lBBV9UFCiO#ky&#*PLuVs*4`9_FKI<GG}-;t zyXn3F|4m`2ID2yHPg9H2BKmrRdCEi7-4FR?u<p8S=huVPNLy&N9`zeWwzHd5W+t7W z65deQKQq(=Hfe-{<w<q>UI?1AsdX|Y1-1^Spz1{OL(JLAqxMOo6s>ui%gMi^bi#kC zz_%3rRTzC2-!AjM;&&;L7N@?ZWxNS)*I?@XDOjhv{O8<;{Ve7OG0e3oYEyA|b-WcE zW_kH+lmfRTX)`sIzD0E8?~fxsr>WVKnUv)SZ|_GTpM#f4w+O2TNU}|bmlVewCNs5C zOIM`7katpF^(~w1wu+cP!`#?HapqdJM0F0J*&R|e38;e^EbJhLLu8|I8Tq%b!||WO zS+Vr^4tQ-2bh+;)b7ZWCUBej9z3oGxvLrg+3k~AfSr8Y_+acOA1|nuuCoMoWtIq(& z`K|$3VVob)rHfoGPcWs#3>n-H(f^FL`dU4V(a^{+GqHo{B6h+Al$khlP!3KfxbK1I z3SVaDe~u8>fD=kt9lp!|tG@Q?zJXV_l+FpUI5t*FXNGv*1BPwPo_l!ZwMw;$Vs_IV z!*SCG&AIWiF}!JEv_X)QZj~tR8ZpLhjx#)pd_ROmaq}C5s;$SlTjcJ6Yw$_f90V)Q zS&<i4Q;UnaIvA7D@fJ|FfQWu;t=$Ky!)dCB19tUej%t-fRT@KZteG?)0ar^UWtPK9 zgKBXwHy_wsJK!e!ADHlH24qT_WVx~eKbu=fZ^&a3N`mI=IFNG69Yg2QXW(6OQ6fn; z7}Xp5DJ+7=wZY^9zt&weIY0>fLkNJhqmgU#@1oUrqUM0aO+YZnItR1XPF8l)`im%s zxlhB3g31{#G8q7;X(zg;tQkdKi<D)NnFcAV*##CKcRd>fRMxejH!g_cWfiQP26|9^ zGsLmQKE{5MUV&PbASE9vmXp7x<b@Pb9(`fn_?<0%hQ)VEsO~5rxZc%FcHZIlAELW5 zY;>A%2mSuZusQ@wwRVaU7I4e&XOh60jtWUjn9TPS=FcMaN%xT<4#WX#g?dc+E~Ype zgSpZB^5vY9##}o+<Ruq1Xjn(#$HZ3^a6Ny6aLgYte+YYILq^FT&%Puov8i;o;S1y! z7F0B}E%>{7&w`&2X|>$s=X;ez_E3}$EBfsZxJWZ@f3oa5SQ5KPlR!2EP4yRu@qjJR zXyv`1C*$@k+P{eA*Fx`5O~WZtM*-h#M=;l{fw{d1=1#x|auGHDriZ5JlvCt1x5tM8 zzHRXDxDy63_zYI$7Raa-X{7hpxm}$p?>bJR;+ova--I9Tfz6bEVbHgS$VrbHc;gz% zyZi-426yeCi31vuD{7R&PV(DErZyNEWb&c^ePKLoS7J!Jvh%9_bE8~O5(d#G*`P%U zjPwz^pjqM8e%u&a={x7(gmFb9e^`RaZt^T`2x>sf9;+!|+E_<XsohYAlRoTl^IvL# z?Tv6aqCchbnW9eRaB!xSQL9i!9u<Lud`Z-BTb>k*^6#_)J(L_Uu3wx_W<E!kBp{3! z;ukK8WZ)i@OXMp=xtbDb0^ua^eT-f$OzBM84@pkI$WuxY)n>sy$HtJ2QUr4-Mu@}+ zB|mNq3%!P1ny!s@Z+e6=>RHj37ASj#*E^wZ<Hsk!=PrMVST+^diAnuGS4m1SZ1txN z<;?ljxV@Lwz_kf5z1K9Ho>tMk8Y8)1_ps8=2EA)~KtUyM!ypNh<rKy}h?b{1VSVR6 zsXTqG7S-abz!N2>LS&G^CT2g5tzOlG!t^Vlt;*v_ByhHa47io{x7q{}*|MwBHjwCI zdVOu{G?fvM9O6X7KZ=jUMAd#Cd%_Yh93-2ly9otos8_c4=$aFqD7~cH8<)U~XZs^N z1{<@PPwnCAJ1S}l^V<t$M;OPB__x4-I=Z_vX%m>6m@+R|FuAc!HLR5!&G08FOA9a6 zZJtXEi5DJykUbw(D5H>m36^PN#ON%glLIICP&BrlWcI;;4zoz<<Kq9t=yw$iWs<-U z;7wU)Zr_VeV!6(u6JL<X#?8vvzttuqq4`Qs15v}K`*}3oGX@&{c`I_G50TZ;nxD@9 z3;T5M|7~${bT6MLt^c(uOIdYi3=zT5KCUsv%%-~qk9SryRjq!S;!t(?6kWU(Rx0@p zb}hWT`3@DQ9Vb2N-b&gk3#FIH9udP@U%@O`W<!f-*6i5rvq*O_KbeCy64^%IEacn8 zRMkDJo~aCxZ>#9oWr7u(fPj=l<I;Jm{j>W?smdPmHs`HiDxJjQ<+{m>a%X9)#cOEQ zhS+;ybUQTOgaDmn3Z1M(;gE6x`Oz>;kn(0d9OO&jLyTrpCUH0<pQ1GNAiSAYtj%5z zMJg^c&Vj8^;e|D`;4r4bV2#`Uv=S-12unSz0}9{#RCu+XOgo^3Dsln0FRs<aULK{Q zx7}t}aLroI^VcAKGts7p)J2W(k;+enO6acuN0_^>JfeDu`lF^#7KHpcb6NAM+;jaA zThRa3V)qL3s^yE_lxk1@&_vE5sq!BV_*&W24lXM5AasP96_>qFI%52xt#kJ%?r4@T z=id_qnffE0L*p1A*O?ws&ZG6z5Hvl3j&$i3DD}bMc>@EQ6+9m$N2HhR8Jc2-C37%* z=Qxhs_G`3CGNUtd9$<kCnr6|w(=y5*OZUvj3FQ?qT@;eYX?)B>pG-!Q9%S%vZ5X%K zb@)!pWU&{^{0xksYqLohZn(i56Q1A~f-9PEmwhB&)RkX=E+5H@UbI3<6WMKtEJ`<= zrOAP$J^d^WfNmp&ZBXo@dIr}>sexMkwRNrWbYNC}$`LDFy$9U=K3Gv5QcUi9j#Xdd z0-x;V?C=x%cz`<y9tWh}!19eQ-h_+n*qZg&mVd6sMukj@=Jek^$YY^u_!$mo4nN34 zM23K>o(qZaE{mkcDR`Yoyj?I+3;L4|@Y=`)iMc0esmfhYsPGf)%mo1+%NZntWH^>T z0i2q-?K|d2U**sI9xZD+fFb|+B!F`0x>uxK5SW875emAXu^upRT0k(sfX;UUT3aGA ztSj&;omnjkS_0|->AQ!CQ{U16mu!Ybb6`Hse@LhW-OrqYgc%gomn;IND4MyOv=-AS z_Y<dmICbe$Yl_$y^C{@_BuMI{9IF~HkTU3$65HKj{<J37M)|By%X1=uqd$a2;<Fc- z%RV^{)kjiJK7oUA`GmowBz5hzla6)+hU{Wg_b0?z(cyPjm@D1O$C0CoZYFqn;W$K& zcH9=skduAcH)AJg!H%1f+gTgMC=$-Pz0Ze&7<EkX@Mi?4oGoYc!i`}bA8Ub5HKtu| zRXiTR{NqbdUI{66<V4@(D{SfzxgWgC=N6WOk|EzMl-<VI7GUN*808cs^V>2$!sE7N zDhU~mIpI`~Fb%wDW8*OF-=<K}G4UG?2^je3)}#kdH1AP+U2Axj(IO?iMn^+yQfG^s z)SKWmrZQ;t7T*qd9zzsW<=n1jZcUIKS6e9YuiW6XR3Dog6lM>Pl*CJ(0seKA;xt3E zypG(K3{rqy3{zP0U*j8prJhHSH0}y$V@VP`8Z|XC_8#E>fMHinG}0PjIvqhC=m>4Y z!vNNy*`yx3HcAw+>94v>2(-7tAL!-*^Cno;p>mu0q2(-&?FgPPZEn-)+_x1Xt1wVy zH&&%v$Dx)^lf~keYZ^#J3$32Ps1!!xX$(#vk?Ry+8a9r;5_aCNy7%*`y34)fikC}z z3nuuvQo8FVG`e8_v$*<<?YVDL-AI|gNoFjBoByx5RG;D&I{kVngcdx8QMHG#>;l$C zXW|!sg{iAiaiNaKfmwvl&_My}R2N24FPmn6ECfe*Pc>4fw*lfu;t4pmXi3v2Rp(&g zGUaUoWiApD4R!3B_1uhqhcSxYGz?C^o;}}yv*%?CiO}!jbF#~M12-~$(Bx^3MjBS^ zk&7^`84>QMNN2rV<-@0+)X-}u3p!F*b^q_x(W=UBfhISnrHGydOQ$&$)XBUTO?2lG zM$0q%mVEp&J#U-T;Y?tL=jY?2hoGUj8J>065u#tHd1Ah@XvGh<NdG;>gHm2Ma}?%3 zC%XqAguV<uGll7NY+J9!6}yXZ05SLM?~gGB?U5d?UF?YlB=Zw=JYJ3jH$fjhanreQ z5nR>4>J;4LEV}>2+<yJ_uRZfyXQ+88EJ?;E7BN4CCNtWooHxpNGzHv#T&Y+K7l+hw zZn@08LB`-HLNBX5v`B&tK296-a_rIuEboWUSrcui^A8ARyV+;!HM#QlZ4Ae(IU>h) zD!)wkE|liCM=X$F?Kn5s3cr{QmZXtP%ky_DLPBAbv0_}x>K&StYSltPs2>;>p>Cfh zJs{p;QNI&HuN#||85hS<YYlAICOx(%6ITFQKS5Z3KUC@%!1z)LnT@ut2?eJ-y!2@| z7?w;fXTMKxC&9_Z<n_mmiRwqo)XUFDtnpCk;BV5l#o#vj%DFeqtcnjV8X9fdyqsGZ z)ut?s=)O<0!-c5Dp$nK)wgQ>NWPx<;K<7QpV>qnj4LR>pS~(f1W*iB{=Faaa^^e)~ z_w(ytJMJiMo(W`i&<PfV;}s~^e4X@<)y!<64VeYgidR{OVdE4BmUdc7s4k02KcnBq z91vzxm}mz5-PC>`pItlOxiVVf*M<J^c}{8&t!jqPI8)I5e`UH!mM<POE}6_9*mcDm zpj;vM4I>68LS}8CIHQrTq`@Fp4aQS2XJ#fovBIyMoASMB-TeJ$eB6R}V{-1g0JYIH zEw6}MqEcOVi8j0Vm!ahZ)RJqAWZi%~^}A?wp*pMJKR<S~;S4Gceqg?@7WgX=f2SvN zn~TfIEy%j`?{M4I;}3@GvSiojNK90uHMbp;{Pqa?2#i<Pnrr+P6F*=-uea$ohuUM5 zz3uYD6Av2K{YBqVwmWJ^XJNwyjDE(Bz|)VoUbE?1twQI(74`TGz**%FP<Ze0wJnK0 zdtg9m%UN?3BURRyXw@G{TXDa=Zu4;{<_k8wu9WSD)qjEUy^SA)d>#Quz-|-%gRIxN zb4E)MF<aetOGCcjV^HyaKGo!(vw~EquI^2;+kTpsL{eI%G#}x{z?)sD*Udx6C~X{q zFL(FZm%5aL+4N)%E$e|PQqpp|#a$ZW-1zXBW|%lwc$IHe1q?(OF$`x?M`#ZVD0}eO zB-oK#X{Wc=LQ^IA6t46Ya%&uwe5wn|GmqYXY*L-f&26r0{SBBgxZ^{4)zq!)`tNH{ zKqu70G$gP+&<7Vtkw2-_hYteUNHOF&q_92%@8Ce1HbLL1?5gBUP*%ib3<%~YA*Gxw z2X^sR<Ahmo{dbhxfe*rg0<D54TQsF%R}r6YFRRMMz{d^=)$j+8Pzvi8-~*Q6jN+u# zcFH<QLDMYvc)JF3@gutUMaj*GeRIwgghFQobmb8mXP+xTpI?@%Zy(T5@;^ObJsz3S z?|(}>c>VF?IFSTFn~r3{LUHHSyk&A}JK3zX4jjbiRVdD`#aDAVn$7XQY(^gjC!DMp zcl1=eO<whmXu$Z*gHEwQDF-p<y`F53FHI=*R-DJEoQ0Y1#&NZBEh)HA-jCt<dge18 z{V85jDiF<1??ijX@(*d!l(FoeE=}rk+UpH}HQRg+f9dTt)u!!%NVWA>>#AfSRe57S zOuS$?B0^y4>Z=hZBibbC)KT|r_ii0qs4T4~KNR)7{Foc;PZ3nr*~u(AlcD%9gY4P# zP)<s&$LF6L$%zvUDt&*0i1|5vGTjC9X3~wApAzXz=>>^=#*Vwq_cb!65Luumd<6fg zW-+8ewBIIi4Pdfk&|;~P_AzApQ^d=UF*d+ml1_18yt}mB)MH3OcMDU-Llan<yTxqB zXhtY@_~|9da9A7R`MC%qAB+Nrx^;nhvqlAeB~qu`<~7JyX8`hd;s0sx{(qXd!#IHd zw8U+h%w?N~MY^~j$i`UXl(C3-$+nECiJKBd!a{$*#3_R=GlG0+FZ+f|9AMlCVW>CR zCLzobWwZg6Pco;7FfNE#rPIz-EL~F@zVyrWK6lTaqc|Y^1N-6modnVxz0W=G=lwc6 z>kE!4p&k7CWS4WRKlLk*OE=v)7QJ2!S$^&+%;0;>cX$yNn@8^(3zm73*lg^KjzH!Y z;NE}-BZn;7ZI3CdZoc2E{Zf4<+tLhYLSoT`xk2>awAgK<i)OPO_b@^++B~0Q{52<+ zv@pBgR_tRvb`hKRRoJ|j3u2R1@oOS}blo*ed#~RN3WZgA>J>aR8rWTrf?U#GMPFC{ zXmM2FhcSj8wiIi{6A}_9{;gYtTG!RZ`Il$Z=V{?y-ipvf1A8gDbVu|LlgPJY<YC50 zAs3qC9_cJxoyqe{4*jXw=P=2zT1uTCK<cd|E$zL0=<d+>9I^*1ivDiZ2EyhMpVPL9 z4V<Vt`K(<HwZZ=LdOIsvr6%$6LTp$U!rO;>VdDVy?=7?a``jNoB=(G^M&#GCr`7T- z?pU;;6_)p_#)g&_SI|G{;^D3^_s1J;0sJ6NIrJljwsuLchr{u&e;X-Xx=-4AFfbhs znB*TfM6WBZ`)t9v>K>kXr|QeF&hcv<m~U9#fmS`0TN^P!HXc)EBYRv;oR92RaK$^< z*E${CYxK496T!XsB|=%9va1(b${{C9Z&Kki-5rbW(7M+HTaQJ2wy=o5PBV&yUY&(8 z^xQRxYk`<PM49`(bxb_1g0W)C4&wJM{sj@?$fNJup9RIJT#P9>4|YRktQe2`i4Y6v zvdxvSjp-xjO8w1I>2lC#RPmb}Aot({msPFj7*)aSeNz7z!(v=I-I)bH#Sd68eNl3q z`1_4VHViDq_J{>Ds<MTr;KZ(}TJM18R3R*+tGLcA45C!FOcrJFD9*XQ{ax;dbY7w_ z!<f<?Q`u2=OY}~+#v+;3zPC<#SH#$K=XbLOD~}^Iy>fICk55CJJ8iwdL!f)`Qj=eV zjVT>@6RbAr@!&wR(~LD|JKkkIULP#S$OECV6KPIQXsylhA2+1Fshg23u>_>La>&NJ zw|m?e+2#IYjNn$;`|V{nJl);|Pn!KuR`5X+Z=J?w>Wq|+gEmpo;3NHb)=A++7*88R zs|P&C`8Id4ELDKD&u}#UWCy$xcy)0+h1#YvSHroKT72rB-&nl`WB05|dA?h1oG}># z1e|x@0JkP&z~Hb_Vg<o0dc&SxaeO>f!Eq+k#u;8~f^cyvr>A$Qmhq}H;ml5M?X+m6 z*dtE&t-Q_UHQ<)Tpck%i8*-W`Y+=^e0`l{)W}kc+22bJg*GP>yTU=oXj(CibG8Xjt z&qvtyxW&rh)r9N>Ld3A%FmA-3e-fu2{<|>DV2`GY4-fE7ujp0p;!IdHu18Z8X9G`z z9?(q-M+Wud5aCl5vF{T@1EYv+LNlyn7@JdpGPkoYoVq2PRu|7I|I6}(5EPjy>S`Bv zy@3A{A8PG8w2p4vl_%MgWKWVkN%l;h$MQ(_B-!(|0+KyR_9WSpWKWVk?=q4-N%kb! zlVnelJxTT?*^^{Xl08ZG#7dfpWKWVkN%q850g^pQ_9WSpWKWVkN%kb!lVnelJxTTy zNcJ2f*^^{Xl07AoJxTT?*)y4BPm(=J_9WSpWKWVkQ%Lr#CfSo@Pm(=J_B0u<x+B?> zWKW4?Pm(=J_9WR8`45skN%kb!lVnelJxTT?*>jEpCE1f?Pm(>C1IeBwdy?!)vM0%& zTI1~d<<n=(GF*t`TU<R&Y^`>wa-UiqxfrZS4p?ej+NNXn%23YCZM*9{IQxZ{`KO6D uZIJ9qvM0%&a|SfYo+Nu}7aAUPydh61p|d8EJxTWbzsR1j@{?;jNB;$R-@Zox diff --git a/client/resources/hardnested_tables/bitflip_0_0a3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0a3_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..d7171c287cb21b04177b332272dbb946aa2348a6 GIT binary patch literal 2973 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0a3_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0a3_states.bin.z deleted file mode 100644 index 3d2cbe6d72971557e980250f203484c6ca78021b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24297 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�PMZI~sHmNp~FHte! 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0a5_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0a5_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..958b8ed3d39035f65d4f5c940e5dd24c7383dfa0 GIT binary patch literal 6943 zcmYk=Sy&PX*9UOhY;(yJ6~=NV6_X{E#j;mzQE`J56aq?31On7~({x@lttJywQBwqg z%5ni^b3tgzsVuhywN#dtshKt_ZEDgMx17E%zuR+jo^x@|bN;`*R92w>9tt>~lI3vj z@$%DzlPP9mLL8Au2{YrZcJH<V5Q$c6tk$e~>T|LHzqiR@xgvTMfzW`*?><LdM%-Jy zjQFF~x~*2>ySEazu5-fg*?rj|3R3EMs<dc%(W+HefCQ`MEo*LBjmb_SShm)?S*}(f z)TlLX+2ujo6;>-S5-a^>6mZ$)Lsl%~ZXn9K@JG~2Q_Wd^)OK0ZXdd^J)g#_1LUfo{ zEJ`AdWyMF-udc5OXm0s7Bi);PWAE+ALy@|**ciO)#?{m2ty4}7j1AnVjS_-75?@_P zTSFtlys9Y#E`hr;-X{iu!A16L?8CW|;o+sk7V_y)TJ#n5I*0i1*e4M^N{7>56gUTL z0$mtM<5q)O#2gJs3AQd=(L*Y=jryR7{gmSJcR5KyGX3-0V&>Ob?Go|@Fid~qmkQ65 zXU8wnCBlXdR=Hf%G6|AH+y5&4yL|Zs$=TTjFW3)s-QO8g1}H9tDJZrMW5)v|b{QC& zjN%bhYHHWXfvDVu%J+)oqKLKro?rW$F)!phvMu7k&}~2SBFF@b0DGtx!WR48VpLmn zO`YqV<!3C6m@Q_Zf2K#+8x#`GX25~;As_>epqgQWNU++|2$nGX*&>vV+RihxZt1b( zL3>`xXKR{XmRk*NxXOPJ{}^-m;+7oz4xNDI<_*~<E#5j6&l`rVW9&;15wc<)t72OR zASc>hPPbkycsLnp^qNis@2M~HYrm;u=?<ms)4iX&asS%;VEsp1{6MxW)TdsS26Pre zT~#J(qHPQ$6(}dks~7h957;!v6I%+*g2B&^^eS<t;_9GTNxK`!d!_U*4_>!z6DbxX zE`3ELGZJBI$4zYMCXkTFXv7y*6_dz@YcNuKuPwr4bRA>R5_hCx4ZTq!RjM-(Zs*S# zmJQ@&8r@h|5h>#8-W~UuoXqjrJZX06+h#DYnD}|^TqD8NgnuK=+t{^kE`cVi_uqJH zSU?jnQ1!t06%d0-_!HZf0QWhhw}y~>nxK2pYfJHTb(CMxS+y6bnpYx7+!*BHsi~FQ zMh6jDa7d4|Nw}vUz*3zh^Xp4c)m>4yJPb-4k+qXw=7>k{tMxi@4SL%}6QSK!L>#T| z+EPBawSR>VKpty}TAJJxooSa`|1P3g(cE;j<ZesCqP}IEO)6@NN#KCj4a#IS93cz} zkvWD}bG-YUJ?n4d_MnJK<IuP_%8iGp9;;G(6uR|&+Zt+h_K&m{;zItX8O|q%Z*}jw zi@pXP%*@tKANkTUPx}f)R%Ct3yYaw$=XrR+^0}y@+}U|`qH96(i2jbR%Y%F&ow;i! ze{)4p;|CNI<T^qX4PiNp(U-=%AKwwo0+SvL->8h(|F$HeM#E``hVwyaY7Yvb(aR|Q z<)JaI{SBd^Te;kpmJ?k~s_^Jrj-R#Y7zk%Qxy9%&=Kz^0TnUAWFzHYX5w-($OJf*< zFvtv|tVl*zi7{e|5F@D8_A@{OoiGx_8i?Z5plKW})u&187)~{qot=6S;$Ov_Ceuo@ z$J$fvV<iF`8GrSuLc@lsm_Zq#92&lUi#nVGQ-VW7!Op7cQ8SH31yXFOv{VdHKu?Y0 z!6|^EL%2web&Z+LMj{=-bXKZ0nk?ZXP%wtj6^F&9BH=I&g&`u}Zt%B0om*c_q{=uH z4tW^JRHA?ihNKZgXDEij90nR315{E-@wOCaocG^O35}y4tCj>#HKL%6aMoIB)S2#7 zfKV<=piw1Sx?hutg7bq@550u>Y)jDa*A||wXs{+ye5ftuz>WL+)=9RMTggHJ4H8>O zp)C#^r;^inKn|mH{EYIc(%f$vL(sx<OX4HL1wc{_W|gbs8U)c7a=`}CH;vwbI|kYB z;C0F*;GCIrI4(UdZK-g&)RkPL6%&gP3?Wf4`oHPI=RVIB3nd_XN!#cA^?4U`53?AD ze+~X|fqXUAH+0Z9Vek{+%#cqe)KdouipqLU2EzPpbkN=7`wL4#9ixE*sj#DEao)E< z?yp0v#Yr)hr#={ET`1E)-J3kG`u!RM)qeeWk|3`Q?=)8gSTX?KmwqKVI!AV2rst6a zSywCYIXfVO**V@ghb&1TR*)KvqU3{%#<eASA*sfoY4+$l7K9p){<2MMqorynJ1^bp zh!+DnE|<Uc8#51bsUVQbg7o=tJNYA9GBbD#jWB2q+mdx$omBG7s7@;5_t6Ipi6FA> z?Of+q^1rGt`@2ko^PZ+=ee6W&k_Smv^m?)X+p2fZHN#9+o(zL(jO>Twz)+|MU>cp4 z+``&tO9qLiGED<IRjShCX>GqhWplOr`n^MdU})$h?g)D)ry?{V(XrO$+<;9Ipj6Ap zdDuHt33$Ri{9F0PNnAX1-6v8g`IcE~V{2{m89yabgMcBb>`^hxAJxo{@pyJn@N$~d zGl`hw*R*Qee(YOxc|I3C(@Q=c;brDFZ&MsJ*C3I$NdM_%`t_C&Gsrnyk=xwqO3$kr zE07l`tKJt?^-aK`Shv$v3kjDbDtzhnV{zB(pD|_oq<(E5QK~zCmxMRmAP3*w#4?v5 zLs3WLmNJ4;UZ8s2sG5U9rpkD4dU%PiwEwr&x4q#;+bM>)i0|`p=Rs}1`D?Sw@3Y8> zOKf2>C!bKTdJvIvDdJP?EaFD!zX|_#hV>s$vc>8Ux4EF~A%5sgOT<fjpv(9Y(I}I3 z?$o{+H2U*8T86PHLyFgKnV)nvcS*$+A!iq$M5+>ZlI&2hVQ^H0Es5D6JBL+Z!O^4R z>AXe|$yv~17_Y6L?*#KyKR^zD?D87HNSNnQ<}{e7{q4sS|8~>g77is3+n;tvpciWs zo?cC{RDFH5H>c`_9YYvMzDm#Sf1kYKt9$(8ZYfijymDUFG|oP9!lW-KF7(}ZaEkt{ za>3ut^;KXBd#HszAsQQ!_d445bj28qD;#0p&w#2kK59P37NzNsHlj&d5}B-F(5P_N zj>dkw=KgA<2bs#rk0%N#9BnQrJnA;sN%8Nx&HA1oKCJyYBapbrt}k<VbA-JKftDTv zWTsHg(aad>sUd%Q8k|HSbD^sa-5`1yly8!+%=sQIE1TgmCXPp;zVsQJ<ddGqH)HG+ zB3k?CpwTE$ZgMDS>l$kGo!o^s#^Z<Pe8YSdh(=`SD-E?$JRQQkgnaI^$O|F0iGj%t zMjsiakS|Rlp3%>q`sx`wpz>pxBn@=G4w&yXPB}D=CK9v!5G@)qjUMCK9$$T<_VzLS zH)}bN)$wNYxjG&>)of9dR*!JD1$$+!R#Y}(;N&6umg~N93LIiUU5cqXa&_kBI??hI zUHngoq#=?j@kH^<uba22eg8opum0xpg#5;RK$}aydJl5F0`lSBYUT5rX~jj8U)0W; z4yMS`3F<c3FV(qYLQF6n%i1<-8n@5y>K$P2^~U#tn17-}3<^{8Pno`5hgzGL>Deh& zDZU?M0?yaU?pNJVv#j=70S1G`kJXO}K{9P>-JgG!b{{K#NNRo#Or}o557ya&B^|V6 zpU)x1qn~{XUj<t8Vv61T3vE3nsQ$e6=}OmEKp5X<GfZTxI4I^Y<nG6835uQ*>vAhf zZ%!Z#JZgB}x+5<(w_FY0p^|<&;pq7OzG=QqG{0+bq5$gB=v^3M&pvX4|8bl5hY*V5 z%VC#4rE`YiaWJPGBM>%(y3{Wa7nAiT(jMjoZN9f98Gwt;SocQyu8<F7h+#|yuS16M zmjyeSedL>8m^3*g?{f#+{yMSnEp_uc!?*DzU(Sc#)y2i~<OpMF|JgbJ566Q-6m9Ka zY7HN@#ZT;547mhb3~?ufZ0ycQr@+*<@c>#yMKf4xg7y?RO!@Rb4MMd!3taW+xG@_= zkhh&yFI5c@b)~&n38N7$m(M#j5O=jM3y=RC9hnFCadyvpI6O?}+=!wp`v42Sj>Vi~ zpFD$52~KuRDn4~XUXjQnn*sTb>xtE9n9hcWap?;$d=Ns5I<W=1c!;rn?j7e!#sRi) zu+z(+kNC4W@~QjXU7btaow~d{9npSaSYwRw5p~)k{Fz)KopF}Xy<D1{>4mBej3~F0 zLaRm~%6M3mIMuPHmcZU?x|9|2sZHmx*T9;<7yQa1%*jI_u>+74@a040tIkXjI`GL2 z3-_Pa!G^$0jfGm{*Av~YQhJwpDc5Evm5Ntz`DJnKdurkgav(t%9^JFNKZy^S&K<i$ z9Pn4VWf5~wgay+EdH(1Qtznq7mX$$tKL3+E<X4LqPpaO)1mJ)w^dX)Zs{<(aq-&9Q z9o3IaQ^HqJwCEOkJJnz*M~gu;btnfD)d8manW>|lU_~b^1AJS;EEh}683%wRkmp+v z%NhinCe<1B*}`Z6!xO$itMI-$%T^(*Tj;@C>z~WfdHRD5uA(qgB0%SC8WxsPYLw2a zgaMazVuhNdU|g1rOBwYkrw5ckbj$a)9;Euy{Y?@wQ4MuPlf^7Cl}`ebZLv@csN?(a zF{Cn&)f=+yD5CyyI7&5y;mRbPX}As~GQR0DXl)+1<A($37}b@Q5r1(R8gQNfLJiAs zc(FjDay1}{Vrl>~!MI#=CUC3Tsd$~Pkfc-ejfusGDlWj4>Ix1s4X_(MC`}_s8$$D5 z^m>6@NWWX->PBR%ln@jr=*$Ib+FI`Q-Ms1x5+_TGP7&(AGdeJkYQkZ-?H!($B0j+H zwv=pkH4v3y!ve7fnbQm3J*uRFM$<ek_0po!z!i?pg<^>c2}KRTaj9tkMh^sv#<|V2 zxKbI7{#=l17{(cBByHL<!+T?_ZVx2VOhZ_<fC2}R-&|nJP#iTVBD(FfbJCbti5(r; zp_yzY;rUq2wa`9Zxd(+qL(63GqZXYTww3zqvN1j|i^=J#=}I9vpJ5!eMV`$rjER9m zF{sPe$v{qI66`0Wo=s-GF%8A=B-xB3Lzr;2Ph*85HFIZnChfryUREoiYsX9YHc(1& zbdzXHZuA&kxL2r<tnG>KaWX{qN1fXjS+{`>K?`xVRO+}4Rv1b^z-eP%SyhNVXRr-m zd{ZN#@_lul0K8Swk_7W%q}XUc8YXfBvw^whVN}pLTwEV;KNPH{A2KV1+%S!qS3S^h zZL2x{TXWc!Ap()xVy~N;7YBu47<V(pjYy>1i{8rB6})7pH0ngQo4)_ZOGGc2DkC=O zX=xQ{Fgqo+6Eym&-V(?g3OpJU;SF7Z*kN!pdfQRuNSJ^tMh&9b$`x4btvfvn^7x|Y z!6HTU@#BGSZVU;rX?^`i@#Q-$l4ctw-+S9pD3A$44HZ*!67A&GFYsbl<ECse4vN{? z%FXJ#<91YR<Vy#L90yh>KGi`qa|Gw=3%Q=qOvKgKv&B_45mzqvzzGttXRaDWK1Oot z<S;k`C8fiM41jA|vnHLQyUXZT49TchI%~Ia(wg^m(()J&Dr6pb_5?%z!q@BBCep=K zuLCN*cr0UUv+Int2alPZ5R?;m^rGu+<*H^|yK|!{2#$1T1%;12|3lKgSDnSR<-T5x zaA5AJ@z)oFX??ksK1Uk@CteWsS^6?44E61!6QG)bKKI&9c+T!x?H5}jF>Dnv;S`Rz zVdYAzWkh0})v1bQhd)k+d3`Y+NZqsd%0tZqTPvccRV2z<9stD41fgIte<k<yZUXt% z3JjO$0WQQyR@hjfSgald3&p<d_y5W(>l8#Q(0AdmvihzVrF?x2XvLn(K>N7m)dZZA zLn*y4Z-bu%xa*cQdg+vYPqpJ-92p}e+MLFh79mQdrHCK<@zpJQJm04XR^73tpM-Xe zGn|KUM1@hMDl|SN%#oO!ku)q$lEb&s#8?uh+C)hM^XOxhPGg{(0N?o(mkE#>rI!Dd zJXHDmrsL<=*Xc;FkZ1KdWmJ+zU6gt1e}>;d-cVqwqW>2}UYh9MI)f_3_|BZ8p^gbv z>~_mceF1CUg`o9*s(tf#YRB8OZP4!sQK84R_!lz$e^sac;7nCJJCiyO`>@_v%Fjpp zrHd@(tTPQ3qtkRy+n7@Y4sawNaNN~xn~%kuV$Ke<M6B#LP%lq~IJf<l5%JeTP_8m% zy3>O!Nny5?G~x+HEcYRb1Fwb2dacp#{?Oj1>WVK`aQ<^(r}jD^_id16NW(lDDo(!- z<XvM7S3eedZCQJ?eyr=^W6j<F{hafxL^6_$_Ej#=^)9`*Dt~=k2i&1vZ42>Nl=kyU zGTUgH25^QAsINu{y_&!(=w6-k+9Im0cR~<W<{LM*+1eT;NI_lnO5KCr4^sX(u@h1k z%Hrhg(2O(m<GZ3Gs*_ANE)sTxJ#F6I+N5!enX&KRd9Y5h17FZd*7F@widx21Xf24G z(lS@(sXS{YIhwGonDTg^mT`Z<#7>u{69xUrF-rx=rLI@A`*J3yz0LWUk6#vF<$wKn zNB3EMcx0D!DJfZ88GC~>E_|4RqKZ9-mFbV_MQ0aRqKSl2!51>BgM*`?hS^f_d1{GB zLyd;hn^c+uUXhQOa%)4nSp5SEtP@+SIw%a%4<rl>#E(=vW5MY(M#s~J84tyE`8hPI zw4GWGWIBt5X7YfXqDequM`&YBe?%H|xKOHvmr{=NGlF4_D|&L=R2Hg`tLo>LgR~5G z?F4@1$;>dv)wiT7IVGy;Yjzr#15>AAT#52>L6<hP!OXtRiaKj3!-M?f$4lS|<QkEV ztfE6Kj3x?}a^7D6$j7BZSzcrKCQOq!;npC-!<2n3K8%Wuha^pe*cYxf)xKK7h%^*2 zH|IaI#wVK{KF583&lZj!xWE0d|MR4hPj~E->cXdnM%#zoWbu2a_Z{i=K-V|jP6Gb) zw{dPU{bSv$KhyJ*lwQ+p{*dYOQ{N*cU!=itix0G;Z5I9aRQkAi^}g`toE&N3&sd>B zlQyOA-S~TetUojNpx57@^g2`0>czzE9!=w85<~KQMeh@p{=y`8;K7SlOV%)=PGrnm zn&l6$-(wZC?xvGW=H?Tt=jvXU86oW^CP_(cpJo5{C+ETg<Ibb1KbXG+H$LG86N69- z+u@0<3HkV)k;67r()c}_RHVK8_VKajz40vO=U|5JQeqZw{3ABFHKNWAH<IXb#`rFI z&EM(ycKZf2s^9uQB_=G$gxd?BiS8(_g}jI#$Hl%Fok(bY%m2i4?XtVLGtqaThPpZR z`Rg?1z88$4UA6yw`=j&Qg@R@I!NSA$4nF*AsIpRZPiYRmwBp}KC!c-0B6Lq35UYmJ z7h5&+zs?km&9!y^zWry5<-bMud)l~dkIr`6NT*%LQn!+tD3K;mIhmnjrR!1&^X_6* ziYBk;Z)8A*#G<?Z^y}i+-z&F&vFGHEEN(j3dYE(a&-I$a#csXNzs%2`WZty@MZMi! zUTf^VA1I{!*EIF|sPdiVYJyC}Zsqa%EJ$0?aBjto3C)8?vuQ~5b(FwOe$MyNrPUsK z@j!B0>^}4_!H#NNQ`!n3Vqk>HNX5%1;~S^uzQIpy{?~~;ZH|qOEgYUA>&wX&dUE;P zLEWP7A4gq}ez^h2e?XldxLNS^pG)j%SoerZSG%)zq%36N`x<(rIt!Gq5giN^-2$Kw z(12K|P>~;XeB|m3+QmMtxij7t*H|YItbP&mG37%B<Ng!&0(IsRF81Dk61z`L8%HLN z7u-8sHZ><3qIB*mEtswCx!*^904Fa94fB0%lGp+2j@Dh@p#f_VmNf@l{P%pL>gSv9 zJau<A(#(&WGlr?0&nMhto7;}1`)0(v7qnm^9@N>D%=YC0CN~A=aBiNEbh~T5%ziyM zpZRX`&8O~F`Y%i7SuD4&`NLEqjqSd55>z?)wy|y1y^kjg`n%swK2J+Zjv1OtQgh}m zx=Wc{(SWq+eNF}7<=nmSp}tK%QpUjx?<5xV`2*CE899E{tXD);<R@ROK{LcGu1e0| zu}^;K@3heQkHIHir)AVdT$3SCBi||ciOtQQX1oe?@gF_*v^|6P?;Qa>V(Lb4oWH7{ z=}(gX{pan{6Q$8CkC|m=r24D0X02yIm3xg3&7)Y7U2JE9rz>~bC^t&nFE6<~m4OZu zlh0^;vySusk@|zIq2bM5)N>2Itv9{Tr>5><LWItYm*(;qz8U9Zank~=8*ove1ct{3 zVUlj*)&DlB&v%sxJ>FGC#-6*#ydsfvM<wZ!<lS#K4iGF2;?tc0Ee}Nc08tuTWU@43 z6N;h|jI6?Nruhd#2PvAL%2qc$1i_e{2M!>AtXM{gHWel)orJp?>sYuov;Qzi)Vzk+ zpZwn@ylI3(=vf&*9KZ^+7#)uD$T39}fJYbNd{9+a`VN2$Vh)a(E|amDMo-na;K%*p zv};IbhR|YZhHM?Jt5;zxe>f=N3M8SLgi9|^H$_u9QR(LyK6E{<4EzZ4kYNX*)?8Je z&q!r5D5VGs*tVl)leIVbj|0`zO<>7D45m>Z5uiWcBdrQl1e9_1hrJHq;{wRGN`wwA zDbMi2cU%!isRLRDVCaJi!L=qy09Iaugr7%ZnV|d7{;PL|N~vnNH{fa~$teG7$p;xL z-usP+`(LUhy%~(jD;GLOMsVsU0e9C+a1?OjSV<?@(9~J}^9bX~g%Pfib0=ryXPD-f z#G}j{2gK@9c1;h6T9J@@hK?a<nw@gFk>`;I4&Zre4*h`{aEokHUn68mDpkRIswLIa zbRlUy4hrI!Bt4dvD=P;1p5xS<^9=5|t}4~1Bb)60%&=A~mBcLu=fBp!ef&pmcFJAQ z5O(A~BIimk{H|Z;;lQS}AFTgyzVqAn*o%p#hTo}0Px3R01Mfb(`y|KcYzcUaySRT3 z;@H3)LDI^}05KBlXj1g(X?0K>#akG_Y46?gTfq5%^!HDguYUji=l3a^8x-_`VPmu1 z&-Q^Ywjb@MGNMOvDp+?l&r)M3>uYi9|L(lc*LPC?!@nc^@L`5=;Evd+eOUg@B`bVK L+_@>jo3Z}`DCiJi literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0a5_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0a5_states.bin.z deleted file mode 100644 index 9e680357273cdab64ef2d096c63e7a7d8c5162b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32404 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%0D~9wE8K(5<^y)b5-^ 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 NTm)EfOV(3u{{>sck}CiJ diff --git a/client/resources/hardnested_tables/bitflip_0_0a7_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0a7_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..9992d1259c058cfef1f5265e8470cc0908aa6462 GIT binary patch literal 1863 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0a7_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0a7_states.bin.z deleted file mode 100644 index e7ad43a848d836d0ebebdfe8c59dd0028f87254f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15903 zcmeHue{>YreXm@<gwv*{)Ja^73Et$<7mh>y6o)vnEu?W@Vk<vdE2#r(BVb%(TLu|6 zHUSwe(j~{uF*bsY>kvXfnj~^6!y+bFh&71SB@IXfkR~#$7D-5xvY?fBwVJL*v$ON# z-tYU)N{}>t&0p`G)A!EX)v<)N+MT&`zu)iY*Ss>68TtDoiO;-M^y{a(Ctm%~v+(}J zr%A=hMZ2comi71JpZd_p|EbTa-kkjO+dn@2-L+tXs}bhXWFk4&-xIBaHPfsGM5lw+ zIZ}xF<QG7{qejv1Kh9bb>W}g}soToBX;y|Bnw$C3J_|c%f7Zn$86yeNjlpHOPI_XY zUeck%8$7q|Vm%{cqD9xZQYh+3YjyF4A!S>k3f9qFDbyYi;1C>yhkgJHFF=ZT&+54E zFf@{EghzO+ArpaO*biq_w-{>3ceBNONM`u8I|EPRyOb9GFb5fk@1~5T1%qUT|HdC# z-L8-psXCXgj+8jg$4PchLe0-9(y8V99^4>?kex@ouLz%W82_!){C;>7c9De7dyVSO zy?h=zZ}f~znlII{O4qdcVK@wDMEADq#1h@JzDDn*7h#MPSt6f#FZ?eIzf`jpSPFs= zRcSotfZJFP{R#SvQ|0Kas%jWk?leGMLt@S0cxVSvbny(4^YSauG({6vT`_A(dnB5) zBEdFT29Yg%6HmC2AqS3gu^$#CMZXev$K2K-OMSejvk4a={xEzWV&pQMp?}8|TglHO zY0{ILo1!Ti4%MzC%Ns$@S`9;u?psl)2K6ZOS?W<kGz^Iayr1IdU31$Rdy`UgofswA zy>OW<4E>Nironrh)HCI!Nq27)!W>v#-5E=}Xy8h3f51>il}$rTtV?=}dF45`6ZU53 zZpX!=adpo3pb1{5-cpH7<kFqQRF~v<13Ynrl~E|qno>*#!+}#gX+v~3<D1w~6|_wg zCY;Ea4#~(r0PPrm=p}Z;6gKrxhm2O^Cy<P;yn%-<;FF#-=$mO;%DI~NHj5vA-H?&5 zG$`a?leb|4@HJMvgik_MDW8(ur2Sf%LRJyNohsZp!{h-NguPG(tMLNYWbl8@higR1 zchb8)dx)pGP?N@guW(0T0bb%r`JB^kfa7_^$Qj&>{8}-e5*}I6wc)-J2z8BqW{9uH zT@;3&@FzC2fP4GXT*iZfx#z$<7wRn2v}r~Mv%b}I|47$_hS$liWFjN+ym?%(d3$nh zCeAMn5#v;Aa_t6Zkx3fr*^XRA0&H_jkSmX8mG{8Z?>_>MCZr}fq{2zt_1_0d10NoC zc5dKqB!vsz&g0NQ&llFCg!jUb%v<qU&E*GR0bm7_bNO0w+tcq`$_H_Bl7G#`<NC!# z_nR5h7drxYj<69fXr!+kZpY2wGlZ<{hjzY{pH*$&&v`Ah4(ZgPgHXZuV%6bkipJJu zaOWdzaSLzZi}{{D7y<8s$ep0BRI}sM$DlupMJq;GTYbZ+pR%@HHHvp?s$TyF&C882 zX$q%;PK!khrmkEN1UWE7r+5GlSFCsa8;N1Sg!)V4c=fdL^flE7Urj^hknk{X%Upt5 z3S<kfDubpi5Y(xw4#OhLO!4!5;FTwCO@ml8$P(}6k225)pv)0ueeJZlH)@&d%QI!o z%-#C}S2uvRzW#FXs>1|dLLkq>g}!9efN`qj_!LnswNVpF!8`!<@AI&t4%PQatkRJN zAen=HvogbAFfGL-!EtJt#C!=l$!iVQA8ig7u7JOjmuzBYuR+2l_L($E!$WCx+@Q6< zcIIkeGNW$b;y$QWz@M(n&cl8n<}~syfuFJy2^euIx`%h<Lc57#s4<(mi{ZKBs-@Vh zS{7<Swc#+XQDP#ymaC2<L?P1*6&h4)a2~Enj1Q0jlER<vAV2=^3hWzRqreAY@fD8S zb4n<B5~?%gM{pbNb3c5HWc_dlu3DP>=9ochI+Cy+>$n%r!2om%MPtMeb>Wks9q?7F z@C&XE<*QY?elzZpcK!tTVa{i<VP~+oZpZhVQ-r5VijrjJa$pxO;k)1)iL*x&`>cFQ zdsG!{SaO_pTzTmjc@!F^b@LP`$`#G;YInkXP1>hud|CG>3Grym5)zi|SL6kZY13{r zPT-&Ds$JSZ4nIwytIMEwBMAiGm7wZAcnV67G+b?8v%1hVqf*4S#GL+GZ7Ce=;^IP@ zV%kPaWR>{T4%iY-rD8q+oddpVN{qyy`Ng3q@2GMr)Vb?&T-m{*7mfJhjBg<f<PJea zPI>IQbdd=TjKO(FkS0jv3#Oyq2g4BI;dgmE+y|Xpp5%VbQs3adhoBD2*{B?|#BPg> z<wu#FOvQ1H1j;+#<&j@n{z|sa;Gr}m2jBoGtD$}qgY!%@pewt{^jdDw%;PtoZ-7;u z>@JXd_Ql~*Lb7(<%L({fzH=4Covn;7{=%Ay5X9p2Zg9?$=ddH(W)a1$H4SBw!r8pM zjGv`j@KUXSr91|Q2B7f9j_{O21|8uD{Bu4IXGJc*&nFn{acDQm<drUPV#bHYgxRCG zc`&|qjr=)V78Z+n$2FldI;bwb^@?vbhtnUcs&cljf+c*3C^+`jftP9Jj%gAHg*Dt( zRCL)JTOylVbee|@ny-RavjOlG6`i(x*EAP@n0Y)HkFhn6iJ{Gg`BM$|_xV(&Cr`@D zg*E*kg`R}kT{r3zFv%8WKEPhX&94Mk4%hMp_0g%4Z0Hm{>I+r=%!RKw6@=1V-(bFT z7h#VAZRE2&M$gd43QO?>JOSaAaJ%=3sR^8XDqoz#D#%7a3;>MqRt66{5W7}5z}W*U ze7kaX!V$hCD5>~P(w0{?26E;f-~9c7bjp5vT>sL_v=i(%ef2E<fp_R-8#4-z4-Ij3 z<zWbZ_#gA37h&ARrZPq^N$`TJ&4Y8gStt45f!n93PLgmJ1l!0o1bc)Z!SgcdMWED8 zZ82v1J_-Id@-Xz|)f%@7lHITwGS-v(;aw9Za65h<aH=yzJx$=hikBAg6!-8_DcsLj zgFJJ>-r<_Rv3rIJ2X~L<1SrT02?a25Du-~F(-YaOQ+S`HQ|d@uXn;_bYWaCEWL2^% zrsVy<UA;+MJ($R?b%$Xd@%~nl>J(DKYkE}vd;90-I|og&qoFw_&x5PlrfDtHl93qu zqnqnjG<~ve^w&75-oQN=Y8X{xYAq`+4Z(T}-(vV?KQ0WN6t<V!iX348C-x+l456Eh z==jk^McZ|{G%Z|{dD8X0^G-)sqMu;HX)#0`x2a4ZqbKgn1U9S+K6XsF8=AEzT&x(k zT7;1x-?S1(5?DV}c`~8I1s?(P&I~DkCZlcLl?}LlAM6<x5#K&g?vLOI@8|!OcMO1Z zjC|Xz8g2z;6iy7g!b#Te&fC?Bt&l#!Lt|<@UJ6S+MC-xj8<4kqUdpU>AlU}N99fg> z8P$7|i+(`lu}h<g${}eV)DA=EN}q9$*#JsUUXcdjU43hS3AWZ5#c@~5OA?OK2W3ej z9fOn}*`j8v;Sz5(-~^*3LgSMjj(Un&?G(#y5U+ZAlK2%8OP`p*+Z}1LG)~l25UDH7 z?Fg6J`K~n(G*$Wn&1s{2WDNFLB<GS2j!0U)7oG#Y*fEQTq*AU%$+M?+y#V8Ra}}&^ zg9~IzeBNn-!z#(yn@nf}WhE%(efJ1s5T$U*Q70`j%}I{S2%-kH0IO!LyqJISnr6jM z|Jat3f?NjjJus0ZyPAbE_z13C3BT>Lpy34ds=<{JW#9!}#8Wtswj0!tX2%oag#!LW znD%(D2j2(HSHBJ)gC;7Z@rh7i7Oel43_OA;2Cu}-7i_sYbcJa3<*%ES4e$$d?Fri} z+A{9VCqbnh9Zc?c5+GyvGbifUj=Z@Ho^s7M;0+TOrL?aXYJ)tvBavJ?nGSYKiH@Yu z`G-;b`<6P=+|y;dJvJS%TJh8h5GsY!y4!1qr7OtSVL7a>KXu6tKZ6`fF)uxTU7GL) z4>F*0u)7To$uL1K;7@eL7)>r3kb-L#L72Xdl#QofIpZ#^gB}CYX|j7$l1_L7MT=ir z)JLk10OGf8Kai>}ux0IHp?A0DcM97&M^{CgKhJM_nz^v;GG4tdq1B^J@d<IdtIM_| zi{|j!btGgSfS#j?r&x!HbDT`)g(#EbU+dVy9PJ$Y@hAgzvPA#Nwj*oEW+5E*5Z@-D zX`BzI@)i15G!wQpg1ZmPS@HvW)delF$3)l#lW@O@IF!*LjkaNpe7WJSqg-9b+HJj> zKs24alL;?#!?wq*r)o|lNjI!Xkj-3tiHi@xayjWS%7cJ#ws#d6lX68|jGEyR-iDho z*+%GmD3wWv=v3CgMjg((LXgvy1d*ureYgr=b(Z$PpP6uX87H0Pk03)hLnNfCPf?gK zl1L^%>flP3YEQ)XgUNZNMmm$w@4%o#r)a*K;(jzFo95@fPMw{%y_%w}Ds0^nY^O@+ zSr6bouWIYf{35sjn{^LOrHO~8Jobx}BIUKJ0GoTDM;FJA$8~asB=ap?uYzUFRq}|> zHA{{)!=Idkr;@MsyQPjrT9Yu54|S==cv9?}#I55&y%cHfR&^hqrn!M8;T0ZAg8M$a zQ3gG_Tyq1$&Lwl~(j6JG3FKQ)dI2C$s%BE$+sMBd878kKiN}=|z~&xuBex$sf{(K^ zNeVb_?tC~>{NYbG!NivOZ%*r-$R?JmzR$Ha+>@GMedBsXcs0z$2E1@=35DCf4&Oj* zY1}Nu?d>@-*#ND$c;kF<#2Z$NfC$Zpl3w3F@Cr{_a*AwsLEnTMsan<CNt4tf%1(lJ zeoNBzIcR%mc1~<R`n-s}1<`?ETdl1TUjmE=bxY7jsmU5|%lZa+zZy_<+Dpdh`ZS$D zC8ID{Enh;!A!X68I^MZmhV_?mXyC&Ua%6%$<01zv_COs3K;^#$VY8q6^npQBm>pj$ zv(m`ug!Zx7Ulk!}F}~7vmN(SYlVY2<$nbEqfZE#FAgrt!hALD7#(#JxJe-BMS&L3; z%za4t+jDmDB0i|VC4_CNg~R_aOby`7iY9!$q&-f@kozV?Ca-66zX#y~p$XQy+5@<| zHznXC<hC8|MHEMH#FO*zz!dc$ejhBEB!53Uj&q0v?t&wLuyFfOn#O`3w3fj^)2&2R z<MD?8;W<HJBQ{19_|SEdB(;a(br?i$yOSdCAoJm`p}~MCJg;dybYlpHH5!b6MEykM zFVaAx+%V&X5g2R$wrye|%(oT~sYlkRL!&Iv>Wb`&CJgwr&+|`Un>U<R7u)+KzB;Ln z3<!&l(5p~0nWs9Vhju}V68VR4C{AXsOlklgI|7rh0JafZwMF(tr$g20GB~&r1sI*O zVuK#ecY>J7;}DY4zT7f+i7^XD3_c;|Rs+u9A$e7nhfOhta>*3OT1D7zHhPuXlA@E) zejH~}^;wnCH>!Z@MY*unM;qcLK70xc%81!vintFrIGvX-576s$jM+B`lAF$Bm#a zjoWv-OG55@!#aOlh5ZYm-{>67T;K%>=`z+(?Jg2<S~ToCC|C$>%&!FN$_I`MFGDgO z54}J>&t(#bU{!w{8Xbak)D}O_2QArVau^5q6wXE(jnXS)3JH(G4IxdK=!6@wlccdQ zU75`c_AywgQv@mt;I&3#&MU$~J<z~f)AS5HuKF%stc*3lH!`+&wY3~|d2&J*9zg<# zWeRm(ouZ=G2Dhb&Ne-1kC+ueg#V-{h+!!pEutD8+nS3rKVBZoya8>59S~%%Io3Sv& zoqj;7ggRYpSRG3CEE!UV-pe(5r&gxokb(1gtpR@789_AbSD~%rs0sEzu_YQjkB1xc znvGusg_o@g1RoRUewwqae2jZ#l2C`r88IEGPSTjJt}|%~_Rc61{*lO&@`S6PNP|M0 zANzJ^T-d$SHw;36sqLUYEIdZY;Qkq8HK>r+$6zD}M+PdQJy8|(`?+47qZ8Xks{jvw zqgD)N6ZGbJyG|5KU7Vq|+cr|`4#F{5$H+$T)x+gckfQ(jq1F8CoYa&noyZuj)MbA+ ziQ5x*@pgj@@WNc5l|v05t{Up0k5@rtMUbQZh8kMP#oF=2EI&Me9TWPjmvYQE0d2cT zj)hm4g>G&TgA`;_E-}HASBrj*a@?G6A?Efjhu2YXUicnZ^NG^teIc0_#AZ(t-MO&B z@lR_N0#Q7rlr@}%HCZXk_gU_wvUY-*<7!nCEN#Z^=$`CX;c-O`GBaRbh~+nKQ1R2; zVcY`~IrI2p$D*+*$)Jf;Pgy!v00=Q>YgmHk1oBEmmr`knWwBZ&e}Dz(HTu4TC=sCI z7htr8y_9qOLUX<F_DEXn>>$(Zd(UgoctyRiilE%npABq~ZSpL<_$B_UtI!SsE}sJZ zSG=}n6NQl}91CgsnY7@jQ#1{!Nn$iZ+c><b%UI4&!n4ir+ySWGt&Pa!NCS#Ppr`4Q zG$}nmjLXuBg37v)DHdEc)RH*JR}t}P3xrw`=gyqjY4Ui&R62%3S*Sa(m5I~lJXu~` z!qw~aoI#>eTqDmUHc#h~jfAsQbp2xmre<Cw_$CwF5gXw=7IRHfFao!Rhxg7uhqpQa zwcUhW+=xxYy#b%eAa4;*K#d#U4HFI(SBp>c0x7;Z*NTex{SKegue967HE{`VAKuUE ze@obsCr*|h?dXtt40?@D8SS#N;Xc#(hc5%p?yK6oqM}Dw1q!Y)9J3SfBz8|jxC?T~ z-ii*ur?^MsW**x&tsc>yn>L>Gd($&Y<-?;5jgU+rVPjzJFi8B#(GsqW3hy_Mf-i&Q zr?sO#N&DkV$j9KEv%tybzj@wcW7DQHd{+#<bI}zoSGDKh?EIQrbG@(>o{D_PKpKfe zvd<G=GUORlusqgk<Uq}kA&}caybl@k&EuLqy44rE;EU7x;f82F{sxlW=ZQ4)8x${2 z963_?MtSAi9bI%@J@m&(lXvLx!~mZlZEYE7J8RSGPreT4a-lwG8>!}{%nEfwLpHRG z$mZ7X+K30y8{x>X<8}qmTDQdt<m@;C`f4`}%dsg>k(k}8lSYVkQ-f@DMN@4Kby&qg zY?_o+S}1CGvX5$!vkWh-gZtdWFS;+G8ej`WUk|cKT`@a`JE9q0r}<yrn}iwqM28S! z((SJ1YP(VW#UVA@PKy)5xGHmMsuOGkj;?Zu!)mp<f7zcHc!ohFPC2*VDkzj1MYAU% zEP^jN!?ASLa3^HG4`H9fdhA3~ffvyR_`ZN#afqhf&S5)w#@OqS-i1)x1^$k#$V}}{ zT{LXjmhdT#*y=e$U8tcj;-S$nL0TH*dy~TQ3wT~Avj2?lMS}st3yD>UM#3+flfn@y z0P_%khW-el<puCNdzOq6gNJP??;piRhmtllXKTs*Pk)oe85tOWv*6)}5~P@c`akoG zjJcnLFzlcO7sI_lwjbU$ymBM=)kl{fV+fG2Uw)CbrfhVUPP?K9GLR){Z~AJ3qv{6^ zX-^0z8%jFs2UTf?64-Dgt8KvUQmy!KG`4m?YHOv^GnA{C1lP9j$lxY0v`o&GnyyJN zftFmm3U+o2rLdgBX2X(KdL1tkG3O1tRv_k3gz9L>kv-W0!g2RQhlpxsB~x6nW~S@H z_p%!QqtkEe(j^(b&GzQ;xL)079URhxLmoD_P}kb4!hw1|=N!z8a+z1NYS$~vr<ukp zJCZp5+aZJ_1G~{_m!|Yr_>%2*<zt01UebiX06~U#?z8*<J$b<1T>)$yXk9e-OSOK= zeJiHGy88xT*LUi#p-@?6xvjPAzW1RH8n$q$UN|+HYvg4QvaI%jytErBnWxp6(43?n z!0AIS9o9pBnLHK|>bPcw?gATDCuop|*I=jgBus>cg%2-CnC%ExkN^npizwdt=A$^D zKr1N%^ks<W<%OPeFy+*<`tMkCZ&vKg_k7R)8#>;%HrHQErF|`$k3npxasyKG<6p>` zYBavIi<jH`dEiecJ_dm)@w$y_l$qQ60;HKUXsImVb*YO8;XDqGJ3`ZYQ>yUX?9xN8 zJ+F~q;}i|So1n8x-kE{kQ8?(exGy7AKTDo<+ciKkKD+_Q4K8QJQjTr-x*0UK{SW=- zE}32W%MT!dof#$40_azUcN{0*4!Y&Pec6taC(E<bX#pi`w>lCx=){XTU8waTgTdiA zD<CVDQ1mqP*l;}`S+Rr<Ai<H6w>usrM}@HDn*JV8Th_^TCkdloQyzyndWEB?>}d#2 zVcVG@eOu!ORI%Xrhf(9&3&%X8!XO!ZnfJ=ed;+@wvT6Kkf`?JTTL8$^Tlr$oW_Xc@ zQC*#mc)}0<>O2_NVB5q9d}2R*MutX#sdgoj6^kZZ%kLHFQCE8sA(f{&mv-`}X9|uQ zGJ5L_AvUTjW5g1jC1``s96;@hcy_9-7XHv9qqrKLWqA;GVpB2Q1=z&&=_Kj()aQHo zwYgq1M{(hIqy>+?ptA5J_Cjo3CCIkX5cC8H&lG=W57b@=b&hC>Y3z@h!Ja~Ngmd9` z^oNl7;fThU{t$Yh2)kp!{Pf-qB8h=+j?CHQK_qMFY+3Ui-qJ(P<|4VI6FGhyI%Zhm zp)$YhyThyK9SHHnEHAx5dQMpMnl3Cs^rr{Rm9UiuGH%lCu>u_?Y+&@KP|-(^G|N`6 zRoS7_rrouraFolN`Mubc-+|Z3&u-Z^yJNn~Bu4x`lsXUH<)H+242fr98m@JODY`aI zQ!@Z<ZCc)AX$T;a&2j8`0c3Os;o*DkhsIH)i(uPQ;;J`C{R|vqdWWv=^B7%GO-hPN z$zu+k?(=k-pI^w=Lh(#mfXEaFMJb9KH%YR9t~2#dFveR~IY@--uW3S9gtQ4;nPNb2 zp~I5)S_*3NiUym8Q3)Fo?*ml0HeIvPd>z}3!|arTp8!Ki=}tU!;ypK~$)Y%^by=a` zGMWE`4T(otGyGjC!YCwWdu`FPt0P<78-k@6bA!z&#B<m5%<%}UM^ma8g1i$iaD3?h z55WJ;15m65ddpr&%tUFb9QTz+ovH=#W^cCBq=T(RoDU-!dBx0C=#X+~#}{&3RF9Dx zOvOkEwe#{-j$CDszLwsgjHiEbh6;So@3;y`n_<F@)bY{`H?c|32vkgIF}9}(_F;MA z)=a?^G0|1XuKgWXVO%Q?>RN2uP;i-J75C#v<!B?nW4>oPq`aH(i+pdB5==usQ8VlY zbm?@yinhA;5IAo$zeGEn-GU?K1eEhL(4t904z$OGut0LAW($tzw=gYb$#rF3f2(Bj z78V$@wf$*8ezO2|`T^K9K>O1~<IX&^UPgxLuuDG&N;Aj<5*~Hw4LYI1v%nv9HuXTK z8ETB&;km8NX&OcYzmi{gk?NA+C~MH*p$0sKYt%EC=y9oOk~$bJgV3mFx$J?nf`h>C zFb=4*!XiupHN(<Kv>7h>>A$*&&kF2R8G_IMdoSVix-<-|S0IKh&x-@Kp`?N0NQ#b; zN4WZs(ANd8GTM<<x=1YL!6bApWIp$4^d*Lo70$udIJd|<)uKMMaJ|ccUD(rKTDo_x z?OCd4W9rT>H1Yf|lA5E57cd~j#*^AskffukoL86drK7@9No89bqi_!khIP`di*mDA zVms;wR!|21x8%g#YFh?BO(LCjeE$d^%{?nXWF=bfwX4{B)zOoMu30Ap44qCS=W6Kl z)-(EWL(EY}rf30As}J20cWT>&z6MD3v}>;&3$mI>F4X0Fe}YMOIKh2s8Ih8gu~-hF z32E0kVV|ce_QD>Mln=tj4U;CV!nP7%{^wXVRPkCSjxc#tr#IF4JJQlcoi^%lF&lLZ z1@k`bKpI%>b1d+hE;rkkQp|@&a2q@XQYUxDY|m>>L46`QS!lU45aIMXm!H_;+|R|( zQW<t~e$6nhcf)>n-U%+7y3HzIJhl5C2+QOFZlbW{dde;|TiRq=8X>SVD{ggnk_>XE zwp;AUd*>W^H-{c6Sq0xkF&G1G;?LNi14~S@3x={%J(%J2M=p|CoHG0EwD7zNpR~8G zz(8BgS>mbsmA78;n`Qp^;^W72`g`2(`nwu(#)-BY4bq=~fKWwpJWul-Z){Q9SG1k^ z(uMF@LiHTc?YeMAMF=zd_|}oI6K(9eC+)=}aDVTKdCY&?Hq6d|;5*8-yDvE1UL<7b zk^?PFdn<SBxaOAFbvFXnd|Sy{;U4L$79bbn4P-%!EqreuEWu0!Jne?b>tt79DZEsW zzXRhL__#cXlaI2>3BZU5LW@xjotSNb%{d64Egay@BlEuhu4Vhb)V%wXuOAyQ3tGG_ zUn+<eSBE6D&N{Goo&@tx|FWRRTi8@Cl2!rw^J+1FGpQNn^4DPwO3tWP-_H>cjDxwG zd>(q&z>lz+8%cqyKf>je@a+OO#*mS+3(|a8Kl%lDPD67u0`~$=^%(*!zlWDL03rgV zVPw;5-A*pv5>$#Ne_@1X6qRLDrrH3AQn9saIF)@S^pZ`91WJ-f#H+8<PMNsemmn%? z#T~k2M{Fr8|9168Jlrsd&iRbB-b)0JRBuE91;O0!u3S;k)AJA-&&DNAsL644xMCO+ zLm#^Js`1Unsh=QM`#A1FA3H_ERI|k`_W(+@|AI>GE%D?4`t~_;7%A&jCZtgZIGKck zMv)}d0|X-#h={-bjhgzN7L3$DMH+SQ|5%Dux_GDQCXaa|Nxz>mrALxUIp^98GFJ7w zQNEMQ`H~2=ZCJnU$VTL_E$mUZrVWI32%00uD^UrBO%aQH8$I*lyDKq>MOs~7FO}t5 zOrMotfnhf80%VO)VyGtvN)?zBaH=m9O@@?;zk)Trt<fIon6MPI<51gCo+_JUTnc3+ zp&gz}>Z3N9R%?Se?ld>hZAwiL?1S=k5K9I!T?qxV8I@_+<dDF>aSD%M!&&RbN8m^^ z+6bFw4W2kWe+0Tt@PNT*fRs?p7DTx@NlAZ0Mvb!0URa{TgazvvB58E(FK||w)5K#! ztxJP&?v(}oC<$sOc;`yk3)ktz-**S4`U7PR7a>TX)ubcn6fi*F75PKEs?Oy8+}F;i zy8NBLHbjN2339QFqv3OR8L8v*JoUj7TruZ>KDL)OMYRk=locqM71a2&@bA;A2Y%$i z_jYa0PtY4LCFlSScqnxitpAn_c*-wciJ33Ryw`CQMxAXR)g+g{s`b3=#cPB**PBnI zi`3LOV$D$w!)bYFlVRVH)wc5XJf^bl)NoO159~+Vz*X+(QF^Y%%|@Z8Mj>0O{ve9~ znNB;)LiL6fGDw?ViKpgCflFdItqXzQ+Qa<EJd6nSl~%)lHZS-jt+n@@Fz5}Qg~K?J z7goV?5$haNzg48|B2g+13+AcExSxCsF#?NccUaZao{krf!zYq`1U=alsB&w?0q9$W zU0_cBuY|}CoUPB(hC=VgNI-r|^h90RI`{U|wguKZ9jHf;$35C457P1adP5g<lEG_N z(<3sKht~GA+cg@_aTw2%I!BcEuFu$}`lj>OQ3vQqVC=2@swhu2tne2QU&F)wEE3Cx z#@-s$z`6^prH;6zT;|Rk3)CL;JN7og2&|n%A;u;hDyhO6dDH#uGmKuctBs_>c`&Xl zvB`BeZ5aJ}`@qWzc%mPqTzbu=FQW#cEHCg#^ji0y;OP-DbcEJv{($RAWmsknOL^@Y zjLYPtfqx(5I01Wd)w^NgBs@^(!j}5&yck}G@=PsnZ@@gGf@A`7uuQ6_#-LmR8e`HZ zY*C=a1e95BkgU=`yl91|w0smjrrSRpBb5~Nf*xAC(*wA@U21GH>!n507?!?>=*UA; zdr^hQG&N>vaaC>KgP|n7xIs?B4(Q8Puw;a9#hgJQ&7q6oGPv`5(B3zv#j4HeXaWG{ zXzOXZU!ey^aO-$bF9whAqDcWyQyXqjAnW=Ruzm)22GREx<LAL|wrahti-zdKAa=|K zbhIyUk0;rJ>}}*%J0tLC3dXD>D4nHu!}&}J(#(Sh<CZ8hIL`MuzFPd#zj+vYz5UL3 zvKHmE>Mr5gm2BDNL8qxd8CucFeVBACz36X%+iwPwZkA$o23s|+tW}_&wRd{Ms)9qq zvgL}`w;#;9m;^^n+=68Cl!K8A)f&-Y(uQ`-sp0wg2b>A0+H`YHtnKaMtuvtuy|OYO zbVK^3F`bM?iRR3|{hIJDYoTg$lI(|zBsM?>(c~@+)+wQzqQN;u_T;>C!;r)~Gr~5S z-EalY%mn{#ncZH1>USTfAN-Hgeh6C9Z>`+P*nsUBJQX5rt}CFnDyJPfPzmt-;r{!V z@Xgmebq`(q$)(sVsxyZ8nA<Kv>x?0vL{H$x|EZ)~M;z0)?^g!-6PhKVs&U|D?!j{u zHp0Eo3?K2F^2sOB{%lXq28ZEu{8e7a^Y@Ob%y*#!A}TSD%<Fn+BkGwX$kLiz7=fnC z9qURdUpiHJjING$bwnNYaf{kVRdQGuUFSZ8Z9Z*QS~wV6S!W;ZY$K1aA}1hzHA|8X zS&ptJfi?GIe5G(h1YQ|rAFE&_%aJ%@#);amp*WNzTlo_m1$oF3Q{<^ElFlJitF8-i zVPY#!*p7}P2A@1^DI8~Thj`)|^K0}F$|X0v`y<c>(&l@W`dEyNK=lSReUvw-L%cl7 zK=P)<V~6sEgc_zm=bSqqX}d9oHb&K>!{P>xd1~P@IdlXH+{hU4wyy>EST9AAtf>o1 zN_k7VwtaXnD@aHOv4*s}VKi5Pc`z3R3$oIYo6YHMhc}SxT#;p8KYzg$VRR!_^}T$) z2@U1l27SS8NB!Rs{Sq9y0ch3+gXCzh1S_I&fee66bN>0*NidI0Q6`%i>=&T}Z$j~8 zJItj_78hZmKE&+GIC&kKx`ZF@lMXT7GGusH8;u={DT7Ijm&_!tj9ZDT+XrA0z8U1T zP~u>|%JcTHX@$$NLH*G?@N7YEr0-kQDX`kjCRC+M?_p*OAXP$bFdU&BO2~hVcD$6C z@10t(%L{Yw$*PRMRvSPxD|bOv%~}nNzje@t=*7bghp^emT`2Ac-$Nn1>z==HorJiK zd1cZ=JL+xB$Ai*G!by5*k_51K1|9O3ux3OY#4MI47NQba47D=(#600RkWqA(Ai24r zk@I&;W{?%u*GDlCm%)Tys4f(wkX-8~l?gIvor-WDGe<^6u9d?6EUQjJvra4VMg*&> zQ_Hu*I=E!RRgMA2gHaHIvmvbi#L#N#wYisXSi+{^v?bIVA5n077Gmgdm{tCc9C|Bh zb({y<axUs`sG<2RtR2tIk$DY*FKE&e=m}hbss-qU`rB@WtDqp8VhWFV$*rQNF<~<I zH?C5+99~C3-Y={__28CeOMN1Xjyo0LNuqyIx;rP2tDy$oTu@5c8xXxFB-m2j8j*Ug zI9flAJPg&#z(`q}TPQR&Q`6Se>Am6X$WRx4niau4FqqLcROWON_JSXHuT^j$TmT4R zQ(u9eS_A*rjY%OEhj79lg^~LTL+l_lJ#q6c4idK$6Q<m-%xU;?XPj=SfpO<ksNl~( zO81`N_DsfNjREKQ;12h#6HpDRD{h74TTB}mYrt3~abSQfA0Rn;gTx^=0;w{nDx~bO zoR9KfErSaWg7OKqQ-oCv#UV_!5dQ#dc@R<ug|>pqdexS6IFY7-Bc9hB=4wg9WEYAF zHyxP+-I`Q0o8q!5idSpI%8f4l6?roab%LzIneOy>7TJhDL1<pS2p&_@_5r@hAT#M* zu&0OS<9#Hh-ik?kbL?qYTmz`>_820XNHl)|mJcCsx#<iInuMP0I_=&x-DgLiyEez> z{#2?q(r4)k^dRttvj1{xD)w#KT>nf>jSxzcv*bp)T9k%YPMUxGCf95@p%x>zw?inn zhH=bZfuq<x)0jHP++|VGgYZSS$@^jEkvw@)y)d3Wdc>QaK_Wiog~gN}%+A<&FJ2ms z96c3q)hKzp49jo`$xmgC(??olKmRm;(=5p)vIoCkU}KsYx&IK{zR#jl7Bvw2+k5lz zbA_ewROID&HwHc)Y4XIEVK{>dmKO+5XMhf4wneN4x)K@lt>c<Gy3QZg!)xQor&wK9 zz7qjZFE77oh@(-zTKaf>^OtM><D45&9{DJ|nejD2RVUtwVC%kJz)-8;Yc%~&48()A zTyv3O%SMP34b!3OgdroKzZomP4u_1&LI~aq8C}iONm}Ns(Zw7#P2xyXC~C|E`rr)* zFKrG`w!qGvM7Wa%45$1!X9tWm_Bw^&Ud0<+UVEYs=a(nnlMYMOiRYB73)AEp4yoC8 zDt41!Q;`vk4mzE%_CyYHjy7uib4d@{_YjZ?V@BbAkY*JlTEQOj7=Jw%3CAPHYhn0a z@C!L7Wb~BoD)1u4?<Lr`kCC`l8!?pE)5RwIsFZ8lKwgicucj^;qp9D!t!)&A5l^`< z+}38g#R@r8h~(V5t<C?3ZflcsOZ=xG#r)nKT&GZ_Lr)jV5*mNz^gFifz~MG@jy(Jj z@G@QYC%pWQ&r5&ZG2>!jZ4^Ca9q+j63U*!i1qT5VPMO#2%9v3|S<_Jj8CZ1cB4ILj zie56|`5y9ZwsDK|?o8SmLqX`$s>6KTQJRHgg}7}@Z^o2DCUg}n!&o$gn;@+YXDp%g ztdQWU((@jlw+mJ0a08@My4c}j#|s3s;^UUC9x@3+brItHGllpc&UvVz1wB);=m2tN z?7Hx&gvvg&{VPeKRfG@h;w&E5oTd5`NUXl;VRIdItzrrfIW9&gXKtBXbL*DL)3(Ya zRDUPodGO)Lz;3kNBC%xF^%ogZW1)=w4?`^=$neg6rZ9@WCEg6Y5u+~i8g;H)i!pX| z32*FJaJzE`h04g3RjJukZ-c?v1fEmFE78n+7W|f-P%nwqjhL<Xw7N+sQ^+Ow&T@-H zl0JD2G@{Dls=DufZa`-@G4Wn9<i=hA1fgM}_zDsx29>^v1c1DaO!u1bIo_i6pp_K( zx7Mp;JAd^1*6Y89u;2Zm?CSp|I^Mse>@%^r@R%yt5bltM*2sHb+%SQmRJnQ^tDi1m z>RneB&qSqAjnXp3{XFiN?RXcXdY5+(6+$?VgX4}+llx<ooS$8K*l!fy1=u)gioAnV zX?DrC48#5?JmGccH~AqfqH}or8z32v40G>(tpqx=$Oz79X3F}9v75VOcC)-wg9LVF zln5ofMT*>ko^vi=Uq1W$qM|?FjPCvH{VvKzIZXx!@lJ@za*lD0TLQAAlfoTS@T+W~ jZH3#0a;c!q$$5|*6~e%o<V!#dF$qOWneT<y$k+ZSP6oj+ diff --git a/client/resources/hardnested_tables/bitflip_0_0a9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0a9_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..5893a49389626f26c5dcca5449c013fdf95c4fab GIT binary patch literal 3825 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0a9_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0a9_states.bin.z deleted file mode 100644 index cd17efb23c56e0813a2e18ed2cc5f59f6dc2b6d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28223 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0ab_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0ab_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..7deaece19bf2f1710c86173a2344ace19972ea04 GIT binary patch literal 1924 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 PYr&t7N{-w9_qzWD!mU<G literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0ab_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0ab_states.bin.z deleted file mode 100644 index 8469638d5facac513ebcf524b8ac7163eef5d060..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15110 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 He-!?2WDF@A diff --git a/client/resources/hardnested_tables/bitflip_0_0ad_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0ad_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..19c36b52636cc70ada8f436f96538d15f4647276 GIT binary patch literal 2419 zcma)*>rYw<0>y2uwpOB}1-v&QH5P^PSh@GIA2dOn)~Z#Bjv@+;QQ>m2JF}bk*kl=B z9jk&OsTI7yoiR+dPIYQcMa(93;tK)GE8Ed&C(dSO;)6Om)9uQXYHO=*|A76l=fla# z@5?z~≧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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0ad_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0ad_states.bin.z deleted file mode 100644 index 59185187878f25bfdcb1dbf0d9715ced820248b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18794 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0af_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0af_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..3e99de95cdec72738ec5d80a2ab21418fae2076e GIT binary patch literal 1409 zcmZvUZBUX20DxttRxr{Ofll2TQ>VV;<E7mwXQnP`N?IyYI?V*$)ZK1_#ihfh<_CU} z<Oc{&G>0FvSSkJ?El&YO#1yS&y0b&-JS<Mh6u(N>ul?Hd=lS#86L}%)I4Ob=kjP+4 zNU2UiGkbeGb@%&WVe`JFD3}T64#Qlpfq6uDxT7=NQRkfK;~4Y7bf^D7W*lQ@WwD7j z5Q4^IPE3&Pyx-MXdKP=+2o`~hI@)o=2_uv_X<&tmp3%_)LDYWJXtv^%D=y#^vGCII zlBt^3)|;AR;E^m7tlV%D@hRs2hE8p56(m%6bXQ~iS=tm9%vL<fn(AoGzB$!F3am@y z*KG!uU&M{K4<~hZcnU)N>}2dv9U6XX#}X&j9#XXh9HrX>i<)m01P?TZ`l3qobDk?m z*i@Qvh?0CgoCFD3CGVUE<HoGv>lv335L66Eb$n-FH$!KvwCI0nNmY^{9;jG;kV=(; zQdww7Q4>up<Z#T<7-Zla)`#{hVJ$s!>+y6xeKEJohBJie40UjY=OgeQXJ_TPUUxM< zf<0zn!Jh@zJ`k-Wo6PI#?H_VmYM?Sy87k-W>O+0i>IvTZ;pJHOo#KUj+$+(WYjAsC zX7}5a)nvpc=N+GPzx!FXEi&cV-XxA1>Ymeee427;qlKaWr{Hb>U~|zjXyKSA0Q00W zVYjH^Dd6c*nIh%}LjVg<0!qA#y>kX^_^#UJI>!jGhj}EOj;Ug@b%u)Cp<3yv(bRNa z5LH^A6R9nu?z07?0r*$UrW7Shkal1mt&!{A#aLopX>xsxMJ*4&*_(T94UmMvLUheT zcp#NYYPjO&7k6?N(zajaA@TU?>LykPFE!K3d!ZOL@P$Yrt>2C12u0{D69z3FVY7_i z^#NsRfpKE#l9kI9n?@Jd{k|^dZZnq)kaEM~R$x}L+R>TgVu8%mHk;)k4)t=aH=JXQ zv)vs@mX&TN$BXl4kec^Y-VT!T{>Og&B;%!sRXpv$<Bfxcwd&>K*6r^@tC!tSYt1ei z&2Og@c5@E%2CUjj8{B_!;Iz45b{5PHgck#<&Ji^?6yQCme$l$b)vbn<p<{&>4rMh| zPWZ~2>N}gen@=#=(+_W<i}o@H_#!n+wL$%T9^Hqhh{gx5IGTs}qPe94<Fx!6eOJb7 za2@P9L6LEX(_s|-;AUL;#w72a%WKdPeqVE6B%2`oJ?X-0iCm4c7Fga>$HQ-&{Q3!H z^;(Pr-3YLXDeRt_uqxC=6_=YP$dII=KhAqZx%#2soM9cRG50}s9|Fvh+b@@d0x~X_ zY0bo*Acd0jKE6II;nJX^E6K6#UOyMHHDzUQmA&wZuQzs1ggu?kW5g;vH+(1joP)OF zBR3FfgzP=HuGwdKNMn_NZ7i!*V<B+uE*impL#>hV4UZ2lEum#1a+n~zd%TzYxjh`V z$h9;e4|xVwJXR^!dguE1ehup3ozZ%~bAJ+kDmhcI@2RBCpYYP-ORw7tw~unFf@0bY z#6RfQcczm$jBho}XgDI^JVca^^+*zQI)fw;)RIyd7?x|YH+?n;P5p@1_XVi{VUr7J z*cg_V#nztK8J(iy^}*YGNtYQ!77lw!H?EW#F%$A2f2mdNTtP2a$BD}#l6p)5J_p3w zA{r>6I%ArGw5X&}ZYJEDiuPJa(J*^zMl4;$A>J`up9&r{73j9#BA}N-Q2{YZp^%1A zpcq*)keE%sTshJXf+Qjql6ZrEF)j#icdPDzI6ycI2|nmf$Y&!#P&ori#2AAmWDHHE z0M9@*;26RPD6q8QMB+#S8BUDGgn$wvRH*frVC#htR!l|-5_-h6A&DnQhGi6{6m0g_ N25Cx)y?QFm{{leGm=pj2 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0af_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0af_states.bin.z deleted file mode 100644 index 51e59ea2e5f2b04c6cef77b7c4edefa6b6d9b3ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9191 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0b0_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0b0_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..cb2ac918b462a52b009bf1098667bb94f84c6fea GIT binary patch literal 513 zcmZ>Y%CIzaj8qGbH2f?5kkRA7m(rUzS1@!ia56B4IxsLW9Aw~NV34@LY6oO9FlaDH zVGvwi0l``GeBI_<>X|qB8>jYb4iCQt8}tqqh%>D$P-Y2il;LKSJ@C7~;9xuB1+G_O zT)Wv=4mLI&=24Sx2>&K{z<q<L+=5jFTs@rHOz*f^n+zhv3zo4Q)ZsW_p!|XB9rqI* zImgCN;thumH<mNnImR{0aLv$X*dX$NhneMo4NHRi3T=iL%uESDGqstyVvlbvKfK^D z%Nx<AJ+1$^`4-wVZ-{Md_#p6w>4j+P8y>yGH%j;#Z4bT^zhHmiVDl$~4}yO<Hi$94 zv32Hed{X*GY{dqH)y!N526jyL6WR~Nx>)G&F&)}a5X0S2pub>GW8f8m1g|x$34!_- zG{smGyjc<^HZ9}k60KzNsB=_JV2NRw+8Fws<6uJ50SO%*5ecmWJrY2`!()(`a4<q? zL&DO=rVR#R90wLNh1NCMFd2k4`EVUrBdT>EVTKx0c!0>dhIJbi6SgKq1SUpAMDTBS z*ta3hV5QddWn3YFU$|Dx@X#<&SjOe}jb-WqK?6}AM(1yu1tQ%IAqByVo)N;0ngyPE xTs`7Uho-Z1vmDZFY}L^^7!k%5p~je)*qZ3g+K`YS#{N(5Nms!_h2&r6hXB%6w@Uy3 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0b0_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0b0_states.bin.z deleted file mode 100644 index 09370ddf3c0f60665db2401c5748c511681fa8dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12014 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0b4_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0b4_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..f9c8c81838848a62b2bd883ed3ad7394b4c88950 GIT binary patch literal 3041 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0b4_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0b4_states.bin.z deleted file mode 100644 index 4048a702c1cce7e7316324537ed0efdff2552f4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21106 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 U?SiV&Q#NUz!BvN@{OcY67sPlglmGw# diff --git a/client/resources/hardnested_tables/bitflip_0_0bc_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0bc_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..19e1fe89ad8578ad77686020ca213fb0b21ec1d6 GIT binary patch literal 1129 zcmXxYT}%^q008iV&g<8W3T?0dEHH=AO5s-Tl08&DZ4uZ?gF>O6%Lu)Hw`DF_(kx1F zn^^h*v{#FuxLe|Mb%M%>-udJ-#@>17nCw9_A29KuO`5D(409UrbGp6k_xN*v_}Mnf zwa4b$^CG$b4<xDV|KiX3bkA?F6hV+kDTW~1wFsg?G&z0SfAc@^dwFbc7*V|i$-^Xq z1ihW*^9X|Nos{0oA|;0@(8(c)&a=b4<;*9|zR#QIZMA06Bbd9MBoib03cnrmc+G*t zdj0u;F>-mAe8Su&+C5}^#OyQo0@PF%=II$;4XYzyj+}MYjIkR@ih_WR<%A~FuGcGl zCtu0=mS4149(G9319vYCE#*DWEJ1v$Dl_WYXD!&9YA={D9DIL7A*kIiQKSBD>)2YE z+&pd_btPKVJCvQ_L1XxaS<2-pYRCtq3**F420p0LzMOsCH9cx@U;DK%os<JlEIM&@ zq)okaDEMe}s&_Q^)bhsKHs`zDM!*COiB=~1lo+n0qVdP(XPb}fcJ_7FE>_0};@<kJ zh-eIhIqRynOIM_cdWG_7{B_bIpyzG2x|DaoOVE%P8qoR)S837Bw+p?Dt3WcjX4HWV zn(_f>W!;VPHGTPG+<I^-5t{hn8cM*M4%A7dTGZ{gPq_xuW8;>w+;t}8tjW;VI|_r} zx|#H{>Mmf04VjkZOBZV@*3_AgHm_Us1z#*5j6<n-#bI%=*-%;;?&2G92X2{p)M&6K zM=VEU3VUC;lTK|?{dJ&t5;fh(=AG2RsqenF$mv@Og{cLH<?hQ$M|5>(uGw(;>BRZ3 zP{Z`!t!F!ip}<57Tfb}#h*HrRI<ZCnd@HxGjxa+dg#&hJG@o<adT3vHSoQX4DHmLN ze!Q$obF=23D&x4Cd2y;eH)3Ge^(|!}A6zM>CpvELYrl`dO%)FtGEFwTWqH-}O=PN% zKi4Ymjuht_bv?1R3nd$e?!0p`8)rQH0+*!w=~+lYP9SO0)}S)#QG1-lt&r!LNtyH4 z%J4@N$FNQ-Yl1SA1t`Q*Sal_C_Qkv3Y$)v&-DieY&K!zlk7NA=IJO|C056bGGHR4W za*_C8(pM_@?GeQb&c`T^GB9S3ZI^y331EH=SHYcDpsd&4>*!HZFh!^kDIhIKfq8VJ z!s=u$<%VLnQ71<AD5l2&M$bqBi{nOff(p%~qbdw1#W)4#QUj1H73^YNQKco7UdZ^X zBSL^&BsQ?xs4iuVEe=qAKvIdsSc;}t6$%2}T#|Ra(mV)XCHg2J-y}&12r0lpWgJMs z3aCU8nVhKg3HEzF6BD0=+%~!{aHYb^3jNYqO@FA<#CvOi&F<|Jqb8ZpN}LcHJQ6Hn zFU^KJQKH>UHJJuG==Mt#0Vv3e?6GsXE0&Kbsj-}}X}!SA@|Sny>0>;Xfl6c9a_sD< Y#`sDO0~?~R*`GI`sC)mQ()c+1FCw_aTmS$7 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0bc_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0bc_states.bin.z deleted file mode 100644 index ab0b3755df36761ea79dd7d2421752660e2af27e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14387 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0c0_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0c0_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..87d8693df1453a2c5d4ad7917b0252b1228fc130 GIT binary patch literal 415 zcmV;Q0bu?@T4*^jL0KkKSrY>VjQ{`uTtU$Q5C8xGkN_1x06+)`zybU@P@w<-2mk;k zr9=UsDJdzFBhkJj5>Nb)Njk|DRCP%wVM!)ZNveQVsU*@sNzy?i=P4xAl4?mcNhYL| zAQ>g1StYbfB(W@#(pX7s2^F$SB(g-Ox^<-DnKVkB0KpQ#d8(4)N-ki1q_mG*lO{}> znocUN$udsKJgO_oOo?_0IFJuX1e4l9B*_Gm`5=;FK_tLQ&calH;wqIAxss_Rpou|= zP?da1l9Dha#F<f8Nrae_>52-;GMdSn562J%$Y$aOhyZ{900e*lssKPn01fVxP#_ur zAQ}J@QmAOjpeZR+Pf&iN+7PO_B%KK)$t2Q%jFMQ8DS3z_w32d3G?HYJX(YfcNs?(M zq|#)WOrWKtu_RoLEVS8Byg<UG%!;@NfTt9x^n?7SQzzurrkJ>cr81o<;wte>sdN<L zlpMqoT|^REAd>qKl46xfFcj!efMlvwBZ^fd$V5XFN>%MlqN4(srbSp&3SyrH+>uTc JBn46Y{s4xXro{jN literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0c0_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0c0_states.bin.z deleted file mode 100644 index d3f655b0414dcb31d9c59c1909c9d628065cb463..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9771 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0c4_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0c4_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..57823403b9bd07dd01258caef2808075ce7a6424 GIT binary patch literal 5975 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0c4_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0c4_states.bin.z deleted file mode 100644 index d5c5f5edf7f694ca6949975ec0b292d739318656..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27220 zcmeIbeN>d^wLW}$a&r8&{u)ke5)zG0n~##z#L1T-it;q|Bs8^gYE42E@o8!dCa6=R zND!I3jmHu{Cy6m6Dn3c5L4z<=f)hn~Y7_{fjEFD-;u9HRfMFPhVLqO(d%yc0&|qTD zI)9vZt#`dE3)cz@Bg{PezW2WNbzOV&dW*L$b(QP!O*ekkyEpzZQ)$_fMXR>%efCNE z_U_+5cK2T&O%z<K%3k^RyMOjCmv8)`CV}Rwc01k9YC<mZkdtGfx@fif%p9lzUGgQu zLC{pQN*a8LG}L^Kyb4-3=&~=btH5fxQz!Z)f$Y6-#0;QFJEZZ?h?C(N7p#8YQFhM< ziSky$h1}&*D%i#;&X8?xb`h+j`*d$7Hv!TdK5wZSSrBQfQ{Y#n?BAJlOwdhc>+wXj z=F%}lBvZ`dZYa@<e9!_!PCN;doDdIiHe$LgRp@D<;9zK$MpkOa2LwoignvL>3m-86 z-wazh`8Zr6>}AS9@*o|vg<I4Li?#a}LnWMmub`i(MCFufx}S6<fJ?Im#UQ5_LLID! z<M0*HIKWrKzS18vSf3>6X1DmIpgrOfUy_98Zu(4y2J0R9F38yjZLk6yIu{Z3QA&t3 zL3{K=<5UMd4)~91@DKU3OtgIk)Iw#^Du~%Sb-6y$MYz=xepv@qrfP=j%K~^TB(xNQ zu;A!fTOHi#AUAXL|5y(8@-u0Y3yfBB7d3Q9R3pn^e4}`)o*Q1Hjq-ujLeFzFZYwPb zrN_e7rQmbJK*ZE;&=<maZZPvBLH|J4BumLrr^Ox*{6~-i+kBaA;5`JV7C`bKOz(y_ zL*|t<_A?S9`RydGS<-dWzrZDsNrcl3GzN0Xht@=8u3y;fwr=@ExE1dE6VwQhEB+IT z*`qRUA;-bX?IinQ1vP0rez35V_L6z{@2eqs%TQP<p+3o=A8-?XJ@o#R^jy~XU_fjq zefZ!naUuL~Iar}dD(eFl86hYJ$e<*1eiAWgG5C#QABQKRKk)BBo*Iztk{%%~9G+EO ztd*_Sa^(hSNzn^KwfwIQIfL0BiZA57?k(#tFX*;+ijS34F1L4X{T0T9n@yX8)p>5R zAp0|V_94wt0%b=nIqySF(EeT!*2`r|5?D?Kgko@=7wcudjW&}H&5)*>b-sbV$3p;m zIW-3EA_H;w2j&f!stoE9+ZOIwH_3N%W8sG`cTLDX1@fvy{gLq?-OQD{zuHAbN5lXQ zNUkEYHu0H<sBH`sl871R<W&Sn9ZUhYCa_P|L+l`=wi9==v<JVJ6;CC`fjuWkQ(@+W zFJ*U2x;L|!7W>#UZRk$&I_d{g0^DlIcr*uJ(R_7lKK!{~j;Vt`>$cBnnwu2Bptz6j z5cTRi^&X)yOvd?L_X_2ykW@{63hhF3Fl}lO>isdt2^DnT87jO)E)k6^0u#L)g8^+5 ze`UzQ=sga%Y!O#xQJW(3ZnyxM(5RCz-iAytK(UzK26<2((us%2&@F1f;`<fp=O`@I z*~J<(P&`jv8(|N8Ok?EOYPbyBAenM9>A+87sTuxSp=0<X?1KXbErotA`lQJK!EZPK zHSod*@MK~^Wci~of0WEy@}brx?S!~^5HzVVKmy?b?j$@P4@UjCSrrZsCY*-+d^oaN z7f!3<+K|x9UR?*iQl3Isg5Y|{&jYT9yb+1P0I>(%Pa@<CWnsJ5yM1w8AWPLG#bblF zbYp160bi{8*`FXS6j-bzS-Bl7<;92YQl~50sLRkR>vQ9!Vu37`<^lnA)Fy#8z)8hS zE5k9}{=AnIeE739<5=?L0*G^2Q@bUvyCpjsPO){ZzOjz1q<F%hIm9K<Ipe_vGgUHR zoJ8<(nBFJsW$e)le2cY3?-j|9Ej(H3;(Nt2iIBP2GFwTgvVE*sPr_SnUzb0PBYPFj zLThG(!EA<7kGROgTl619^Pdtv!!6R~rvip|pb6GFVNg6mcW`*sM&XZ4SBS#$@-uoS znMZVtF0GY~1IE`OUZqc)!tl$BK;GmY3&qS)XN85cKD@ndDyVpko4GD_S&V?^b^!XX zy(>S8h#DE-o_7(yn>Ztm(UBEICS(1D&C@bB!`)xO011F5YSsa9J!Y#*V&s)edh}9^ zyd7<jzX^idSj7G`GGdVB=IEx&Q+qt(XX(xbA5B-LZm0Dw$0vA(g?ph_TUg-0r<)W= zUgs8el8qRcvkJe4mN|h;@ozTethwMyo`^YQB9(1N8_BD_&55$)49KrWs@F+R%0dr` zKP3jWV*jGI>%IurD0!*m7piO>4jI{{I}VB%UX5hnwb|AY14aYXm!xJlhkBKJnnUqp z$&VUhVGOLrGv>vQE`wT4U&*A^vcW?<?2+f=-{!(Gh~PD(4eTq$T+qqGO}%hw&^m!U z#_so{@~8mGu`KI_;5=Hk)hG7u;(DHzpX?Ujg}%6DIdCYnAd>nn6lbPeJ_@@u!;)Wn z<n*B6_bh-?0hZ__L5+VDJk6Yk=w8?dqkV9mrw*-|gbXx^UdHETqLVM%=x)W@BR1vG zMwksrx^Os%*CJ@R%kR$jK*k?ov=hp(+P$h8RPln+Fnv1Q=;4c?7Bc4$%SttVDvWO7 zRPiOv*i8F+uMHNb{hH`O4)5d=@vKgkt0t;(+U^IbS!Xp^Yt<?tpZo-tkEkk+e?U$p zcrY<xYLK1VScxhWsj?B0T%12L=b&!Oq{*5?Cs@6zX$<vIj;3%<uTQfEutwKGJ#ixv zxJ3Fn%*A{+jb$lGe2>EIH5uoe<P~Sh(O+i|W<07FR143rYViz}gVkbnIDT1%L>6gt z)NND@Jr8^Jx4C+K#<PjtK}UR}O`y~Da3_4MnTo~9g2Q`%-r$N$a*C_=_~Pd)OgXeP zNY=2&k=}}r+{@rXMwm2u%^6S)rFca&YZNaCTKXkujx2nP^4WTFJ~RsOx)!$y3R|Qf z2h5k?Sj04y8a4>te}HK-_(3DfLE1o!E&KI$Oc>&7Oj9vXndE7~x49DwvP0(BCu6|a z1#|r35_MddyEOjZuag`!Q+UVt8a))6r=}JWPd36HSgF(ptD_ZVEaA4Z{8pmZ)RE~C zZIqil4rD&8@Nj2|!oL8gCA#o!OVH7yiZ$ZomVz~Xt8~M7cv{;?O3piK!;h#_?BXSw zuRvEM_YzCznTx@6K*WL|9ssPLx%mFq`M3gWg$mC(;CT-6a%g-VEOiMj`H=Ifo^tT$ zTQGMG6(XAkxD@y}P}?~SaB`23sZ>jHi$PJvApV2K3Rm)18(>%kngWG3j@8H~*!77y z2;GAS%hdgxq<`XoiaN9KRK_c!0oKs+Fx)O}BX&7Bp_<$b{3qgB_%&&w{aAc&?|^pc zXqLTG>JhuuL-e8sTU~G=0(rjjH7v9*u+ZXdQey_$Z7POlo?5YHHj{`!Mo@}>#8R#N zG&lLTw5V6xkyJkd=B;`QraUU%dllgwCDfm-#Q5Y$%tbKh+J2&$@?_xm^W_m?iAwMR zv63B49UqCK^<GD>8$v6*M?>XDW%!XUDYiADhngJ-l@;-0@I4JlpOJ!q_@Q13o|_?| zhW7c$zeYw>I#EeN%v_=Pdc?Olxd@7B_ya#|cAGNKK(B7VE3(cbeG2JNKV$qrU1B47 z9?E{DJGH>5>&2DVGqGGpIMqh)RJw{_H?=BU58S*L3TVc1*qSOPUK7Sf{&{FsB!$(< zF#$(5WpDv+C%0!Ph|Y5)Y&er7A>I&o!kr{c$`8TT9N4Sqa9XbY!fjQLfN!Yy9KxqQ z1Rq%O`4ZFYHMdKeOeY~mux^w2%cW}-2iDkmaNljvT}-!Xk|vsDLkB7P34>)zuLsL6 zd>2%B1B6I?P59x8TV#jKGEz(%d2eFJV+(5*(!4DC?wBsabh<>rteSt`Dr7XYDcz?+ z^=|HNDDaKPCL|nlI|E1Cf|54c2GtI3e1VA`lKE2IY@zjagSHpB!q9z*{fG8La$zVl zEXSP20-<vWkXfP^SAYv@8A!OF<vkOo)mX4rlaKv{OH{*V?n$p05fDWi5L=lc344Q( ziMYv5*iY>g?};>wvaR5TX!A43<F{~1!`%<omuXq>cUvTRy5@O^>gw36OPL8(;NW3n zwCo!+i9SJ8&O`js4}4*1m|};j$YuCsz+n^L{T)%-yqPPu2SS-Wd_GhPa4%hxga?-{ zkSi96^9B;e0-s+!D+1Ndr)XK^NDK%Uxul?PuSotGDHXVo6&$^W61XMEwKZb`vex65 z^agRGn|o1jZVVW5k~;GGFJ?e&7~D3HVZKh{MwXy*8mORge?v%ub;iJ28#peWVE|f( z8o$tsVK89-*wYS`esNHTKGl{JFr6U^G(|+YmE0c`*Ki)LaHu!^1t{LVonE^Keg@^k zFnX0&(3`h{bqo1V2H}V?1b3^WF*p-3IP6MjF*$?vc52L|b_E|gM-9|LTd~}C8)yn~ z?!JDR!Xk!e16zV1IDS)69riEh=uFF6Uufp@YbRD@eE>rRX&{finF(D|;{z2<#s!uK zw7$hkv25F%zWhS5eD@hlwx)OCA-CHe=66Asw_fp7_rnRr7Zdc@b?A8HBvgvx^CbO6 zT1+#&0VO3}ffL$1y?}5XvZD!>_ex!wZ5fuUGj=G&vtxUO)Z&vSAwkcDx1)J(D|tXh zRGV`!x!Uk)K&%TGHp74U123tqJ7K0vq91Gl^9G@9#h*<erD^QMO>}W_Rkrf^;9L(4 zoMwl;Gx0!<C|@UFv;vd-VxZT24!>6t#qM(mqeH0<_rzS*R(Q)o<<CP?7_%7d9xMpC z*&8<;g{fZ`ug9as>vNhsA4&saJy9_0j3{24Bg@})w3R@Ci(60pj$Y-F>!r4@OI9EM zp|v6)8h65vs`<myAX(RJ0m7Qt9xAFZqMNOSRFz_h(qNFMBzy&Xz`-Ga7XwMyu2zzB zWH#h#8(m}oPQpY?QX>0gG}z%+5_Ks2)y{fkQNeF0!)3DX6x=Dy)*jzZO4e#du?{-? z<~rEA13{>-M;7JmXj<C=dGwN9H>E21olsXt796FHPF;FJb>PuweN`<O0aPC-C!nqt z3_<P*Ef)h6ZH71vZ`nis(5h!1b<0O`5Tpg2<VzZ>PH7Hr%$c_z9#ONdf+lgC`nEnH zhu$ziLK@w-!`I{x5Bm0j2>K0GtgTq2$3wfCI~bYyu#U*#UK+cZd&ve{{naIdzM)!% z;gr0`=#y@4Dm!7YL>0!v-Yp1vcI%uRo5$e;i95xymvN5PXFf_Fu5Dbi<DrgbzcIuw z79as@sy^P8JewwUkS_z7gP23aXLSPymp@X$ZinWebRcLH>AytT5<R<1I6&7F$T2m< z179E(=NG_f12#iz@kdS`YF))oXgOCbQbtj9Xt8qa5!jIfe=k(YEk58*7{;l&dvgj^ zQ#b2}qwG)^dJTi@vgAP$H6W>S?OnN1<FWBI6#2zSKup)%H)@AOjoTb)ShB0Uiu|;n zVDJd#X_73RKv>bwYoGOB!F0pm?gVV?gIQIeoMaJuXk^6TNWegzdTo3#$hVZG+s;hL z8UGAmTi6iI1Y{N6j}>St6v#zi1Wa|}lNgv+bYmj4ctG44sVYoN?DH3GqjS_-KyzN~ z;mX2K37XF%ubHg5zVIQ|4T|GBrPZ`4a^N><m(-W^+7fQ7j(}_^WSoPhwMsoIN5#Vs z2PYBg<ym1dBJ3sEtMqpei*DxDb#Fwv;~1W?5QNB}6=U()e^1Oc3D^OXQ6c#A)#iJ< zwpJDsx%d#QegIl(!u%?SA^3Og<3au;36HT?!2E2ZHt8fZl}{GWsLN^0V;=>zGQ|<e zutBqf9He5tK5jb%dxfA#88%-RCcQ>Tqu0<pV+WGq4|-CN_as6OvKIx^)TVHns94{Q z1nPn?^&g0mU>@G@GTo~4%k=JDyWowWtr0q)d@six*2m?;jaVW0hiTptk{P--SO&Td zX%V3hOj`i2LNR=4pvkdd+yc9OkSP)G4)O*9BzsjfYwd*&buLWNGrfEc#LG^zX|h>N zg;BEPRk*2iYs8)oy^dXsCcP_4lV<OSxMn_LxRxfZ2$DkqvC)As@FV3BlCWhmLBFJw zPeQI|C!X6(YNZJfht+azv?~n{Aq3y2jD(wBVYRA$eqh`hJAYv8eE;cM4a)3_$(tws z7rvSBub^a^zs%wvNWYYs)L=eMmd@YkT6Q|_udJm&o?;3o9)$tTk#23`xxYbN6Crze z(F;alHZ@YcOi39XFbBnS!70safVfU)k3m=OV-d41gs0pjL%o9bg5()B#iBc|g?s5W z-0h^d^ypOj`+UgQg-meVCLyj>>eTqL5OS>4$Q-SA*V=3a5?us=K7Tt*dC1b%p@_3I zfnE|>t{lP3O~L2DpMgwdi_%B|joZWxz*Q(Ac;V=gBRv%pdTTEv#<y5MA((Nx5&0KZ zEL$=0fgBFP)5wdTL07<l&sAFx?{NQ!KIq_Yabg>4m~K%_FcDcPIhmyP{OVMqomK?( zBS+&ITl9o>-$@t@l7+O`ZQLa8_VBOKz)CfCCv<6UXolaZ!V*%8?|{658NU)~hgg{M z7Qs93JDg*Az9)3ztV_1Z^4{_7#^U63%dzAYwBB#;8YRc}8Qz6U4yoQ{ve4IpqN3;a zAngRn2Wbt=PGKkE^N7M_=~I+wpG7*5E;rhs(mi}0;J{E7GwWQJG6zwkqZD!*xYb%S zYqT0J!&_VrY60}~R*@_f24?0g>m@Z@e7d8K#0%1zHIA~Rj@aF>M#cBm>X!XS`^)cz z6kn6}YoDeq%x@&q=Ymv6e|#ENhp-3|1ex%K%7yaak!v&QkL5zQFm^gLcIia{%%+A) z!Pg~O>ZFNMp_?o_MKUHNTml0>PIk5j5;d|Kj;x@53Fr@8jwp@JO$Jm9?g%k(smk_U zVyc%Lstl#O;J<=t$qq6&ejEQqwo~UXfFM#gtO!CrgG9!~NY}mN7hh7#OJV&bZUkT3 zW5~+N%2)t1^t_fJ|0S>Eajxzluj^x-a3R`RZDXBPin?t9nf5`2;^+}?ErIP8`m;8A z<CQ$xK=I5Du)AAM6J+Omtn?-2{HM325&nRzj3G!~W&F(HgSy}>=8NXQ%zX7;m=iP~ z*HRqPSpL@T``4JFsJ~p1dPoWqYsf5dzo)M|48wfis2~io{%gD9>*(m9Vt}tBZ<AxH z*exe*^>NRMU^op1j_k~b(>fQ13#`1=)-qti%Gza2;LT(NcjQ}-Xd+pCE(-K->fzGd zu)c}>sEWMf;cDPC1R%q2kfjaPtg1;xecvi-qx;}Bzo=>WzQ!EKvWZA}hyx!r2!b$9 zHF>R}SOn9izr$Ah>&pC->sRREg}YqG8QcE~(lpax=BTU9exD+h*h;*dr^(^itQ!Z@ zyykfDN4RW@S!k;cf8krz1f#YW%jU7jfZ$Es*uwz-v_T=F>a|(w14DV%Nuf48n<8^B z%E;}LJ0axdN^OPq%yz_$hW9WTsM23`uAY7Y5jaVaK4PzW2I4z}$!q<>pSAm1QPD9y zp&Dr%LW^8z#gAwoGeeRMZo;?&?7%XS@?y}#1v0@`gI^g^Vfsh{JV`GLS#Xa^Pt6LO zKXrj=P2U~hTc{5=z{kKlgwA6z3B)3LyCy7aYe^YBfu%!#GfQ8e=_T{@<FmSx-Q;aI zx4}UEjmz94uDF+?iWJ`tv#Hks?vRvljv(oEJUfxD4MP$~dJV939;BPpvW-x45W)eH zrN#NJbU*%$QhvrkPg$s$b6!jrTX%r%48En4;qpERT_7*pV4?!M2FZV3?aOBQ#jU+Q zO5^@=O<%^bR%TzsQ58r^YA|htoA<+IB<A_ApotyS*lH0GgP~45kE%%=)(RtKsef*W zdjKCe_FL6}>E{wEa!d<s4v4lBWYu~u<F%-4;l~4vpw^(`f7_s%czpB1kdH*8Ly=@o z@o56<)S}OS^iKFN`UB4bcbBZS`Yamf6-X;ksY9!-PSyWPyv2x+I*cEosxkcxzi;M| z(7Z?+BhUD8&i2n!0#AQ9%swlw+5l&pK96+YM$??ovOr8c1(%hS+V8up?;-}j@3Ow{ zvcB)KzVEXB_qr_0M@Y^Zj#AS>6o16e^*Dws{%{*aiBJPwO534Md=nlYQB~5;Lq$6T zQL*4PLGzqsHN62D(n=`s3$L@1?o5D*)J-`o+6!USkP<F<LQL1=Jj4xMVt}**BegXv z*j54xk3`{T0(_TN`3uk#m*i5%*$?}~hv{DZx4@&1<{bS}=%PRWr7)<tcl0<-u#08~ z$ZT5JByD%NSG_k=In<BhWXFq-BI-?qW`(O@O=p=`2#Tv1bUv(#Jt6yHtdQ5hg0g;C zqCGSYY)5HP9rQTJG&-gV=6HR7lkNTRM=fqV#8f&~orl6IKqw}D4(3WR)_dOKM_PuT zj$}|Sv=?M}@okQ1m!dX?y%GMPzF8IeZ+aKO$S{=zOMukGPQkvsSTAW5gVU9+0y0(a zQe08qZnJ2JN^eg3l3SdxhOP~8JAo^KLqP*VA>%&iG{gSih)P;emo7_Vy|WWD%c*q> z+)XRF<X(4&`hmW)Rr)i`(wR%BpV?6oKKn-d+YDcX1?KR9Pu-+QfZ9YD=Z1rRleZ2M z%jg5G3%-Q=6A@iKB@4x*US1R!1~@Y=a^ndt2uO;gV-R0}jgBiUQ6GcVDA+=SQ(#Qw z&lpKDsukrlq{8*{g3r=`1`4;`RB-q+$x0HTO@&RqlVYp3+UnvqfU$w^CLeL><aMMt zHw_TK@8XdZY=EUfeLgW$B&o?V4IyZ1G_?CzXpyrRwjVVCQWoD36Q#Mdty36#4?MSu zo-XJbf%6i+ggdtLH-mM+OeklEiyTCzU+XI>#Ae=h-j=GF4(cL4AV!Qv37Rv~I!g%M z4@5<oS#7(hk#%?ik}ISPu)FCa**aej;lIOOEzCS~hBiaS2FQPjgu~nqv=MwFuiu4Q zBZ@`X7YSM;JP+!r2vh|M6S_zUS%(JrB4}=eGU)o~rmQrfhbw}4AJTLxuf1MeZP*!Y z<upN0CO^p;yxJITIL8{J&!MJ-zc!3L#v(MNM5Si5{J5u+;oE6AHx$J59#M_yD)1qz z%UU5(727UAO$9uwQ|QzdT?$m^T*Qlx1~AqPl@61%*YAbKl059ot50gif#xT4H)=A) zaPuY@d>)>rW-1jjw?pHbjQl=$J@UKny9n81VA6J6&c0pRpt&`ck#hUE+HJ4x*njyU zsGUYm{_v_{U{-In<8b#fedWt4@(=GoeRvBBZffpTZwmT9Ty9}YeH>iSY|S*DgT-lz z^B=+-^=3ol!g(l~qn4{$ZYL9Pg?vbG(&r`cLkFW`u^+vn!dJVvdZxl#tAvk3yk<fa z9fJ(E9SX2FPz%KXR|hW)wVzi|b~W~bto0;{4KuUHN9_R~uM4txyN-~v$y(6_8oUi? z&gLWi<>OsU*{MX(z5-%U%=%FLPNUEq+3n<i`w6G_h03R#&QcSCD7m(yvyN005OoT% zt&tA!56I&;gRO31oCdD+yI|g$i@9L(2?a{{oW%W6Yj&VL1ARU*PS~IbeZ81~s-v=N zw^SJr{y}?tWNSsiz|7Zuhhd`%0Vimrgo;~75`C$V#ebuNy~Ial3JRAarVxg~s$C)( zerS*I3hD#8vqFyR;&hUZf~1#wPvI+spwK{^6q%r{L=Qb12(<>uThKNvR+NVvw6_L* zT-=@5E{4QdmAs>`!{BVg;NX=o&|Ku=QXnq@Qgm!>3}_}x124KE2V<aE^qjqZnaYG{ zP@qJCw7ansMLsvcJ>s!U^`4?*w@61$4HYDdJd<@;F@wIITX|2cQM}cX`KaEcIjhPZ z?`vA~(=H^y;!eW*fk3Njbik3&Vm-JpLjI(ObCqB#Hkwgwoi7s09>fGt9?H^-C+p-- zmSS2j3Ikf22Oeks#AG`O8M<0wE}k9dXJQ9F>1%wJ;(Hou2Z^mku9!xYiDhdQ`67~a zKwnx1yZvVPT{Xm4I{K!3UI@NNC_8c6{K6QQGqnUfCjhm#Ryc>+n=qn$wZn}%$%{x? zq4*yBUUz-NF)`{}j)~do3iigW7s>dm#f!TmTD<1N#1d$hC5$R&oe{<BDedu-?qyE2 z-3ceeNZKm>gX^WXE5_Dl5;ig!T#BtD>s-dvT~K79P8kzW8~Tl~8ja{?JD?;7BqV2u zVgymWf<2J?8KM)Q0Nd4eu1DMhGiars8#3RSD9=7w2dzVfN7h#lb=D&sDiVIfsE4bQ zyzRKxa>r@T`2@}5ne{Z@4K=4B4l;vyc8^BW+G&^x{jIccl0GXy(%hVF0i*?}??Yxz zz*jfq!UH`_a?tPC0aiu$89j~xLjN5*x_Hape?7bW7uy4CE+!&KQ#{;Duu<RHt5zl! zpN9|hX;%$i(q{cji!~8`AamIk(sVl0<K|m4n;^>ZF_X^$x`X)j8LPE>KClFJEPflS z3<sQ06Iqz7WJYUQDjHyXp+BO>#E{QU7&)jrw!pL15P`E)&^Fc@@Ntak6xhpn6}l3} zk`FpwtvLPuKyM^gHGbxR@!R=#=@x&{y-+Z~U6vD&2X*kDQma4)&gjtE3cZTCS;^zc zUl?10rlCR8TvAc5<z5zp<kAqg+IfXq-9ALE@^hd~XyP%t`S2RusExh|rz^<W23_0` z21C1bvwr+sMT1^A$W+HeLoU2fjKVHUE!@Ric;C1y|4NO_1JM}aH5m;Nfq$hJcq%-l zz4DkN)y4fVB4Y43FhYT5ZiglkF<R!me#M$P?80k@C&MJpMRKAMyKQ8|$VJ)8-F0Y- zq8Pm`Wyy=J6<e-S;c+LCTRx8!C?D#z=Pt={Zs}tT%x7raA>JVHv(~ug7!2V^<8RSl zwSmxdb5Ll>Mkho#xTaz(U4AJOv97|bP}52Jnz?^3?aw(t7deF*3j(sCkO^r}>NN*- z1MqFIl`KL*zqXn%H{ikP<(8)ri&hC=41UWEj#i`Pw0g*dLasQ(5QRluL=D7aLY+~( zK_!om@P!@Ic*aDMqwf*#Wz|^jwyypIS}=_rqPjjsA|*#-EwLTM)3%-O(jSLWJI<`8 z^Yk?BuoHUST+08H)-ED@X@O$P5J-?PFjKfpH&9-${*9L9R>=7Ch>{3$sA3DPrbatm zX>yQbin9mh+_rOqp^a{?gEz237;lG}2gL+cxF%RJz`W9?FvL|8yb4VOt-eJY0ZqAQ z!%*%ML#H|PTtkX0nzhcsfW8lQ((;h40(NK~d*ODwR03-?->~PawTy()OcVvEpU8}l zJ9-|r_8K+pd3uNVxPFeg>J{;VEcLLb9Kl<znz3a<!;M)_MIST*gt?G_CY38jNHpbR z{)&>*nT?Eun;=zJ>k*^;<BC?}+#i=jIv3Gvjo&2M9+@Y;E??jKUA<F~E|M(jE=%&* z498)NN94}gq!8pe?nS~BLsYy@wkuMZ!(%S)Mnh71&`R}pS;VUMGaJ=meHiWG`}jnE zKtv(n+Ggsqu!##bFBnhu)WK8-c@%po$5yX-1vPFaYT8sP-e+0mI5u4;f}g`9X4?ci zZxj1o)A_il_J+AKXN3D<*t}PcntZ8<WO$W9CRfRDM+g=ySdhWTgcdCm#(9&jDlc<* z`=M>`RS1y1OMI|}3^FVDT#Idod&Q09eYb6c2W$uqnXP0SYX4f1I4R?2FAFI|QY;rQ zj$@kq&*;q^L{Y?tpeYbrC7lf#r$E+Wee@Nt>nFPDpxA-$K*ZJx+ELuy2zPwR;hoQH zOXMbIWdEt#uQ@gC+)e(xrlQH>S4C6M0+=$mRvR6TISKvDpd81MLkh3c85ydO4--?+ z3cjZpPeRW8HM($w-jNgSv%~>Kpm|Pc4=`gao(D2_sEXOCVWqwoQKP#Vj-!S)WUzW= zfP85Pw)rNJ3tmY)Xp(m)#)rhq!j7^ux46S$PONaZ6bx)UODc4HZ{C20<0x0WvY8gT zzph8zwGYf`@V8DfT}{(%B7#hENjIpq@WHjH<8N9+z_fW6ygEn`c4)G--H|zH=G?w* zzJ>r7-ziSD=J$iuwpmN}XBjAWlw6zw5g&oSFmE>U=)!j3ZX-9T3|#6=tSJczLzQ8! z1MTOfMQ%>na?*I|sD~Q+01a0GIHbU=t0NmV5&nRVg4KzB1D>Q|R}2YSj~qEN)dnBY znO?<+E?zv&t^w|dWwVF$MLVmLtg|ZCe{17*{f^hug8XPFd4?lzErU0%<k43E&ukXE zyQz?`rAJF&LE^`&ygh^&`Owl=hAKEoZKV!RldW+t?5@js7d?4)bPu`Bn~fV+-da%@ zMg6Hv^eV=-7@K#)z2u0SQR~cAu~uR2GBcTn2L@gPNjBoNjrf%=4Qd57Vc}B=tes#L zxVk#%ykhTjcP#o&b9wj#O6^7Zr%|9kDkzi&;6FXwjV`VxC|rh4kl}E|s+lWYtg88* z%luYRyD>}-MR*H^J>QV=Zcu;;M}?szbt8i5xU*1`GA(CP$B9E!eaPXzglxa`DBYX0 z3wGadwb{?q&CX<JNXYQG-BmPJDGk|opq*EkF4`S^u59$sdEkcAO<MeBWI*sHK8fZ( zFE>FkX*%sVqQ5tkXVU?t{(AxaQIduZD(-Ef;{1ZMp*6wJ#x-gQ8`t<J6&8~b;~KfZ z<OqbxXc&H+zPl8es=^QTZ#mCDVtzBOX-HGKqVl7wnB|2*fgWcnOiozLN7Lni;|RQy zLtZXa;~V`DmzcQ)!u#oP1N;>Xqw|fJ1UBL!y~a3ktV5hf+Oc$4P8^{p%0pZ+eX(#5 zRoX96rL}Tz2npw;DK`VENaOr)FN9E7Rej@oL?pc~O*g<X6$+y6zo(0#tWa;MgqK=T zp%tg0%OUDzjL}oO(#Xpk*oAaondChU$z2%X4mCAQvirDFC)}bFlfr#`wJ$4-NKc0{ z35@wC8KEp*GO$+Wc`eN)7Zh|CR+0_p$pCUz#(omD=5KUKI6oHS=6iu9<zaaZ?pJXr zDi@FQHWy&y+E4rhi=5aiOUdnA`3Yg_l&Co@A|MJU5vz{>?E{w>%q&)+4vEGz-KQC@ zN`CBK+*n7@b!dXo-5|WZhI%uxOoSYwmw@jz93U&9|Gd`lXKcD>LH2dseq@#I?~n!O zgko{!|HT0ived>KI>~E#@uKg$tnVNOzwffX@3Ow{vcB)K{ujF}@eGo)Rvh<hMe&Ef zK(}%bL+;xIQ6EkWJccF1&7UA6tI8w2g!jX0Wb2I7L^IISl?&a-khVj8#59eSbWc9q zf;^}J8P@#>r=rudjtuqs!?VeU0qvcfZrhE%z3*^@ZY37o@AK=MQ`*A(?QqVr8wDX8 zf<q(!O8Ad$rqz1jnV_eTnBb@^qQA&vKJ8wSP<xL)|8=y04m`Mhn{N&qE;C51>1<(s zt#SsP+jKrdO=-izb`30;7a@<)_cw!c0X*j>K{t+v|Ih_{Lz(DWil7y1>lVmuPfO^9 zIYZvO3t(@THm+JCMv#`VO+Yf}IPupX4oNaMqFsub#h=xTt+Yxvy*}#X*HjWY2;$|9 zJFzcsvN(GrWdgc~xO~e>eR-6(tCFnIF~M|lAi&2Y!ZF!U2L^O$DOQ9+u}vgkhZp|N z>!k`c512QHMh?$T3<U=CQ<gff`Eydp+TRx=to<F|@{RVlmt0aEC@N6W7<FAP5@2(H zv_=Y7xrs0j-dk$COl}nrT@`4KCb3I9AP)napZkO@9MsEZwE098u&V|<q=hi7g$Uug zJto8*<UbfmvDQnbvOz&huOn0JM*B;kwQzQ7i?5m!pid`NnH|zn%h77Tp%U`CZG++& zp^Tdb4)T;NMl#J8i?IPVE0z*59+0Hw;weJVNzu?YvCyIwkKT~O<~=+Fop|366Mgr? zGVF@pfnO#-=j@R<Z~SF)(`n-dNRsUw2(82?5N+4B#-avn=97D!lhE--B?tQ0g%jM+ zxW4b#ocajDK7D?+O<!iF;;-=pOq7s%Z(RW&9Hq7{$UX}{@m}%cO|67k2SimB{$(UP zWureqt<gryu`e>w9#RB3FKfglH;f<TvXOP@CYKa@4`9dq``ja?rl8PB9{4>>2JMOK z#Wfi_BeZxqXp#74qH?t{dNSG=U4WOIwrj$e6U=Kw+kaGQ#=(lfE)E6Z7+MW6Jwrj9 z9F+7?gY}un>atcy(xqj6@RCG6wE$T`5A@5f#F2xx!zAr>2W>Mqi?!I7FI+@p<=zkJ z3e;qx{=3yha5rvK@XcYK@>d!8ZMiP_{hfsDSE!6XGjMd1`ANEhvWzq%EOh+#(CHTj z-iJlIxQ>6jYRirbxzgHJ+AUK{bC7?ifv)T%6x{R~S0@0z@PI#Hs_xoKmQm*t*ddV5 z9?{d!JND*mh*`6&7aI5KZ8>yCfC;#cI>=8axDz4*14zY=#(wmQ3h(j@xZ)vdtedTV z%UIVS{kO(CCuZhgCbZ&ka~vRxXS&FBPo&Sq!0Jr|DxO*pY1`sw%1(QfTpa~=az^^j zag4oMz+=3pL9k@1Z96-U==lmtu70%EaZ<gg?-Y|O%+0p<v@KPT?A||yg1_u-@<5{R zI248*v-RvApW#8;>$d7HoTkY2kSBFhW(X6|!l>*z=xdivFOXG1ElHX!-*Y6h4Jvhz zJ%n<}Ak~Z@`f5wyi0vC4Y`+nc1FQt{niiLhVMwC=;^7Ect{HPsAE4=yHU`t2I2i@W zkYT27lpKnqTTF-OT&E@b(<~K@<zK=Tu_9GXBcaR8_4qcni>kCy=W6J;T#v<2n-9en zbTeA9e3hcZzn>_%&?IGaU%yP14-q>gS%*j7@%eEc+Y0YUUzO|cG=8<gyr6TaAc@*N ztiu|mWM*u%1vlpLqs4^nmUNo#ns-NLdg2e6?Q={AIVH<pJ#T2wgYuBZ?WgJtU0Di5 zj%w?+Mrq#rm;h4MBeZEd<sK5Bhc3yK#RfX>VE)9SR_^LRXL^e?fKOV`M+~;%b`I1I z1aG51w+CfnEy=~bs7-68kGXMIiJg4nf*tK?;X5ugK=^h{k}{l(IM(|;lbn#z&a^i# z=|SzyF`|6=;SDOz)O^#_aY6iEZ^N~Yi5tG<nAoFFVQ)OiCvLe~ybL!*ix&>cA<?Xv zF{*iuBa7EvmODCD;MiIhZVKVGN6P8%u9w=bFt)v-8p~vG-)Oh^g+FhS1D@l+qp>Cy zr#gH?vrfa^>;Q3AfLS*Jr{^&}YB;+g_cKH%unizNenXHy2R}!-Qy3a?iUS+_<O}%k zjH^Djs)3UY6OlDYyP4b4DR_PcwKirw-4TGxov;<kSL4}Tz|vYzC+r>?;ItIt;B7!i zwn1qYWS(K>1g2ggIbI7uRWT8#$_CIvZTb(irr>lAhmuna;4S;zk)x?&PG=>W1xUdJ zVK@MlmRTYFPr~!PaLO{_>KKi$%JPz!B*0%7t;2ab%Yy-%7kM2Y<M^1#XD*x;BlPFf z={vs@6^h00Nmop>2VT<lPt?n!wX6gUFqzr^K#vLT5nwZ&tu(Ege0r^&|AzrK)oCb0 z5Bg^D)N7Namw%VFO53Q%wzvUn>TgMP<hgfYwrm*C#!tr_VtkGbk!E#K@OqI1urJYT zZQQSbO@6`zrEni7Ev7RDBt`6xa;xMjwffA^4YcirK9k2LB1J)_py&8TAG|Da-QAS0 zR3XM+T}5AfRqCd56s9^x&EPtxj?&rma|gW5W}UuqSAGCd55%jQk!rrNko5!7X9Uw- z^wAye62I_o8jryf@c)@j<Nd_LX|db`N4}n4kIp*z;bT?Y>K7}b5&OR*BgXl(YT@nq zNjZAnDsRig&yx7Bsqir!LOxkCh))+5(@*=gtpPKe{+ox!9WkVUF|NYD*J{nyUfqq5 zw~`wgU^$9T2z7NL|6}-^O(e|GnH6f6IJx5fvvVVfbK!u;@e%`MLm|VVhvtx7!I^Jc zAJm8k(0Sb9;&A@L*t#oKyt|b?<ubjfw3Bwsf4DD5MB_i((BozF&%z-Sig?8#1`de2 zh`PmKAvWU7Prmc&4vSyFAE}Kok>Y|{an*pH*A_^cejg6H<qb&siDDnRu1AX-2gKmA z)5bx|PFVZQ;_0NAK4NJ@q{cSd{10jEM)6sgtve4pL^ip-2j<xETG;5qyXlb?x_A@f zSVcq*m0t=AAuoj-E_923)YF4RhGjht>oPW*^MslPd7I##Rw-XMT@$Qa!pO-&6^H1# zX2g&jY6p##u+c@jRcH(IYNvpnYbf?dvsMq0Elp$=rs-q}o}t0kIj39API!V|@qBr4 z!$fHu7{<e!8k>e$&<jt8Vi8p(hlcpLhyfv=S?BvSa}b|0K|xf|?btG*;l@r&aN5-1 z#&eqw1<1z@?SVqCALcIw$!RF>VI-W@=W<!JJni2lZ{EItPhJyv7_K#bi$y7Giuohj z^}XK<>l|jBqJ}_ALC|Tv1nYy6p~q=fp*HPZ*hnx$O<!m!y066@v^Nd@e|`rMF&b@$ zZKKqO?T*c%f~(5QUR&#h-_DdAFx|o5=H+l5jvMY5ou>nb-r!CJk}HFdjNlM$CAba; zS@uRgZ|Z-PI*LVe4rlglW}5tekPQP|jxN1VJo0Flxm(HG3Dd4S34^T_S&rgvCAsOc zfOo!pnILRCJbnM*>onbBc{MjO)6=+}?{D0R7QhFTC+IqLR0oN$G0?4oIA6C};G@Gj zg34{hWPqG&!jq6Vse+mokS&SPK8w%NO;C#y?f5gI>x;yFLscvVVh+=Dh#CWIrNq}8 zS-8tqr7ts&>kIk#)<W$Ms0{N1j?*or0qL|m-XN{;&c+2ToJ8@xg|aMbzMe=-;NS(6 zU`$P5FC{Yq;x4_EIvL0m`>9p$fK%6^jv2IDE_}*CCa;DbmQ9oV?gYgy1i~l7-Lfz) z@a-Xb-%g^1zn-Eu;Uv!{E;kA;EljLQR)?m8VBi0Al>Xb>Ttp=amB@T2{2q3%(qnN} z5|8t8*|0#Y3UZmz&Z>iTR!x@OPJ`(a8!c6A>pbEo0{0s`Id&zFeg?QVYZ~5NX9>)r zWypHO!feCr@>M~RY2UbkW*(~GV#!i)XLy`F=im?S#FOaBYkd$^N_$n_lT$}a4bim# zB~0`hRyJbZ<t_%8<b-Q=;0c|z%Y!(|o1K+)2z*)|`px)$YF<t2FRP|TA0!2^b{cSJ z*6;-H1qcir_^uIN$Zkh8(P%*m!|xW^N(q^K92DO03zrpBbeR!J)sm>aJzCYmpO$~C zsJ)?z^ED#}<lMC~9{fNDCLGOC3-l*Zr61D`mmk=bnD<)ye9+%_NB)c>?&h&@F3|yJ ze{i+gFQ;}-QM&3l91N^j2&476YU^pV^E!4(t!ZI4UY8$)zrLJKcT`ErF1(2!D-7_* z=yB8nuU)jv9Llq000TMiLTU-1?R2+a_)^TlDRED?H$TGmxO6ZZVCEme^qDwfkIQjj zLpuW=W*EMMoIHq3)toc*Tl2kVnBUC6xC6|uS5$tKVK6VSuS8Xt3RObWB`2p{BsCRW zX@kC_Cjw)HglbS<K&C6YX^Lqv(RC}8=m@L?w7v;wLmu8j0ACI8#oTh)@;vva1*APy z6`qHG%u!IKy^Jbtwc(g!e2?#r4S*`r<_LM0s3@%J;hTaIl3xA0tnif%^-=fV-<zPN z!QyQv2fV1z@)K~gP1MVnOD7GMa-{;aI?BQ=zECGj93&obKrd0n>0w+j1{<gtryJ_8 z^kud=n(uD4T!bHf#c9a@VM7$%GsgA|auaE(U#qVlY-s16?B!&%KgC8wv;!65Dhe|q zhTMQLL|Abeme<I8Iu1o0$K!m`AKfe=MmQ{Td`R<6^b4u&ru?0N=CH3fAvqXM^W$7^ zlTNNX*bD#a=Fp#pn_dQS$wVTA$_-#r-BL(|%qieso=m=qI?%5g{$f2pwH>{#+m9=! zk>R1<sei*Ud-0&t78BqO(WV36cUh6^6NBG(S>JbA-*;KxcUk|7T^8Sk<ZKcyRq>+u zV_XI`Xb=)_u7ao!CztFHBVxeV&W)%laC=C!MaXo`im)pV4r5<-90rjg^|Q?h6Ie+P z*1-lenX>A29^q7Ude(hdzy9#-#5O>Cr$C)-c=q~^(83x{q>*rhRu$vArA_2j@hn7F zjo`-5!{p7AaYw2Ai4trO3*n;1qrWI<?+hHu?|8>DX&PEUvu-<mGQ2ms5W>uw&ZW$+ z)yAN6AGICUi~Hak3s)Y{xN+oE6{On$w-YG=gB3Rl!Lw@lixmIrHh8)kX823ThhVRt zLp}mcS1EqqlL-fT4QZKVD=K!E#K_`Q^*UzpU(&p##6{zd+|YqwWSC0gT7e&UvW{~u zNEg$C<{WH%yM$TXVfuKKw{!WD*fJJJ8P_b^MhWnh7UKr1hb+^R5DJa<uqpKW&)Vo* zw&cV9RQAXfMYpI~vgKvY9g4po&SCBEgVFZ)Chs@e-;mg^r=h3-Vo%g{dB6cxvba>6 zQyvga#iaIN>;SjXf#_;BP4n<8EzMT|&RbzqwSX%o>}d003fR{MJfwv%tZ0kHtrT&H zJGeI)NpUR1<+H^e(e=-RxHnVwHtd<?4Z8#f2~*BhKHz&yyy%Kp+o5(aS>d}JErwm- z<_d6~L3upxd`Qvbb2z88gOSw2I0ixUSZHI?S!mIUH@w*`$e|PO8)9PSd$_u<@TnTI zEuRGL9f|X98sKs}V{ukbYZbuZ6~hkBf+%yOv8elDfQkPvu24>f|ASg%GNfW(6i0$$ zBP2dTMZea4lOh~N)?rZmvz`(pUT*cC85f%iqe~$6z;;4Eyk1<3urrEo<Za~t(~xtu zF}jmAMw9x;0gv;VFjgqFS64oeKhdn~t$d(2C|wE2>ateIN6qnJav-|%L7YP7MzrO^ z$aO|T+Xb$>&Irn@qz+_a_dg69*R1+IOhHX1>c2x3`5o8+;rp1Ud@>`y#p{ya-$}^! zqu=Tm@`5V+ojC8083{g89k1=a@bdjxr{H0S@Y=s#v1N;6RDbER!zo;TbE1N_dNO#l z00lSta~JFR*aX0(AVlQCg@d?-1kw+}X$RNx0iE3IK9^WI3XP)BbB^{U!bdX0X}Gnb zu54(bYZjR3x)Cb8KVo`x*jTqm|CX_?`@c8VA+bu8a`55`sjUQAyf~jQcnf@*OQu(e zgulzEEvt?&Wyen#xw;lwhga%ecO2tcTu_?#PPa)c*O$#&agomY)&dlJZ}Ln_k_(Cg z=YI$gY57vTRR~{#2GzZXPRG@Qw;?xJP5n4caXct~ObZiKOh6AsWmhHBuf^@-kXtYC z?a_XE5%)N>Q_zAO2u0v~X#~-?$Vo0bukBz-Bo>ncISkwsy7efA;Vu&4Q#J8%npXi* z4wRYc4>8S2V}UJy-%ay;X}Wt*DkE&JlNYBq9?{WQewhr56;g>_%4H9r>(TlpVXnu@ zZ!D=Eay>RdM;$!Rp-fqg<*S*fT!hn)<6y_(!Rwc);a#C(5nBQqj^Ng-YEonFZ?n|A z`sd1cV_>Kt@${$oW~3YR^23!*rLxwxZfNs;+42Xrlus7^joCie4{)8D7NWy@9`xI& z@B-)`S#-1>;2^0O2|Iht51hgTP?EENq(1|~`+N}@^c7BHv$|WDKd})PL=EkeZ-U8Q zvy4yLK}T%Bw%x<D14pPQG9!aJvnY-rKWN#tgzN~ASF~2H!4J>)OS5n4>jrfbCP`f2 zt+`J`GV(ky)z7rI5XZDPw<cVjb&8NDK)Q!!?$S3a!h`fnxH^0jbxi#ATaJly^bWT2 zzaWex`<3DqGgQ2AP|kyU#o{rlwb2zS!^O+~6K>1Eq1GUhadCbl{UDWma=p}cg|Q7u z`e-JDht~!8OOcs*ZunGy49c2Vo-G<jZuV+7D~st8Isx*qMAf1m#i5|i7N;QhGejq_ z4ImW}t77bdw@~gh4UIT$#f{^<OxO~U=vdixjjLg{5KkD|7W&8rLsGzz@fLJAnf3Iv zOkN8>4Wv%Tvl|_i$q2yNp#e^@L6e$gN0Aenk3hm=W=>%06_Vo}KtSgOoGO#iLLK)e zj95j9x9k@eFP5zDoF>>EP>cy8rWyXk#i^G4rimf6w|>1*Dsv%sK*CMdzhbnGkP&E8 zWM>F@ohZl0Og=av&98yCCXlB;!S!HR{66;Q_6Etr^!zs37X5Vq%m7n9{XBY1a9bOm zFkvZ_y0}IJJtOS=|0T0crq&kppjYuPAKGqy<dbO$w33eY1_;*F-Qq&+mnUJ57L!G{ zOu!tH_bD49owgDn6haap<sj{F8a^a!@{`2qbD9M6qwsU|u<)-(xmEEhwfe~rwaON~ z7P7sgB)aGo-UyRY%#16+)~-WtWZ^=1u*|m-?$c3qB*U{#`dZ31wy|BWcOfjj_OAQ| zWj^#kOs27f;(GBTf8oM;Q1}zF{qzcF#Kh*H;!$p?Mbq&Pq+1Mhqj2j*EHKyJj(S}} zn>`<m*fq;Tg-q&l{HCO!g3c^o<-Mh)!1gs2zJ9<_$34cDW|2q9bFb4H+0Lf_ig9xm zZgz&eF;e7Qb@g;h*;$0V?ZVIi%f+s(kTYGd{f*3L6A61MvqD{2;3VuLxTF6717t%X z!=Z;IYDx~E&=H2q{9M`(1AYU}U*s)yl<@B?CFuEnFvrjNG5={2m1uN;T|leRf3x^i zQrHqN^phKAUELJ8l{^Se#zgYA4n9GqwS98Iu6J?JZKmwAv^Ry(b<LKeORMdjv8%D4 zIQEOrcA=JjyV!?FjqMHnAJW=A{HL&ornk9yw$kbx>`lQgBN-n0DY<xv@}okCl6X`G zZ3ofsR$I)qH3ay7&@x5TNPN(pWWTcFcxDy6<Mq{jzv=b=XPaKdyu9Q#=h~bPTHQ~n z^;eabbIzs9cJIdDe6kC7<An@4xGjRbCwV&M`Ns^Ma#6bi6A>J;F_T3)vg|#!nd9GV zb~j1(3c((JifQt1a=6*Qf|}W8|8;)*N_}P>*>$~17^4@(-Ot%tDQ?t&3GaNW-QoCc z+pZT@PlL%ES2jc29enk)G4g61S^#g=e+FOZYX>-uje*uU_!62d!tdMgmvO+!CQjyF z_2AB5Lo5$*HVz#Gtk1F?p@q<azxqPEvY>vriWS4CRMLZ}G3(mBmxh6)oN#%qAyW<8 zymKsj*>W@4{j#@N_H_n!Sbc{=dvFb=U?!);40Re;@%2PvzCiY&1QX|h)@Jb|nRn2+ z;4$Mc0{=Qx(*e?XZ6^IW3~F-<+~U}yB!gwsf=FPz-s+IEJJdnVv04815PfDHN7b*V z=nFd`rb;*-1(zHXYl`%t=^)bdKOLq2_RdUPA%RL{ormm!Ka|taa&&X~=UR-7cPT=7 zw6l7Rbyn%(S&ucYAsOcC&M$&|gTwImR`ILhJet-5FR3XL5HqAZNgT99C)xH`_oS99 zJk!2$&u1~J;Jou71P%w&GtlO@!q7oJrAwJgi7Wo^%wOm0#!UhA6()L_hn0;{Ck;NC zNlrMh1|JTo8#u~~J0kISrd<7H8q;C%fL_=W#wDy+JFU2x_|TQ#qmh->4Bs)r3)B6G zCSDbh!iWSUTq)73arKG`hkaht<781LRGdWbLh2$~)v_DgzE#wY>HH*`Cw%KSXb|+| M{ot*;(|_~-01NJ~<NyEw diff --git a/client/resources/hardnested_tables/bitflip_0_0cc_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0cc_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..38fc1e0aeb04221a6f2f8cd7fc34f59a21bdf331 GIT binary patch literal 1614 zcmZXVPi))f8OCKPl5C2LBTAIMgW<%nrI-?t@B>mn1Cl1SBRP_Z{F9|HgW-^$F6*{~ z)XR)CwIz#G^bdB@IvocXNu0(`R0}nk?T|y8N))N0*rnZNIqV=CI|M~A7@oH}&D_qr zZqI`kc!1~nd-06?;+H>%?_Bf8uRX~BrOO<?HvR5*j&eDl?KYXr`<FGHJ<#28{$%<; zT{4}-e{VHe&VGISe`8maBHlWA@}K^m()qF1bL+d$bp_{Qb#D0;bjx5dX*;@vjD0t^ zQ6Cp4#UHD)_D^2^aQeP!clb<-*rZ;Q_E(97ess^=&}8tC*8mh~nv(K_z#}y=m-H2N zh1WcO3MR(CO@y9&WCk(Z(QTj0YSHuqW@SnY>`+%b=9P}~%KG;fjk;-m{I^vHW<ZuO zKsZ-%xR<c87X&vknV2G>4{{uk<=eW!ptbDfj`#(!lFQ`@9ggCz!m!H3?RFPX8U8gs zv3K$1&c&`m@a41g44xt~%wwssxl!>po~{3N%J}!v%-GW}M{f2iT<y$J<ATl7jFu$& z?Q<Ip>e)bOYYIQHwHlatxHslr&t3oK%1ksUR!scRn-8Ink7H}*=bhe%MThfLkWgv* zQsWZ~>9+;e+!~|Eaf{97Lk0tr9vf9cte<AuflqZvM;MMlekzDn<2a{+#9W>BIII;= z+M>!}?NF1UDu)WaO|jW*Y~(%10|wwCy?1tx%}pnR9-508h)y2aL9@sHuzmQ>t9#mg zQ)68%FC97DSgeP)<2}6xcux@HZaw8?R0l9sHgNjrn}xa1^w`sQ$MJGt#*i+KEbh4F zyOMx_vO0`YMWYa4hSt#_kto-sD1bq1ui)vM>cuvIqSPlrA3kbvR@`ZgQ*n56A$;R_ zP%@0r=O-N6mfBBt<mBKtHwG&Xtz&#oU+~l87Q6EL)Cuc0_r9;(zwq^|t;a8#-~FT1 z(K1q|RcZm_hu?j>eSP^xzfr7$3+|8cg9i_Hbv7F<Nf-1FtWBfe`>^fUA?N8S`|_=) z=!{vvp4IP36I&B>y!<bik$44hUi^bU9c0>}dv+qTQE6=5l5V-k)ZZt)omLCmJ?*MA z?)zZrv`GjhSc(UM-QbJ&z00K?_nG&eTi?#s-7qoC_p01y<d6_Ri*IIU)7Y#KtL$Mh z?QVLwmLyiPePm!GTGq!c7MyFa$s-0#lwcU0lhyME9YfrTkEs<KZHrrz+dmtCPJsri z!)pi45A0rdG?%w{=m8eMq>IdrV!XjmeEDZe2m^v6844_Z=64DpMKGLF5A!YOKH9b+ z7CbWM=&%$ad6rwlZ4?jrW-jk!YS3>L_rVbI9*V1#nGvm#1VBSi)Euw+M4n}yG?+S9 zJ<sbpx>Iag%$q1hC<1R34VsCuRJqQw6AF?c4({g3NOyanVhegmQIk>J`c6?`Z~?s= zdCLz_t4K~B0kNxu3eIV|-vdkhG0Y<R^t<Ut9b3;aEG`bZgIG<R=+Heuafyq7aSwwU zMh>;{Q7@ShvYTk!b;!uuU1ft~SvGmxr>D_=%Rwpql?NXri}gz#r9G7Kag)KW5<CtP z^PzdrnRkIDe3I(}^FS2}u$o5CGO4~mx&>H2W#q9;Pz=#F5K@`i;9MqR$0s9w>6E1^ zR8v5W#j%g1q6U#b^-))`I~fipXc}vZH8DtDM(65u5+~|lQB(YW@TeKhLT(u`9(uH= zc~-AZfcODT@o^syfC$CF;m}|a#tC(h6p{{1{%{jOHieJ0tR*CKy545g-~8I*A``+{ zJ}UI^ih&D2W<j{za#pZr#ckyG|5a86DewNH{wrnN<#4zgdI}Ghm2ncp$?|1}CPihH zlA;B&%&2}}{72_0B2+7@_+<&L`Uk4K;UYz28k4UGNq;wcWxY$x6}9D*iJx{FtPhT) zPxMT>Oh&&oz2w<Pp`o4X{w-j+w%S=R_1X)t5bFNQYfdd3*s@ew_Mg1(g+rHa|93zB E1Fyki8vp<R literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0cc_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0cc_states.bin.z deleted file mode 100644 index 868afc9f9dae87739a60e1d6d771e0921d8d99e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19919 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0d1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0d1_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..4d1b275939bff40720e3ea979dab15a670881b9a GIT binary patch literal 5983 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0d1_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0d1_states.bin.z deleted file mode 100644 index f7dd752f4aaafecdd78a9221cee12e7043edcae4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28438 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0d3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0d3_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..cb9afb002e694c10a1d31d3a22625ab80daba6f3 GIT binary patch literal 2082 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0d3_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0d3_states.bin.z deleted file mode 100644 index 68ef2a6d5097b0fa81b28e0acc3df0902d805cb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16025 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0d5_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0d5_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..ae6e859a852ad98d1948f29dfcdd3a1f87f102a8 GIT binary patch literal 2460 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0d5_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0d5_states.bin.z deleted file mode 100644 index 7720f54a371a5a5d13a95baacb8ea5e532840e8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19686 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0d7_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0d7_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..90c5626138b4bc1800acefa498926d675510c665 GIT binary patch literal 1352 zcmV-O1-JS_T4*^jL0KkKS*c#7asUt}|Np~X9UbwXuRRF3;~$8Tz#qUJRS|+6T?l}H z062g_Xo=tn-v9sr00000000DV0MHr+fCidm02(yN0MU~K1|R?q02%{8&;Zj+fCEOE z02(r2fW!a+zym;N8UPw;kN{}YAOl8B5Ey^}H~?r313&{!G5`%4WB_Q%f&&l$2LKHL zplASTra%FsOn?m;FhF7e04XXW1gDZSMK%-<OepmldXE&*>Kb}RjXh6MlW2`IQ`CB7 z#GkfN0rKS~FJl!~qK`z&9^yUY9-2H6UdlZ2FsBGSfz)902fn_SLUbz(7(50adDuF- zJ;(hzosQ9w@R^KoFLZxc#pW(XNcd3l1Cz}M1xpN)^OCt0k%IUas?7U`vSsQnz<Z-3 zv@X|cGu>l_aQp`j2T|02gP`GE>4(662Xg99Z0eVSW$~_y@egg$nCP+g1Ne>!a3=y} zc9*Km{43~8od9%ITqW|jP7|X1=3lYNej$nUnON>eh*P<L8XjvSp*jbFm5gM4<C3`| z^$EhEVDbz`3z6!KEBA&DM+=1?zPVhM2O|p%7-1b311?vrTm#`f^X`t)?NyZS525*v z7si;sFvs}`+7BRMVTwG|t^<NQ(BaTSFKKxTp~;nIRCX$(8AoEJ^cGlhR|_Us8BDS) z9jeFMUBlT%G2V16j^V*!jB>bKrv_XO!xmjvDTgW5FlFGlGZ$eyi-dSAeMflhF<|KE zccv^Irz4Y*cP@#BIA!&*(6Hp4R|Yt6a_Vs4#!Sv!I4S4@z)WC2Qo{QK0oXV``1gmj zavm{ur+If7d<Bs4u2w833m1&MLE0P_oV^wMj*GB6%sY%&<ztY^c!QyEIx&m!oePIU zqHysP^$X)zGG;LNPnhK4enkBV%IeC??JQx2SY$rZ@{jXA+xgj@QSm=X@;gT-tapR4 z_s$LjFR6NG0qHU9EVy}IClAQ~#}7#q|Ac+Tg_amF#vXXRAu#BSu$e5B;bROiVTMtc zri+A!11zyDVoa>YW@U`3uBA&Px~qYea+T@>7or&8E*4f;x~>-sgN88eF~Z8>m+3B5 z!Jil9<;jkW{I6BzduQQxyHBuP%k>V99x}<ma8AS3Ukc>xTn}mNi}zIUS&N4cY@^N| zB6UT1<CR`AU}Ui`{a-TR>R#fRF>s8S%M&qm3?n0|bzc(v?~&ex-Yc+vwR_IzfgTBU zTr2b(uaL>g7m-(<FvGCR8D+u2k<d8~51jc|Rr9QMUohx7Kiu$K7h-vek6kQ<<qRmp zp)XnFc?MZ^9zp0hP7J+tnZcYFka>deF^pp#RQe8IWb&6$m(KJZ>EL+RkTS{UzN3Sp zPOI*|ca-<uyXk&6%<nt{#$?NcoH2Nlk;-9*Dz03U$@<p$-HyVZi0xS6aI7-2%*IaD zmBGN_<8@sJ(7HHuKV#Ns*5%dI%zY<&y<Wi*7uJO(HTCMDN?)}UjG~cGvs@5UEPyPG zQxhU185G5O+#zt2AyXBVRfUR{SwON?hEpgpOjRtAkyb_unIj}wRh2PiOHmmk6Dg`N zWiv4_$uWjh%2ru2V+oOpv1UdUiz3Rft1}xGD=i}!V<@m;Fl3o9m>PwerHnAdWYGp1 zsAS5pWMpAtm?JWlGMF-ktXj!NW=vREg2ouk$uPl|WW>tCF@<9WRtqr3MU1RqOk*&Z z$uh}f6<ILG78wbdGbv257{)S@mP*X5$&6);!3@DO3m7J1%rgj>!mP?vW-!Gpe;0B^ KI8czOUZrwNNMVuy literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0d7_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0d7_states.bin.z deleted file mode 100644 index 5f05c9cd351d5e5e6f77dcc0bacabcd14b9faaa1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9175 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0d9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0d9_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..ad2df6b557ea51017bffda4d4ec7274b568ab18d GIT binary patch literal 2498 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 L=p7H<$*uSg3Dj7G literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0d9_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0d9_states.bin.z deleted file mode 100644 index f9ead3d9f2c9c39c7a36acfa4f9669f0d1a6c16a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18323 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0db_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0db_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..353c48c88208403f0cfd3208d24d7edde9bed999 GIT binary patch literal 1444 zcmV;V1zY+;T4*^jL0KkKStIjv)&K_ffB*GYLAQzYK^#C45D)+mKmY-l0r6lJKm<@Z z0Dy=9L)qX9UjP6A00000000004rs}VfC-4ejW8g@V3{xo!<sT;U;<(=BTNV}7$!^t zFy@Sym;jiJ2-5-#MhTMuj5(twCIBWQ0yMyb5rSmEBMxZEiGT@+z>P2<#9)~)2*9MI zh>7U~L8Uz>qe<#)C~4%$s69<IdY(+xJ!pFLMN9I<R6hbrqY_vCDOAEh_wiStOpk?p z3|G`x;~Xp<BeD!+SxXebMpb3Qv$4Y_V=<1Cu&kL?j7(Do3NFO-n2cFVESY7DR$+{; zE*%*|ECw-IWtLPwYUyE<A%Q-EmlK0Al`;niVkLb@;C5JK%YZx?n7CamM*`@q%ZrM` zBMhmGI2mPwj4Uv?Sz{fMaI3m-bX|(<a5EEy!NA5Yie*?`ILyq<?9P#lteKsYg5xaA znb6~i%uff4BaBSKv11WCmx+uggP=TCNjy?zJF62WQN~tGQ{+A2eQrOH_|M|`&pLRi z#bGk+eha~QgUoj$gV1!x);Q@^;=Bj+eeb;Ur92NwS@$fztMxytv(UT073*Irde7Q@ zXPCW2dXHgcd+F_;diz#BmDyLV{_Y|C-&5E<ffu~KL!rgw!|Pc7gC2E@$$pQ4pV{_2 zo(YUF@?1U9`X0#qPnG&SM~c7c`9C*<vH#D3R~PrJxID}9I~|_2>N~ET%y=rg1jJv8 zE)=+taVyqPtLy~-l!!45D;82%CIc9zDVAU{OcM(#hDJ)oD8Ry)uohueCKx1-*SYqd zXPEUIaOnOo;CK^;DTk?e7w%qTK2q*So!m~wcO5aAXSmF`anPNXI$_|ulg0KdJ_pP* z*m)T+%3~P7_79x+PeUxi_KTyj?3u;>XX1XRO1qBcTt6}SuNCyC{+>@0#oc@7)UT|5 zqs3n-e52h%-+2|}dx7ztjt_}DoJZ<qm$V-O^slus`8%h&{133{Jtva(k4S#w+zNIN z*fC{{%Elg(hq#>{CxK@Z+x)nCSo&XC{hnuZ?zs5Z@?N*|JH4m2&uP)c{x4F`w0@7d ze8-A-nL9CjDSS(TlZEa+CHu!0Vcj|Grtmnsot=kEhZ)$*k29rv$7XbW3D|V$-I>N8 zQ^C=nFyp(}4@<k}K113aFJ<&QA29TfBgK26=5+8~*UWm3$>?MEi_X0UUXkwu$na-( zWz(aH<iBCk{ZEnZE{}bglQS~&yzVZUJ@X^UJ1--H!RTI**?1k!?w3bJ9VHmTVwc#V z#qgLc$hsIZ35%rvQYBSB#82R5M8!(N!z5&}V!@USl(Ce?WU?^Hkj6tSSu!z6iDNRx zRxDU!49v`BV+#zc35zQj$z-g>V+>`6STSHT46w<Siem)HWM(X;7-F%RET&k+l*=X< znKH44YGtWo46@8wWtqffRa&a5sKR@BPq_hl*oI=OCRP|&CRSybu*G8{#fru;nV4jz zOi7a?88XREEL2=FV-^LD<D(eHF=31>W-^&f86zyL#w#WkF;+#BGcuV>7YQ9OW-}?4 zSz^q%QIeB_bh<GaD;XGBVU;>mE}0fGmJArm!evZmWLPs9jthV~Rl^2jDqJFTz|58` z7&3HH=~QB~3|3WwWmu_(8I_rgt|})<GL~4yk}{T5<0c&eiIz%msnaT1hB78BOvPqM z%rePLn4^+I6ycUfDJKQPD#lrHE+$nl=r}Qj#Rd|~qb#`&BZ-yDNz$2-h~lkOVQQ4Y zf?0^nsT&#?6k{nJCL-a%!NlU6Qn;8*;l)dgQnF=747g(}1gx@-lLWZw#H%b0mMPN7 yEW}+n;4)<j%o5>}8G^Vmm@Hrz#bnDcafM?mj7d0UDbp*D{}*yaI8cxy^K;hM{h`wU literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0db_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0db_states.bin.z deleted file mode 100644 index c272e158b620eaef0a1a1af43bacaa8031136c9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9514 zcmeHte|QvCnr<;XvyAIJi(IaQKOoID<Fbm-IH;(Y6z;4OuQ)e4%ot*T@)rgTp$9V< zLMJ)d8F%~<phYANL{n;HA`_t3gd_w=icyjPolt@#ZPFpNrb)M?)2Zohx~r?J>U{fE z2LyNLxzGG@|G3XSd+K?ryVIx7sdK*Xd%yR4Pc{yO&aYhOd#Hi=BKO3~*QB<QBR_B* zD>!q6S^ejG7wmj<d-LPl-hFFd(a_nKaz9+EKe_FHfDA39%=mOa$2q(?Ic==)`^a1p zkFfG7X_+j}AYofCEi4$1!)U})L-K+LU~D7@dSR_ch#UdcE9Gg%%+~goMQ&4DD`<A| zD=%Afrv1`<5{ki5N0DJGfTU$_=87k2jg%7t4-|lF9Ta$_cLa~YQ`QbvI_!e&u=v6D zO@mvzB(>{7L4{VYP&m(KRgy|u(Dj?6s|MOLWzT7nAxFC*)B%rb%QjJu=v_=p9A(BM z1)xNpZM0Y+T4JmX8(A-dG7io64k^X{@WLUehI?oZ_4!-_Ve)Y}yHIsyl91tyk=7^~ zCF82RImE?vm(JtG4e8v+VeXRZ7>h{>R?!9B5t%E*vQM$unw2J@h2?c!+#|9j6wbz^ zX`N65!4;4Jo{$#N`7jY9c?5sw2n%6BB~kE06V$#Z#F93Z4T}$gO|PSsq$Xi?YvFS? z!KLb}?>MrmYLAT;<-QUiw{=P}G8B^*gOR6ZodT=7RfPe${t~#!8i;|PJbjvVoCA3W zjK$f{VmO@P9)#8NNidw;CLW0-<ujQ(Xhu_bZ3z^;3YKSez7-r#K)wxbJ8#|xp~DR; z--mM$gvLt{NnPWxgHv}%3A}M?Q2=(Zih&CV;s?Jl0_S0@=k=cQ(u=WQMfKj^KnoRh z@ck$ds1Ncg9Ht+2D4dtua*l58qqYJsEzZ-@Y#<z_@>_|l!_>}^90%C~```=O3OVH? zIpra)(;)lcUZ^vI3u#QR58x!<7r{<Btqzuz2l2~=wAh$Sb|+o>I9$N%5{wE-7p;fZ z1B98)rv(E`w>p;7wPA9eAKf4%&l<r>k$g?<qeO~X()*xl#MQ<P_Jut#`G$ia{2HG1 zLD(lJCo{}WLi2yG3T+Xw23+rxg)oI#5Z4_sQsNgLlL7b31%0p!oZzm8=^*;7;G9dF zLPvD?N+k@_={LG+V4Gzb^pfzD*~OX-_yVn~KMs=^W_G8Z9ZI^-NRV&X9@h86_nDi@ z^?)IHwvyTmaNr^;$?xOYh7&!1I}Trdj*LuUX0M}jG%EFX!4TBb`~&!MeTB+JVc143 z46}qn+cz?J`vztF(G=!HhbHvEBYE&z((*@r2pn<t=QLX{V~4F^g{cg~9NQcvb`b87 zE*<K~5Of>JbF`?m&CTuR;f3~6e?-|zLTYV~Ye9}CJr6e<WGLZyiuQL3out)0m8sBJ zpR^*}0(nx=KMk>eGK9D}EW=cktT1#(0G{h1;~`lMYG?NWyMnF}rB_R6Pn7Uoo+xe- z!yG(KN`Oxk|IbVasx2=@S@%zh)e$&@zE`&!6v{@SlicBUP$|h8#G_ec@+8c;L(s@i zT3~;a3;~;?p9jai^j>PN8QU{wRg1`)@2<2ZkM>J&JLNdhK9mrugx8077ZsP$fvA$u z&>YN7PQ%(E(c%)f6>MNR2uU~^g(T~<jCkmWAZ&tyLAZ#xwr`{ux6y(QQz__zx#>(r zRg}w$EOmIpx~DhbM2EN!poAt`l81|rszfFJHPGBt2zi^z4OkJj?AIH&q+ERp8ca%f z3_%l0Re}?lPr@*7=hNcmm^92avu#GloPE%j+9;+%<=^zfW4P-~tpoN$5xkz{V;Bvu z#W@7Yu3<-**RL-7y*XNv4Y$x~%xrH$q?QAd&k+TN9l9fFrKyQ_!rfq_zk6VmIF!Xl zXoqk?-aF3`mvna6vPbXBNp<@6c6-%GAiB%p)g(_TW!dSACkDCv{qe6=ez4pNkqzt< z;*?3u<M+|*qtKeD#HYmvPpXzE@pV|3iWO0Iml-zyXoz{x!D(|K9p=!o;R&}%jke_0 z{C#qB`9rVjymB<m*6MAnxzB&G9qMe*2l<ipcF=Z<T$S-WW||1VyCTi{1T4m2GWzBW znCle=qRuqF&5-&O1Da1G%+0u)Zac+!GuH-1`ODZfv(G$ZH<WEL@x5CiU}!>yER(6s zv48UsS-8P8L^u4h8+O92<|ba)4JQvG(#;qpL%6F0tZG3Fm#0q{EcL(x4?bU37aM8y zO=Xts3v+&j*y)Wi$q*9hP)jQ>+sjXS;LXeLudH+4U6ldyumQ3-%3k<4!!m4xIi73! z+`tFOEB2MpzQ1+YW~9D&`*w`$>-^*#`2y<Ux&b0XkumwAMuM=!$bpAxwlM>p0Kw60 z&-|-u39=JTH!<n#AIpd}fef3@xuu`VVh#lE!1%Z8hWY(wHx-8Y2WUSAiKSj|(yZ~X zglQpxk|C8CeAp2wfG@xci;FRaq(OsgPNK7q!x@@RlO*iK<em<D^iwXqlf~O9E6f4U zXktuc>tU4m5yeL#C@F`^%FDVpVkU_ln&p7r0J^$;a3JQ$KWN?G1@ZxYVZ_}Ou(s8t zwcO8gE8%5m9|#H^%CcKw_g~C2f}*%dM<w|<C@8VwSi+OADv4|@KvTJ_iA?j82B)O+ zs&GPug`JS&XSa~^u=+Hh4-K#(J}ku8KDY^P#Z4V0f^Uap@Fp3c9ByhaiLoAZpbK9< zZ<L-4PjmD0s7w2jl?fQlah6<6l*@^Ca4WqB;HFP$%Uwt<hMTt{c2wM*gtOtCo~W}E zd|gru!D|8N;tvs$NB9ij7Q>5lD)Y=3S_vZEWXBMENX1pS9ShOQ&P5nDd>2QpIeLM& zScOlckTT-tKhZh<*RQqe8^O&=QAzvXUydiAk-trHRkhKqxhA%^anta36$PsaI1_fr z^GDp!btg2O<HQdP-=mtd4b$wC<snP125G)5kDyr$OtM$)no~aEd`zI5SWa5yS$vsc zNj=Kt+sqw?%8xxJk$e)q4sBq;?3zLagtOCM!F3Gt(Z5pB;1i!fZcvCJi;4Q-xP&ev z+yBl?r4#L&&y)P%NEW6b0mhOupnjOM)5868$y8BWZb-hq1Ee&AZcm)6;q1$b4OR|~ zc5O>!%?019>$K72lmp*D;})nzS`@aL?q;Q}URFiYr9gz_PGqBF7ouqCx_Rs<QnT<P zghvkYsT514*DDXgFmF7YJ0wHYD;H#v+_+<J2000^EK|gYCYOqW;+$2wYb}_hw=^CX z6iUu$Fm_uf`wP`MGGJI&PFN~6-Z64%6_j<-cg}SLHju+$sGE&2!`xq@%f<{76%jq( z`fJd0$q)M#w!7W3SLaRkz%m0+rCG8hXf0L?x|X&nqz`c8FYJOla;4V&BTDr)+1lu` z6;6YCQ7Aqdb2E(8wak$>9wvoq7Nr?d9Wtq5zR6eyBPn`yT(HDAbrSPNHH4`&h>!@& zV4=rkQ9aI?50IBKSC-FQVs4t=W6pH~oNrMo6!sXDMLSlkI0{~!I~dFU1U@_^8?Xkx zynu#Q(y7TY&F$#EA6gVx8vVH=Z!qeHIFvWAFsoJHqpI0{cm8}LCp<Omfd02dO^^}i z&p==ctQp}8^#a{_L}!>o=&L<95>1F@WL+?(4`MYjVYQuIy&`O+);>KjL~De0YflnB zA92L>LT5mF2$Yi2j1+lT64advyh*aYjtVuT;67-)tH{Ywba_htsN#YbB0qOF=-*%% zehI~GxDhjA<Q=Sa<`iktgP1a)s6#SfxsUUiYc|{8zYk$O<?|EI!Z5GBYZ%-x#9~MB z`3qG0H-<V24~@7oh(oYor;7Fc@C!XeoGp3;H{oH;1>$0GT@J(~)GI<K7Dt>RK3%Th zHclg$PuvhRsU@@K0od?k;nJa5B3W5hjs(OO1wP;)^)7o?HL{cZt#MnPH!kc6ctE@n z&YWVs2#I16ANB&6z;^`PPUPSr^GUFk_(^^q%%iKdFTGspXGxopVp+^i*tLeb4&tsa zNG6b-DFowJhNf(@3K=GM(VO6;=>-$*SV@Bmrjwv$64S5+#^CD*ml(xJTTZ|yFp>N# z(96Nk?yRNCMximt=}T$NKx7T{KstT$l&$RhSB6TxKJi>`c_yzOYJ;+#07MsliV5~= zTQai-PKH_xE2m73mEOP{d%*|CHNH|vV4t0^mq+TeXq7&RIdLy+f63rg>p3_Y<MbvH zVIyQ%nsY6=Ik>(vxh~lCd>536x5C0xk`}!dUa!t-!suOY(a23}QBrkVKl_Kcemg+6 zI!0bg!WnTt%Wn(|4Mu$ixft&ELSdN%w&0*aUY+K{$ZZOJ-c0q(@8H9<HV?7nLU(J} z1U_$+QiWlDm`N3SeHaaKOwaDn9jXw<O<Zz7<sT11H~EkT_QSBt*bdt;pJ$r=X8(Rn zv%Dxdeu*3)2at({h}&?~$}o6DZ}ROK(%6*uM7rVKeez&mMC&=BIQu;<&2L}|mKF~s zS2Go|Z*SK;B_TBH=>%%zRAnO$(7lMC<~1x~-Gc6LyazUdZ9FU}uord(i96!)FWvf{ za1TG9{ksof5nA1Edg=vO`UnB3*<TJOaa}Th2nwlnAUWq8JTZcxc@SR0L1k?kF<G>^ z%`d(OUJdrBf9RSwu8t6mu>Cx2T|v+4`kd&<LZ?uy7l@X^@_%U^fHY0~2BMwhU_`tR zYXkSna)ud%o5BB<U`WZD^a#Cf9GX(YBJTJ`1LPr?Q9z4qMC2sriw1lh$+FXCchpt` z+C%L%DOdhr19fX~T&VrC%8A0g)sS1&ifqV%X@c$5alyM_5nY;FehEv%i*RHJH=;7h z{%`d>Y;QGe??aSA>#$78zOd^%Wc^wn`tJK<-BlyO;ChYPE>rJ@G0QSLeFwO__C7Lo zMJ_1i>kRdHCF}@sA$6%k9HO?MMoC^^92zTcf=5SOg_h=6K)INlh}+coTfb?e+KFWT z=`Hw7hE$^{!W8D2KcmgKH(2c9CwKZuH*A@K8}v#Kyzn%p!RuqJ4f$h;*Bv^aQ2rxd z{qA#r`{`JJY5_s})*=4d5M>%8diFZ+otYCo&Dka~$KKcnlVhAQMP)G>Cw)Q1A($&f z@=>`tpl8HrX?O-a6+)L;2QHM5)Rw04q`0aae<8kV%oQ|VFxr|Vaa*uHuJ7?wYl5KU zG#S2|Lrdj|XBCLr{T^tJyI|Ys=QobXYFRHu<V5i*E;JkSRQq`}S|b)osN=AzQ0uGj z3T@QiC;Ot+z#lQZeUbPpE+QSFk97t2go4rXknV|Qin_E)cN}E*1c-68&BrTWdANgd zVzu0-g(EEQ5q~6+kK;t9wme@M$xmZ_hM;Eq$OxNB|2PY>Zh>=EFdFp?kz8;thB_Lk zL0Uvti*O17^dyX634aSb!o!JGumy@laKk?ckv#ZVj~>Jz2ckt!im)Q7Zw~-ci&@X= zvMQX8Nl|jX-72ETD|ZPo1%GD}*lG+v8`g~MDK*apRfrDz%mRB<NCe)5hNG73-tno; zcd@MN!lvA+c2ykH_(wJiK{y%|imBETal8v$RZ$e0q@0VGOTM5%#OH(Wk+i)a&4vCD zc`Ya*w|2IIdj;+D#nSoWk(g9lcBf%~+1DSTficQ{mSBs(f?RfpK5`iF-U^jYIPxH( zg$MF4BH1vn^QPhF3SsjW37m$xWLzUYg1RE|OgAQ}{_3gKM&fL+-mlizi#7yt=$dz0 z%<-^M*kC+TDGSZQEqjew`?2b4Hst1b#t<bN4C%(O<2Q!VP7kEPEszTz8byG`h)W+3 zHfyjP3TU?G$=8Ewj);?7Ujr!d#j~MK@53+ibvc<s??D!HK4lw}1PD4`4iq6~FUid4 z6P+_HpX&X?aG324mdEyJo*6uRW+>;NJ;?rSAIx)ecHz)|p9`kUUIQpaeg6N9`)}^i z92t<#{=sBzQ<sd#CCYl@j>eFQTuU~q{6NfED}b1kew)aH>zM_5LevD;Eclt7BCj)M zzz;)w(k#mGqQ)n13Ny-}o*g%YMhCP(jv=nVml;e{@Iwcx1eor0u%m|6vcFZrA5CT6 zu2e`hR5sJ=V(c%~Hn4=qZiEW0{5VIs39;nn0K_SIsr};mN_)8~Q7Jnf5YnB(JuI9o zRl7&zSuhaIs^*?O5Er`WLeyctRZL!SS{OzlodVXo(9#}w<0$#9My}A5=phstMCjNJ zgI+1>QTF5lIi#Pd5ke8YIslmtR{%_?S@S+bC>H7eP)a>fTaTYqtscjcrxtxL`(BU@ z;>RfaMU}<CN+byf6m|$cqS?Pdp7p{y$P2(xAO{jhz*2ym(_AyQV;@J^8U)I#t>Wzl z0ha1QdkrcWWFDE?#&QN<r#A)Uuwrte1@koy6OkOL;wak5q)a6Nh!L|gHhu~uMm>j+ zVAeyfTc(x}i*Y^!li)<9H7_7+z2Ho1@u{wQ(UkHEDMa<KEw(}47)2)CeFimoFKxM` zCo$cyPpkR2rd%EMI$a36G@=kS0yxnGJDV-)@>;B*g|%dpR++sVsqMr{qU`h@*inVM z{xb{YL4Zz;u|dSk>#*kMbVrBfTZ(J;zdt)3BdA2AGfSGoyuq%R@(GM1(@@d5kZECC z0MAoNpHg%V(&XY-jY@J-T9%g<5>#@WeN5f&GW%R@k0F%`EVN8eDN>H*>$R-wjnAWO ztI-T2!SWAkrhbpvxmM>lLQ!}IJ}nbvV^P)*ou<6f>L))jOXhz`@-4IyLz!lw2C5x5 z`(17o_nlrY6&f4I60BU}BR^B^<Z@QJ(&OsuueYpLTUoa+PL+Fk;V!M~T#ax6;11qE z37t*0#sbr=G^d%MLXnYa*M$AD28Hh*0df9wdioBbx$LVxUaAXTGyDA?DM>j!$Um@% ziW<s8LlUGh6@NmFm;5i2h9X@xmAb!{t{&XbnfyONcTpFLZOeT^w+wN8?x>)Va2CzN z^gXeZZrF`%{OYpIcTX?>kqEy{g2eZd6Mxd!;}XrjEET0X&c*`wLi{i-%fk}KEEkYf zF2%T>-i;jo1IU5t2T_m?B&VEJkpBELR-wPcTGUF%;WD8;_6%0n<a?>XCT>d}9YU=6 zzo@dLgDuh<u>xbCQVSGr>{F6HK#cE*vn^0Ojxi*(YQowWI{SI3HL`RpL9AFYWznVP zfyEZ`t||7=Z0hO__w(c_lybWf#e2ac$m=ydxigHJB)EQY8WzLo>dK*}phaB6J?#K# zC7XZ2S%9^CM#j4J<?V-QFD+~GkV?4@dF5ZsGv%`EgtunEqaGp$<x%8%+<2Iei$*G! z6~JxX@PbuP*(li-h5XIn>L$0qVQ{}^9>X+|0oF&%(~Z07B5Izcm3JYtVO6|L;RVrs zlpH_@I#Jh^RNwKXSFw3Ir_`YmPPM`ip=ZO!Q22HfxLa1j-Om}eTsok26wWfS<M~Ul z$LHD|ux^1ahY&>YdWNd}&3=fVV(nCTmG<Zs=Ga%J1~Re>?rejf8hjhgL+-~>s|~}3 zbqG3lAmM42Bk+76Rc<mj{m#hlp89Q}hlahubF&<Xl>Yp3JauZ~Z2~vXZs5rQV!K_q z%{0E}6s6X%LR-2=oZ$EsUA<SRd06Y(7Ps0l&DQDzY(pF}Ivody!X`1vUbU-BpKw0r z^e)JJhZ|a)iAwi`KTX{4zf+5{{X5#>G##GaM`ZSIQh!gu+54ZubcXq-XANFs!%sqE z9|<Ch384Hcpvy?g%n2dF{J|Hm$Jkc415*%z{uoAehY;7jPv_9I8s*cZ(6xUhBsS@D z!h17>_#eiTWXRj=NDt#8yF!EU-q_R?X8?g01*m=>cg}P-y{LsmqzD;Ddeh(sbB>CW z0km{>UimqaI>nLjP(jp%U@E<u9VXfhpEn$pAkboJ?^g-{s4K03ECap?^zqq86I?&- ztr0FI#zF+8m5&tYe`GWHIAV1-Y24w<M+@d)6<|{T&BpC}E5#uF4QSDuHQyxW*O7#z zSyQMOWpDgz(6i#E2AS+ELs5%0*#lt?!aRlD+73m?wYNGq$*|9qR8A~}Wex2`d2V@8 zy2QQ6Ndvdh9G=J<gU(4zyQ40xWzYu$5r=Nr+f$_}TcFiZcZy!UNl=K3OlEFa1W1}& z&10`R^VkbnRJHYiSLoT&!}|Rdm{WvAwK><@V7<{Wh<CSU5YvvW8=*xN)&%({;HNtz z4VCD+lW1r;OE(#&nND`Dr#2a!{_3=rLwI%*0^<cj7r&w|jYj!yr?`R+g;A9`sNU#* z8SG<hEuaE$SuwE|qZIaQ^wsLQG)}O-Iibxt1XoUR7C7p8lzq5;s@P^^kTPy}3|@Cz zLaKMZD3nk+n%IQmE}ElHwVI;)*3SYY1Nzp|{9ONhK}VN2;FnQcFv^b!>uU83qEa2m zn{Xqnqwr%qhRXKGg$<Z8An=x;!Kdbt+-2W={6X-k*A#mU^MgAyO*jt0ps8SZBFYz9 zv=>TFp@5o3QlaB(fISH>%(vm$TL^xKCrW&=sePsb@e<_7WQ%6P58rfE_%#K6Gwi>3 zg$5rjzqo#J4IECQU=@-4z={@lic_{?u@B-*tk{}EWU1%^elD%uL7L6-H--i}fhEad zC<Z5DHAXxRh7C1{)6FzbcgO2mgv4txDVbtfNFNrS(Ycp!*PpqBl01gd6VNyW1-w~> zbii``?kgvN<|q}>7dXr<eeCy`7jA`q_<Tb}QbyXc4W2|&V)j6q;D;WvAj^=$<@p{V z;nXvlM$XV`$kJ=ym6Cs(>U8Dy!SM#YG&4GJ(gcD0=P<!uZ58)F1lzqfjcXsDGOEtT zxbB2E6&C+N0=;YjEMt-S*p4P9GjA8rIbSB(DEA4J1cgKaTp*}{3fb3^n>D`8vGaY7 zuB{NQSw!>S6_miW@OpJteCJtS#cPcZt&<5CRoxBbant}P@R5G_K@4j7Jdzn6Cabj^ zJ3Z@bYyoew9i+b2D{^#!_w_<UE&C2Wq;GOTW&_<-<THV<C14oxB<7~l|JI}btLV|+ z@t^<np<>rOx5wj)8`6JJF@@&R{g8I3fy)0M9IO7P$G-Z9ipJCe`jnY%-#s^eaRkq( ln}1b0(bYV}oy=5B%Y`ZUPa{(!rUo*3K_i(wGd^kOzXQ?bkPQF; diff --git a/client/resources/hardnested_tables/bitflip_0_0dd_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0dd_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..2d2e1970706f031b6d3402a49d506a482bc3fc07 GIT binary patch literal 1792 zcmV+b2mkm&T4*^jL0KkKSr+e4tN<5A|NsA0etZ#8Fw_@ea4}E-7hs0g1OO30fCQEx z00I<IU3uUP-v9sr00+<j00000000AqhD|gy$k5XxAjrtj$P7&xGy#(%5XTJ+nrLZ} zp{7Pbk&&U07@9I@113fxjv5&>(9<JBOpJpgBSRoDG-S{QOpHSuG%{(SrbdRD83sm1 zhCpIy$)F6G7={w1007Vc00000XaE2J0ZB;^niE4IQ~gYo@M#g@C+eF)KT2fNPt_ST z*$hmcr2Bu|p(=j-iuEp(em58K4>kDL#J-0U<$u9@OU)-sq{9yvnVE~^98Nt8(!WUm z(Cl8Pq`f8JyDub}<gf5B?BV_6jyharaO22$Av_s-%q}sPba{+kqv2i5aean9;GQG8 z!{$}NmHtcYUt;=~xpx!#iz@nuwVs0~)_>vkyPbz}#p_%=Un?#T{g<$MmL9>!-W?7f zz(0V)?hY<9`$yV86W9l_dxiSR@SbON`4$!L6YvjlV)+X%GI<QIC6AC{(&56%eChe! zBe=<COWL1&J|Xg}-2Ua@JW-1e?0l>HofYn8J^_zoqosT=B<y>aVV>3UjIy1<;xT1~ zkHlEKkn}vCBNK~*i!4@8F@w-uJe+5>(DWUgN%9`oi=)NhaX9x5JXc`zJRjbB-UpI+ z58Qn0`G>$iX!1V8`W|WPVLfXcSs9ByGojO>_AGIk?qxeL>4PlHA3^RozNh*>#rub~ z=^hD&E6sVhPbWtbd&B1=idZrn4*~c`%=!nsaPb~1CLHWM70ft12N~0`VbEqcTwr*e zIDV%S^Nu=ndA&#IKa_V~wtgY#AND#^%+LG30rZ^@Q1!nM_#AY;6V~GF$7kpn#yhSa zA?ag0TpU~+EO{N*@C<wl^empm{>R#SkG}sikA<J8>0>9c>>k4}je6JXJxBPSv+=6& zc^Lf9+WoK6`JaIBSJu9_6VS)Rd!D8l^^aNR$E@S@9UoBtn#1$Haniq;J1hMkmF!sd zJ%@GZUpnz$6Wm{vuga>wAyzCUk5cwM1I&ICi|SXoU(`RKaPU4=(ef|pU(9_cxcuwh zxV^*XV={lq@w49H`wwZ+{HLhyzLVH_4ukU-ydI@5>{wFboLo}iCGwBByR7WY`>xBy zj+bSadf4vE^#5;ns5_49_8(&Gc23FZ525zEo})jk2O=Ga?jZO`5nLIFkU$89VKE5; zXV4N5Z6Eo4u0Lb&zVghUb#e5aI(yDN3#S*xeFk3wWd29pcpO(3;XZZqr^J5|>QB1A zjXp*3zmY@YPpM@3Pt<)6xcHv4+L-pMj*0AC9+bLRvD3{vkKF8cKaGAvB>ak_^%r8x zEFa`DWri47V#0J>6BZ@JIALONSmAJF!!cMd@OTt>A7RAl;85Vo24FiG1N4|yV#Q*f zM~QICzVfeP6v=c)bHEo8Tx7Cg;JYSL@J<$90(t`OQIeS|zj&P};bfgBiGz%z$W-iB z6B4e);yVt+?o)#X8Cb?Us&`pTvNGtpE|u6kRg1FeS!YR$?~?4qjCdsAE)k0+1h|p@ zYbeH6GE8NdvErVQpXykqC5m<wo(iKK%NZOBbgt%Kyu!l6vaaG{leuuLkvNm{BC1|W zx@83M7tmREVKBnQ>~J$CFv!CzgN5*?Lk0|CaITn_fUg9^@e*7dJQtHOWkrTeG6#}* zJFYCTixjxbW?U?HIvh{hs6TR-0`7u5l1sn~h-DSU1(*`xiejO_I2iv_cq!nrvYtbS z7CkP92L}_2rIsccjO<eMjAXpWnw>A+Fw4Mj;^J_Z85x+&;Nal!GP+z@V(HN`!v;nS zR!p23Tv=vb3b-!nbXe(^99&&GOtQ(B4l0+KL(-J)spL+B$R0)5c%CE3FzM07bnH%x zg3A%<RpO)23E+!>;$4peh3Gq-#nEtiE5$o1?1y4-v&G$A*I@2UGOpu`h{eM=xS2R! z1ITteyN=}XaoDkjJ3A#y_+pj*!c?Ows#Ep-swx%50;&Gtm6eRfOp+v@B19~NgmG3S zD7YlNiX`Z<A;l7LVx?t-mk@?T7YveI6me0Ivw&GxL5!fdpm8jeGMsR@GAj&60W2zF zD!9OB2ymDKBB8-93`|!F91|rnEUA%VVsS-_fx#>i;<zp<;Bi<mV&aSzW?6#FhEy<^ zWm&~x97U2aGGNJ*Dwt&)ETzKAs~Hm+RIsw9EJ}<qD=Q(zi;0&NoK=yO!xj+4$gyOM zU<|BIEaKw_6EeuiD-5h<SuD6^mMFL}7Fe>x#g$mH7BW*YmO~~6Oj20EEHJBv3gBUk ilQ_5ogCT{B7*-f#3QRF6j9JJ3#oUoj6eI<^)9V1_Kwu^S literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0dd_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0dd_states.bin.z deleted file mode 100644 index 6247d26df1c6a885ac0c8b9c00b2a4a2012987cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11481 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 Suvl>f<{p3vu3tTO{NDi+=06|+ diff --git a/client/resources/hardnested_tables/bitflip_0_0df_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0df_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..14ca3fcdae9965c792aaddef798e1defde36cdb3 GIT binary patch literal 1084 zcmV-C1jGA6T4*^jL0KkKSqKOQHvj|C|Nr~dZIgjF0hC1<0GR*~02l%pK@b5D0RVs) z5SW@7$+_SL{{R3000000b4-keOc2q8!5V1Mh#F+bzyL#<WMnd6hKwc%(?*Oy(<Vj$ z0vyvLA(I3&VK7FTG-3vsGB5xT=9w7`m?5JHf;7>i5H!h=fB=Uy$jD^D4H!%jri~bZ zrc8_g1PV%$XcI$1F*GUqPf~d_)NM@3lr~c*iRzj^Q`Dd0gsa_<N5tz_`M<l7^Pa@! zJm>XuJ*>{Q9gf4w`j6Usj)ng3+~M`TXS{lcgyz2R@;>$CWc_Ccd#L8Hye#oA5togA zwd_2{^d5kCPo>=K9wsx=GlpTAJJ0A|W4+{Nc^?Yl?{H(#yBB%hor~!`ZnfZDCrIjE zk=nc`h0Nr+oH;Y#dP$ip7tm!tYm#s*GO>YlJp%I{XIb#S2jb@ZT}!Rn%)N&Lg7ZBN z<AamzaP=NF`<LLpMbhp&hhlz*A;IQ(oyL6+3oZ^1D}&%Tc+N`h9i}ndcDqg-jF__I zVc=cP^Q^y<f!aK${0y$~{)+otJ6C{s!w<Q2zUOMb$9nmfc=()`35Gn!sQrR)y==_v zGUy&Rp_k}==h|{SraoiRa9oT!&j4^;rOom^PKT`SUrN6r-Z`tOSs3|FOZty$`&SFZ zuWQVHZuR_+dGIcz{0_s$|EGvg$zZ)J(#!5Lztx%4bSKK@%P{C%GtOrxv1gI;I6qOy zICvAtJPzX?wfq;#pIUHxm;XAE+MRD<^Bs@5(z}^mN%=WEK*`v=>lr6A+P`6$$-sL| z7g6XO&a*6J;JQ{_W(y4AWawGaW-$9q$l&S|k(?$jld#81Wh^?C!AG1<z~s8tSw>w8 z3C%bZ>I2T^<oJ#qZWlqxW<I6rGdfOB3eG{?={nf;Jl~&l-sW|u;^6<+&~>i!=Us=& zI+uF)xHw-K<6pqx{NH2NdX?xeKzc#(oQ!3R@uxLDGn!nA{$uK2ncTm#n)qK}{?DD~ zf02{aJJ$<5OZ76ni;>W9GH~*)hl`~>E;$ax)H;V!c!9}gE{8&Nj)UttuhH7<Ii3;0 z%<NsqYru6q@136KS#&PJ(sCXLiOtQ(X9^d)5-DHZRHbSj{Q{$<WK$Sriz^8kWK<LU z6q!s^$&!q*Qx!m*D8i9em3<hTl`OFgOeGj#urRQ&sLL{7S&0lX8H$WqP|21|O2$IS z#Tcd&D=IM=QzXb(mIF%37Kk!sj8i5|%o%}_!psazt0{`uri!f5EJlS4%(BdeR*Z(I ztg^E$iKUTDv00U5WKzZjlLdwhOp;?OETm=`VMZA#lN7@tSjvMKD#IYm7|B*KEHJT^ zj3mj4WtEdEOqhtwN@E3PRItf0ip(XJRZPTLfMydgs$&K)Q!-0G{9VZu;X*(lAQ;@I C4H9$! literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0df_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0df_states.bin.z deleted file mode 100644 index 63e00d2cdcf5dce49a85bcecfa75a5b769c2387d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5873 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0e4_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0e4_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..19e2e610954730e1a68fa2bd2b7b9b9654836a3a GIT binary patch literal 2793 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 T$rJkjeyxfbudP-^WRLz2>3zCH literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0e4_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0e4_states.bin.z deleted file mode 100644 index 5b4d867fde64f88690e6b1327262935a29e2a058..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20539 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 Y1|Kto=}=Ug9*st20IvFW@>jq4-(XHB)&Kwi diff --git a/client/resources/hardnested_tables/bitflip_0_0ec_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0ec_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..f376b1cd1fdac31d18ee94d299076478d10a453c GIT binary patch literal 1145 zcmYk*UrZBs0KoApr7c{~N$I}}D>@ZgptpKQe5kA@S_BnpLH?dgvAv&rz_&gS5H{-7 zS}3K{$sjVv_!9&NcG%lfb(r;jcPAt+8AfBw;zL0m8mD5Ix_?o(r)A&g&+FIuar<8C zz;Scq@nb!2nvwX2Z=XLYTR8JwMFc^&Was4|S!fQ4u(E7qKZ2#v3FN=zvgsX@P&Qf6 zj$q1IUnob(o|;6+g7O0Fg96zsi=^6@+ex-vc^Ua1%^Dgynz!fchCSt5-aq&XAHVD> zH5sxKV9EzenHsLFak-jsH8a4SPl8p{?=fRu_i6{4xu)a6RkSh)XY(X$z6a$z`4=+H z4JnIys!c~(oL4u{rbGA8#*`P~`x6eqsI*1>3DbKzCh{gr{7f<6UH{{f`~_k8VzG|^ zw{1#06?61gE>HNb%bFc39~0)&-qEB<vl91qcNsy(MLkUH+b^g$Rm&6Ion_Cd-Sv)| zRb$+<`~KBjxP(gKyB!`|$jJK7!yhzHR89%P=WR>!8=#YNC>~`p5|lQGPU`MMf6vd) zPQP?NMwv(cvBEoR0mZMj$O|eY>mz6;(mk}=yY(V`-7iicFSfV8?*DeNQnmPcg1OrY z1l8h+PkQ7k_2eq_kL~`d2fbb|e^48Grl)ONHEVUpKxRC+W<*Z2UDoV6O<hv0h~C67 zk`|OY5txdgANsF!k5sN#%3>uv8S{<H+>ak@vn1Q1>07}I@iXO1$(tYPHn%~}QG2#2 zvv7OYpM`?xlh(H%PxtoU|1|Uq)uZjl{M=K=9j=gl+7=RL2Eyl4em+BAn!LaQ_%b&l z$WcBD=mcp?i&CVcD&x-YBs?Td{jT0HTjKsPwX(=#E}AXw1@A&(>l-68Xk;_q@^5mx zP`5Y&gJ%UThcyWLfDbZ(18;?O?^Jrn8b0!yvS_nVtKS#waLch)b?BTZow<j@g+9U? z;W|~$KsYd+{IOBIUfxv%INTw@MEAJrm1AioVEJj&xVY{6^!Oo*Vh)_d2<E9JMfO&m z=LOvEJ*B&qJ-2>X963kMC+5PfK1^emMH^0}YwWE~o@ptKjykz&y$?zhMI8iSo&kbB zJU~-T6*)$yej`16=-K4Z#lQ2>zj9i1*U-7hOt@;GWtX9JP^$=KfdoY+z$ndu7OPr` z$Bu-7tGbM2d?^voTs2Wm)EcZfoq`&1UQ;*Fl*_lF&Ft(>7jaU@fG@XL^-k!6^Uyb| z%##LDaWv)xe61GcQ^QG<0mBUhiF3u_lLmq?|NFwuOWD&bex$E#P>XVyeoz)>d<5;n zn;4=P%taG?Fy?Y$fRE8QDQr(x=#6MaDTtTa6@^u8x$fxbG)7eFc-Vn{UZ2#F>5D`O z)HCOHnNXMQEX7KxVQA8%fJilJr>a(5)+3~0#+DB}M#akB$SU7))Kx>cTFk{}ilDDZ pLA$|D$MFG%oM-wdx2g)x2w{E&#&JdH-QbO#V<m@6ZUyGqe*n(j(trQ} literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0ec_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0ec_states.bin.z deleted file mode 100644 index 764188911c224273136b0a21c9964cd9895dac34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13972 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0f1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0f1_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b263afc60d64c784d8f33710139047f9bba33d80 GIT binary patch literal 13180 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0f1_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0f1_states.bin.z deleted file mode 100644 index 9740a1a39..000000000 --- a/client/resources/hardnested_tables/bitflip_0_0f1_states.bin.z +++ /dev/null @@ -1,28 +0,0 @@ -xѱ,W)$.!6r*p )%̞\~ #ۙ=Y B ! M<^8ò-y}_{߿ݦy}ÿoy{w44{ϻwơq?}ƭ-lpC߃sx<^q4ӼmTeoߺyyv?<?o^qض%Qe9/qض=%/߲ϟOe9)_TeiG俞h-cWͿ\OE߶7\WZ/S+ze"^|ߘ'O_$>)~/&agJ /???O}[s?__>_3G-?^^{ݶqe9/㿞o?^im}÷=^m}w [_j~JޗesNiGz]j?;_u.H_gu\Ak_zYJn=?%uOXlI)ߗG#_IIuo_m|fc?krG-_ПgY`~z{׃O}?o3xm=|0['KYi??O[E#??J?5?_GۺO?_;|o7ykwo"q?a8Co;O~[/zG?t|jƿJr[̿f=?_?!?]Su#]92{?X%יYהam_kuC+5_I?-W 9vROrӿG%/Mu+?6՝߯׻$_9<={㟭ooOC?Dk_co8<8,,Ӽ,<x-,>xM8,6<<8,,Ӽ,<><Os^wn0?{8^qm/Jɿ/?פvë/]Re? Ͼ}JRCz׿v?Omjoc??-{o=?s۾aOZ?BOw/O-K*fߑĿS?cП#c/'wֿ-%.߶ov!8ſ߽?^'wʿ^W߷ϭ??uk=__R/a,?{x߷o}<|U/'ݽ?^-??Oݏ-?[?ǫ?M5R_Ϳ/Hj=+m?5e?:S_\c]QWN7^/m? ,vu}i.J+{ZKq=;+ ?ן*_×Zѿvo_u_:޽߷[u/_Z忬[{^J^3kKG!{yNGGo?cMHs>~RI׃/-s?N>>-uu|OGc-oY'my~?I?5?[ѰKg-O_gUM]_'?u?Rk5=OOkXƗnw/m=~gsO?/)W/uyg^)~8UJf7;{/;rCk~>5v7{Uq_[/?e=p>5׿v_t_?_FnZ.scC'N;Ŀ/Y'?,"Owvύ_si:{zԜt5;>]DZKyԲ=G{O?Vu.?_M/w_-~3~__'a{i~~j)kӼ<ך<k֟{:;#ֿO,V>Qc}ӦwECmIG]aK󟶬-EC;pkUFiKJtuwt8[u]Gjag?y_vmSo_ iGOwqYBci=&NgM?Zz_\c]QcN?<Ɵ?gM/_?jΗ=Wp?V'?_?XG;vߦsϏKv|IXg>_:˽rχע[]-v{wkw[eRCu}w_չo1ǟn_?p<4?[%]_xϟ~]Xc]ץwM_.u?\wo yosGϓ`Z5w쯎t5Ϻ϶6՝9%OUqZz8k5㟭vm4ͭ?/ZkZז?~_oH;~'_bç/;?CIt8.~O?)99Οov<=}l_Y~2/??__?v_76/p{DZ;×ߤ/?/G)BuYdǡ-eiuls./7t>{\wCs_?sWZOH{cw=[? M GG?|_Q'?Aq'lnm{ί<`O?׿r}sדWuO~.mT[q2=%@Cokο9ڏ/ٻvg)~RtZe+g^?>_G[wC!y߷<=jzoQqrcG>NMOk?ogsϾ}?Ϳ~ymKףE[_?i3s,K~zt/矮g6u민g["o'C_.m=+:P]???mG 8~}W$6-Km_\i;oww{Y???Ka!Io7+RI?IQiYg6gEg'v?߶g%__۫[C?o5??-ʍo?+I|ǯ C{wo_οՊs2efWW7hOy,?]Y#/[?~w~JO?o{3nv>+Y_=_ʿ+]?9x~nY_?[/F>ӯߺ˟?[/_nK?Ϻ?V?m]GOo)[I?/ߵ?˳kN=kןч_a]4o}my ?|_s+GOhcY>5)y'Ưgӏר?!ak=KJ?Wtuwߢmӕ-????'OoDzwo8q{oG帿~:z?}cRq_BW;צ_/eϾ=OczZO>j2'?[a~^~g??'MoSnYڮq8e>_?>ی_c_?:|C''?stO>;cyw9y\w>{}[q3 -~<~߫ Zqu=>ߎ+o_'K)|Mei ?㟟OM/?8qh*t~wmw߯g_)qq{\3eO*o]sst^js=Y>+/}lK_o+Um>[g,j?dOkߴVO?g{ϑ5[{Y:㯎ߥog[CنOmW'n?;_%\?Fr#-j';WS\#O+Z쟚WyyyqX}yyzޟqXkaYniii^}aYqii~ޟii^}}]{߇/?OÇ__j⯝ -u9[~+KW?kןw*QKbcCߺ'cw}'?s??-_y|߮/vnS?Z_EF_w?Mouu۾w?2ޥci9+9k_jGoH7?]nOsO]'?}-+Oc+}~$O-+|ړ4O_>%ewk?;M{o)۵ïT){'?hGmϚ׼??^u}?YoJƿ~?}*?v}o韚}G]o_???җ?-O -J:Rj}zO{? ߺ׭?=??e??6z#s>3?__A}o?=|/2~>O`;g?C6aq߶E-m?׏W/v6_y_e )Y~6wo9O]W՟k!?:~K5Kzsi[fN>ݻn=?/{?.~}_R^\>CK㿥W_g\;~>]^|#߷ǹogs߂ownso/8x|mos[o]yo -7Rk%޼~ΧJ ?#絑[˜m6?ӎ'xUw~Y{s_}nO[%?zԜt5;>]DZK쿑??]ٵI__￀?__[K4feO՗KM_ -6?Ӽm_' /j?[^;nJ?5GòC?Kc}ӦwECmk>_GW?SԮb^QzT:֟_cce?mon~ֿeߑ_o]qӶ?vg?Y??Ϯ߶O|3[?}om=uǫqضjn߻u<q8?_'9eG{|}nMfGX~unnr/la�o3z?eiٿql?AG[;cyw~s]˯ځEN)qh ?]~7>v{X}b=§ ~89L>ה[W>[8lۧ9\?sq=?_?!?ە?_?+>q%ǂ//o^ۭgZ?? OiԿJ8zϞ-=,i{<['϶~%ON/Cg}qhu#l={}UgV%_M/ii^}aYeei~ޟkYeyޟqXkaYniii^}aYeei~ޟii^}}P쿳ϓ—|s=;O?s#Kz3>@_<^)9sJ-u._܃O{?~ymoO K_s֟2_?_Ouao{OӾ_ƿg_?J{_qd(Q?\y/yK_RKKӖ?X{XK=~ӟwU?n^x[+?*[Ϻ}?vR/t=? GGMwtOaOkqsxkۧ9lmx_=Ư_k^y۾~tǫ,pL4oTUGխOv#aYk]?Yvmio"6|??_JT?6㯻5=n[g9ߥskEnʿ"~_n,O?n:go_Jr_6R5oy:?.8N?H?cO#꿃?S/SߟJ>em ՟߫ gڮZ[I5Zο m_L_O6濼ןg[vR?Y׶w_Wsߢ/?e=p>5׿6#v]_OO.[Ɵ??6xx>sIׄ/h?s&[sOs8XM#`?K\7[+5;H?R%$_I?mu߶?߶'϶7ͭj!?oO%,O+_{ o_~s7�ׄrs׿4e\0?Aq_wW;_uカk{s?=qضPdznߛV{}_o_[ϏK?7K~^w?-Kx3-뿔T_׆o~~JseibϾSq?ÿ~Oqض?__[_<r<=7VZ?_RGn-agJ?�'/?h~Uq_??o?s^+?ۣĿD֟W~NYT[·>6ֿ~xs/GO_f_?H/YG~K% -g?-kkL?}_oo'>^ߑ-?�}dž_m7e /Kh?\1,tϿ>_^>}/{LI}??]φ_?խ/'W??sGu#?| [n0g7w?򯗳_۟u?- {^ug8\}7-y)W<~߾.OwߛR_~ ??5_-?lq8_&UmWn~k?}~_z_e?οϝKm/?}lKvk?oG:cW'_~]ڥ?M/59ރ~ߣϒOu.+?6|lJ?q3*q7__o)Uo?j_bb˿u3Ӽ,8ò<0<?4?^ò<^<wM4O4O<04O4OO4O<?Ӝ]-w~/=.K?RsS&^c-_[s_IK,8'C{]Ͻ9_3?G/Y??G~c?Zh%7}//t_ju w>_*?<wq>3׫?wڭ<.m=o| _O%5)O/Xak-k7/,#o=-ܟmy!_&{AM=ҟYR4v{Rv?OGc^zO*zO^?c:x{϶~mK?n_ܗ㕂?ƿ_yO?r?}ȿYW󮎿T߯[vx>v?~oSY4wKi>7#Y_(;䯴}~sO^~swE_:KXiӿf_{i?$_F9s*gk/e/szG4~N\u _jE}x~n_eTi]ӗoy)?x-Cv9W??6z#Iyv'__5￴?;]/?/[ۿgq_?C_qdCe_rK$zToG/?u-?U7;wy~?ױ_H?_??#zc_ݽRE?9o_!1}>:xu뿧oUa+):[ߺ앷[h܃[.=??1=}[[CqWAJmۛx\o?~^im?C;:O\e=賴T_w>y??7~-w?Ss 3俺_Jw5kj/Sk?Yak-5??:i! C-R¯O4o_kI{Z94Ö׿6[?5GòC?ZODoO~u;a%jwS?[/ڲ^gU/+u_Ggߑ_o]qӶ?vg??_g-?+O}7?ߥe 폥_k;7m?k՚~swEI::m6k濼`ߺ_9_$m?_G[ş#?v?o#zcoݻn=?/{6Z$a3K|Ï/=_mkwi4v ߵ;=ߵoſJoWksC_=/?hRw\:vZo_×t}K_=>vau_~5??~C׶?j÷8^s--!罕GֿJiB?OӃ_?kqYmJ߱:g??ogUwp?W_qhu׌Wڵ:4OvDk_?k][}?e#]{߇?Þ|ÿoІ&?}o~?/;2[ǟGw?ڥܫ_I寗q{(ee#{ߒ-c.Yq\t\:fUw _<G߷sl esYỔۛqkkmWoNϝ?_i?5#oo_m_oY?H/4/_[>E =пﳳ|=}!{:^zvrUK?\_}̿^Ε^׿6_O]}?zG/K(?Y׆Rn+_?/~\�?עJ;[_j?~dIk95Sxz!^~Im¿~ߙ?~ ?|/??7OɿϿEWwoGjag?;_?7/?⯭e/}>~yR߻\7絁/_ϿO?X!okѲ/=r??W,_֭/m?l5O~tO?XBEv2[/_I]m#__c/K?/V3_ö}Ksrk??sfe?}eY.<$߬K?R'$Ge9W/ۆOm~igOuoo?Rk-?W+7=oGПru&%Ο 6|{Q~u:W+=Sk矖Ç__=to;qeSזo~:q?+_ -?韖_ˎ?ϸLOdI*m_+v}?|g}/Po]<O~Gזys/l~ӿ/)O/o?_YOv??Oo'l[~tV*XG'߲/ʯ2߮:a]Fu5=~ɯ>mǣ;o{gwCkO?_Cѿ/)4^-_GgߑWOWc|G[Gm_?mw߽!_Rq>9|}Kkwqض __:_~}>^</jI?#~o]my\7sMeixelo3z?mcqco!??a]?,=sߵ$m})}:3k-vnZRs;x}] -r7/6-~j>54[pơMzߍö}wL~R[{wRqKϔ>5̿u:yCeKϏ?qK/u/?V?M#lmD/?ծm[RO ??D?G~oqgIg'댿:~ҿ?mg>_%矸|_~?s8HߪWu|^MsC?Dkj_:ni^}aYqii~ޟkyaYieݦyyyYqeyayyާyyYqxޟiV^qw|G߻k?m)OO_~_t^1w]-u9l/|WjҿW֓spy]ߣvmcG_1~{-RQ:/_w\w/?u8U{?_Ϳ6IӞ>O_Dm'?,?_ٵIO?A?O_<K/cV&GO[O;K\=_;ma'#CCq{nO''?o[R??迏z~g[?ҿRS_i/X~JJoߏ9kC>,yyW_*}O߭t{Z -~\t?[~WWyg?k;}_/{WھYj_u~/?C_do]o_3s_??K/Y\9|W3Η9=q{w#W~s]?'?U:/߾t{o2_翴.uYtfזC;+Ko=}<X;/_Z~.||[v-3?![߲O?Y/%j=*ϿaZ:?Ϫ՝ܻ<IO//j{Q;v]4O_>Z/_r,~z?o-o]w-_w.˵Cn{۫Rο[nK -N{?3{~_)ۦ??X0'[??/{>ٯ/ })DQJK>?O"]Ox|iW -?Zwۧ/??|j7~WlYvu/?SSS{O_>zO^{_'z]J?)カO{Z-kmw)5=o'z&j.?[_*ڭvm=s??GC蟮?ׯտӄ_R"W?Ͽ/?yjgWG1_c?ߙb_?R?ֿx<I_G]}-??]rco:mckm?;}"9,K}YK~wN=Kkwqض __:_~}>^</jI?#~o]ž~X(E&sNbYڮq8w=_?>ی_c_?:|C''?stO>;cyw9y\w>{}[q3 -~<~߫ Zqu=>ߎ+o_'K)|Mei ?㟟OM/?8qh*t~wmw߯g_)qq{\3eO*o]sst^js=Y>+/}lK_o+Um>[g,j?dOkߴVO?g{ϑ5[{Y:㯎ߥog[CنOmW'n?;_%\?Fr#-j';WS\#O+Z쟚WyyyqX}yyzޟqXkaYniii^}aYqii~ޟii^}}??bˇ\z?ά>{P_}sr?=~ K>n Rt'i ??_Sk_??Mq|b=~ڭبi=/>~323_Ǐy☷HZ_*q=Q{~-|?֯_#ſ?矜,?֟Z?'}Oo߮n]Tjj_??I?=~mrg]}ekvw1~ۥ¯knk;^9d/c}ߑW_׃:n}yO|=_m/_z}+_?~Lx?ע~k翺~o{Kk{J9>myۛ<~2xCO??nG/)4^-_GgߑWOWc?SCS3*e?՟= ~e;<)SvWw0t|/'O_7{?޿}??]ϭO׿[_??Gv?CجCk?[_չο&[{󒂓C!hXBEv2[ɸlz֎$ _ю:}\__#g=_q?V$oܿu???ۥ?lGXzk×?mOZIzN43mu?g_O??ujնi?RkROh_SӲ_*{?)__�𷍿\{ϸ,s۷9oo{_LJiۧyx?^o7˲uO4o~\x.?矽mώ/q)4ö=Y/YhxtZ~.˱M=r/K;#?Goy?rk{//߿<~iT_Z#]_ƿ{׳/_n?%"}?"iOHӆ/=GO5g?V_m/_?? ѿds*G8#y?m?Wv۶'W_Rq븿^_ڿe9W|KR8Y+ҿ'[-gc vg>;?[_ -tQW_o]qW'?c\QKߣ?goe?g=-ؿs)?ퟞuǫCn?^m?_?LgϭO?O?Ws?C??a?-ߍߴ~s]|;B{)?m[sN!ꓼ_s/?Kƿ>e_<<|5)??뿇ڥR{\Yo/}H?)ù_ԢCky?<Hym_v? uw5??~C״?np<?yyet|RO UݿơӃoqgIg'Kߊ϶?_u.r:|?ssw?C_g۫[:4O+Zk=[?N4O<0/4/4O?^x-ò<^<wM4O4O<0/4/4OO4O<?Ӝ]-3w~/=.KRs/u?5鯝Kso?ogg'/=RP_]?t_?_&ſZ?;cw[?sGu߶s?o??~D??o1?PcӪKS ?7w?FG???'? /Ki˿'k#?$o??v5w/ϭɝW'?}9sOjag?ZϯlG{_~j ?_?}O)^~?^)9sa1ut#C߇[%?}=K/zɿnwWKOn?5*ϱG~ ?s?5sOJ?O wO?~%gz<XWklku6k濼nןg[GB)e; z>RʞƽR??n{JaWV]Ww_u_K_n7}/?𞗒ڒ?o)ac?o?ҟk_K?yϿӅa{srn;{f=9pz?5AK??[g~ %^qĿOROO4RYKSrY?{?!?O_?C?_MOSӚ=7=ݻn=?/{?.\$aK{CCW_{?-_溒⯙ e^y=ξ߷?oM~nKϭyY'>O]F/]W絑[˜m6?ӎ'K_s>KH5ss\^c|?5<#M;dWv??R?,GOGOUgݾ??"_ 㯹k̟?ע,I^_/5Z)4o?O}.4</瞳N8l_{kȿnS{$?,?m3GUO_&Xg}]Gk_>A_Rv?Cm-j?Zտ{ZR_o'u]'5?mqsmfc?^j)uۗ~k7]j\X ӟ?Yw:^z<XWt~oٶiӿf?mzeOf/?sU!??ao=7=NݽRoE?9Yϗ<xr|Ko]s]YTP|]]~8vu[̿f=8gjc_i'=?7ϥ?m.Ezy5|IWtu<=i?Xug}]Sc?Km6|_C+5;[?m!?=%Mu߶cy&MG?_uiIܾnVg]}?Ms+kK_5ֵ[<ο>}i8ɗi9mk?:__}C~-u9[~s{]:Ͻiϟ}_z9Wֿ_6??G-?͵K91pqcƎ_e%7KOj/}};P]:qh YZ-?K)Kͭy)׿v6]}v?y?S?:Xfu?ag9DkqBSOW߀I|{?n>;7a߮8?kߺ/Xte\ukߪmӯu~z}~m/_ܿ _ECI2C-o~KY/_ch<Ytі)?ව2sq-mϟ/[z}Gc|SCSS)7[rpY}g'/u{^qRzeyO̿v>-K//ߺ'srYMle+#|ۭIPf_K_iC/_D'o-o=e9t>?Mei ?o?s8l4?W.wGZz~[s?l]&^?Eҟ?zCқʻ#iOw}Zck/zY"]?mmI뗶9W'?_jV#O۲~}OO?rۣ6O+_Jyi_)߀kÇпW/}?5~oYvi9|诙U?qOî_>o;>mko}'S_i^/9[ݯϴJ_׆o -mOw<޽߷[1~֗eu㿑n/wDm??-k79Kr/=GOynU_;OzDkCӟq[ֽҏ˦?EGgwu?'ߪ?-*j?ogWX, [_j^W}<7y@gk?fY#5?{XgO_O'u]w(8itoGjag?_>?Ϯ߶O?,aNQe9/㿞wا~ܿF~m{KeX2{?LI~qض_Yn_}?Կ[ooYơ϶|6c׶?z?;G#?7;naX{~~no<]O~~߷ n|=V\by!ơ_?/?ߥI.7{R -kYSSK㿥{<okĿJ>_8lkxWwz{ -~\.=!~/=o׿LYS[;ڜ?t_9D_sR["`gC?O?S7m.ii8GsMw){<[gUrΟ)W3?Dz8K{_>WH?J^ieyayiiyz}qXmyyyqX}yy}yyyo;~Kϧ?פvk߂oi߭JyU/O{ge#{ߒ-c.X#"_?sGwFos'??;?%_} ]_ԶW׮C'oS[nga̿wXN;Jv{?n7c~[SvSW'?O_{}KJ?u_J}I|J',?? ׆/Cuu8'-iob?okNӞ[ -?ovm??_ -?%Q5/Ϗ׶}xO}[yR6=7G42'/]_A?y?moe,m_ym϶xO_%s58GKo忒οZOj·.un_oY?cMܟLO׿~'_:1[pEO,v~˯5vxϓ??؎goO}ؿ-agC?l?c˿]GiWfoGo]["?og;l:O'G!RGZGkOvߦsϏKv|߾?e×+??:<χ_oi2?΁Oq+)Y!G:[ߺ읷[h܃[.=??1=}[[C[W}ۯߍ 7/߇R/_sϺ?dGymV2??MI?^~՝cVW";GӖue |c|?5<#M;dWv??od=~'??Ϻ}?vREGG׻s/W_sז? ???AEYaG%RS¯O4o_kI{Z94Ö׿6[O,翬R6Xg}]Gk_>AڮO_ѬO-?uT!W {XnYO[[}[o5uwt8[u]Gjag?_V}:mckm?>s gmo*G=oZ[x~Ygm+ofr~ퟙǫm?_o-?[.g˿_??یYu/m'_,{?acgX{]_\+v_8S -vÍ߿Cq߷X9_2x)οF5sV4U*{O֯5i׻t_\u{\k/}H?)ùv?_9GkseI_~K3)a ??ۦvVk/,Z4s5=?K??_V?m;_wInwsyZz8}?[+^:ٟ_"_"qyyqX}YyYyZkY}qXmyyyqX}YyYy}yyyo1}>,_bnG=N>c9|r~9}>:{3kܽ?)??}|̯=Cl?W -~\oxRox{<^[)'j ׯד9G-X?mc?tY'}^W?Y? -wodr>zK^}RRR7Ưv?m#ֿh_{gFi9?V?Ǐֿ߲n]TK=]|_)_S5m/CZ_\<^Z>iۧyx?^Ɨjk#>ךi޶ߧ9*?zsd!=ߑuӿH~Xg__V]# ?נv習?M{ ?|ۖ%Y;sw?ڟ{t/gHx׭r?KߓO[-GCY>pR\iw%~[#ߺm;?R??S g?R?ok[ws'<sj÷ſyzG/=~u?~M//#lmׯկܷ)KϭyY'>O?WSgM'mt=i5_K?..Vyzv{?η6?s?_?Eҟ?y/RI?IϤGg]g!m?mm;MsO[m>I?K?J?i??-^\ >50)> ?}0>|{?n>k*lWk]Wr{Ze}69lw!_o=ߧU|^{_tכ?{C?e4R R_L/e7U%/'>7_<oYڮegǏ_"S/ח_߲_ߺ '~TE/=?m?_ٵOv?>%__?/oܗ?qv[eܵ2߮:a蟮?񯮄3'~㕪SV#VϿ/?^rkR߾cфR~Im¿~ߙ?~ ?|/??7OɿϿEWwoGjag?>?eG!???ocYEf/q)e9g?=G>O)?׿g˞v/Rsu__O?OaOu민G>?_gѿm'?/x-rY=sߵwo ?߂xW2a#WߍC~^ -~no߷K]n>צOͧKy8_a۾=j=?xmޟ)믽}jWus矣ROyR]???ۦ}Xnն엟j׶ivOSKa`?#?k8u_Kߊ϶ ?O~>/wLJy$G[o۫Ov:>G!mW?5ow?L4/>,8L4O4?5͏?,4òn<<Ӽ,8ò<0<?<Ӽ,8<4+W/v 뇸Dsw>]絁K 6'/?AIW_{;K׮:6|>~yRs+?K߫?eI^9_Ws׮QoV6#߯|?ZMoK(pڻ].]r?ʟ_Os]_Lo*vů_i?'?CׯSIMG6|_u/?_?bC'k??K?[Ŀu'/[%Gv^㿱A+o#c'wֿ-%.߶ov!8ſ߽?^'wʿ^W߷ϭ??uk=__R/a,?{x߷o}<|U/'ݽ?^-??Oݏ-?[?ǫ?M5R_Ϳ/Hj=+m?5e?:S_\c]QWN7^/m? ,vu}i.J+{ZKq=;+ ?ן*_×Zѿvo_u_:޽߷[u/_Z忬[{^J^3kKG!{yNGGo?cMHs>~RI׃/-s?N>>-uu|OGc-oY'my~?I?5?[ѰKg-O_gUM]_'?u?Rk5=OOkXƗnw/m=~gsO?/)W/uyg^)~8UJf7;{/;rCk~>5v7{Uq_[/?e=p>5׿v_t_?_FnZ.scC'N;Ŀ/Y'?,"Owvύ_si:{zԜt5;>]DZKyԲ=G{O?Vu.?_M/w_-~3~__'a{i~~j)kӼ<ך<k֟{:;#ֿO,V>Qc}ӦwECmIG]aK󟶬-EC;pkUFiKJtuwt8[u]Gjag?y_vmSo_ iGOwqYBci=&NgM?Zz_\c]QcN?<Ɵ?gM/_?jΗ=Wp?V'?_?XG;vߦsϏKv|IXg>_:˽rχע[]-v{wkw[eRCu}w_չo1ǟn_?p<4?[%]_xϟ~]Xc]ץwM_.u?\wo yosGϓ`Z5w쯎t5Ϻ϶6՝9%OUqZz8k5㟭vm4ͭ?/ZkZז?~_oH;~'_bç/;?CIt8.~O?)99Οov<=}l_Y~2/??__?v_76/p{DZ;×ߤ/?/G)BuYdǡ-eiuls./7t>{\wCs_?sWZOH{cw=[? M GG?|_Q'?Aq'lnm{ί<`O?׿r}sדWuO~.mT[q2=%@Cokο9ڏ/ٻvg)~RtZe+g^?>_G[wC!y߷<=jzoQqrcG>NMOk?ogsϾ}?Ϳ~ymKףE[_?i3s,K~zt/矮g6u민g["o'C_.m=+:P]???mG 8~}W$6-Km_\i;oww{Y???Ka!Io7+RI?IQiYg6gEg'v?߶g%__۫[C?o5??-ʍo?+I|ǯ C{wo_οՊs2efWW7hOy,?]Y#/[?~w~JO?o{3nv>+Y_=_ʿ+]?9x~nY_?[/F>ӯߺ˟?[/_nK?Ϻ?V?m]GOo)[I?/ߵ?˳kN=kןч_a]4o}my ?|_s+GOhcY>5)y'Ưgӏר?!ak=KJ?Wtuwߢmӕ-????'OoDzwo8q{oG帿~:z?}cRq_BW;צ_/eϾ=OczZO>j2'?[a~^~g??'MoSnYڮq8e>_?>ی_c_?:|C''?stO>;cyw9y\w>{}[q3 -~<~߫ Zqu=>ߎ+o_'K)|Mei ?㟟OM/?8qh*t~wmw߯g_)qq{\3eO*o]sst^js=Y>+/}lK_o+Um>[g,j?dOkߴVO?g{ϑ5[{Y:㯎ߥog[CنOmW'n?;_%\?Fr#-j';WS\#O+Z쟚WyyyqX}yyzޟqXkaYniii^}aYqii~ޟii^}}rC\}?9;oG?פvë/]̝ko? >}?<)|9ڟU$h?\^?tkfG(e???o^G_ >ŷwuKWݿ.?.zKO㇧|./gz^eRA)ѿ#_tE/vϺ?vRE???O%ǿ?ߺ-?|#;o??IG;_j?OjGoH7k^[;I_?O߫[s֟?:㵞_oo֏sT)0~?R~Rs{c?GZп>K>*{v_ߓw?'?j?kUٟc&N/__o?k e~nKЯx(+['ci?myk?m϶Rw~;?:>4}_={N\ωOK__/ۭ:L/o_V-]=/%%#=N< -Raos&[?_?)?֎$ g ?:voz?sk'k?#`?϶@VKno?_O-h?/G&?v_u?.үC:~K5Kc5{Dn~?hn> ׆\d}/_?9?[[v W{]r7?[[{󒂓^sόÞ_FgGkmko{;#p ϏK迴KB_$)-}}_=OSzH~z+>:??_Z,e֝-Kϭ??5ߺ 'u_#ſ_?z]g??bԿ??'׆0^~0qt*kO -?E{{<>k_}_G]}m?M_o>IɯϪ6ʿv]__ECC-u/s4ԯՏro{KeY՟s wCkO??nG/)4^-_GgߑWOWc|G[Gm_?mw߽!_Rq>9|uRq_BW;צ_/eϾ=OczZO>j2'?[~ʯeɯ?-?=럓n?uh_o]϶|6c׶?z?;G#?7;naX{~~no<]O~~߷ n|=V\by!ơ_?/?ߥI.7{R -kYSSK㿥{<okĿJ>_8lkxWwz{ -~\.=!~/=o׿LYS[;ڜ?t_9D_sR["`gC?O?S7m.ii8GsMw){<[gUrΟ)W3?Dz8K{_>WH?J^ieyayiiyz}qXmyyyqX}yy}yyyo?X!i6|53+/:Wu~ܳ?O-us羏{o$7nIo_;/הm?u|an?;s?;_ǟv.6j|O{2ߌLc8-?%ʿ?nn=瞯'.i-F?FuHonO:G'?ϟϽrI_6.~+ag'՟Z쟚ҟO_>zYgm_Y;];]_<v)[N:W?K7X_5wߦC?[_^>n?+_s_K_^_9=s??GC诟^R~k῏Gv/7?{'ƯegӏO[-?C_kk=KJ?Wtuwߢmӕ-??ПGJi?okxu'sk?_2~~>O -]- ;'?]{?}eK/m_;}zresu__OO6ss/_yCm϶inOP?6Pڶ֧?Gu%޼ा?-:P]???mG}|g:~2n??G?|/z㟹鿎߫?HY׾UC2?o]cϢvO?v>ֿO[޿ӯ4kgaLg]g?GmWuGO?'?C?T?W? \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_0_0f3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0f3_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..d18971ec8851fb69efa44301cf7ef8c45af90aba GIT binary patch literal 3234 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0f3_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0f3_states.bin.z deleted file mode 100644 index 8f783f784c8fe30fc0458e0392a48dfb48f67623..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25591 zcmeFZeS8zwoj01^-re+hc0bF~w4r%J+fYjL0%{<H5Nyxxw!vwfu1ZMbfPra4h#?NB z;DBQb`J_+V%?kl7uS!Djv~j3Iz^Gsw6^wn_Ex{N8Q`^|WHh8+&Mz&>nD#_A#Ue5X5 z-&lr_cK7an_CEjJ$MeC+!bqc;bAIRh_B*e3#n}1Xy;<^W(P#hi%WwSU-~9HDv)>uc zy8C~9EB-=YPHKr-v3dFZ!jAjC_qDuVkGy*#@0UOP+rRt5A0xmBCt?76W-|4Y?*7z? z9Iooz(wCiOx~WH_6mq(Fg0-r-<%vQ+;J<)YSfH!&JC;_sTrY}}iUEl?T?AHo66$j{ zglGp;#uRD2?&*U1bYA}tVOU~2MT@$49R$7#9h$F}Zk9Mya8DDwYXa*Oc~38K>6Niu z=oyot&;d0OcpHwJ0!xwvlrmUqYK6L4WQ4i$lE~n4!re}C-gSx&6G#ZkTS1j&rp`zN zN1-wd+tNY-g&9ocmjN0~<qKTc;aKoHGa+~h^rZa_P<R3MLXvd$!V}h_X<WSnE=#1I z4XAD=rO2@0W((>eQ~|qTCmx}_P&65qJ9;}vCmj=+$X~bm<ojt#JkA6bxd5vUlV(V@ z!x!S@8h3-J;5Uhp4k)69=2eoKI5^$NN`7h_v>dFk8n(bC{Ld|ra8nuvx+_{aocti> zRFr9uiYFo9JCO*aV6~|zM1;<McPIER5dT?He`-`*0K{8+9{hYofvQ~qzd_A8zl1Iw zqLpj;>oA80FG5R7rPsjiZ{*~s+{t@kwoGP+h_`P9!nq>L?N)Ac`W}Y6zRKk+?)w3} z%fzToHbEhuw}LxcrJ?}1_rXK_F6h602xna7iQr)v9ffHZ$!wh%^LX$AEOQ+1cX;tV z3Sn3%<ON)@W;|_Q@FEHoT6k2c_eS9&<d%)BB||vi;0aT*SQjMWi1FOuSium<Q+z$( ze+a?_FrC4G>GX||hF&o)r5p)Jkc6Xe1~teQL+)TgLl{<xaFF{;tRS=-&Llml6BBeH zPFCpEaD=-oX&#<R2P}aZ<42(-2l-D}4M|H)-0fFnD5s@{e$p~ayUHPDSjk#plez!p zIw)&jOZ4&>m;Qm58l60=E=H1HibArshiApy^q+Zfg!}^5r<4!a9u9A$lG~}9Z5}nk z*_>)joS6!nyrGA=PjRuB<qjIJcl0VP2{+?`{443oi1cETTqQ{{My5h=0JiJl1iLdS z&5@x@5wfmYGdz~~0d!F4G!!vue{eh^&G4o@RN81^T&dXHKUtTzn<Q$fvDO^uuIJ&| zd<Q6pr7P0f2sA`-P?KIVVz|^uPdc*1@=wQGzaivi;)oG`BPp44o`nbX3)i5x6V61X zngA>YA)klG#1iYkBD{Q5<gx)LdX<V4%#700aMU7Obai{28sKWAL;#bA^Pl4V^##%t zyj(eYvx}GO^3%H8|Bh9cq@uVsNk?5UGbLQrUoYH2e4u(cInP|4VcM^|u^tp2gW<$p z*p=;n+9+*FR}weR5Ax+7%agCddyI~1FJFP&lkiJzOkB)A0yC<?S3rlS!7(V;h3Sju z;0{Q>4frMru%OB);Vb?%9fSGRRtr;d57ChZ5KKcfp*tm*(BwG=RIOpqo7D}<v*jjy z0vBN26u1QR9_WU)O}vRW9VHQv!q5rM@j>IC3ni~u`DLJg!33Q4LZ0P>Z<Qx@lJjsJ zru(4^PU^HLLbm>hueoMPNmATSa%*9ZPHXmo=Mk8}<>m1E#xc<f;MB;62wZ_#kPDp} zyfHrYe@~N8E-Zi}0ltrP9tOugn3WBIl<q7@<jSz60*Xg<asl|yVc(eLz?&LZbazxP z6yUoSmQLu~O=^=g_fg0)nJ_m(Jg1=|jxTC<<G1efun#1U<(LU!!-8rnzZTSHyo_7% znq`ieSCwdQp{GuTW#v6x+LmKjm#w}TZ~|yfxl#2Vr_b=xx0(gl#(v)rTroBpRj`OD zsr3_;{+C#t_7gZv(zUS4v#9ivU=~8(6bK){lF+Zx6)+RN5c3bf%PM}hZiD5%0lq`9 ztAcc&;K_dyCYxrT8t@$%uDUjMTMR0FkQ)tXb3ok0|M3-TW{QU7gX`hDX-jl7zs2`s zb><DGsE*}Z{snv|UQypga=>ay7e(>Bg?g(%%YIyi`?eQWJRcF9O5m&H83@S*3t;+E zQZF=x;aTQPn2PielNXCj`xQ*<g=~$~<-qJ3aKw19gJbbgdU}LM$Cx`iCP6Qp0@fF3 z;6*NrY|`^O=$klra0ENnK%aknb(q5=cSEQB(dWl-(B-P#@H{|-NBAMif2|p=C>@~r zCRq!4F(y>TAoOdXUvs=VYJgeulw-dhnpt|Z8q_1O_Cp3~9Dr`VlJ8A<P4Yghgu1x< zORN)wV~}~f1uiUbO?*&rTdF1KKiQ$cfE5{Fuv+&h@TF?l)d33^z#t#?aCsm?+$^VM ztR|Pam@+19Wd0;p;!j9vuaI&l3cw%a-+v4ibU|GsH0i)%iVj0~upyG2B$fMskaRUX z2X02>Bov$?(<4xu10q+L^zINON0a8uHzqMI4uv~OMGjf_Rmf`JS@qA>BD`-EH<tnz zsHMC+t34ZveAY~vtb}2qo)zv9JQk_9$`8*Z&6#n?Ln(0qCk>~!g0P)#0;y`f0dHtf zI~9Dpu%awzW5Q{|X)WYhYQmcodTCtZgCdu}*CbRF3kN~U<E@6A;5!C*=xH!VN-NTW z!waFQAZ%dn1Mrb>A7e_jvaK8{SRg1k&x0~68jsa$Vqkr@AMV==_ry)DmbU83jD*}4 zNmBYEnRyL{q#@}lJQSw8DkS4OmXbWKX(}@dppZGtAa@=_=pf&K4htUR-8G!9Vt%#- z$4=8H)H4iEnc^82Z|QfewcLZ?!{y+r3ujk_AsAMmS|<5)=s5KA;V6QsT$wfq(JnH` z10}IsYssKizkH}05~UTVhhSPK`AeAh9xK$yHNhK|djzcXmQZeyKJQB{W_W40D;*C6 z`B9CwFcLF}YB<3K4c$|4Rq2C4`Z~XYuiUhKROR7gOkqMaQ4dW_D8vCVhV=tasO@Q{ z;kZ=c%Md4>*Mw^%byZ$%DfJ*ayeYw8G}ok4<1|k0HswFS!lN+EWy^iY5-&o>3Q!({ zmDW5Sf{BCti#=N(<H815e89>+4d=MTw?cJNsO*QMk<9!Gk)0wV55TM5U6k&Ddw#*b z$fVdfj>v2JNvoEZLtkefLD;ix$SxT)+i_?<-(x8K5pRNpt$-yGyJm!Q8B?<}HKUNd zZc$4zoO*MBD<AMVT?QSFl6FXJgEURRHIjhJO9C|Em9cR|t~HKm6hnyOmFh!8dYYtV zj#E8QI6m@UO`l9JdvY-Hc(;#x7wVDw(s#$i7TH%0JJQ+!i6sXCZ|)mukC7ZO)Bz*X z-LIKNN{Ox|YZ-sfdv^ohh-+gh=&_?-vOK2H2=l0hlJ$w9B-mWC;2-UgdILtti#u^{ zII`j4y>J`sRbC{s-pnr;g)`Q{QS(I!QjO%*pX#pk7_G8zH-f+Z@$<g06My{(G30~L zqc`=$3dt<S5KC_Bfr36V4I!s+g5OpRsckd|ry3^}r_Vy}P~qHbkbMJA$TL!E>0@b4 zT|+vfaFt$;OGe2$#9N`|aQ{B2`{M+fiOb>qZe3J$l4k<e<qW<E7poRNm%oM|c$_sE zut~>j>e~wGL*QP5DBD>h-JVpY^&(Kd<<qYpJ#thf&9j6J_MIBwTl&p`gOJUgN4ZL{ z%HFn<#EviAyeO##dzzFsk_Q3!{NDnTV4xJ5-Y_NkBup6=YFHat2NBDq3u!0dvVLpk z9sZtGt>QGL``_)q)f96aS0J3@0)g_dCDyWR;<oNO$d#i!#EYXakW`drp;cEuJ-Zu^ zPWPMj!^hK+TquvSY(-Vr8c{rwe8#V?^RB36{pN4(3^$#~Ugp>+kZ5ugxPi+nhg3@k zJl-WX$`B|XWrh2D_1G8hlCO~4&4z`)Cm%w%5oX^Bdw4~4uXy9V><7d@9CcJf?u$Lu zE`-467I$-{jLl$?4%lNY0(vr9RB;-Iatz1t@tNufEimEEc>kX4g=yH;LkgL2OOn{f z3%vtOQLhpv_;?H)-8ey;@#sGfpZg|2z^Y8bIrs%{`<Tz*Y5=0W5eU8yzVAWkOEyV6 z58-J01%!{c{!1m_xt57(W6C91jTd=8#|idJ@a=(O4#yL;1KHN+Z~hFA{&PRSQ2KE_ zB)P>(i=wwx;wYRU{HjMlA}1A%LUd&V^higzV|mS!&@=?mgTv-7BWV_cl51i$KG*gr zBI}6opn$i%C7l;0HK0&&t?6tbMF4MFbtVGIDBMzZ9`brq)2>2A5^hhpKcU;xl?slE zo#Ufo1|k%jBYZk4{?3KtlSJ`jALK4v2z6ZKE(Y-jCCH`k;uAN2jETn!R~^qEFg*+^ zC7MDwOKERHbO->(M-M<353V*t+K=Dxrhi2k4RDV^SDPN5Qv;*~I=jHJ7J_-_;6cS6 z!yn=jw9zE5JXl%+$`f(t&F}Ua4aE|suB6^f);6wKzomcqjOz&e$49x~5=;dN3)qBZ zyP5~bNA1hNAZu$c_*TI36I|byb1%EYn-V{kyQgo0o&+1frKBr_)8?Bn50BjFSRl<J zAsiw;u8q+r%>5?WiX7yspwmOTaEnDctSVhN2d6*AB54khC5WrK4ce2UPa!|38goC) zv<krMehMNY_#60Nq=olbh#Y`}5FA8KRs+*gZbtF7Zu)v{<&XHHb^7+bl^Rj!gUlg0 zpm0#+G!U+J2*Ir|3}N_O-&UBt57vTkiL5ZI;4+sv`IA}whm+5NR8amAd<1ROpm8;I zwgl?OoI&0WpS$TTCmz0ic0-^~(_~Vg^Smhpe2QFT?zCAr^qI`mL^0J*b8`FwY9QX9 zU(E3xgF3klx}zkft&712s95Ce1zaLuZ;ivIH=9+yclN?I$ogayL9>ZdJZ<gm_|v<X zmrnUQVA`BeYG3jh!V13w?gqXSs|?BGcSebyMxN+ZR-5DyS?7iVR@aX}5!rpKTJ-76 z4Z`gvje%TEklqYJf?UHtrAcy2;xsabIq<sS3K?=&1aH!56l|0+Y9l~F9g}%Ds$?eZ zN-kZWv`<{0w8yycG?#UV$gmV~=%k+u$<a2)+Uzj51{8M#BD|f1sgc2C<o1NTIJ@+v zGmduBtbPYZm8T&$0JE0Ej~>yrQKa~uAw`SGnkoawnTMcT&uerdO74saH5Mu_xEL0% z#pkft_M4;PVd#oObnZGUGkLSNw%Mb0$x;}2h&%3ssW4>?t>tU12;?SU5!7#1EP2dr zRT0CFM4&hBi(Hn6AhH90shIFlaeuO@-=Y_x(Nj^yWa$hFCMlQ}hCPPQ*x9O(PV&;` z|1R!3xrKfZCvv1mq1uFGq!{!NcY1R2IpTBfbaQoJ%#A#HPfAQX`4n(WfsrFHCq}+1 z=(&DU8>jn0D6^Eegh7dWhU^8V$6Ma4lWL7#mb{GAvH`sWB{tJ}1yYCE8^QyuJecRj zl}c`Vj*+j8BdwZoq*di+oo2*Vl$v~~8?CSK{O6#rMuEMISG6GQiyp&wGijLun@PF> z4y0H~ZbW#Ji9VBdT#a0pl(dr&-!$j}5w)!t7vc`^dy%N*JNetEQDq~?%)k{WvK-BP z&KTW}upWouT@S#N6s-#bszf(4&xEKaq`nzMj?)rWWdp5BqN9!j=X4=ygRJ5RG`o3H zH479NR^9Etdr}eGh?-WmlA_-HtsKg>-UI&4N_H>oVGFx}A3i8`$PKYTE$tY=1)-7< z?<lZoF_O@VKnA}a7{~}siop}4caVMvWCvYlGLJ@k;(;+|i8W)K`Ts+C;vmo!dIwH` zDqd&>rjUib2%M0{orBpp`hG>Y4*^vHtYkhU_Xr4KecDx?6m&d#Y081@um+Z;Z9c;_ z^L(2e=~v{ov>6CTq$+l#+qvo>3m;sEi$akGe~rXKPDc)`g}qf+xvEm>$QokK9i<y# z4)Yy^+heF{<{pxKmNy!y4AYS~WUItoO-rQUMp!XuhNyCsJ|*Ma`v%GlW!8eFyjp?O z$KAXm;=e%T5oEB}XcuI0cMD8Q2Kvpp*MvfpHVtTHH3hmnIU?X}{2~i-CU*dT?@xH9 z#Iv_Ry6*ws8M5s%6d<AWr*#Dj{+_tsf=z6gzq|m{<u<Ll3yQ;}Owf)A@>TkvJwOV| zqp%@N7rqadr6WdRbIBv%ka_M3c;Cw;!-fW@QE75*HGC;x3DN=KdnPd9T<-6Of^)?8 zHnamtq*93TD)R1QCs&&-bcUeMX{Mvj0y#HCUv}Q_dWL_*^N7u$_84M?b2RmRuzuGc zS!HWazFJ6qd4aR2VrYbPt%S+CUqvNQ=FLt{WF&5pu7rOxF3BNnkgA6NX%^fD!9Flv zs^?W3Q5CR~Q+r{1LXDGZRrn@PLgg4PE;Fmi3lgeO#XcC73LpVP!gND>-_!@VV=X<# zq~*NdI9%G*1KBP!nj1=mL#gkn6~WOtE>jY=BjOJBW$jzds%!a|+sQ>~7w2l)`8Xw5 zpu43)1^(p<XgLrFviZ<^NhgC=$xpeo27)-`9B(Q`ryyJMpqfp|8td{0kb6xGX_d*E zJJTYvE$HncTM!g-sS{Sok+auf-97if+ClX;&wX3TlN!{JI30s`#!7t5cQ@>iEF|xL zQkQT^5*O*=99YgiPU$5D`dfQAu7wp;8464`mB&c(HqV=5HLYsCX*C5Slm2EiU+Mn; zSebGcK=kE^7@H5Z{kk-*0`@H79ViN0+5$Z<f!eiV;lla|zy<N!))Li1Y_Wy&x+MNf zw>1e0Ew>lNMx*!{XkZX)4TClSR|W1&T1{49g>}bP@Mx%$BM>_U)e%zp37m%Y!@^JC zu4Z0i3Q2k-K^8%QhoQ#miz{PJEDQFbJa3i20=-$vFW2a=;b%NKq%h^UO0&u!I@NT~ z$Lnshje3|@VgX}jX*KIth<7ceX;v1LSSJfa6B6U$)|5M(i*`mz>cP*IBKsK`O_93P zl(iJ0h^^V5=tX^E`8LQ^pd_u^@)zeQtKxf|K$=EAA;)_KounL^fVXXae+k+*<TBK> zz&~xqhk;@fN(|><pf06!0lAl8xpwuALd$SQ&|2FIEhECCJ1z2W+#M%9V|Kwhm#~F? zo8`XSG){BLKbgU)Jv9tU`+bL{x6@TUQK1?>fQlH@F=w3yqbuNL0M+=nj?y2@CD57- z9`>Ek6cp!C_l21nbVDIf-4{88IPOuHk>o`Ylw4(`8E2q{oVKJfAENLTYymj6;z5<X z!iz__axZizEdOdYV<|-MA@_Kpts+U5qO^5DdYrjbLrjk;V^Tfuwdmy(iHjp+F18?O zbwK}Nviky>KR8ceJtv}Bf)LU!;^c6o2c_C%pi(70i;)%4<=kmnFfbN)1@E#Eu&61_ zL45fsKKzXm8Au5sSvdjIZ0wi#{3=$HW&+l5rf+)l3LM?+=p7{Ip`l3FAhk?Ioos3p zB5Q`@?iduEp($K?oa2aooR$6o6tjEURVlji@>tc+tb(}vL&V;HVahLH_2`CX5<-HW zf!LXID78sb0ZdAXDPrV<JfEiy!N;KaVD_NM9G{-(^+&(?=t1p&dPxAtXfl}N?BZI< zGHx?A(Xp{#?1tNIrT%Y^$Wzk+(AtR$P`a0u!ZZ#s^6X3F4CL2v=<UfV#~{?H^zCia z_iIqMjofriZn?!;zRq?}4!hp3N~PW^cu;+;)4+lp(wZmjN&z}1a19qS2^TWoX3>!M zgR3tP!>e*Po|U1tret+=@}P_){%P;AMsP>XE3;z#c-`MYez+GZH(F?)6eD9XlwMfc zL)Kcha?uQ{kdXcXYOV?A;fH+Qv&>~F`4BR?S!V}ABUtqov<sh*%0a4GBHa3STmTey zQqEuDfERfl6B+$3AbVqu14!)fwcc*F%RcFSJrH=#s@Yr;9rxXEQE67(eDVDd`{GWT z=29SVEGdjHDULY*9WFRcpf$pg7rEQVf+xXePnxu}ygVr#johjK>^(wLIZQiG{6ob* z9iuOTlVulZupfLqg4H~Rh$WkccL_tVtr0rMWbj>sY3z8K)3*^ekc#W-B|HPc(231z zkGNAb$<MtJq2gKI$`q||30obtXe$d#qu@~8!<2uUcSV(8ngo}@R9r*=7ZGWcR`bVj zw$sUsq$9(<;<yiVyvM?o<<^LFF;w^#X-0P{f6EwMW!<)$mY6MyqKl4Gj^+_muA44E zZWmNs!G!~EUN~aMp{if^4U3jEpZft}Y%?lMmtj{3+DMNjB}qTLG^FTcC30~I7Ces& zuMG3id?2yht|`d>G6$;2sk4Y`4%4$(1ojy8MiEf8nxw<Tm+;37XwlWyBrKKS=yWn_ z(E(k^l~BY{CmG6{GP;tHsc3H;<D1h-<rJ|b-L*o;g~RjHq>RXRaWM}TTIlL707|jE z&?}ar!|^6)Nsww8l(Xb<6DmGi-S6cMIpxRlO)mFGs=ecQpc&~-z(n1nihMi>dHqt= zJ67_Ue8d_`wTQ&S(GJTUO(u;_3tB~n@0e(4s!`}N#bZ-;zs?Y3xXR;XpCP9faUM-6 z3E%I_-{f+dx9GH5AwM01GlpwW4^~G7b@a9)XpnQ`E1~k2wh1j<FvdtNFB6imD&qWh z6OyZX>*Sr9@`4Ph4kTQn!8=qGU_V_9I6T4pXKn1k(T}SM(T&RDQ7(P4^xA!!coKca zL~e>&C+m{p2dSW0yqUS%;a&>t4y3E8b~4EnW^<(&@}o)T923_EQWOJUBgA6tCqGf3 zqmAnV8V`yKha63xf<ixif$g2ZzuWPX+UVCF$QR<cnvk^A#%ls(w2?WH!;g>=*@*f) z0jT9$xTg-nX?n2-=5*oUHz6<aV??i12#qd!k6zv}quYR~rh=f}Hqim)X1YWPqB|j^ z#k*i(3qH5fB;#*KlYMZC3`;zD8ZN+2;T!sduIbx@cC4$#aIInP+N3lhH)5aw(Rhb? z+g8DI5iO9dup~_8gA2uS|2)1JzD`r5G>WW|R-zAXTQ7>j_d&o`vI0Cj2j-!>jzro< zsvV$Z0e#%c-@skbB(9oQ;N1hZ07K=D;`{caD=HWovYSWr|9~h@t01p_-Db%Z5qf^{ zl_X7{Q4-cX1f@0I<VC%v2}{6daOpCr>xFR9<uSNTN77JwXBGHf1y?i<Pw1%A%(;RJ zdj#@KatdZC^U(jl3y@a!gAT7+z4NsigxY=1YIsm}zBxi4Oi{HWvIdeZ8Xb<`#EH@3 ziw$UMCzP4VRtsWBrz(veNZlFq>e5kNnM{exd|)4V?}aRH4wyyh@bh?i4)FW9qnPCl z>IbA7s1&be2QFz*IEtlMUzWLBCv{rcOS7X;kO@*)WSLdp#N}G}nbqf5&Rb5S+zA75 z@&Nyk80rD2l%dP8N>T?aOcC!PLeKJ1tJ|zO%={xz7A`*}?JlR?`*Dy-ku`@f<-rR7 zNGdzWLkw*}KFpFG=qB_wL2ggg?G2>5j=kW3vZ&JoccI#Q7_`F(-0gTmTpDws3E>$~ z@RiBk-+>Xbwi|D2%`9pItKw@W!8}S6o{%uJo!H}&i#ESmdlLahP?`^w3V3QEIvKf8 z(-HV<?na(I0;rdrg~ypYma<)r)1;T85s^7=wcYc|UYMo{yU!{sEqNFQl`*tT<}5`y zfsgY`YR%KzA(-%uqei?DUCtKh><MxgqpxIr!%O>;o=ZN1G(<icFB#p*-@Z2vAj^AZ zD2P$cLMn_kgLp40&{LDC86D&d;;;iY>>q-eLqa7g`HeiEIn^;YJb=>A3=rO8NrE6v zF&t4GSXXUSSPeDf0*8#!3#L76;8>QnN4~F6E|T}}Do4S4Kq=fsDxQ~H_?MYApgGqN z9}nk99B-~~HLVhShhf`c(zv`Ffw9+51Xs5j=xl0<irN^)MI>cbw-#>a%+o{h{+wTY z2xej!A~+2*Ct<SdFj<|=@0kf%yX_j?l62Kz@Pq1W(~%vo);$isbM#5-M#!w1ujjr4 zFZjSSgtyx);^O#ut6BK#4%7}$8tOhWe5E`cX`L`o>EnD}D@L6vqe6>;CUX?0S_Hw% zA&Y!i{_IMw)Np?`pT{GIVe`{aQMHml1!jrR+Yj9X2S{WON<f!WfmU7oD{#C^W-5Wn zu-RL;4^kBntOcyg^G!oYL2<Tr0iPqguSrWU5;Q>kcunEbb+t%`+2)#uAbU1O1}2<} zag0|u&E)>!#I$*Mr?!mH=Nf&DHcYxV3S4Vs!b5tvqUh9=x#&T7t!##(fg#)yS3vhw zXyol*gMQ8=zvXkfF>;h97ho5Xl>}LWf??+CB3XJ33MBIGlJZ|cf6}%J(WyvAar8Xi ztt7S6^au`<C><7p+?NAvpEYeC{LOXn`RU(3Sk_2G6-A_c6ipc=$@mp1jqKaCQ6K3* zpG<6=bZEWzQ1|ari!_9(=muwO1<`>@<cFvOTJV?+NFS?EW*v!NW`#$TqW_!aB7`uV zm2vl=+W8p&i%;L}mRtT<(%i^f4D!OYE5<2e%C-Pr9VV@09dkE3QV^<dytd{+K+fuj zO5KSOUXLNP$>O@sl`nv6kd<`YkiH+;)&p!74`-z3BaB)S9%7H>xFrd2R(K3#%P}NW z50R@A4h{+F@C94=Ch53hk%kp9OF;i>{*ZvUbX9=-nE76WglOC8YYnvL1<aQ`07Z=c zsrdcei28oj2@|~!MG79vc_>3Tq72Ou>-a(pV|17*yCVuMa}SP^L!36AZFC(FsGxzj z7OSzGwRH}^$IE}0NCrm{0KCHHnZV5UW45T12I-7g4}ngKVs6-?53dmJ<*2c{zY5P< zcdZc&FOG`N@llabGJ&H{M@7OOpF!>zqC+qmKtzm-oHvR;c%#sXPfWV`R%9Ok;F&$1 zpEc4jisHKMPJp>!)~9*47_mbpjyEn9PBO#jAJ8hmCn72$juK6(W~kg@zRi*o_887J zAog?+a+`LPXt4E5@PFO>Ze#VAXHf~3OOLvu(Ju#|>)CkJwqE?|PRBPeur*qPm7^O^ z7cC^caa78)FGDxTZI9vtlT!9aC1r40tArJMzj1Q;^O`zS@!3mBgN4&3<BrvCgO?Q2 zxVZyI1j<NTYQ+-}9z(Z?V<PZ9`2266@H}}BeuqZ4A&t=h_am;VsfH+OVPArS<Skf; zilvU%{qHTpQ)rutKY+?kYWWRnkiFc^1XFk#!326^U)iauNUTmzLgR3(@cLY_)pn{_ zRnPG5>0c)p9zh8pLMGxA?0T{aR-U&M)E`R0VHU!>G0eeS6IRJ{6Mr>c3=DNI%xaHd zH1Rwa4bQO=$OA_M8QU4hmEB_n?nB;yB)cXqf#W>n8pSb2?nsi;kkxBv&MX1o0EXr^ z>OBqg>og62Z(bl-)z*HKs`62zr9&tC&44fnLXUEZFm#;46e;k!<2?Igl*uq*Aq<iN zwz1;$Aem;su-w^1dr+vAiyL&5-zQxV4*2CS!47)O2;3egp|KhFqs&`LX_Dr=A?&yU zpK#wkTf@u#Y#`H4RTP6OlyunHtYYh?Y}S35Y!*(pv(SE#CgJp9cu|0oQ{1seLPs)? zf-YaJ9m&cZ=xPq_p4sJIPIf~jJcyb?W`QW-idq;E((N?q>`p;tQrRDYx*S-Q#|L!M zk|f)5K-Lw<D7{TW{3U1e1+bRs!x8!>j0s8UWWu+JYhQ>+g%ql;S#EhunZrvsAt+3c zdL2&;#Y2odAjzS-;jJ`e>kdq@h`3bQ2Leow*LoQZISDgNX8HKw#^i*kLAc2U&$NO6 ztl)Y`j~qCRIU8C){|QEgk1>P0O(Wslb$ZyY1*58xk}J}-NID5e$FO8wg~w7-w9;bX zDD8J-Vil}1NeU>&S7CcfYE8Ne!lY+##`6SInyH8Ou#0z-4^X0t!)lf)zXqWT;v3uO zeqN%N&K;r6X!lja4uy`gYK4}dW&>}*h9+VM^R^q#-H6%NvYjX{`bo60YJdsT6XzBW zTM^Wu`+P%0FD;7DZ%5r)WXw=LhR4gty{^)sgD^EsUa)9{2Rb6+i)pC50v%|UdZD}9 zy!BQJ)m0gELM0q>B=#oAvq-Zs4<$_-luV0BR;HSrhWC2~`=bk0tWbmjbWnx?dFy2< z6?SMVU=5qXw3i?dBL^@ST#JKW1ApJ=(R(6f&tT=l<oI;gu@q#d>DF3MxM0G0a*otA zy1|zu!}Jlp^#gpaDGiyoyPnpJY(;)LgM2SxI`+Zc4d9qbR8#r@FR!7jjtEyIuMBrE zORZLB+)2_OAriX_Y7WB&E+Hd!qOZljTONf(2YoU^FkRE3p@KHfWkp-h5Luv*BeTKW zb7RU81&oiCa<XMC&}T^<5d?N<zAXNXOk{bl4Mxg-S{><<9L%gn#m1T^T_&vw?k_b; zg|ii$ZleFQYX~b{Q7N?5^V<i>eo4W+B$nACADOP8rj+pRiqa2hN5>71y-RC@&(*#S z3+v(6tE}Q$%X3xPqY3{D6Q0D7V;JW_S>O`QtfQIwos#zGXp2e1iJve>DK8p~3_=9) zsZLvxn{}Z1b|hpK98aMUxX2XCd!EJQ+RaF4Vj1{D%4qm++3w=V?iD?+Zz9L)pnLi? zvPbPz2ZdH!b!F(-n`V!+@)LUVT5}7ZW%Dr-o^hegDEnmQo|1hpXObO#x1Kd1iw%?H z#bY2NRLyO4vPdh;NQBdne0UpLe5_>9h?E#_j24czlLI+!|0U)@sa{bxt#RVo@Ec3P z!%^K!yEMrur845zy)h&>bGe=T?SrG&;FdqalB9GEz6qE~!7#=_SjA%e<tUOMnEeT0 z9F4Y&Djq%_fRV_bM==V}RQFw^DZtmd`D@z`k2n4(IuTw$l@rcyAX--Y6=+ySk8kA4 z1~OW~-2jhfuqN@V{<MEJJix3TuITfQ-x0HD2R<UV%x)rBmdIk$Qd@0hDKi$HKymPM z=}Cya^Z6uuhD^NqMN-xdOFPKX(4;i&P__*~kyHhe2u0k9Bu|~Qja0Ue^F%~)s9;~@ zeku5Un8!b(M`m7Z%%La<1+GXb8)?3Bef5N9t)M9I&(`#DKJMMVCE6Qg%N)3#86Rmn zcsih|)kY@T!2@=v2%$gv2Ky>icmSQnn7aLShOURa_$gZswTzcMuqrw><>qVm8)Z7i zJuz(YZhzUS>PRJqvQv_61{EYap2KgRV_3B^A)HWsVx9klCXOt@1T)#MDNEq`o$q|K z477yTgyKPk!_Bz!wUdu#FlTN%c`}NyGmXI^USIxfCD&4O*D<HZlDw9@%}#WFuI~`M za6NFbgG~f3Fg@50?*ln(;hKkcegh^6l3KE3%&}%7w>=v>IV7xf$94mMyP1%V-N;k? z4}F!j!8Z&l_$HPT1MO&Y&Mf5rBwT(V%jSI~u?4hdnufW3&gP~)c6Rvx^mJVB>8Qtw z&2Mh$z~Vm%&1eE%hRWG0KsvG97Mj~gEaPS&G+W!CEC6u`M&x&FrzGGzraL%-1`Jk& zDZB@CxnaO$TQG%C7BoKysqOV(CommriR)xmtL6SF!j3V!_@W0Aflemr%Bwnkf*fwZ z))U@@oZXM^ZszzqTkbx=+c0MFJ!r-x=(y@o?Csk_Ms+&Ah`z78b&`~x@DBgA8erVh zBia^xH733sgU5sH0BAQk>`g-}_uHbwOs`M|;%Q4n(+azBKDDeeibFHO^yj$ZP%!Qw z`MoS)h&^$I=i3H*;u@e~fR=S>e~>pBLdKo4leN+~ACuyOVoX9IqLWND>GE=HMqs$G zB@=37jfs#ZDYx-UG5^ta9{qk0`DC3*{t{KVLennLww55bp}18`*_{SjJ3r%1?PN>3 zz<_BTaxQO7B{M2S4`#wIqJ*H8X>_tl&ZivvqmHFMf^Kulq$@Ud`zpwL=dn1SCv{M2 zDHHx{(K&J<3!+~5BlcMg$H|+#0C-`PAc@W->-O2~VI?4fulR&`61#KzgxnF7glI6& zwA`v8hQ{&`8kXbQw9gi&R{2n;JRTJqBoBJRadD4*>t~|2c04LhyMUtVbF8Ls!Cvqc z!n6Rn(1?N%EYrnaawT51(9T(w+d0eVHiE@2cnI!<Py%LNqq(PH2n3yT#2=<8K7@|= zL{hO2O%StR$m^%epHGA@K)JW>JhTc7+lk(YI4ZuwvpL1uIad>6M_^Bc9wBL|6UAn< zO>QJ%8+7rCQF0&$!~R8SXjN*^M33{mJ-y_+dL`xvm5f%&$cI9B1-$nVI=1p0-X^dR zBtb&?-}67ZgAl1r<Z8rmgrCqjU`jUz?l26a@6pMj5&cA8@?{_edJLwZ$X~zQS_!bp za)YZ|cbJY4Dz{{X?LKBme21m9#Kl1tnKq11UWEta)S6@qZ*wuH?_Y+>U-BB1Nig?c z^{RK1D36@~KHSs7<vzHuiL0Hcfe9t-TiD5k88<p6G6^tKW;qzz^waG7DSZp&XOj(E zO^w)!vZ|h=m06FjMMs3b-0a8(XBn4UB4~z~Kj9@;ljB+<iO_06V%9v=5exaweBN>a zrv96i9M<6C`w+VWJhrB-y78NP9w1{FiIZAOM7=qf5L-B%ftT^qP<8MP67Wf}_C_d1 zM4iEE2}Ipd4#wD^^pXKjV?O!o7|Y*{9HAr{MtL|lg)4TPtHzm`@E)&>`8liSoo(D7 zd;CV%o>;|;y}Kxsv7j}rR{Q{J8t}8ZqnhKZTsX=Xm+`exLtenXJ*@7eH0ShD>AhZ8 zE%<V{qZ)ahMLPArYKi0UnI!~Hvw59K(vT7proRy<l9uW5vJG5J?IRW5pUCYFRFlL` zYz}f?(Z19GRo|{CeQO__+)V9W0;k}P+0Jl`-z}nxM9-*%oW`V`H>LcJV^Bo9jQwC% z=p4s5ld{yr;zK+h_`@GGnyMw^p&bp4JtL4E$9_8J68Jiw0%%o`582L)Iw+4x#Ti*M zQj3Gm(cp$H3?x%BYq-(dlkvY-T=&1<J_gQS4m&pgp(Tnye71MjHD|D|`5327Jh(j# z6ZW_6?$BarNc&j$G+i`W2yhA6ot+Z<RE)H{cKRkgS&k%As?>1RR=u#emM>lkcg3tK zvqsg0N(mZL=C^z0sVP*MdPzr0v}1fzpnoe|q|I(7_89qtmbw}pH|~gl79^2z%S}57 zsdKP(6UR==AYaK41ZK<No(#L+hc?3^I?>3BA7f#Z)tc1xID0nc9KMS^aMtmkq2=YO zu-zju;rUD{U^Jq;lh0^YAUhGvf~^eGXlZE)AC3d&RF5CCCOCuPM1D4gYQsDZ=vXq$ zmk+|U9%w7GFl?C3)u%GuU9H>^ry=b;Mi5RDqY6)q3sd3M3+xalv-G^E5Hj;VFr9f! zt&fy;!RApL0l}FRQqfBO;iyJ}<qHhvNz)#F@?jwLhnj+F4|b5O6?xUmyyTRsv~grp z(iy=eVJPuER`(9dG#{f-)3gkpE-N3J@xMLOM~{t1XRyea7=-uP;r%o}R0OD=^wc@x zh5L~P9B@M@QhMh>@Vx+cSjy_Ogmw~)Rtp|DiCP4VAuHDoJg$mGYXw_8F+x4C5WV>* zHv6GG!?bmxWouGZFx4o*S9avKQd8_s6Acc9RPNB=eVse(?lBA*y7E%U=}?f!#}2Yp zd*K~u-y&4TiOMlA*A4?3OpQU=ssCam#tE2~+le^}IKy1~6WUi`j!BGpc2DTrd+h$% z@%iP1@0O$SVfETR=u%$t({$b_Ii}e-!g<f6Cl#k|O-)yFQJw#>T{0lO`B&HMte#)e znl&*=6NK3{Lv*Axstw=V7dk|*_l2%Trzrs6htLAvjk3>PObz&+2g`x$t&JmaVA+TU z{is7=cl6o@*?7y=Fs)$r$nWh;cHOY<?m(yaQgJPLT)^Izye_2@L%&skfz4@M>Y!X1 zrIk?$+ep=bSIH#%iqh*dJ)jX535L>aV;y<}n%WSxyGKb#3tO=-FdV5jV1(dWg*6(@ zthSfYRCSl{Wyim^V(oZ7uT|aa<(Px`x5?M+TwaBJyZN7n@&rsTMI0Us6&)Yd5KGQ4 z1NU~=ijCDUV7O{|cmX$Xs_EzyJ^+pbQu{lg9l8N0q>D5%cuApEY*he5qbSx4DaR3S zIZN2VS9theGikD-QyIOnAp$dFfOUBSU&swu#3SN<z3O&bdg$)QYbrc4(c_fQ>ACWy z6S2LUxY}<z&osjHdh5)2yi+)d_ox`a(#Gf+g927r*HgSMa%cSU^HeEw5NsV~<Fctn zcx8k+rj3xCBo}{$aSIn5XHrtgXbK&u&1b&GH3eHI+T$1|`sP<aG_x33hL|KRY0YYg zqee?YhSQX*(ZeHT20Rg=pXo@*yv|qrs(SRgM51k`M62?8Ke@1Yd1HM>UH*L0GDkH1 zBkx6KRbvp`jN<aDWAdy3<H<;=fL>_Pq}|&h!MvBVN?^&bcIQ99b}pJcwAv~__4UsJ zHAe&J^E=)x4dx&Op5t136N$`akT@JDy)%S`1DcG;v6J<Hq4T0s{(|&ZI$?1c>`TEd z=iodZ+qYtLo^AnKKL`SO877)o=fSPNv4AFg6QS^fwp2|yVg*n(aN!@BbFob#=Ybf= zUx047<L|c_D0lstSS>6aPlca_rQrUo?Ei<a>@gQa4vcUasb!?P+V%E$8|iP#;G`gs z!!5{TQrtsM8|0Pq_cO;q2n3F*i-%-YX2cQ0YCOl)`!>OF$FD4FCU&Jem&18Zpu8?d zzYXXJpp-I#KoXUWfw|z^8uq;bo(oWLhJG0qcKOP2R6La#6;|*%*qay?uVrPVvDb}& zA+UoGIfxRCf<F+&Adlb^|K0%D-M``&s+s~{Ip${{?*_gNTjnhb1A~XHB2%$j18%)H z-T6D7f<{9f#1;TmH_vgn!U~H3S+X+gA*k7GkKyfz<S)jc<w)NZMyCD$M^XB%o_oAM zcOBYk4G~K)L9Qew5TP4DR|??rBfJJgY#BoA`U(#+_yLs0BwlRdZ~n=wel7VtBkS~E z;OcI7;+&@82Nb4a>zVOcXLO<leDnTL!wy9eAZEM~gOfSsLLlaP3kM_YR5cZYnC*U? ztjoBaSNrkPW>y!P(k^fZpiV(k5F6{5`7)YANyn2-s0)6bn(nh-`7U<TU_PcjW`|3Y z?xjt1;>|LD@mZZ=VJVu<4~9!FEM_TbI-)DXWnh(=sTUoB<-B6rR+7<x8kjp3-eUvB zcX%E}J?8q%y}}EI;TWK?8UsfaGR1fCkKKcH<}PFmvTZufj0!~(%6@l&B6)kkMu2b< zRc$dqCMK;;u20%&*Bz#A1H&N#dX7TIb9{}TYjcs>)G{+!X-Cy;{*$6ol`It?B1-ig zu)C$F(-|1a%wvuQUjGXFU1y)thFZFMfGConP-NRU^AL3RIrT;qfeNwvEK%q~=~R*H z`knf?N6|)(^P(mQgnu2+Oy1<f|77c+g=<)4(-`^C@>po~wi;Eo<J1hfO#Odr-(`9m zraB$iwtT&Xm)wg<iw^KDgMuMp$n_+FRd68w-^G22S^TZjFp;H3X8pe<wL(0aj*ZfF zJ+OhKQ+7K-M7bhujL}yhT%VrC4~=5-F%=_vmTP4SwvUI8&yR<XrN&gDD&bPh9Rf!_ zRXXyYgFd+&+-Xx<*hbAjcN(KxFyw_K>(qEvho;=K55AEi*(0!Yi*!R$O7f=e{VF33 z4BIv^LS>0*-KUEUV{`5VZ3H?;=q3onCz?$Dvv%J85Wy5lb`$iZq^StBd>A}J9cNAi zb1w+8Wb{F(E>qQwE+eJipY(v2d>0##$vj@YRh(;J)6XVLOn9}op&)(N8Zhe*moLR8 z0@})#)<Z7#*0NL!CSPlzSqU%!#B20}jL<})W(c-c!43}J;TvL_dIidw=y-1`rfVb% zvo!(i6zMO(2_P9#oMzJB5uqApL+E{Q{Fdv2jlY-=x2hm<+a_x26!h~by4ykM4)Uw< zUX)Io&*+Le&m~Biyb4_*k&1NFI=ZVmEe1~DqJX_Gb8s37-BQ&t=B~iXRndWuSuFf} z=wR}waF`d=Dy`r+Ql690swMQ7PGFw&BsA3V9&b+v^XylhP#)s5vvKZKzQVp0jjOBm zU^&>WA_bE8nC*aK+b_HX$uT;fblIbZ-+}i_dHxXOY4W;$A@_Yd@sc;H7@AN3e-?Tn zhV~%u-WkZc7v^uUH+N}R-i5nHgkkAvF@alU)R;9W=a<;D%5CB16@%<@H_zGvN9_SJ z(d&EXdR|OU4@uLNPK#ujj#5^fP7!RpI*amBbek}DNWgep2$lfuC(=FM_Z}V-_kepM z(gMxlu#6~g*8WjU-R5EnvrqmSw9=Qe9W&u*!$(<*^hyJhv#3uX1t@L&eK?;bC;276 ztvv~?xbw*H$wQ^sIl9Kja{I7*mg5kcLB}9lQP8Lgi3w(}(N)kG6`xEgk8x!OHjl;( zsRNswlCtM*$UTce-nvHk&6o_nt5C^<wS2o5JAKf=#ZF<Ap$@{X0i}4vR`hFGR~q+y z@JH*ft?^*&FBWjj42#b2w;DV>t#Ve3U<P-<P<A9=!Bl0dk^c-VB2OD8?WSL1JlhoA zq{0i|+60Pe(Vld~@~w=({-iS5Airb^4mt9*^1x)!Hjgmo0lq(8yamA^!7#!F`K3$P z^ntAzMKBW^Qg!ko__HxTf)XP5Q4o5?3ht+_;r$Qu`>vq5^9jmYE3YcqX<>tvSDrxf z{wHZVT#~$x_lu?-r|XC)Yx^HqilG$K!^;oSg~QnEaNadM{i^&V6=O+<QXxG0N8Q&D zv)dy6`;`fsX96|*NL|Eg+Y=$%UgZTZ>L~l7ldhs^U~AWzt_@f~CdUgKlGr%xG)&YT zF%Og!ES#|^6dR-RB76UVV4es_#kRm0J(qMOX<5ARVUANifI%pAG6XAN>+SGgi`|he zaYPcB&|INkfvbE9w#E~UL>eJ6zycoJqz13M9qv}SaybrmSiCOnCy=URyi1E>Xsl49 zheIT7ig{tW9Je|Nw39OYTw&Oa^*0Rd9bzr(QG~sy*$<6d<?}f@*Ggx^mcI;>c<UPQ zy=<EHW$53A#ipHHh9}AskzEQCMqoY23t>SVAJPjkP_S9;X3y1bjm)jd2wK<~n_CZm zcq#!uGwCN#+G`iAIU!r<w^?rC)C|p?A5+R+Mb$L2TR2fZyGtsYNa7xwNaD76SPcUj zeZ3&^<93VXVc$c}P!B<I9(7*`UIsTt9x;krQIpdRy_R&&4D7=MnSeB78g6NG2X1R5 zAPO%{so0bu@242wmRn4+#d3%2ys@;J1xl=qqqqam1z3a9)`#V{rv#+OoteFgd`avQ z!(B<Rt0kpgPT;mA^`F_6#A|O$LhK?A$16M$D3d9M=u7QZZQM$L4r5PNFKtDQAxaZ~ zam!_&NzM@oZwxkyM=^eg*w5}&kh?TExkAz+b{}*o;eERb=Az)v&UhE1q{K=OVH3lV zCVJC`Wj9#qYd}=D?+tR;x4u{U_dCj)Z~?SU+ss#AvrU?qaFMhF_HGD~v2YDP$Q6Ny zJ|v&n@8CMNtUP-8fl=1Lp+#2g{t87|uiK0b1Dw0bS}3p^X8-<Fj^`5PN<L&W9BkP{ z>a@cVOAd@PkX~Lhd*Q{2O#~j>v#STfe-@lOZo4P-IqNGr!Vj!Fax(hD^)`s_bpSdh z*pGM&7qRD=knj!)elBdM$MCAGx1c3T^TGmc%l%M55}%jqG&rqROX_R=i0gmA-FWyq z;%J}9sZ4aLs1$dxap6LXl?%6Dcn#$D;9+=OSDs4=aUwD&#y<)R5E^m+eLNq&1Y3Uz zJxRhGuZ@9)!cLg}hU0+Oow$)2Ji?H@p=OIwR3x|G{JLHCVXLFD@%gx%xKb@&-^GYf z-F3hU<~_x`Ow!ocbpddnI$TmtnUiqAnTi#eH@&CR?6i{Lf<0-vvCf|-XDf>Oro6;i zhdHXugXN#ukqR$D8T@fZFCvz7W@D-a1~2RtKzI*)qmeEXW?w_tP<maxgvEF>qKO6% z`EGd(ew^M1uP)W|G{n-YQkB(7cv2HdE0B})2pAYP4G`?sy0U?Ja1nvUSS4EFm=U#S z`@&J^lxlor+y{!3B_Z2%yicBXO84>U=uU|<ufm=<HbM5patVnL@86QI)uVFlSOAVS z;Ms%=2YhDXh;V67L^z7e&$Thp-pp<W+Ka`ocoyIsw*8OYa1ax%uoby@Ial9cLTe5- zUx-ntbF8uVv&tMYxZ58<RC9vgk40d~5PVt$6!`)fK1d?su_)w5Xr2s3ULM+GwItz# z2;A-EQj!V-WJXSAlbI6UZ6rHoavR_&38nqGaHx|n2#9Q5=XIqbPO+QA0-nZio0529 z*!__kva?v^0r+wZJc*k_)tH0PjIquYF;l?MKzbYx*v&n31lJ0QANVCWcjLgu{`KXE zHBdF)#|M%6lz8t};jr&=A~1-Vr9p*8rR*5#T=C3Q+in!}PhjJaU?;ExVG<Jl(VT7w z-DYkCj+F!MS~e{z?2jnN4#UYd*D0Q(o6(gIng{0dZ<{cH?RG|#odf?q`nUHWxl$9! zmoAf?+2h;YQ8H*2P!wQ4T?};GBSF01#vTTqw>%3vye_P!PxifAbxD`8Z5W&GA(8C3 zK;G<7M&x*kejm12Tq}GE_o~2xFbrqLh|I)lnVuWA*N5sljAQa(P@D8O<xt=<BQS;& zPrxAuUAKX>obO1vC-84>m!N01jd>g9-)IEH?0t)wrk4PY!*L-R5Jnn!o8dInb}n|q z(;kpl<KQ0wXY;L7v2O7P+j7_N4S5xqQ1J{C1oae~kr2DS121|N+nu<C&0Tjrj?ejG zNc(NLePfrJy8t;Y|9Rhpu8GQ1k0v~hmp4UQE|3#~SpjnlloF`xVLpr#1w$c)%c0-S z-p0iqYzEwGVJ~3yXL<qc$Q`v~m(&nt)Yv0{L^_H{wE&c)1-Hk=W?jI}AU_&=g}<~T zJyuS^jW|2{Xq|ok0a5n7%Kz<Mn<aZH;1SnGY*?5^LP_Nk@}70@ZoiC$#tu+@ic2@J z@HSN2*7w@YaaS;3{yrD3GNHN&ruAc<`@$>WLt^ZV!DOi4to(<29MqhoUpoOuukUY= ztH9Bwn>lewG+3$7LWsuXJhTi$Wt+_rh8-m7escC2$+dWPEbt1~-n5dVx`p|Baf?ok zD%`<?oJ%?PN2<!dcmtK%8!0wnxeX0roU1r<w~*g$!(Efcx9?d6ICfxtT%BqPZG1{% zCwWEBy$jG)uWW+qv7LMnHzdN)cu_Q|v<J#Y$Z^56p=V3dt;#3T;t7n*nv==123zMh z(sXl0)e)2~($a5X>x<(d2A5*gXfjHy;B$bZR9ZU9>pIdqy;iiE4l_5Zz4ctF=XN8S zn*Ic#h)xXk7evEXUjH>#4|Qwtw#p~0abWeXn&}?H6RNdagb~G&PlzQRyO{vn8)W** zL2coIT;xKIrvJ*G1`gXj_iY2;Wq9U(;)@G4P(^wXS<9;tqv#oanNa%ju>nn3VWY-= zlDisJ&O(o3HwLuEe?H1~$m$P;A?y#R94{Ge`PQO|tfjOWG0FoF7GXMt)FJ{NIa4#1 zz*iB6RdIy<xXH>#@b)q6ZZ*UdJ=sfHz@oZj!8g(}me#8zN)F+`+G3-^AeRk6$HU$^ zjg7a&M?1$yenocR#-47{BHRKnJJ-w~P2za^kYyX9x!J&*D}2Bzc-9HN0QZ&Iq}#xF zIcHgGaf>uZZh&0r1y2ttuYXw)^G!`Hg`Rpo55w5O&E&kY?f3RbU37x~A~jZ0i~gcr zqjP29{51@ITnlzec~{$SXTof_pEcT$S#?bPA>WBc;Q_qeYCtFUSz~_odh^#1E#XH> zO#FXj!a%)USM21O?=XBjiiS}Dr`kRn(j_pGx@4<P<QrYY$?q^v#WrMLUATP_CNE1c zdAV<5+X6HTXIkV1UbmSpw34azO+4)3N-M{vqzLZJb`j*%<psC}8UOx!<fZYgGneBv zg_YNPocbX&T=j{iox#Y!b*I9{c<*l=HpQbM-(~wwoq*@{9K+6CZaD;|Vy59#pXfO} zS-farOf#;HqG(|6r$Znjl=Z+vS9xTP3fMaQGT5!d^I<VM%c1ce*$jUC9;|s6um^tC zi~4W5U(Q9V5S<D+fTL%;=l3pq^Bzot9EHpFZgW~m!uJYaa2<Po`uA(=bw0~;nCUG@ z*Kwx=vxIaZ`_5{=vGM1xPN$Bnn-tEyf-p6UP1p+dJ}YE92Jw>+y&D1P;H%~Jr%o4Z z(kIAtM;)2&;?s0LE&LDTbS2T-AST#}o!|=i4kkhAbaD}#s_|ac5eo|k!JTnJ^`_dv z>B7y&SNXOx;m;#=^<!d2dcG0OMP!4TD^8&SOGuKBpmux@ql|+yGlDzX+EL2RCX$3y zSzRVn_Yu5+WaLkGG5Tz%?$axF%PknEq{X<=1bQEY^mG}gGKAxhhUQ2zawh}hIhAUK zm=g^jYQ^1e!MNYd+0QM08MGFx##zaSFN~Fp>XSmU(ux3}HKh!Lrsj8Z6m_~Xt^C+o zYzVKdNJ8tY?2R!RvFN|wP;PJKWp_?z&hL!f_m0T<Bls9_V<ggui(IN2e?T9$5T6ik z{ur6ZuPs_K@@0ds02qk4?Yyh1{@MyR$=HxGbQa0LOgj+#ch5`N!y;fJwE~lyyn<o_ zn{tI<^f9*^^KD5XWRGFI?ZLb&+;LA{&lQ;WwDngvzuO<w4fa+kCElx9)q(uW&zFXq zGrdBt@}Jv*Eg37vS`#-_GDx4<iksJA9u)V0a`lcO<0k&Yq`b=a1X(CD|4<TJ^J#E1 z+P3Tb=>$%jj62ry7(eKR|EHVti*2fk<G6_r_(sqej04dSnSz68#1RJG_<%zPK{H@( z6>5UW4B`?%CUooZQAnVQZWDyw1O`ROXvl!^$Mq%#l~7#S&~+5pjVq(fGRpezu7A$? z`8~ZY416&@n)}kn=H}dUe&_q=lZsYjMdY%c_90;ns>t;K)w33U7OAu8V=*4=2U+j& zq^)wUItkvQ^vB#NI2J*%4B@>$GD0cvhaW2UXbHNF`mIHJV;?N?XiT9ZrJ?cX0rlRu zl7r;N)I22DFq>iBX0pmCB&)b%c8p2=fitPD7a+O*^RsfB!H`xb&MsA_o}<|rhAz|@ zRLogi{JG>8bVF~CXa_-mtB-RZxR~tK94gnK)eoa`wH3XCHbd;r2I$e@G8#D^Mby}% zc>gN5gsAC`CR&L;XR9ay<838*PSDxGv~dU?j4N(XE3HfTW&3pdEoxWRpiG&gy(Dgu zEvd|*)|IbUW-G+*uvT-9N`mU4Y$xPf(M9QJ#llTAF{5mf8lG`mRvW7Xu7vkUNn9!M zu@50)T^yUua^<sGd+^m(RZ<rfofY5ntUe*bS{va=YCvo&Js#|@=A)8+xawprINQsF zL$piMscZ+!TDqq0rM@ca(mwI$K-x~^WU?(Ksr?~ZfS!6ftArT41b~LX$!&~AvK@&K zdhF9gkS?<51tpNur|w}+F4WyIZGMpXM)f=|b@(R!7{o(Iv%KWcaxo)7#tkM@EI6v< zg8?&=7-{be7;GjoOc_~(%b~QcL+Mg@<zli<$NI*Mc?LNf`jpS*m+26aS#$bn1>oA& z%W^N!m|w94aw2IVfE)fDIz$w_Qfg-TSOuKkbzESLl=rf?ecHMewArP8$s41F|JV1D zl^e2KAyJ{p3RLwjnpMW0n`>e-|2Rd{5Fqam6?W<|pgZ?V&1Q!1PR2eG0}m1~;M&ZI z1pYTJ3~d?bK7+o6d3!9TwnY42DTfKY`Mvabn|56dhS?D@F~z0V75V{Lg+BUvgq#_z z1`R`S%r}t*W@(())kUUE%8CxBIh~MQF1ZuM0u`p`!+O4Q>Nw7#W_%K~ogJvKK$_c= z1R`s{G0ct;?yVbGua#Z1aaY0`*N<>)O$U-f?M~9_Yh>Lye%=;Ny!xP{Cp*|Y57j)Q zk6!B$EQ4>hlwPLa(jKmK(J=~)mTnV>7#28)d-G{cwG^!#HTwn{v^hcvVtAbqwhga0 zED5<AS#mzDi6g{mS8KCZ@SzB(=VydB1zCJR`w^hb(iEm=i{xZZ9;O-{3R><i3-u>K z_Jrm{^`VP2CDV)PtV1AHMI{5;PEb#95uk|hEqXvEx@+umso@DHo%xz&v2s^$SWj<x zGgd@l`3tr*1^Dz@iOO^jN@9wom747KIz*yC*qtw$Oxn@AM`4`QSnhl5`Vty<=@n5l zEP~A=zV2vbE3@>|V>016q;$wQPZKmh6EkP--)3vnO!2cDDfa=@MJndg5WVS(4HB*7 zIqWUKl*Q3<*j<|~NUn{Yg!0G07yhvEpKNz_x@ybjDFJ{$P*MAisyz<PMGK|snuKG2 zCt_nep8P-e2FD(wU}~m+dZ6Fq<=10N>&aNpZ}z5`mv`IJ8X)MoHY3bwk2PT3$KCOm zEyF_kjgL?#s=+T9&y%q0D17m7OsfE2Ex#5d&}LkpGODDkDdjvih5Tgk4h=1%wbcYr zYai9HvVG)kbP8tY?vy5BUA{SD`|^L=>0u3seu#S3D<{qF!s#iB^}4psr@`sM6mrX0 zF!QKGPi`<{8T}!ORMV6S!epYm51QCYFG9+nK_Yf<#Klf4e<n%w33TN+n5t2@LA<3c zXdV0R?lV=J!xK834urA`C1T4eG>Icu0)-IHOOXq}FZZ+4Ymi{3rho8My$E~y4q$hA zVD5|#m^0_3W%Objg5y`^*criHB(3}XrxM^WphT>cnPA3t@l9jC!gCMIc=REf>QmcE Kx%&PS&3^;9RVpI@ diff --git a/client/resources/hardnested_tables/bitflip_0_0f5_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0f5_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..7102292c43f0c4bd2bc54580c07a82333ab32a8e GIT binary patch literal 7153 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 O*2IC6C$ig|>;FGTjr8aM literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0f5_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0f5_states.bin.z deleted file mode 100644 index aa13d9a1d994d164af75e26b5c4c1060f7bb24d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33164 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 M3-Cbm<iEc6U%5Sy%m4rY diff --git a/client/resources/hardnested_tables/bitflip_0_0f7_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0f7_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..4da9f85581802755a7f2ea66fc6497073ad4e7c2 GIT binary patch literal 1983 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%0DB(?Q82a;1XJdz4IPe zE3HJD%yU~#>EVbr;*KiA9%FgtF=dcChHDyaF7865GT84HHCs5q^h%fp1*$jQZOe0r z`k$p8r&Z^(QvaHf*g_aLLPPYulU^i>8<^kz0!~b??&wRc?c+k_fG!@d=AY}BNs@X6 n8wDB7dQ*}>-La8dDN#>PtkTm%Ga&JadES36w<yau`JDA%v*l>s literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0f7_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0f7_states.bin.z deleted file mode 100644 index 6d19ae6ae51abf2ec24e31e56c7706e3c76b2b27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17201 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0f9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0f9_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..476895cd19fe9e94779382d70fb4e6d41c175619 GIT binary patch literal 3834 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0f9_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0f9_states.bin.z deleted file mode 100644 index 2606b940920d23a46282f07ecec7eff2029ea080..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28243 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 M624Xb$lbpG1yQQepa1{> diff --git a/client/resources/hardnested_tables/bitflip_0_0fb_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0fb_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..39a913d6471d13473e8e60d8766208c0fcf912ad GIT binary patch literal 1940 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0fb_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0fb_states.bin.z deleted file mode 100644 index b263f23ae0805cd6975148866a68e6671e2f2a79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15124 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%0A5JF~(Gf}Dm`BGY+r!{|xk2SHTF^^$rx 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 PvaXzjZ~bQNw>JJSFE1*C diff --git a/client/resources/hardnested_tables/bitflip_0_0fd_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0fd_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..ffc3cf53955d76b67b578c7051d0ac663f04f2b2 GIT binary patch literal 2702 zcmZ{j>r+z)0>xw1gvTAI1d`mDh{_`&$sI^8cIU1IT%~~EEeIj6-2lnWO>FJVZs;-& zl&UC_Kyn8kA+J_^fQUebl4z%?4@yXK$xExYwp2Tv0Io%?uHvIxAKSHmz@AUPnR7mz znKNheU*G$)Xp@2?R{Uw&RYYk$_v-0&=JnbP$trmUg|dvYB10mntxdO5C@ZIsIJk%M z|3ni~P|Av_*Y<J;g+qBm^_rH&D0Ip);cKGYrX+Sy9DmS1|45;KP*PRd`m7yo+=2De z+1c+o*OT4F)Zutt-?4=^*KQoGt=n~{R=l_LS9Q|wyt2ys#Tm_IL0k`wAjU5rD0gaW zeu@g6rdT}S4?zgwk{BQ?{+SQ<G^Le%hzcjSjodgsB^>%e7&cI4ovBIQ<9;5AiUf<w zY95*T<3-s^?kn!axit#Bt^0|z>~Lhh>9|Mv=8KB6y;*9lyx715JZ?~KU)odg!BEOK z86~Cnb{Ut7R=bV`W@<vO3hw^$E5CT`#(|4|(;f4vLeK)X$S#DU$t>5TM9&i8ktObq zF;f^7I$`F@4W&!jD?-t9SRT!|(tfpXe7|x_z|z^7&8W3>XZPl>+l}wWF``r;2n$}N z>#)G2ZIdO#fvG$5F7z~FPsJVcvXm_3^mDt9UCO8lsG@l>bV3812@92wo6yJG*4^dZ zJsEEp9j1-CG4AO*@(Cd+l~(L%X>mNPps%U>h#Q+6ddeMW8x7wc&v^ni00O|CDoYDm zSkX*!wWyEOWWF;o_co{x27)$e1D7gA$F9rAITAnj?k?`N^Rf#|vMV1~$1dLMxq53? z>WOd8T&lb;Jc1q*EtQlPr-b8?#(zll&sUG<!!gtog}&k)AiKD;{NHQ4K!t=ur_@}t zNv!xBz~TGT{aJGw5rKvCkx`wB%~KcjRi~fJ3SuHGoYJAUB<hEJ#TolaRvj)M2q`3} zB}<0?W+KL(9kMd`k;>^o{&0r8@8u$i%Dv^KUHQh!;EP^C;eb16y(XOBAnrA+W}Vtz zr7;67tXIEaek1BCRHCj>*wf6;FJz%JrCm0*7LN*qQDQ>_yO4w2Aq$6&C^tZ@NtPJq zaVvznI+aI`)`ztqqwYzSHGm9Z;&s>vhTD@myS<~+xG_nxb7XevLPT4g7CEtRO2Z$g zuke~vSmV@I_;SxTtJ&oOh+wIv{0vr6PeB5M@9M@St-QWwI5|sX3XmEGI-D*Wq4S*e zjY*1i?P;5SyK=05ZCG%B6JB1vb!`J55p$_jiM1IS&pr#MO&?ofoDlPUR|ce_tfksH zX)Sy@(kf0<Bp#9r;dNI*<0`8f^PUn5a%UJiXt1YbVp>fIpPewl9wR8hakf+*@{TX> zF^B<@<>&j@XkDDX%yf#LoDjAE7dyHmwXHdAJn=q}0hJt%6mPQ|so9*&gs9N##7QvM z;fH<As1y;+q#(o*R+I|QBd+-<TON;dYE7VYbK{C(tiSK#&sC4vI@DRQQaIR|GY_9( zQsGE7?1Tt60Y`jxzzfQ#*=MK7tvmu4u>oNlUBD4TDxc*9LsseAP;;cEe~=Cc&YqWU zn^RW%*^=2Q7_a6qP=}`+b$5cbvzFNYAouSErI@V&QMcBhK*kcnq7=kyr_w+ROMPhn zcD7K{5kAxx^RwY**sG=K6sq7sw@su3TS6q?i-zW|8ZDpyptZ?8p>qwk{2w-O!D>>R z7xJ%aCIY&uh5UXtxAJf+{nGMFBBB%+PzAMz9heUb`IA|WDY8B`;0Z<CEV<lghDZ$* zLbSHm1+}P4MyCM^y)uP?p-vi&!2vt7jkF9u;`MsMj@S%C30)Q#WXu%Mo<1)M`ptBc zDz4Qa&7=;(V(#g{yoNU&1@P#lyqdRcI$?}(qND;Oh*P*h2XFDzW2PXZ&R)qM#t?~5 zk%*1#jIglqK^57erSqnI4t2nL1U{NpL{Ez45@t~DhND9_0aDvfpdr=6`)zE66dBHl z2a!+^w4^59Ix{`Pq&6HrkL;Y;5u9z9h{6$1Sf@3BPFoQ#bq9UPWwob^_sO@K`uT2! zimX>@_QJc~Ct~tK25J%6#G>{CpCiK>=KI~zyamByr&FXA^;)$kJl?0B^$*$b#diBV zDvX`WKN#$}*&QTNWiz5gs#C4%DZTauBlX*7Uw!gy@?XAJwC_GED^M4|6EsfzZr!t- z>E&vPSfFTj0TeY|fBv=p$?B6O6`yFA)_hQuVr1|BLUUl{uaM<I;xtlHp85c3Nd5PX zPr*a83kcGG^ilWMRuUq1Zd=GJn)x(c6+6~FZV>1D_x<+$<%{=jHEmdG-2TbsLa5)y z{1NU=ZJlUy!H?GvyVZ|s=8L!|+NI3E(TByMojbW@9}no=?a_6Cx1lov&{@ushhoJB z7<=B^ODkRN%p3%or|12^c~)UoC|XkgpG<T7TqZp}NuzC_y3<Y@(X~^N1@rtzM~x}I z8?avh`T36)dL2#bCk1dz=FguOGnDO(6%{ps`!Ac?hmE(J+HUuAe`>G$c;*>07S|FL z`<}Kpeor5|ap1K7-mZdo7WFOjI^1tsFjTO93ICT#f01wBx|Esxt?H{SFPO}U=S_cG zn%w@~!^djpZNJ<4oXRe#SKlVvj#WNtx7?9kezp8+qyHB6vUA?!J@DbvM)T}s-q1s> z9B`)2nk0c$WR8aUQ*%W!YxMLBi9bu*r{U5btU)$*u#7tdZg@0^w?XpAV8@)Hr0eDP zTf?>#>(%DUn}D_ryj5_cwQ4bZ>u7nk9Sv@L1OTVD0u6l#ht~Br_7wSSeh>=ZF!^IC ziF+}!40lQKw$6gLM0y*NZ^!TFJB1C|1B-k1_+NIE$>IZ*?Ny%r0oS3<Btoc3M}=l8 zB$bFaVLP@=%h!@Qyv}W9Y0uJ_aeCHZqWlyO=hV5VLLj$84Vicrh62)oLY+1*jC<VX zWZ=vy)Z;Q|rw67;P>pxbq!-*CP5qK*a=>B5p+4uD%$$}3IkmTV3eGAq#Z$>ntlt`z zl(n3cQnJtHngm&6R6LsNWC_FQ7~mRQuamwDi4+<Rpp&mONvrVW3;=TCVLWW6mf4^_ zMlL-|66C7IE3*?OIx~O~JmSG4s-T5~`dJQQ!XrOZxHdq7(%0YCuwnr0wg3(v0ot_J zPR}vl9Io8f0*V1b$O^FB5_&?&rr_(OYNw({!?SjEnG|Mt@bv}|Oej!cL~S*orNEE| z4ysL>!ZeW@JXi>5oesGg5;+LmhR3v~m=4u&U=na!yA0?E;p$tYR=;s#+MaeKcT3z( zE9>Y_5U1?-T@55HR#g)x&ByhJalO^YfLIQ<T!aNh9k4$+OTE|O#C13u8Ol#mF_JK8 zPT*b0%vffSjAXA=Lkx)5B{5T3l|wzF^350tPyv++Q%y~rB$uyJ2^hJZ3GV$6HU@|R Zb+^z5$q5!~<I9F{`rPKf+)SEy_&);+m+Jrk literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0fd_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0fd_states.bin.z deleted file mode 100644 index 68b581ee2c793e0f3541a475fcb20c12c74e078e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20509 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 RjVlm<{i;Xd98aZ;`9FT?`hoxe diff --git a/client/resources/hardnested_tables/bitflip_0_0ff_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0ff_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..0c96f76253e396396bb1731b3da788c59d9a133e GIT binary patch literal 1569 zcmaJ?{ZAVO7(PTm*4xH6cZQ+T&<=V6cU|TwgDIb5baWeQ=_yL@uE*RGBQ+HrbBHS| zD?Q6+k5(D`K)R2jDa9YyrkS)9R;V9rY=Tk7m|I|L5TPoJ;bi}SZ}L8Q@+ME7U!Es# z*6VM-jJ`$)iiw>f@m3(r_jq-pCD0ylB6?G9bN~<#2803OuK_^xC=eC~$ZkMW>#qPI zKLG#`w6;$spk@u89R7y@&CM$RtHEQ}Uj>3c1AwU3rY*JCckRLs%w|s%d*VN1wp1N_ zM>^JV(%zN0Vh^hRFsf{Hhjeu3*=L%U*AWSJYmRayr@aJxE~{#6IlyoG#b~Ve2{P^W zIMKz*qUc{w>KT^qJoPZY@x+avstr7>+l+bGwoh8X-f`TbE>+AGUX^^M+ox_Cs!>ZM z?Il6DMFj36Yo-tD@+0G8r>@8rg{K~sOdUGy%bk&$FqLy=z;Bf;bo}FP=<{{(1SQ(~ z3g=3WU-Vbi#Nzqi&8*FtI`*$F<LOI@$E)dIA2m#E4;j1i`RQZI3UheqHV|OHOZq;) z;{FC`%Z^%=XYs;xhCr_IXP%A!=W+Ts`l-uoUpp=~;NqFRA3yc5iQOL&m-NxPv*8q% zSemS`@s7499Ilx~$E`sw#Gx9lgr+HnT*6DB`Kh69NQD#m8U)v<U3|7EC9VXTlhnoL zm5PmcKd0Fb)1B#{#@6LjOJJNC7$k(@ZGmtb<cfBMfEA3o9eZ=YXIK%E+Y{A^T0xOW zq+ivm+KEC#EW|S6SCGDLu!k$wyVXN+3JmjAW_M}&-NqPr{7zjS-skQgZ|8R!W69c? zODV$a6jozThYR`I6d1?jg!>DM?spwiD$cl>VjhnlvCVVaI23MlSIQV=$HAG)34?e$ z&S787$~S>7q!$kf&Ii>h#|Y?xQ1%X77dTOn`nw>2PPX^x8~l5{UpL(@sriQQ5)N-a zH?3i=uMVBpw1Lux>2c{ST=)JxYI^y{1HQ`26i$NC&OVsI{3)@ZYF<id?!-13eRCti ztLa@;1v<p{6+Tk8kP#B}Z>Ok-J7gU3mn~FDd6Op(O;pC4{yKR$RsW!1RZ2Mj?qQ{5 z;|lNE<C{gP24A}QQDAV&<~a-Yt?fB%+MnXwz3|~o-iyu}_47IFw;IOZ0G8f-7Ez80 zBjaz)-}-IE=sDu?#UFSy+1c<?(=43X7RlOOD}5F5&1J!|YezPo_~TIK#_u!lD(s}e zi7&T(dBor=Q$NVp3Nqf^b1##>WZXEp@Yd;u7Z%YD*JS0Ux^qjyPv**e_`}JlrG}UK zMz;NYQIqjQ8xLH)n=#Z~6h@h+ZnMUiLRR?a5o><AYPiF?pY9v>G+*8xv2wFIZ}055 za_Ie5OB2gU_(v<$*{)EXv`RXkbILQnnT2x&N(aRUUpQ_pz*yT_+`3HAF4MCS;xMbi zCW<2JVN$&A7@IH>O19?ek}a(TOZS_zR@p}Qz`o<v?rd#xmm$<l)(=qb*1HAxxl#d1 zn0qkRQ~LA{dNYSTb@uW6VnLZ5IYXlSbxdJW?VyZxZ~{S$qFhlf;_*SH8$C)5;2#vj zXe)vS!ZI=@%dBs-U+uAo5v8{mVF{2+rl_?pSS1#k52^+U)WXPPWI6?nSQHp@d@!3P z%9R#^`BY8|Jd|5UU?XDC>~5yhJo@@!2iXE?Ls<bsgOCk@qshW3Hyxun0h+N3G!NyF zxDB;lt6UB%sKl1gmdGS6$YCyohP)K!(V~VV%EIn3gt8_^R~SPO498sCVD3d6y}>l* z9PoAzDhA2^(cRt)a>PQ=pu^JYz2G&mgoX8b-2}tb!#Zk&hg#$eM+Y;IN3|wENXA4a z4QRTBSsD~p=;7pYWtwA9kk*26;F^WP1v3(gOfq-!qo{$aPO~l#B^3zhy#X0O9gOv$ zIy!QF^ebpxR7phPGh^pX2Xj^Cwd%?aVmD#Qp7MRzu)V(}&B>uLXf7wiND<81KvSNg r1qlTC*cqxn&Dou1cG@7ezkDZJZ_z>$B?kr7Eyuo>i|=lH@)G_7KKZP_ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0ff_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0ff_states.bin.z deleted file mode 100644 index f73f50d8e0909541c07bdbf2e1b4e150973f230e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10894 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 O-uv+7x0f8d>t6w+$F<x5 diff --git a/client/resources/hardnested_tables/bitflip_0_104_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_104_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..a5c2ad9bf9770ff9abfbad766017373e701e7c70 GIT binary patch literal 3524 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 LggUuzyz>752-^lg literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_104_states.bin.z b/client/resources/hardnested_tables/bitflip_0_104_states.bin.z deleted file mode 100644 index a65adef0e5627df6ebc8b86efd2fa7117fdb2fd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22230 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 O{asrCAp4;YC;bnQn7#x6 diff --git a/client/resources/hardnested_tables/bitflip_0_10c_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_10c_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..e3aa0c2b5c7b18b5463bb84001491ca85577bc77 GIT binary patch literal 1230 zcmYkpYfKY&008iVu4mi(M<{*pCqY50rR`ndjx4cLv&lnHdXdpmJeLXF)g^vfE*n#< zj{$wyQX*AD)+GiNk%}SR-M3EN)?TluV;^8yj30=*>as9HoDVb*H`&+yevO|T{eWsX zWc3{SyvwqLe0BfKsU`eYByv+@vmwYH&667w6E;MnK@gjQtt0=_d!zzEEe-K|fUE}t zD*csvM^IRS?kS4QAE{RX5U57vqxBU<VYDHRaPL=ufz0G&ysiJ&&vtu$_SZZepBj(v zj;_AbHDZ57Cfie6k89ihE(Nyd)w877Nx`v@+dniuXm*?mkq)k_nl~8J23^=<K(}#D z+^7hb@WFFfi2KoJwqOG}ZBUjeCaE4O3@dqF5ELa>uDi>&9S>eq*YpQ@DD>tTk(nX% z0kbJGi<!>{I<qmDgS{j-YlZ@+TwuJk+x^<K;F3G|RxH#YosGY=1Vm=~bPHxcsV+cM zSuXYXx-_oTb+~uxI<j6u9i>2*?%*DlW6ij3*)T9g7((R!7ogUdNq4i#X7*jv>slrC z^89Oj-Y!jt2rJR$$Vc0Yvw<Q>NP_a2waY%Z?pxV)|4~y0-guM1A5@8pr(7#Lca|^v z0vUhFYTvQVnf87D#((D~3YBmcFyeFDF$^^4eSpj?h4>3IA4?ZNPxWM~tgi*fj4fzc z0**oW(G}DIw$LqPg2vTDa^gTK%guOn0!31|%1pRx2U5n3rTJmcgM*EvMbGF5qd{2` zRiKUIglw1;nGu(vXfQ%;XIcy<+U%eJCtovLAWO1gD3bXwypjVnOA$WQ#7XCdlFjmz zwKN|<%Vd$DD4HP|6q3-oJxFqNi*|&D7R(gPvRn@M&`pS=fa_cvFb&HNPuXLbe!;=> zIViR^U8TZQ=Ta(~J*WyQo?vIe{?bGn4?muszsV#4!}tI}^e&U#uO<{I!u;t`mgjtT zgzl@0o}mO)A|7+L`s6e(I-LiAPk4sSs~32#uN^7$)jVac56dE+o@rK+?-ja0TmSj_ zT`GOf6xgUz1^M&_Ot)r6s~X>2E_zWL`>m(!T@n*dV-x+u{=F}(<$qA@aMdqwFKxRs zLIb#I#90Xwvs6bIm)`KV;pK1FM*lfsT0ESS84rprp2XJBI(A{Sc<EN%;KTJ+Ed6%e z_jYsfa?h8K_WS4Vb?^Q2u(_Pup-sik0xmBpX{J`bMF6sA%d4vRN=f3G;SS08WKub! z9r}7+x;^*6Tpr1vjh>uatn2^b$+HhtC3^qe$<d?TkCV;c)r;N}!90sCb!4Qznnen9 z1cd2_c8MhpNZ<T!(tFRSo3H6TYVWF?Qg>EM?w`K!=us1Gr;Q05$$FcNS&9*a1oUaF zz^siyqHPvtBa<*|qE(1+GZCNJOYG|vG9wtkfH$V&Bssyj0K;_>-i8>AGIq<VgY;Hf z9T$yKHX02DG-;s4L$2a6K5ZnGbC@w-YYGv(`%{y%a$B0TZjY6TcrY<W-Y7U-m;uv= zNv0`?TD3VnA9h&r(kw^eTDq4q7mFN2#-MtnA#4w5*kBrZLXqrXU_JKz)=Rd1J8=C9 F@*fS<<L>|f literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_10c_states.bin.z b/client/resources/hardnested_tables/bitflip_0_10c_states.bin.z deleted file mode 100644 index f9cb945efb383c0da222555ef712d80869addc5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14808 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 diff --git a/client/resources/hardnested_tables/bitflip_0_111_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_111_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..8cd2e0ba04289538fd82541fe8ccda473d4fd259 GIT binary patch literal 2568 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 LYtFu}t}Oc>T3VES literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_111_states.bin.z b/client/resources/hardnested_tables/bitflip_0_111_states.bin.z deleted file mode 100644 index 10cbb8de5f58c7a99b6e4a64a775574da00a9481..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18193 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≪KH;HM0M?PrAbT*8L!5hbQ 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 diff --git a/client/resources/hardnested_tables/bitflip_0_113_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_113_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..c1b73e1cf088cb8bc3ffca8623eeeee29ff0bfc8 GIT binary patch literal 1352 zcmV-O1-JS_T4*^jL0KkKSu##sT>umc|Np~X9UbwXuQ>>~;~$8Tz#qUJRS|$4T?hbx z062g_{E6TRzW@LL000000005N13+jR02*nK0BF-714c{`7=Qpc0B8*ZKm$!O01X;s z0BFgA0}ucQ01W}4XaH%ZKmnsnfDIWiKw<y@-~pgC4FC-^$N)5HkO8A62n;{~8~`*1 zfuI4VnE(cjG5|DW!2yT>0Hmmh5@d|gO_NAHJs{L+wHr~UK=gs9siCIP9;V7^?Iu&o zeK*sg0X{82_;Pya^~|yO5&XtIgm{r(aUQ6cQ-mIfbr?RN{A=fQCql5ngTP_<U4yHm z@IU3$>~@Tge9U8kd!z9TUW(*ok9`jyIXxh7RIte}O)HUE7%zE!mS>pzhF@WJ1Kk-N zp?14jp6eVdhvYbLI*z0Jod*i<Og-cBJC{;>hg7^1FM)JllzWbh$3>4oKIy?O1mH}L z()L-O;JoRRpbm<wguXWk!gOD#%l5f1$}v7;D;>!33U@EMhos2pPJ!TMV;LWW<gQ4) zf^eu<JcAK}<a;9u{n3Mw!r@2nE>|Ui$il-07)M3G%a!IX0q>uT`@^)mRb@Ma&iy9~ z;7nhnWBf$z2aqtZ#U7GZ0l^*UaOfeIw!DSV<jS)uI~7rkqp?!+mRNFE3no|@OtLH; zs>jw{!|kIO?>ZJoaNw}UIb1GNgDwYQi!Q5_!<6cnGVoj(i?E%=!aNo}gS>W_uyk}g z(-scXk;%xrmqf!HGWuBPSaMFQgB&<HbvSTiCTA`j6!k&iCNLio!t@3MuyB81_eZvJ z9x-;Od3PCm#gOr?RxBqA7mU0?+8h_Ay=D83i?BP)JB(Q6W01*sgQ0LbF^m1qg~OrI zICzSC1@J5xGZ=g4$Z~MMI(#Y0>dMRNtYL;&WIn3$kMcgV+-7x0=6<u|c8*Um-VVq0 zoE!#UGWzEM>#_EhTs*H6hv$Fehpvi$!amBv%M2J}4^UpXm~=*1OqNP;v4$8h!zjz^ zqTwOH%PdP6lPfWqnPV!esZz-<s^Dc@rF#Iy>jpRrg_V{rtA)bg;fy;>aI&~%`pcDY zXXgDJxiQh7q3pb`zJGhQ+Ij`tz9G@W##uNH3D|op{MRR9;CpYjFR-VA%v?Bq@{de- ziPaVA4pn%`fs(|(V)+*bQvOvkV&NGvmL_8A7)D1_>c7!`r^fF>?-kfQ>i1pG0z4Ax zxL3k*zB4B%UPWG@!w$nNWtRsAM?mB_K2!ECtL0egyyKwc|5L$mU5V(bJ*2W1lrW<X zguKrq$TG{Q@()$QaAoZz&J5tZgV7g(jAIz`r^0gjhm^XEzE`U6PXorhftF86^Bf%# zbzgb%yr<%OPnrJDk=}R*jLDY?IAZZ9Bb37qRb06zlg_uw>~<9Ohib<Qg<+MJW-@lH zt_}we8>;9(YUtt6`JQHc?p<9>$If@V)%K5}3QB2E7ty4GrSzhas8lKSD}oATkOh&7 zVq`>PBABl?2wWt{RK;agVPd70P%M>Ul*$ZK6-y*!Rgr?GNXZseWlUL8)J90e%4&=m zOw3F&OktHWm6lAH!enBsS&@Ze$g->|%*Mrv%Sgr;$}AX6875372BBuDV+=7FG(m={ z88WOH85mfm2+XC7rVOF07P3*9lNJ^rv4%4;OfY4cF*2}>VOYVHg3K|IV=EXF7|bRz zOtM(TR!lL4hC*gc%2O;xF^r^TlCvu^V;N&GLoiIj#tE3S48kTbt1^`tj4?|e{x0N- KaG@Y%oVdDvZEi3C literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_113_states.bin.z b/client/resources/hardnested_tables/bitflip_0_113_states.bin.z deleted file mode 100644 index b350136d53c7a194051993814fb8a70f80f1f6b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9176 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 U3|0e$KWi)f9=q%Pc5(Ip0dxQA5C8xG diff --git a/client/resources/hardnested_tables/bitflip_0_115_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_115_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..464b2e5d6d892481b23e18d5f55368f9d9fb1b4c GIT binary patch literal 5503 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_115_states.bin.z b/client/resources/hardnested_tables/bitflip_0_115_states.bin.z deleted file mode 100644 index c6661ae8c670c63838fc947201659b377c4ec478..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27783 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 Gc=hjxV5W-z diff --git a/client/resources/hardnested_tables/bitflip_0_117_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_117_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..87f7542d37b95ab83a16069c551561665b434711 GIT binary patch literal 1888 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_117_states.bin.z b/client/resources/hardnested_tables/bitflip_0_117_states.bin.z deleted file mode 100644 index 647feb09fce58e1f38df55be95786d89932b7e2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14119 zcmeHue{>V)nXb|_%kHLo-E3|`i4)W<H<u=qIEe!eKg?veZMYkfbrT8>7#O+)956&B zgczgPAA7r9l7LZDAchz`X(+g0Y=szOz!o2Ezy=$80>&2DSkqX@1D559G)SY-%zW>C z$0me!+jI8ZKlgOz7-4xd^Zk6@=Xu^&>$)SotJ;H)ZgqTi`P{)z)6>tU*IyY|`qcW) zW5-tiwezlvQ|R%|-OXvgz3b@XUvN+ieu1oA0J>TPmiCft=}LADuNsfiSbhfJd$Kw< zkEt~iNSo5rmm1)$0$@Hfhs!ZC*lC&^4J}?X*edK!dG70l+BePRaG11sWX|FSoH`dF zLR2i`$ccP?A(u!s!7-VX9D^-Y3k`Qb6r8>A8(1wtMw|rJNaTEknq@M~setvToG~~- zf+VD5vR8HHk%5VPjP&tl6?`wkC)iAugJ*_|d9|c>shJL^n`o4p8)Fk_tN`i&TUrj2 zU@sdN6d$BI!B)9gb6jqP2cR6Xz-tvkXcu@Ypp#V*6`JtgRu!31Oq%Ct#ba}edM_>_ z@szlzBwEP|&w}?7t6K>L2GJ<vL1ClG0B_VU8oo~ziE#K^CHR?q975zU{D$a6hdJFO z$c1uCLVi{Nos`kFR@p)N8QVmn_TXVtP5(;0Ik=v^C8m_s#XA3Fv!D<q;SD8c8!mR< zBv&-WoE6PC^BIrb{l31P*JT0DZnJv;npvjll8K{zktW0>ulpdV<Ey!e;8St*v8mQ3 z63<|r)Ew=2#x!#y$*jIql?Of&r8^@+BJCN2pUmbLTT2tnwKtXrcRL)8RsGVlTxL1k z={RZf6}tDAQK*;x=0mGv@{g{-I+(-Ku0ko?;g~GK4+hE6+4{H|+L3Y^{5vG-91UYy z(;Q7CMI4R|3%57IQtO{3S$bO|)iBC&W*RI3<*hJZ4fjAFr>HazF*0)Y(IYr0$t*U? z@eFeXqA(!xP4J<0=Sj1Qi6+gz6Wg{!)g^|vJ~x9s#paZJ#@-=UV2Ff9=_JZ6SxBbt zsXeU=Ue2{Ih2t(RV1*HPYl6gM{w@fM&~L4Yd)c0D8XS<=L%Bn-dUm2BReQn6e3J3r z+`O?P6O#_wS=wmS=Y+Crj@9t<p`rLhA@demGbQj?kQVk7dLTGoW?YR=feVZlT0ew^ z2H(YIYEWlzuMoDW1}-S{hU%j**6^HricMxcZgV`iSY^KDf1heB7kAF(R=D0+cE1eU z-p{|vL}?q20k?Z*XP<FkH$1Qq_R^deib`~NFAlP}$l$uRkUA(3ptH~X{Ja4|VTHlD z%>vj=wo}RAsoB`u>M~s>E-(0A)N786YzlT+_EzoVa3K*mFIPi710x|f_5{dzg{+5J z)=XUO@r=4K`41k-;^V8T$-<-s>SI-&3+B@0Y>Ht(b{B0s%*Z-DcLC&ERCbCquOxsI z4=>~7mhWW;L1?hbU@M+I<00Q1&pKgQ+y(R#lUl-ser`K4O|e51UW3XX7_g1`;>k5P zOhG3W{{3e%M4)U1laiw0Z4oq`gfuv^0|pw|@qJc$F%#bxNdn5?NgPD_TT7Y-qb)N& ztE5UcJsS9c8Vq&@K>7|SrubtO947<IuE0+#V_8LP$Ok>2vfMr4@2v-W_hp_Y{jobg z^8&wW<v#G^T6YZYfQ+5+NH4ei=Oz(V{>^fjrd(2>QBGNRIOaYG+7)hXy++#IUPUr& zC@KfB8yBF?*=JO;JFLA+g7EJ_IBBKLB``<dP7*P(3p^{qtpVN4b<&h`4)6<UG$jNK zvHdX2xo+`p>wa-Ub&&qA$<partK4%f^PZzno|L?1riawlktX<D6=%?>NuywjBwL(a zl}%Q?VZNfkN8t>^%5odd)mDH~Q%HFlPeg^NVA7QE1cc04GB*__x%Ax-G@UY>3PBx7 zL2oxaufdQE2S`L}K_DQe#dRd1O#PL+3s%T*<TZHK193PO<n2lA0J$BuS8zDydvLTi z5#5OZNAxrs-S{H-S!XMC8(tQNJt`LibvmTuMbQkXHe)~+KremBe^mE&hs(O)H9?pN z8PGsXr+=zOb%;g(@rB#=kJ8;y8E>zE{{6RhP`BYqMC+q`jr~v+`U%3|ns)H)fGG3o zoJyuN(Jne4KG$>1{Av;rqVQZuW4J0d<GL8nd>~uHlcaMNoEX^)JaanERKH^SgO>c> zdI}Fb0gDXd$aDyo7yPh-&XhE6nFj(PA)D0^$CMum+)9(q1?f2ZL_z>^oEJ|??Qn1g zXfNo6gn4#xnFw&-6b*7rrq7-Le^77z7H`g+LF{mo0rmd^u!F=HJS9<6S`g)@-oF+2 zY2Y%`@NUD$<K969_Cr}p!?vC5+6B><N@V`qEE_Pw2&N~Qi(ol?Wk0;TruMwbU2gRx zl_KD*=^9P&hBKF4!vUhkIq<#=6E%{>Y|#Ab_^@lWWy!($;Zzs>+E;Hop5eN{;W#*n zrJlM!b8_n(Xu@9|kAn(DZp7o0W?3`?0|2|D&-vx27XP|1JT0#VrYnRsj<54)=wP>o zQxpjFF>;&}8-{RliaQCUGOXg~dQ`Q>fI3Z@U9`*vc^cV!Xg_Rn-8;XDEVpLXLv>KH z(hh!MLhCw&1umwOALx06&(Xi}O?VZqk`Vj?ab>tWzdVOwh+C!K1O3oR?G*u&Van^w zZ<0Zi97$!tts%8r`|*}w$`B`o_s^)F7+G5!re_``LpY$ZpCxYf1~0qzsqS$&mekFF zE0@0KvSu!jQarx>U4f+Uu6+XMc7vXw@*5I4#;Bs0=jKG%_jd?&3t$z{zZ;M+>TRfA zDnU;w_Y?`>e06iUQ@D5re%wA5V;hA(ZlB|`3-+vh5Z~q%vTK+<l1fQQIOg;>hBls$ z!VUEbED5JNwCv+nm9JzI2tLbo3_cx1jz#l9Yh_tOWcc>@&+pSOOXLO{ztiWYwQ)lj zB5|(3;<nS%2K7qvphn|d)4xv)(qF&U-cZBxcI6IO<fKYvBEl>0!aZSH3itXkEYAvY zSHV7C4}n9M7U_6FH;J{wIwlmFBycDQ=T$_eV+Q#v5qdzh(tcgcgyp7C%<g`&nI4~v zi+%z$KPW-~3hjwo5`b4NQ)@NSrfui?^oAQndPn9!1984Meo{z?jJ+57NPkjXP~u3% zp{lg)1`Lykhg5i2<>ZB$xh@diE}1+{O|Y2gu92LM#iygBEm^!VO0FtS%W^{wavv4u z^>Bzi<L#3fo8c5Jin>hUr>65LL<ba#<W^k7E~ntV2vHc6MJrReFelEPXGFSs_p%ir zPCH_Gairz#T~Yq;%ay*pN3yF**k514`zyI@XEVLr%?05LJztR4VZb6xroj(n<$QFj z4>r}%K}{NrkW+CtuoxNOVyPz5L}D;NnoK`}?o@cB(3(IbQ+rn?OQ*vALbm6y9pU^P zN&V=*s<>(_cr8Nq8RWEzvHdWa*Ud#BX^?$Ul2E<*Vb~255Nx~YixGiwg-m%wnl$wf zpgG9f(42+u<-!1R$J^*S%rB9hX;nBWZ!QQ9(B^n<iuFRDtKQ%Zzm}TVEOf&a4Yr76 zLNO>O#LD>4x8NV3(kg==m4tHHp$OIB9PB4S=^IF?$aMG>LSz%PD3(*iSB#8E!dqcE z#*YCc>?G=CA?k4S$#nkU_^g!8Kc8!t)@N0eOm(Gw#_ssSZ8QW^t%H{IT&SLn##P*X zj+T}zn>@Vf=ya8TI0!C!?=wc_st<7rS(WKLgAwLV$I4%X^}{n~Z?e*mH63;9NR8YI z+<5J+?Ac6Yx!4k|0cy*f8%iu#v8ooCJ0io!<%LRN@p=e1hWkD3ZeL6>nQN8hVSjp2 zkx3;-*i3U1tP&uz9^*a|aXd|J47>xrJ}Jp*N%8|zoQ`}nBvqTWaTwPF0ShvMIY>6E z2FORMlb#)Y?jmlSmBt?j`^hPN&pxw{Kn(BD*2TuaMv*hjCX^(ga`2FUI`M1~1}**# zYbgbU&T%!8p_RdGc+a23GTBy~;LLvdodk3*hblh7l?LF^*(1xVA?D1jNO{}9>F?Iz zLPBW_w@6cgEI6bi{xMRY;5sbMZMe)mR_hhE9GWG_ECs1E=M~Gp2#$6Q!OTBq0okF3 zXJumVP26JRaF2s(DdsrG;(g{ugpqW}X@vbzFVf9$JK01w)HQuwIzkl|nN8?F^&A9e zRtbXG4aJ^_zm?%>Xx2H0<5&}XU*vwu>Z3GjQ`L@B$j^{wVAQ@DuFX3guWVaxdE(xP zz|HUHg)Ze{1!*3w@vW8%>F1+%m@YC>=fd6yEV1yO8%$75r0ZQJ%u_KOoj>kMX7w0k zOh4TP<5=w}l8{Nnxl<+lZWy#+`3a)a4M~krBwBcb;p60!A5=j6^Of%`@(b6k`ukdQ zUaJ;SFINthyvbSvHZi{vmtyAl2)DVEi*P4*i8O~3RT_2nNmd3_Sxz3cm?*^%1ME9) z(4EMU=-Y@>C>mXi#C0Ay4N9t!2j2X*f6W2{$ChPxhVwmD5U+;stTB%vd231Q9=^@Z z%RWq#xvx1k-&c$j{USn6HQa@di0Sp`r=+WR;SQwBcfE?D{1@ZlyLJ@%jDx>l%|8E^ zkmo2{9oY(Nn1JKGIw~A89gEFM`;tp@&ZZQ#WCu6@r$9*~`C!n}ws(P`eJV$|zj1u_ zhIuTQBzxoD>=VQwsQQqs<0=})+hNQNhiwfS#K&KS{)fQJ%%x^pH|ID<2M{>ilkHKM zA|TyIYB3nhL97}T5t7Z8!g5P~0iz+aD_)s7HE$Q_DRtQa6tnDHi1<&`uY}wTvdW^& zbOkuXHST~lt%gOU)uG2oSPAdvCiu8<L5Q!f3!%KUVJJ!jv$cU3KMn*x2&eYOX^-rd zVZEQ+u;3EF$84RJ<Z9LqL9p9k84+;%`5RIlERB#ifNy~BCuDjJ=?k01Nrs^uf-}zt zT|w$=Ml|my>$}J*-K~(lW{co6g?9Jy)huUu(X&HfzMvO`p`+->6Hj=%b?^B&pE53P zlgq$44+tBqgC&t<u0azzKe638)(21|AA{OviYh)=H+&Fp6?=SU6G8y?Li~GZ8Hr|< zAYLBk)oe`@NodaEK#GKcx=4FN#2Rg}N{wD5SL3-nywt$*lW{VSeA1or|6Br2`6Tt- zHvav7p_YQQ#OirI3>(YH={V^EH;bALArys&z!UeU=)3_j1;=`ZH=j<6?RAUZh-)q+ zU_vWK`bSo=*?O}G(=GFQf;@K^a;{5x9&V-xJ5d|-z?5}NVr0L)q8s6WStLMi3Ai@t z-uAG!pqrkTVWn>713@~4%Rc=I_*8OU<muJ=^~f$jGN3^L+-oo~2JP_tB*g5&RZUh} z;iF`$tON|2JxC@UZ~sWcmD0z}HuE3j999ZCo0g@Bz3)$M(czc6aKYL-_Y7#$VQIZi z)h)ME2GN>b=mxn_OQAFv&rYKVIfx5zM7rJ!#n@ruMJFQXX_j^c7RNOn1qb?JD=j#a zpoIXf$=OyFycmbhc)Ay^`(W^SgWn#2I=?I0cws7=^{?u}#*0VtJ4NTe8T1{nS~xYC zm1pFe&KWSMri&Q8L@@p8^tx`<|7>$kf@KT~i`sg)$FEpME9!tV;dB@SXQ2wlsC+wp zgY8jy^?ga_+5y+u0%ki-Qne+%fpn31Q+`(c6@-&1&g1!(_f6&sCtNp@DB`9eUpUso zS!BrMuj{H$<#4np_W3<1!*e*YZ`Zh&eP%;F0uyjk5#5Jz%*NxGgi8=w<C4|0y0jb) z_)3;rN<zOJgBUfMVRiKybk#DP&Wjhn+CNZ}T|8eI)Lj*~c97Qx%bX+~LLcBGvrxz9 z>f1Tlgtv940v|volr1p}tg5)P0#1=G?9v$U{<uWJRUsxN)ZF+JKowx09ia4#?1d2A zvEj;dO(Z)&#_rb)?>(wgM_sKdJ#lRARo#7~7?vcG%0hNI$Qz@6G5d!8X%iI0q1sl? zh<4w!o;M?=IG_?~8_{Gqqi5Q{8Eu3zH!HYmkn9S&IeMC0RqJi35hLLn;L*n`kfU0y z&~_i}UGjtub#}bI1>kB6V?v7TCkpyxE8BEuMyQb8)hDSG`*arGCSNLo#mxJ3R(dvU z^_g!&g$5ns8nErl)gey>4p4(=!n<+lbtnwt!oK}j@sM94GivH;T-Jo!-@mcMN^_i? zAN1xdd16WJg7}EML?R*7%h;=PWDI-_$)xk!?2a!#_U!ul6Sbj~s4`h}zvQ-li2?&# zqcWyU9D+(iZ43{=2U4!3dEtUoc{rO>jsx$8?Ctr91YHZc50s~9a`La1nq^(&4MUoW zZ1UvaifDKE^E@z4fSKE9T#IiL9Z^prhvl*~JFMGJ|Mpqix#@V{8FiskY3pQgslqs! zv_W$_<lDaNmyH~L4L@B&VL@%hKu7n5MgDrW>0DH1e)b6WDh~6lW5bMH@YjyV=Z00W zv@O>4m!SBUp!nZ1DBfJ~2R|=YbDph$-z|zmhw?w)Vp)!pLqU4EoeS(Y>9>m5xIS(T zsxaF@Li3?)#6x);I<kO!osD;+jgpP-d@s3dQQjIYW&E1~%dWvPdpp|rGZ+VCGsvps zF}LqBhr{eY%GjE=^#^haX1NzisSM0spoFY6KeS=>){*)t8|OIra<#~1O>WJ@@HQgx zT4d>2dF460<zm)qj<(&Uf2=U~n9f@tJV_e!q~6ypEo_tr+7^7w><q%C6{a@z#0np1 z=YrsELG=4GsCuh&!chI#5nxpoLbXy>nOI=ZE|cm~aX;jH!PUa2gO?MNe_$FpzPomW ze}7(C*Lm(me{-jojT_>$Z{2Dh>X&I@auL9ws&WwfacRXt{~BzqT-x?}=dgfyW(#tC zvc{cD`w_@uTcD7DXpX*GO4e3e-?wql5g`o;Xym}x953h@VY-|`;jO@uRuWhnLIW*t zft{F&NVE*D%gbRn>DI?%CWy^u<8m#`I2?S4AfyYipq>Ms6lTT@^rF`UL_wKX;`jJY zM9GjY@Iy4X!p|x+Ri3GF1DIJt*I&@CX#5*S28497U8ZBB8%?T6NnSTLbMsGNHi?2- zX4(Q_fSYBM`H(EwvA4Ax!r81~3^b8L=&WSGuS`s4bdv~8<svU`BS>D7nawWd#8#EV zYD<sNCggf;7~6Wu6dCr&n8z59P-Y2ek_`ws5`Rk1zbw+#%#)lA?yHcy66PO)I*S@S zc%cwBadEGe=fxCT19Z}a6MyT#yRGSk7}rfMQj?nSXaw)~RRYlVYG-xvuiidn1xL)_ z>TJwMTH4VQX2#B-sL?{h|GK%~%7RxJH)IsDy~#|LiNbdLNVilp##)fw_>m~L8YX5D zRVNC!eA8<NAZq5@$(G?<o{+$%;{Q`PT0Fbk@$C{;^`@D=+Ujg3=Vj&JZ0GPpD<hp$ zpI}eAq5dU(M669#U3-L`ZNobuLo{>GCZR|9`e$r;`gey&BRmSDV#C~`TqfU1a98%5 z_xL3g!j|_GO?o!L=FlidkQ*kxHO~d$6ZUIGb)CW`jvM{zZY1@EC*s~N<Q%q4lTySE zzV;dA^8nR_ZKHe}vXmr=%Nap}cFbZn2lAOzYlqZxy6FOp)yUc&fJZUTp5lgxMq@uS zX;L^;!|gtQxz7~+LKZp>m@<A08WO&x23>E<pSVm^b_`d<i>S~r4YXxK;jp7?&AV=m zL1O2xn&`omg=@JKjH`UW>Zy#4^)K*eR739!%ry8L*d7I%8ElL<H;iyhr$3;P<sdb% zkD$iND1bc%bX(3(IQXHTT-W%N9*~H~nz`%&B$<(HG)J<aqm~u4N^Y2dGIB5kZv<v- zQpt0znXiM4TR#tk_B|`2#hvY>6jOFm<-X~-lFp<+&G%Z)f@azcbt0@-&Azy1p)V*} z!})+F+9D~ImoEtng|b){!(Nd0lXlM4J}uJDYylh<G8xLPYibwd0Tdf+0;?2yP2+ra zTG~rfsj}`k_o)|JQ(HT`=wl{>qO#7J%h@MSVZzRWv0-W1eBc_*2{lm5B-JBJ6FC=7 zJUNJy+x8MlH?fzsqCz+eDC9HQy)Zy(Q}w{lLjjhvToqcl5++}lbLwICM;3Vw0_)8w z>+M`B{$2d7ih^#|BuqfaR&Gc%Od2yt-Z`>%5n0&5N@qZRtIQeDN_OHPO222yZrD`9 zQV-M4HLTe{Q&%bmcwPb5dr-*o59q|P*p)eC=Yz|q6D<IdpFq|5wfFnL)(<-|2I+TP z^MiNt<PHeif#l6|P<9Ts4GD+;iBVb4XlR4og@YPa0$9x9n6L%hL&EVMgOh!JO|dvk z+O<LcDmX<=!9J5%8E`MSPou>DU6lNujjEz3Hd{Eij`rxxBj7WDZxXN!z;gh+HPSjO zN3rtryWzkM_NT4g7yhiZTOsf7te}&pmVBa-^YJo^mHRBu(Go@CSq>&nF=3g^LH;W4 zfY;ex)wvr!s5fnm=21ys>^3u3Qwc(sD}+G6p*~oSxeooa>@cZQNnSnK(+nxN67|}X zdL7ot@Eij8Za9ylb(&)6wjpk~yusTDza0okJ}VbLa31puP*j0h8v{cb%q`J@uYn<H zOTiV)_Qz+1Nxdk(k7}!zW1fQDhGY^w`Qg6X_D^BtddK>Fk*F7M?VyO2Wh8r&8Gier zc0vi!9Z`Fxop<q@f=(X{@^%jY3(R=dcG<24*&B01vq740UEGU5DjS|8Q$S07WG`f( zjK4bfNfwSW_5b)JQo4h9t>QfN*4pa6BT9P|!&%!*l$bacM{L8ck3{EW##e!BA-Sv| z0ByLI-{+FaTmg)IW&;N^+l8HoTyM)3y`u8tBnU^%rJFO@IDxhySeHRwC6IGm5s(iQ zp1Eq084qp3DvsS?*B9J8cH|~BxQJoUjcr?8fab#^RL%G%U`+@`p)wOm(}+%SsO0pq z%hz;aFf`ND8bK(jK%(QdJQK)`n?xe_AiQtTbbDdncKj%e6iHoOjaeuD_P>1S3=@Z= z>j6^yz@{<fp##MB%FwIRp)nhKg^VaU8Up}0qPIxN;};s@yC?cdg~pM<R?MU#GsD&h znnql!f$J6Ig@rgdCk807%Giv(5xvN7LARmopN^(NwLvdjx(KK1{{~Y(huNMU=!z<A z)ZBFpmNp_RICYcz$gHN`%D4XNZA>`CXpEdeTp4ckKlfu85{{U|mZgLp22u_WPJsf( zy~(&d6mGYM)b9Js%_Hfo9}8XYCyt+p^RH~-Fg=;0|D$oMH+b2N&&`>R4Tt6n<h7OW z*Rye`WHa#XZ6Ymgzq|uS0ke*J273P1&!+1$Z%%}L{|(~&8aM*dU&UP*^-gwuqQEMo zft>3<kzCAR7T^~BqxLyoy*@%*Tm0hKT(C#7kfUpLPeCB|>9r(D6%E0mwbpfGY%l9v zL{EblVD(qvCkf_^OSNDug>(&9<jC<w>7c@`hpp!VKIwAG%F$>_sAEEl)MrV4Wlh46 zQqCp6dq2v*lqE0Bg^BGG;*9&fj!u9~o;(e2$E7BCCoH94Z_GJTt#K?yHkdB2i5En; zA{o;w;xxu7m!fb@=Ynv>;)W|FWH#!;3=p4U;taTJXOLfLFZ%7UWQ$A`Xuyfv@PtAR zmoOt_ZQR}BjG7Bmjpp?+@m}ir&DIZM;+q~cZc!Ng8TU-BahFV2;#f50<*n@{AZPp0 zvj4a*Ntc-?KE?d3hWV2Jf_b*?&zWZjQo^ffUB>RptONO>9_Gi9R-X$eGu~+{jK0)U zF^3~xA3}3Zn*is6(n`$flcZTIx~5~m;y{&Fx2f8-<k<j5em;Tq0ST@z<s-OZ<IbYu zAQ$9x66cn%0tDUNu&se@r!M9`t<ooV!^LUvVz(XP!pqIK{va1Z`*hO8b<^+NDv96> z-H#cacDN5xBqIGLk%LwmXxo$r{t%j@UYmH9BV1S6=1!$$6B~1r&FINQs(LndLIasr zvpOyXQ<zp8BGLLD%WH+**89Pn2pKX+vrM<2fI>;`SYNmqlieMxm3$Y8C0t5K2I+^3 zH0t^fq*Po5{0JcuYvZuOLB>~%jA&1W;4rpuxYi3Pb&N*`OXVjfwx$=`{PSVi<x9`u zcGr)36&y*Q)w}xtujK1Y{H^Xi`%kltLi@NYJ`<^tPb2HIPE<Ss`7i-nV)SAeK-x2u zk-8)Ekhvo=Txx638fN%lZD6fBQ}!*=3rnCLQ)=W-FDm)~mxtMz({Kb0<v*Fob(`FG zSpHbRJgzeLPvvoS&!5lZrd#HVvrD3s=y-=^SULrt%0h8TP$xmq1=v!6wIBZlKlUDj zL=Hn|h9NwwknQ`2mzS|n_e{vK{Qcl5h?r!#QHTo8wHvsaOD5tU&^$x9&M<qQ#m=*( zui=CR71-GX%E0(fSb>);DA3?Pv4D!$LaeE|&8r2S6|#FAkI!bGB8-&6_yAl?=9-&e ztxQjIC+9Euzpfss5EA<-|EpD4dX!E(7jY>KC*tLwt7Mm52jtkWAPB#boliqg64f4l zcDc>ZkY)%Nv4^Q^2Ks|fwj5^7DStwAPE@@);ldRn4Q?{LAy(f7FWhH`>Bi#X{<uE@ zhp=D;tM;IXH8WCx(ODdh&Mz03<q?a11MO?9_nX(p87fV9&gs<KP7))PF#I#78+axq z@dm@k;xR9XkoxJ7A9%y!4c7B+XncK_45mK&O>P=2RcvBDlyViZtqEsSlaO#OZkMG> zLDr>Y8b-7-Ea&uOU_WFRg5@wupENzlk@!<cWKc9_0Zo}++sGZs#@&3X!=X;O=`F@< zn>!)ZMc$jju3#TAH8p&jn-_kzQFY$oXnJ=B>?$5W$ms&Cqj^R*d#>#&wPVydq|0AB zOuD%<Tgf&IVvcJ9dFN@n3T@^BIGQ*MQ|uZAIGPk+E^$20I_ygZ54>V&Mcg^(#G@c_ z0q%taGoA~BXnd|Fgs(eZoyxAPHtB_wf2>3;imDIEI<BG-AABqFEv(#QNQCk6F`{mP zT*97Yqasd6KOaZn$WF($V_FjFK2nQBv=XuEXNep$$O>TscLp}W7_2TCvwLDYyk!+- zb|U6r@|6}yc}JkC3@Z|O!m<<ran0F@MU#+Fj=o-IJGvKz?E&GvD6IE&$537(3`t3v z!$Q5Z_)%qb+gj^FN{V2nf%w8)ijhGeFOx?1aM>5Ejub;#0({|&l+q2KB)H???S+3Z zRLpaimB3y>u`KNpd1W8geMtcu%~dWtOplm8jlP7Hor_qG>^uB4R34r_P9toeSr>=v z(+}J)<wi`uow6%l(W173=OAz-(G7>*G^;G$FunK7X`TQ;Bi7W|`G9=0%CrKI3dxa0 zB|$O_rupxX&`2r>%iab@+=D4W&M-VPTo#RkRL{x13AU*OIt<>f?x^yT{R<(}Owohf zyj52CcM4W!&MV&5pD{}nFH4{tVypJW;nP;ym*T>ZjU_a_F%*TDpgC1wN#Bd-TW|$y zp9MUn8TPu3dRbN#F<^TLlcd`w!+tX;lZq1dhQU4D4V5>P>Ske&jJeb>{{2A=i9oU7 zv55r89M&kp1Pb-1&0IO|pA?a<spQC8tQIKJDO~n{Hv|ElUX#6iEH7I|Vy9Tps{!sc zxL+qS+4lirc4BgnZJf59o>dDKOB$P?4=l_-Z`kP;;SrX3vz}r}rbX?2zqr{XXU&}J z?4KuG1$PB}(ql?R&9_qqneA`z!J2@(cvv3vp$O^11vnyI-+>v}VVa9h#P|nc)DZbN zh4r6av$l*JVdND<Y5-Vj?q{9wn-mPBO8synK;GPEd7o3DJ6ykR(ej7j;Y0dki&pg1 z4#=L9mUIeALPC*QUTtNvG=U`aQW^D;Ojx+6Vtzy~*b^M@hS9dLpqG2#?XbqI5ZH;+ zQj7*yp%XUi88SZ=wUxK1Rk6z^pN8>|VW~IfoVr;4aioioi-quWzk+bOE3LPd<xYe8 zwMN!@6GhxZfNE}}I>&p%)C0N`M~lZkpMh4m8QEJ5=fOp+w+Dd<P&U2?!#HN+ukOMn z2%!|#O&o1%BS=FJvqHmMi3O076~xMnV`!$8dD2!4e6@dwzhXvpVZzMHxwV7*0aELs zrSN(iKGZgJtIQT*4I`&8?}AB|ozVIOt7Dz1G?DaSnV207b04J|u8Mrq*4+4`pbD_h z>!3wO_CgFC&%E|<kd9S2&qc%XzpZQCQhiA0r3DjWW_IcXJmEIA$6zq(weCFgNXq<4 z5b9FUWh-YyySGdJH+z%i$93vzp@vGXnmZ9VH>?XlYc@=ZS#&JceJA^{0<gyxpE_Ne zf@X8829-JsLI1mO;m{5fx-njpFTs05(NY3A7QIL{a5#?io1U`RH27Ln(e3XmTqUPy z>Xz-DyQ{pk0?sZfIYmSR9aXHUfNnS%!}N7I^yV{iI)%k`4N+X!w;y#|!V2f~&qw$A zzT4kV9YQ_1xH{^uJhbD`yqeUoyxf39LhMmFhohfvCU@9{_TR*Y-8{zm@}$eJTXGSo za`t{-$yvZ}8JvP50^0p(R9i)XwKzFS6*JJ&Qf7Bo2!*|XnbV4vOt&E&hY6)GSo~Y% zpFPQDg}LLF>mg*5i+?Vo-4U*ChWA7m*CM5i^)2}uk~6U=V*+eMTp8}pFJ7^oo8?%h ziC-T;JEa_;UKig}X+JEHq1LXY{IZeu>xQ)t`Xy2`FDJfy)pBn*4}RF6w9}K@oQJ>a z4Msm_JNdffTUBvgZdz6p{!38&OHll885D1Bjjk`+^zq|F@)K_gt{4983`ln@)}qo% z*{S@P@tdc^JyBr_8*z}(d}tl<P<Fuea&S($ndnD%euxe-$;&n=WhX6?d4ts2+tJ3K zL<*42L?NYazI~TD93@{?gjLq<^`Tob8nYKDA!p;aU=UVs9mP+>J&wf(yJR7~JXDS0 zZRA@$A<QzYnQZ5w9*3puZrfe@b`E=yePzk~o(ohfuN`AX+<HM-_Snl{XAo9SV(y3d zx&XNQqmYZ`nfLt}RK3-?94*f?0<2mMbZM=#-8B|pz$8<dp+c=6vO?Zc@C*6oADBjt zZBs}1_ZJ=AEBb#E4i4nPJ(}SD#;ty#klY>T1^_HcFSN_mS5E2*+pSfbmK__AYyt7@ pX5{+xn6HYrD>#app@Cv1<L+1!J>JFs0ddgz%>RJ9&)kr${|6S1iIo5V diff --git a/client/resources/hardnested_tables/bitflip_0_119_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_119_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..05620bba0b2f3c7690cbbbe79a2a776aeac785a8 GIT binary patch literal 1806 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_119_states.bin.z b/client/resources/hardnested_tables/bitflip_0_119_states.bin.z deleted file mode 100644 index 289598b1ae3b4010309cced08ac84f0217ca1fc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11331 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 F{{d=P-wFT# diff --git a/client/resources/hardnested_tables/bitflip_0_11b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_11b_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..cce41a523836421c9e48409e39178b3fcae34d8c GIT binary patch literal 1077 zcmbWr`!m}I008hWX}C!)QRE_bUY%atF1a-MvJt5`4E5G2_3auG@jY5&xgcJPM-6M5 zD;kf)p><KC)fui`xHG<zR3ed@YPp^{##)b&Y7{e%{jmRFpC3QL*D{%mAc&j*EqYKU z05rMm^q*JRvI<|Th9DB40PF#0Yf_NCmAw@JxY)}jq~BFbHm3k^2*d+`wVz%VLsyVc z)(ju6)Z@1<;LQIUheRKn@@e2d*7rJF&b*BAdX)Vzz^)`A`p2F>eLmVMFJ;Gt%(P?& z#Kf5zx=&jP=E=mrM3i@B1)ghx*K*y$hm1#1+czxNnme0p<zn82#nW(n|5hMl2hW@m zBkN+rjNa1fhEukTTLwo86vaf-DD+1uO6QilQNXe-A#IY>bYr{iQi@mQjB)o@g4!bB z>qQq(2#Yvd!pSlY$JWn|@ShgFU@7#ue!`5kV!eVwoPpWDoL@?Y`POSi7|l-pear!S z-*<6?lk*z3xZp6_)oni}dk)WAOHDh$tZ-;6Dv_6J)$d{oZ6#3q4n~moet|*iY2j7D z7US;9(>H?EbZxUI9^5W;g->&AGY{~Gq!iR1WltsQqwm_d3pd54SK>bORtjo&h~|hb zY*(*4R(%-s{@L)L*e!Zw!W?)*cYrO4gAgHo^CE(Xnth+|`MZC%Fse^A7UFJhB!#g< z>V_-kp)bcC+!lRW6V#E7?{JRQ<k$qCJz!~0ve26;&r(&B$5NBBgB|__R1>`1u4J;| z_U7kH$Kf8!Z{sdmSkmtvAJ6ITrwK}<4u|XCw0$ezYpY#Y=NNzL+-I^7S$}a87@M)1 z8lljSm4%>Zi*OlG6DZ(NXoKi#!9X5$-P>8*l`hEtL}zj&M$Gdcf=#ZGOUhX<u8@;O zRnn@yf7@!8Z?%ytES1%KT{SI)YM+!~O){Bju&%&A_E|u!`^1nr*Z-wiP)tQ3J_L;} z&T77eh?H{^g6;b&ZBgewv}=oqb;ZbzixigbdVS9JY`HEuvVA==Av|iG8$Yf1n_bg$ zViU)Gf1PSh?P;{o!h^>2>Lm{Dq~W7#l|_u-aE(~RMKSXH9Xs>fc~hmdIiAsS7nhN? z%}U|-n8n!rVMB)qC#$ot78Vw&1*5|~k+U6?$B|XcUI`!D5A!^!l3S%PIe`GCE2&qs z@m_X}#Lyd8U)<JzWw6(bU#`ZWFc>@OAQ>&MQ=gM}Ya6kObWLwMReD*%0|%668^P$R z+gzXC`pimlvKCA?B61RyI;NQ%kUx=RKALjSWX2l}R2`hDyD2eH!1)%)$v{vfg@sbN z5Ivcz(UZY}$uM4%6Yrja5e*Wg-HcnkAQq7}@*UI|Qu27Tya|H9PW=y3O&2{0j>5{E id&eR8iZN7f!}GT5qVv(-=lhR1dZ*>!kizmlmwy3X$@B*R literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_11b_states.bin.z b/client/resources/hardnested_tables/bitflip_0_11b_states.bin.z deleted file mode 100644 index 099dab1246a7fde05b82af693242911fe43047e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5875 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 diff --git a/client/resources/hardnested_tables/bitflip_0_11d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_11d_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..6aa3f463894ee13622fdc39dcea8890d629c9a88 GIT binary patch literal 2469 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_11d_states.bin.z b/client/resources/hardnested_tables/bitflip_0_11d_states.bin.z deleted file mode 100644 index 3d9511d85128c6abb73bf1e256f91e58e29e0ac5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18417 zcmeIae{@u3nl4(7vxaldoO`g_p4Jwjy4&tSjF6@oO#>#|IohT*gK3EvA(-7)1_MSY zAwo=w<YUg<+v*6^&=Mj7*>+=$7(z8aLJ{&~+bvL@1hR#M6r@77O;IT-MP+woSJkfl z<NMzG?uxd0?!9ZytTlJtKhD%%E2|O~slC7N{oeO^pXYh=>Tvw(^7Ww~op5~W`^Wp| z?2W?x-z)1c-TD{*?Ii!Z+n(<mdU)rzUvu{t|2%x}k00Og=?{NOBM}j_1l8R-aq*3R zE{H1Bn6<Ec@$*rImq72_w1w#cnMW_?Qm7wV0?GUxO(d3SmWrB*Y4!5DZ<NuT*HU5? z-C}fWf+=zojw!y~t^@CJKAPJAMNzPx6PYjehq^jy%`F3MAJiDW9RlG~JS~N0IfLJO z<CoU40uC-}<bL6JG9o}aqes+G19Xvh&fY4S-pQ~$oFPrDE#_icB(&Y5%sLEWx@r;A zBP6b<X*bh{WS1AX-E1W7eVXNl6*hSRDxvZO=y4^koae|(a2k@Z(<EW9bp{UjVMlOL zeYdq=^s0NoS!IdUtl}V9*$Jms_MR7Sx_GT!oD=2ulHPUT-UGqAoXtLNtqwma7+%Ce zo$;8rJx%JYg)DK6tJFwX6}P8}LV34dJ(2JVumIMwfsA-5m0J{uBobssNEk^53djU) zOpzft2t#nD5`N<+XYj^O!?m-}yA5`D!L^E&(ma+2x$GW#(dlM>!+SYK8pzEIACHjx z3gEg9=LyH|KgK%uC&UOm>4hdxEg=G@PQrIw>|@K55EG(KR2YMHp!>z7;Yx5}r;Ev% zVp_^}_7Vep-imPh-}LPDESAX_fp{fvRqB}$Rc51>>fhjAVVbOD+~5rsmgG{suo#vH z$a>3+S4xtoECB6DTA`6c8Bi6_7UVJE9o|3b)+<~IkFI%dhX9L#|6Ul02vvPzTbj5G zXJF>8wGixJ+u=CbX^L-0b01(2Eoy43qprq}jm!d{RV9gAEKB37pfL!(1<Z2=d?jGM z1RG8Ja}M~(1PpJ3uut?Z2QLJ`GYD^HuTE&Jk2cn;T>B77HPquK`*%R(Dk(7QD`oet zq^Am8mY21{g=_LPm>}uX&S?+zTvSWjB^MQRTvVlzc5bE%K=jRuuj4&qa76W{AQt~+ znro&x0Z8jiyb%Nb=j?A~vfOP|S{3xQjA#=4*r<=?x!CM{CXXAOO2%+Q^I@FHlz%;g zJJe1LE=CT)e3r*b;S!0#A-El{0f^yu*|YFkD>xp0s6D{>-eH3&Z%xF7u@oRKQS5n| z1!|$m5Pa;OYWj#0CCjMP5099_*-CIEp@u|msEub~-8QIfC{D(vI~<?gG`$B@?!Y-% z*G!Tb(x%T>iNmq(ocJu<v5LhmQ(iZPsQd2yFtVs1uHdS~#1!8489NRiG@LPf_h$h} z4B^@a*1<No#nJzi8$N#OqEOA!X>cuO|2yR1jpuHlg~i-f2FnRGG&$MCN>ik}8wvq$ z<I@vMW4Ue_Bt!1;;sV^_xOkRN!;U=|uTSBFo8V@=RXlZ3az53<JSDIlKkTtL;im+u zlL?WMOYlibX5#!|&Ox(5eVB7N90`bMLbn3d_tVf#r~sE^>$5i@PPv5|ISb<=1+yD` zAZCP&z<98C{u*BRKOO(r56f!V(X@Vs^qq!U86K!+ku^r81S0`4uFMBo(^aECv^q5A zT?^^=iJjbzh6Oikw?wErxpKG$wlVGnJQ5_H@Fw`138%v`0sVJF5IVL`YRuP_bcy8M z^D&u<X<P?<ZQU?f&-^Nxd!E#@ayi(OHUp9~U3iSar;&B}q-<P2Haj(<l1|nX$=>Cw zk6V3=^b+4jQ+TwPlqsZlKSW(14kq7(12h2B^S}k13TMe5&XOBY5vq>C@6+H`;C;F1 zBpiXtx8k@AZ5Szh4yypz*(+1x(qOfp&^EXOrr9_4iyOLAf&cyl8P&U|eq#R=Ut1%+ z6Yv0L^hn8J0=k|LOFJ#Dr)82SC)VEQjYgQIe2@CQVth-PB&`ULxWPSRHr7+QksP%6 z`yf4u%i`D?m}Es^{+RU~Z1NHX63lrV3=-qY7r{*`E-A<RALf#<dX(%hVAWLH1SPff zEhaWIu<YL$VZtYIQcJlLZ0g9{=RJlo;&9w6vLEL6nCVMn`WbxA1t2T}dZ#2W8nwg> zci=b)8}e|ZlpRsU%|@k%Y=`GPxVE=J9@_*8%YD|8Rlu;yzRvD}c2@9;p4%<VO2Jdf zlv5B_OTsCL?zHmkXvVc-v->Ui2(JIFj!(6WY;YQRV1oP{%pyz!c6sS_hQvDRNqCvl zv32-23isT7w0n#kG(A-cxk(OV6#j6Mt2J&(f))=^^IAj@Vb`J_EvYr(s^D_nc?dfD zxh49ieyg-2McNLLbLXKgG{6cRA7w(gfG1a8+W|2d?u1r&Kml_FtYA!L)2<QwGT`+T z$ANntxkN%FB^s%S)vs7Heb6qE<J1+l3wOXpSoq_(qzP4=NXvba_Z$aB<Vpy7<c$kQ z36zF0`Q<vfx}JLKggtvf6%Iz_MfEX=q*SJ9^$-pz9J!P#n=ri3+4;Fvf|GGP38Y)+ zqFB9{D{KhEQeX2HvvapAo`NHWxHK#TS;HwduW?n>6NF3eV2#KDLl*=VS7%^Fv@yjp z);7Ui3bN96O}@L$I?w`#LRBHZi?87-71+18XCy<`vxf7K4mnkYpUu2@6g*F{)j{tF zYq^wcA#iN6m=3VDuunXvSHht>%I(M*I4guF;j-T7;SD&7<$8jv^uVe##0Q}uD2}RJ zIYyfId`4a#cU@tHSX?kG-jThge*+WAHyppPHY8YIfyO<+mcb?1J;6Ok9QkSRNEJPG z=Of>l*BDZ#$0uO_VzSh<R_`dD>!cW454*a+Z;~!NT;CndaN}lUHv}^_{5cSS52B@* zY3;}v7Y#c{IUEO6%M$^iLGo)WbT=c13|`TXJvqQ#R!I{~`w=6{%t}js9wK@+UN%NZ ztpI&>P@*KDd6KVS(;dG!u8Ysc;95Tk_lSe|VLl+D26lcw4Zkumy{F*TOYnWgt8AoV zM%2ikVR--f8?dPxj%SL?^&qtOvjgici9~;ycI?{`l=u37-RKbtT%ELUiD(s?<htR5 zV~hvcMN3%SZhX>jC@`s!pPYi0glk3^63?|*g^xoTt81PrWRn5L_kxJnPuOXzbViti z4oxfE11TH2Jd{m7AFX*&Bxg<G`9?7&Hf!A2S)t{X`|Cta7!4tuyuXC?=|07xVQ!eC z<o37_5pT6K$fT2!wnR%z^qRuOn2?0IDK0U=^}Wxt+dF8n$hyEz9`=3);2svX&%`nV zcBI9&{WexO1CPB9g&s(yEw$E=hRJ`WrQrVnE-EZ!R58#Z9k6AN+^D*vG`G(mX@ayi zCUE7xwMxsvUqNG0aR^LShj`SrLeGtm))07<E`>b98Wu8d&rP#>T<Rv?{S4MDQhU8a zl7DiJ3@wMmpVYE&C}6^kID|AaQywEFL2punHUa4DcqW`KwY=viU5n{KN;*S)NW2{4 z5+uPzs_P?pFk=ICCGEPMgi9gM|2E5sxyKZLmLREOL|^-4yO3|Q5eBBJ7;e2CXvP%Y zxCH$%u^Y40_hVueqK=)+N_pEQp_9>&xm=fbtCa&>o#y}^djtrDt>6#jUY{kq4Y!0h z>)e`v@Z@khkP*WPvR=>TW8)-ni(o;oC2y%;W5AsW@K16klP#y?;j3Q+WV{<XU<5<b z8Dm@;!4lYMYlBH*uqptdkoeRPAaV=1V30VrRy`_{51uyM=b=C#N1*}FNaH7PBRcI< z2-LveDN!XKLm6Xt{;pcqsZqpLOYXy8<!~%=f`1f(Y8GnTBV%diUNBqOoA3r+XAWaQ zlPk?uHUm@nqj!TFs;_4R#2O?ep4D8dLHq!paSB0afB!X*LVkoBzFZob_$u6(dzkzf zG2M(OvD8jmn_c54lAJ-PXyme7=4H3y-5t+^M#GBi%)F@!XG7xm1hH)<!Nep7Ag*kH zy2fjtN<Dnp2545glT>TwvPgJ0#7HC7zHZ8$gVXb%V1Vn-1Twkl3|6Cryuc4>^3nmT z8`}EKX@gu`_yTJzeUXDzwDK=ip+vX#PUEGPSY$x?;Y0BE6rQPj@fV11BGS}>dl>O4 zg+FT~BbMu4R=xp*r7B0`Pz~1AU5CRJ3(vp>h{0=nF$D@b32}PyXG}K4w<$1F2*uzg z46lb(fNTCTRM%S)gL@i86GkVXZwDALaynb79e37ZA0r(~Vtk!8F>ihO`pvza5S(Po z2V_!TFNuTm@Z=n{0>Zj?dMk|%EM-4~M9j5V9#W4DrT9+fxx|`zkTfUO#pX#@Zua-T zI#+>Z?14TxCI8+e<K58e%RoYdo2Gm9sCaVAzHd*DJEzA5%0Kc2;AkI(xS_-t=H|i) zki4*}9h-|cu!sa;RZK|XL9tU~Mr6)}w>~6b8yrtUM1sLtFaze0IFFSmnc-a$=WXGr zUV&)Xvl4q+Djieuyxy2hx<Uh?d;JC8I@ZjTkb5o^5Z__hZ(IpvNIq4#G8r~(+4T$r zys{=757}7YrFPiFp6g_B+Ec_0c%fOWx@k4n6R3S7Ta>@nk&HFLGCyXmOY@-oFbwOZ zE$ln6{m1NfOmlD9-B3t;Jw^_A5gD~Wu}Cg2U^nNpsNI%a&yd9_-fW=@m=AZx8M4s= z)(IvVTmmmDGP^|KdElakPrKFe&-0<?v&^s4BuASSe`XX|f*!J1znY-KmPE}mzc_CC z4}l;y4{>%Ea0x6+%&%v<l{tw=iE)Z@cOAQ!5w|Bu+vFSd6an16I@t6ItJtNBZAs58 z@IJu3fW_<G?fM-tc>Wxj*$FuW7GM%mg))B&txIvW_8lU)!?l+m!x+bRpBdb!K@xB( zE+nuBVZmMAu5r#E(wc}5a=wf+heNum$ePRfek$_lVS%uM31yQBQo5yc<!)`=B#R7( zxp?&nm$NOZt=9@;s_tEC3hN@l+WHd-7EojGY@9bzglEl@h;ZZoVB_c8mc*%ell)a@ z7T?0rgfeHQ)FZ3P)iR6B*}uA%n2Vm}U@}n@{%>g>T#Re8Jm)yiF1Fz?o~F3dfVEr7 zU$8oerP$Hfk~C&hQba*dkwa;Tayx^NG{{TTF1242Fgv9<ewz>b)#?WeoLeYAs<&k; z_!m$6S;q|t9<6=}7C#>#CN$=YQ$2-aO%;Z>E-qEbH?iKnJ8cM)aZ#=ioBsiH2k;Dk zie;lg?D{$L`$_j<45LB{){@SG0#fuG!J666gH^&^j_JM~ywTO5=8!NiQoV6{K<JB} zq}`&}vB^s6m!nD^L^$8sH&r>O<O|wI&X%63GvZ%WPz-rssnyBQ0U54pjjGfaA(bH{ zgi1uXqL+?kBpC^*i3py$4q23}0P;D(H6X1gXRwU@iO4wtsUi58m}pT0BIA05RLMaV z2^qdJ{z6WiOjsrBO+LnaPwP$>q|2w7W3XE~h5=em>QW@2xZQQn&GY+(DCL>%^4tM( zfJv(Ipio}MHU%M`bUjC68i}UFbjn%B&RZ>s>i5#*E`j&%O(sewGGtpaG762o(3~uT z*{p??!Ta=f_^WJ#e>>zXWPNq)QL5RbOy)Ipv8ZatS+9{RK@N<Xu(=5iT2@IW0wrYk zax&7Nk!_r(TKv8=MtTZ%1~A?1#kE5A#v;i5)JARCyc^5pK5S%ehb*5HrMJ6yU#L}& zDBP{H_%NN(*2LAa!VdO1c=oiDa4(lv*O7n`D`zjn{oI%=K56l$7n}#Iz7ss+q}FIL zu!^u?v><?9NcN}!w%jzx-KFnu=lZ640ufs^1$wWNp;_R+3BiL<cY<_BNEZexzc(Qs z8<vk!kBtjUk-?g}Fm4oUj2N%7gPV;8aniY%ITx_+vnfL6sSpw}^J5TFkzmU0CO>$9 zowTgLWTGP?u1x!jO9Xi6SFjc-7ReCRF@W*D9?~McshI9DsBG(eyRlejM3(y&<1vd- zl1xL!v<ahC3KzV<dXkhJI0M5uaAH6h2H#@#06WGWv3N_;_se=4oZk!oeLs1TqhoLm zYM88gF=KA9;k5*PB;@)Rh#T{;P26;R4Mp(=B~Dr0SijDw?8eia+d*D165TB#M!_h% z<xXh1d)Wk)vYbs-AD`t){1h(e!c$`~ram$N{@0Prgex{?cR0rT;miuSqncGJRH6~2 zH{e+fjs##2p3vLj%^;M4vy(ZUu>C0GHd|snBAr_u`wpbd>4lGDXCHI}A52U)`GYV{ z-iS>#ppp^Wr%l)9L*rhXw5jMuh>XDEwvUfQ#DS36#zBdxYePej-b~lc<a6pAj<y{{ z?!g`!zl@1g9K`BiFz1FKm-?K>p;9L^>%n8Vtm%&179;B*Uk+ggItV*s@R(728FDd@ zJwEVaLOLhjg@KJ(^kopfO(yC<TorXz0B4e09jBiM7t#_PumHhT9At%x^z%+Bn?-CS zZ|C1TUt!*hYGb>U%gX+m1x)7cP`SbZ-pwLCY#s6FiWEBE7nw67k1R2Ld2~SOhFx=E zMD>P&Dj$b0_L~(+nBRv>@+ColNM<Y}Gilu}Q4_<+cGFwemBR$mcvA^>+kv#oH9_TC zrmC7Tnr@fHdiGoHofN!Q;EL(NrIL_;5PO7RO8dO6DY}NdR|)HE2*M9)jbJU5OjyOZ zF3s=rmNPCga#F|d_TYK`%RKf7a5Ka*xZ?!KZpfqMzo#BNS})-;xTtd&RwOtRJWsO; zaCbuPVit2@8O&Bb$0HKF3dPSDYQJK)o?pHmD%}j;C<yt&MruluqBjm>gO=X_#<3+O zHA^@xLZ(N#dYY|vL#J3}0FDfc$r$ulMPXQ~`x-F}9geQu8WKD2gcZZ<rf%?P@Gf@W zWstb2S17P<(#T^2?AMU1vKUf#U+u;qV*f@?gGblHKn#wgBpY5K`-fMSTzObe<wg@% zeclIgD_u4tJE$xESJ_a)?pnW-WnhO2#7WP7XvghE_Vo_8HO;X#BPP5i(a7(vA<_>p zn-+37e$;PyQ`)clNR%c&0MBo{kg?{v*&r?UTo>)O8DA>5VGMRO<N7<c_V|&F?|{|~ z@Q;Sf8&|PKY{9&GC&Xi98?hUJ!Ee_=bZJz10E(`XeQrd&RW|#%6D|x)e-}iTQ<3lB zz@jaKQ^!1jeTC!nFQ~kUt?hlSU`*_7gUZ!()q3WdDWtVq9A}-_boj&Htj6bOe(Z<5 zHCTF#z@!Fg?zU|47=Xe<U-l`jaLJo(`;?Ou5#@n6$w6wX7tcB}HS0+a>@)SacB-y^ zHPd;cZx(2DcVB{;;(g%RPxMSwO~oK1jaUNw-4Yl|lmX`zG*Q&dTqp8-t%v1}Hisuy zm;uxr*4b29>^wX!qLe_8{T{3@pBE0w?OQ6n;JE}1_W>#`gQ@C{yNk#O^A1^J8i^$d ztfWhjvnoTc*f#0f1P4dc;)mTZwkGV%rxi1W8C<>DYc6*~WF#3r3stK3CFXO&+XNOR zh<y~cP38vc!)dPVeU6$!0~r_6#b(4>-Orm9@fd7ax#vN4e<S$&Q7X6y$fo2}1Jd!% zW8i9G+7*^+f&@kyS$7utUnG5L4kL~5Q&>Jj?0(1NaD+T>YJ9o_4ko<VQ~F+ksB!C! zBS5wksPW1I>E({Q1+u0Zlo9={;Ye=PmKXIKcB4@nqTDFp7i_@J!c($%lgc*RY&g4F z;S#&$Lj(X>+|1Kyjyv~9$U^{!wiNUPdSw+>T|%Nv*z^wjon7HMY@%C-`4D{D<fLr8 z{PSWMFfD$<6ly(y0@@;*wLftF^X#9a(dIu<+qOP5n>CKWvj_{FAFw-WNL`~%+jqn5 z7~S9fndObqmNR6sS7zQ#Y3I6DM*CiiN#R#U*yuz5rF)B&tO>^X^#)QYa8E#_0(Lx5 z9}^~(W7aK>*I$K35k9^^x$Pu)FScZh!rT*vPl0pd9@vEk!hY>rh|P*RdrTa@7j&sx z<a#a4>knb+#PxAF9xE~Ff>HREjg9Aa!~8t<Q1hy&*$v5Az&}y3XOiz1>mo`nTwqby zy9WQ`%s*lVc?)hp<#z5lsJjZg%Hch59fUV<iyx$uHWQ4DCe0>~&wI06n+ow>gzDq4 zE}ld{n#=P3tHsq?USC8A43HsqJMItn7;UWAoB=@vk;58Vr1$KTixjfFpg^;HA|lbm zsU>di{7y?;S$h}AnxaY^8R#Vop=>6GMWhaCMejLeR#wYm35s}bgr$W8drIru>kD=x z0O3~CGZ*kAilb2I0;eb=eFuAo>zhT)+Lpqt_2>G;Yh>MS5{wqdAvhE6f-|#_i+B?j ziiiqz`O8+#JBz&Z$IOiw8G)bv6SR^^9wOEd?sP>~!5YFsJv$p{0px(Q#9?(gN*@l# zx0b{HPS&wK8S#>~IyRD0oU+slC-(7s8LB<@v0qEL6_o3#|DKi^9gy7&Z`QF5avK9D z#IrEh1OE<3{vD3|Tfvb~Kb)?EzdM-h!!-8gtNag4e`_tYh9hM|8muU&H@1YWCUWpu zrV4K4sV%WsLdwUs8dUPoZui{+mU@Td-MQ<!$T>6jz;47A6MElSAutL9V`jzD0b)_k zZJ*Zke$l3<Tfp@jdJHN*ieWKg2asD}uY6TonmtM@uHb!r-v`kEA5WJeg?W#bl?YEF z`4zJIou|O{nf`J4MX%K$X5{~nfEx*Mw273X5N;NKfEfJF6hZ~ElJo<xhcqEKY;LTV zfTiumg?8%^Pau9#%W3>KWrsOZl!CrEf?Fad`r_UUzc(yzHcGIO^owW75kEndGux@V zSl%^5M#1_VM4{F1obgbBVK_Ci^BRl`*i0`JQ```IC!0ZRLxRnVMj<toPg-GrfVeS> z|8$5%4wLowP(8+13S2cc{o1ifac(4ly6CLJ0ddooVcGKxc)a{4`BO61g&^k$L0`B% z?oE)s5R6P_!BBDokSVf9w?0M4eGNQel14?Bb8J1Ok|St`*bl>QsDh3J=IbF!ZcZuE z=#5AtJo6t0Bqa_U0?$nF%Ix4&4O;zEnH+x_i`bXp<#2dk7RjJk_x53~kswjOUen6B zY>=hNp+5zgw;P_#F}c8pHu0BLC$^p#93{Q1^a#?3yk@NqNhOPR_sC|kEv&q<dk%!H zU^Qct&bYwDhIH<z@g_Dbk^h;JRoY3HF#|ryqL8V34ehyh5sf!}l@aHPCkeBP;^;&9 z^RGO{oh8W#`OV(ZBH@{W(R&J>p{QnmPUHLts;*OMZVLyr*w(a@AK6l5RKpED2&)FO zM2>$ul9b5i5SH-<SfS-iiRHj|(w#^QGQ!2O`zMK;tc#K6i(;Lvf|R*{HGFKy9rXot z)Rd?!Fl<4~`g|z+2U(WlAnY)Yea#<xdg|HkHgNaDL$u5<i8hLAg^Ml=zYnCxA0&c6 zq9(Vyc!i-##BEusp6Df`+>+2gL};l#=~`!T#W0l015-_$^;b_10B<gwiG+}t)@sar z*b-BG0dN+P^=9dP&^TF55P`MB13|FTT2_2Hfx1C<NheF$HMkHW3uDjjsGG3zn`8^# z4neod717Wz4TP7jXRC>M%1f6#4#PGfB==eJQ0Crl`gkAs6BmXOPI(<q+S(x&k`l-P zEl1{2fOW@hF@3mCtnv_Q33{<AoQ1Z-WcjHAj|YNx!u9vXv|go%hfoMBMrJa%+`J>7 z<zQ)^&F(;_#|u{V7D{HQ;<#wraS~2k`O7LdM9!2$tF_7x$kUf3^w|<}J7%I{PfCt& zgM6s2MYc$=fmGlOm0neyV`Lk;BF<-7ATL!Et2sd4ggNl4E&h*VPxLe^QlQpcF+)D@ z-|tbpubRVmU}F6O+H4ppkI{;D87{o|fA{fJAJmkt`%r8*fu7qAEn|TrRyn&;X02j0 zb{d!5fcd?grbk95U9D8!%lw<BtsaKWS^AQ{&T?Ncineo}9Tk|XgW=y6uyb~Mjp8xT zzzBp<Vcqtn&N`C)oEve$6dw!`v}RQffh|Vflgg%EH0D4vZ#2tRaa)S7Yv%PFID(X* zCLpIetj+o%4UHfhhM<QW&-l=LBjhLiw|KlsYgt?^g9^sgFmp8=eh!nK(pKmW1`g=t zrd3Iyw)5AtcrEm%#JV2HH4M087x`4<k;J+S(bV^t!ti5xBg+Oo?g8H^q?rYsOAtvs zh4tW$?=wXwc<v>X)Uvzr|01gWVVrZ^Rvb@B*u89`m09W~kdlLn7vX&SsMx|HZScu+ z@TuG2m%%X=8P^u<RveU!$_ovv+4hOSitz2!!2a<kCX3y$q<d9T7Io$`zOw$Dt)<OS zb1_-I4U0BokIE`A4I|aMqu4aZ2^zhybtVb%WJ27Iygt7BC`G#L)!h{2LbjqdI0`TC zN=EjJ-4ud5$YpqfmO|0WsYaFz@gk#n-7T<;@<_m3u-lU3ZG%SNsD?rAQ(}_AJGLHA zG*WTZm>3~Q0m%$IZ<~j*uM*&^=s^e#68pn0Tq74`m|17JfKPE7F@w3brKdlfr7}g^ zsPwP}I;~Jlm{|lrG2sf#aD4aMCUHY?KNYYHxB%)EBtEA4swudOxZlp8AHA!Rh9>b) zU426SF;-@coZk-%-(kZlr=?t``y3&&T;&DDS5E4c!(w+-s8?vqOM0Y<%msxw=QVB~ z<qm*nIlJ&xI>8jPvf6rER-2nkgNk#FYE*-lW;u7qFYay^AYt)Esvw8~?Sz-Il=>RI za0s|$O_?O`u4OkL&(|#Zu=sfsRQ^pk3c{q^Ho|6K7?6id0R?*_2)Pf?Yp@1G|Kszh zO-h!S;7=x;23*NpHN@Xiq=v<)_RR@``r6-{E?Zywlm-3?SBShfSq*ZKk}C-we|qLi zea$3C(Vm6tHAR9<m6Fdoj+$f%z)gJ@DpLOng-r`1)zjE3c4wj2XYE}`0|o9U0dh4a zXYCBwtILL`v7d8;>#cy8K>3l9JsRKQfv@#$oM>xy9WWb>Oy%HdBU4A-c4OI&7l)(Q zOCI+qJ$3Ch^$C2UbI{UHxU;Hnhuz~!_s01S=1c2nfV5CRAO2hfM|K6aldI4PfB9`d z$oPf!xnYd7iPN9MgxFF@$+zmLKjONgwoH)PA7BQ}?&90<#sb?nmaUxmsDDY6-)=ew zfuY>*w6(8Ef5yebDy!8NNlx4_iyNOHUY#Fjp%K$*3U>Z^!}2uMJ1EqduR;&{RTZvz zhmudbBO+RV9N+zm7#voMOA3<nVcB}h=fs><Dw=1Hi_;xHVj0=w<~5!SfuV8O(3A5f z^bCo+MbudT!S<`6V~u;BN)nU@`IKyPL-o{d5{W-f;;M5Ulr0po=%s=J+A~a*Mn)u; z7>KJmsstDLbVgKsD|cuzEVGkepTAh}^57?9V_;Rhi1u6AfEwBbv|C16$dvd^ba$uC z_!VS*FzZbu)_4~yHnwBYDeGV@X?5cqnH>(7xhXlsyie<q6QudD*cX1*2&GB8?J-3f zibYz`7M!g|rEFaTX*G*eCtz8e<`w3kV$a1gBbh|7bW|EPxybvuc}&<#R;wb-_$@Q= z25LJgShb5>N$2=r?E^F_!y&5#eWJr0(l2b7!|LJ*^&U@DbXeSG^h`7|<X-p=QyLDz z+Z4r2QA&G}UJqcTRW4xF&zNN=veLCVj%UQa9ytwh^5>2_$;vJ`D$(NY#8&&8&EkOb zVGl+5VULSfYkt`m&RCChnk3RM3>J_*p_0BSFXN1?cg;Rrujet3!B7Qx5V`3~a3jUN zXj~#ws%aJmVGa1`#zPR&p(3m%x}RZ9;A~|`s~s9hPEXsV{g!ROUt)KG?=mV5cD(#@ zL>ERQuu+CVw}t9rU=POXo$FZckRhH_`3?oGvR@G4nBTdCc->C#6dq2ApO~@Em3UMX zD%i*AZ?BQ(6mBkitCXcl+c8*EmQwhFm1JH^2yxSf8{trk6kHD*2W;ZS*}>vynh1ba z2D^w5p6+<~v?*HDxnly>TEWM3vL!GFo<e|#)fL6BY%)ND={eo23fz3S^q4Lo8$zEN zBl$M(BW07%kKP$pgam83j7+gBN<AHk$efu)NaD9>8CbfgZx?K2@x_Gbo^&zDkD3u( z*=lDHs}T4~EBaL-w7AQZjz$}^ys?*4vdP2V%@n*&vS*@!i3g~wvIVgMNr>ObBEjx_ z=xSoe(!$Sif98*i$xb-Q_5skE36Ag8!d7`L^koI6sXlGpu(@`}bqHS^$UqN4ZCKy? z3_6YE@eG6(D>ezadIz-Tnry#OrO1^nz`fJoHQAa{k8J7HU`{L-o$-1m#kg7%G8D-^ zLmo`$P)cGE0*^1Q@1TDLmB*~$ljKE^C#F0c#a}2;=i#xHFryCZHb+S+v+5uHg*=2< z?ox}VZ-K!@Y=ItY_y4mzFRF%1!7TNOp^T)Yb?<S6R>oEA*&tK@4D*Gp;bgHKT7$<P z0m6lGNTmL<!>={5Q5A1?+Al29(RG48z+5$!P{!<hytQBgJpHik$B-vD-(lQi796pp z9>~L7`19&70@AIJ3C=b%`%i(VJFCeHsLEqSfXgY!WL&$@@)v>>N<&V^XLn!FocA@b za#fTf!cEeQt-=>J$W5c%fE!Ik#O72V{?E-#fI<)#BX9M}2Itt??}sDEh+8()fKTup zc&=dYH)VD_5+n6Y8)hHESwQ=lA4Xy3Le!jiTq<vZmR*6|7x5WUHx>2l@861U^~?r@ z8}TAI`8BxlW=ue%6#Q}k5y#&SbM^uIW>&`ZGTU!z8}l5FI66)Wpymhcc?4}4*C!EI zrQeB(NlOvaJwoK>pCpedfoDcY)SX)gby4Yap~;YcxY6WYFkR)2^odf^vj8>7H}g@V zd)U&>p~u-7yq74XRb{uNiqVrXg*D#YH7p_LH~f1m@^k@={Vt$J4L#}pj}o^W#AU)= z&yrb+zF_LW-G*W+h#!TW=n4BLv2+Al2DAFoRgUB}SL(~3Ob~Q_!5_vDOI0wN61n{( zV8ikPh`=HlgEPewLAVUK<|DA*3C93_hBFkR&xE5Pkr~beMh3oq*#t+}f*cw-%%PDt z`=hBZTkl1;@QE%ml+*-4R&(3?AmqLeQWbmOpM0l&LV{TriDd-)eJShECK@<wH{H<y zsB{|E#e-IGiXkfRGf4wEKUqzEe`G?f0^@U;&Fq-0e2<np&)IV35!3&OSpk86{sM5c zX#^$5Q|K#}cbbqjX$WSP)=9x-qr%phFg2nP3kt1PIn$CXB8$;ofpY?WY@T{~6B{+e z)`6fZ#iGT8Ek`tbPk=<LLA`07kHrklsbrEr={+J<3gjT5MGtpSZi{J0>eCM}z8Fkt zNF#SUn=e5srrDl78w-@h$$k<zOx&V!QA);0RJnUGIVj6w`L%3O{#r-U5h0fn*uS>- ziH$LFGrM$<oFxagp_l9oyk~bqncOd#oB_p|-p0ANk!)MCkjYQd0D4`wq5t^^>PR+P zD8={KklMC-)CN8mBZ^O<r^w;>`*UR0PwGFQa&LEGXM-k^EnJQ$s#~^*4<hq|YMa+! zsKrNI2UF9#u?w)x#4e9O3b=yx=CpS~G8Y#L;@>dWDvNL3@*Ca`iwc>{+z;Pb&0IMY z=V~g?d+g%1W)(YQh<B>Ie*$`C_&Ygt!;0AaGfzF`c!vvcTX5}t7cj>0-AU&0p&Tf# zH!Dy&#@ElEiBl=7UdQ1-O$Ax@>qk|ZsnOtTYw5zBF|<s1O!rj=$7pn3W4LZ_7j$ga zi_QJ<U}2@v9i$hGEv$8rRRr}DO~Se^^qPL%rB2+R*=YIE5;x?U{F!-Kd@H_Wxu5VK zQ#8x1eS1o(kbC~ikUg8Sw8K_B_d;<F+@nhOG?RTc!Dzn5&=J!39WvpBY&6d4W{-os z6i7XFw$dsnzMkf~nX@cgYHiSN7qIN(yd;r`wST)bjfci+lwZE`q>fkT87g;SW)OB< zw!5s=sM~Vce;?il(M`-dXbQHy?#4f)$OK&Mi`4$-aiZ8>&*NaA4wAbI5((aGf80}m zV#Z;QBrin;1T8254hE;EYgt>UvEZwo@Kj{uqV+^kT<d3Ybp@LZ^E?VWZHa4^);kFK z5qkzJgxmC|Gm>~)8i4aCe9okq8yeAQ*it9;scEf2g>1I%uWI#ZPm@`*n34$%=Y~=+ z3=a;&u^^8~n_Oqvx(y$o%`wFxe-yP+C@?A&^yzU+Lh@!s=anZ+VKM9qvcM^ryNvmR zVt3$oJ-QfH54Au;faj^4GDpjiN=qavYN3&^VCW2J?WnMIo^J{4CRfvV<jVrGLHSyg zPHCY)a5&4Fd5{WcBZ1go*I5mVne!gnp`oFW%%L_HisM-#x;e?zaMo#fVh3y#xTlbv zS!Lz2KiGzr{5J6@>r)Z?YD`3-?>-K`#Za~uRu4IGbm?;n=MJ>kp#ns%r?5zkeNN&y zYnWJW*s!@d1@j|_vri*Y_ueF53#WsDc;-c>o6=T)X$?Hq8u8$;%we?5X2J6+?1m<# zCH#7e%Y)uAVt#$v>S(+a_4OBx0TGt#EtnUMlYV~8Y9~WI%;|4f8<I9o^#r-tKbqo3 zO~5obAIal!BE->W?(|}?241j~LuubjaKOfem$3XzT^Kj0Qwar4<io6K8g07%ZQ|=N zMaT>yAw$j?kl8YnLS@bQ_;zj{2kl$7Oz63dG%+w3;XK#L3Zz($F{Mif(KxEeQT3Y1 znsitZn>Q9N=|SC1o3wS^T5xt#jxiAlqsykW`M8J$RbG=2)4gIm*@C3f4xHvV1h*ma zP*sl#V2r3^WMf1aE*5ppHc)9+EGwYZprHpQ<xKEjAZ~hMHgPlYH5AoY4=Cex+3MK} z1y6I)gs`W6OV)IZlW2~!FsHD=4ac&a&Hr~ScjN=gJ|Daqg}`R(V^)fqAAil5YCw;% zMG^XO-8l%qkED&f+=j>qAWpx0Q&*Ci`WPBk>sfbuO6-1)l=%ZsAc52xl6~IGAshjG zTX#V&q9soc6po~e=@gAq0_tJtk>LQd?a`-qz!k_#qalWjqw8PX$!<?WAF>vqIK(g^ zsa`v<F^eMVI3u`aP@XmXS3qL2!*S#?1WmGW0_&4K?xi7B0CxAn*>xGSh@A-S{QDRC zp*3l(j;n9N?l&OS1C<k&bRijNf(|bU%Bz^EzN${v^qxJ>53o4SqPi7sbswkU$RYvr z<&NVj`wk`NCOu7GAqWu3EMz{Ynh{p0t0pSf!^3+6qDkV;sU#cvfZC%LE8an?YIl#X zF0Oe6?xyDj3cr?uwd};8T2VaS5rNG#e+p&&@mHBfit6`zbSJ#g#7>ODE)?u>T@FUk zDQO$&)-(KW4A1lLx5K9(omGb5|BQn+3QNSsm(es5`0F4pLm9l57N7Yaz0ze^2D6p# zqfb?C6y9oJU8+0ljrmhekQ%N+r2!RE%Su4+k()Jd#s;l8EV7pdo-QAds4hQZczBYn zcI{{hwoRnD)DUx#yb+&f@hP3e8>UF?yr6foSUF;5v@_U5)DY=<g<Ubp-Y#YjXx@On zE?89eue7E9yq*@-Zqeec=W#2ujO-?6&TkSobz#>^9?LSY?UL78g@e1vfX%+52!4y> zyXXasF`4qeof?;%dg5&hppw?zz_iHakHdi*F|L60HF29@;2zyI1wTKsiudX08?)VD z?<xr#Vw`{%N8nwiq1+FzLlhdgv&2M$GjBH-?I;(W%FYuk)tqSCybLQb3X86jWb)P< zpalJ<b_R8Sn6qi>m}iUh{AZzhKY3^J*B;%wF$OD^!`piyYe;r%P1sGxhK|!SAt2&- zXDL*UV(Gz2K`PSe_P~Wba`BC?^eN*c70VhA7q5p(0oIsuua1^TRJ5$V*Mfq=Me6I# z?)3t{hp<L=)DLxHcw-kZZ!fHh@U~V;4UR3a?X@MSzM(BZibYTppsdd?6ZT=uH)6Zw zr+hFQf;cY%wJO2F>ayhC6xS{^7U}8gx$-d1Tck*HFHUObY@%p^z3B8o>jTJiBC(`$ z91TYDSP7bek@dIAu96RZ)cc|$E?kjS5d4v|9=T_-erOaH{{P`Ab=v*TJ@!Q0HQHD= zL0+_4v8SASm7HRZ+MD1Mq%Gz<(t?%q{1NByRajij-b?F!cMB^DvMuiDtG0LTRXkh| zcO}T6mg@!|vdvyr=!K^S?3T~gLXjS_a}-XaMs%kHT#n#T+9x#&o=xGvSjGPL$!~3u zX8JEI_|Tq&IfKSwz{s6{y&sYV&}gz2duk~x_9JWm(V8zb&fYq5@K4nCd91B(zz=QZ zE(X&+grAP`au{iQqJXUh{)cZutQOWLgsw>+RPLvR!4C;c{=ukPI1^1Po=5B%z0u8P z<KB9tQgBYz1$M_H%0`Q2-cKBk?~g)QftO!_;*k7cFN8Xu)IGmqag$SBW84>_X+=NT z57ryH_rYGmsuacZV>_=)P?JqZTQ3aO!#0h}Vq<j7oZHS7N1rw76|UP4jTe`{Z#Ake zSvUL0abmz<4|5WkW@nJ=oB=CB#R0-=TyubnLfJUEc9rbL=`ouLuBSB!1itLe`fM|9 zYZ7M0N!enGlYno+_S?WS3kR_ENGd6`!~cQ%<9W&+u<+whBPdc8=u3NYBicoi-|dm| zag+wf{JYi<j22h@039t&XVC&@TB;-;N2d`y;|Hf)W7CQ`RTf`&MN<X^H<V*Dc;S_? z2EI-3*Z`z>IoXgz&eW^Hg&_D9Ezvy$@1NkK3Y2kR77za~FS`Fb9Qj`jj+{iRtjv|% zN3$-8FTlvw(vyV!{V=?!>$_7_+>OJb{6aCp-?tmA$f&I3gECNsl+U92s5<=lbolHn z*jrOHLvgCC?}Mz5m>o?-+BG<?vps`JCjqJHfAj_3guDKye1Ts#SxmrH_=%{#HUTqU zWxs9w*Es`KQLMwp#YJ394{hp9(%$gDDLagfIK>f#4ll^n)<!dj1zym7``I89uTK3% z0RdIcY^S~#wx48qhW%G13>Z)N|H9+xVSdWLml2KGkRtsq>PeBT2i1ihPLdr0Cpdj* z`!U8zBqfhxmD`z;J7PlcXM`Dn;fVCy)cBUGPj8P3J^l;HtSR}xB?!gt*yzd1SU5&8 z{i6(QtXXGI8&76%Brywy>PEmhMfMbMe?!T(46M?HI#hIVaBITi52eV4h?pLQ5&T;r zn6Ed1)16hMkx)HJMI?n|NJ_}}BKq({%tufv!PmpfkszMiP_Jk4@8=QrQO=0sOyRs1 znpS0zBAG*nrh<$*bN&=$l?pf1%cOQ3iTIOCtR4Se11!6VG-4p1T*;`rb~Gy*8$e+t zJCXHOlUOr-)5or1!(#tcl7F#eU0P2XM8<8*GKy1J{nhtRCW8T-h1Fl%Js@y^qu*oP zR|VL!-=ey3<9+R7OM^#y-LniC*e__Db8vSJ8ZM&}fwwZa5c$8grAWixP}^OWC2}@| Z2r}U$EO0E=4&Q*;N8y%tW^enO{|iMzF+TtR diff --git a/client/resources/hardnested_tables/bitflip_0_11f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_11f_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..5892009d2624d8eb1f78105f0770f6603a698095 GIT binary patch literal 1448 zcmV;Z1y}k)T4*^jL0KkKS*-CAKL8_H|Nr$@L9>bUK@`9d5D)+mL;!)90r6lFKm-&y z0Dy=91Kr>YKL7v#00000000009MO{#022{`8el<)!7^YGhcslwzy!o#Mwk#{Fie;P zVa*vaFaa?b5vBwfj1wjS7;{EUOaM$q1ZjZ=BLvBSMjX+T695wtff`^zh`};o5rIic z5RFDgnomU3^l3j*JwwT<>VBpuVt6U$si*f;LV8Z&eJ(zs=Reu|k4kr`#bGk)eapFc z2Z7j*50vP~(m3d<?_I<Gp2x8AB|DEvS@o>HtMxyltK40mg7&Z2p40L_(C{x&9;3># zy(#BElKK`udg`m%`rJeLK4+Bjh`t5#od*|-51nKB40#qW75Y9Ff9vOXyOS7U;<$U` z^gYq|A2alKj`e+y$@#mTPrdM};{OGg2ZH>Lr&qOlj?1I5kEv7l36b|NnTq^N9Akxp zqB@|)MU=5j6lGRiI=Y-PW-}P*oke8ItYTuAGF3cDkxLU9PXJ7(aX!Nliz#K3EU}8r zF_pxfS3|LsGQeXMmRV&(p&q5xVUr<&KJu3ngE5sd2MA<8vRPGOWUBBfb_(J^${&h5 z2YSOMTmj@}V&QaHjs?)H%ZrM`BMhmGI2mPwj4Uv?Sz{fMaI3*MJBif071-crCkumt zj9p523B_C&R~ea^oy_QrWn|3koEK#1%ZrT3oktu-XGRDguX*;KXNll(!=d%Or*Sx9 zn0$-4y=%bF;$4XHI|<az!=o9NdRdnaItkTdqYmZRo$uzb_}@6sE5yl$Qy9hvl=Pn& z?lR0TF?2ef>6~9t{g2S-tFY{4!|)%1?_WZHQ^nqQyDv%ftJps=-mh7D$G(T9;#Z09 z2kknX9};#rkIc(2FnlY}zSPIw?4JAo59V}FLE^l}pg(!<1v-bwF=dR(#vX%*yqym7 zxU-4p`}leo`X0macsnO$$L(KY{a^BSd7gH8oenSJ^(^~G<olPb?@se4Rxj9>#JCwa zUi0E#z;SgQlb-5s<BPG?)O1`p&Zb;=IxFBhv!U~+QPI)anZ_UL?sPNOIPCI=q1pat z%6W%H?!I?Z);$Bn?_T(LIy;wT>pe$Q_Za>H@-J}9&^`cooy_d&x;h+B74jVy=6tVt zbUiH0nVFZ7<Z*Ol^qC$h)p(p8&vAMORor$vIxdGp&h|1srY2!nv5LAD7^Ve-xhTdH z)Lz3K6<iF$#XZ+xJ&Oze6fis2d4kM~xM0FpL{>`nB;uV_&>c&mJ36NnaCUK7Fra&K zqN4o)N?z4cmBc-{RFx<HB7bu#CMs4I86zc&77VatrHrOCC6R_qhB6sq$&rdoOBt3j zv0}p*W@ck67+7UkOj%gQOC@G27-K9l!HWTyWrj?wQy3;oBQa$#!xfClWirMrrdcq= z$(4*VQ!PsvWtL*gEY1WBs;fwXPpD6iDb)dWVi}68nOI?9nOT-%!xfB+7AqLWW?_<< zF(yomWXmNuu;Gkj7!t-zVquIdW-?10ET;n`WtEu4WWvTO$g*Z;Qz?pY;UkP0jLKz} zShFq^Wy30|k};Cui-OAxmkGr}<08gV!GjrCOsR~_iw0vc!EmVIgE7Yd<ApI3j10+Q z!GkGSCk2$aR$+?DuuQ8JFvBvlF_#Aw6NxgGSjCbumQ>>=7!DIGqlCCr<0@H(GA1lc z#b!v%GRaJsqmn}u;g&}!Ck4YQ##wPLCRH%FF@=;I6yalwhFNkPM-wZQlPShW2+Fll zg{o5q31%ZQq-<zlQH-Q<F&7RF4kr}imBhkl4k}z?m6IwsWy2X*C1sRk;NXjnIF)6A z#foK;S%|pffXS3AFiVC=W(wfOV6lK>6_YH%#ubdNF(l!Xrx{#-_`8xR!i0rqh>`d% Cg`fuj literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_11f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_11f_states.bin.z deleted file mode 100644 index bb92ebe2a11c59e562edc176d361138c323193e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9377 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 ArvLx| diff --git a/client/resources/hardnested_tables/bitflip_0_124_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_124_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..d3601defe79670a2d8d49849506795807643a4b1 GIT binary patch literal 1327 zcmYk)?N1YT0KoA=<=WB?EPeV(3fRh1&j#)sFPQiMh()ABpe>vRuy>dY-`$+qM1-`I zt8M8-qCz#OAk-<4c$c^YH+8+E2hN!VA}@&X#WgWYw-_aW%*l}Xa^HX8^X6NAtnCZ5 z>}am-Xx+B^WWvq2=f2upe=qa7M6OhqcrzkO=n<7FL|c4<VpH`0oT9eprQ3=i&-NmP z=(F@Tajt9b1mt!ljD9IPF_*4z%^{+qlf#N@;<AhBkO=y|DB)6R+b(gb$z)Vjji&cs zD}C~L#q;#MrTo+ZjU#)5EbR(!t>?UHFsfcDtOGZgUe8EVc6>VP8TTG4aPeMq$$%j; z`;Bbc%?44*oAtHigXZIJQ?Egvk>^6ZfG)Q5{16&xVM~dz1B^*P+6U#CBVESz+5U5u zlB7TO8)r|&r@oU@D_8dXy5|Y*?oB!GTh83EoWTmfdZrH}Yap464G=@x46VwGM1>gJ zgbab9$6b0P{<>09`ELK8?1rQ)5-Yj#65oe+Car3g_suV66{DGkzo5LSW*xD?3&-!S zWL7S8$d2q<>!%ifO3{_m3`YtaPi7fAW>4LV;(%GitcuK}zV@?Pz2x`fWoLCGd*v@P z*wsOQmajvSK)K(VTUK6Y^sHT)>!7@n;m3)NP9ufeBaq4T&QBoa5rlDa{9(Sq)T#vt zK{zA4FIweQfe=FQxHG6ta_Z4E-n#>Yn5rHGVF?`J1Hq~Q?|1u2Ksy4V2}lKS7aC{< z(+Z4^^8R4MPOWqrFb8|?vUXyeQFn631(gQ7#iBN;TtoQ-Ge(Qa>Zn$HQbJ)ed35-C zxSS1IP!D82#<z;qw>4hWqeZe#7Wg}(<e<zMHLzymL?Rhfw`>0H^Tp=n3>bfdS<GMt zMUk6V3;)IL%?%O{lUW5E8Wd_Pg`7s|9gf0v{pRXq0xdLJp&Y^@Ph)+*><WTL-#)02 zrn^Qnp4wLP*OHfaj2x*A)!#%@wAm~0S>85ce`7IFC7>6~!1T{lgi+|k5A^WfZlt-J z3o%YMkBAh5-i6%-fb~cYsHh7(PO$T6jTf}8r2675E0OCw^(traQN=9oL<tX+<EQ3x za~1X&W{+vjI~N@D*1euo<@Af)lKc32-`qc$W$ibJ;%ZMfJt^KgPoftzPjyKwR{(I1 z9FLJhl829|BWD_?mc*l@J#oNz^=Pv$_2t@SWn8qBrcaxYq8gANX%g{uO9{Sl?n*=f z59Ls&6F)@mZ4X5Ji?sk!Q-LvOCGkkg;E<Y#WAz-`DD%6i0I%|b2I;z=<VyxX(Col# zAoRRkLz0Amgi;qTRxTK_jLpw*r&gQ4Cs6)v0T*R(Yqeb2!%aCjA=;WE?~W4FI=Q^H z!ED7Qtqt%D>P0Yy;DevWLNBoMCZVOg<)D6htkM||lNh5<QNG#<Xg<I<0Ttz2%FHcP zp3a---dMd;)fkmwW*AIr5gd2mC_JGxnJsVygBl3pHcZn9jR%|x1D1@0kuky#JQ{>Y zgJuJT*4nX2Lx6MAleRTMsKAmao6?ea=balXr^9GP5GERv4%d-NM2ZX-SE!^45uZH? zANq*aTT|4dkckR}anzzU{@5xPgB-VyA#T~IEhJ%+Z;|yTQvuRZlVB%{4Q7qcCQiOA zjInSO$|mj3CiPS{maDWXOhkdo-K6OrfMdmp0?pCk?g)a&#hbkkj6?Z{@`EpmMgIZ! C))>kF literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_124_states.bin.z b/client/resources/hardnested_tables/bitflip_0_124_states.bin.z deleted file mode 100644 index 0a37cc5ce74303e7c0b5893abb72b743a90d5ea6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16060 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 HjJ5v>&9?GJ diff --git a/client/resources/hardnested_tables/bitflip_0_12c_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_12c_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..38dbdf2274c3a26eee7d11de5e01e73d420450e8 GIT binary patch literal 922 zcmV;L17-X|T4*^jL0KkKSvyuzIRH(gf6w|Wz6}T{7y=8huneF81CT>&00IjX009bU z1F7H#e*gdg000002QUCkm;g*B34|~NU;~%{CQJY(69mE-0x$v0023wv6A6N03;`Gb z<^Tzk011S_Fopn(0CNBY$$$jHV3<PyMgR&*Q4>OHc&DQiOs1M?rXVyPh|?kBp91({ zDna>TMbsm-RbaeDcnb&07=|dqbQJ1J7>rcFSOyfR>Q&(|j7%0535dm43xlDIEGaOs zDda1l#fgIzfiVht3R4vj^oZdOrHO%raH)2S7Ac9s#aNgzSSZ63;H*Y0Sg@Gt5s4jy z;B^VmT|#2QIsnC3E`x&%I+*B29ZA7X6Bam53gE)V7??T-4iSSGW4<b{7{PkWg!TuN zddb{gg76jG3xr@SS7F>Sh8NOalJA#NolfHL41Xba5j)}3y92a`4jrU@<}QX9;q49` z40J9Gb^&%6dW=U46^p)IMR-pLb{IHb(8t(*1L`pGgz<(b!o*Jrcg8P4P8KKRKJoXD zw0Q?%Pq;9jynJRDVDF0+{SWLu<Ec86#5gZW++xG<Cyc%!i^g0%#n8BW#qKOGxW9<U zL4D%*3-BI7r;vPvenEXir_5eru^oiG#fk9@J~3kGF~Y#W`N93mw6N+IX?~D;%gS6Y zA$)}BUx|B8;yZ<bivt(ZeS^+liFFgsJf-Fyabbb=i_8>VN6=#!s|;9}VSvTwE*ulI zTsU}+heI45U~qINcrn8g>R~uAyyu$l_YUzLgmAmX{?Ekrj==3Z3Bqt*^XD<?FVI~J z+%L@eM}YPRls__m0pc&zK4R#9!SNpPc+1{?XQ(^{Jm>s82e|5bh9`L8z<Z2OSXb*M z!lw$n1@;TrUc&kd7kFLabD?&Vmv~$*h29qqrPy7Ag6J$U(6}*lE~A9#bQC&}rUbpg zR{?#cgpPrL!hwa*LxMgSg;e_R2}95-Sg=uhFsWAx5~=DeD3q*U0xF9Rg-~z{5>_EB zK(SK9r8ry^V}KkAxJkgF!BpTFs9X?^7%PAnrAGoVMhS@+mL?_+31WkSa9k<CVoXBe zCLzMCNrJ*y7>dRbj0(hHNrok2V6d>jU`$L^ivf%QiG_wS7*erdaEvK%V60f2EF*=5 wF@a%$iHa*2C59Da1z^T7SYQ}nVPeJ=h8V(=3`%gt!~cu9BAh5l9jhrEfU&fM>Hq)$ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_12c_states.bin.z b/client/resources/hardnested_tables/bitflip_0_12c_states.bin.z deleted file mode 100644 index ce9a966fadb1b6041df0d301ee167a8e36cb01c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9734 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 C6D~>s diff --git a/client/resources/hardnested_tables/bitflip_0_131_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_131_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..0afa8f655f2f5a490f955bb7b26f6de3d69bdfd4 GIT binary patch literal 6964 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 H%MbiNqgbT3 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_131_states.bin.z b/client/resources/hardnested_tables/bitflip_0_131_states.bin.z deleted file mode 100644 index 6928656f30d6e2025c12d32344d72b9ec0259424..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31946 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 S$mvGbbXzB&Ej8^2P5%QQ0V%)$ diff --git a/client/resources/hardnested_tables/bitflip_0_133_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_133_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..400272bccf895b3c847ba1e1225b2de1852f81c5 GIT binary patch literal 1861 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 E3(l7mCIA2c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_133_states.bin.z b/client/resources/hardnested_tables/bitflip_0_133_states.bin.z deleted file mode 100644 index acdb9d9726ebc81263539007e90c8d7311ce7eb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15941 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�N1-!NblKS4w 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 diff --git a/client/resources/hardnested_tables/bitflip_0_135_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_135_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..242ba30a6541e12728d18dce496e7863a9186e5a GIT binary patch literal 12922 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_135_states.bin.z b/client/resources/hardnested_tables/bitflip_0_135_states.bin.z deleted file mode 100644 index 8ae5ed323a0d7ea5e54a8b7708ded9f9a4160b62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42791 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 z 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 DA2qth diff --git a/client/resources/hardnested_tables/bitflip_0_137_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_137_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..293c1f93f818c8de4363209e0e4828e85cd48c32 GIT binary patch literal 2914 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_137_states.bin.z b/client/resources/hardnested_tables/bitflip_0_137_states.bin.z deleted file mode 100644 index 73202f119af9ee2d76b2a1850bf560e16451c046..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23984 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 Y%Q!ZHoJpfyWDq939Ds*uAwTbb1IngeY5)KL diff --git a/client/resources/hardnested_tables/bitflip_0_139_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_139_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..97761432b480e33fdf4936541ea334c37ef6223a GIT binary patch literal 2400 zcmZvcYfMuK7RT%03%Q{PwBDOEFj#4^ZS3vsW&=rqAW{TwMBcp<Q~J7fce2?)+0Ax& z>F{W!y_sT5UxvUaE3VKHD6<L72=oc`G0u*oyL_0L@DQb=<AS2RaoO+t|MW}FKRGA= zoO8~9^1BRP4#p_MzI^(RYoxyzn)jYoJuRV>$6cnxk>cVK%@q|TC2^#~iKN4%F3~(S zoAiH0a~*<73I8j_N=P<R^z{Qe29r?IVb=jg*+>l1N0I|N6h3erSPyhI^~?pI=5O!I zn{RzueEA1v*WA6of8Wz@XYQCU7$Plg<dv>+TWNjtyOiwG0H)H_SmL)?&3~?Bh%kVT zG#n1RWAG6hpGz$W<7Qj$kIjEt&eU)VZiG(m4bg_ykj;!hcvNrUy&638K3&!Q;p^=i zJG9B$uQLCIndYwfl11ZX+8gy8C7_gS@zSMoI=sO%or(z31>iQ6oMZiFhD-*=>-gGC z4G>z(e$`-(L_jMd*@{g<)R)p9B&T|0p|$GqH_cDqUR$o&r*E=%v_3g!e|2FRvq%jN z^IOi<$W`hkmGzq>o&dYX{6PL<jr$0B58D(?$%&zrYmCNYt=%7(x4%>Ey(H_roT0Vo z1vUB071_d`F!?)nJ*|!(o5Un1_?x_QSg;nEnM<!-9O+(8-+j&O<LsDLnnLT`n77Oy zr-m0+_PzdvwXEw~bPf;Svf&{lb8@m?vMzt$`{}01bMIv~y=4-(PmE~YW@WOp8wHS| z;oZPGR`)h5U)#Ppk$sB)rtYWjCYtlznapPm_w>)XeUNp&y465_vXkKTt`=Vs)1ITX zi({+ZGh@Yd->ZA9cUA>r?sm_qCs{GX&>Yz(s{Xz8YpDizO^fv@*03^`?p+hV{PoI< z?DM;oS6^in%@0rJ%#e+%TUmdA!)uFK&YHz^ZfyNo<9_Zdu5I770q~N7nc9*034^pD zs`aG^e`k287RUvHEcZq~Iy4dDewIm|&{UsP7yo+Nx;_8bmZ|No^4|SIUGG;r70t`1 z*z}g5sdIBm_o9#0jE+Xz9FIU-!x1f=O_A!sv8q+nVSPj2jfOpY(z3^2xZt}h7Dxk$ zpC|n?o};M<d*i19D%At&7WaO0!N$G0jr=W3zAN94QH$8d9et`NdA4!(8Oj+vHX9rV z2}jXhwLhXRi6Ewx=8cWs&tBJK*{&JG_`c!i^`=h^x3>DW#+KFoC5Q+R57}?+kZh#g zI``lx=mqRz-}=BfM$rKFn07(#Yhm<FOPXTD!glSh1gl!kUG$l>0MTDEOV3c9`q?l6 z_QeH*i&eK96X#V`v>VI$zf{|48cuKSQA{YqTS2@h(6Sf;XJ|>Y4Z5bheWLPWh&L|| z-gnRMxfh4CKXKMVsKbB@1Zd;&XEQI0?`J*T{`bpbT_Z)Y$u>3$t6EQZQ)j+?Bip)1 z=RX$lB1`VT{38y7D#JChQ8?Xe4?Ma`%LkTdGvES2gfb73!i0sZ-B7Jw=kG9gEY<`A z=0>ybS#T_{l^wMzHgA*hrWcV+sJT6`@T%!Q6HDK(mNtf&jN-4hvxvsx3mb^l{f=*# zh^U@p9Tp6??h@DBCyM7-d-M~Ca{y(KdX1tHIMCsPZNS0dT;b^<0x9YqP)cZ}o@z;V z>8hS`!>>OhI20Va+cj1cy;hk3N(*kv^eK1+f>O_mJGKjn!QI)Qo`RoQ)UL$FKdg|l zsqmCNJs9ZFC;W3wP#s=Ysw*>aHIb3T9G>;g+}8F%($9eg@-bTeIX*WQm)?374BLMz zlHc@)r`5<3Qd2X|r=r8lp>&mcYzdL~#Hz>So*CDj$>RfVI}%U|0i=xOWv6`$nN39i zt_!q6)+c6mr)mU2oF-QPd0$KdC6)!W$;@JNCJ?h&#;WBEfSj~N{EEbqr=7#6g`7=@ zPrk7Bc?Rfk!qV0#KqT2XGkKg!$~uCu78D^y5d#$=LOyaYZOB*#_8sA>EElVP)7hL> z?Eg5x-u&1}r>AyuDYP;s01UF8Evqt9IxUGi@yRKiLHC6R$Yf5N7nFATA*{q+p-?y+ zBR6rBz)(Jji|CBA5=ImSwEzy7u*0EW4ht{#&G#*K1{s%~y%ab%1+f4?ir_4+rL#P) zWkiG(JgQW3*qsfqPvIL5L3t*Q&6}!}62tH`CQrj<xUTWC^&=H=Ip~bvi0?U}PMlg% z4_$w*2z1r-C)NZqAWW}8f|qav14BFl@gBW`yUjJedK6GNZLXkQ61GbbCyq=5kl-Y) z?q+suX*(jIO)567J8t_`^?+(9mlU{}0Xr3bBZ3oP&~U*t1B|0}U=Y`HkU(&lFvYz% zckHY!ebxKJ<8=(TaGcyzcl;5Pr|xl$Yt7EnKpZ<LtRukZWqgM0DwKhY1u+z{3x%R^ zS&C7?v-WYuRrPZFLY;oP%#MiQkUfk_Rzpy_1&^#OxrtFKA2PR_twbyz35U{WVA%IQ z;io7D&j@?^0o-Vl%_6h@o0?qE=9;F%xTw(MnFcT=A5!KJ&VY%E-ZvjC4Cr)#qw$IW zgo|Xj5%2QbcqRzr*=2SdLyN#l4x1{HGsKbdo)E{2z+tDIaPlEOfchL^NqL||$4<lw z#b*Y3jxRo-bXr(eL<2e%Ag@ydD?x=kIzpebRVsLGayB)J52_zZZDA*K)W5Q9mYaj` zc~@YiFfEK*8ko*d>H^zqfU0x?1%A+6F^YJBa47l7N31Dwd*PkD*QYmYSwkxqtDi9P zgz+P2=`4Cz1W3Rlk_SsHV{n|JFd_*DON;?rPNhQ1({^0Mky@xiA%hh-`S~H%xjb6J z;{o0BX=g`n+qnW=UuRlIfxC=VnI_C(oQGSFkDzvV*kP|k?I<`1S&pLp$aK+Bp3xZu z?Yy?|UAxWPK_HHU1g7~2h|3vJ9s&B5nB}xvRX*^cW|$%xgJN8e;7D!<_sG1*zfe)= zH5^|0xT>X8eef8>K%#s49K|OskPXKqYH5W&n;GtC85?ldN>P>rO&|(<yaJxc5)<!p tr1DyP5|@NcO+6Uwy2uC0Y_J9_YCTaagC&v=o8K7EdfM9m_~qc{e*uj6O27aB literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_139_states.bin.z b/client/resources/hardnested_tables/bitflip_0_139_states.bin.z deleted file mode 100644 index e43946366bed0eaf78fff28d5c7146db51a06f62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18850 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 J5pB*9{|nsvW@rEa diff --git a/client/resources/hardnested_tables/bitflip_0_13b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_13b_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..fb869e7cbc765ec821c8731a591402c6200914b5 GIT binary patch literal 1405 zcmV-@1%moQT4*^jL0KkKSv223`~Vgo|Nr}wxw`>9)g1v90nh;u5g37$0TDqF5Eo$( z6;K3K)EM9jUjP6A000000000EVKiiDXk;*r42GIC0Aey^0|*8Km`xcP8W{{DLm{S( z02qv!0Kx%)<`YInhK553(8y_{Kn5cwKrnz{IfT)Xp`nn%G%^}!&;f|akPILg4q-H8 zXlP_GjSPmGGyq~UWCI8W0HmaeFqHIaCzQ=ikq=O4G-%PIMi38C>8YABn^WqDC*svX zE692jxT=;E!f?f7-v(niGGgI$A9zX9xMV{3QTxoF5co$ExtCA4J_XWz%%#zZ_Ri-I z0hIg4seNM?OY@(s^}9O{+IC!AGbUU-mB7m>m!jct#!nP^8JDn~Fs`10^D*XU@|gEb z%QG@h1M;3{9w~6(@iKUwJ1Wmce`4wCdOgN35}!U&pWdV<s;|bSQ!iS0sqll}SH_OV zMPV`Z#QXz*bXRilP8Hx!_AIfCaG!{H3E5o->sVQX8ChV<CNUnM%RczxWyNu0xleek zF=cczqwqXjN0>60nL8_joJ^IBaB$#87!D`AGB}v>UzvR?=uboaSDE6cw2vhB6DCY9 zj88Pmy~F#TwU6*SC#bSzWU+<q6Ukmj-B<6pJ&r$dPZRU3u;Q@duIRs0+<3n`r%zcf z<gpLHJ~!k((EN{qf19RzPc@GvaKZ1s<K{mz_C8bOKFd5*@-k%im2n=1R&@L?w&UY} z^Si*FqV6){aNy1?;Lo;F{vwy!EE5rmSe0=qWh`SXtSqc91@R}sWiFE(3j*PmSjmd$ zV~L2xWW>pdlM^L_B{7kgsW_tyhYKj~g@+D~3D``!SY6b`II&pA47wA#FNr&e{)*yD z227pDO5(VkCL{A6!|s=5mRVyAsoiBREL>tSmvaXmPChcrhf3_|99&%;9XQ8K=(x|3 z(~gfLCF?LcF*58OkD1tJCl+>28E|K37G-eZl*;KkbgaiuQ;UqQhDQq}*yt|>hXad= zVT-}*cX$s`oyXx$?hC}rz>h<-iu4$-C!;gy9SPl)*vj)Tzom5jEA=>b7w9{u+;PXu z%d+hD9!U1MJs#D?*?1W~!QIewK2?t6yMe`hhk<agp8BbO1Bp6c$S~r&0?B!=(!3AQ zc1)fL!r;p+ss1a66SBuk$nH8GjyRr0aN_B4oK6QGM{}j-y-S0;FCUYO<#;c?ze@05 z^7|*O{xcnyx;)<Kz0q;Rf71Pj&U;1cK6gvydM8gY>sWgXy=<&bjwW1jSHMm&@IE7= zKFRKt;Jt=k*Y&tpG5Xx%`PtyElj&YaeJ|9$bLbykK8L<><ooLOmzpeNgE(Zdkv*#w zUczy4U4~(nT^9{|%{X>+pGx`{V-Ka^x@GVjF9G6syPcLhESYg}V(4cXIx#yj#~d9T zV~pv*?taoG29%(_wki=mq}7&6q*vt;ERa}>6;p<lDpjP=s4NeuC4MkjM8aZ53k)Vv zWiXh^v6fQA#L1RZGQ%-gSr}smR~A*n1niWHrHTw+R(4LqCJd!9ig9tnELl4#ROw*4 zLDLpxlLj&|mJCeF$&9g#>B8wrE-{rXm03#RI#w=%sdNd&I1`3dESCcqoGHT<RLF5> z3l|p=#W7gIVzH6N;;EA>BZ%TtkuHp|;U@^n8CDgQ44EpjGBGe>j8$c#WXQp#Rhlar zl*q`$z-5+LSjx3!YBH+A%B;wYvNIKy7|4vWtgMR|rIsOOl}uwSs#wfnGRlm}A(lkT zC^IawjAb(wOv4#S%q+neV64hm!IlFImRM#|F_dOh%vKpn##J*0SWL*w1%?4(|KjdQ LrwS4Vo9G{a5t@&= literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_13b_states.bin.z b/client/resources/hardnested_tables/bitflip_0_13b_states.bin.z deleted file mode 100644 index 742c3309b4ca59dfc25179e95bce05b4ddc743ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9228 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 B2NwVU diff --git a/client/resources/hardnested_tables/bitflip_0_13d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_13d_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..46b67bf8390c313cda54c091e96c87bf6d9ee92f GIT binary patch literal 4000 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 O*V;x3<#FmCC;lI0m!lB? literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_13d_states.bin.z b/client/resources/hardnested_tables/bitflip_0_13d_states.bin.z deleted file mode 100644 index 4b95e1ca99889bf57102ac9c1ff28a0d2cc019f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29602 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 diff --git a/client/resources/hardnested_tables/bitflip_0_13f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_13f_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..33b2abfc2ddf80b050eaff7da949a19d7e184dc3 GIT binary patch literal 2056 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 CVynLZ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_13f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_13f_states.bin.z deleted file mode 100644 index 469361ed5d87261ab5e56e256f54e27ed92a47c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16504 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 diff --git a/client/resources/hardnested_tables/bitflip_0_141_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_141_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..3be41189ce654db39049df6172e23ca7bc971cc1 GIT binary patch literal 2798 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_141_states.bin.z b/client/resources/hardnested_tables/bitflip_0_141_states.bin.z deleted file mode 100644 index 61746bf772f02ee158b08fcbfce4cb196859f30a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21419 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 GqyHaS@%FL+ diff --git a/client/resources/hardnested_tables/bitflip_0_143_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_143_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..99328786c5ff4f95d8ed77c676ed2652d6f20ac2 GIT binary patch literal 1533 zcmaKs|5uXt0>^14YCh935I)ZtjAJIHK4<a3{eg+*@(X5iAT<?sGm(dfb=nUXn`f5G z&86WNn9FbYJoi#I)0)XCq_#tKH3g(Vjx%@K^xSSk)TSMev#HUV<<7qRy!S7!*Xtj6 zr@wpTZFH}aSD^HNC%8j_d7GQ};B74t9Tz|isNvMKP+p^O3d1Q|Xq2r7YDA~P!(l(P zN%?ctyZ+z@e<kH_WJlkZ6BCqITSMNVP$rHr+FNM<IP&kZx&rzA)ZSFN{NP64b=QCL z9#?gZY#i-P{KU=Zx$WLJRB`f=;$_2A@SOH2tLol{%VADmB@|*Kch}Ra|DQVB<fKM7 zlm%15D&L!Xdh1*?tz}sV{DZwGzNhXB#%|QDUd|rxcu*vXjDAN^|H^ns6jWZW<d3#` zOa($1t8>}e^hhARyvNc1B$p?DOjup+qU7vy>8(DsPK0ByY};`TO%?b;^;{AcI`PaM zGY^v4*^HC9y^djLBm~Mhoz#*}v(<l_K2;Ugc>F@bT=evcXvj6X0+v_spW!GlLykI| z*)o&}cuaDaEabey$*Ar-6h)h?;1!nUiyIbqVX@QsFAPX>zTe2X-yAr3DKc(YXLXD0 z1If8>!NhDm#w^)Mx2eW<h8+u}6e%h>K85%aZc?-{<81H2syoLj)Q*aBl_IYN?>Hq! zc5kU!7F9c!xFP3PGKNVtaV~4r@cJt240`hYA4@luS&bS}AcPUib5@fZ;QEZw6ZO~E z2A9Scf@yK9$D2RTnGdU-()sbt{$JS9|9tbSPVUU3@)uqGi`B7m4|mCGb5ena)N3J} z)N&6DZZDe#pv?fvY9WDTFx(zLa%wCRNQy9ku`-&HbCa`5yr!ITs*pc4QKr5Wl|*kO zv_%Rn;?|j2F{i8UCo2taPByz1a{~SAJZf&J<7q-0i`E9Kd>ksRrBRIw+>ilMo}h_o zm4$OagBp#%WzHl_8QVASgk|sq?qVYQ)DvcLP6`t{zu-(dZ<iK2D$MZ@Y?T>sg<a-d zSgbt6At&uK#KMR8udzAu?UnRl+mcdFf5pw@59p!32{K~+77MJKtInFa29a&K`u(2{ zcQ2pyeH=1UF2C_?Py9Uh=-|JEJqzPtHJUc6!=`>M<#)X?E8{#YHr!qOF;!~81^<O) zaT7cDjyz7eVz_D7%@~O#dsO@E!;iJ4p;IM<mb<qrf9&Qb(<_ySBZ5~$^#cF8P&mix zW2=@&RudP*h#2UCTxI9ob8|~_#@f{z!JG1ib9Ecs{@!Y%b!^=8zqQ$CA3a<hnGUGe zx&*<iN1Yo(d8vusCz5bglYfQQ@O8YoN4+DS_XDFA?5v&oHm!1UNV^+-S--Yt^@Z%G zAR0&`*EsZn>5oeG%uo8h**}ENms;09e{dpm3&p(UK)Oy;oN3vHX1-B#q&p(>-dxJ; zl;AElfeds!qsJ}-pSPKvmVW!o8J<GpJ-qe=(cKB{AO<i<n;jInF<5xPg~UZX7q?xr ziW8g$1Hyl~^>P;xUqE!9NlS0mQzeozeT=bTw8gX^a`Fx~XLhrOH&YYa#ni-$dF=oS zZFOhtz#z4kuwlG?M&ACrYA39)jz|qVq-}|4odS41ZPiG&dell>bB$&Iz>6xZ8WK?! zB%-Z1^IgpmO;>gWdd%BZB#s++N+yExF)D-`ZSGvef@3^{Fl8ApVnFTVB>)4|3FzU& zc0nQ9PSy?R3mc6lsl|c|MfRov>A|-Ugp}g7Nz8~kk(mv{K!d?bg^8(_MJ37*VvH$8 zu_Oe6ydERryT;dR21w*0-zT+UG*ZZvDr-+ey`p|YLnp(_<X?+70<R6%7on~GFFtd1 zG9wd6_GQ$a&0<&yNo>Px6iuU3J9$y*hl&|<1@-L0a!H}e)<cRsBZ5n?BG92DW7-U- zvqMKa9Nk_oEH&z5gs=Hvwb9mwBqc>AB>;y>8ET5x=UddM&Y$DX)A9sY;5eg2BZGPm T0jalk_a^IDmgvBl-|zl6lH;V2 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_143_states.bin.z b/client/resources/hardnested_tables/bitflip_0_143_states.bin.z deleted file mode 100644 index 685cf9d00ec318ee3d7da3c3f84394b8be7f7414..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11143 zcmeHtdwdk-x&I)?!)ZOo=;3gvMO-RvsYM$Vxswd7+MFIQYl{%MgrOqtfj}2Q2#{>v z^wVEO<+37T<dTd>szGvDAcROlGPD8<1Ttbs)+8o_*@PvTB;#f?yF0h{`8~5iywrZq z@1OI}@6(yjCy?yy%scP<JkR&?yc=5j+J63e@PqBlNAsavJp4gmTkaF5N~-Ss-NFZd zb=wcyTbDh(tmUDb|MjNlx(P%i&>~PKi)p1+_s0t)N%mOotx|j&NL+bEZS3>9IL8UG z$=QB4y-0Rx#A=Q&^-G2xXk_WGF!ZbZ_B3+~3A@b!pkXfXY5e;sd_6>YXw*no5USQ} z6Dk%2y{U_Pp^3<Rgf)bqWbP#@k)bF+_VAuDLO_yL6+|B)3&2;b#8;NOt(vuFWz>*k zQT|B<E-ogu9-6gXa7UyC?ZM<$U0Ud9wPFR}Cv<m*PY-jYR52wzr03U~nW2azw-{<R zO9F75I?X^T_)gHdJ~#;P<JnjW8R>o07taS7#t7jtq%mAg>+C@ZuUg5fP!ZvO09j_B z4-CrnsZPpO!)Iz23=oTG0u@xY7WV!(9HcH<9EC2@A(?^Q<n6L%RcZ6{mf}*#_Oi6J z0Dw8a8a_O~q4*e8jtR`k?}SKE7evWPohzsLHFPQXYG4b_g?-MZu*&)vrq6__c*$kb z2_25SD$OUuAPkeqBjjG)Du%ukC|86XR%9ofgUiqe!`3TMa+e?z6?)+SOoKTv;-to# z98G!#Kfa8Ay~^Rcg_B_f^JG6nQ^gk5=h2oP)A+EyLzG6s;n31rcuh8s>iUQ!AXL)r zx%809W>Ho*j%;TchOt-`?o=T_n_1EX!<pBB-v@j<oZmnr_Ym=;Nu!`1oT(6i(XcBB zKFhDdXJH@Bs;4esi>dwWytN{9evCK6!-$c>957B9Fjt^~7z|_TFG3p_&GCsjAjQZj zA?|yDDh70LmeW2>@hqHz`H7d9R!!3_%JoC#`U?XjEDXf6Kq?QgjDc%oa^PT?*_LoM z-bhaU6T?h{;U{$;F4Y6}%^Z1SXVv6ZwZzlFTFDn_z7%){CXMx#o~E_&5wk7dV#-$2 zOc?RxeAutR{Z+Z6YVOLWms%ngS4jR%(+60M*99Hkk4P<x)%n4xbVU#bPvnmh;gu5* zDF}OM&ZM!)%~yq3gy^}F1-l}Su}~f%GU*Sya_GWNoi#M~%zB~*CEaDt^|Mure`_9A zpVe^im`lM*D8?vlhCUpyom)w_ZA_h#?OAL2G;V?Px%u-c(LSyBQUJs<u8KOC9PnF& zkp<nW^O|oxPWDJ#a+-7v{!fg&-Ui)OD-^gCdaT$WI=-#q5c**P9rlyeG%Fq<pMv8M z^}P?vs(~ES=T+z!aG4>}e8xw~JnDla=IPP7@NhtQug)p7!HTZwCwmRy6%yuB=tQq$ zHu$bm-qQS0^1yc)=FmGZ(wbHI&%prfjpY{R($cO?z%Z>{uv6iCXytJ`C-KWZ;MQ3q zp@-OK2YHfCpyI1UBYh@2gJub|F}{s8;^lp?Lxx^Um<kWURq|eQ3|dxMyp{8Ev-*0I z9wN(3@5}iUgh;=^l{QYN#eQ-u9IK@b#^`w*bV8jW=E4;W3RcskE1{x_V_D|Y63i1h zHJEJZLWk-Sh{{HU0kw+^uquft3;uE3>me{R*qF&zD1iuB(x#{12ZJWZ^nxtHI}u{A zODx}f*itL}F(kCYMFHbM(AnAVsloy%(seiO!)fla(|3mD2;fQ%lc7MBtJahX<pP^g z3S&~Bw6p*k{k-X<Mbt-=UMqv3F8u~0n716NBSbnJOo$95o|TR%T@IMRZhBfU9n7?9 zFb3(8GLo@32_6K#5GDt8*!5*58|KlL_^?5^dU<mfxcZ>n7~g28ao#RfnPBlF6>@n& zX#{pzlPs3W`@{^Wq{85w_;R7n{J@*REifO~F97K<GZWw$vc?i*I1Pt_=@wCRdkEK$ zahrPrup7oi6diB0bbuA%Y{6sam)(x<{}eoIiF=0GSFZjAxKCT|iQ61u=yv%9&ASiU z17s6fV{o-ppvrU$dJ!3@62(#ets`$zPB!go2ra)UamCy4aJ%Nd==ulz?QObQ8}Y^W z#(i9=WF4ClRah&#Tp$ZP=F8C34|l#`3bpjwTR&DzA=@epBVc8Fg-gNR%cGW~mmIIz z3;&7B6rM?c|J@LjHl_lXl55=DA%z#Mqx-$1RkzCGDI8Q2V|@EbC|U#`s_-&`Lc|9? zfMb}oToG`qsEP&ct4H3wWyOm008H?bL20z}%a2a_p68%X54A+#7Loh|^GrUJ=F;ie zIFD=XTMWYYreZa%ytZ~VE)|2|Gx}vxLS81(w=iyR+$Znw^8{Kgxb-a}VWpk+V<^rA zw?rN_1KUW%ZB4>NyUJNfi7(8?brnq+tN7QC!LzwA;sTrx$JW4@8y_t>>JE&rT71b& zzYDGj$%SV-t5V@k&x!51?Y#}*EyS+1BO*Q;!l?KNKKqkdS+T%kHMR+=LZAZ%oz6!_ zVStbj{&MmjeBT1goM5QR?SZ14J^P!QnwZ>;t3sb(tsBEKLX3S<f^rU4!07!rh>1Gu z6hm1DfQ%8SbRrfRjJWR$7$cZZ9suQ><U9-Mwb008d?I87z*j|I!HKcYFgpS3pbIlb zSWmG6SK~d+GrY%aj>1`$M5(lw>>&}h0jpWxG3rg_UMb5z+Qh=dAbI4(EUh3*f)%Cp zc9|>RCd5>}T|A=e6M$<cQDa05^IH?)LF>ef+=B`!4j~80_gGw5FP8)?!`v50p=I4S z{I>V?h)}zYZ1DU@i#g^A(zOsNE%W{SJ=M2>c58(B1X2)N5w9~#(l5m-&r)-wA!zBi zQ0b5l!*y0?*A1`{H>6pv#_*<$!$LA0b_o26w<rYVavk$)8P@f!tBv&yF@ze4a31p< zbdnzE0j67L%V6Rzkg*i~8eYJPlav=>5pJ;Z4?)dEAwCt+h9)ul+Q73Xxtgw9N#9yU zT_<Q!Xj$8IwtHiHVVuuSy=o*KuXh&v2or^DS!vJ@8B$*Xcxi1(5W{OWI4w5Kf(jB9 zc@-DD6DEY9C?-5u2s!7aNrR7{79y}y1Qkw`t~g}E3l`a67DGWfj!irWb(lFzIH&9y z3cyYUa;koLq@q^7r<^0&I&(7ztux^gPco0Uv&_lu8gbIxUr=Gd@=?>>CDy`tdKw80 z><X~RKZ@|2Ktr9R14@wY1?pjckX=YK%`>Fsuh7LE3myEnKxmGU3%O>x7gh!pk5v@A zrKFaggZvn8(LW<0Bs3yC&ic0VJ%-ey73Z4EI7mN1dt)}~NUyC;lz2DIsAC@4lL74> z^Fw*!IROso*7mZ>=X}@0V7j5LNYs37sOS#?%%jJ|2Fhh80wEC!%u^3X4SuKsetrUi z8tXWtXlx;7^XlJFhh+{I;Z2;y(?Z-i5_b8M=@13P?6R2z!%WED1kfBy+nXW0_`9J= zz6KZi;5i3$&x?tJxMt%N&B64LQ9ayM(vNFn^UT=$H|oV}b-gm#<P-LItY4|&@suNr zEz=>A_h*8#7`itskQYK)DlCs#O4S($H(qjtE|N}NiH|4&g_OOCY?UZ-Yw~Rf5|>FM z0>zx6dtW9h+k+V412<OCJ_1enVBap7y9Z0`je?Z;&$unkBKx7K%%YbFH|s0K)*e-* z%x8*_JPU4TmSoUMUGw**z<BXy{N_in^ixxaO7Dn&9*Rz#8%Gb*AJFEdI8k`P?CV7` zPqTQZ1hr)@>%V(rV9cN&`iN2h*F>lf$GT(cq+yH(<!1RWC_HCY6WR|yqNhpw(&eW$ z@~-N{X|tuqD==N-<LpG*g*SHv;8WzRmT18#41UhabqTcw-1G@%Lsz0!GCeTL@1x^? ziIo!9pa~}=;?+jmIox}tTWx4O!|IC5n01l#X?~sW-mvPvXzVnLi=_@gv&tFl>hrq8 z1Dh|Y#n;qNBHpG#1qRIhX9M}y)q=ACnxY5A?+fAdF;En$DcL}soffZbC4-^8-5btL zff^nfVn#ps_QAC{UjPeXt(Of(q`Q&Gh@|xeTI_%(Ht3r{FR9-RdP_&w;o$A!Em$^J z7pWUHKqB1o&PEP5%X?*V5kA&m3MCym>=s?#T1wViALHy_G1z_>jv9qrh6|)3LU5+0 zqQ;sH6HdU+Ug`|Y%?2#X3)-Lo{5pa7I$*;|vwt5EKI9=tAx|YwSjh-`<&BjG8%YLm zGofxut_tP0P-EV%`rL3-(a9OPdLK=nC=PpGf+x%^&=cl1nv6~+$DmhakHMB-BS?+1 z_-mo#%f9ywkog(#Iq-B$xM*qBC?vNK3l7SB+-78R5M9;|uwgRKtV6;Km%@Uf`p&q` zW<S3Qyo<o4K#f+UO@&DpYa#GE<guZLFZ>S>BOLlV#GDi1A6d4vq9$0R)5=Zspo26A zV3dzFu+Z;@UA|=4iD9;v1Ri8|%z}`j9}hu^N5Fa@Hwh~=gom4!07vNP0%)~W<VBqu zwC<Y)ZPbkcZ=b^+EQLm$Z44k$z-dm#)nhJq!v|Ef0ZA$00=qJ;0?X=NVM*6C_o_bA zmr6SmY*{6FFWLn6%@&N{A@Mm9P;l)`JPTn^=Pd~*Es|`<|H)=cDvFI*YsoD+@q7&_ zweJo@>>OGc_og@^*5*$`MU7{Y-iE0~srLe#34EL5{q-g$cS#9hyJ6o3*x$6G0DQfC zH=@L;t3nwRx51`ObacuD;l!~!ITPa=>7<}b^9_8Joib!VGTl5@=z;72M(K?jGW}_R zil+1y3E++H+zA_LTK}To{A^3yuW!~JJ*4TM?Mw4U>SSU+S-2btq?4UVv5J`qaj~-% z22@aq*bOcoiz%tZ+x*RA-)F6nWIok7a_9=nF;Gu3Q^(uCsq6*z#`kvAdW7<d!vwme zy_VI`6HGHJ*F)&#AgF4Z|DlZ`Xp>`GL-`<Oo7?UZA1_y63Dotqndu8a*(!yTo}LEo z(x`?3ZWq_>p@R{J=fnXrREg%64vlf0&UWdJGDt%PxEIsJf=bL<m|?*RWU)gG@y3vz zdm+OE+ckEhxgTmb453cq!`#V+?hdelLf|&g@yy98)2&9t=4_f)cne<eHuyh4Ehjw6 z|3Svbo&{ByZ7#JQHp~537;&!hbjQ#`A_mLXf+s`NA8uA4mH_y68{nZJs5B_D>n3IZ zT$<~TCY(c=Z??f>n8GLgAHNzwy8bPhh)zNo90zxw&Kp>M&xZxws?YVr;O0XhLmdVx zKK?RH+|F5PTX7%}mMO8>u>*q?li`y;H^@cB+sL3KMmO$(mWWqn8^SFMdKIL)m!YQ% z>6Q>BSKd%rohI#<(=W+~LypoE3A(hj9oN&b82A}b+BcV<oE!8_p-wS-e%R#C8mx2& z0?5>c@awB+HVZ{ctPQy7SUK34P)S2~kuxFT(K0CK;aJd2XK5)p!>u#-%cIUX7A9Xu z^{KhW^~9pd6j2_tbw_Avd0=V)_Q1R9zle_KmP&=<T^^KF`nx#$Cu1n_N7zK~09K3@ zA;6mD#(d19&J8f3+2YHJqtxN4Jz51t;8oGZlPN*zdQ*sOX3<%&#p@oOJ7$2Z*gdxx zswnd5{8eTTxUPd%VkJ-B(?1J-sB7%LNl@dz&>LchF>lntJ3Q&7`D^B%Vw+f*w{xq9 zB(Cq$$)%X9WJ>NSxR6_bmSC);vfMlRtAdcY%<(K|T#uBYcwv~&-T&KKs@)@GcgE1` zQ1Y}G0!iNf0b%#?r=upwaSx0NqtR$CMCx+NrsxS3^$~QJp&QdR&%t((=Y@Kl;OwT> zX8#r|nF9`D`zVQO!X&zb_g&`~U%buN{$1h>sG5{QZcY4kHf;9f?BybMP9_BINgcXl zJgsRqykWF0!N@$;6uT?;4v=MU|8jP$fLJs4DyXiYcPuh2E*;|OXP`PjX51CFV<lV% zhM#1t4Q3AJ%z#!x(~%~7K|Vj3Hm%sk>KhIt*q4%eEalq~3@{x^fnN;EbEB)w#l#l~ z04q>yxh0g<2GJZ=WA$OFMe#|kWJV24&9=0tCQYZc7fI$uudq@kZqLe?ltmq&xn31| z{G>t`&;{dVP9N|Uh{Ttv1Qg56fRN6HIl~kN^z<59oZ#%~l{71(!VplBAR9ChRp<H@ zJvlL`pGJkt&{R)eGNmwA35r1~0xVV=x*1uHo#1v@HbI=aU!ujfBi4c%>J<{<|BI%O zn?E^9YtUE%tJe}Qsn@RQz_Xb#^2{CX#wKWsj%KEPW-3QbDWS%i;7EY<LPZP>D|Bhl zr#TBkDW|ip5L}h0SNEc0H~guou+HKsx<cM--bc|;5^6#uYE3;ta<99E?8$zMZwzLk zNa2U<9b|MiPNLjF-|ibYdCrpBL-VU?MKZZC1tu+K2ej-CHkxxG=2%m}qp^ifRIEw5 zBs$)NP(7p(t|^S}$J<au`TZ1HSR*9rm}LX7GXf0;cZWz)yOcXNz1JaWaL!ic9l{zD zDiGt@S-8se&A8&O#somF?$`K5-%rHf5}@Kvh433dK$l0SD7TJlf<f3Z<c|tE<6f*i zlk33)9M<$9vU|tZ$nHT2>MUs5J|8O;x(EG`9ku=C04_(ueK-JtI|beQJuJu}!q{f@ z1s1L9Vi<nt4@Chd64Yw~-xqlZDnbsKycevf_(Z~TcK{mez!e~UaPl6R3|fv~27K=X zmWu3x>{_Ucc<<&oIsxXOW@6XTg{{S@sP?#3CSMpk(xI_CVx)Ewy~MlU3;w9pjO9|N zq*Q~jhVBoN_0(;NDRiqywjh0DVU=I=<zlLD6?)=nfr(q$V~g*_!6(`sQRL<-Yar=G zf`jQb>~7Kjyw6<*li@LWOd)&rOl=CEqU%V@9}B?nJOw_0q$O553h+tLSU=P?z~#62 z&#Ci>!D2_kV)dNm>%a*P8LVIcRRYW0To1Pr>NQ|^6HHcxl`#<KNeAa)z@b%|+!}8L z@jQn7u)LnXDCC+Rcv0)FL@#vKh_^g26^Dh6XjgdnHE8@4%31h?CjSy=d)^><hY!8^ zTT>^IcCkSeDi$dYW=XY42CO-4FeQdOlEp8pP+Ug7bl}fjci?>mkmiT}fPgB(<sio_ zc8$f?K<p}iRWikg3~ZN_B8VkDP`&u$1z`HN!tLRK&a8G16j#jf6E!YQq3vk@!C!i0 z-Xt5LS#f-d^E!crF{XL6Df<5+r3XwjeL{s$9<?^nq>_bju!}E*Tk??6Xxxh^LQri^ zmJwqrKR2^(m?<O99;N9rJk6nNYdK^gk-kM}y|T8cE0pJEq?f5#(O6NjO7@3@ii(J! z$8U66K32&hShxZsxE%J=py@P+UqN-Bc$N)pQJd+am4cQH<BAc!-El$nWkx>Zu0lgZ zczzKGU&&;ipErihqtZV8kO?IgSx^4dVyE$;Bh>m6tnIM83yRlK;RtyT9lhK3BJTRu zgWRoggZs>ZmNhwHHq+EGmwO00ybjq}23eL6cdR!Lf|7x=dBfi8e9F?<2w6%q@J6d2 zry<R8eC@A}-`nAk9X;d#%%7A<_b0DG=?AdtT~zd})f=A*J0jTUb1Kf?L7i;|rxXG2 zp)Luf!wsu7@x`zGSpAY)6ms-gPYnHaker<fr5X|~n{?d|H?Dm|k6QIjXQ)*~+|ih` z*y}(nvH0=ZArNqkZRjk3ET1%~kfTHiPu(=jmQa7Nk}I<!9OBQUTtEBNXQoim5`tpC z8@c7o!s2=|7=DMA4#7vo&=^t2ydjeh=og-X3R09+K^}zSivkw3uN|+QUZ+|!uR<rb zaEy-ceEC_tu~!x{U{N+DpJ`r(kq3lEk#(U<vhinlRUUN&uVOX*ch9Y5IK$&`u5Jo@ z)uga^7y6=K&ei=*y$Y!YX;=jNS`6dwB#jF68NQdH3i(2*ZP1EX{4hW9xQ3d4H~FUR z!Q|bAEICi(rqjj!<i-j!TcdrO9tlj`1LuPdD|UM1?nQwRzuz0UB<}Uh$hB>s1F!@u z{XUEeo!$2a9Gh1R6Hp>?v7vt1Q?R!7Squ=x_V%Zp#`i@M`kX*hI`lW3YcIF7eE(#! zukX%<SnGl#uEeOn+aOVy>w{<ijbWBN3ZZVzyj2DFH`+cpn<<*{9SzRM1U-^v@dz0@ z%>A3z9Er)?HYr~2Wm~D^I2GF=JK{vpckS^&Wm^+Au_j*n9~wXNztQ*sjeCzz_d8X~ zt(tRLdc+447o&rlj%9e_b)=XIWy_em=MoyI3@7<~KLq+=Pi%~3`Wn^ASTN?+u_>sG z3?T$9wuauO{#2*`-prF{u~TastUU?WA`Ob3M8~fWd3MQ+#lDFNXC?}9D?DhD^`1M% ztw82fQy;6XNiYN<W+=s87CW_0G)^4jGQh8rchR}PQq;rNqxCgxHR2d1vTXy|P@|0o zgh#}TymCWuMwSJH?H3*87h!7v8;~V4LlaWOR`eu9e-8X0pe<L`q?44mEzbhSdZ@06 zz$Gbvoh_%YAzFtHfDjd_R!$vEo(Y{M4AS&75#Fg~zf|~sJd2V6Y&KvQ_D&#u=pH9| zanNg{tO4^?qG9Ir%FC^UO2)6FRTlV<V@+8p%c63!upK^^Np^_UztyRSQWFI;n)Phd zW_%McDlg-C3ie?+<wwB)v}oi-(^W?>5S(Mai7tbEbP*D@zY2s&$VZyJD1G@=W{nR9 zbAR86q!0#Zxx{_|$siJ%-yLcU&+)**6w>GwdS!SufDSH_4mf|^9=j-H-jVko<+4=m z{nD$yq`ukvMHskP?g_i*Cv#r~n6uH1Es&|)2nB{&fvuD|i9BWsV+4Jf592A|j}V4= z@;vP4$rVi+Aew;Lu)G7?*QbR91^j|ZFjt;)DuC^<|0<XB>;GlwJ{Eu6;(LQ^TMylh zYsPe@z;J9=|H7&>#R3cv>`Ftbicc6i*6j9JPDM>G_p$G%qQ;WNV)V?k<aM@-z>alh zdSo~oV*6?#BM=W}b{fGG8hTb^(NqIVY#czgs(3uu{&Jvd^L?q?^01YjR)ZL!B7#!E zQY0KYR166J`7Q3j1BT{$3kv*bT5g%}#mE@u3XTfaTWk9?_+yB@i7Barc`Uqzq`C9B zeU(nO?!|V<!olfSxiP#rxW$%_r`YTZLc%vVaJ@+0FF>T*kOFE6`-Vjc=O=Mhsfjo& zTZg1twYfjWYE0fF^UealmBd8J5-{+@?0ZY6f$!+Ibc!6zm0sI7XtFH?-VXj^N$Cw_ z0f*WDmAwTW@xSja`1{_1zwa&h``!Zc|Kq&{PhHm#OL8I95EFdzeDV{+f?6Bkr3AnW zYfX>tu^wk|@7ldk@*1#rKtGQj0q*eOW6vyjfg)Z1>s>zRBs8mR3`#R#Ew*%!&87=d zvrnM{6D8PDO;GbZotzFA!^^kh{t-GNPqo?cQi@Q?GBY=9vR<sPX?k<2Gs0zK2hTNQ z@xm>ZC!Cb0b2Uh}ENrLmJ3`YW`0b0<PdBAR&HWW2Lzo3W`C_Y&3Ug54)%293xzu<D zx;G|IEQFC8Av6;?wD$ar#YZj@B?N;Ow&*5?a90v~K27jxP>h?E_Wps0w0<A-_ytvr z7jGvo*8C;DR6czj)z7%meXuv}wAzhWY==3<4dkqh>Q{9xA{?##O#8#i-quL-ejo7I zhQ*y7aa-cs{XPeF{J1_79SjtbrsE^{jsicdhK6;G?XX|WpBIBcI7}rrw+&EzK6S-Z zJ`bU@fZ~;#19j^GR;r~dR1O7OJsjD_Sx_=W@Q2WM+UbH2{|F14*W&iHw|3(`3?^?4 zD$0nr4TjnuE^7|%+i?!Lly5JBWSwqpJmZb?&AzqfUMN)8N5jv4RS;t5urrkTrP>^N z5WV=nt);4!EU!r`4H$br)FL}y{WP6ADgS&Skg<Xy+)WFxyMffj8%K&h#ENvbO@-!) zPwmEv*c+IR{Ty-AOaoodE*TA}!UhmiA?pk~5UIG%FNWUb8$Wxyt5TslBz~dO4td>? TOltp@5V*Y^z<j{u{NVor*F??* diff --git a/client/resources/hardnested_tables/bitflip_0_145_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_145_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b31bd720ad1667a9133597426e53e638ad0b77a5 GIT binary patch literal 5397 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 T!{5AIwLdSTu%)H$`=S2_-}8E) literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_145_states.bin.z b/client/resources/hardnested_tables/bitflip_0_145_states.bin.z deleted file mode 100644 index eab4935d19f84797e1db54dde028bc9b26656961..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27056 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 diff --git a/client/resources/hardnested_tables/bitflip_0_147_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_147_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..fab2780c76e4def6fab2111ad3e2d35c4353a87f GIT binary patch literal 1057 zcmV++1m62XT4*^jL0KkKSs#BnoB(!?f9=5;36bO5nIF8li3o@ooB#kA00Dqr01yBo z2nyf`-v9sr00000008Cy36lT`guyU|0E_^000hZ^1j1mLLjXnqIe-FWzye_~Od)_H z035&pGGGBPm?jXw5r7V00GTiVm`oE0U<kkgNl8siqefFtQ%q_wKr(5epwmwprW5h} zpn|97S7JLN$if^Wi-3+OdJjT4cPlDhg9|1`VqudR!pgf9IHoU1EWGNGfJX`pQw2sS zWSI=C2TH|v3BaaUPAP<+#A2LN2N#%kk92;a@Gi=IMU?MSKia*roK-PP6D+K&ER^tA zVTHwp85bEIXUO?kpGn~ICy{rCNqfvI-5)En<zF+WMd@b_^V)q*oyVLflzBz=u9p$R zGYqoNe5zf-#e*neV<Kf{F^m~!NLLb68AB+mFNBn?hz3P_#e8ban9R&y5;z<T7<`8g z1`d}O2Ni|-4lXMUFR^=z>3t`H>~=dY_32+ji^#sE(t6JI;Ij3sVTtAhx>UW@3{xt~ zofN@SC19rtWQ!SLjIgZA#$}krS(I@rEHW}UR#SzEj9fiWAmfJ|SZA<yTx7c|)_5bJ z=*r5-=;<97NvgXwTui6leg--^7G-_rR~9UA;f}+Lq|A9rQ{NI#d|zX^a2aG~SDpRW z44LLwUW2ln67oD;RnW#_j2K|<c5va)#w#*Y89V;II$-W&izS%M#(l4t`<=nuWcXG` z6+MF?@w=C{GW5D<k#xFVcXP$X+2ZydF7obPFDZO$=r~@ZFHw`?4$BNOtg^DPWlsa{ zJ=N?k!@**{0`OdZ<(IU(FV<b<+pzT=mt79^oy>H{9A4t?UM1Lgtn66J5BzcSit$qw zDU?eQBkLovWtLVfRah}8gC#}`7pw+!DJv>Ch9zVq${C8p#bISK%MpS53Z>ChxS)3- zmkNe162X%OQp(C?j8g*1l9@3KvargTES555GQ$QKGQz-P5t71~VOba%kztgWu^5<) zSz{TPWMwi~GRrTyT`MS<Osuh!445&I7&2mH#bgX*rcAPBV+>|tk&?-QgCNN&3`Q(a z!opc%u`tFZ8J1!lC2>Vqbg>Lr$}W*`IAx0#Tms?7Gb~ezW21!3slk+8D~pOTlHkPR zVvdBB|FVnk#q**`Lm;X@45bpP{6z^(6skiiNlWq!RV+U)6-$g%gGppUU>KknEEKC4 z0@NcVWMac5D<ctNVl0y)z+lOQ(#V-bl`Se*lM=?03n0q1RWdRdYNIKlOj@HXD+a1f zgDi_w#HE%+GR0#MVVJQpWMZ;Q84N6>vjW2=7-GprOfg|mj9Ha2lNd#q1(*ghOlC5J b8A8J)m{u@hg_&kC|Ha&qP81{u-_B<M)Of=9 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_147_states.bin.z b/client/resources/hardnested_tables/bitflip_0_147_states.bin.z deleted file mode 100644 index 4d66744006d16d4e1ad791ae98bbb0929c19b203..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9834 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 U(?zlWKSi;s*VwF$`<8Y7H%-AsUjP6A diff --git a/client/resources/hardnested_tables/bitflip_0_149_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_149_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..eda7650e5a575c3a57ae66ad65c9becfbcb4809e GIT binary patch literal 1763 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 Fi$JmJ9lrno literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_149_states.bin.z b/client/resources/hardnested_tables/bitflip_0_149_states.bin.z deleted file mode 100644 index b9da604a04efb2fab6a829a933473217585b08b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11380 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⤅@@pXKzl?jH~r{*qc)3ad2a3J4rK}97XIZl?e9k}KdR1>4L zz8uN%N7)4}W~19f1;ayAnvl1NUQ7RrG_+Xv)jPr7)LCAh<c6&>s38Y2iXC{d11XN` zJrTNm1O_qcmaV1-++Tq@iP~Wg9C0xQq3sMAFcM}0Q#&zIj;Y}Pcpka7rpo&|eQi6S zRM_4GmPVSt8frtx;ZQ>;cld_b2~76(MVipR*URn}?VT3aY~cF<Ue9fmuYXKkVNgP1 zHhf@(<4%~+QngH3+Tj<Aa*{UF>eX7d7f)6}{m6#|4WlCiC~VroG}FwUDyDg+v)9Zt zgnFiZTfh~ZBL?f|ij;9kFA4`ym4SXB!U0O*J>h`>UzJOl-mMFW1ig3^so?E_1(*pZ zY)*C5W@5_cMXRAVmYTirBun_b&u&N5!%F5mq10AXxQsnP+&_nt<ZOB{Y3DUiCH(L$ zu-NVG=Lyesu)2>6#~8h50RJ%c)Ik0+dJ>JGJrO5Uu~8ixG2I(ge(w{Q?c;qmVr5l8 z8-p;@X>tE$K(++C4>ILme-&<ctv2#LW1n3tq2fk+pi8hT$q+vbeP|fC!%ztfX6<kl z2L)Cs#|1{JhqqE&9@zE~_bm}j+g*xZDT!ZGM>E>2#5C}orEuNgIT?-;rv}%Uf?|nw z=VcJO;n_>j>imPKR=1ad<MI70VKN#_p^l(JSy<uWd2FRl^3Hll5+MnaX%ellnN7gk z44e+T&#)U4?SK=k+LT5sMzncCQT6-Y4M-oPVs9Pp_r3D78JxWbAK=ws8gwd7v(N)| zd@$J?CH4ZMo~I2kYk-M+_U=dpBd99IVUDn)nPgoSH4WL^*a!D)$oU;jjtYVeWFVEc zZr0lQjt-tB<SY*w18x}kFW^{YcC+Z^L3ApKGzsF4!4>!zc~jv<_T9cbDrxS5t60T@ z3lJf31v$_MIvXbT{6<=D`qqvudj1DrQ)}$244Sl!p2)G69ws;xSE`78dUDUwOOb?| z;JN^J@G$N`GCw6pxu1Oix2fZ-OQn{n0jI9CFRTdyU?tlQ*bv4}LRRafn4qi{JmdM{ zkbvp9FCTW4ouez7U@Z}QM=HJ!oBq^TZ5T!8!S^d|#ytuvbwA?z&@K<+bjTs-K*?yV z+(+dWYkg&C0GQtRo7J+X`_SE)gdBHHB6r#q>fZ6ZmOU3Hq$}%Vf42`_6YS9i^i{z| zvWff$VM)U4=qf+X>ydfUbHeC)ICy4_IWsm?DKUQ;CaC&oOG07~#p}ZSP#QG4TipN1 zebaOPqQP(M2A30cK_l$<!v%JfNoYVpo^{+1KsT5)sbt&3v;$*0CrE?f-nN6WjZ5XB z=L^-@it*~dtUB8^5N0yi3SF4e6Fty4;z<`SQw0(Kpez_AjUf+I5kOXlq->jz#2Qa| zxz8!S<$;@FycwEw%{{;p?2%}?qaF>4LDP=ZL-$hJ_%W>U;$qU6*A&7!{FtCg9Sc+s zc0)sy^?V<r�p&II_s^uzRttTJ{1HhxHx&7F?TY-uqA(h~aG3L7x8-JM(-N;q4^V zZHjjhQKaB}mxbx4@}IygR*j-nw{)Kd?UU&HvG5%`go4x}!8$E6#6-{O4l|{g9n`vk zSr}rlAcxW3Fp5gja7+y|WG-ii(PdxQfZejj>Q9$98kCcYU>t}RxMyF6<tkmpj-f$( zq=RQNGnc9+BTUpD(_I{QAFLaRjEgLz)6w?2uqrK|0P2*0%xrYKZG#PuW4WB7YMR9~ z{9YJmgcrx{d!00WBU`#qwg;M1ex6Tk*i;mUS!te-r&M`{+spzZa}+Z`tIicD{RM3h ze3VzG@R$e{r%mp29jS=rjqvr|Bb*bSiWw;po*TUcd#cb8rXA$82DpEiw|RutDt-pH z$OqLEdn<$N<J23Jn^aKlyyex;-eSdR>=ZP2ij(?N|2Ijp@VY7WQ7O@I%pQP#J(7L@ zxTKg{wWhi+3gn3FX%0gdNvV-ys>GwYhhWBG@J%2F<vtu_K|Utw5OWNqk~wBu^5bur zuyxlcaNM80uq^<cm9X?2)wGhRaJ{PY8s)Vp=<)dxOrUuHl$c-8Ji;nDAJv_sd~7$l zPY=PR_uoD;O4VCosC$d_rYC>#L+*9~tu~v>B~AF>T!ZD1sxs368klK-SJ56fv=q}c zn9a!#$%x5Nj`NFcLFuW^WV&c^^k8)AQ<?(t_d#|Nt)^_Vqy9{^kgyiyH48@^3<e9Z z=Fk~%Uy_j<RUN0T5XjN|lI5_hH&M^j{&L(;WQUh`Jz2i;$$eoorGrEKewkN7aTg}w zpoKdHXZz3_egAT|IG$h`@f59O<t_GbhCgB(Qr%raI{&*m_!}!P@mdk>4U_qX8$K?f ze-*?~bjP>pAm~a~R2uot!6{^v_remk53KD(&b9W^4SzKarV+;+s&5e&3(>cii^HCR zwxKE`Z1|W7DoK;b?r;8e6+C^8ig+&3GQ5_M`APE-KY)pA9F9hz#12b1iyd&gC`Po9 zoqd?u60~H1Gj@uOoo~N=!QH#tSDMu!obK(46&rR!?#i}nkFna^sY?^OtLWYgGeIe5 zmLGo;Jmcs9bA@5Tx>fjpX9_2X=$l9wU4#S&%;|=$d&_NdrtR_@0mIjcE6}+CaJ~yQ z-Q`v1X?XKL7i+lLiLdLhY8%QibFIWfO(wuCFGIJD>UOG`4)cV0LW5I=kj}ft*v0o4 zob!p4RnmY+@hKvNnZ$IkE(}G4N=;M<6pW%q6wUjf#hXQMXchx+Q-G-i{tDs0m_*wE z-bSGJzY6Md8L9AQK1@Ph5gi0|tH~RBQVxBFx=hg&XsiPs3NnHEQ>LA?5IZ>bV_i5# zTb=j(Z0@u#Jnail`@++{@U$-+Ep*eq@U$;H?F&!)!qdL+v@bmE3s3vP)4uSuFFfrF kPy52tzVNg!{M~<!_`CZh;(s`{e}BI4Dfa6w$_i}!ZyUEsD*ylh diff --git a/client/resources/hardnested_tables/bitflip_0_14b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_14b_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..c3c3dfaf3d1ac2f608bfee1a78d9a28f64125595 GIT binary patch literal 1058 zcmV+-1l{{WT4*^jL0KkKSuXDDQ2+>;fB*Z{ZIgjF0hB=*0GR*~02l%pK@b5D0RRLT z5SWS?&A8wOzW@LL00001#!Q(p7?=SvV3`0kVHg4!4l-oPh{V7NlLW{CqX@tdz;Tl% zOhzUEOqeD>4H!lMh69Y5GGZ|>0%XB50BFK61TY+A$&(R@fD<MOkOM{$fFXb>NkTLP z^qOg-NXj(YX%9)7f#{xz>K;VepQ?AoDnCqDDKUvyT;?g**qRm$RJ==T7{-iR6Xt9a z(y<}x69C+-QKpkhG{VL(W7?%t0Z*5m)UQ+jHXm8_CgJm+2IJz!H?VTK4yUa3pCfAf z-Az8%r0*ZJbQ_nnI-b?k#PS+AIL*ri(8o&YF?bi&y+>K^9iZqvZg(K*VUHljn8A!r z2fVt@4yG~G>{@rUVcNMD1A=ldu=KaCWyEm~HRK$tpy+NkEykM|@)+?8fx)=&zZc}( z{G4lhk&Iuk(9v*soaT*>?9;UFUd8yX<;3SX$0B?UgGXDf&SU9xF=)}@Xz?0&4T|R+ zrWkXau2W5hCKfG*4rR{ZZ!dF0lz2~Y#c&^Ly{$P{Fz^Ns!Eb&JReyH{=UfMsv1u@2 z)^{F}Fm$|ZUjzIe(_z$M=sQgo!v^yUl(xLjD{IbkFR5Sfb`8qoRwECX*uEq4Ud5&P zyeGlnU*zvP*Sy|zyBA{@u*H7%F|^v9&CFQAwP}vC8y<y@hn1twYz;dTq;omUK4tbU z<o+q6<iA%MIa7PkeCH$B;#}-k8hjfIdhx6=Ce!p^NsMf0KSKiT8%{G87@9517a4(I z#+D}4jm9v+_ZY-z(TTX;VYx9&2NJYV#u{8p7AVEBV4G7yosF$Lrk$-Vrp1gsOSr~3 zjgEDVfz0AJu<m$%K4*Jzy*~DjllL3f1LC<4oN=xTy`xLaco*7f?tRZe<1ZL?gUoC& z#fCh}d5x)iht|F4GWk49vG)&?((%0JCvf1jvC>bWXxM0CY1Fp5K7{f$uyQUj#xWXc zHji1gf2R@7FxYXfV|$qIdRXsqmhrgI=WIK~s-7xPmHzUo656q0gBA={1}rL4jf$$V z1w_(}6;W9#`f#7BrHcq*Fc#4RLju5PSS%Ak4J=}47Bom;#(}1aj4c{SX)$7HOG>R6 zg^0q8DWNf1RACsYi7^WaXbhF4iy{psEHI{%6Bxk80}{bwNu@MQRf=e=(M*c0WJ?Ih zP{uK0(-6|KF$}1zSgc~qCQA`aSXMDsBN0ms1*E{RU|}&N!xg29Mwm3PQG*hgm{SHJ zS}{;)z^euz(*s5&S}>M|3k+5mB*em4v07+pQet5dj3qQ+Rxwi0#F$}N!7Ny+nqd~0 c156W46-^izU{g#<Y5&FCkxmpO3%k11K>S$VGynhq literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_14b_states.bin.z b/client/resources/hardnested_tables/bitflip_0_14b_states.bin.z deleted file mode 100644 index 60833784006270eb45ac0e29a4550de08e2353d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5946 zcmbtY3wRsVl^)kEUP>2tVIdD7qRY~3$%3ISF(k3ayXn{PK{pDI;xr+iuxa8#2nsQd zi66RZSsG{_PU@x#IPtijH+3Gw3It<Z#~!l~+aZZ%@I%CoGr=##mhC|rjiedP+_PsS z1wtC=M|<Y8B+tF~+{ZcRKmWNe^i2+|cy_q;+N(Mz$km0Jb^qFA-Eqw~U*7e~>bl3S z+alg?OaINlnxnq5-|w3w0*xr7KQ!mH$Z>uaOdsSA1fp{wz%Q^ozJ>Hx8r1Nznf4(u zVvXusMAdts<gt@wIuw`A9BNkH(6m5#MAFqB77D#<U($1a3uEd>nvJ^V0=JjA_2v%J z3qggWBcfJA!>!&AeJ(}Qpvfz&Yn;n<ObO5Qt7^g4!YH>YI0gevx%PmT=iaiao9aKS z1Xpj{<6u{Ksm*hXME0rh%d9hR7fE8dC^k_SJOz^G^tL`!XSgTSs==tFu?joH!TbXH zkP8mN0enV!;f_f-7-m0e6AZEuIAf7MC=I|rkzPFwdg15Fksghs6b5|4oCz=t?pY8; zSRH2fkbq{<*bsz3bM>+Yk)g;%!iqRf0(>9TLpmK{XM;l%?@+WJjT{QI-SEA7D4z?3 zJeO28sJi;8sHN_PbRP-W46cE$)epf<z-X4iX+q>(wT)VsqA9WhYJ_j@2L3`>rV%|v z4)28?mW1#b7Y9=wkl<wwtdP0~_5jmDMQUkLf2{WspWqfE+sKfGS(yvrfc*LjSaugR z<O3o1AqeQ&8aFPG&n#1;o0rMua+*V7pKCe-By2q5N@19#)zI}vDEwy<)}V)0;7YQ2 zTIPeIu+UKnchmA#!3RO;fj4oxAmhSUkHENIONEVwg<&o%hi@^atZbt03Ia{b^Z+L* zE8rUDZX4^ggY-WFv_&%Th@PbBv<JHJ8RqoC6z0|@T26K8eM5-COlT$B#QHviBz59k zPQtUOQz2gBPiB}7!t90~Vc4Q((BrA*Z2RFA%lR{^G#O<(=Rhy<Z^5-pkWJr*N-{Tm z?;V2B0i$L|l&U;PpR}*ngxG%$YTc+a2Mn7*nDz7xn!F!gCFqqlm~D@B=!EZ@bAKj! zWt2Ms(;HN=jeT!|x9Q<mVBA+BB$+*yz%+IxoyIcv!BR*%1?>X*czlUf^iI1YR~854 zeQL)1i)(CA7wHMr`5Le7GXi8(4F>qk#3)8%2k>kh`@%vk<kNh54}H-MD``gVFa{5I zaV*Zf*C*nuB<9T!8BF2Hutl*9;~}6J7XQLBx8T1O=D6D`^QvJB2BaAIMq=J8d@U6} zl+!X(Z;Ul%!{#g%J%h<MQe)qV0W0tF6rMDp;RmV_xA_$`F^<LCE5WNe0{qP|z=|(i zGHceoQO)LIJ#LuJfo-cKT+3vO1{*+&I%pZ?1U;GA(GO#GgO~rIl}tsPMEaFhrt!M_ z#3d#PZz!$NPqIvQFSY9D<ubjRzKA1Dslu(se|^5R_1mLtyAX+)EB?0XZ9|cs^1RoG z&TdL4BxS>L^JvFOyCBD>a?s6}j$zK*reHR#8XhGU_|8$%>=$R#LoOS=%G8i;aJoZ9 z>zvnD87X(eZD?*4z2akxS#)(Tf5(u2B8(Bg6y)BvGyVf<$ty---E!Zt!r<Q;=@a%3 z6_+9lB+Hl%hO({#v^=>WXyn<O{cL!_sAPHiw6#NEdf|QL{}9%~4>irgFx^J2o2mG) zKH!6#s7)gbQ>wAG;2VH>#q_<1btcq87v#XngKz@evWq%*!6CU(gFXfOUM{r<?BuRd zukex4ac(>L%?II}hb+)DC}`TKE!MXijwA44M0BvdgppaqKW8kaFV|EuHDPp|wftl3 zeKyoQYTBcN#Yq1ie2me4vHzM4Mwy#A!^1sWQ&iVZIOG!6c?S6>w-$JWM){K>xo?QT zrlxsWwWGp+>b4G77PLI-BYh>0-bri1!gR=D1AGZBq_VwT(769LVtCR%1}|HJWG6A; z7)=YL*%2MSAm=w7<zch#`U<C}>hqx2dl!C#`NbscG{*-?5VR2s<2XyLVIS;SbT`d! z6ZGQLZh|047Gv}x$g%N>rX<+9vp?-Yp;?*KMZdO4l(f~1!yV4QB@DJ!?h|FQ3}K$5 z*LyLy8CLV5$I}qBKJu|sP*D$sz+!@S`J)~7QssHZCs0B60mj3Am=C|j6I@S|TXYw_ z9bw9E4m2Itsxx(7p<aS)m%bcg`i{WJt9mg#bJnw8r}Lm95mAmx!~ItD-7$!Vw8ozC zC;x9qP#~#AZPQY#Xdc~#*~sAIagz-TKSwK^>eJ#Wa{Jc}AROn=>LW=-r%9pPIVw(E zTqEPPn3=(pQ)6V@89E8Cdb>`NPz1xylnd~@nG^nS4*pEts#|S~q-Md3s`$cAqF(BO z*#)(voFLA%_o0`S(4C~4>>x1}LGpfTW)`%*sJj+eiYvFFV{kvP4_y;$yyC~o(nW3| zxL|3#(XeQ7L{``YGRNLK8lDjEgjFw-KMjYcT~ST!<-GfgDDO@FfNanUp=9Xl&wEC? zCw#&Rc!GshC5CWMGt9#v4nw=SagEi8fry&@EYw65(sA2#Xh5H7N*QM{e<Mx7J`N2J z#*}cFw6;%9+sBF8Mk>8vR7-`%51AHkv|)P`GKO5AYN57PbQO3-=KU^OgU@UjG!J-8 zv4r7tKQsdGx9OfpX`awrG|!=Mz)^GvhUtdA#LR>DLDEW^1HU7~V!|?2bhh2mCyV`I zQk6pw$Mt;-fuGV$cxGztV|KC^PAAYh+fDQOjPpSf|KH#zB1w-#MGfLWy9CnV13?in z55zb0*FKM}?yoJqMU}oHivO<E^w;M9tX*H-f6Pp=D4J<D(<XsbGldLJBXyCs@4`=a ziJa<$VfDx|y+1S&mRK0`--I-&&&%l@taYS%nSB^UU)S{T;j$i&lYgIh-7cyM^SL?0 z!XvuX?d&BosZ)`x6_17s=uukZf&fxoRuM9?%5uqJj|ZeoSl3^tZrBK``#apORmb{a zX0;WhDJ4+uVT*Hbt`2!!0iD!ky{&~0K?&PD^#aT}4U6OxZ}${KrB0_5VpyZZBP__s zJvd3$xKnNri3bVy4A8^_GFN2e#IP!@p5{CSIZd!Li%!DPD2%hXRf(2Gj*b$wp1Kci zKHLj|Fi5$u;z^Js*boIu(;DFuz1#zx@CGt%52>SLPywD|qtOMALpgL)1RV6x`_+_g zc>I9J)eFm;;Ey!5!QkIgg{b~*<_0$z2w_5Q(fOZ4Iq|^<3WoqHMpBUK36bNe9mwsO z&V2A`tZ{pb4nHOnV<Km)okXlukHS%S6mDd*i(rwi5sjSJy?P2`Rs&4O?7@1v97^eN zn~uqyku|}|=S^y!4StEY){$Jp>Gfn3Q{E2~n@)*r_iOwflJq*f;(N(}M#))}$uKQ5 z4gOj~sE#yxz!egMs74EtC&1GP1tER2pZ^iXx&SZ_{|vXwdpRR*4&-<X6{z!J-)vD! zGyR8Qd<r?IN2Q)YCzdCY#xagf(S~4@%+?Jy7Q|QoWf1d0FPS|B1K>f1zE*GUnSyH^ z)P;E?s$<BRdBX(JFUcG34q_AGSGj1tEhaNv2`AIluzs|`^{{Fb(2RtGGnrBTsql+k zi9#Vr-W*DKU=r<+?2yY8OSa+GO$r}n<ADAb#4CIj9;9vUry+~ZSc6C?SoIuE)MHG+ zp&_%A@h_HwR?<ZXD44xt2cp>g$-&oPsxs}gaOUC~ky0SNj>+yW=uVq-Lb|)g2@{Eg zh-7f=MwVgzy$K4ChVpWmACp3gEcpM$44#W)F<{4^fbRn$?T$LQo{i|Y!G5?E4T5q3 zxkOP3-Ik(qo3cU+ZZbGCAX~oz>sz$#m1Jzwk=SrVgkYTSA|1u0d?xt~&C96?4JV|8 z%|C0p<j3<Hf;#I?`8^CrB&xPv|9R7=2hMm%BW<wLwunYnl|TXd+SJ#eDsffsIDPX+ zu3ULAxK;F*FNh=mEd0mC>L%V&H|ZkQ##!f-_<1>KDx+bEYnD?B>0UE^paj|XW7I4@ zgkeZNu&U*@42VYZb{q0G$ntZgrE*5BeH<-w%CwHx;$t1E1<ifZ^a_ea{xtSJcx*;l zo`4bGqVe@v9owy?GcNoPZ2il;P1S#Er00dV)RMzI81h(KL~_~sbq`zNs+L$8*Vf>@ zhrp7x_6_t~N9gR@X(5oBxp4*8x;9AW1!4Oj!ko}Yx{#h-=z`}APNJSOvZa-L6e%=# zip=zJq<5r}D8lPHw^!@|PpwJiE|c~Dr9|`ZVPV%)VQ8bC{#diHOpCZ~gdR@@iS@3c zY4#Q!BO+Go?nYz#1l^43%jJB2o>VwWe;I$Tv3pH>tfxt45!iM~g1x)kM@p`0r+V3w z3);yxohvogHQor{S@n7&9oU=dsqoB#sN2`$f9_tmVUXn86*Z-D8FY<SJnd(j;CLjg z?u21kkooXJybid|N6Z<s7bCiw)te8z3es?YjJIC8Mt6mwv%_TM%bhyxu8DeuOv`o5 zt!tsotOKi{8a!#}WWyoyXAZmze(mSy;}ukK6|F`llW$g@2y$_MTTdWw>skB5nsV6Y zh3y_zvwPB#nUZGS_YRPB`fZnuJcBSF;P1oSHcre3p$0)~M=m@E;xY3cV@B*AqcG$< zRFk|E6d2(E&pO)>)f@y!hiqX+iIS!+qT3Qh&^Q@P*`EnbrI1pDw-7OX4kOJyEXwZD z=AVp&J*s$f;v9k#<WB>siy;mqop55i<<>el42j}OVP%uTPeLMY@OJ4U0-FjPVm{3I zx&dSk>=urvcCMw3#mzs0HQvM;k=VVQ@S>HA;Zfl&j=C4{x%6lohMhSIOE|NnJ`$uJ zq@kpPZ6%+omQ&EWML+ok4?LJ}R9v~7uY%j`7yN3*EHu0NvHT3yXYio^CeBp<CE}Z3 zME7~$jaMiapfkpIV>RR@15S--&#IP%diw2xaLMb-es-StP=*DTCA54<h<b0be%{<t zvxb97&8w-FAs=k>8=fTQLL)3P%ehYY5PVL;FdL%mfD7_xy&G}g0s$#=2|SGX8)*va z>4vzncLYfP$+N=08Cq|>Oxk>wQo-j;VzNYc!C4Syke595>|Ase)w&0^5(O_c6;{O? z!zAVb7rX<ub5u02VMu6|=0}yDE~FM31YGD4Ocj;%IhY4q)Ko?mG$-b#)`VpgOtjsV zaIP7Wo3I>@>1(0Rynv+U<#W}6s86?Do7inpi0zt6slnSkQ!c<S+ERD);caOGXf<9n zDZF_Dl^F2VU+3@a-#F=OC*CiQ;=e03ef8{@w4P7vA4T$I3f}&hU)_LJ-_z>#+|JU6 F{vR&?86*Gz diff --git a/client/resources/hardnested_tables/bitflip_0_14d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_14d_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..adf20a10f0cbf0cde9ab23041273076325325455 GIT binary patch literal 1196 zcmV;d1XKG$T4*^jL0KkKS%Yq4`vH5^{^iwG{(G}f01%V_5C9MW1O!+B0ssI3NJ!uc zKL7v#00Za%00002F{Xn+44MNYO$<#KV@(Et88ik)ni!fe#+nTPGH48qG%++`jWikn zWY8HJXkuu=DMY{nL7)g>3=;(<BtmGX>W@s+8c!%<X_^!G{*a=pvR}$x<Z&(~hC&=e z%^V`DfjUMMdJl5?AMoR{7j$J;g7G6PGczVkIA5x#y)Mf3D+pq#lK2v*sZ?cEVN1xB zT`4J&$zquqFD2wLVBj)VNW#fsk$!40#d!zGm)x-X%<iQ>RUfflNa&}TF-m`AII>SQ zPKu{RQ?fD`r)EW&p45)Q=vfRdhjejvWsES%lMElR99&0naHd&dgq_v{gCh1FKf%*6 z+~{z3GI3{uyEvR&9h0HOhhrGep#NuyeI7~TSiH%3FKTD7urk2zMnS=n$&0c~m}O2Y z6*!A5SG8A4W6;Nu$Gqr0=02z7{NB{O$n#6uaIT8LaSUAy&MSzxTsVu2V~NFA7ZZW- zUW%UqUk89X>A0N+S&Veb>2dXcqJ@2m2*4g-c(NtYDsgbg%$a2;5mez01~9T>V=f|@ zc%vto*>rX*vQErr$?<S!$Yt0aEM<=ckl^unvY2Brn6ZzN53sMvcRU71n)WV~>EgVM z@Gn%Sa&*QqS91?F#h$|TFOlND<2wu3ev3P<mmS5$_9}U#^FtUi$480ec%Px%JO(GZ z<a>u=aA!=+V=S?U0i0Y@iN;Qg9hXYt>Bcg2al*L7;gkLK$M<(Tyb;;cyXN`4Pnpo* z;&`jT#PlzE_p9drucNqo!z0jo22Y7}yDw7kUq_?K_&pMyYv7DsmqUx9v1b#G7_zt@ zihB;~_l(SaOh#OHEa=M)1|BP?#d@rIf>9JA#8`sFSd@+cRwN<^04OB@U@RW1FIVDr zC&50`;#k4<m)a<!<S8a9nItl#p5k4?WmZvPGNvFbtXVR%B1Te~RV-nX3{0hP6-P=5 z@>N%0GAVq(U_Vloz!<7=ELVb~$tG4=Fl4)kuEZ-V!4_D96kv>*Fk;HctI#eiWMay! zi!7@cFWoLP76QeT9h6Am%9xjB8B-}(vdLt2D>BAeSyv1bizA}M{Sgr^3l$8kEW;Km ztW1?vmQq<5r9&vn#4@oku~|%hr2)Yaa0?YoiZCjV<WN;%QN+m$CREC-STSLYrUCl` z#Hzp#aY}HiaHM4=bRc02fs&YISi1@+;uD3En2ao|1X+ZzpL#(bQW4M&%Bl>CjEa$W zLEx#~cPy4zrb`w^CM%<*Gdf)v8IFsE(lW+fEUjg!mR3xxt1~f}S!I@4nU*lj=%;kN z7FI#vpt~K}b`jAfipDG^B2)MJg;EFbDMaY9LWw`0!=yzjkBUkX#1&L!Nk@vJmI9K+ z3doYL=tfmgWP^z#GAU%lWszGWGAlxH6&OrNF_M_E5iF?TRWd7psyISi423XpDvl{& zMg+Jj;sX)Hj3{Anv0|45O9_Hg1_fkTt|k!SSW#tIt|kF+u&h=kF@(gxFklt~v3Dd> Kg$W2Y=0C9BIS$zX literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_14d_states.bin.z b/client/resources/hardnested_tables/bitflip_0_14d_states.bin.z deleted file mode 100644 index fd8e92850adc52d215c4b73372e4bb7687a5f0d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12555 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 z%0A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 diff --git a/client/resources/hardnested_tables/bitflip_0_14f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_14f_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..f61babefa8e76d23efc26e18d7899761604907df GIT binary patch literal 895 zcmV-_1AzQOT4*^jL0KkKSHYybmGfB*GYL9>bUK@`9d5Rd>6KmY-l0r6lFKm-su z0Dy=93)tWWUjP6A0000EVK51R6A6UV000S-O#>XlU=si)6A7jO023yf204VlCICz( z6HEXACQUR9a|wV<0GLcBm;eAwnrIm269AY2Fqlm+005aZ&@fU|L?W2UJr7jLjSWD_ znv9t;9+OOZQ`V$Q|6x*>x^|1{TqmS?PoX{)=U(!=g5ekzS66YE#r{{Fc$Y;wJC}^k z^6o_O4vVPlLx&E;e`Z{<oIat$mU6f=s4lE>$l+yW+`1Lxc*j;8FO+BC`p>bCXisQm z7_ukqUL!AkP8LtZ^d5ulJf~GZF^Tq`W-*6|vb|3O)aacP**Grub1Z!c<X*v-k#O~{ zR}YZ97B9JaOys>~{LAz_s-9EbN2p)HDf`!%SshaIET4Igbh6~m77QOCeaq=s=q|<X z2gbi@;d^VnIbN0byOG>jGQpSeeCK-lmqK@*+V>9f#t)pm;YHB&Gcv4YlNi9uy>Q^2 zg~Nxk<;yrc!NJOQjNy{##Nfr=^Ll%Z)OAM-wSAAt^_@p!s&JeagXU+xy`{?iOZ0pP zjq#6cerf4FmFGSc%kVvifq55${k{R?Q{H->H-n?#GIqFd9t@swUn*QGaI40?g7}xj zzGatbc9$Hk#N)KMT&~jL(RE!;3zEiixH9E*I8I!@;EzF7h5uFbtULxoD8%HaM4^$D zFf0aCQ>ZMe43or#GM$RQCL<;mEG9-(a3#@lb!IG5a=0!6oD_K#(90$nSSCWBqLj&B zn5zmd;JcP2b_@(DIVz(7@FTGf<&y>@g-fuq%4FeXSuo1NjAb}0BP_DS&Z06$a&S8d zbrYd=6D&t*bpyF4D!3O@gBa~+D92)OQ-sSnP73OdP8SO<7|Dl0!-Qd&<-(}Gyh4}i zs)U(JQFvuiRGzd|7LtKaNS`KCkdbATRAR_W86{$j6<Ea>nJG*x7GV}Ci7N{#78w;8 zlMDkA%2a6~glb8WGFdXIkXTa|GMX7Cq?sloD%D07sZ1Cpn2gGiv7v!RGLe%JV#5O| zSumMpOEF5xl^Dw-5>{D8MiFBrSzu*~Ws+Hlv4N8)R$!JgLoikt%oZ>VVzOnJGYZC5 VVo8jpGb=y%yOJrwgoJ;AyI>NZi_`!B literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_14f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_14f_states.bin.z deleted file mode 100644 index f8af0a6f0f73862cd22bed1ba5735f6c0305ddf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7283 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 J^()`c{vY~=r8ocp diff --git a/client/resources/hardnested_tables/bitflip_0_150_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_150_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..612d6295e970cfe30403927daa2b61729c2491c2 GIT binary patch literal 1557 zcmXxj{ZE>S0l;xY!G{N`^77!LaaU1Lc;wm#hl$;_DJWn?eBtGhr>5=kP~6a;tT9Wo zwJSbC70UGrK3HqIorgdHaeJ=0-d?gU@Z8x$b3dTf<hI=pG%;Ckx!cUrv|X25<`1{O z;rspcjCoIK^yk~`=U+N%vC5Yo%<$K#I+l>7WBtIVXXybKaHEz=vwbpFm5w8@t~Gm~ zw)VW&P-(i?DDf5>wZ+n!Nw<?Sk(0JX{c5Ey5x3j>eZ%dHM0Jg0Bq}-8#pMj9L6sLc z_&`?H>%V<h_bFG64hfu<)s;6-#3PDyx{Dp_vKdNQXi6U1FzP9N$Zw@GYLTtz*J9lC zrN8KI>wGg*8Vz+WXfu-t<uyas%JXb9-Y-V(K-p+pLjN552mYHshly~-3@*gOa3KsY zOND`3e1UpY@@{0b1|Vwq?E4^dS_)n5`%*Js{+#z(aHH?{*5?|c_6p`l2Y~l~xBmAN zp!3Evg@0TjuyyJ0tOSiX(m$mL=umzIvJbhbxrhUns0vr>$+tu^H=!VbUgk9M3ve%4 zV@+PKJym;5aiu|ZFmAolsP&|T+v|}KGcnlcAw1)exW_%ySM^gnz`QduojgBaJA4zq z@weKZ+Dh;-P$2ANH}qME>68^3c!?af`>Qo^dy9K~Ky28{#>VU1p{8sXC*b4-p<r@= zN^FS18pE?wh6Cv5ulDMOA}$MZ8DL<Hz^twuRK=hW8iq((-x*W*Jqf0>IiE`;_R`36 zhjVqcV8xTI>_G5jS$T<!{{gHYc+CqvVAHpuIX+k2R{a9M&zC|oXikk>kb-5``*RO? zx5N_0UO3I!xhNI17hgi(w9oq<2V8jlS2d#Ux;1t|Pnarjr*SN~?kAH!6A3TQ$|jLx zAo6fQYcT(_N_auu@=0iQ6Wowww?%d?3r8(#B*zEsV4lvQ%P|2A!vO-;F{oOFW*K^e z+u%rvtCqlh3Ddbi(_9dL+q|&unB%n+a2_8HtGNOg*I3MoE==qo_u7P+=6%PY-`l1# z5G^~vN_tGz7Bg$k?Vyj?uF-6KT*Mgf+-upe9m5QTmZBw?T3IrMsol-EFf%FdQkpMH z{^TYfT2c>t74s%=>nGXSPs+`#7M73o4vVbI*ZrcJsn8pAEF~);VJ23!pQ-#$brTDA zUds2hE+rnUNHwoenbnENnl3?EEyA_k>qu7g1`IJ=u(tfY1dzTPH1r1Fs`n9dQn+2< z<kr+^uBM}H3YA;Vuc97uWTjcILNyt9+k7XMn4L@nKa^>GE0EZXRLf+YR0<O7_5w&g z(~8Ll9TBuDLYnc6?FII)?+IL0138nx^+aId1I%XNrnCb*Sz50?A|T~-cK|PN?CaxG zPmV7(4Hqx}_qcoQ;D`X7WnhKB?=|wDTY-*4`D0-;Gv+I;aC^*MBhl$h7skq~+3?72 zC^L=ON|=>-anf)`e)xX^^>K6__!0iWe(YIh7^BYQ$mvIu+prUv+M8U8Kk;sV{Nu1` zw4LmBQfRKDc-N?2?Em&v<MpO%3ugq#zl9|804V?3)|mA6AzFbkp2NOXFP-T3(4Aug zBMHK)W#7+g%-ch%L~no02|-aWdGO12(X{Lh5*rB2qM2|jKwtsPNYV~5kasZXC|Ic4 zLQ+D?B#fE!IjU6|JOPGYg8~Q&*-#}O{f-PALeLR_`ftS05Xf}rj%Fgzvpeo7oL<i} zG@Y5Eom}9}>F(u^G#14fap@9xh@&4A4m--j!}@DS+ny{ooht`mDaZ#=kolv`|9QV{ z_LahLwoZAkrHxWD@d>2*p2*gn;e2<XyJ$R$s*WKRxWZLH=`5{QSvuGZ&A1(?%jJgr zL?w`?6U;iuJhF5;&}GoIAw<Jbi@Jhb;-B-6F6895I4-%`jnXhmxHdIPsw9j@CwhTh za7QwZEsX5*2>obQ8s#K)AAjgs8AJqNNf=!O7m-|28f?JK`#ob^@QW?)lh8+QCcWj6 WZ`sJNt!FpCiVR8QKOFjP59@!*!%pD< literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_150_states.bin.z b/client/resources/hardnested_tables/bitflip_0_150_states.bin.z deleted file mode 100644 index 587807efd07a34d9b961310655b1a786daad8148..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17328 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 diff --git a/client/resources/hardnested_tables/bitflip_0_154_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_154_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..9efc40fd91b7e3bac99d6a75df7a7f62903e67b9 GIT binary patch literal 3137 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_154_states.bin.z b/client/resources/hardnested_tables/bitflip_0_154_states.bin.z deleted file mode 100644 index 56cb4f16815ea57c1aa2536fec0546ff6afb9db2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21125 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 X2u%Uzn_^){H1ZM!7_jK$+hhL^myW<k diff --git a/client/resources/hardnested_tables/bitflip_0_15c_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_15c_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..0180aa9014181cb4afb0745471954ee40853da63 GIT binary patch literal 1122 zcmX}ZYfKY&008hS75ciNw7v5GP(dsduuXfH@S#qZO&-O_$$;|syYRSP-J;7r)U0tx zoItNFeO%aNsHfS81cM;Wyt;j0)Xm<NtA-dw<CZ0o1@N&BHxkE|5o6fC?f0vG@7P}A zz!9_S$XB|SS>%I;GyQ9p<nRKbOev9FsB&WN{*7ofrQER#MF#ZhWpxkozkCY0h$9@S zQ&P&50!K&=A<e1)zKxP|h?zvpx@{uJ!DV+5of*-o{BBeRkmrc%3q%zV@DRcx`q8t8 zO|Ii_RL$S1da#Bct~z$~qesWz>K{F;?=kDPR_aewb{|0IJ7z8S+6g>E1fQD*mT|mK zp^yze@Xi`7xqsysss;aM?74mYv}vL1_KBsNnyh_l<&@@yEwWaW`^?(2$P0muL0j~~ zw@o59gT1LwO-G=9d9oDJLdc4-?LcDj888uuLjnw|C5P1vI*TUm7#$8T?|GL0EUjJd zSlEBXmmjiV;jFK|I(w;Y>BmlU<>qHFJ-!H~GbT(F(+rcpB4)Yt-O6`;rDNG{CgDXP zOMm~(Vkh7>&TE!-E_lnH?r+3=z@x@->g2vJjXU!|J5d=b4?Z4pDm?jyGL~S8jbiV= zx2cn0>?Q4JeTmkr?kl_jevnTTRcGhydw<@#t@&=XZz!^ClU7d!Ulu-c*bhp-fw9ef z=TR_YuwcRHSo7c8kKMYH92(`X_jb3e{AsXL$qS-g_Q`s2?|N64V$hQqavB{yT(U5n z9Ex~md5QVM`1U}@PcHSSq!mm1{mJmFg9%U~7;Q3R#iz{gCME%=`<xnG0c%D{LZH81 zy{dNir>x!nE0l8ivdCeeX`TyNkZjz-H|B7Bqh2Uq0<IwL=;`fM{8Ci1+O=?cRobtv zpSph36?CZ~3FB=s?O2Pz<cb1Q;GI8pzj^Df=SlJLr{$mDltt_hsq2o@zkdA0-uz(k zCh6_nPQ7XzPCwqZq2TPPIa`6iQc|oq-ewcr6dlr_wUP(LQ_^s_L$wEOk}!HRXJpni zPD@cyyp|GOa_xjX=bsdAE(ye|$)*ez5P3Lhg--c+>n&L;KjpoAvLtq|qmGXF>4ZDN z=;UZEMY{<+{!UuUaR~xaX&{8>6F2}2X7Xnn<T|-N0Vhk{WNsuvk|i;W!3b*uO1cav z3IGrDfV0fc;q4|FTgT`*=+r4iDFia8vob=_Qp`Wyw#Zs5D89jf1%!~6r87IS=fo)Q zgEbno*;kjM%M}`prcixBff6yb_iBwwNCzA9D&|nK)22>qR~SQ~Drnr@^x8La$PTAQ z-`{=Bg0&33NbP<dP3(ZMZ4Xc7M%hD|iWx&$yGgDqsN%^(QbSvwmf|6#={OdC2yxQY z6t`L-0I`OG4=2m4P-8FyCrVSI=!WAV)KHoj91M#B;P^ys8l}?)P{-zE^zIny4&#ym XCFwXp&1b-^&E!a>7zku9olE@(g+0Yg literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_15c_states.bin.z b/client/resources/hardnested_tables/bitflip_0_15c_states.bin.z deleted file mode 100644 index 4eb4878537dc330ffcd68716fb77205b5ab255cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12840 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 VXggE4Hy{%H_id2-@C)LH{|}P}a~l8v diff --git a/client/resources/hardnested_tables/bitflip_0_161_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_161_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..5c12567e4b33c35fb7156599c906ca4aadb25477 GIT binary patch literal 7268 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 OQwi%C`+vH0;Qs)zpnpOD literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_161_states.bin.z b/client/resources/hardnested_tables/bitflip_0_161_states.bin.z deleted file mode 100644 index ef9f67c0928118afcdbcbd9223f78e3e27c7a045..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33424 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 diff --git a/client/resources/hardnested_tables/bitflip_0_163_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_163_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b68ad5995eaa9d79fe86283dd62d9cc5fb27860c GIT binary patch literal 2071 zcmZveZBHAA0f3=NOaTi62Ip?F!VJa~d;;I`VYb9eQxXW_280*;yjqSq-?3Et5}Qq8 zNnlB#CVmmd2HWR}5eR{{U<KP~6G%kCuf%6J8Cj)f+M<C8O}8Kl3E?G>WZm~YKjHcC z==tPVmn86Mxu9A8IK{wAC|`QpxtyLjkoc#JjD+mO^y96|2?-hL3D=n`Svd*+2e>!* zSCy$MFIgv|{>aR@NwkT=Z1(BTVWvp{`0-1kYM!Mx0HD8Qd>BMTRF>7s|8{5D0z4L6 z`mFNS+eSmfiy^-GFZ`T@{nYQpVWEyur0xM#aW`CY@4}4(gV*vZ*(SRavH`FOXzd;G zOL#hd**Rj`dg=%3z08HetH~mb!Bfo?h*&k7-W8!gq~pLB!jQ_PisN_jh04II&U=uJ zRG%FGn`FgzSoshCcAao}V^8~TX6Je3i+2^rCk`#wmZ73Z)sZmt#ymxY<qSDS$EXnH z!AS~nN*WJ5IucPDMePETDlLjRZM_l;6vVnx6iqC$+z=1|FcLyl52C`%h<5bNSJDi$ zcUSmC(2#7XNSWiUu+lpl(u+TiW?%Oy>au7U>bui7D!X&%ePMH9jbX&BhUEGc5kYzS z-ZbXkJ3f=ryqRb{bsZP>dJ2*W!#<}aq!Ml_hv=|e6^u>FIf&P-h5(Avwfb4Lg#W;) zv11X(9&`36ts!MUm%e|Nre*n&!2mz<y1vRE8O#%)xcXM$u$<Kn*byZ1zGmad{OuoD zzujxxpLz1m9C~@>Vj%ud*>~9eeDhlGExr$n?4T%;yy==@$KltgYx>#!v1{LbQ?d4A zMSi#6JQmogZ7Z=(MaquxWjDKf^6iM1G=#w(D24_Qw_4<CuTLK_>}s@zXAb^+D-l8_ zKaOLNBe}~~$7^7*g<vzA87Zz7g>*Sv`qR59Z}k6$?IORs4V|!9cTh+aV04*QEn#ly z2EO832^g-NeCEOgnTJ-TWmB~WtN(d*{An=;0vPTwTcCbraK5Qx{me|}Ff`4`TMXHg z7-@nuAPsPPdKed5yX#&lGhT~!Ay~iqQat{Y+^uZ$?^k}kQBl~lw5u3?dvSUv|5ZT{ zr->jIg`y=9#oYQ*Nr&T`&f!?}ar9=lpdCH{ylcZVfH_lvrsm}_QFXov-yWvJ9ZY|W z3nPb*2EUIu3V^MgtcYzxi{t8IR>#VfasjN4ORiQJm*YFo0≺UP@Ku{5axtzJD~e zzDfRi=|BJaMQov7W`46X7Y#Wkmii)HFaECS^O(tvikYW-+{;H_?DO`<Oka1Md3$~# zcU%2ZbFiT8c(SGbA#T%{KsHzf3bO*tJ0j;<b><bRw3Jf=6fnu5`<X|nTgsESyI6Xy zB+wT}!XW7^=Lq?GIf<K+N={i#e>YUp!y0?bwr-EGL+@H<f@keWAX^8Wun;A;E9blH z80syds<w*!4QI#!+8+i7NWHy@wAdNvn>QM}nz%z$U3Sfw26Ff~(kB15n$w(euc&5J za$*Rbnm*Lytz~tO<IM->EXw1f@3aP9&LS)MX2VNC6V>FuTaYy;NE~wVYzkD(R|Oxq zi7;Yhx+W26D`>}PKtj0NrE-)+5JFcCj3l1=z<k^*yFttsB->0vOC->j>?BY@Qs$~y zTh%+~;L+|c^M<_7hEakNi=s?-xK5|&5R~?J2uNFA&)|cU<fHvwr7bm4dd350At;GW z!k^$$L9Wu6C0^vJH28$xgtvwa8cc@hZ74PlVCYX(g9sO)PUSxM5}@^gR0c*7p`=2{ zJ@G(qXw{yexl>wixa#L#MKC07wwcEHa9)<zcKNIImf`D!Yq&mD!0xY?f}{y`@Id%N z$bjKoeAcvHOW*d6`rQsd;XDaz+C)sNk1KNf4D^KY7z0qj2A{==QeK=AYt{UDjbFix zeiSa$FLA}%eo~kOm`J%S7i?J@vZo3&+HUAXbTrQhh!<zsBC-d%i)ys1F=8B%rD1BL zqd3bGYg4UT48;l*n=h<CUtiRJPAmHmCuqA|1I*P1qfBaaHJV9Fm}|pRghx~qpYqC^ zvym~qU0QXF1K=*g)i$7=mjG0MomJCHM=s<3#b@&vh1^Xw>SRg4+MpwsBrjM40BNPY z;cC<aTkHhcW*hJlSm=GPwoG0augca^QXKbbdN`;@z(ib5hJaaJt7AxcCd}uQJE=f| zADhD{AT$)gXpa@Pt3I=PNj>3U=M5IiMf9p(3sGL5+B6CKqIT{atX-GX_RF}%Y4wa| zF-ekve#II$CZ?%HO?5HCLF;UGsD@L+oUDeTkjLbtv?jL+pG5UW?kp0UWj;jOYq-N= z>S4VE{YjN1AYS9IMmYfS9I7vtVliFa7s?OHn%2?U>&PI_3QDsG*XMp`QRm&de8kz} zIo)}R#o~&iP|W9SNB>+Z_zl<&j(}^4wuU4SRE1H6LOVBYiwa6%vYoVpAmTJdRwZRb zxc$?gsk5<wFcgUxxe9L-QUi2<y`=T`W)9-9#iNh}yy27&8tsavm%W`1h5+qkIvG%D zS*}a$raHBccuKaNBtpMCCs{>k_rt>PbY+TpHTbE6ztz&Im@P17uU44~j7y1<)wSUc n-}&b~#UF@++YdkLRBdS%7c^^&<4Zjy?@wyaiW>+1Hv<0!T<4z1 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_163_states.bin.z b/client/resources/hardnested_tables/bitflip_0_163_states.bin.z deleted file mode 100644 index f08b3e0fef9b8172e6433bf5af9e0ed563cf436f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17490 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 M=V97i?<NobZ{2-rEC2ui diff --git a/client/resources/hardnested_tables/bitflip_0_165_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_165_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..69e051fbf05a89ead34b54cac35931df8479c12a GIT binary patch literal 12956 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_165_states.bin.z b/client/resources/hardnested_tables/bitflip_0_165_states.bin.z deleted file mode 100644 index 9e846f209..000000000 --- a/client/resources/hardnested_tables/bitflip_0_165_states.bin.z +++ /dev/null @@ -1,31 +0,0 @@ -x흍젮H+UtHhe @( G{fg21?wNw^~i9\޾ݲ~yw~~?,G5m4o-Kyi>߻/0/gyOu76vog}r/K~_?c~S׏S]~Kˏi]nK?,ztY~^]G~}GkVgGC_eE? >oĿ>wo~_94>#,#_ο6߾~?bRkZm'??Ϻ?vRWV'_B??矬ާ_Ҷ9?qvcc'rNA{o{oqo~K~<>??Ϗ~??~<>\<o?^WI~R;ߵo?9Gj)k o?K?O_?6{V{G)OdzmYO4__???n&/cKC_??5?~_ |ߴ=/?=Io/gM\/m?Y%οr9u#??[?j|E]/߮?߻#i>/x4> '[׿c{yp`ei _[/n|?y]C}t4^z_!Rݽ?* HofWӜޗw}vuC~~?ߏ ~y4m8gݝh[/%Ofz?mmj{㟯%_^?G#>!߻4_;M{w:yӼޭw2ݺz<ޭwy??-wݺNwޭ4wݲL4{,ޭ4{7]l^?{zϷϯ~<'\?_ w?YX/[ 9_IK6,wuI^oe{'A#!e_Uߎ?=?9sSP?mw=c۬n/zǨjG_j䟽%NgOQqSFÿ?F?۫#C-G=Fs>dzOSߒ9WiAOlyzR)w/Y|g)_??>yJ?6Ӝ4sǐdߺ=7wSחKƧ-?۶[?{<ՏϱG~ i?m?=ߎiyߟ={tk=~z?ϧߎǯzo^?$_C -{]-WP9W{a??U/I/["{{~F=_v7m/?楦b?)_o[?o?2oϟ?O򿠿&'yg6ϿuϞ\__?s^ҟל 8GmOYԯOG'ƩƿWG/?u?o?v_-{}?#W7N'_7_fS??_O׷izx)>Er'i|_Ck?|:?^Rc~.{_^?qqw13_ >=J_}n׶k/yq>5׿vֿ?M!?-.)?\:/[?qm=#"όݣOyw%ϯ{?_>ewH_Wf_?7OOZi>GOUgݿ??#_7ccky_[KfywRޥYqU?//{Y4Zss_9Y{w#ywSt;_=g'k\6~/??c/گgO!{nYR?oz':?_GIߺCmg_z?GGGYa?o'Gc&xߍ_KcR~O?sO_/Y?2Ʊ,q?so''?E=qW4}tx~w"9?^>}E5<[gޏz߮o_Ou{3Jc_Y8<οw}翭Et}K_罿?vau_~3??CQum?#i6H\g,Yg?5X^L:zϮGOdDmeS-o'Wj?-K?{[W'[ou$ןƗ>>yiwW%?~ w CmOmO?z߂ ~gn.?ZbtGkӞ󟖿A׽7~\/{??e?oY> nkys}_yy=^W]=wo=_R_??ew_U.߻׵߂?_[-y׿um{!<7,K_WOgWk_{oMQ?v=֟c۶ >?~z~Ŀv$ ߇|Yf.s^mKW_cm{[v~:u=ϰ~at8߮Cut_u1?bgԿҮ>IگCiof!?/G[oOC__U{_kw}?{,{ە}R?R??>Ow@Oo6_]m?m?8IKn?}~<s,/'׿$~g?WvU_˿Ox|I[ԿjgmOsw˶WPOm__ο6IӞ?S=o쿈OO.[%'Zڦ]82O?s|P~Y\y;=o9Yw \9aqۤ?Pd4WiGulZ/gGE??o?v_}?OBD'KOi_ߪi7cYݞc<&ʹzgC+?ίO/}~ovi9|[U[Ws##~?}ߺv_8߹O:?gK7sWُ̽n3-?n|Ɵ_oۇ2,uk5{~7'忬C> o?1smoǿ~?o=F?o_R_/_7%?v??]xo1[8/+ʩu9?'r??gj9iC3f|[_Ǒh]Lw-_i?_ӿ߼!ğ??!^:8_+oT])?mOH??>Il_?o_Ưk~~<7? -mR{OG>'O:>Ku[x}|E?)%o]_;g*gz|5Gu_/m??k=_q/vm>?aG?{畏*lM޿~|s?~' _^ ?o?j#š?)+:9}K\RWy鿮}pS-߲~3y'?=^>g*7{5;J9R#wG\3;Io]`o'_Y]mw?o;۶EϪ:C/g?dw\i4mO|ky9kK?bϒ'NzG[cٶۆOW^zj$t7׏[#o;OZW!R_#7wޭ4{ݺNw-w2ݲx7O<ޭwy??-wݺNwޭ4{ݲx,<-w:M4{WzJK<|y7>׬?t>RCuom?4|c<j==_̸_O?D)o]C߲9{??9s[P?ggcycۮ|n/vlS?ڮ;?I=m'Oߦݺ:mCJGkv]VH7?m?bo޷ԵOS߆G?N<x3e/7t%?C~h>gXךt<?[mOߟKsys m{SS/9,?h_}~g]~)~y|4~~|9z_ӫ^?)|ICYK?Xi?5w~|_׾^]϶xx?zW 5=g??~_w+K^Z?^·.i~cx]?{m?v?z#s~ߙΟ<^[Ako;NY>wgwƗ?>bmş?s<H.gCPn'#ROiPɻk_L}w:??S?E7zWi-uGuP'O8G!R<FZ%3M>o_R}>w_\O^ <߽?:tůο$>~U?~Mxu-oGz{]?ӗ͵Hm_ZW#|jy,1Cm7Gsߴ,r?uR%_-Xߕ홻=w_2O[C>wl_#[tuj/{$u׵t_{#'Ϫe< wY-? _ouݙ˒wwjύf^Sݙ׿6k]O~ol?3_Qg}=Gk,_vIkiK1/+G?_ymݱ1O[*Y6_#_go]u63^H??]ut~v?;W?O?M]?{oG7//K~gkM}\<Dߓo;Ϗo4׬e_^OmG}6K?''?)Q{{U,>v4~W78 ?o9:|<~(~X%_S8>)O_}uSc\Yޝo~Y~~Ϳw}?]~me>G2m?o=9Ǧ:]y?]kGn/_{7#i_?Yyw'361gGqo)g#mlǿZ?3l}}G&O'$'׎oyݺNwޭ4wݲL4{ޭ4Owwޭ߯wݲxw:ݺz,<-w:M4{W_?C?w'/> cX~ɧ~ %߽?:? ZR^GII?Ui>@fS -~`S6ߺ =ޫ`m?\_"_¿O]|/_뿢zhۥ??Es/]u{~?vi_'[G՛|=G%5|iKJ|ik?mn_ֿk>t˲^?Xm?]Yt+}|nJ/Y-? _K\E0?}}e9]8}vRח_/=>]z7L RSp:=mcS,?3_Qg}=Gk,_^JZT6㯽}~{eSʿ߾O<~tʿ"~>o[w şG/~_[c!?>aޱYfG)IR.|s_??DwC=W9?lo{'<Kj÷y_ףzο ۔G~6߿ӥ׏|Ӷlm5u{וeKj^by>?Χn} [Co͟'O򿠿&gwG?ߖ=ߪ_EfοpZ|X>?ߢvO?濟#kH#qO/??v?ƿ꿎'?+bIGl_ai|X 8_f_z||3|5|`_[q~~~M?}˒^ocwzk|?~|K׏uߙ/tǰ_oZǟ_?{},/}??ד?-IO }s)T~n}J!_jR'S_WoK}WKub<M]orCiN˃=^_K=#7~o?Zo#'ߊ?>_+-.c| 9}G_ο?qO?6_m^_+O'[b ׏'u<H1*|oiKkW'-*?7~?M}Th?kjk??>y_oOϓOxO>GA|Om{,[8~]u/Wo]op?ǓG_y{Wkֿ}3NI_/_O5//'-#?g=9?m??aG?| {?mY=+W1 i>]}~|FO֟دh&K\RWy鿮}pԖoYs -X?{woڃwW_}>g*7rG~gkw<ߺc2Ongo???-ӿ䟽/q]'K?w?]][o?_w7?R϶G6|lǿZ?^WK3=>g{'o#~R׺JowO+žn];unY[ifŻyin]λunY[un];ŻeinY[inٻo% =~^ro㏟_߯xOm/H/JOt{q?o}MxgWT߻$ho?\yl_ƿG%e???=SFUR?JkW_u[O;{ȟV[_\Lw(?_Ϳ6IӞ_P _<_wmG6O/ؖ=6Y+ÿ<!cc'}#V?IQqDSFÿ?F?۫#C-G=Fs>dzOSߒ9WiAOlyzR)w/Y|g)_??>yJ?6Ӝ4sǐdߺ=7wSחKƧ-?۶[?{<ՏϱG~ i?m?=ߎiyߟ={tk=~z?ϧߎǯzo^?$_C -{]-WP9W{a??U/I/["{{~F=_v7m/?楦b?)_o[?o?2oϟ?O򿠿&'yg6ϿuϞ\__?s^ҟל 8GmOYԯOG'ƩƿWG/?u?o?v_-{}?#W7N'_7_fS??_O׷izx)>Er'i|_Ck?|:?^Rc~.{_^?qqw13_ >=J_}n׶k/yq>5׿vֿ?M!?-.)?\:/[?qm=#"όݣOyw%ϯ{?_>ewH_Wf_?7OOZi>GOUgݿ??#_7ccky_[KfywRޥYqU?//{Y4Zss_9Y{w#ywSt;_=g'k\6~/??c/گgO!{nYR?oz':?_GIߺCmg_z?GGGYa?o'Gc&xߍ_KcR~O?sO_/Y?2Ʊ,q?so''?E=qW4}tx~w"9?^>}E5<[gޏz߮o_Ou{3Jc_Y8<οw}翭Et}K_罿?vau_~3??CQum?#i6H\g,Yg?5X^L:zϮGOdDmeS-o'Wj?-K?{[W'[ou$ןƗ>>yiwW%?~ w CmOmO?z߂ ~gn.?ZbtGkӞ󟖿A׽7~\/{??e?oY> nkys}_yy=^W]=wo=_R_??ew_U.߻׵߂?_[-y׿um{!<7,K_WOgWk_{oMQ?v=֟c۶ >?~z~Ŀv$ ߇|Yf.s^mKW_cm{[v~:u=ϰ~at8߮Cut_u1?bgԿҮ>IگCiof!?/G[oOC__U{_kw}?{,{ە}R?R??>Ow@Oo6_]m?m?8IKn?}~<s,/'׿$~g?WvU_˿Ox|I[ԿjgmOsw˶WPOm__ο6IӞ?S=o쿈OO.[%'Zڦ]82O?s|P~Y\y;=o9Yw \9aqۤ?Pd4WiGulZ/gGE??o?v_}?OBD'KOi_ߪi7cYݞc<&ʹzgC+?ίO/}~ovi9|[U[Ws##~?}ߺv_8߹O:?gK7sWُ̽n3-?n|Ɵ_oۇ2,uk5{~7'忬C> o?1smoǿ~?o=F?o_R_/_7%?v??]xo1[8/+ʩu9?'r??gj9iC3f|[_Ǒh]Lw-_i?_ӿ߼!ğ??!^:8_+oT])?mOH??>Il_?o_Ưk~~<7? -mR{OG>'O:>Ku[x}|E?)%o]_;g*gz|5Gu_/m??k=_q/vm>?aG?{畏*lM޿~|s?~' _^ ?o?j#š?)+:9}K\RWy鿮}pS-߲~3y'?=^>g*7{5;J9R#wG\3;Io]`o'_Y]mw?o;۶EϪ:C/g?dw\i4mO|ky9kK?bϒ'NzG[cٶۆOW^zj$t7׏[#o;OZW!R_#7wޭ4{ݺNw-w2ݲx7O<ޭwy??-wݺNwޭ4{ݲx,<-w:M4{W~!![Oxޫ@mI?m)O wi__?nDz?޽jRj{W?XL;g?X1~W|?ʿYG_Mi -?_;~鮿wz{?)~AakmH׆cE/rϺ?vG???OQf?e^S=?|uowoJ6O??H_~__rߓǨGo{o??ǨnOyקx?O[#>Y?*>??Z~~7xW ?O?5^ -?c% }OW,?o{R?Oo̿[w/q|?O~ eKgᅴ9ho7yyYGQ??-OS4w~_ۑU?_/_ZO-_?<oϢRkw~??[SJ>>j2?_}~1#jW5/)eYyRYҺ-e¼|^מCac?[/???]mGsIׄ/=s=kKGw[c5?5?-B?|Hd8~N?#g#'ne}oW??Ʃ/?쿶q뉶Ͽ׹.n~~mkѿ~)O:OU_&_{_]?q^] >ք>5I_S_ZW󒂓\gmoό%?}M-or1[~BzK_O?%bRK_#/Eyٟg_)3sczn/_y>ϧ#}XJ?o=Ϯe~?u??zgw?6|5WU}W8<:Puץo~EeI^}O:~zMK#km)5cĿo{'Z__TUw[}/_g_? ca|w[R1M5+J#<[_RsMRkU߻Wxi6_צ$,q -'?Z_gK#>6_-?_>?u?#_Mu'mz}z_?¿zu͏_vu=/ot~k_rԽZw?ߊW_^g[¿_^ߗ_%ϻz|5?5_׾ϻabٶ>k[bgg1C??~^X?˫b4>/<[Va?]è6?2Q_mBc7 ?,O{Z_~ '?5_-Ng?w}_{~?isrW_c4/?r;/=?S?^[4/r>ߵ?&Vm_???LWC|um6.H9G?W}z#,īo?mmَ gz|NbHG?#du)'?W5oϋ}yݺNwޭ4{ݲx,<-w4ݺzwݲx,ޭ4{ݺNw-w2ݲx4OweJ~˗X>_>?Jd㟎_k>@mml>$m[¿7]t/Gkmo]COg_'ߝR}oǟV(zOW~_~N眷|HO3R+s;k[|zn?}Oֿ};f]G?wkiP\׾%m_ےO=cc?3׆u^۹pWח -/܊nK'v˒tK%ZO_37F:!^lI_+_Ka[}/_z}G}>EC{?}?Ҭ?Wo}yG=_?׭\ -Y>m~KOCk_8?yxcRIOӖG?ᇟ/П[f׵6o޷ /ݯxuuܽ~Jw?wcIk?nwE6yMϴ_7R_V?]ח_/m?#r?׶\>տ~s}+ռ>?[t"??o???z#ߙΟ_^Am_gWu?wk? 8oU9C:38o]ϢvO?v1ֿ#kH#qOt:ڧWo?m'n?OߢW]__'_;_?'?__S(_xlYr_-+V j>?סv;O#yq߃txY7\,y}>6y{?oxo,7>{ϻ_?Y7<M/]]ה7/? ϿR?|߈}ee?^%[_}siK}GuYFZZ[ۿmſ}{O/j)O?Vu/?_/O??Y]O?ms'O`^W+r5?^ -?,SLvKW+ -?|ݝzȿ#_mݵ}ǟC[}xgyc ~g=ogs'x,'?U?R??_7SO%mtv?cW?O?|k^koڞ?_ٟä^֏ӦoO?m϶?[?Q?_9Ga:O?{U ܮo_|wO4opj{~<~_Eq?߱_=_ ~i<ys?Oc2|4-ߗ?_7>.!U׿^W/?h?){wZZ?s7+~iNxMu??C?xݺ!??}[_tnGӶNg4m?bϒ'K3~=R϶G6َgS?/Fc?[#M?OH]O&zλuf[i^Wջein][if;[ן_Żen];uջunYy[uil[o~ W=?~.KRKm׬t{q}׭MxgWT߻$j7c2=2/ժoGCws?wȿ_s?9[m?S6Z;_mo7C@?c?/I^3??V??8 -#_SOASova!ؖ#?_?oIdi?O]Yl'|<=~Ox);,M>]yJ/<?iN?s9cȿ^2oT;[?i%|JSm-no 4^K׶eoG<?OH]ÿC~oGWi?mkqo??K]o.˿O+Lɜ|nz=S0_ǿe=kKfK_KRy_{??l?vGOJןv'__Ͽ<3?_:gO/?_ݹNokqgxP?#? W'#J_ٟ:??S?E7?_uPTH?/ǩ'zc|W4}tx~w{"9?ɿ?wW¿4/}w>uձ~Z?u?o=/˟8޻ߞ|s>7Rk5ռH8__?tgos-I6{o|ޞgѧ;\cj|߲;g+[W3'OOѴt_{#'Ϫe< wY-? __rܻt})8V—ֿ=YN^,O^-׬k;;Mfc߳O{GOO~svǂEKjq?W[['_i])7#_go]u63^H??�/=O#7]\ףvUK~ i<ƿW1?{)z?ϧߎ빧{,Uzo^??[K?mq_8J9??aG?v?o_Ou+|^<^ -tzy/]_K>xJJϢ_]-y3_=oKgeR?RпU{=WZ1i,A[Imk߻VԢgk}OJߟ}OǺK??e_ ߺ6\} 4HWqǏ.3^?w,by&mo=g#'nK _"˲gnw7gWGc׌o៽+-:JK<+ ;Є6?o? 3oi_1]:ϣi_O g?=SQJC[,mv75⼹>/鼼tR.;/?ϿL ;گ*_]_koAY^I-Kռ_6=}~?y/+m3Mm}&?OmOC _~?y=O]]?ou;WZYkϏ,s3wC]6+Jv1ֿ6?O=}?nO?mgX?wy:oWT[::/:`az3_i||oiKWrW_47~?ߗ_R-S?'C!/>}}=??O=}?>)?;_?7??탿 z_z~mK?O_χ~A9UǗ_?3+osު_<R__Vg6nemba'CEjO?Vڶ/ϿJ_iC7_'o[οp]g_oOm]鿮Gc'9{x>(UG]gtgج~Nmq???8 mҟ?FC2ʫ4#`I?IߍR:~]o]b?m7?/i>P'o!?%W״o?_,{nwE1P\x=3?וyt>?[i?>׭돎+~~o?>Fo]k}GC/'^lS_O+ߍǿrQ?7NKORC[:5=K_V ??N7߶_[_#k//GO}|?~v.csg<?sdMs{:?o9?mRE~JUvMY 3]Ͽ/?H~4.yU߻Wx4oHo޿mKGk?ks/OOu.{۔]??׉`aA6~wԟmq}|s5?^ -?6qM)x|_ChK'׺VO>t>Oߢ.]~UZ=NZJߣݺ]/o ϶|[Gm8z?;?#???mY^ Ϧywi>]/׷ FoBПhXǾg~g)|R+ռ‡_׾c8ԖoYs -X?{woڃўN/O}\o?~)#.i/s6G`ҿ˝m["ggeO2;kߴuiGӶT>ڵɿ׵%1gGu'^=}#-lĿm'vuS?^_x?swFm?-'vGOHw?ю{^;un];ŻeinYif;[ן_Żen];unY[ifŻufy+V[{ρ|T~ w_ Cmkz:O6şGWZtGkӞf\/{??e?oYS=y_s?9ok?Os<om>o7C@um$_׶cA'oS[ng?y#o뵏XVNK׮GooǶ~s?oCdDA's_f<˲|g^~m!?3?k~_{-?۶?'i?\^9<6=R)s?Q?GX?{|?~<?K??>wU?v忤G]韚;??NkwgOG<g<=^+3uϟ|~Rt{k?-g[ߴO�C1^{|=6??{o=9?oLO_ʭO5mc'_,ۻ3;JKϟi~9]{?[?_gfqzF'Fޯ?o>?GϢGo=r:OoR#Of]??_O{&׷izx)>ﻯi{'i|_CeO_w_Z~ XRV<vnoοߣ -~o㽋߮~_gпZ_}n׶k/yq>5׿<SaK!r϶D#uoZ{ivO:׉믖c,{]Gf}/~~-!;z-~F:ew\5=ZKo?ϯ=gUYϲOf׍Z~זRY?AEip~}K[~_ -_ZLe;y?ix~r_^)_Gw?76zc(|]{[#?|??/G_5N4?뿘ꗕ#Hvܶ??o?-CYR.|s_??Y?NG߮ߺO{_:\j; ?cǿߏWY7W~ZW_o_ҿi{߃_e"X~ѿ~7k/mbٶs?Z#_׾gK%xCaC??G??~^=*lM~~o^]+{w?Z׷{oi>?c?}{yp`{Cѿ/|muIk?JM1zy,Kxxm,A[I??w߻.?޶c2q#]?}6wcC<oa.#^O_/?﬿_edҌ_m?_zT}#wD'_O}??{kɿ^n];uջunYy[Wuٻu;׻enY[iλuun][ifŻufy+VPݟ—~|sz,?w Oi|zxmCWB-}Ə#Kz4OsXW )~|)?omo^?~UO06?~./_/_ZR׮>/]_=_?u?" : ;4-_i|]R4%TͿd5ן|~[O_SCo׵t_{p~FeYZ_uoLsDG{Qu.?,d_zMsu>oL[זRY?AEp%waײ?.؏>_]_|rį¿_ߏY.=jύ?독y?8JG׶y1?zc(|]{[#?|??/_O%_S^R>{|w2xo_~w??OiK_z?O;?R#S_?h?k{3g~_G?[]_>M?R??;??Z7~W?[OW <sg/y=__m#?Ko {wҿmK_{iۿ?OO?ڶ_ךz:=2w5/< -Ssk?o-?[yOJדv'__3Ͽ;loK?ZoՏ/"__8?o-,??oCm?I?8uo;C??o?v_m~_GJGjMKY~o#OO_6~ޯc0g4>x|P3wO?=>_>ւ>?nve}??~vy&>eI^}71ܻ_=5>??>G:̗\^:ceϯ7ϯ>>G_C$9ꌿ~*? -Sak/|/e+?I>+ߺ]1Ci[߷?9[ߡ4A?/񿞿ֿOolڟ-GuwwoEU_We>|>}}_8?{_'O?6Y/U ??^:~Rso_c+~z_~?{Y?&>K -?e_|߇SɿϿ]o<'o#^6??GVzGu͏_{+ۮkK#}~zz>V_'Ǘu/'JmnCm|ƟK??su#?o>=yc,4ǿ܏߮>?_i>} -WhOwWsc}c~g)|R+ռ‡_׾c8_|jy,9z7_;+ׯ>O}OK9R#wG\3;Io]`o'_Yi?`ҿUu_?j?︮ץiO;ǟOU-^?K?;iqo)g#m>_z/«%7h_?o)e?k]%;GGkIvbwyw:y,-4Ow<M4{yݺz,-w:ywݲL4{,ޭ4{7]l^?{zϷϯ~<'\?%} ~Cmk?|:=>&NWz~R?K?]z?^</cF#ǒ2Uߎ?a]?Yh#*re?}\5r[Ͽ:=O+-/gFu_i篿OgZ쯻#_~?l?_IOO?AG?{?O_McGA+?ۤ?8"#_SOASova!ؖ#?_?oIdi?O]Yl'|<=~Ox);,M>]yJ/<?iN?s9cȿ^2oT;[?i%|JSm-no 4^K׶eoG<?OH]ÿC~oGWi?mkqo??K]o.˿O+Lɜ|nz=S0_ǿe=kKfK_KRy_{??l?vGOJןv'__Ͽ<3?_:gO/?_ݹNokqgxP?#? W'#J_ٟ:??S?E7?_uPTH?/ǩ'zc|W4}tx~w{"9?ɿ?wW¿4/}w>uձ~Z?u?o=/˟8޻ߞ|s>7Rk5ռH8__?tgos-I6{o|ޞgѧ;\cj|߲;g+[W3'OOѴt_{#'Ϫe< wY-? __rܻt})8V—ֿ=YN^,O^-׬k;;Mfc߳O{GOO~svǂEKjq?W[['_i])7#_go]u63^H??�/=O#7]\ףvUK~ i<ƿW1?{)z?ϧߎ빧{,Uzo^??[K?mq_8J9??aG?v?o_Ou+|^<^ -tzy/]_K>xJJϢ_]-y3_=oKgeR?RпU{=WZ1i,A[Imk߻VԢgk}OJߟ}OǺK??e_ ߺ6\} 4HWqǏ.3^?w,by&mo=g#'nK _"˲gnw7gWGc׌o៽+-:JK<+ ;Є6?o? 3oi_1]:ϣi_O g?=SQJC[,mv75⼹>/鼼tR.;/?ϿL ;گ*_]_koAY^I-Kռ_6=}~?y/+m3Mm}&?OmOC _~?y=O]]?ou;WZYkϏ,s3wC]6+Jv1ֿ6?O=}?nO?mgX?wy:oWT[::/:`az3_i||oiKWrW_47~?ߗ_R-S?'C!/>}}=??O=}?>)?;_?7??탿 z_z~mK?O_χ~A9UǗ_?3+osު_<R__Vg6nemba'CEjO?Vڶ/ϿJ_iC7_'o[οp]g_oOm]鿮Gc'9{x>(UG]gtgج~Nmq???8 mҟ?FC2ʫ4#`I?IߍR:~]o]b?m7?/i>P'o!?%W״o?_,{nwE1P\x=3?וyt>?[i?>׭돎+~~o?>Fo]k}GC/'^lS_O+ߍǿrQ?7NKORC[:5=K_V ??N7߶_[_#k//GO}|?~v.csg<?sdMs{:?o9?mRE~JUvMY 3]Ͽ/?H~4.yU߻Wx4oHo޿mKGk?ks/OOu.{۔]??׉`aA6~wԟmq}|s5?^ -?6qM)x|_ChK'׺VO>t>Oߢ.]~UZ=NZJߣݺ]/o ϶|[Gm8z?;?#???mY^ Ϧywi>]/׷ FoBПhXǾg~g)|R+ռ‡_׾c8ԖoYs -X?{woڃўN/O}\o?~)#.i/s6G`ҿ˝m["ggeO2;kߴuiGӶT>ڵɿ׵%1gGu'^=}#-lĿm'vuS?^_x?swFm?-'vGOHw?ю{^;un];ŻeinYif;[ן_Żen];unY[ifŻufy+V[c?'?~UO 6 6AMOǿc?ğ w_O -_}g)G[Oe{X_&CG?G? >m^_,t篏뿦~Uu^ӿit߈nuk? ϰSu׶$k1omg??ף~_Z'g2{Kߞ >??:7;b7?o%CG?/?_^o/9kc??Rn7?c?S|<?-_???i??M/1{ɧ+R7=O)eo?G|? K~ao8>u}Y' Oi|2m%S4C<,ӣ(ߟ~|yiK|v{Я|}{/`}M_7gOGB)5 er|% 5sύ?^ -S5,[mլi]kӖoa^j>kOG!DZ{؟-u.?vz#9I$ k9g^5K;u-y1οpp?ߖO>qO[oOiK~tY?S'GOghFg7ղ۾׷NS?uiue_[8ZDS\w_{7w?6|_g'?]i/?o=˟]/߮}kBԿk/yII}3]϶7gFX>俦ז?K^-?!}R?/'KORs1GYy/??O"]|z<ڏp3S1=^חeK민Ss[>ogj%vugWYϲOf?П?O=x3^O_>_ݫR\+?ɏ_u}RI]'o {fLJ׿6{۔1ZϪ->ʿ~__{/ÿCMoUe&Oo}O̵*+<z?W}j@Ck_8?yxcRIOӖG?/:/?ϦߺO{o?u=>{_=nK~o:KǷ{~:^?5/?9_}oū/^3O-NI_/l?S˯]=NZJk]~ưl_o!?????|}֟U`l{]?I~_p}ϰ.aT(/~H_ѱq|_Z犟?\'_K-|Mu ?Om/??^wƟ˻>=Oy49W߫?/߱Vc~?O?R?nOy+{ȿ߶w/?V[?{x!_㺶MO^?mJ]][o?_w7?R϶G6|lǿZ?^WK3=>g{'o#~R׺JowO+žn];unY[ifŻyin]λunY[un];ŻeinY[inٻo%?K,J ϯ C͟}mAO_W ?6zkKGoGο-_ZR׮?:G#5忶e]'/ox)>߷uCocsTMe?X/]eg -ܿs[>~$'_NKꝵiw=o_focؾʝl?#ÿ;O?u(gkxҿ~6/m?_YSkÇ_:W\E+KKϗenE]_|ץo~EeI^}O:~?jȿϿM#m/ 6kߕ->ʿ~/J>׎"=[>?i֟zv珷>׿#?ǟ.GOoyJ,6AyC/?K¿cױ?Y_)t~_GȿϿMi~GAGgvOo-_?ok7 w O~<e|wO -;p}ϱQֿ$g}gZï_{?/?+w.KK/_}Cm϶u?CCk?[_?͹>וeKj^RpR?-{:]???ko=LO/]gO6w}E~sq|i;5ϟp*wǏt?.gCmO_?I?8z:+uَcٶAg7Us[_nR'oӮ/?nIj# \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_0_167_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_167_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..bb2c8cc48e2a75953ff0d0e18b970e7997b0fd52 GIT binary patch literal 2901 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_167_states.bin.z b/client/resources/hardnested_tables/bitflip_0_167_states.bin.z deleted file mode 100644 index 8aae9133cda225ebc543f96a1c855ab4d8738342..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23886 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 diff --git a/client/resources/hardnested_tables/bitflip_0_169_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_169_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..bbec52e26030ba94e8c3dc47586683d466565dd4 GIT binary patch literal 2437 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 LBk8}NDtq-Gtj;$h literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_169_states.bin.z b/client/resources/hardnested_tables/bitflip_0_169_states.bin.z deleted file mode 100644 index a42857b5add261be84d85afbd01eeb8a08db1c42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18794 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 MU>AOJB>27m1vV!$D*ylh diff --git a/client/resources/hardnested_tables/bitflip_0_16b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_16b_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..0a34da2f642ae62699e95538d6530b16f252d182 GIT binary patch literal 1400 zcmV-;1&8`VT4*^jL0KkKS)}EhQ~(RXfB*ZFxw`>9)g1v90nh;u0T_jm0TDqF5EtPP z6;J?G%o*ScUjP6A000000000EVKiiDXk;*r42GIC0Aey^0|*8Km`xcP8W{{DLm{S( z02qv!0Kx%)<`YInhK553(8y_{Kn5cwKrnz{IfT)Xp`nn%G%^}!&;f|akPILg4q-H8 zXlP_GjSPmGGyq~UWCI8W0HmaeFqJ<>sf|q3%#%!mLq?4a7?^;1k08|Wlj;4?6;IcN zN?v2uQsSyuQwhTrkKhJlI5J}4bRT?4(zs#$>Oy4`;YZqJ`(xo8PXjKW#6HUDKU*nu zVtfa4hk(j|LF!(^7fbY?DeHE2A4%D9aLk!-@>c^are2GM!x=nL<Yr#Nbi%rN3(Uuv zpM1x(%(F8j@IN``apIQ_4-+Se)3U7eXX0HwPe-`L@hMdDi9e?viRx3}2i8~KM`NO} znD&YIM*!%q<=~tvz@P3}V;JE-#CQqWT?fjrvj#G<!In&7JwcX#SmI^Habvkps#X}X zx*1XUUM?fd8B9!_mBCIXO2#-ia3c%{6Y7kPCOntuUpo1d(EnxTc&Y6p$vwo$lMAC0 z%`&fW`j4fL#&%CpWXj273)&}=ypMrj3xn9>>Z#&>g_ayv997*H?R$?G=yd7pCES)F z_($A+W9$#i_t)ig&uQkd<gOS!=feF*=X}qM_>Zp76+DcYKC-SO(8|uAiS}H5*U;|p zC#buOxSTjMi#Rjvl)mvx>=p@##Vks=l`@twmR1&47XtVb?HNm?#{$5(WtK8xx)|bO zF<CJ(Vr0b0V988mW$I2S!y&@TJE392qk?u5E|wQ{F-|O2F~cr|?u+0~;(nEJC4(kT z<E3$2PLmP&&tdk<vdb*7hE(pdmliHD7|XeXk0&2=vf<LZItLdQM@LRE(>g9Q;&kJq z$jN%l4vb8@2V?a+48-Ej$-^!T?BdL>95R_*Cr*`^>FRNDmC(rHWV;;&;IQCvaV#-- zJ#Oy->NB|h)b8NCOuPv6J2<aFit>6hK5@{U*<FmUGYkJ$PuRa}hhcn&bog9x`k8iJ zp2Nu=*9W88xVtX{C)7K-4u{6E+;?y|uc+`Y78Bl8FSz1Pm-37_uE4ThYxXY#<U1x$ z1mSRHmQ?&}hZC~LOUUjz9*#JkMR4Njahy&E9!GPf=DkaUyDuM$i{p4Nz`tVfU-bIt zto}nCm%2RO=)KW##DCiPkCgU{)_ks)#`I2}W7e?t8G6}Rog7TK;;($1W8ZuSM16DJ zE5UmVy|3(Wu4Dh4;`v$Nu9N6qNPQ35zEkHPzMnhZIP!i4drQq0F~OWNSje8$imzcf zxUR!6%PxzCzOzmpohQ(~b=bq`crKZH=L^7io-XHQj>{%oTv)mp#!ie*%yGvDM;PNe za6c&$gThjR`fwsA?oC-?L{-p<WfKu(7Y!;@t4XCOEDxC_e1Nivgv5*%7)+wdVKJ3s zETxHwlPsoXhGMX?Fvbk7EUShI*(n!G6d1pDc22`445cxOadE>eSvx6I>0r7+(-viu z1~M_03{1+&jIoUA!s$saF_kQpSxVtLRxX06bP2^c6NXhRmjf7_DZ>?1$Z=;27Z(x5 zF<8Q4v605&sgo-sh~iU`E{w3@CkV<JRuz>DnJTg}F)(6`Rb`@N$ibymnkyQV$jHRN zWtLc2%C%)`GOEJLtjLVAGZmH?$c(bAtcw_>mLX-8Ok*snSj=HE%8bb&mPE@aGc2-< zWiu5_!x>1-EWsFHtjbuymIDlySY}c&lx9@SRvAjhRWk-yOvuayh5=#!;_gVN3KA5Y Gvx<P}m6hlK literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_16b_states.bin.z b/client/resources/hardnested_tables/bitflip_0_16b_states.bin.z deleted file mode 100644 index 426210addae4a8fef562c14ac7ec2592fa8d161e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9190 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 UsCqEuWa+otVA}V-b?ATpAK5JkbN~PV diff --git a/client/resources/hardnested_tables/bitflip_0_16d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_16d_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..c6758b6a2deb35274757eb0d16e7ca0c107cdb30 GIT binary patch literal 3478 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_16d_states.bin.z b/client/resources/hardnested_tables/bitflip_0_16d_states.bin.z deleted file mode 100644 index 5640076fdf5b1b1b92a9c23f9bfef77c9bf27280..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25731 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 M@wmL;+1F10Pd&Lbv;Y7A diff --git a/client/resources/hardnested_tables/bitflip_0_16f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_16f_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..fe936f3bfe2ff4e117c94e3b1b5b8ee9ac4c2710 GIT binary patch literal 1526 zcmZw5{Zo<$0Kjpa#x5jxX28Qv@hwpFIo{mvh%;uICiu*kP=p<t@bGwb`$aCfQ*xO$ zDd0I@AW+)WrAbzv0=wNY&zAC1^1#`Zy{x;v0M$)fE5~e=+id#-_Wj}W!?*O4qx-lA z<P3=%Qf>c+J8^j%xlQUBO!#>RDTzc%z$Nr#l_Z@iDIrF7jpJ~_Q#c%MN9}+7*CO%! zQ67-($gLpaf{xSKz3;0&X!+my@!@kgT*4skC_$WGcX9bc-q`uEFDgI&W>?J<v1Bp1 zAZK&N%DbQ!dl}i*v%$Kp%gmue@9tKq-2J<|f6logF^k?c+r;m^V+V>2{8^wo$y%|y zG14W8<a?}dG9y0Yz)}Y<)c5#J|8#d<?sVfGskAuFc>T5k9k*|x-D~TOlR0mF`LF03 zWTI2Si=EUfnq*sK_QRXcbwaj!(_|teFxz?Kv&^M<SLU(p%qK6{o-PV$Y53As$NE)p z&azRI+55<c`UX5le#}<pKFr-aQ&u3|ySzXw%cUK}?3}+F2K?aM&S!F2D7~75(i$wZ zfW=_?Uc>9UDPa|w0NNO7F^0L7Hb^IY2WebHC{{_<2R%01fn(}}qaRj&DUiv@68vER zy3C_WKyIs?vuuM7n09ioz@U$$PiiljFTKvYAbQI&cB@2Yu}dm$e43lg1QY)%XgCKj z&6B4hp*>D@C>wQ@`=jdZr==~;Nq!TR(mS@t6QXy2Q!w^B+d0KM(2IR{$p3mIIxO-f zo*@b0y(e!4+UCmFmSfQy@a+c|{>V#P8n$5D`n>vW8VU!avJFjlse2=H;$-3UCPLeI zm6v*gLV3)$%VAUD*|qkC(dK|j;L_;?#UsTiyOoa!$A9TtCBhH4*ptuL$xNg7PtCgZ zS<U3r$UnChI{4R*|FD1fnsWTp*xzG>4dLxq!x2E!uJOk-FOPH#KcAA#IX88AX)kEy z(dNS)#iJ)eDeOa!oxe_a*w_B(%sjsQ%Kf^Zg>Qp@(l%1#c(pJ&D5znYgjHJ;U468d z$~14>A<#a6u5*H`w2aRt7vm0PB;M>}&E=)T51SQD3T@|pS~B)Jg|)v34eOepc-QYn z;%?=W=)LyMnr{V<mI4FE2aXF?@=}C}LHZlx0u6I0tBuuzTmMuN#$WuoqrTf)KUv!I z-qzXeiiQT%=-_aT^#NH3fQj<Y<<ewos+m!Wxn&##0j@IT4eHDLaQMR0bdf0$4-y$N zn7Ne2Vy0e{WV!JbB?v)Yi-iiwVicN|GgLeaI5aVs>Y}^lcmU2)V@^NMo+Cq&3s9BY z4$Yi?TK>^%N=Xy5-P~S%<%}pJTfn@VUImVT>YxRLLAMWd+FP^&M;gdk$p9h1g{Zw6 zs;wFb^L&MAAlDcoD@VQt152v~Gd2lTOV_9|l^ifwZHKXo*nAU}YHgJ`pz`|-pqGPL zEj_C}f(CRtFc_9{Y|ymQ)>I&n*0p&3K{C;*<?>bQhC9L4oQOc#2I(pXD&+PdTltXL zWw2LBm_<b_V<#6ea8a%mg&AdDb<m_&S{RU~ny(7>1=RepI_ofD4QZ0@99aPs&@zjG z2i!0f)b_Q7zedBRo)HzI@~p2qQf5;?fkMH3kd}TVD8VM0&7*W$iH?stF>loDSq`NZ zF{C`i2DvDB3K`Jo)M3G;vf250Rg9~i#}wMOd6ym4w}h={sz)`lU#ITf;Lp#y?hX1~ zg&Euw($I*ndY9%Vu#%S!KI+fV-iHKm|Ln-hg*$d>Jxr0)ZM82+>!Q|HalmXMm#+mt z8;ixS;_A65%(b;LQJ2vZo6T=64ToW32!!{QHj8O{5J+|dh+mq5C$v?k6YO{p;uU2_ z9}j`oNRVjpYz(Mqami+6XrRTx)Klf4D!@}(z^P$Eye}&DC<=S*L>(_ZozK0g?#y>4 z6XGbu36VLWG(#2Hn!)NU>o1$28+s)~!Yv}gKNxdP__01)?M4SRAc|V~3+V~^1m)Y< P^U6zv-8<1EKYsNuFEXhY literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_16f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_16f_states.bin.z deleted file mode 100644 index 39d0d0801c3c3eeb7a2f20fed27026c329766ce4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13553 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 JwiUnpe*jU?Z36%R diff --git a/client/resources/hardnested_tables/bitflip_0_170_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_170_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..5180aae930ffb5b4c369a91db97c8d3049bd9a0b GIT binary patch literal 1119 zcmV-l1fcsuT4*^jL0KkKS#yf?i~?c%?Lpby!~g&wL4W`Nfq(!400`g)-h5D1QdFTR zN(mqo0Ae)LMuh+vjWp4rKn5dCG-yx(h|^6P38^YgKr{?MQc^;mqYz}rzxqldk0P3= zQ&d%;7KJj9Mij!DO2JeHg)}LUriC#?ybO?XRunb}Sf;47ttwyWjUcpBM0AVnk5qb^ zuQXm!k-ku-gs1*W$diOg>_U|ER3x~R2)c?$YN}FN1gu0N)KzGrmmx(hR1rA}DR@Ff zI6;aPEU2*tAjC>d3TY~XN=rhTDy*oqAuxjyCL)D>1x8S03sp>_%8W5hBO*+sRWc-0 z<rGa70ZbG7>D5JDB!U=&^ocT}#2Ha)Mp87WWhiP!C1hG4tb+<_460c{?4tNZ;+0+y zi}w#<!VakzRfSnVVOFTC!K%k&qE|ywQo|HwTA=PFl?GH;OQer=Uj)3V+)Kh!!jQb8 zSQ5PyQ9M+XmkO*vG^R?bWic&8$}p=+Xe+X!>_OD0MM3xp<fa@+C!!%A6)H~TLOg;e zYSNiTRZ*g=RSX)6SY=dLXlS%FFwoG^Sfa|6qA7?n3rcBC1z||JN|A&e3S|YO8lu!% z85WYXI-))FkODXgRIh~;Oaw(`MH3}NSwyHfry`14LKOMbB8oai6tz?ii6Z2tRHdX@ z7DcE@q*+B3l8Ts=z?8{NDIjnmPErX@QlmjxP-R7x7J+4CjHPO+8l_31D-dcR(hLPO zCXtlNYSk5FSfN%LqR7b5)LJbKMUkk=Rz^y!p=yw6OrjLNiDgB?3_+rl)kSGpQj7yA zGE!p!Rb>`}no81E8B!_9CsLv;ja3mkQl)THi5!&{l`SY(Xctux$mnrOt}<4O1mzZ@ zHC$sx8n5|^3du5>%KtL<006HyDg@5%AOH*i00ayG07ifx_mEP8fj}vf6ClXKnK3d9 zj46{7AjrWrDv9YbW}wh1B}6oU(@(V$M~J}~Sq4U_3o9#3q>BtRFw&;9OIE8fT$+`P zab4bCc&-}vM<Dv9s^YK7RbMEP${={Esi2{%CMpJ$)dQ-5qD9p}_*E+6#8Hup7ATC2 zr6yI8kjT|j3l!8z-AfA<YO#&0STvMnL^_~ks)I!`luTbLvN2?7lTngsrnHL|R;CzV zhx4sEm0aJwD)BJGB*R0)CoxT?X!aQy7<gaT(dq0x*Sc4wXkKaufeWKZYbdiCW*XIb zN0RY)Bj9>DOXX61M7@fW&{v&iMUw`^+7{Net*vV&7)?zXm}r+&hKb0)$&A)n)k#V; z1YhcbfJ;>a6;-MdbE*avDqN@<DaBV=7FyOJmZ%v*#erq0sNk!lrF5FCjEs#|Ws^aa zm{z7mi&a)LTG&i!Q(>)UGcl}c)-6*))`cH=DlBAiV%04ZSt|yqsci_=kjpKqmB`|% lwSf*)oeq<!Sy&qf1nZqC+RYtUo!P(Q?ntK!5*HqJ`v4;?(IEf; literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_170_states.bin.z b/client/resources/hardnested_tables/bitflip_0_170_states.bin.z deleted file mode 100644 index f49f4d249192c6e67be5e984e54ad4f1c2ac5e4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14725 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 UiIfug|9a>{{SoTw(g!~FPb2AaasU7T diff --git a/client/resources/hardnested_tables/bitflip_0_174_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_174_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..00e4f95b49ce7a6f56dd375a4aed4e5dab77ec55 GIT binary patch literal 1314 zcmYk*?N1YT0KoCq(u1}q(5K_4LqICb(yqN*Skj46R0{I2F({OCQSALH2{C(dBLq={ zmZQZ!MI$Qf3^EV}LBe`_)nvG}*B&xsvZ5{_i^+N>b1WiJ)I~+-e7W!6@cHikvi(zH z*S=!gzCl~`uy`c>P20P*mol$Q<WjgK@1i1^3+)xnr_et{|1T<97<YZ#z8)!W2cnIo zN#rx}$ozVVNK$!G^vg);2JwhP)PA>oLn+c%P>PDyZ)}$oyOM_xS7T$v#lz6qxbaYF z@~d;7e6Zy$FMb|tsyV?~D+`AQp6b-|FtyYo+lJqKg8!7{lOW8W>PT3?3T2@!L_Z#m zKPh-)J;|(;A-V)hj}zT!SI+GDRgK}^R<z06RkR(+DioY|%&wo4PtEhraO<82<jR4Z zOo6`PsV}TA1P&M<UCPrXcjzM9C9*T+ulpDpuR~CqCKX-^4-x$zrf13pcPjDcvJlTa zouE5={(4CF#79!}rCTfb@MurliwkS{uH`HTk>`5er@n6ruszb$LEXLX@8(|&3|k-T z6l`a%$wN8aLd@e&?S#i~c6{&U2xmAP0^1dNtIv#<EUKsNVe6r1X8K6_Vk@&_^P^k@ zOP^(r{~GC1|6Wh5U?30v3!8fw57iV!^!k5%5Z@ieSqI10@OHfu12}|^DDO>F_p3n& zhdkv7Vp2ygq2l{>AjDR?aXbbooc9N-{k*T&M}u&)KXe^Y1Ik7Cogj{q;RNps+6`Dn z9I#gRWUL8Jv6_=#o0nz&=>|t=(k=CK3ErvHX~s*g_M>&6t}!BQNPd22)G?<6u|Di0 z$oBee@;HbE04hBp*7oX?9yqz_*0ME_fsf@#Jw~0D4ut?Y-C&_Sjx&@AOmxJR9{;pH zI)@8zCKKI{sKu{TOLLf*f_>4;RT6Dkj_aG=stilR;x_$$%vdFHcgyFD1Y}!~Gy#?c zWbV#d)tkM7Nfq<%VMwbzO#oY04XgR$_~jf(G~W*gNg@a#wNo%B*@KfNzFW(HX2RUN zD_>j^u~upf8MD=pv?+bv0}jHV!pT9@`dZ`QZiv=`2ah^lp-1%fXRD@Le4FIQD!B76 zvISUQIB~D!l6<0rK=q3Wa*k;B+&4+Rj>x8Yq2ZB|S;jPc0Fjkp;%K7v>;gT9f^A^P z*kw>)nLd9f9?!pa!Z~_$IBmsfR+{*~i^~+^fCdo8I+KsU;e?!<$Y80~ff+yb2pmh# zYG2A*ICcBv-FJDLkLK;R)b=sqX-W11O`O)=%8|x66QDSHN}z|*XK%FCceg~INXEw8 zOMvaqB@X0defxN;?zT9!#ZqL?h9!7|D<bxfJr;YXxC>FVWT?o~x$c!)en2i!${ka| zy^4o>buYbDY0b4GE!HG!ByB1#LE$r6IzoUrlVabW$Z?Cm1=N^9t@X1(Du@|L)(QB2 z)X7}Z7R43<uE}T1=802V8pLnQFEHGwKjuU*tzE5}V&OmnUa3{9u;LPUT_I5*V0_*9 zdsH?p&J#hSO%5k(jP`7v!b!XSc`8*wN<B7ZW%e$2ciK5=wY66*EfAVY1UabIu06OC z%GFn*Hifo^gF&P9@EnHVwGt&v4NS#VA+n-Yo|+n3cP&NlCJou+>9QvJDl;gv7Z5sT vOd6x8TE@yynkY9|C|I;HQV(a;E|UT^$VsC_A`0((`Qw0|bGv^SmVEIaA{P?U literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_174_states.bin.z b/client/resources/hardnested_tables/bitflip_0_174_states.bin.z deleted file mode 100644 index 66acfea97be0819859b599b4adae1ea937decbb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15952 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 diff --git a/client/resources/hardnested_tables/bitflip_0_17c_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_17c_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..01c02bb2ba0914e86171d439b0167d823be8dcd8 GIT binary patch literal 919 zcmV;I18Dq0T4*^jL0KkKSq_oa=l~F8|Ihksz6}T{7y=8hu#BJp1CT>&00IjT009c9 z1E}B!UjP6A000004qyP8FaVfL69`}kzy~k@Oqc*nCJBTv1YiT0047WTCKCk07y>W> z%m5Q6022v<VGIEn0OkM*lK=^X!7zpZi~tmrp$M5zMD%K5q|nnwA)`$gm`24tkrWTp z6ofnRC0#;0g;op7SB$WH0f=IZCqYi6p@_vy1%P6ro<ZCfq_|IvJfqT2IeW$AE5H{B zz*w%wfW{bKDS8XUT}pL43&t_^3&4ru4yD*Th;ZTDN8DoQVU8bYaOh*9aAU9+V-I}9 zaIsjtMbuZcdqLR2!uvxXLHCcC!^{)R7^4djJ)-dpUg=I2C*(fi_Ya_ZW3f-HFrP^G zOfbRX7AyQ8VEWFa>Q5-(z4O4uhu%*yc?K^raP=2L;p-Qyu)d=DMmh`b7qDM=_R5~v z_lW$$`H4@6yyap$67!ZPkYVnN7eS5|1_#Iwth<X2p?4SS2c*5i;d^E86QO=3_8tUy z3j-DgFO>PmpuZC8C!l+U=N^G!f&9hi3NEAfn8qr@7A6>AF?tJ!1nw6O9#f&v#|NAo z9SPnT;fZxHoETn%&v?8Cc^!!1cbDXT2l*X?xa>|7g7zOFk9@yTbT3f9GvFRG;}38@ zGJiqkFWNpL=zrnlJ%aNWto#pzJY_ux<ap0n)c8gxdBcG97@m-?+)IT{6?n_%7sg*1 ze)7fMF7b1rcN3R*xLpgpTsoIx>^Lrh!yOBQ7eeYdPKQJO2n+>@eFb0i!Z9#dSSBMC zT?sqLQxxi0CDeZt7+6wpxGn;oQo4*-m@!xr5U1!;n3dR3`UPAHF7RFjgpQ$r!Aa0n zMga8)?jhh<m>5S2mvFISn4BzCiGvk_j4@6M#A3yZ368-Sk>E}TaF<}6Mc5`RBfMRJ zcoK9f;9Z9X7<ZWHMjgc9rwNN3Ck1vRpy6<_aKjS^P~pNbV-AN7@Rd{7ilm|J6)adN zzlIem;X+kDLct=Hi-c7c7)eo!3NeDK5@97^F%qm|q*x;aV3?7KVq#(o35Z}~OhUw% zhAPCEEG2=6tYH|ytVRTwVpb*#3k(JX#Kl;!7{C~qSYr`|D;5SL3RqyQSeUSkSW_4l t7#NtMv4U7(Rxnl!V+Do*h6WZaVOU{|DKNyQF=PLWxgwk>NC!yj^Z*_Of0+OP literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_17c_states.bin.z b/client/resources/hardnested_tables/bitflip_0_17c_states.bin.z deleted file mode 100644 index c8f72c15f169d8251427eb6e7e29f47d14f71e68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9694 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 TmKFZAcGk}~;v4%mq}Tp0ec=-^ diff --git a/client/resources/hardnested_tables/bitflip_0_184_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_184_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..5da967674a75bdd3793978b52649b9ed0f65156c GIT binary patch literal 6184 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 V@L}uU-)uNix3y_-^yS5|{|9%^aN7U? literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_184_states.bin.z b/client/resources/hardnested_tables/bitflip_0_184_states.bin.z deleted file mode 100644 index caa5e8bd4e720fad218a9e4f3d074f2bfa04e957..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27244 zcmeHwe^gX;-v9G#+wp1Ljb|UXrL}anZCh%srnZa}<!)=nmYcJ#o1_SLTXU&UC-Vm) zFrRJxx@;-V78zR#w<04$m=tkRl)I^bh;l`Q5fHC3zyQNI48#1mzdrBp`wnPWZfF15 zbDsTvJ#bDOJB~B=-p~8}`t^RZuFcc2e0}@$sGnRI=<7JEzI*SbWzVn8d$H}9VbAxD z|M|y%t?{Ik{ZG@kAOHD(92@uJL7)O?VXvFFSwYJn8vZ2ke0EkAktLqtKpXIz6+s~F z5S#6Fnz^U7;-J7$(Luz=4cWsJ`oNvOpYC|YU!`d>oD6OGNSp{CDX{)lq2jK0;-x&o z1YMP4GT3gD9YNc|%o5m0cWIs)W-_D-UQf9aP6?lHkm2X$Q|Z$oQQl6Q-~-vLwiu$c z7-}J_&Rga{vXaO`1>v(McawZSY!lf7FhR1L;hpT6hYn2u!y$N15}+I=orMV=qiO}) z0Mv2nMHpm;8xwd{Wp0I=YPmfg@-Y40Ug#v9WRQgU03R@DOW-Us?19}-tBNW|n}`BO z;UXDiC<nzbtp7=PoZMUFRqYzvWuou6*gb+Uu$q1}ox;&It}rq9i3_&FDjG%2+N)Io zPU6G*7Xtz<$G0#PL-cRMVrpRgAM*}|&sNnAx65FN@_-^94xQfxV2KAy2c6*sJ{PZX zU#PEniq@|hhtve0(|Vy|DJ&XdCIXRYY$wd49syh};yf*_k*pKEa3KJVf<dW;=TD2x z7EdSH<H6g?RzY4k0Y6?aN=xodWy?8eceiDFGBf>fi_8aDDa#QM3*EwiL}r7SN3Acw z6E5<YlBzlGq3LgG9U^>l(16z=2aW(<%#jPh-2$zjLGKIli$3m0K~9xOc>KtvgU)cQ zD#}M_w42edVl{qAB*@g$;%dC4D(Mb0QXZqSDn2`n#!3in4GZ`CisuI584;#Xm&&LH zx<qrSydT15n(S72jS0d#&<+XUfeH9VK8FkVLa%BD{m#HIWN^);O1qa*(#F6(&^&v< z=`5pv=YtDir#6&-D#4&l?lrdDMHfr<!9zuT_8NXIyD8K$(e#b%p%{2vN_806$&le` zl;_kAGL_U3lmpMv7>Bs11!8I({RU0BM<DyCb%}m;*5K6{xyKTDT1m3t0V;<9MzyN= zz~OgV9rFV+P=07S{dEDXDTEi)n9W>FyVw)Pht}g*t&;ibK;ec=8RDHpWq|zwOncDM z(XH}x@#(wB2TaLw5LzJ>IF0B(#8CDWq`w9QsicU;Y-WZaa+RX+T5ujPX8h3QsBpA} z7HLUbku_c}ZnCy<`llqrvik)YAK3lDm^iq2!D-kI7iD&(CN#hk&_@<(u@<*=w%lxM zc97eA&bztF0!Z+}k7>27HIO<TA1TG~XZ*($@qLY{qlY03$0>eB0~Kf-c{Lv2X4R)K z<#y8d3a|l<55hF?swIACfH?etq1%XKIv63{<A)v?f+iwC!R0#$?J|)~(1$l1ABAX` z2eUQ9kZ}vt!4$BmWC)Jq4@P{NZpd~se&UOKQBF(62MIrv{tXrhx*-pC{|q)QE())F z7#5F{Sj!}+5AoB$w1P4cU*duuZ#Q`hN>@-;&JkOfHGS#tLR=hV1Y~BLgN!R>%3b*G z>hYcODtLM7o&a%1AZOs4zA?`}{2!_IXnXs##_cYDP!eRf4gRVbgRAy<qm{kCht#0| z1vx<^kLb_Tih+b+=CCj77_|D8hs;&m7-*|1r$9qdpXr}^iktUEv&@IJ?3;a9*=GCr z7t}j4DYuzfyMx#r6`{!OB=&Ji^d#t2UHBA~d&pX~csi|x{2+9(i|HWoaSy<-gN1oY zg4h_Yzc<mpyymS`FWC*hP*m5c@CU=`o7vftVJqArh>ammQ+M=3Sc-{C2L6yHl)>Aj zL<)@S#kxWJ#98o`<hm`F{E}{i=t5|MA*{lKOxU1eHSNP2r4_@}fGEAF1=6WVjS7E^ zzaWVN{+O8sP_mA~9rWz8%&$Cg1>`9PZ$IZJ4fsH$YVYxSK~$L`IEGc^s<SfX0$%t! zcs3WRIY@Rg#tVYh4KE(${@^?}mFE2sZ^}vV!w_>EenQPO2Re&4IwFT+?CDsorT>gN z5-EHPuU%yDNa;sIuU9S)gjdBlDy!&+$(6xxc^XMV6C=~|zC1>XInKnv*<Poi02<Y2 zF8X3z;s-Fy@1@ZO;*o%zo8_EuFoeR*Phk~#ozOIMfNRSvGSN^Vt7;-$c`<VyEtbXa zIL$LjTGql3%Lg;|(4`Kp&O(dy7sX@4rQ%&P2Lc9QJ0OoNm5xAtE!msqNZB{D((>d! zEw_d{JY0=+@&cAtH*qs^E!|DpzP=avO<KUg-=L63wIVOGO>eR9sv9JpD(B9EyFyKi z;YjODawczR(`j-KbePV`^gu8roPtLnJuU0~kTYyp_6xU^7T|pD6u_RaOe1kh?8D%0 z#dD^W!U-5}gR?9Z!mT7|pb3$)W};KOY;=cg?dMyvX)~VJ1dTfoAYl?P-05=_xM9uj zV7vpS;+22NZE*AF<ffT3;YK%Gf_E`}KC!G;VyDCSHpb0AuNqtFr2+E$a1;oUJB6Kv zQGY?S0JENQ%lOk8S*e&P*0~)I;C+vjiS}?cc*u9LPn)oRuquZYQuq|ItHF((1)Htp z*owu37V}iz1PM;Y7oNXQv)Lh06|h4wYONeaBUOoUc+6ncNDl;|kzDTfVZ2R!YBWCO z!~EM6_UE~iS#r88IdfyMmoMrwWJBvPmiMMEjwPx>X-(-R#dZ$PSayKzP&0W6i_&WC zzqgv!YyPJL?qaSO%$7|<Oa*Ppnqe<md|KG(GUpnj(#wZ3`u$ufINSL~iEXFvK$@LC z1hz_AvVxQ-h&slWICeY;HHLB@wE6jd)kf7?C-a=jG}9HglJO8#Lr(kP*XpvI0C@?| zsS7qKut3dh+~SD_VIMR*p@)Qx@rxX^{fmZzXD3V^1MYQL+Ae+uH`#tJ5o(|#r$z`u ze%2d)cUzh#vy_$!jo3b$`Vw4*geG$?HZ$#umJ%3gDJoz~DTQBROL=Z=OUWZ?dlRH{ z9+g=SF+QUuc{i6Yqy|^5AV;*guWc^T@vu2wZh*uNNXiB_NX19N-T`M;fOo!M+~e7( z3Y~s9I`ud{x|_Bbw~=8hqPSCrA+;~8pS>RJKuvI1X0t9Auym@!IN40Oc+hd{xZRM` z#GIwYO^D09wKOZVtqhdueD;BoIf|wUwR|RUO68FE5&pbWGgL!<pKX{w#Z@pfKwyjT z@vDsWwuF<k*z9<RxJ~2^f{@Fz@!laxXo2TEVy|jTg<Z@k{no}pDv`c)U!ehC8_wJ< z+4lI&lV|hOVbctlr-tub=lLP5dLe6`${go43C_uxpgKdthVy=fS*MX<e=YSf$vr@- z|AjCwU`5oF9T1zz9b_mGk~Hr_PPi?^U3w2%u}Ycnp!3gwLoUjh-c^v?Ocp@J&ozgt zjVq9$SBpAA@FDh|qTKUDKbo=^oAn?GvfAw7#zdH-83Nc`@A(Z@5O*hyskCJ8qqA%C zPmYwo-V%NnwM)FDH=LLrE~M&+579XJHRy#vv+aZi<~?f_0uIs&vuOjYT}5LQb$$Su zfj@s^$Pmh)qQs0qa$yudNTdtiz`l?Qtt4zf5UPLkX=*Zp1j7_Rf2?AIEVKrhMR3op z&{s<H5Yh4_s&$BO{tGlQ>OQ)2jz}2=2C#(*`VU88d>P0`p`jiO0p>9^2ajI_BQq-V zITopHU77p&TO>i!D^gSkd3#FtBTMR*(EJSg)`Z^6^(1aLa)OU4rKWd0MOJLS31VD7 zaeED~0OH%k7UDF{00RT7H^)n^9&$3sOHx8y6aQyzds}h%@2(ok7PN^SwamkSKpO^B zaevS*%T_RYp^pDF!ho<}uqyJc*J?%yPz8L20BK*}bo7@XF5Uw_B15Kl80wPpsyf-g zpsh9>@~-OI==IzR453CWu-NypnT?C|5gq?W7yzf`z#EZEo(J2GGd%sx&$PZwJ9qNM zhIVl$Swo`<EeiW5Y3*+H&`?IbrJ^hSVaiY6QZNWsTdtbs%P>&pkY!81IG?~D6~RK! zGL$JNpV7oKuo^o-Df5I*bWCu6AtJTZM1c%X+R7fzbOhLQz%h7lRt2D701u||1=s~| z`uG7^P-N~_dIS+hr2pt8@E2GdOd*J=C3_G!lCCHy*#yzGaM}TtHa>Wgc?|j>$q6-P zZTA@%l6Jv%S{bxe(QT^RUi_|IY=8}_cP&LmnisaG!9bdcV*R^wNN-n}yCJ5P4P&Ee z1$_DtqLAJqYn4RyYkYGEUIQP#k)Viu$^?U=T6urALI&U=u!9xrcMQJ04M=~&#HAmD zV(@+f<WiSH<Kr)R;Z5;ErS@j?h1bm~H6sm)SMSof?>ISq%_du5Q$F06<$Xae_1QWc zo!R!9yq_bKXXeq`0Zu$mGE`SZg4<>|0u$UkbH*kHmF|h%&?&Mde8mHF0aOMvw9=^> z`F&O?ZREKjHPsD|2F<H!qMfuDdXtc&Z3D+%zS{)|eFVI!$0Bs7j(=Ot^VP<;mpG%E zCDtWbYslen#vX0?7TBSPmZxhWwpzF}?KAv557An@7h8SY1g9gp0o+HS&p?yl%ntKq zE);=%op7T@^21_AFt#6G>&`DQ1hi6kbKEPI<jm4+TQeV+hP0hb*FM&!y=zHR6KwpJ zkB~NSX=IPzaC1EUTr!lwEe<?2W;|^9&BSS^&wj{ii?TKQcbP3i``aZlOii7v`ff7$ zXnsUy2uEawHpm+oD>Dr6{^;H!GkC`<{9#}I{UM#trU8ds2ur(Hr?U;<<fZgdM6<*Z z4`ylvM#~2gp@~6_!Vk`uj;IYs09$Uh&k$hGz#T}aIhEJBPz;hH{NXT^jx?2M(7%uw zjD=|4d|)rvv#GBe68yrNze2ae$7f+>gsvXsN|oyoP^HiWN$l@|9VEP5o1bqfmiTf% zmuQ3X3@!bX{7@#oJLEz-DFW)|<9)n;2&=W}zp=nYu#|pOOn)Q4I(VpH!pV$yGY7l$ zBG(GPXJQn~Zqt+?`2%D9hzx6~kq%p9d7e)&z#mm^CeQeLDkZ<o6Xyo6ewKB>wTIqD ze1Tc()w|xY1On{$U{j3&4`5w*Nur#dnVe~h+|KmOPf4TC+Mu@=rk$qNl24FAlNZ56 ztGlD{a@^!MA%-+m;MvdRPrNc!{KKy@f;3t&?iI+*xyGkRZTOkDV4j3XVG`mwf&GM9 zIWlxA0PXECAe&p|e3twXG57#SXAYa*AytjxoGxA>7qJ@|ZBR3M0^!{eJi*R~0<Hxs zBY0pBY*NP;!pV4Yx=G?+cY&ePnj1KBrm9IQ9@cOFG;ry~u_a2@4@*7V304HSSD%${ z;DzT@Yjc=YC2=bCe}kT5Dffi>;v)@6k8TR{*p(PCLXm3jj6gffqIC!txe=vc^mNR2 zkQgV)?gs0Z${RUPtxWnWhum&cTSc1f)MPFF;VUHK1GU_5&5fsxlHnwK%VhEjy$>7x z95?a#9EAYgM`PmyzLi$CbeL<ig<TPO<xs5LMOeXAa?uc772QoffsO}gi{D<8KYRLk zF2>ES)!rF!G1Kuy^<$F}#JjeD#WL5dF;e2&jLK)J36*O-OWVuc`OmkDFR1tYid9W` z9-_cb?X-vt7?k1;YEZ}tWP(`r?ATZhbR0NABKY?3Ph#N=OSHI8bwD@D?TYJ|zX1xF zxf-8R&#xVl@;m$qGw<Q=*7Ao$?P#gjmge2)oh^y$?KRQsnJw`7Pxcn_3*ZO*r2wPo z2+m$kX8HL-?ICc8vY_&VvK5Kx=BuIkEZWb00w2?~4i`IuX?7+d!bpS%|A(C4PuX!n z{$-8zGpcPL-A(IDnT{qu`zfuEd6mQlTnTnk<mcbh%ITaMc+=x;pfP`jL9Cwm0V7zP z*QKi_4eET{0OBD7HjMsGsP^&00l4J0W&2I1hzu=Z-j_t~4e(j<Zl)N@v=STq1Z2<7 z9*^A*KZMJoj;D=L+Va499{!^0f<npwJQ<9}!jp)4f{xF^2CSB5%B}!&KqH+5-w3DK z=>{GB#6lUOAA^G2&;vyf#9nn|1eJ*+_W>&Vfs2!>c&k-W_^#OS3jX=2pLK4__d$d? z8_7*5^LSsS$sL_(T4y&IFUILLIW1JNPAv8P_!Q!B(_8SM;<ATE#W;8EARLvwQ31DI zv+REYHPw)#-+bR@z8T80Q%Ks=z}?E0kYR7}3}}^^E!u4b(Cpy?<K!0713fU+W0s^Z zNwBuN;CXeo5bO`nT0<Qfv<Nj6OW`uI%}M&Goo({L)4uY|n=kc&vKb#!l`K_VN5gCK z{V?4}<Q&k|qpvb4@h+NPsO8Gs1N0a+uu(8U_CaW9=o4lAr^Z#vxfhssDQYlJ>rFSX zW?RyWeSS&ss~a0B!oHWOFqGLbgPRgQGJ`y`7|0H+oXA($g-~zhW%qB!{eEqSthJ!> zbiNk_qZ@t2cSDm4a((tf{sH=S8L5+mCJ+0vTIAP(#zP*mN4w98pI`?bwCH>W35)CJ z^hHP6A$L$p+1Wm6j#c4%l;X92LB*q@CR%mej-4)Pc!N4V6m=X1UEW^BWTCGFcv;Hn z5293(xR2Jsyd*$e@>y7AGUzlpoZ#Xm(mhfdt7|XU#yyw07SpTF$8s!`Uv)I$4ss@) zuT)ps3ADv`=gTNtyh&EH6c)gW_$o=8>6pBgeT(`%R>{7CbJd0phdxlvhmxG*5BdGp zH47l{{6DK#aE0WhVKuQRWNUy<fqait6_LyWJ~7@Tz`0wY|IxLFfvI|A$X4yj4#TjV z;ZmJEXg6HKBCrI)a7KmC!>i8f_|jV|uBU4&Ai^|<h4pko50^X>8q<GkxyhUCAS;1T zl>?y}()WD*u`VH9-QCR@T2z32$$|VTfY0;fe7Gp3ErwMNqNDyYQbNt1#Pyo*dAXk{ zfkmIuG?{K#twi5Gss{c_;g*qlz4>{NU9m}cd=W8xw<7Hdz1sPVPOsX6B*ktiovRtw zTq;sc&HNa>YFfnk@br@sSUw`Mz|SS;OfstZ8P1?!izPO#pU=<71296iZWQ1nm*MGn z_^qarhk<0l%C$6hlxj(g(Wq;+*XCL=*xOi7Vg&2QeGJ<RASOb#o-BhOBS#j%QBAtY zl*#z>5n?-_I|x^})&NTX#?NSdH4OQ6AoA_8K*VqgAhdrsoS`oeU9NasW->MvyMHrx zyIZhkY>6t4SW;Y@OJb+LhxkvlYSN{22duTMSq|^mss4BWe>SB`0x|b<LVv;ux9MOS zH1!+SJ~c*<=y;ztydTyj_3wgp$V@0>r{~|N?Y1vz5<3HYa4%aK=9Vdhq4~Ox(8vU> z+AI<+w>kz~5JVMHIe%Uy8_^|8j2G8vc9#w{*+vL`2zR#Wa@Z-l5Z1g71<#XEi1|-- z45c<uG#q+UtH~pmnCb6Y7OBO5(P9Y7R^PzqMTd}&((fQ<_!O#TWan4h0$~rl=p$hR zu+u2sdL1Mpx*o2-1lf1d@;U0xJdGgrdL7Z3-gBSD|9USw7ym#c{2h$b^ndWLx=08# zSjhty6nGCIl>-p|tb`ei=z&-0*QPbEF^Tlr<f}DMn_o*(GWXKc52~ohR~)ir{|)K_ z_O}D@ny*4m0L$@+Sa?>yIvsQ&dC#n+;%Q}@=-V9jngK?Mf;%JjVhlQjrW%8?%(jL3 zt&0@6&@Q~m>8cCbr_uaNM437X#P2bct_y{f7x0P*kXS?JZf4V`fo%d5ldu`7K-Cx| zsdxG4VMy*Iu2%75d@aPQk*lO@>!}LNnS4xI<EaQ9S^zCBB(k(`xG3n-DW>5No&K(_ zOqXeO4dl^qc$`aT>WiV=&o>g8T>!bFyyOi_AT1COpHLq??ponOw~2X;_|gzE&PAPz z=3LZ!clrxp+QXyz!|wrv2swx%8`y~WV;q2Q)v^c9L1H%8G@^S>{Ubap4y@24Rx}{S zPF7SNy$2X(DM586QriIbjdZA}$fHnA&X9SKqi%AN5zlFqaE-^O>E}B5V<TUBTOF$$ z;R{O8MRuKlA35%}+<uaAJVx``S{TyI4Uo4DDT%iqL0hI|=q4rGAfH~e>&{*QYLg8l z<q#Em0^(!3^E%42i~x%5AIVA2(Fc9OwR0bKNe8oOIhEba^RP+VKA=>`m!5@pv>8{h z1%I3JhBi4{y<vz1ReEBZw@2Xjd3Qmit)T`A$I;cPc0~30@}HN{_nW60Cz4}@5aYBa z_lcf0o<ot_DSAFfNsgHgx~Q~F;U>Y(Emxt5m=g?YLgWl>M4jem_03t^9_(&a*a7}j zJWPAI>TYe4GjSeG=qAVf=|}<@vQuU(v~HFI%w{Ne^Gn^VMf=Z)-yw%iF-xiRgwyaQ zqPC4LJX#0oZ48nC9p<Nv*o5S1E#0z+Xay*S)KlY-aUG3S)F(|Y_-P@Kzc7!qM9o*` zy13H<J_iw=)c^~bUj48bb)GeZ$oi_Y@-5_2WQbYdBt92$goW|pRoJ&C`ifg0P0xiN zqcKJNpz^u^_!=r37y0mu7X#dvPe(EoY=*#AVEV5%Gay4@=()N;nT^pw*Do@M#l~T4 z6)e;J*w==H2IdhRK9PsXGwakk$=-|fvJ|Ro*-Q%g6U6YD+S-|xiqqsJzLSHtBn$+c z@6ChknVjv<WU+4L?4;>O!byTSk^O$(y;+632s*ZVIOxR})sKy<74KS7wub0F1YPVx zItW8PgQu+`f4NY`zPX$f`HCON_Ax#NjS*26Wov}=uGRIX2S*C3s8`X5`!^~#4U4J{ z=e&QXhPlwI2oWjeC-6IJgZS7WtiKQ1>Rjwv!4UXR{a~0qPC^sxReaf@2s3ndOk{ht zN9nk2r`FR&TB>>gWfvEd1Y!gI&PiAw#B)XvJHTN#6U>K)EWt67A^DC}LUz(3*|vrw zx^_GdidSd`%4)U0R5M&MnRFHo2gpen<lE$0*=VP$O#=B`cJ#v#be!P~9W=KA{uC5s z;}2lYK0Z$QlI+KyLJDccQ_yZ(4eU9ZhjotJvl;I@LZB#k#Ns0gdlawDgv+W6JTyR9 zAFRhZYQ)B}2IYqw=(F*(6B@&&8T75?;P${Rm<cf;ncIylDpHk%HA*`y0Z!tv#9h9^ zy84qi9cJrn*0w{}^wv8ZobD68KT}4@?y{@=u;g+Wpo-^LmMC;eh^b)vM#z;xnvl#q z-kp~MS@Siy&(((snGaM`DL>U9c<#<0UUgAQa@HT|*p*c%>$+W7*X<npkR`S0ZlAjh zK4};GsrBj-=Qs@IzS?CfA5?AAp@acn*mNtHD)`%K#KW+`$E{YG?=kJqY1~AejzcHq zZ-JD(OO$HetPX^E$v`(*TPonIX@=rX(i)7tL=I2+HN6rpfpQJ*V!PA>!9_|+330DN z^%7RgjZ$snaFUamNSH5L%FIYhc@zj@W;b&hTgtOzTS}KW(K9bT9WVKLcv9WOCJwl| z{qJbo+r^jR>zm6)fk8#q56^^Pfe87BAhrRP<E3r~<&0`ymU#!1Bl}sIJA{w!2hRGQ z(fCl#3^JWY_z>^M`t>P|He4=X1tYTFHYgSt9i2Wl02ha&_CcTSCMvrbQTxaZRSjnD zQvYcS0l&|C9$d6ctvqQ9t%C#~ES0Bd#^F>?lmLFm-S_}rI$1dt71^gbArR^b#du+r z)0;0;X3_Ehc~&=B(a3d24ePh|B($<$zOQ^azBV)UDOxh1ZcAuHZuBGMMhyM0l(=JX z`$QDquE0D7!ZWp;kV>Ocz@VwSiE7H1fZhGCgL$lWC*F2eOAoN9A2-7SP)>xQMk|i% zB|)rGXzK;c%}_ym-@iE{H8H?7lly)RQwcm)tn2JY2K7E2w|7)$x6wGXc~HhkB;U;* zZU)_QG6cx$dIdS~8Pt`rTq!DwOZ}1ZXOR1iUvQz<B-gdLkUvV-d2JdSByaG3zGFMo zMaU5Js7o(uwb_M`PK6QkseBYaP=ij0E`CX>ok;Q#B-9>Pjjwp#qpS95))w-u8nV75 z!iKy*)iu7UoiH55my-U|_7Tr%lo0vgPybMr9mFE_6Dj4Ac{W`|^@=nr#C1Ql|Kzhn ze}kokO!qgh)RVabwZg%^6?F9<6wE=q35}sG*a?)JbGo^(H6Vt^3s5UClQ8tKUt-HO zvxPP`4BMV#ii7vW4<czwEDolJd{HNfuE)kfdYM*QMV(NukRju}1Urka#zup+mVDqV zUZxmwnb{sb%wbb8AO$dMk!YHUd~MUg!W?jjk{RPBoSG-_GcxFhws7K1)%_sVl-n~d zX2#Wkz`>?S-#1`0dra>m<O%~An-}_MNU-s5{ffxvJ*lhS^#{}Y*#bR!ayQLNfZ%ju z%R0Y@y-%8y3$`swVpMRZ-3g1b&gX#1#udq-Ga_?=mUGBzKp4=ig8<XfiUr6TAv#U` zCKvM@ZEf}&vJ<-V2hXq3qC?;kurw~#NX*#uLnZZBU03`5UsL<|u2;9Sj+8VpEnv>x zf^3zW%e+J)iP%QBtw>KDx!Sk^HD`ma_~p1sbpTJzZFtz0;$bUgzTcO~qdLC)sI@5T z(x`<P&Hur{^_{_79=Vkw-6J_c_^~n`8}1Z5Wifcj6t8-t+>8C`Ftxp`?x>IO**3($ zydO)u9>l|zG@7MU#R>sIO+6av-B_n|A$<e*!0gtcM==VQdhJycwCDgihJ<?5a~etH z@#yM~G?i<*x=J@(sb{&JwT<ekNnJ!*qZ&o5jLd%IN>Ek^+xUD8ui6htq|ac{ojvhI z>K#yB&2Cth0+aUA6NUKhM$IQ4WSdF#9#pYfPdG}#B!Z>%XxD@u!vwS0_4uknq20x} z^&%JK&kA)_>_F4&8rLd(k=Lo*ZD{p2)-pfT<Ho{4X$4i&6wDhd`dQWi*Dk1Gv$VfX zCQp9EW^2*a@PRL9Kq5b*XSdRh6vz3<?bJFZ53s98)m04EwEDRIFp3K31Co`f%U6@b zY7>^K1P`8lr?GtTN&64x7aoFYI^N^wW;r*V79X_S(oKF#5h);^3;Odv0jG<bv08&* z5HqJq`)Ier@Lt64AW_=<9?twQy+cBxzYfjdddv%s>h1hTBY47bhPaCL%19J`0Dc62 za*=X@8(vLqof71Pmn_j9sPL|)_h@+gksL?Nr@#iPOXGSF?@lE0SA~;pde|-omQ2;H zcw|5a|Hy>$q4>Mx-P~1<ut_(jbd9ba?uKn6(2o0l3fc%`&8IMF42X4MmX!dLs#lpA zoE@A(!D6p0=dJa$P1&0Olb*gpBJM^9b_vSht7(EiabqpFoovEJe_GG)RJedl^W~bd zv(7maryviSLZyhj;?0ehM2BB`DO{^tIb1)9-OLBnQs2@y8V<Ya<osmv6GgIa!57t! zO`#_2<B{*GWDR!Rtq9kR257`|S8H%Uz6-(VMDnesXl$Ju@bN0euShELMLX0|gP-_y zA@p+m7@tEV()ypAWH1&1H|v1zGPiqiD5?i!@2VwWa}3!Evgp!~I?r_6_!R6=)0vfS z1@qT>bkKgj)VJ}x)k!|Rsnlg_CN;K94MPp(0q_inr}Xg92?*%nA>%>1gh-6@D)qtf zS6<HVXFh>NAt`YL)AY9>!e}O&k8<f{;CNLtE(V8+>4j3V3tn-XLc?nGE>enjQG8mH z8uftE<s8KGN@e+%f|G;B2=)f@iW-xNYEuFo<PU_&O4XRH@rs-#suNJB=BH9Ur$0wC za)K=M@oCWS=IeM%<|i2nroN8BWl^UxC{zWzpeV%r2vAVqqZRU|wh;@@R&*y2pBZQl zR!bB~+V#8_;sbm*Q}G^LK=cDAc{ie;TFUr|0=+ysQ!uJfkA}LSOwWK<dA&|2rAFyH zRqe)w-zf|CELBICb3LnvIx^oQiT3a!ew~DQ`$$c0%f9b?dfJSebR0gRo1CDMM;jI6 z<Ofw|H&te7@^YRnn}@j;twK&3?=%PaG!Ap&P5=9I;fD?$?5~<UP=78yw(Sce-jv<Z zvtW^&Mg23#b9(_{-*zZhQ(^_zx99@`i&+R(Pde%*L<<Z#ZS=sISO1o5x9|b!Aey~+ zfF4utIS#`TS)!J@jGOr#ZuS-Gzos+sg)KkruLS*O?}6;9#QwFlr=8R$(Vdezjisd2 zcOy)##jwoxwI9M^ZNm_wN^vsH<M_pz%|hQlpoi7BmXaZIrUhL{=Kgpv6_PEwOO2&5 zBT^dCpuSuicU|UMQPU%?u>b0#Nsbu;9p3xNIgiNiGf6v8w&1(CZ5635ew)>7Awoq$ zck~X(QkKxtc9-NkG<fK4NWz@oFTAR{q@bD1T=>uG6~!)Y;!J4n)k^$)*l(!jyuD(I z%ez%*@-wkDUkx^$p9bMb8Ul-eo@|;5<N<nnP{)^wZt^92n224YmH)HxrfVGQenUn^ z#+nqErRBFFzhX6fo@=|wIy%t-=Wr4RQNLUK1d^1kDP+bwRkF~}f4>agt%4tR&>Kh9 zK&FY}FvF1E{3?-MIncyM#E|{Cr|k;8dPz?QAK0gHj#9Q{KFldl?uPjR^BBEqZX~Kz zDU1DN+la`*{F<&445OOgxPblyHo?2Hx4Rn$BO+vreD3G_q=Y<yd4>VQNic|HdjXsr zp<1h`P+zZWwb$lauVLRxRGx`o{hRxlR2RG!AzN>{nL6aiepur(NaE|Y`17Dxa!HQl z`>vQzk)YozKAa-bfyj}uKxEu7K=z6Orh;i>v1BrDP}BL&z5{PfaLN89h0Y`Tut^^+ z4rb8&n|l%eg_e*ir6a%>u*vPDr&RyD<b5WMRQjy7I4h8;48&JOSJ}%cb81;GY0~WR zy3_D6y^Rml&Vtu?QQU49PZI~lljsqR9L9LMRp<%jUxLS}r=9$PHJQCfb+q_wr0tCh z!sAz=MKwwvyg_*jQ&^*%?8dKhvZzS#>>mn&BVJ4#EQe^+_<N-M0sljB1w2Z`%*u{w zRK!85k=wEXl12;*BbHDj)iWRijCy%eW?VkJq`g+}Dwn_OmnV4JV6U80aC(d$k^V8i z>Taq_>PL|cw{w{C<I_Ke;FK?E5-(}CnI6ae_+V1e3f;PoFp>xsH(G*I6^TDocF0j> zj|KL9NP?|GdNO$S>rgXs7-sgtUvxPvdM{}q1)U_ORn#=oe_%7c5_HNT@8Mj{LLZl_ zShsw{eIM@mJ=CFW#s3|j7le?;Ed((GGeCCJ@-gA`@&U34TN`S7TSn4;)q1i^+oKTn zH5m9G(*Jy9YNiv>85$}~OT@w$buO+g5=Nf|j344Z_@OQm^1Oz*zhVss^hEJ~g^9n^ zAEjO$w)lN=r?B<fQ46wG^L6_;$K+Ce^|w)xC(CWDp@+Ppl`g#=@(b%v>ZI!-zw04C z#QE1le%C{O|GJQ$QJ>%|!l-L-N(V&Sp$iA1*l*$7jt+s2@VTri(rBMy%rq^0TM-jg zelm8JO(;JkM{?vij>v~`xOsw=S=tWk6;ch`(UCfW?C%0ZqQ|Q`Xb{c<h6hl}zZ|2~ z)t{{m1U-2S`t)IfZ~yr~AO?NH#22hI?ux6-JWZuQE${W3&-GWqan0mOlt;)_0)5;O zHBb7`!HB=*EpmnoJ$6KUZu807RdL7f(iX3yE#aY;W2bP%@p?+HN>AxkcsPk)tGj&% z+<bq~egNgHt8&a0gRo3}@HVi`gpvm67sw1cp$6uAynpuD2jO>W%p{1a7S=us#WjF* zoc|2W)qJ$)ti^}6Cp!}vD~<{lt??jR9AiF3(hNJpEDqi&+~Bv~f-CbHunb6D^fWXp zTdExWqI^4oB&NW!ny!3UYYAIxMC+B@I2#qojW>V+F|%yNn-q;h8dq}Tv6B6X%(sM& z24uVBf1uNGi;^K_{ef`>W6$wln;<6_{enJZPMRab0871)>nH7ase=$d74B<KIR^J4 z`&nG13N3tZc#kwX*nNk<ZDAsO$g3hW*o7|gm*xa|pwDkYbV~kP9~#`?A=C94Rm*^o z&iBc@&EH;Jd0?+7LY7(?g8lpySmAfiJde{z<Q@7HjMo+_N6-q#X{%~J)4w8@ZzfHy zRoWp*t5e`ySn2lPug?$~T6B{Yjoi_J8$UrG_e=NHdoRAWDfdnIX&m&-8%Az)47rh& z`IF=3Att8=#kb2aFC;J)6I`6h!v+T=FsO?`(^3kF1OGahmk9rbw>=S(wP+Mp^;ll~ zLzG_$eK*V8AzFku{ADdEKuVeQAJ019`izzuV8@>!Cq;5<r|vU8pz5jGn?0kc+7g(n z$Bj~<nZ<##0Iyq4I5GJnw6FR5FOfZNN2;4$oz<#FGR`?wa{U!9M1D^*uEmAa8+4sF z4f1gffmb!hy2zdg8RDmrh3jA?=Yj(Cn<M7a=;T>GB<O@FOvbwDP+22hnVQyvc*~(E z!2QX`o$rsZp~~Z^@g?Pk8SRMK%^kqi2%`f}Iw3Nt{Dpt0%Bpabf3hlHNqPge6MaDX zl$N^xH!B``dqxj=$7P!K>g5D1KSA+5WInKsDQJzCF=0=J4;5kDo8A$^NH<xk#nQum z@cB)(y?JB>bu5Ez9NGJjmUdRynf-cH)`|gW-l=tDtFt0$SCj|}(g?<$!!SfSb$q>U zx$A0dH8_17X3E=Xg3~llG13?mymOEOB*BPdBYthN97mq?S?6|)o5Vnu-)Jgi`lirl zqG0`I0`UpBw_=MA{4VIk0y_=Hf!%US{D*m=ovPn$ysL?;N>^I9_Z-v;<U|)nPng#k zv5`O2AWq@z1Br7i2~H?+p1lbm+;)urJ{P(OO>Wo6bY=i2$1yNr)tvB<g4V%o&6FO* z0<>f#km~J}a2#W8Kur+mNp~GYf>W)5<R_F#1hH;R`k}rI4%)7(egChieb=`@T;Bqr zT;Bq5eGA0D{}zbxI`-}W?slj{zZl+NRNMWOy&dMT;H{!<vG7d|S1aU#E{XmIP(7rp zWN#ZU%jO}QSoqR;OB_TE@uQQQVwqNMn<?Q?y7d^*htjJ@htkPXv;h&H<-q%>?e#!+ zP|thCAg4NlRK(5b=!f{dI{MiS0&*}$#vxRUw2Y)uM?+nFiJk%XDoXe>9_Cm!c!P5m zY?xA&@dLPe`;gdtUsa1Sg<gCAkfEGdGGSDVvwRy&yMX?hx3qin)82wj1YNt9!?<d| z+vW<`TZaGF=fa86XggpVr~J$=<OaVm;^(vW{afFT=U|4w-s)jw%!I?eyyK*Q|DTu> z{>174Bw{j&!JE4^z^maB{{A&T{DY%ZG-t<~y}9~S=zo*fhnQ?C-b&mOdU1Vn{&tvg zO=sc@TmI%Q4*llJ6`XhLfsWn7pFvs`c_}A6$IYf?eNImL61@Cu<{1Anyr)JHx}^%b zT*gEw;mF4;Fsx3Nx;fQQ5kMExx=DaM7j9TWLwOq{jx5MQgL>49G>%3ndSF9C#1)=# z^@0||P(pU7vfhxcglwMqmYq18Xp~%k@U%+a9_KbuT;-W3&F*7F`ZwYZW>~U}S;phg zQaQEiR2&1(BGoYc(?f}UQt=Z4nYte1@J5Q;!(4H)-63Um`-fE_*Z0+6Q+fkKBWZ|{ zWRnT4mCZ~}1YcUv<TEEKrjg0|UH@#n>8s0KcsU^@C8fXtzlI%akzYl2O01L&g?vqb zNyi{qAL*9u{m^3B;V_s!ve9zcw$aUh<Yj(oC!ddw{0e(fC9%)IGwLWqc2yA>`JHE& zSGo2Iy;`KxtFq<bTH|)~pMl@F;*aB`Qu~;p)Fyo<rKybCWl<jzME)N27IWUO2Vrou z9v;*5Cvcemh-PMFOapU-Y_Wr?c|C3H@|&6kNbo~#$dKwHqf~1<_=onOQGac&mD!1L zi)PC+I@ag)4HFXiAVRjfWK$$zPLkCGYVY(BKcj{|sYC~1toalP`Yl$`u));x(Ln?K zA}#x$8W8R_#pJODqp@U~K7>5`x&!xjAKg#Yzq!IM;~0kd0PMs-;*J~i)VX$+^IFn1 zvn$aN<TBj)-(`D+HgSdO^x>?)`S?mJ4#j$QLDa)ZPH{Dq3cAzqiN5K;cZzg+L$NN8 zeORm@coLORy=xxD!4Y24b|}mnL<w@Oj;8iFpT0BfZNRB!@l}m!q+@o5MZqk6@J7&+ z!!M6=vd6y4$!2{$CmZo%8b~`X{^;T|=v|6>Vy?^li4&EP^eqs2@N)d}0*r1Y*n}$C zCbamjO8<Y}%`YOIxW2)1^dLQ28DvW7bH!uzh)Mn4+g}Gh3vTlv8xG?32)B1qKd(J? zwI-3b2+~YS#U`l3VNWM6=QDMVCW6!7=dw>)s2N9%E4-eQkk|_?q}z|9f|+Id!m(R4 zVv?B;bUExs99m_I!{U>{bOICpj&%J>(CMN9=V~kq)Kn)eD(Wk)Ca<3*LnvDr2T3H8 zvdJmxu`Gq%1!KeM_bTX8<>=a;b7Z#HrzgAk0V*bTGL=WU>8+8enJ^a_R<#E3zgN~1 zTw5f(F-UOO7#F|jBBA6p^NIp5g4#|)_IhfyR?0VA9k$?~%@42YzIN1tOD0((`zDN& zj^Nlm+wOMcNZewQw(x)dNbmKK-)Lz0ddTm3$nSc{@83D(Hy)Gq&@17pfTu!G?O`PB z2Kk3E+^IvLL9;U&>@Zu!<lU7lJ#&PHZULL#SvsMMO{BQ$fWvV_BQ@m0QKzXj$e*XI zkBJy724qouBznBq&R=_r>kdDQ0IUfX=?T8F^la@(Tn2JWTM=xzvO30;M=Y8TDb{WF z177|Wn6GT5BjoB0rZF(<xAA=eA-37ZS#YXVy6-rgk(2zsb6Z|{l8G+lr&i54ck;Mv zXJmV;S>N8eTuG(24peFROS0{NR(c8jqp{*Rxld(oBPVJgO@L4QyzDnv;s5yHw@T%6 zD*mrq;mKN<<tv}m0y}*SqA}woNb-4S$L(WP+-;I*MaGJwf-fX1$QH+#Pmz^HKc)H0 ziIc`0{6;ri370VKzz)rBu%+25ycM!NUY|}j6&ni3?N4LAvd9<uA~)_B$&Dla4B!m* zop_Trj?IlfO-mamcdx>wAH5oPln<||wxq;k7J9$-osjoy6Xa}IeMs(&19nYh^+&5h zoT|7M=2vRG=_IM&7d^xv`<Z~lN96(I^r~fabg=uFzt}m#hvG0%K3-oHbM;mb9+!it z6A+ymj_N~$zf-umxc`DTDE<!f0qS+D!M?KlJvi!ZfJ+*=<UP)}tLv>H@;zWb;!ndb zNDCcQ8In6ha4PCx66P<(VQDeJsNN7|VyQ(sSg+3z=2Yk_7YcEcN@QSH#DSmgFWpy& ztH;-#U)04PZ{Rb&H+Hk~232_9H~R~ir}?d7)74v*SHA;r%fArjH8XldwV5QsMzt;y z%M&((`5Za0fu`C(9}Zm%3pCbko!tM|^tI2xLe24w0P7DKR`=_v+Hd3I6y#@JPSy7F zk>z5oBoM8SQW-}lCVz>ePqs}8Hy{UE<>*Q5BM`|rzi*>^u5cmlZ{%8BC=ULpZ~JY7 zrI`4NgZ7gWHxMC1<_7lr=gB#jM6RrW7#$Mm#%+6OKB49^b^xc$mwshxS`Xs2!wXvR z@6=-Z2pcNXH@z;n6Jwo&?Q$`$KSNY|g%CwHK>UN<yx#=IXMWS$O&4@AF1;c#t6^c; zTkV_gvPx`^G=J`US5{FSwWueyUFtEV?z6^Y!rqYW{TNDla!k{s9t$CtA5@8|Ha#d~ zG8Cq^Lyybg`4vnIu6l{<ya7oQS@RM}H^3=XxBE~caJ7m3Ziey)F+G162h@+~J9&u@ z)~PWQ$?<(S4m$q~-Grm`pJS%11xdh&WApXNa(&&NR)FiQH>q`uq}J!TO!Dib`3OJR zDe}S_7!h2ef~v0>*TemvL#bg{4~t)ODVX`EpvrUVhKs!&mPd-GnMpClMQo~M?G)07 z%{G7Nxa&Tp`Au9Q{MC&p(>@_4?TdvdC+J0)od-<?8Wx~iM*^vp>;B1ID0|$D*M0Sv zG^1Wu`~J<<zUx~cu5W?3z6GM-`WA?P|1A)3efjHzfA8h5VtswdCHLo5Cp@c)a8dc? z#TjQD%UA5!A-EX9AN_=au<vt;srRn&XO&%u@~h9R)L<(nlSZOPMuzs==1lra>l$|` zi4)p0i}b0`qa5zj;2^dJx4@wncYxmIVocX^Ci1`d<qS7S#rRtX%GzC-J65FMJM$8} z>*d<+pr>WWM0Su}r8X+&#;76VIp%IS!tuDvUy|yZq2Fcrq#frW*;Y9Q5|-;Oq!X8& zcS)|u?<(klts@I^zF06(Ke8c*m*Bm~?*?Fms~5E7sPjba(ok&&)zXx=*nXT%oJ037 z%v?(=rEpIuv^ev(mU*&ZXL`f~*@XsiytrwI53I;F4mSu)3sQ}|e|9L5tfxC0{cP@e zeSH{%0YYgD^{k;O(u|p~YKi*QU{itL8u^_VqsgZEei-Kzp40IqZ$Oi;y_t^KHH`b8 zj5l3lxr>dyk)NOF3NUBL&Sd0Q`c8?=#Wcrd!?pFvps%CaPfKMUx2Xhb^ZH6)7frh; z+xnEK)7M(4SmEaL$nwa@@0o-%Wyx3Q)dHPfrL{vwhg>lo4XORsA?6u)WXw=%1o-bQ zfzm7M&2Q+oUTeKMT4fE;9wA%NGhkaGd02{UH*ZwIr`5Jf;`Ylqzk>&N!3mt@z82Ri z)HfVeuo0~9#SIf{DHkDIG5aIS%^6^$@$Z$c!<Dj8aHzj*EY}(h`Wd4E4I4v%c~Bj* QijBD#fd5>+ZCcg;1zxbMEdT%j diff --git a/client/resources/hardnested_tables/bitflip_0_18c_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_18c_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..88f05ef653b311820c96a49684ec4709828078dc GIT binary patch literal 1614 zcmZWpU2NOt6_sUKktt${tRH^`1ZS=#+L8!|956rwQaiR|CANsTkt~@RjF|lNuy%Wq zyBEP(I{iepNeK;NLmdYgiJjHTWDyJ5Ck;y%k|v$zVQ8|a4k$3mZGp7N1|bN7EKA*K zuiL%A#R2Za#X0xjO#bwppO6!mu=u6F{Ok?PJbfwC`qs|#g{;kF%9_lbdB$REI{t3@ zzuGpv^Tv-5lQp;b!~ccmjhOG}@7BKgmijFjuzmk|@cZb~sL8mtXYd32j+q=c&A`9` zp6v8VY|to@^xV@2?Uk|Xzx!MJc)suqE>4e6ZojT1mTmVLiKtpf1Y#AXqjrR4bb$t9 zf~jzj!~s#{cq$Qlp12V7DXV=2v)0wzCN>sF(7?hD@(Gf7X{u!`^YzzCn_n{3UIp@+ zOvNp7#KAz#7&hN{VfoPA?_MZUGgQ)J#V{X9Qedy?$_$=5TVohTm(jQPEiE3WT&k)c z;1n2}a*zM=)mu)5<zJ0@PZof_MFm>va043c(a@3o^ZT3EAH7(3I+uH4cMm_IYl@Ny zki_oVr&}00aT=#C+tuQc%b5FOsc~3ohh8CbkNxQz3~IUcUc@INY=T*Me75J=*|s>V zOY)StjLr*SPmJ3%jipckDkYa<&@`y}IYN;3!Cw7@E(4WO*M*P7AW4x>XOoB|(YObP z!%B4oic=P)icf-ZtMk~g?v9X+x{GDO*tzD--WDy=G8=NQ%XHx}_xk2%kKSMV_zLo? zZu6fHg6Zt9%`v(EA>}*m$kJi}4m`}Wyu=tEgj|GF`sbLf)f#v>mp!#z{1+ZvaoySe zNEbu)6P=HqVW|jCUd;KgIKYOOpn~UBj$ZhRWsPS04~~)@G1Q!*6C{w&q5jf|{r*p% zFWf$CEH1`NTKnE9yQ6ivw+P=lb~`NH8%3Ai(+{C85m%0HYV9Te+Q;<HlkWyTL#~zw z?uKuo!(hQ1-XhCOf4q9q|L^{tr}Vmdtu@0a%~pHh2RIsDjCjvITJ&CQt>DakmOeC^ zE8q$?)W)Y@qBBntb3Kzr_-?8nB<)szF8$yO=}R=lHJ676z`f(P482Sy$G%qIM^6)X z3y;J1dY{F?<|C`KIIn%!mA{++WKCWHw<e~J-0i^g9%hHHO_{FpM!GiC8+YANy8rQA zyJuY5oj&UEv$GA?e7!f;tR-E7cvd0^qiiuC8h6v1uB30K<SNJXs-KU=5uuDSBo!z# ze|0)MeJT%msTs_M8@K;!0+~e^m6rq&0dZ@{ynEz`A|uL%Qp=s!cbAEhZ6Dmo8$}qh z0*==d@=eCTa0kSLMBNMxnjxcIB`b;ot~kRHIEG?&6v(p%busVpm?h=F>7FjzdpLZ^ z%oZbEMX19mD>mdRM{J<q=>(O6-HJy7Y(B<P2?*hC!KJP<x(N1&2#L}pEs2<GzfTCF zQ@z=g-8oCvh<%Uu%wEf+#Tu1$4f6~Vayi-+e%m`Z>Z=!rO~gz%wlxTL=mhoVoi1i( z(RZj38Z8$*R^09(AZXM}=rLy>Ev(`oyp;@UoxAe#=upAg*{bExYFJ`{I1Sf&R>>hQ zsI_QxhD&SWvYvimNeg-t9x6>eZIn>5oGQ5YOQ02B1sY3Uz(Jf_98?)XH9C5DojehS zhs2i!;7y?^VDK?vehZH{O3vQ%t=YzWiC6g=%Op`hHAwH3`ur@Em<pp;-8qslFof#j z4Z9;NLvR7H`rx)EVD4N{mu(u^iM|QdJHZPT4%88ep4WeKLgiBcdH^1EX$Kfa7E37_ z2zzy;+Z?q;dsatMHeF*hJPFEl5~Zs+kfGiofrH)ZP$EwYG+nh00f=|-?=?Y;aXCix z7fC8e5#q%nM+R>_;hHxLDzOgBAvZ~)sZN}VSV)=IHW8Vagp~~HLnCfG=<ZfN2(kg* znaj*J1?xyVbgd~JI6YQJbE=`igCAeFWK5aUWSLYV;fB+j8P0kygYlPt+6ZXZR(}zG GNc;zZMt61q literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_18c_states.bin.z b/client/resources/hardnested_tables/bitflip_0_18c_states.bin.z deleted file mode 100644 index da5c55a2d40e81ca5d51a0ba03f03a797c85eb02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19919 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 diff --git a/client/resources/hardnested_tables/bitflip_0_191_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_191_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..7303065d9be963180254f5752241a133eafbb26c GIT binary patch literal 5983 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_191_states.bin.z b/client/resources/hardnested_tables/bitflip_0_191_states.bin.z deleted file mode 100644 index 5a4b9aef16402e9d9534fef516d339be18ea6840..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28438 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 Tyb73D$A{-6(3xYG62JOCXH!tq diff --git a/client/resources/hardnested_tables/bitflip_0_193_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_193_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b9e3297c51ff8e1efde396ec1359772b76461d13 GIT binary patch literal 2082 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_193_states.bin.z b/client/resources/hardnested_tables/bitflip_0_193_states.bin.z deleted file mode 100644 index 5f7e0b484a8631c8a76908d1ac9f2c032a2b862c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16026 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 BoId~n diff --git a/client/resources/hardnested_tables/bitflip_0_195_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_195_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..fa5060af8db68f386cced888df79c883b860b2bb GIT binary patch literal 2462 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_195_states.bin.z b/client/resources/hardnested_tables/bitflip_0_195_states.bin.z deleted file mode 100644 index e15df41f56ca859152c24264a2c024ddd534f3b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19686 zcmeHvdw5jkx$m&;-t2u^n_8=g2&1K%dcmos5g{at)=PFtb*!k7TNX87fCy8J7$C`f z^t4-4E+cY@+_Dsk5lI*zBqQXqY!N09k`Y2OB!R5LBpH&)WSm)9GqY~rd)_sPE$-vf zefD#n=lpZJ);}|3Shw%J{NCUDd)KOt;FV>|1JlYszM8sa^6yfANBf^hE!h+>-Td0& zUoUK3F%W;e`u?{)-~QJ8gPR^~{Mr5Q{Bb`311i|lLtBc9e+5)36kMvVR>!ow4zn3l zo(4#ilH%HIx7Y2nF*HqgIj+NVYNie$kt&=c2?kdOiSTADbi6o{49bA;<upD$JJfoZ zV>oBf!ZBJg(JfWrzXC@lK<w4}bU4X5{16jk;0=v0gZ!XHBFc$3y--jTuL-Xn;%M$g zqECU@h4b@xuOhemi9-mD=k4j8QCO!7`Fd6tzpvSx?f3X4cix?l>EutTHZ2$OjzCri z8)kf@H_T~gSdG<eL{&Xrds46wVt;{<2QG*14Z~|{&2)Q37&1lc{wRM%6Z8qYU~WD2 zYr^YfZz+FgkdO0mYpTfS43KD?@JceAp<(bGB=?Ju7bY`R^A&ramZ@_Jqd2K$m)<x5 zZi8EKZyX1yXJLH{<V5%(4lH1y`#=flL}I%j8Fq*H>oIaoAZICs?Oa9=1j0}UV=ABv z)~5~XjL1DCC&^~Y083w>Eah||2dsHaIi0IHw8|ck$q=XIpE1wKp6PRERI@o63}~4Z z5jGXlYxGGG+aomT;$HA}T0-O|)4RnqYYW)4(Vx+b&!PVSgwkk^=1HULVR*mkT{zxm zpAEm$&Y1rKB8)P<B|$5kftwaU-f~{ooeg}PPN{=?Wf4AyQ!wi8ELwI=O4{OuvoIF! zp*b{}CYgQ$KI4BMhHK;+IZYyE&}{`7Os2aZr&)SllE}TM2OQT)H!Z{^cF!kjh^bl* zrqAN+%fxp&iIM@;R?3)gTbxVhz6X8xQ2rux`5-Tnd$RBz7;Q3rF_&6(>n1G=O-69V zD2U+{QbKdvh(scI;vGJc=jNuB5(&Qyu^N-7agc;Z?0y?o!x-b(#<t*na{mG7|BcQ_ ze3x<DhO1BruT{et0b(>sFN2E9Bmgc&dmD!LstO1Wl4lb4W4cD#;M@<Ol3MVWw|H&3 zuvi^!I!)xnZk*tI;3Z*mnBd3Hv~_p|1AKgpJPyvV(9S4HrmCY(yYiSi`-J`31G=Tc zY%A6$Mm&?qVK_;W1es%KtZt%2KG83TWsW310~h5QpXFfBQ%DJCm==KN3_QUJQN<tj zk*!)e^Ji!b;-xmi)&{s!-d0VHX%Y)+ALNh{_nfnhKxlcB^IT6ZrOl$`akfmSyFwmx zaph7Q6v$3F%G>6~tQ}iO>JMS%RxOqePOdmcf>LuaT=Ls$w24DZ8*FsKxn<ysk@Z!O zJIH)lJhzJ+)+M%Z6>VoIPtAQ~xd?@Q<bWoFMieVJ+lW3U;TMys|1Rib@R3cG(02C* z#soeVUVta*)BxGMYelx=7j?}Si?0amo79w)>0zgp)={%*0d?I&yLIlFUShgrJX9v) znF4+|Pa=Lm+x@o&c)pUhJP(sMLSZDg!Vlf>C+gpW&*CQ2IoR7veyzewaGOar=RjZ% z@C&rQm(dwP?uBh}@<KWKrwyzW4e$D%mNw>jShE*a{aLZu+W0l|`Tk2Z;}ARredG<@ zbD5alg~mHzU=if|_^{bn>b7pSx|huK`Ikv7wPn*sV(_USE$!|P!KSx-7I6MXpCh5i zQvW%U>oSbeio1h`L|F4Nl;KmNu*1XJs1su?qdV?`eL>O}X9OBsrfY9&XP95mo&ZU6 zI*+|h{}L-X#Gh!Uq1n*??<(6tyCfS%TasQ1AKIsPgI4DoBA?Wy=<GDOl6#5M!|Ry3 z_gmmd>6OsR>2O{Vw&<M``Mg0`b=S^pczB=g1AiB3l{M%V`IAv=-U>+Zv1yS;s#WEH za~TW-#=t~qh{{A`!X)B&mswkW3396;3aia%uhub<(JC9!VheF?(bz+Z%>H2{++2cp z0&wdfd0F#J83{KSAiDQ;NTE-<;E)Gn^hRjNL#G-to8G+#_E9S?IIa`_-NXEC<@^^J zbjotgv4tHHGpKQTbf|{i@OCwf4Uit#0N;a0U>}%FBHA9VhHAk;l&dA9-BFCZ==ZPr z$y_H{UP+}(y2q`y2%$jCnYtG?tD*C7PD-k)h1XZ=g-kTb)D3YM>*g2BiwHH=^)F}R z1;3<a>m<i^MJUvmpOX8GNb%b`co0fb;Dt<G2<6rR6nDNx<MG?XX^OBa5jNMuN;7nh zA<v;<Wk8JKufZ}mII4(dgo6)0iu+;}UfBpriEV~MHcModZf@I9EG%u}tLDSpY$Ctg zq6SF%A&jf0ZV7_$NGJR#1c!D&Z9Ox~qvdr0skc)`XL9J3lNwX0?@Pp8jCzCv?+Jas zVOZo-I8YqS<A1J_C)L~zxU(afM4W%3-wB;GQl~e5ZyxXRYgeV>;@U3Z!@Eejrw$4` z*mMZ1LJEJ{16|zy80inCI|EWZI0VlgW_o%|<ve|Xj#M(Xlu1w5YO2x=!`iFo=`^>B z^qN=5{GAb@UG<=s@-8k`xI-V`yRg*Z{Ufxy`RC-44qhzfFNB$WI)5LS_rM}dHoK$i zB0@U;k1*z#Gw`Z>)3Z=H#a{HZeqIvcV8l{&mMqh*4n$oIe3#6J$1H0l*^Bt4O|b9? zT7ZuXY0mpVh$pSp9dAMFEWkB$$GJjn3=HqMb~6SwGC#mY_)%Xy{OWFY0CIqPI^r_S zWyU_rOQSOrSKdMt;V8u*mk3{zDSo#aCT=plYoWVxbz?DyH`%OvzJQ5&S~p$@8lxFw z$y;R6Mlu#Q!Vn9AY7&KkZ5LF3kw29Wita$o<xpmTpVvv-z2+<F@)mM))EApZ9He+2 zsg<Z}4P-JIeQ-fw0t!Y<PdO-DE7*v>M08z}7=%GSuesuv@Mi2c&Gz(7Q1r}rba=b7 ziB4#Twh$lYbiRXTbP59^gK>(}#Ivk{g$ngkZPCm?(#%dT@u!k5ds^?Cf@>uR+qto> zlv3`QPEUb)to#TcQ(siso#cTkz{Skz=DoDeUfNk$Y~LOsA!os$>P{z*%Z}pSH3N_$ zl}K&m9XQuS24iBWutawphCGGuRRj-Y`)aGEL%V2;aLom@5Q@&g0}|xzfRZSG(QYmP zzqqa+E@Cv7NN0D8>joG#7E&+3gT?TpX|O8`V?-CMs2BHelfg+FRp{obXlg{?vNOVt z^$~~&`?&n{$i>*4C^}&wcvR8_TObR#DR2@>Mt09`U|A@B74pu2e<Lg^;WY-V8mF~1 z2z0dR9iM0ayvd~F7GgaLzgnXGWgzOQr`P>SZ&jj0kk)SuaVOf~!SQ6yF*psEeLSK@ zV`oe<mnSk6<z)9sm`Hrg=Vb3SX20kZ+qe(FwDvBM-*-Cpq7Izr(Lu9m=oN4t<q<W( zIUgf$F^*uyBQ$8%W4h-h1dX}cXw~*#psaiYWxcLuoFi}A#ds`-U$fp;TMe^<yg)+7 z;pFNw7iFI>k3MYJQx`e=vH`uwE7}%dD}ntXw26jso8DbQ*&DD|rtIQROqKCZYtu#2 zPhRWhmmUID3V6GjG97pkgE!wCK-<ihNtmDDBm2S`I`rV9FzaK$u^t%J^Z1^tn2b%P z;!~t@0RGuHjj?@^L(97L(1bRa1p&jM*4~Bw$LFe?rjrnSK@_mjWjZ_)G!A88>wTbV zd|S|>W9m1V-h$aMd6wo;cucPu^T>k%h~^o0g_s-nM2NkHt}}(^=r%mx2oxipuq85u zZs9Q}wGh+w-!E2YD|AMml;N_{?xc$!03SLB=^SegY~rq<k6IJ(%j<@{ZWhtk0QnV7 z?Vzu4@MI(7j(ZUIzKvKqmW)0n$jdlZxxb0u5Gxr=?TwOW51b%P)wCoVtEP+|=gbgd zBhMPzY#5g18JIhpL~5h?oSBEY<@8jDnE{uWs7FrOZSEn_3-Dry0mca!dW_38!01@W z-voHWEwEcjy4#Xpcn|NyWYe0ZXT2f&E8st3%$uG8AF$?@`u<SZ*Osv>8jAG^7v)TG z-GGGFcTQwNuy7BI`d;FpV#)F~Ky?<LKSDhSsALf3%5b>S3-u495hg{+HQ7bY`e@US zIN0btGPQ<=KG8`z{0|JeZ$oPpC4Y*yoKm14#3n@T7|C-)h$0}n$+VW<Ujc(3(Bpqn zV*9+La9Jo;ki@UX`0Z1eI(u8q8*SzMO5Qn}tj9YWP`Kk@x*Jb=%L;vEH?uJjS>MHi zAPr{S$=D7;goqKxad4;cxUge&h-kAqDe0Cn1dJpG+G_g0KwJD*Xlq+JKj#FT+8pJN z>2(1C(<CjL4v*`r8bB^|_rddp80cQ7HJ-za>PsSP9w~#Iv>G9>itdy6WYv{n_g;qZ zV?V2dr=L>YkmO-f`KuUncwNSX$zNY}j4m|8-kuU&&T~`NNC*fT=;ojZadHj1&G!(~ z>;tbrS#u1Q?4x<Jw5u0&a;OsmcR(i<77H|EI-k-`u%!42)Yxe*u%?EW;lV@Tf*Oqb zr?6Z*g|XArO+LwE={hX&7Bh6#H0TiNWL(GhVG^XT2N2s&>o=|K8h{s~S(<ZQn1I~w zCe$n&CE_S75FdqEVa46ge1*DhMJ)6_=4w1Nf^r5+Zboh~YCZ$xe1RorqTmbDp_76` z@81_{ny1c<355l82YOTCMG|5b9U-O#n&k+;!Z#Y2s6NGGHe$lD$uQ{*41EvSei8~p zid=cM?p?##uTO$9nw&uomMDCvvk*Xz@8mOKa)4JDBl4UJ^Ho0Ucn`1O^(Yp~rBIIn z*i6mqx$%Cc<Pg`Rv&I>WZLL>3^J#s+j@h7fjV|q^-V#vi$8UoNwvlr>Gbm$>YPb$1 z@laYEHhay*5R*ObW-@_G6P+o3hocbI(USRu72#aeG2)o#p_sA(m1`kbyAvJ?o7A~g zGOsv6A7Wn99M!Pj2SuvjlEh@BO8!;m%L7u#@Y7iT3e7K8={+Ln{Xvc3^YXja+}<TY zEOs(9J{K}OIb>-bEym#J%C>(a*7y6xa>@Os!WZkcZ|UsBp&PBQ+Ppew24*_a1aFF< zLDWyyM`5q;yt1WOTfd!+`kmudvP{ioF=)#f)x!~O3;BaKs(b&>=v}kmjrr6!5O5x# zc~<S}zsuGt@++<TdYmwS5Bw_uD0JPB78x*Bc<SPOy~T&c+*ey#FEKEfSq1!;KO)D{ z4xdp0(W_A^wgyNqZ5gpJ{EnV&Boh5Oj4~gp!e4=016(K8C;XlS1Y0{@G>*15o^?82 z5@xa33Xr)`59N-RLa1|gj8!|l_E%Nb?DRe|Z*tE{eQRDP+Yf}>9{_px1aawNB#-!i zQ76|X;cp1J<lsC9e3^d64mG{c+jN^`P-671LkCl|UloUbtaEwf0OWg9R$d7yk7KF$ zl<p;>qiV(Ps)RgU8xVPS$h{_oc4l0LJ9YRC#OA@aSm<MMomUoD>*1ZJ;X=R`rsJR; z<_y3#^g&OYTaATG#K5kpPI|3Y8K;*(8yzc`{N_-12tpA?6rH?qv-|T{wBSnmBrzJZ z3rj}`twWmdh8(IQnZcw`r-JNO_I5;4^v#Gc2v2rm85QO($$}JR3N?-%2Q5?^w5Xv% z-4ml^616UYOh58<7)bl!I<N3`5-INF2g0o3=wZG#%<t3q3x3Nq$ix5;fevqdwC*cd zHkppmsZ~?0?E(l9@nemoQ9cHHB|#-e+;xykKcs0{bRBp`Kv^zuqCaOBK~z=_w?pH@ zP$XmM(Uai^h{{K;y%rB|4tjqE`~&dZLCt&G+`OEu*8+QB9Qid*SsPzYMww<rW%lXe zBG7yb94y0A#vNfM7PrvhJ!uBb-J|z2u;n}?CjeO-jH+`5EgP;n*?cuCNVZw9fb^8W zy~B_Grn@2EZjfE@-hYeidR_Go@KttDCMxFRU`E4T;T6uRR=tBU{e*I3F(rBjprnD9 zv;<07xD!gc$(pyoBH@L@b2R8&{)|!kec;hJg}Y03?hJrkS5jop5`a(<`i4_fI$4-U zS<UH=3yZa11CjA=Gcex!u7QV&&*sJrkD9?6>-Lqit$jme?hO%7>vL7dDEmu&NvG`0 z?gI7%75hujo8}BbqwYaqn%yr%OKrMEu|lU8SpaaUH<Dq?Lhv}QJs$SB581F|)G46{ zzNowK17n(jv?WUg(Fniz15mhBI?=ct%o$(ek|LV>A+CWOU{s{GKKO35)oRXVGQCMy zaO{_S6;AR5J>G+OBObb%3Zfh83;sy0RqPr%6uug}jwjG!{ow~YfWMFat7!nH%G`Ca zGaIJcHOG6Llo2P#b)*Yq?)x%3k-rdiY&VE(MkfQI$V-{4W$<uS^0wpJIYC%mPvw<6 z-9*$89JA(51s;YJgL?_kUlvAe8QuJ*_n^xUQe}ub>$;AI%&NAmg#3ZJ6+SF+$Ad(p zwj)tEr;o0;HL6L~Jk7&2kICK(6LrrrN-Vl%8v~pH;h+_hfkBTNP=B}22yjD88NI0? z^L72@@ls7c-@xSRme(dXXF^duN3;pd^5SFr<=^zlnQnw(2BG!n=UgqcoI$%mx?>`O z1>~_b1{n{`yb)%U%q?vrJNwB;VPd7_64o}%C8!mVnKZ4H*^8QGDVPKNKP><xw&w?6 z%m!wDIl3+*X#DrV`HqC<6U6!(SFSF<Ls{3)T8GTmmmt`rWH|#_<2#{260T!OdI)x? zNu~%H>*MMM$Z~B;A})WnQ)_I~tV^`o3fc%wjZ7~!$FzSknSL|`739uUdP+HakUA)0 zS2;BB^~{+h0g^TzU_?341g%65mBD5oIi_32gTE8%D>!B|BWE=5MY_{3ZQI^#*60N( z%i9iV0d_pbtWKeZ2EFcp$1O4!9qTlXFW8M%<N6508Lxgvtz_tzWn=Ocrma$~+vI2F zK;cnR*j>=1n;nn01cXJ$hz6Hc=QIwuB3f{XE}1mQzoH$?u(xyk8v{@k<cjrcq}$w{ z4h~4huyIRd^t-pI2mu7jgnUU+==%j-0GXvwI>02*)qDole~B!B=@R^_%C6AKpLOd7 zkWU*S7<bC7EqcC&&Tmx(X(|>ZVNBF$D)=aW+D$GFQ}8(h-ceE4|CGik4RCrRtca|) z(*_PtZ$XFJAu{KqOpfl<xUl&e(@QX<Eue0|)mVTl`8jfANW!1ts6p!^{b378o@H(P zgc^`n5k)Q5>B<bmCXj}Bn|@dl;|?7nAvYbhRx<<Ri;tPa4-CVyd1K*Wgk^{6`RAa} z0U5o+nf6eO^uW<xe(3>F_3{`XiQH^9^Dk#-z_<`U49o_7M7?J1$IH16)SspC!8ja= zIuhmC#UBu@UYdp%H?mzvLXX-$fs;FrgyvSruId133|P#sts%(Ywc_vA)>2+)UQxMj zT}VN=6wB@3L7G(Xcs)p_=APpV-$!<m+(@&|aq$VmN{TU6&f?&d#o$~Fzf#%9)ov?I zxx`&9j?1+)ekZ>$7>n*^YU`a2ubR5m=kXtp5v$rbocFzPSx_s7u>Wwyzp}0?hK#^* zah=<52XSig{6fFwr0909Bd#{Xu;v~k6#|q;J=(;FA?tCPT8P0?gIH9wTPpdJyU&T? zokNTo&%&Ih7IcYO(`fE7@OHyKksn}Wu7y5JJN@X_l#AonNyOAoqNg3s1I!6KB`?tZ zFUro1%<e1ncG;VXtG%~E@f;k;s*t&dqG$n{qZC@ZVVu#8xh2f6={MHw4#;=FwUHek zcf%fV=IOKOl&_xsXWO;)7$Twamo#du$l{COq6?N7S57bu%*Cb$2CU)k4t_^s%82ig zQ$#EuuC<K=-HkQ+ScNRy$Z2N$x`3X<SQ2)Yhb;yXg;Ds50mSN_TLZg8MSfQ?T~%D7 z7BA6D@;Vt++1HsMDD7IdKNNO40uEOfR=}js|6`q1)ZF<-#N2_6jY<WAPG%Xsy@uvu z*{3P{Qu>51)6cbg+~HxYCWNZmg^8-5=u>DVWOc$~byqRwcC7nJwrrF&%bfhB4*L@Q z=Sx%tFU8a8bYK2btsaEV$YfvjX|ZLADlg}@r`!Onn1`WYgBI)Hy`KC+r^oXg4e28d zk{`nn&pe0De?*UVDb_G|T=wYpE-|$NZi$ko!8;FBS;*V%+U{ox>C?1DZYCklBD4Du zafxt&mUM)CgHS}D9qB0Ab`>erq}|64r;DjRlA)0OA?^u35fQ}*D$`t0FXs1Rpj-`{ zR@p`}>dAAn=z}?0h{X<Dese~tlHEvog@my6<xxoluq^K-aRh9``wkHT0p1ZLlVm_l zHxMZSKk^G($enU0m}acdj&IHDwWeMR{W8kkztN1=hIFN_jam^!Ane@vjUmp97wNOE zj|yL-UJ*qtqh;G9M}C}i+q89Y>+@RK>vUz8a;t&Ca%jQDc-JTYsSLdl0wWH)b;mIA zkI-oYEPy5qZlg@S#HbTYQKPBii5slH*2frS#=>U!glt?6Z^@o7Y!kpfkYx*R^hU9x z7E?oMG4hyY$23w@)FkXjdlFRZ>;bds4)AQir<50k%x+-~@`1Shv<WgJOxovAVl)BB z{SeKXl5AwhFLFmZkxdfe?fOp5e+-}?9fP-bwH|bmhmrmF=4iH`(T{;ILKYhNc~}vK zTv+|_WK7iv?VNEZ(tIP^j2fAHFUI?q9+)!+oPVUpg4pB?fn`3dmKyOllN9Koxd#zW zNVY<c3qf`n1hF|UL1!`j93O_UceFuu3_b+o_-ikRnE;ssxFSQ$K{^*dn9(~8Vk{&Z zH5C2;gX(y=B~c}xBXMNT=z6l5N8Ui<bnL4<J6i28b5vqkG<sVHTu{PoUgn2z8EZa9 zi+#BVWFHYypM$avOBzw)Ul!t8-c1Xo_-#R8ZzbO{MPavQ9g>$h$pnUGobf0VHU2V2 zG+wj5tvNTdOVo@;79^gdOtfHi`TklB{GJZ&>^ysKC^Ve~ZCaC$m#G%UP_RrVC9u;5 zYV}I^W18%m7-2Kc5Nx6;?FHb?4qc8pifMHt^9#t)g}CCmY#6EQB^ArZn*>*nJ{rMt z)jB_?`yc?DssB;nOK8bi18^V+gQYq)Y#C$sk!Flj$o6xyuvc~O3Hy;v%6y6K<|^r! z<755%NxI-+><+Ulz2ky*cu3ptYY!wWaoja)7xXQpqYZd_3pUM)L}HXNgc@w{TFsgg zV4jwkmN=hG+SV9F#{j`jhGullEKBK_DsV_F2JA<o{2>XxeVTi?4UoUKQTA=f!gBW- zj4)|kQ$MmFy&|pK>tqz_oXan@>>4NT)X;x6(%fBixzml)Y`T{izr)p*F%W=C#wq zuwS=k$1GEqL*+DuXW(K6wegy##;8WVh1~BKz~n+sfZZ-b$sl}!NG-Pw1|)*~0p3(X z-B5v<zHCB2hJRpOAPlO>Mj-MHz-<ORIv?D^$nFLbR9H~LN2yl~?-xU{;(#+-q>Y;L zY+zG{i}%Mpe&%?ZepkBpq~~I6(*-#0c@Ac#pQPnp6ou5KqHBH(=RM>Y#lGSk9>yB{ z#iM`CqzC-u$pF86HoJ03aoc0MC!LO;Xe83hVnGzk)pqz)Bd^mEJsI}XP##hz1mYyo zzjV=C);<<J#RZ{dmY(y=uT%U1uI+!P_}!N<brgPqye3UP4Mkt0_zxodqDXQh&-NL0 zyU9#H>#tybj^;46mt<@VRVcu4%Pupf>rIqhL{4Gk+TkXVWCQ#$h}JjD++vkGg0|p^ zCq)GeV#Dwa+3jzDZ@rpR@m`NQ-iPn#z2T7CF5NDyT88e2TvJy*tP|fmfDpv1%~!bD zs3_Tb3UOQ*&c%~~e+Bp_XocShJEpr^H2z1>^0<baMV%W;A~v!zKVtl;xEDJy-3_F5 z9>fA(=Na;h3dAp>P3`dtRPh@Mi?q}5l+U3+qZ@AlX*Tm1AW?4JG$YNMOdUU(W`9wk z@Bb~XeU?WTYWA33KSX1PZ!Zr@Fk$7(zMY3-Qm){dg9X-ZY(0pBQ1eDTVn<TJZpA9c zbX<o%flobX0g?f~4+xv0Ab3dg5SQs^&l?Ql7tj%4kz4;8)U&u~D8_w-^&C-VkAW`| zSZ^TUSdNSi^AxoN*61o=jUbp0?HdxOt}N=)+#%xM9V^t70w3Mzv^9pWM_pz_K5dPj ztNCdo1dsZV<m?v3vB&94^Hu&SB%7j6N#)L?CMZWFDcyW!j03KaPHFz<x=m(mc^1!C z)bk2gtff9h_eVpY`a^c11!|)RA%;7i`1I8dtZLesZQw@NN`@cHSO_lBrhY`#|EXoX zCzWOTMx$aND$ON#4FJ{htx=;iI0uKY^ALyA1UnHMbVoIxv5A?~L40Hoxvt^ejB7D< zan3iPJ7n67P(VqqG&+cB)F?qKzp>Bxg{3DT?0FQz7{Erh8C$T~=~#5=_Q7JPfSd7O zhf-mxhwX)%kZqf%<w5*$dYVwq&)d{ouzFx>q~;@iwH)ASZpe7>E45e+FU=~YUDpL9 zWS8P&fZ{F|g*;b<G^c)5nd~8Cm92r(@{W*`fuh|^_LRP_*wJ--$O-$SP^&U+J}7PS z`bk_2<a}D)CID+xd!8!(BJ>5;WRH7wRoyJ!xVM8ez{{SFz#O%%&ErXjLd_nEOJaL9 zFauB;;3IVWO8VtAlI~=(TjJ~*eNq=v6Dqr2=P%HAu-h`(fi)CG;7rs`fz(F}7qgTf z4TMm?-SRe+bP7G;yp1s2E)Dj=VC<46L?p%!AE~!WTI*u0d`^*$9WXuzD&3&AGO`uR zACj$S?f`Z@%<6#aQMBu?+Mw+NY!s0JhdbL97k*9I-PF7VjD|k)+-6KvA;A6zWn}*b zc#=ocp|hefaB0&Y0M-E^onNfSC_Ats1Uq2i8Pb513$k=h1N05R1eMHDe<KN4$8wV} z`R#*l?iV!5n4Z0hNk6LJ>4RK9yL20L$g%dIZ8KRPCLi3c^Ii7UFwV3Vsmz@kJ|0t) z`611+VwWy#{+ivb)jU<vMkNWKm<c(LB-0FoUBFytQjuT_hRBojRE+P_EoZ(eVUI_c z+nnV6TAF19!LV6mQ01{!HXHxj$fUQzWV(gHG^!-%{IL<fpDlbJwhpl5378lY_Td^2 zDxCxltTaSe@O^dM6#JKuBM?zD%E}q3qVS$(O~TwqV-tYg!i?+scA}rz6&dblu0c<% zuZscaaLP4?GaQ61NV_)P1#?sB#jth|zZmFkwhxy8k9ap?O_d+<2$SigmibFPD=7d6 zKr%dK#&;2&msILjiX<dKuEf@Z=!<XlTNBD3tL9v$+X^6m_<p_z=zJf=If-CB<@nSd zfTubQj<6AoJ%Q8WM(6LX#OGcHuK-g6-yk5`RXp@OF@3zPSZZ;%doD=7pBW@e^i_d? zc{5oq|6VuK!gw=iVLmke0QP}PN}1xKcpCPKz6W({w0EN5e4F_vlS-bU$%<C(WgKSM z*PW~1LfPfm6=!ML6V%(_Jf`pKae^XPk)p4e-u7HJs_t@^*%v*`h_QlFC$aD84GTpC zMKE4>HRT&glM6*LC&-0Tt@9Syxv!g#$wVKhfxHpnKxdEnLpVZhMSAXXHPQFfnSA(N zs53%;A9O;;NzsF0Rf2zq{9PbqLS~PlBtb+*s?e7cj=_Z)e>_owdJcdo^8NYzOBwnh z#S-z%hV_>>h!+?x<Tvwf$6WKWCH9xr&<kOs^Jx<Ko5RT=c>Skv6JlL_sGCW>%zy(e z49p18X3(;o68Dk9EzyK6OkNsB<)kPR!e?Q|Qg%!VtnUD~;zT;<4wdyP@XtQ$m;ibs zD$<;v!$H)Qg^5vVA=whzT}?k!ytnG^TiZxsC2b8TFSw)3Yx)$$3YA7%<EFJ5dpe$L zQMqvjMTFbo``~EGH#Io_O(y~FU$V)~0q-Yhi$hE<O|3zQK3p6oBtMVqjP3^!JVkVk zNU%m$`$%`(ybLnkV5s{7ek(fVEfEU}QdSr5-!G2l`PcQ<l~LkRvN90fM`MSGDuop> ztR+dld%$mqb7uuBP=_Li5Sk4*7_INrZt9Q*>`tHTXhW7um>|#32e<EwA*CRJ(PH#q zvmcT<7++21tXG|5p?~w=>n|-lMNzxt!umA+d!3wk7s<-^{MfrPTJF6BIh`MlgquIp zta-rw7H;*C`jIq;0pf0R>miaQ(SqVlfQ4m7wraq6)7tMCnyQFFyWOF#T&q_s(ElSn zf}KXPTieSqC>%5z_BYMw9T8YOhysgsaTH=DNV{-?utRwB^{(c-snEGb&)+3E-Gd~( zi=%dyCs%IK9hV8h<U{0ok6v~#AgI{ayc;vR=P~+ZqeUI&z_U*CMj2U7jwJ-Go8`%g z2o%s+Yy!&8IsIT~0w}5O+>Qv&`M&o&oK}sn$!bnDF4V`jB$}E$$hUzlm6CGZmk0+b zr_8*qu9^Hb7Ogo4AH%MGIQ+_h`eGif2r5EEX<WD4NU$p;{N3G7uz{nUCa;EqCe1JD zJJ$5FB6>86tomTA7@E)vJN^pxZ;)Gva8kDh^H}xf4tTJGX`$XPhJ{PHtIT%Ho%N?J zv(>sZf08p4@JaN$J#lgMpf0q~i0lyHkep(tG5Sy)%p$SX^PMrBX!b$vYWTQ-;w9GG zB{zPFW!_bxLNW~N_8=RGF$eX@@Kz(Vz6;G=gfakidackn5c)~7SX6tTf%><d<uB4b zF>Tu>tPrqQ4A(V_YNh^T%vOjRew|=xa~sWT6|OGq%j<U_bYi!W1251#UsA4%f09bg zu#sPUkctneFXYkW^=JWiz&=00gCzjg6PmMBK@l?Zb$O2=Ei}}mTN5BC@%#_p3ojd8 z%vayzbz?>Dl%Rrnsl&K(tS4c+gh8$^5x$1&OT)xXYm36d^gv=U69+N+m~T?^Y+r(8 z7;cx$&>qaw8sj#t3>4O-S3<6HYZo)DHDR)a9y>b+dO8wPrRW*NO^40AS1!~7KE+oN z<6Bi$nK~0nD4m@s4`0!}P)>;&u<qhd9RkEbW}Ys7TA5OtlphrlY329FFUYaNWzkpz zb=lDu2B0;{B=jzZpskzBN`RrxfTg;cokO1OsHZ4<5u<@erfBsQDpYIdKCK9AuXot% zJIfYr)awKnMi*_?0o~CESf|xRLy~y8D<D>Gg+fx7FECMg+*vX(*^7eH1AMuQ&eC$1 z(|n$bY0m`6A9S__QoMlnbEm(eNA{GGE%181D5(BSnsor!MvXs)piuo(WjIvtmSNF) z5IXPU>Vtp7QO$8-GiCeK<nyvni-|Wz9pavlwp+$PX^8U6C1G=jySNq3-T`U}Owf0W zo6G9GM-jUSD(M1|avHBdt!$>eHoTKw4HPAmqq3Qlv1yhXtp{X+nhox$VK_w|?%64~ zY>F4Yr{~TbLGl?4nXy|(hd6lOH-$KF6<%b#WiN7;{s{(bOzfi?VBRiRvPk#cg^G-E zD7e4%Hn@Ke+2f+$LUZkYAI7KDyZQl&s#k#NgDEQ6rr(CBDR%-g|5%!y0#gG#(M$FQ z$!VnI86R_r{1+%|hlnU^Unlc2ojkP5&70NMxkbJzom&bzE%fN-=FE?f=V!%&KJp5J z%~`i6px0y{r@>AgzAw8<4dXVg{gnteVz0Bj-r97=_|wo1m<3xV!VCGj;ABw-IyDHe z#|Yjlv(YxWMvTwW9WZVq(+?Ii-okZ0PUdOQPA2q!2h4cv>krahi@=ib8sk(G5{=E+ zVah3N$Z)9cFR?^P>jdnU8)}UfAfhb*1xt-Xak!gx!4Fl-5qBBKn}ISiZik`l-;e3_ znlg7bxY++))sIA}IY10pHUh;8H<4k+jKx;^O*70-bb2ntM$dFICvY5weDE(i6z9^I ztSK)QXoj57J`BIo>6kS74rBD;BEtFT6jig#p;NJPG8@QC;~5!!s@bM$7pzO@qFVmk zm$A8r$e`xc^Qt9&NGa)H9w0BEPPB)#A?YEZVXaVvv&t5K6{l)(U3git*kP37rbkG# z^Q!h^s4Ovbr82D64KiOc7*m5Y<?=DCpsK=uk(gHR==`=^tZz}A_5J+OM#iRFYT=Qh zSIhv)`_UIjg7i8@cq@F=%<g0sI<e+oSc>d&azIO3I}FU??AHL*v$X6Ti6EdlgHlIs zql2rXv6V6-qjLOK505=##&ox=*=jd6wM!%`h~!<Cp|8`N|A_+If|1<33tZ@{xL8Bh zC3?YV$#ZiXZ?2=Ad4)V*7;l=DN6lX7lPbHaDqqnn)Z!*(F5X$L*J#d~@T88n0?vuB zWS9*5P8fnRcOkxdu3iGWO300}A3xU-g^32eb})gqZ2vcCD>#C-oD22V3%X?!2CHCb zJ`7@-^!sFUzx#3O5mKK)9%pU~>=%XNH}!TiiMOnus+$AtdbV3MqaC;NX_1;<>TrM9 zr`vwo!BB!D7xK-1T+yHh6DB<A-X|ri!!0{DH3~*Tu;Z|V<5dpPh`}%XEAk67Q&eVU zJy^#{?5=A`WrL7^g|et0h{989l({BXoS`U*T#Momkx}8FX54OcEqPtQxIe6;z#{B! zm^ELGFo-5+sA2Ac>@AIP3GKg4j?LC^oo|%1rfmQf%WiByHn3>eNk)MvbMJVW7vcU9 z)WxA(_A||a#VF1w85+m2M#mCsK11ZWcF+h#SnzF#m6<8>_~v3;Z-;OKx@tsEtz8lJ zp{n@)_4-XH0e@THIF7;QVu)Xzknn%7N46OfeiT#~4KU{!?&i>c7;UK;Hkpx_sS&pB zA`}Z<*ggD;HZ$g)*2AJrP%)nLucEE^<va;PxzVddr~hrXHt-l6e_ekl1lZLc-fDZT zr=|HZRZ*O60jGC}uh+b>;Ky3l0WD_`R(LQ*&3Fp<&q?S{;Hah7Ro+9=-=JcAU<av~ zN{TM4%n(1Is5@_9vl8<ma|GCp4^BqLRmkfSKKXlHaac6pNen-&&vN*f#N-{+esoEn zz|$)iE5AGhJa4v#9y4Y}G+A)<iBQ2yk#ENO43}HMJbDrP3;rhu;LZ<kw7w%c4s68X zs+{YevK##1VzAi>W5zq$xB(w~OgqYu;3dd2nt7+7fjL^7h-jQPu^Y9j`@{bC6;~i) z&SlBdI5l)FDdQ}*WOA-0XCN`M`R{;#FAGA=jcHK^eE1DN-xc5{O!*sp!uB!pTPj>K z*vPv#0%@kBqtFWoZW-N~4U=Qsh=t*IjC*Jcrt2jSv_aAp`0mJZqIx9*3V%3_B<4L# z-8<`<(yjX?_D1Tqx-8JW5dTA!$TtK9LYV<#d9ws&3QOo%cHfWhm=^4nTcqK6v~? z?`Pf6WmZ<{>PfpctkyRsEXvjd$iWyGk>I!UE3W4D7ozHa9u8M>HHQua>|V2Cg~|Oq z-9^ebe!E=H4)}99NV79-2g5@8HR`<%Nh<GGoV6rl4^!LBc>)ga&roVi*2jdnhk9QI z=P~|kvT|XyG{)a5T<0}c)YHI!C;wgo*jU-Y5nW&Y*nRabJ`i29!*#;|z{(z|ZX`~9 z?ozT!X!9ezbyQ>f#3@_h4X||J(_9aqH^U(pwEJMlqx*?}8EGd%fYir^2PN5Qz=SZ6 z&VmeRg<u5)I_V+@yn~MZHuP+S@jb9Dot&3h#APLbQnISh|M{$Bk`zJ$37de!pbTTy zZpPfHAu7w!U2zr#(T%wH*BQC&U0zQz{lM*Tyvlzh!wYiBoF4vB`r9|ux!r6?6XNR? z3D&5K^lzI?M?J7Kk|+Y<tvH(|Ax%y;z;R@}M|Py{0|Pjdz->Sl&H!X56IJI1kr}Bv zcXski;b4)`O{&){e^c~}B9dKD^4}u65QgPKg`|4T=b=Hzd(j;=^u;dH@BM$z?<?=% zx*5nWu^rn5_pgS+L)$;uFTu=yYiBc&A`~u2To(TwY?1B-c92x}L+m+hOBMyld7=pQ zG?xYb%Gb!SLNE`LVGZMv4J(sK1)54_KW}^(Wg2c)mm1;Mgg@}Y<-a#sx$^KoCM*9j zS^1C2O6?z$mH(Km{KsVFKPD^xF<JTl$z&zcd|z!HO|Z2V(y}sJFDT?*sce~_U$YuW zABsfTe?ejAd9cKoxe^o}Af1Kv5^ppqQB>(fIggl(W2VOLt){LzNJ<pprtVEJ8(I{; z4e5~Cl3;u=nTB6?F{}^99|Xu?+<~S1SE5f8<*mmo)a`@;?5nJub}5S~-mO10pZWMA zEopPO>gg@Ae>>KESNU}z&0_|&YqP?%+WX`d_d3BC>kkVD-6++Co$-mL!{F~Gdp$V9 zEXKpkOnaO8D)dBA^VUOVc9V_T%uZ$wMRmPC1V{MBoJl=Bz>v1ytlr3ELj1Dg_b!<L zO)(tZBE_!;phoi=lUNmMa_|g4eltv)Negjq-czsg(KY^hG9bF<(_0jC08V>JZ#9a2 z`BNQOKAPk8lS0fTJX0EuQ<;GU#}MO^p>BwOo*G(2tSYlm?C_1Fn&+kUD=&sVfgi$d ziEn6n%%Y33orVjwPo?wQd)MvvTgH2`v1k4h==>guP;0Wt7%vWS;82!-*KiqwI_?Je z7Ebfch9#fCj?<7PSGI}R>RJF|GxQ)_#`j%_{KsESWgdZ*6~O+4zJ3Iipr}ZLnHrDf z?wG$aY0ZyFTY`s}AE0zAMy@C?h=H>4=aEj&L#7fnza!ikKPg&S8lHRtDg>kZk6ZWK zU<s1Q336tI%C(*cT`o(H5VePN>8LhJMnd)v6sD@?xp4Fx@UKG_PGw?iJ=Y11d0#QG z>~dWQG19YOye9@FKW_+(G2(5`H3Zs!6Yb=ALGe0DB)-&P*+clyTq5m^vAy1Pa|))P z(9_%`9nJ*%{9hiQVE?GTU@P?$Z&$J+W23osl(&bj;9SS!y2Cy^k?B=*&tl{+j{Nl< z1=cipa1N|&R6fZJRG#i5(QxPv;}r$IQXVHRf=$%jGos42NQ6b3kySSs6Te${$zl5Z zh=sliTxq{K^V+ajXN2Ns;n+7&{HKkf{NJOrFUmYZ{o_Umete}4Qv7@1?I@Dm$g_=( zGU>*U<}{oBZ%7w6JOZgpi)^g`@~b{NYKAQe52z0sb4t^ZB}-_TaYXa&bMQnbY`_AP zoJMxF7h4gD7h^C;n5q_Z=&!vP<EMVo%0J~IpKH0-r#J``J?M&`&QqCIs_L;)mDyeL zt36D5eQ)RjoWpk)l|6)S$k+h6rx_ViRJb={OB*I#cJ$(Ffw&3RAXCTp3h`TsdT`ek z<4@NokBn>fDm=^EpQia80I3`<b)c3;y-W$(VBirt<xX-D*mU$4gJ%0Q4wW$d;@AY& z_QieY!<83e?$7Z)Mz(A**%zw`#rDVebyW+NIU)A(t>e6ZsB<!Eed~K9^_up5nJWOH zN;KZek*Du9$i9Xko|ImhT`WVYVx9+YpitLN^FM-l)8HMna^d&Xn+<CQZ+wZyaTN8! z#S{AQTQrVApYi5~ClhbcV9D#o+`uCdGTR#v0N=g>^ta>p|8+tz)n982aE^=Fii+nN zVn;om7~A|V7Z@RUF6SN~_i~)4L2~zZK*}$SF%+B@*npxSq__{>1AFQK2T??R#lzQE zYM)}uGjKt`uIPYIcm&^rLELF1rj}B_@p6Wdjwim1#EUaaP4vLX$Uw&M>!Cc4NWz$I z=Dl)e{+-NYHF~8}P<#s@=I08J8tm5sTA*u|KM&7~;6%_dJ?%AZ$$6Ya{7<t2KOgr^ z@6AA_%?JfynCxU0gDnyLc6@W6(|$h-gU4h?>~HkJ&U4u8d?>%_w;|Q0+wedi2(o82 i{V5vk=lr#6tm-!7n7#<pQBK0BBzhJ`d2jpf@BSB}-Um4V diff --git a/client/resources/hardnested_tables/bitflip_0_197_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_197_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..5de5586439b07f7ad2b21bfcbc35a21d2d1a60de GIT binary patch literal 1352 zcmV-O1-JS_T4*^jL0KkKS+=#%EC3KD|Np~X9UbwXuRRF3;~$8Tz#qUJRS|+6T?l}H z062g_Xo}zo-v9sr00000000DV0MHr+fCidm02(yN0MU~K1|R?q02%{8&;Zj+fCEOE z02(r2fW!a+zym;N8UPw;kN{}YAOl8B5Ey^}H~?r313&{!G5`%4WB_Q%f&&l$2LKHL zplASTra%FsOn?m;FhF7e04XXW1gDZSMK%-<OepmldXE&*>Kb}RjXh6MlW2`IQ`CB7 z#GkfN0rKS~FJl!~qK`z&9^yUY9-2H6UdlZ2FsBGSfz)902fn_SLUbz(7(50adDuF- zJ;(hzosQ9w@R^KoFLZxc#pW(XNcd3l1Cz}M1xpN)^OCt0k%IUas?7U`vSsQnz<Z-3 zv@X|cGu>l_aQp`j2T|02gP`GE>4(662Xg99Z0eVSW$~_y@egg$nCP+g1Ne>!a3=y} zc9*Km{43~8od9%ITqW|jP7|X1=3lYNej$nUnON>eh*P<L8XjvSp*jbFm5gM4<C3`| z^$EhEVDbz`3z6!KEBA&DM+=1?zPVhM2O|p%7-1b311?vrTm#`f^X`t)?NyZS525*v z7si;sFvs}`+7BRMVTwG|t^<NQ(BaTSFKKxTp~;nIRCX$(8AoEJ^cGlhR|_Us8BDS) z9jeFMUBlT%G2V16j^V*!jB>bKrv_XO!xmjvDTgW5FlFGlGZ$eyi-dSAeMflhF<|KE zccv^Irz4Y*cP@#BIA!&*(6Hp4R|Yt6a_Vs4#!Sv!I4S4@z)WC2Qo{QK0oXV``1gmj zavm{ur+If7d<Bs4u2w833m1&MLE0P_oV^wMj*GB6%sY%&<ztY^c!QyEIx&m!oePIU zqHysP^$X)zGG;LNPnhK4enkBV%IeC??JQx2SY$rZ@{jXA+xgj@QSm=X@;gT-tapR4 z_s$LjFR6NG0qHU9EVy}IClAQ~#}7#q|Ac+Tg_amF#vXXRAu#BSu$e5B;bROiVTMtc zri+A!11zyDVoa>YW@U`3uBA&Px~qYea+T@>7or&8E*4f;x~>-sgN88eF~Z8>m+3B5 z!Jil9<;jkW{I6BzduQQxyHBuP%k>V99x}<ma8AS3Ukc>xTn}mNi}zIUS&N4cY@^N| zB6UT1<CR`AU}Ui`{a-TR>R#fRF>s8S%M&qm3?n0|bzc(v?~&ex-Yc+vwR_IzfgTBU zTr2b(uaL>g7m-(<FvGCR8D+u2k<d8~51jc|Rr9QMUohx7Kiu$K7h-vek6kQ<<qRmp zp)XnFc?MZ^9zp0hP7J+tnZcYFka>deF^pp#RQe8IWb&6$m(KJZ>EL+RkTS{UzN3Sp zPOI*|ca-<uyXk&6%<nt{#$?NcoH2Nlk;-9*Dz03U$@<p$-HyVZi0xS6aI7-2%*IaD zmBGN_<8@sJ(7HHuKV#Ns*5%dI%zY<&y<Wi*7uJO(HTCMDN?)}UjG~cGvs@5UEPyPG zQxhU185G5O+#zt2AyXBVRfUR{SwON?hEpgpOjRtAkyb_unIj}wRh2PiOHmmk6Dg`N zWiv4_$uWjh%2ru2V+oOpv1UdUiz3Rft1}xGD=i}!V<@m;Fl3o9m>PwerHnAdWYGp1 zsAS5pWMpAtm?JWlGMF-ktXj!NW=vREg2ouk$uPl|WW>tCF@<9WRtqr3MU1RqOk*&Z z$uh}f6<ILG78wbdGbv257{)S@mP*X5$&6);!3@DO3m7J1%rgj>!mP?vW-!Gpe;0B^ KI8czbwa_fkiDD%H literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_197_states.bin.z b/client/resources/hardnested_tables/bitflip_0_197_states.bin.z deleted file mode 100644 index d4b5fd31c1a01c560dfa9ae13d4b28df27d07025..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9175 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 PmvPUB`MWPYk^27u?_cUc diff --git a/client/resources/hardnested_tables/bitflip_0_199_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_199_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..c4f58b53d09f574c5b5a08dd430562f2f7e8d66b GIT binary patch literal 2498 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 KVpbCSF8&8o*;yX| literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_199_states.bin.z b/client/resources/hardnested_tables/bitflip_0_199_states.bin.z deleted file mode 100644 index 9117c86daca40045d7997962a9e1c01441a13c37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18323 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 diff --git a/client/resources/hardnested_tables/bitflip_0_19b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_19b_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..9ad820f8cb67775057f5c3ec6af7a9f110bf6c3f GIT binary patch literal 1444 zcmbu${Zo<$0KjovHMiu@Mk?$~m!_t0$^$<{if>uIGD=aCj+7T4+*Z3{alUoV7n+7X zrzr?LH?t+DW^)0L+w!ziK|$2#EOp&k)23Dy=J|>enYMo0AF%IlpC7&_&V6$nh~WgV zIWvIY4a}!oB_B4=#@v_LV!WacxVd56qA^Ztr!}5?^xiY!n9}Q**uQ68vN8XK<9%iT zF#Q3aYYyKoWgd{#{7;wH*ZY1MJsER4(b`<}b-UGde^JvflWv;~HQN?z8+Q-wb3e0t zq#^Ezc00BGTG<;@Rvk5Ba|OsgE`%=YBsCVG4kWYp5z|$;u^}uBnZsB{1k3;cCgErg z{x1Olk`Yh|a4M)>T@nzhBbY!X=giK9mI`LYUPl#|g*B&HybfP)*wB<c;mboXt0KXi zMDOL&+!+!=!a~$m$}FhFQFO*R5Xw7cyk|9x=aKaND9h7%51~7#fiHPZqtQCU;;4uy zkL3b&QgdT#`~ZeGxdx!^H$f+tvjQkhxY9Mwk+np{at9NRCvt$(ko}ac>)p^`$<OvC z$r`)L2u|&i424oO-%mOr8JeJ5)8`*JuNP~7-)LdDrf{~%eVX+sP3J^U?@Nbv>K1Ij zm9h|8T3c!(YtLPc-wxFaU!8CG@zPtd>mTpErH_2=XU!7&19fq-4=Nnf7lxWvXzzOO z%MCz<cXDM{6n@G_yzNsxSn#VO(muPI7v)$9p5J|}a)ygv2|G8kon|D<LPPqa0N?Gp z%PoV|vTXQ-_72{bAayh9LH}|dP$hsxdkz{X$eo;=j#LO6RP7{kPvw^<EEVTg58B7* zk`lSyd+%Hoe?|Mr&IL5ra^AAhBbyp~-by2H!75xB9vNaXJbx(YZK(WhXCT7WFM!At z61=6`4-0Gv8k*A`?rmty?%%GpSkH>5M=NKe_RaU^e3%@bFX+*7cK5$?e!)mz_q0R| zMqKiJP<t`bPj6UlyK?<Kglxq=%WBzdjkHVbKI_GSiHi&sQY3v5p=;yq#Cl|+9sEW5 z)o;h=3p~UT+P=#6TG;0Ecp;zlrdC#*Y%8wJN4DUlZhGI9S<YsyX}9_%gFQI>r23!a zIWD#_^!ruqQ+f~1`jCID%rw2U6vm~GnYo2GNi*Rz%>rwnjkPpJaXiC8j`%~*N;kv% z3fGz})~l}Ylq3F5p*LyTmDX0i+{>N~4{WJ@8X9JUiz>Ta{R}r}RIHl7`knaX^~hs? zc1K)9VOVwZl~^+ThRTp5>vV>9!{Q-T+4QniB1xG@fdYbxgT1mG<!JS7=~wFR)03}# z)7gtBcNWr^X&q#0T(Sq5$Qw>3GDXRLSQwi_HOc)Bs+BY{C@@t}P}H13(T(WTh#pcV zp&1l&CMfmTLm9=wnXMG2GEOkUuOJcYM?i?fMEEi}i6Ck{r=*OMO-fE<TzdN5yLX|$ z`-*Kh&)0)AcMer&G*COqrjL&YIRk*u0e`B12@{5uNn%0soSdK|=N}@Nfod#Y2q;E) z!$eR7a47mJgbc$U-IZXK0x%O9^#F~Kq7mORetkI8VjRV`Pu!MR^a>r%oPiG((tHhS z^fK3J;vRuUOr68Geww4_8RX5XB#paTfOO!4O-u^ffr8?cutWu7Cf6yDHX`LUmWi-` zV!^2>PzMM^Bx)RAnUrJlswcEzk>iQ<5Ml;(R3@gjSH>8ikfRjkc_L^Ldok~&vJ@y3 z@BW>}C9M_v1sVq?Og-w?5EHC`Ck}@TJUHJlXw1b0a|I3ZU^+NJ%=8Bp61D#j%b&xO z=vm4{k*{^gNq#hgr^4Pq-3^dIh%u7_I8um2<O&i8f><!O<ZVxVknviDRpwRtF9C9_ AN&o-= literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_19b_states.bin.z b/client/resources/hardnested_tables/bitflip_0_19b_states.bin.z deleted file mode 100644 index ae144de8c90d0f11a7725f429136db73c37e7ee0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9515 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 diff --git a/client/resources/hardnested_tables/bitflip_0_19d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_19d_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..54371d652ce037bf6216e295469becbdce91c7cf GIT binary patch literal 1784 zcmV<U1_${<T4*^jL0KkKS+z&0#{d^b|NsA0etZ#8Fw_@ea4}E-7hs0g1OSmh00fpG z00I<IU3=gR-v9sr00+<j00000000A;G-zpr1562~fHE2wfHYz>Fh)QQXwjjj5DhRU zngGaXVgS*I(7_o1Iip5~m_RhZnrH(dp@;)UBSQpa0OpMv8ess_0%@QOhK3*w7>x`O zkO3-C000000001J00000q@@H+3F;XNpXz!lY&B0P@?|`lMxNC&Xw&sZL&P-nC#62$ z<WQAAf2n^ZABDyEhoycM@vou8`JUzNFC?88M8gjUk(rC-98Nt8(!c6HvDCd!NqS4V z>bz2Ciog0{)x-P;9CTb|aO1>xLU(2N3@$O3WO)o;qv2hQaeZbz;&=|r5B4hH%KsJh zudRNC?OlZa!pgru_A}6A`j72>PRCK$v3l1J2g=KX|3&6KOAj%}`$s{;_=oWreZj@X ze{lOp;CX@Oy`uf3_)jCU{EG_r3HOJzv3!M>kvv9MipR(>=(upQUiAFVi0m?1lJ+Ov z4~TrK_P@P%9tg#U{ogA7_d>m_$G|b>=yX@Y@lL0;bs6kmD9b6>9s?FwSo{Tx#ScTp z@-aBLII_iL@)$h@(c<Ghj)Ty3aVN-o9u9|txy0kzIPhIV$nO6G-0pa%arPeee8b=$ z=sZuX{-=_9*iTx=7Di&vjOaQ#7n;Wzp4L;V4vZOQVENB!#rhxS{co^)9+BNJ#d$9$ z3F7E+C%8T2aZ3h6f!uxZ^FDFz96Set$%i_Q>gF6B#~IPou;>|%7Z@G~M-SNIeo@Cq zL&@qtN&N$|^|SB~K>bHWJdFOg-aeC{^$%O{4}r%;@Se99Ryw~(&N10=@DEEF;Narm z;bX+?zldYtU!`R8U+R6QsQa(-IQUun4vQH)-eb(m<6gD<Pf_~MS^ni-4-+5G`yXTK ze9ydhSL$D>#Pl)o9@nXcexd6;nDv}~lcD*?{1zXT?;REWDb-)*{Esz{H<{Ub7rl5d ziR~}QSL9V+jH?zB$EkU}1IT^zi}S16uj?Q496O&X=zNR%m-L@W?LR8_E-z^Ln9QH= zd~EkPe&g75KcMv;m(qEjBcOjddx7dw{?&ypDaFMu0$(Wmi?YtF&!N?LG0}Bdhpmpx zzOU}=^#@_ue&g$1PN~&BA@jc1W7KE%2eEvFcMyCdh^!1mM<0YTsE~%Bk@N<l4WW?w zCqHxVznNxFp>gz`9UkM4Lg?c7&z#HPOrM$bJDgV+-#zQzpAq;^Qhf{YC&<1x=1};P z^Q@mq`wyM>9~0Jl6CTBJ(4K39(w9Yx9Ue*8eU7JN@h`??pN&+0vg%o7gZxHJu)_-s zSWbn(F=AXph88CUju!?@GZljW<GDw3|0ffpxkG~}8G!0!52(Vk7Aq9-JPU?Z{K~x0 zrc0q6j^MbG<0X?0>#Aig>B7sno`Aa)WTr~5;3q{KER&*m7&yv2MNXw*F)Hd_1E}gw z#W*lwm5gJur)8AOBQAx|x+|!7D;HJKS!YDW_f$@-NXK-X1;R08z?Tv~$z>SI#z~B` z7CaNuGxwG$iDI2aCv{Pd#f**xIxDf4@G!8j>Z`Drr0iTPBu*sxkyS4hT^T_<1@A1o zFqmOt^KdgJFv!CzgN5*?L4yV`xK~Cc+*fqO@Df}cJFgaE%8Lw`WDgYac3fFw7AbL< z%(z(WbR19gR3BoO0_=i3QcJiO5Xvix3os?Y6vab;a54MQ-A?N(DdISBW76n2I5?bL z7Fd{OGpS3`F_Q8gN_1bqVV7~ki;2QqWM*SCgM)*)mC<o!i=&}3!v;nSR!p23Tv=va z)o@*u=ve5>jxH{aiI!P1;l)z&D0)(zl{`t%JVD}JM}goxLk^CI717k43xdlL=~dvP z&<Wia0mQnU&KIEUb{9h6@mGR%Rn-op;b()gyDp*Fm}Omu7ZHnwad9$myN?mn?Cd)e z!N*d@80zYkFXNRL`iWAER4RR{Di!;9NR>a3Wo2VAlNA(`<Vb~rfgDwoLR=DFB@%Qj zNO44*SgBcICBz|-1;Zql1sqglEZ`Pa5MwAVC>%>A45u6}42r`Mz)K34imosj!W<?5 z$f$5jgA*0PhXlz?iz;MTn4D2!;BZR>xULI|xExjt7`USanU-L)A(ad!8CG#vM-gO< z445)x%BC4d3n_52s>VddRV*y2ixQ&@O3KJ_V&Y}RXBA{+FvWy1GAvmm7y~O4i#WK! z#LTiX3d1WIR!c4!Wr{8gMV2hFF=bXPg^ZNUWsu2%lN6RPOAIREg18uCB+f1X;K*TO a#ubJb!jlY2V-|7$@pmLsg$WB(dYo_pNlzyL literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_19d_states.bin.z b/client/resources/hardnested_tables/bitflip_0_19d_states.bin.z deleted file mode 100644 index 1b7f08b3d362555b20fe187d3dbdfcb2a4890450..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11481 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 Rg{&A?#Ri3Za;<6p{{`{|gFpZP diff --git a/client/resources/hardnested_tables/bitflip_0_19f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_19f_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b4a434889f68703025f7cccb7cef90f2e89856ff GIT binary patch literal 1084 zcmV-C1jGA6T4*^jL0KkKSuzcL+yDd7|Nr~dZIgjF0hC1<0GR*~02l%pK@b5D0RVs) z5SW@7$-3YM{{R3000000b4-keOc2q8!5V1Mh#F+bzyL#<WMnd6hKwc%(?*Oy(<Vj$ z0vyvLA(I3&VK7FTG-3vsGB5xT=9w7`m?5JHf;7>i5H!h=fB=Uy$jD^D4H!%jri~bZ zrc8_g1PV%$XcI$1F*GUqPf~d_)NM@3lr~c*iRzj^Q`Dd0gsa_<N5tz_`M<l7^Pa@! zJm>XuJ*>{Q9gf4w`j6Usj)ng3+~M`TXS{lcgyz2R@;>$CWc_Ccd#L8Hye#oA5togA zwd_2{^d5kCPo>=K9wsx=GlpTAJJ0A|W4+{Nc^?Yl?{H(#yBB%hor~!`ZnfZDCrIjE zk=nc`h0Nr+oH;Y#dP$ip7tm!tYm#s*GO>YlJp%I{XIb#S2jb@ZT}!Rn%)N&Lg7ZBN z<AamzaP=NF`<LLpMbhp&hhlz*A;IQ(oyL6+3oZ^1D}&%Tc+N`h9i}ndcDqg-jF__I zVc=cP^Q^y<f!aK${0y$~{)+otJ6C{s!w<Q2zUOMb$9nmfc=()`35Gn!sQrR)y==_v zGUy&Rp_k}==h|{SraoiRa9oT!&j4^;rOom^PKT`SUrN6r-Z`tOSs3|FOZty$`&SFZ zuWQVHZuR_+dGIcz{0_s$|EGvg$zZ)J(#!5Lztx%4bSKK@%P{C%GtOrxv1gI;I6qOy zICvAtJPzX?wfq;#pIUHxm;XAE+MRD<^Bs@5(z}^mN%=WEK*`v=>lr6A+P`6$$-sL| z7g6XO&a*6J;JQ{_W(y4AWawGaW-$9q$l&S|k(?$jld#81Wh^?C!AG1<z~s8tSw>w8 z3C%bZ>I2T^<oJ#qZWlqxW<I6rGdfOB3eG{?={nf;Jl~&l-sW|u;^6<+&~>i!=Us=& zI+uF)xHw-K<6pqx{NH2NdX?xeKzc#(oQ!3R@uxLDGn!nA{$uK2ncTm#n)qK}{?DD~ zf02{aJJ$<5OZ76ni;>W9GH~*)hl`~>E;$ax)H;V!c!9}gE{8&Nj)UttuhH7<Ii3;0 z%<NsqYru6q@136KS#&PJ(sCXLiOtQ(X9^d)5-DHZRHbSj{Q{$<WK$Sriz^8kWK<LU z6q!s^$&!q*Qx!m*D8i9em3<hTl`OFgOeGj#urRQ&sLL{7S&0lX8H$WqP|21|O2$IS z#Tcd&D=IM=QzXb(mIF%37Kk!sj8i5|%o%}_!psazt0{`uri!f5EJlS4%(BdeR*Z(I ztg^E$iKUTDv00U5WKzZjlLdwhOp;?OETm=`VMZA#lN7@tSjvMKD#IYm7|B*KEHJT^ zj3mj4WtEdEOqhtwN@E3PRItf0ip(XJRZPTLfMydgs$&K)Q!-0G{9VZu;X**jHS=&4 CE)?qk literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_19f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_19f_states.bin.z deleted file mode 100644 index 81ef023c3a3376c191ddc29c4e535a0aba9f4035..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5874 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 diff --git a/client/resources/hardnested_tables/bitflip_0_1a4_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1a4_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..ca79aa9b070e16f0df927e6d7d8da60d705d57fb GIT binary patch literal 2795 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 T4<v6I{vLNJks+4AFIM~qs*JPe literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1a4_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1a4_states.bin.z deleted file mode 100644 index af0f720865c5344e2c6e55fa3d38f6447cdda4b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20539 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 X;A4g`9g1qxqtU1gz*V+ymhk@#-sC8W diff --git a/client/resources/hardnested_tables/bitflip_0_1ac_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1ac_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..944d52e0736b7a38797a7776a18fed2976cca528 GIT binary patch literal 1141 zcmYk+UrZBs0KoB<V!><2pVB`U0?UBX+EUv)<3k5!AP8io17;~4OR>ElF=KDHtw9l| zE!XQGN(KYP#v!yb0vVn5G9Mb_T<_XrEc1aSCNqm6)H%~_jtIh-i_>K<%f8Q_=Wo+H zgRi4U`c&4w7JI`9UhLqDN55*Xo%^CTz=K}NEy{Q2K=}wim)FP>Z$R_B{}S-8R76;Q zq;!xc7LNPKe4+cj2oEVeR4RV0l)vESB?ngr5%-|*67PRBXKL!LqQjq>4<BCp{zhll z>b6BwCeMw7sFT&;W?E}qZPi(9IOvcdAOjJ0mDq7S<ASowQU)wS%^r54h^vv<A=)mP zcxXG8REwhhQdHfv_&e0y_CwOaWBhSbN+Hyb5%IDDDIWN{DSc*N&~g8nLa?P%Pu}wB zz=~dIM8{43=GFPZ>wKFj&xupah9i<FD_)B^JSP<(YeDbD>l;&|r+IhgJww_})X-%z zXB08J;V-K<Ge7}0dsDAC5=t7|@czKAAPO@0N&Qcr`*a;Vm$T_|fehH2se`kRjrH&D z+&Zm(pF%c`9R)vcH%N9b9z6v!?vz}Iq)p!vw-@hZMw%aXx=$4*Mw;&)uOQb)I&Wl` zX`Ea)9IEG&)Ebd7b|}`q+Sj|p|E-$YgJO!jz?OQ6c6ByxiQJ~fx(lP~z~a*!23#Wr zVmZQ4DD2;l%p$XzS5I_3n@kQsh@}cvyRC^`e{fR)5(ekMgNES1{r>W?;X)jnt7f#W z-htxh1(^p3*e(oie6)CPg!~abUE&uL^kdU^bh-O+KbgK7q&`j(OcuKsnQ#MkXMZ3i zfS56W#S#5RnhUsEvK^8kogKl@J<9q-rH&D^BB9c*QZ7`VX?fv?djHg?<OcrQZK_tX zDZL!5p#=MUY5-sLX<xco{4D;W`H>^KQSku2up?A%mzT)uJ+2OcxK~7a)7-f)VfLC& z=a{62@|w<4XRjo_wx+KiI;jLSY~tAX@Lb;d@Wj&diRZ(j^};@)vub+uE{*!+$R8ye z@Ehzm&dhk3Au)D*w0m0#%q(ofy4mHpFn^ZEX$(YlSxwX#UzT!~3hW9L$3Zw8{tQKJ z2#t@i=@|TZd9El5?L9G9{Suk_WJf96EsAM+WY*$#C?tus>a22=NSMnx0q*1w8l+=A zaxn@|L+S8%x07W&fiw-qv2koh*Mra=Z&k3na=vn@Wb~$VnQu87##RonoT{`(OL-Z} z=4CA6ijZ6uL}4#CI-`=29t~mC!H5oXqM#jG(P5aSN115R?{DKF(_))kB?EAcTmZ32 zEFMOdSj@~>WjHB-!(o^s;W&c(8k{bzUg|o=VaEulcI>9)vJ7p7F`tI?W@V*O;sDN6 zVsCr3sr*)>G~Ay%zz=yeUSpM;3xEZ6Qz#PdnQ|U9+m-2rUKIJTI5nER6h4oIV-~Xo qVDy`z970FX7%E}$?vxnJ7KEsFzle-d7$VAhsraD9*fsg@X8r+)7tweC literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1ac_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1ac_states.bin.z deleted file mode 100644 index 5b2ddbf571af38fbd8b55be16e93a4fb671fd1d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13972 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 diff --git a/client/resources/hardnested_tables/bitflip_0_1b1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1b1_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..860f486bffcd827f7f6660d602e9c3d710fdc917 GIT binary patch literal 13188 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1b1_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1b1_states.bin.z deleted file mode 100644 index 61ce910726109aaa68ba6f0adcf2d613816b7ec9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43310 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 diff --git a/client/resources/hardnested_tables/bitflip_0_1b3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1b3_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..8afe0ffb979e9e9982588f6c9ee65ca488b04014 GIT binary patch literal 3233 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 DLWHXf literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1b3_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1b3_states.bin.z deleted file mode 100644 index 3825cf8b843e710fbe50ed2938ff478685c7f0f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25592 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 KlTy5;x#MpS2`O*@ diff --git a/client/resources/hardnested_tables/bitflip_0_1b5_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1b5_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..804b581f864cee70a77d75a8115c24d3aa04ad4b GIT binary patch literal 7149 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 (? zLOGxZLiu$iAhcIm6}^BFcDulSd>T6;hH==TqL?fxmCHt1e6RzW^Hy~<8$7OJ7)Jv@ z+-ewLux(_djsRt4>A^H3?JsoXyK|DplEiqn<?<^OvmT!Vs+Z`6Qa=A+3=j)1qHl-> zC)K5|4ILU1P?5p#2?d!VLg2di?&^S`h5>ysi_3C@vsuMA7?Wg>0)x?P3&k#ul7WT7 zjnr$A&P6s9qY)nk*I<;+E5ix{0x;_DxgpUqS4V^Jd7It*Ow_oJ+%mqHyO<m$1Z-7E zD)ij1fk6^3PPXg>G}`az&1Yx|W#6)_?Bx}d^`6Tpl>K`>_If;6R`Kdh;Bv_)kMDyR z-fE2K(fG1Hp{!-E>43l8p(9jxiVJ|g>?9A_`DQSmgS9n-MJoRIga``p0r*~_S``+{ z6p0dvs%4i2+G-zgC}FEklde_qn_8OrldhA^u(q~}^hM&OM9&qg$5(D?OImYfG7*2? z1Nsd-h45!ks=oG9O8kd=6?vXF|M_FE4;}|$=&%3FdryIIq=Z)G0<2}D0ZPDpkj}6r zP6(1wTdxfLnv<AH)~o1;ryqBj5<P|<Ym&8NS8)V4IIkPZ5z>tlD$P!D=PSIVQIi+x z;weA^D1;&p(t;Q!M*XTWFQ1&i(<IiZt2{xkvp@ETQc4Zl)FLa&6I~wA7wPkRY+{jp zI2U#hdYE~Y{-njd3cO|^+CJ2!RU+Q;+D7qKU6%7K_HL*NMCvr_Dg<kxwVqDW9HD9@ zhmkFmOT=ISHGH3|K}U0kw8RCuXs{qY_8NTm$}+Bq#c_Ri`8BqyWG%@Q=|m<bwF;p; zh1P^JmTYKVz}N3>dYqnKApClwt%KRyne7*_ch%S$$kz3xMdX7&{e92fch|o;!+u%_ z<{p<^A2g<^lvUX6P1{)x9!^dC2QqT8?yP82ue+?6sqLsvW@=tOz@3V7u~gV=n=frR zkfb64F1NYiJAMg%LjOp2HSud%`10MiRio+`8-D03E_$|znVQO_CUdkd@X#cqn<zLy zCITw0c&yRLfXefGiWmpLSIF7j*ou_8AkVrON@dAgL9ar;_Iuu?bU$B*&c`1bT=ArT z|A!SryAuju(}UY%&p6&hreIT{u+{74TTXw5VqZjPcH=U?!r_|ehvS%2<XJ*~vxeng zHkC|qIF4TChx=$u49kQ2xQ(Vp&TGTC(7bEq0^0v|RLhjDZum*l%Go71w)kyRf$EoJ zNStt^a5`iZqUdL9LoB?Q0-p7ly!h|ke-knOcjAAp*O=BZn)6-!8`r<w4fjdHeM7j^ zdyCnfd5eoj6ZP^!N*u|KOnjU5i97!D8)32R%rm2zZ-X|dh=eM7sgo(q`UMmjr<18D z3tm#4AU~he3E}SC8dTEq>AinRQ&abgnTm~m7)!bNLgzfH;MeW!T^YCd(;<%g`+a}; z(`V1E_<^Nm``>qRv*|d%l+B6alL35#!ekPdc{o!{R4_i9&*k*U<tTlaOGWfIp1m!F zd=YWjA%z5+2@MpZflbj;g(@MW57MGFuz41a@QW->553OcSz5WTi;$RwiNF>djE}nf zx5PBo<0I7UX^l~1I*@QU#>)=tEI><n9A3<Jc~9q*8ry4t;<U70<%KQLeiTHCqs<l( zxOevM{J7PG-IIV(^g{n?$hs3pdefkX(`Z&+lz?&gR(ExSO&x>8;@Bu_$0#miu-6w( zoy1ft8wwywHZVrCI=dknLv(lAb~L}>h#IOIg{wL<7(J$|JHJ;wZ|^&@Ho)se(OR2o zN)3azK608>H_+H=;+O`~N3;>02NJnNcyG*FAC2lj*p!d((IdJx!o1%pOX>9UCk@>r zUMWD0DYburscz<5om?D)<wPBkMjzQeMqS8=vptMe%}z61lLla7EN+au{B$54(KMqY z%1_Ei6YPUG6RfC4Gmgi`pxiOuhXeEtMq}UH?QWd$#0kjpV;N}OB+xH^EEe`SA8%LA zoXkV<C)7j#MIY%L<qtS}L5ur-IK-HJIn{U!_dTjV?nRd|H;(f_Z~Fzm_VLcJx5;&5 ze~r)f*p9=G8~dlD%8MR58Xx9PO6yUM$L@&-eY8<+-c!Gi)@l)J3a*YJP@#Qdy^SMk zvXcfYoSA(O@tXf`fRB>Sf`EsTrl^^ziqQ}yTF$YFWW8~XkpsUwYNU8xmjQn6+Y_5i zJmUO9-}d_(PjoAoWs7db+xOq*G2X`tu$v}6C;#lQd^hs@|9W1P2vLA>Ld4!WY`UvH zfgOC%_#AP0WP51e@^yY2JsZm|MPZ9v3+!jzB89x?+h>@IVJnhz>aL9Y1F{txd;>y$ ztuTK(O8LLIyi+*`j7MJ|8hlq{z2D`0j&J(E=5Omwq)%{N_54W(+kJ57rng_j4Zk)W zgb{QtABy&GX3jc?B@-=lnkg-GP)IwbjSA{4oPr#mG!XfZ?h1G64BVZapXi14d#IVD zk`Sc7^Tfq}pEnOb{`7^9@3y2!9=z$znd*=$@7gX*@2j;XOS<57ubax(yhP^D_|2>c z5YzL%nf>~om%6|4+DP<K`S>;!-?_dyu*gVhcbPE;pXf=FbFuAgLcn{y)DsY2o+wjO zg1ZdM-O&XHup@0HMuFx?WaDxhK@KaU2TSZ*ZG~~jNU)K-_osV(YYFtAUlO-WP8Xi? zpP(5k2krft;Kh^0o4_Z1(gi!^GrkLdS-qPaEX58El$JECb=^;F(JBryjB$+k3q@|D zseJkd9*?H;&qN>-yFNvo=;OQ$yoH&0^Pzu}b(L>C@2eW@p@#uAT^sWPr;AsOOI^E^ z;C0rDFc!FCWH7U6x#Ww8&xbFLjD&6Z32At89sPAm`zNk|$;}Vm%MBplpuND6bZ-c^ z?#P80&ocN-<df2*pn&N3+EX76jYi{6oj*+0|Mb=RAyD|1bGnry1SgBVX5#U~e<*jY zVy;2ue<<A=RW6QJ(EkyDY<ym|==w#3oti#-HfB5E7*MjeQ)#32+%rs7pYi@cHBZol zl5K=VP%9+T#EFAs?IEJ-YSad5dV4R&6m2~~=b6Ax=1@oGKVQ6kLi~1k{WxdY;(Om8 zKkkTMR$kZjL%`juKYo@jR-e9k@viroGzJ4Du25$!*o$w%R8RNhhRQM{pC(7xev#O1 z+8(oSRpi&1b-%g@7Mo`Z81EPDtgTGm!rGg*X7KcbygZ*P7}S~Qb?J1NAn5&Dt53>1 z%P&JS&rT<Q`n012Ty!F@^?J~92%9wVFz$ZBM{Uwctz1Cw!x_0srPBC0QorVG%c@d8 zy@pdEU#3Y%{BDO<hgKTm@ogRCy-p}P`owe}CYWC%2=3-&1PjtpQCriL3{IUcJheK7 zPC^}acNc8j5z@8Evm@0grx4E9ETgB6P_xu<oNAiOO5dK2s-WugDHoeUE6rRQr7(g+ zdJ;^E3u?(g48?_|XO|8#D#r!Uq^@|)K070{h2cNs6G03n6v+x(G0oe7DaPo5?7pjE zuA=R@E*#k5po3iQM^BB%rGhw<mxI}d#R(k;4!|nMf>DS`JYtHcxIE9L^MgSx6UHfp zIh`|N3BcwL&5tyw3=BM;Gc=KtK&FsaN6De#D`gb7hT77$Rz}pT#AL*t;Id559wtgt zanV&ptExVE;M&f|vMDjs5ChS7r&F#%bXe;^-*At-(oAx06?I|6RTfKwcyfD}mY_Ad zPOWprAUXv+?v1q3(b3+Mt1dt0Ji8WjJUZ43Nsy1CVR3*}GPPaUX(1cA3T>#g?)w73 z(Vg;I@nZ4@(lo)=c4y!j*=($hGh`uSg4Nvz-O}WuqJ>GV*S~$Vy{bQFU#8sf_TRX4 IxY^_X0Y=IQE&u=k literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1b5_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1b5_states.bin.z deleted file mode 100644 index 7750ad78f7722e2078634d4f31850967381f452e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33164 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 diff --git a/client/resources/hardnested_tables/bitflip_0_1b7_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1b7_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..8d541ff7d5bf9730a5de808f688ea99c23acf52b GIT binary patch literal 1984 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 Pvu+-_SvPzk{)>MD3xaID literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1b7_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1b7_states.bin.z deleted file mode 100644 index 1663d7a5ea36e971fe83a24c8db4ff49e868b9af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17201 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�_0cvA#sJk4?R1 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 W+&W}6cr6v~{FC6zp7-Z}|Gxmlds8?7 diff --git a/client/resources/hardnested_tables/bitflip_0_1b9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1b9_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..42269c116bd60f0272e78bf41208d4fe45285bb9 GIT binary patch literal 3840 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1b9_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1b9_states.bin.z deleted file mode 100644 index f6b102d9af5ae5dabad7ed996a2ea5ab24102ca6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28244 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 diff --git a/client/resources/hardnested_tables/bitflip_0_1bb_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1bb_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..f1f353e416336decc3c10ac6b97518cb5dfb97d7 GIT binary patch literal 1940 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1bb_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1bb_states.bin.z deleted file mode 100644 index 0e6675818b878bf3320983ac0486f518bda764f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15124 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 b2`6p?Txh^B5$p)&w~*Ir3@-n!#W(zapS&(4 diff --git a/client/resources/hardnested_tables/bitflip_0_1bd_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1bd_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..ce30db7beb1ebf3a7c87eb9b28f0d6e0f5224576 GIT binary patch literal 2706 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 ag5)k`gWUQ09zXg0RwsL^=`_s&Kl>lEm8L`h literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1bd_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1bd_states.bin.z deleted file mode 100644 index 8e991fcbaf8823d98c7947e7e945b6a5eb2a85c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20510 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 U47SD<2*7^Tqj0vV%YO8K0Azjpi2wiq diff --git a/client/resources/hardnested_tables/bitflip_0_1bf_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1bf_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..43164354dedebfbdaf3016b280bf34c44326aa3d GIT binary patch literal 1567 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 K>iKus8~+2bWUFNW literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1bf_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1bf_states.bin.z deleted file mode 100644 index 9fe373bd8ed0f4f54b095ede1757aabba85a1b5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10895 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 PlIs7(CSUq|*1rD@fgRZ) diff --git a/client/resources/hardnested_tables/bitflip_0_1c1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1c1_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..a805bf22a96a8a3b6ec7e1221a6c247a8792aafb GIT binary patch literal 5975 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1c1_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1c1_states.bin.z deleted file mode 100644 index 1d6e2df38658903e4f561cf74df7c78021c6c2a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28780 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 diff --git a/client/resources/hardnested_tables/bitflip_0_1c3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1c3_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..5ef2b8efa8522205e2694258ff77b3fa942a1567 GIT binary patch literal 2125 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1c3_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1c3_states.bin.z deleted file mode 100644 index c47845644bdd4f2f21e89d5af1dd0b42fb28d9e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15311 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 diff --git a/client/resources/hardnested_tables/bitflip_0_1c5_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1c5_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..abc9ef501c04969917da8fc3cf6f3062badd6578 GIT binary patch literal 472 zcmV;}0Vn=KT4*^jL0KkKS*#@zL;$9!|5MSBumKr@fC!NQ009sHKmZj~5C9MW2n^5! zUH||902tE|glT{P0~%s5jW7TJV@yU7rT_p8X^6r!zyJVJQc<MRGgHbQlQKu7`27V! ztKbx*SOq?qC12(R*cJu#3j*LQ5iSDx1;C;{ppM|Xg02Leg87G_{zC>F2Y4&I71%BX zUIFq1!GVIq3??3+uee76c><~22`hkIfmFbR=oMT9a1w?DlLDtej0=FUSR)02a61Ko zf^ZWAup<D#j0*1s?iLSVV0(q?7+7#Fz$f4p;1R&7;t25z09Yk33Y`UkV3okDpd0~$ zV55P7fq{U)!v+_y9^o)fgP^Y99fCRp;9$VOsnB3f0}5UP(!G4gaKi=I9w06NyaL1Q z7vxxQ2VkDS>?5Fd3&0pI3c=8>1;98H<|X6|F2l%l9R%|Sm|P0@@e5SI!}1t74{-m6 zA3%<T4&c29?ihW?;CG1+ut|TQiRcQz62TY}uvGB{bP>>^oCv`y3d0Ko;7A`BB|%Ss zB!&W%ObUg5f-n^rCIA(JtSAgBFjazK7*d!f6f6uOg;)y;z@`a+SXg0LQo&#t7zKg< Oi@744C`eWki6Q_~$+DjS literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1c5_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1c5_states.bin.z deleted file mode 100644 index fd67e955c4a5c576fb2db4b8f53a04aa00d7de25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11486 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 K-pQep4gUfIcl&$* diff --git a/client/resources/hardnested_tables/bitflip_0_1c9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1c9_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..6d8d002e6a5196416ef18208622169772ec45958 GIT binary patch literal 2501 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 Nsg(4d@$v0k{2y-&WUv4L literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1c9_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1c9_states.bin.z deleted file mode 100644 index 88ab2a968b9a1edec7a88a4e068bb1aee114329d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18237 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 diff --git a/client/resources/hardnested_tables/bitflip_0_1cb_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1cb_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..e9caa94a63d622ff914f025d06bd0661b2da5c6c GIT binary patch literal 1466 zcmV;r1x5NoT4*^jL0KkKS(w;RrT{6o|Nr$@L9>bUK@>m{5D)+mKmY-l0r6lFK!i{^ z0Dy=9N7>*DzW@LL00000000000nIToWYL7dF*Lv?0Spm=7!GNPlO~KN35liwFbH6b z2*7hpOqn!cFicG_34lWcU`7L)Vr0pq34&s2fJ_1yBLXlS(-S657)%orOafpK!59&M zDJdc%dVtUr+Mb%4c&C)p)be71iKnJ$YM!J$T2Tu8uwHR8J=N%9zJkXX;b7?<kYggs zSf&axt1ca#ju|r<jC7raWXh~!Vwf;db|<uAF=Z^WWtK5nhBCOgbY%>%7{z6lSy1@b zOAMI|3G)=VoEeO%kT^pTE9gf9vco1^0pQHV!s%i-7e!`VTvizvWlUkf%PbsWVTHoW z80?FMUDJc2>{nxfn4B&S1~GI~D#Gc;W@cw*bc|(W%<P;O8D?b8ha5&{{t{IftK&Vv zeQrL%@gK$Wo=M`T6@<&N|4YGngUoj$gV#D^>l}2d@m>S@zW3gF(w+ypR(~az^?t|o zc6#f(@m{6-)6{-P*m;ZLBjG(|mG39Cehcnc`d4LMr~J5w;QF4i>j=Ho@*NH@CLdzQ z^ceH3UQ6_Q?DW3Zlff~D9!rO~KSS6biT+Q~;yhLTACvQVJ0IQes^b3@mj{`CM`N?p zz7x9X+{c2epiD*m(Qu{2i-}*cLa$fc3E2CO7m4s3aOnEqIp9thrXK?EFW$Vye5Krv zJGh;U?mA;K&uN)(<Dok&bi=`SCyVV^d(ZP3>pYB@WigCkddJXv=dQ~zy^`qcdj@fT z6Z@a3(yrsVmk&tvuNCyC;(0tz7j^F+Qoh0Zj}?5S@{e&3dE{4-?T79=93K*QIFHoJ zFJwLS=wEVU^LI~i{Li%MJqMEZPe6R9wiN6i7{!(|D;RnX9@=zxo&}swYxCjgW9fZ| z=<_?Lb;s^s$$rnk?)F~OJ(oup&iGb+!}WdZ<~&ox$=QqGOX6G%oG)$hFW@-44(ZQf zH-W|6?Cd&RIL^jgd7UfWJ2Ru{PQ#~8?9MR%SA(NIVaIo@9*1}OA0h0Hm$3R>kC=J~ zk>b6;^E!Ag>*hWavU==)0eRQ1W#}I0JdXx<c3nC+o=f98U$OE%wbAc0GG=C8cb&!4 zC%j~NCuQVtcs+IK9hZUJ?&)-NdrwOv{n(j>V#XoRtP2N%QH&?TUXvXvxEY0tdk)}w zRu|r(f#SSO7Gz!n1`@hOWUoq2DcM~Ev2;%E$;BKU+*VBbk|4^gie-T@WhIPEQG~II zVqjQVW&;$#SXops$gG(w63H}>%4$iKg;*F<7BXmL)RQuVSuqwEWiqJ75?H_tFpDx( zmP#3vq{c{QQcS|Jkft#UJzOGHQ~nV;GNNLoVPTRoSg~Ns21;1UV=`G7WXNM7mMobV zq{OkAV=ERcF@|PlGO>k*RfNTrjAXJ_VzGuY!z>uE8HQM7%Ed8)WU@0BQw%X!%$8Fu zV#;Nc3{06=!!<J0v4&Y@EV9huQp&2dlvNl{e<}JPEW|SvSu(J~!7{Tf#fB>x7A#gV zjLgF&GGa`b7|E7OWr~X#F^jO_jAIzE#uhUfCBqjK!ICn{%wn=(V-;jsGczfa!Elk7 zGZ~c2EU{)-qa`O73`R)CNrjdfQ;LO|7BZF$7|OzBOlD+QGZ~7?tBSZ_%w!y5n2DGf zlEs4tP87JRF<FKyD#0?WRKpC)%*Iz06C}!6V-`rtSyM7$z%eq(P8BmMS%xwuEKJ2_ zNX#<HOqiod3{x3tRKmtpjIc6gQw|3PFu0(?Sz|3zBPLd)oKrF}9961}EmD{;OEDRh zBV$7XjA8~bWW@}aOvtRoD<%}iGO$X^DB@t3841OTab%Wd7GPw`6__PqjKO07#w#XS UikX!Ij353k<ce^iAu+I_Ot+b#)&Kwi literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1cb_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1cb_states.bin.z deleted file mode 100644 index 31bd47cc6437d42c4a53d0f5f85fef1966b00251..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9394 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 diff --git a/client/resources/hardnested_tables/bitflip_0_1d0_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1d0_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..26a43e303678add8ae61b14c78774bb6217abbba GIT binary patch literal 1281 zcmXAoYfoAS06?h<DoUn+mXWPPxG=dug9Mi~Z90&Lyj<bJWk6~R1RJ1P(we!xw${>W z1+?RJoshP(3Y2@LtuC6Z{Zgd50bLVC?3SfV9NCw3S(7HM$+l*j$&&L2PI69<&AqQn zYULQM#9#hyuQ_n$sq+P+1&3qkacvSD&WFQwZq>hYFr#6>RDeo`dJ-<D(@EW6Q7A3x zIBjZbL|j-|S)o9&${U7hJR6{=6CcZ78=xzX@jXWw8U8H(V#Fhe6f)rq<OZ#5kJ`wf zW2jeQw@AY^OSqzjZkh~JXR)AK*F=`7V;#vtWM0?=n+c_)YrGaVX9z){nAVafiP<Kq z0C0ixG{1+N%tqV92-5RNH;>uNp~6i>CSS}uwXiGBpVab2R;SPvXP=<P*{)h@P?D@f z1WK90oAqm@DA7~P*lZjV(^7`W<@bl_DKj2JBkj_LEzNA3W*o{CI%qddE{U0Ia-)!t z{P|E0c*Wk|$epH#1#q7{5@)VcYSw1J?F^>$u}?C~>SPeGX`G^jj>L%yOoof7dYg6_ zT7D}{5)!|e7um4IDY|;`Hqd|5%JTE5S7qQ;-|Oh1pZAHYM}dv%S>oAfLkavWrIYT* z`$i+;a7@7T29`BegXxQMgOba&p?Ej$dMTw@1J$P`-KG^STj8M)+jnd}fik&!@*@LQ za39kxYE})9*pZU+>v*3oZ6p|tcx77Af9{%5*Kf)<k5mJL*aUoF?{~*T&#j+MzRkuK zs@}m~zwmTDqJPCvdGAg~8?G-;7sQCInK%SE>WOO}e{X1ew<C9F`RNVmDZm461K7dy zfJydT)pEXsfOgpMVG2sQB$rI&G&b$^`A(z^2+$ns2q12e$wL8R>yEC0)|p}(#)lm` zE@qh|QF9(~*{h@LNCu-66(&+<Owf2a8~P{mD|?V;WX_Uxh!wn6Hx&hWjlwAT!uNW! zI`-t~?{{!H-qsN9fT|8xhr{c4S|y5iUAdt__3EDCX(D$R_dgUULTODCHL7lLW#cbD z^X^hlyRx0c@y8&gk3W_OBQ>isP#x(rZIX!oz$lv~xlK*MYqr?3GgK)`QAA<SSx7Yl zwDvD=Q$os0LTo!Wp|*g_P9xM+yDKsoaA$Qvg*}ycG9nUX22_QKQPX3iL6p^57LJ+u zh0;P7F9l5@fzi%*odx9xw5%Q3W<=YvR^sVb{i;&SNth?63GgvKCO^SdGG@tPL^ZDI zEDdKh%1m;+=7#5xL*piZJ8vXyv2`sh?CkYx*!Gdb%yrJ#LVLiuxFmE{p7_S;@|VJ@ zrI$m`!QVD#36ogf9V}{F^Je);x_|9~=Wg-Q;g5bg{_JJbrZ5hE<+7mrn_wB#&0=@6 z<cmyetLin(>|)ZmO1S2n4_ZWt{cR*gvQJG?<&9vuah*%sOFiNqV8tfPaNtdnmdD}8 z#l>iI!mf-%+r{jla1I;-2U~s5{(NUItNKI9{X*AW-H4q|@2M@ZHbtYoxitBdc@8Wq z=~zE`Nfvw9-F9Zr>W^D@9^OCGbYGb|vP%5G6sZ5B1$<D#KsTBBn`x{f!Sb+i7lDe+ zUQT*Jg8mZOJjbPnlia8xjq($ryhq2OC{hk=ik_&H9q1(mXHGGb&r+D{bmRhe<=s}S gOI1{M%-jNJDk3mHWu*QayvMxOsp@|3*6!i|0RC|M5C8xG literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1d0_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1d0_states.bin.z deleted file mode 100644 index 8ac5e409937eea627a05e54acd4932d8c64dc28a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15272 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 W>0_JYuFJfW2R~*o*wXUwPyZKh_eM_u diff --git a/client/resources/hardnested_tables/bitflip_0_1d4_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1d4_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..15911b954fa9fb84a164f8f4cb57ec46a3b52780 GIT binary patch literal 6278 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1d4_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1d4_states.bin.z deleted file mode 100644 index ad91ddea9527d5834498e8b654d21ce620f8ba5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27477 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 diff --git a/client/resources/hardnested_tables/bitflip_0_1dc_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1dc_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..ab5149491c274b269f99c2cf4836f92fbe132737 GIT binary patch literal 1436 zcmZ9MPf!zg6vsnCHes_<49RYOonicwNF-sET~Bld9r+_DWc))&_}R(8?vKvY)(g3z zR3(ALWH(g{7IR><PAw3~*xh=GGg`BoUH|k_+LN9dkb~3Vz;vipE4I0|?;YOvo!<M- z`^;<q`1D6?+bM7GRPNT5u(9*hS^jsM@Kb!;P;IC(v|9}Z!??9v`&*^{C%!S9{%}8T zz+%%o|1XVGeeV6~xsK0R|K!C{-+R|n+C<eYQH^6nTYxwc#@w?=ucY#Z4T^O-8hU<Z zZS!LH=GcMBFHGdny>!(1-rV;0*P)TnK@pdv4BazhGvORcPuO{$4*Qr!O$IXrFsD;` zsQGaJ>SF#dcN8tCCpdVh)rr;hCaMzt&0PbxdVVbW2aWEKu#@gwl?0BPHq{Y9tE!?o z%EvGqAEq!m=tN6(Jj?P`DFl-Yr=+I0>4}=ujRf1|R3^wc7o-|GEKil<N&?BzaHFbl z>f0UhksG9-i&UKqMKW~&-2C+J)}{3W)6arsK>mT|t(N6$`NMB~lb7O*jZDxT&zS%l zCV;G?BxS!~QR-VgW!rkLzWw?W2!WgiLAyxw^M}suf;oqi$$2O;xV!){!$zoC>T4?Q zUiFRP0~<lJz=E(JWie7XX7-fp;CBO6t{7tGyt@Rh*y3}Io0feLB#GW_I>B@k+q9C! z;s7$ky-WHp9Df}>=f%MHYlV^X;E`EV@9(oXl2mgnIwU<1|7v+}`Qbt8yu<PY+O}+D z3-DOh9@OGx4rL*f=pf}w>G8tIXsiEz6Sf^M4`bj_?J%jHbGQ<tk;tG;bX9K*OrERl zjPj!q@L*<-gCdCDXVH<!!Jlo)d20JpRNMW0eLfDey=#R+LHqM;aRWur@hNqKi;78_ z)$~_G-LVzRFZ_C@VZ!;^>wmmfXjU#I$xZ%c_B9zwZ`5~_rL?8?6GdogXr%*CPtvGm z)b(;+9=voH@ME>;z|~jv{cl{)UNsvZ8nqi3esh!DQ4Ad%UwCU}dh+<z`3r}3<g1Rq zb1poTZs&ai6-t!8J9R8f^X#xOo9{>2MJ+4H?f|@vW*S(UG?sU-&fBUp9?I)u7NJ`P zw=#f}vSFfHj}IR`W?V3d!tNrH`I8K%!;qj<pw+qYEqgD1wK!GG#g44**@ik50m2|< zl_?T@1v5mztul{Dq$f~Ql>mDwXUU0VE=#~(yXYX31mOF$tW)JwPEtf1<^-l)XUHVR zR%=jkn1$RVYI1_xe4xt=SQdmthYc?lvH=tbbkRps8Xxz7B#qBF^|04#=X8b-fShOp zK+1b7vzG8(Dac5_20qWTsFWfjJ3-HYb5R?>O{8bsf(H!B?v<XAzCh<bqdKm)D2W)- zB!pJ)&`f>cC_+$TqAmH*q^9Y7bf0I!hS5MR42xKk5RJ6Rh*_%92?}VJ{hcev=*AL7 zkukNn0;IVHg}aVfTo!vQb0Qi6vu#SOBxX>CG7&wq{v+ktld+PEs*iSq5_rU-Yje(} z_!Mf4_`>c6HOEa|C#$rK9|o;bzOAc4SkzOJ%vVS#0^MOEBlzX|4$PO~Q&8uWiea6B zGkd?}5L(QWm|vm$`9Rp+VeB<jw!4+_m}(}hGGsZV@|;#VN1EsKz3dqq1-wnT#$pcp zxC-X%L?BEsu&Yt_0!ES~_$`ozO;kme-q~9XH;nV~X<TO7QM$JJzPZa>9<0{rljVUA y0MD?McVRNslsgK#NSpzK)(yjp63{OjS-qHjp|n;y+dtwx_iW>l{^iF@hJOKcu^-O> literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1dc_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1dc_states.bin.z deleted file mode 100644 index f5b1dbb10e19e39f79bf1472a1547d09e9d86304..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18443 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 M&;IM3xBkQb2liUIFaQ7m diff --git a/client/resources/hardnested_tables/bitflip_0_1e1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1e1_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..7e4c4e5a876efa998dba9e5ddc0d52e073236520 GIT binary patch literal 13795 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 DeTP44 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1e1_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1e1_states.bin.z deleted file mode 100644 index d475d977845b6af0f9c4c8f1f9a7729dd69e446f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42909 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ℑ1CrS^h}NZu2*rbJn*{u|6OBw; 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 b8B=Vdd#DSfFo@&uZ$`2JKfZ5y&X@lSP#I5o diff --git a/client/resources/hardnested_tables/bitflip_0_1e3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1e3_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..887da78ed508beddae7bfe7f297d5781e24624b6 GIT binary patch literal 2971 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1e3_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1e3_states.bin.z deleted file mode 100644 index 64884ba56b2f7ab45637b6a9953a3569978ccd89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24210 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 diff --git a/client/resources/hardnested_tables/bitflip_0_1e5_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1e5_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..43b2cee21b78aa1d46490d5965bce370d876b408 GIT binary patch literal 6318 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1e5_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1e5_states.bin.z deleted file mode 100644 index cd80ef830bd265a1658bd0200c666a752b7df5a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28272 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 diff --git a/client/resources/hardnested_tables/bitflip_0_1e7_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1e7_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..89ebe72a900ed00ed096e9a85346ac3834775ed6 GIT binary patch literal 676 zcmV;V0$cq;T4*^jL0KkKSv^2?jsQ1<eR$Cj0T2P5Q4xR<0T2LHQ2+oDPyh%D;09j+ z0000001PrPCYTc;iK7Dyj0vU$$YN-~!y^J|fif7HFfho#nqW+ZCX5U+FeaE2A&H{^ zq@<BDC!sO}X%8lo+w&k*FY6Ks>`JO50ZZqHfe!*0SdSt&OjwQ)Sm0wRh8SeT#XN=# zF^9--I}5Q>31C=<#Rf4|^+LFVrIf6dFtAoJ7%)s=U>H$_Oe`2z$x5yvTq3YBgDi^} z$}-4g%M&G($%87(Fv7znhGB*?R%~}FOM<0@cmhi3k<o}c7BLu@Sj!nOWrdP>1Linf z4-nwH2<{^Uz``(?m@$bwQv(shD(RIk5-YJ&u`w7)Frxxu7y}Ch7)A+VVN(kWu(3+3 z35j5^7=4yZnQ#N3Vydx-;8+|C6c{j6a11EHU{%mwVfQ2U80;5t7!1P~z#j3z9R@rM zSG|RdmqCn7Oe`#8izf>d?hXe8;IoEBJWq3jgDan22V%np7|8D!Gdso}uU387amU>9 z4>5xbJH+^ff_Q`83FITl7%@B8`#8)U5_v=Z2L~<#g8f41VBx}g9>X7i^$&m^f~owe zVKBnPA@mC94?;Z2hEoZK8De0@CI(X$EUd7~VUorrVyv?WGRkCRSY%cVGO)uHgA5D- zg@uWXOkm<FkDy?%6@VRuSg<g`ixObOOksu?!93I}iBPhnx)nakRb*7?DTGtp61b2q z!ll_lxPc#l1}IaZ9m1W#V4VcSF%uYAn8qd!f>3*95+Xf`0%!^e?Zrq{KO!<JRe=}* zF)&nOU<SoQP>d49Rf1?%393PeVwj5xj0PxU35Eh-!j*#o7{taXV+Je>3>0Ah#oUoj K6eJH&9b<qUcL0F^ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1e7_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1e7_states.bin.z deleted file mode 100644 index 42483bdd523ad97cf57c567a20f51d00808425d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10545 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 diff --git a/client/resources/hardnested_tables/bitflip_0_1e9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1e9_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64ab8f4cebd1c24d3f9e5bfa4061d15784f3e251 GIT binary patch literal 3842 zcmXw+Yfu|kmd9~0vVmUn(1Y$NjWOr}v^sWoD^q2vY$rAb+t9;H54uw<rloF@soD>= z{Dra|KR^hOda*zcT2mD96I-CcLQJZ{PE0^j%Th~~WW09OytWoFcw$dx7H=|+pP5y* zcF%`X=fkO6x9<Jj|NWms?|)c}9i+4d>cgj}?r%9>-23!F#{-kBH7Do7_6vE%IXT5S zyWZQrQvG>O`FlD4AD6R*EGOHOQ}DkzTeKEr)Bgn+wJ=LWjs)ccs5EB_r_~Z$mvXH6 z!=5c@PJYnzlOtEIqB+H~vC-o9w)01v=UW~h4(svv(unyjoS1{?(E=7|(jXB;0R4>- zu8j*t$P{a*m{0_t=E$i!zzn#G=ZJ%zYMf(PIFqSy=-?E7(ILx(Mu$Q;2LS%VR#+J0 zg+N}nlfUe#F-EQ<H7*$B%wV#i{a2Om%p80hetXxi<=&}!!Y)ww5L-Xs%44^Fx)Nu7 zQe>1@Ti6q+5+T0Yev<Lge#je1(jG|Tg7N79Wl87Le&klFt{`Y>WZ|UN63ko_Cb-6v zwohG-lGG4NqX|gXIopiPwy!PQRvqBN2g+$%s9$r@XW8(MAfE=1z>%^Y^&T!j52V#h zc!L&k+llp9Nx&s{?PVe~y|-35yZ1zfIXS3qHb~(Nz5veW?Va(iXRK<2M=r)daUNH% zuQt~=w0Vh{oYlrv#%!+O>vZ{c!6<ZdG^;>Dh>`9S5pN2=R^vy4R)h?tJo!X$Z;)!U zLvZ(1Q73O_k>Mk|$~5q-NeA;+d2HA6F?-NW9QC&fl~H4)j|s3o2v0Gh;I=dsN9-pX z35~gahit~)I00XL<KBAyT>h~d(JB2-EYLjPsHod8UYfr0(fuV66;ni$9L?|=H%qgG z;2`F;%>{-EVqiaf&KXV|*5?B5Oeh>rs1pjS1X3_af{e#<aUS4%ptpN4k0g?r-)+*x zgO3&M6gKKo<oVm_0m7qZFbWUVmMDFMujS}|8RNkf44Fhzqy=JG2Za+L?d*=>ku-uQ zBbFWu1&9efa>jIU*qiZ7x2E&gqM?v9yPRpH840B>t=q<RIs{@~=+Rj-{H(UKmL9ym z`orMd+Sxr#ze7ELC&qz2-kB%DNu}OTITt?O#8h~MKJZp=pn8Lu>T>xZ%W~CF62htO zxgjM#nIKOWDT=;6-(wqp4hGNWu3Kibb#K&uq68<%=-mQfOE;)lJFbpq$)_+668I=l zH2A}v19xw(32S0(d0d$|Ab(Ny=4{pL{i>C7&g82DUmUl7cOdobIQ#tLx9*IujdkUF zz)Gv4f!J4G6Tj<vid(;WI{5X>w*UB^PCm!d!t&}_zfM|SNw(5;-x~V%X_%>M@u0oa zBy=YullgbG5W@~HAAj9`wPh1NFFDvlyRo6v03K=5X~yDCaVZ9H?IDg2`SX0<2#6^1 zd`)>5XgU`La<@j%49;Ogam$oS1zE1xDOD*k&6Ic%#UY#pXwIMo@JOJY80e#nVLsHL z%at6Z0NFdY#{c9j{d&5qP1)0z_8RQr@dt*lr;}L-tWWdDHv0FJ6+sX*%A#w3)?%G= z2#Sjc%>~B)Mz8Ic5BB#DDwKPB_3&nw>#KdefpgzX=%q#fQoB=Y%G^O;^E>g+P7Ut1 z{ZPK}-;4eCp5wP-WlOKnDT^&Ybe<D30WH+Q$yX;40PA{S5zp-IN(-@?@on%kD|Z^A z`QuFQ9oK8!_trnIoIXSCFDsLs&(%GLx}bxba~VFsGPFy3?91Pb>s@zs+-+s=XR1Uk zNB0;rcRn^g6sW2{t%|3f-2M&xqHFvUKeMq}`#OJf&p=DbU;D953y+f`!;Zz!G=AWw z1KnI(y(?e6JLsI;S@m0+E&X-GmK7Re()Z%i&5!tJe(8qiKNq1%C7afN+u~c^WS+6y zVtLJ%2giEPZQFK#*>89v9%w?uG&cGj#C_Je@UV*8{9vDQXJF#tNVDSX#E$Ouhc3q+ zPf_^5T8vw4J_}hdftlm^z26-lr5=A18=pE2E<W~s50+~-Pu)wt+*ymh+JC9cfi7Ns zO)M%DdpB%)-KEDc{LxbRf4%Y57|-APT%0=cyXf&hzWku{UBB$SrAci4_1L`||6W;M zFF$hQ-Tpkzo3TRH3T{e^lJPXcr$ICgvVH`!miB<yC`YEHiXI>n;1len=k*<zjZ6)5 zgSlY~uB9<EMBoJGS6fR{E-g!70B<&D5luNvqa4pHJ1Hw1lNj>-05Qb|0^EUu#exWv zGQD48wtr}t?ElxloS*H`4Tx{biw0v$FDlOE6}}|XU<gg2%XpAM2uIbr{nqDb5nwWn zMeG7{!+&%sg$;L$a}EP2xa3k<WcZ?U4!I_k-Dr79A!P2ZB-U`4iA)hXH}5JDlW}oo z6qw*ai~$1%Cw@)V&BE)r>`m%?k1?&KiVAMaX1<afn%G^iR;DY)`ouU$krpe;u%tC7 zE}D-rNI}XB^L|Bk2XaW7tCi?V6Kw>JNOT~%WWm!CJUr(?P%?&bm>-#`F8jt&Q*>+Q z?@$9~X7z=tf%>%|dcAjaMXcKu=`Uf4vdcGiZb3~J|IzCysT?u>LrczK6P4&oW#h!P zyCq*LJ8)BjX)RsC;bOYRssq<&G~U#(2cJhSKiZjnSyNV+iOw1Xn^s}!r8#E#p~uIL z$sQ_n`|!Z3`<n-yD_G}K2VP5`(s=?lOZ4MbS=HYT%Q`j1o5R09cGYm$afs=c%13G9 z8Z4rrQ9RE}luj00KHd6q)X6eYRsyv{tnU?;sN-Y1b?TT@+wthl__m=0$XRu=1QPOm z^X7P=aOAo`9E#;?`qeC}0;UM(s}i4>$W<kfc#rl22*AhF8>g0%qCi>_KQ;cdvH1^| z9~R7({xtH*&r~oy>dh>cbd)Z!6cfOFY<I^4@r%v{f4AU=nyCXfAMD*^0Ul?%F8$l9 z*^c>pi^`MblKfXYFO9C<ZaDgS`|GVytV7ewGEAbpu7bytY`+$v$h308j0ZOtht{z( zvRB@Z=i%@&?;tR`Ki^KyNMT{%A|t%$Q+=x*gQ^YjKxG8EoTNyC_8AAC5Jboi)eKms z3N>~yfcC(vh<j-R$0>5o;12JG;8<><LP1yoKf%oLJz#T|19y})H+H}tjp5n$*9Q68 zk-o{k@OW9CU3u|jYjSWm>VgG)TjhyBo6pW$rp?Eg^*PF1+XQIAS*Tg6rbjS-dBmoN z(H%APo~`SHIh&sRlTBIL>z&K4+<~@asvkSn@uWSz?e`Tgoh&&ybUP<YsWAlx30zLq zoLe67H=ZnnYoQY=T|Og_841yH1qU&|YKPP_SZRxlG@Hqg@|s7grLf{&m0ye7LZMJ5 zl%OZ&19kCz5TyWEKja5UZmP3p)Ir7yfm?e=bS|wbR^`xvkLvpKGP8I9xd~W3RXfl} z2C$QMZNpbKlIb#JmY%TTf6fIdHsH|fOIp{V4p&SEDZ3DkGWYW9u_{FRBv}8xL|teE z+R27v@(UJMWAvBKaCnPr3%JBDfxl{;9&SmFAniPID^ePl_gP{E7TTfGBmL3}j|Lj< zm!YXZV@%6ruKcAUoxhSB_nBT#k2=S~YE~V!i-kt>&@b9Pbodl~Uc4Kh)2rjreuM~7 zxHp^zuTqMGe!|H5Jk<%ShU24zzs(tEU0?%?<4DR(XmPG}O72l%`bMiUra<0xA3hP( z`5KpQMcpZ_{C(#;^*<{K{=D)Xdz5e5MHO$zK2H+cX<Y?Y?_^b5xZM11ut{iNXvLi^ zV7fZfK!g^QQjY|y<uU}&3_jEX5W!xOj+~$|Cgy$$9qB{Hq3$S?72G)_OWjDv@QH;} zS~I@vS15<0gr-Fn7~nAPr`OjuNFFi>U(}AktEWbKCqdh1;HG}OXdBi$yU+4PZA}0h zSh1~abd{{NY`5Vf<VhCA6FRv&UE@vc+qbi3CHb`XrYf3b`RKxU!K7YGrg${LWU}rq z!^jzJtB4xKTjB=!2#IX;(wQJfb5?NfwDGz--e+suKV8%hbz7_og7v>eLyfp^cq~l1 z89d9+kB!3c7|UG)IF_3mdn#+W;OyPUIvPx7OQtcwB76V>T)CCY_LM5#e!Jwzjq)w- z5EW>URz^-6gJ+KE{?OWW-?`dSf{HAYjAoB+CaZ?-gaM&Z5eQ&3Zpk`{tV}`XdMg;2 zz8g7o`Vi;qh}h3;VcQp~g+78iEO;Bth}@;iP709fEgHFDA<YV%)?`meftXAdEmI4- zC1g({E-|-0D`;W5r&Kkx)1gk19A~a3%!iiyrPV%$l|{QD(%evB3A3zm@_z8K@wO%S z*JH@_Wy4Z1;{a6(I3w(YJ%WYfI7_-vR|<`3NfYO{7VZ*f<W8pBs**GSb5x%=dEt&j z&iT<$s>e(t-D!kb&MIg2Mj)Ja<#9bgn6)Atk%cmp{YwO#3E>q3b%p9ML0CrZQTdRF zG$_oa%)M#8I_$#(-F%!y84<vvF@VfOV>%#feT0jlpDc-j-{iuqg$g{agRBV6vljzU z0M!~KkOyFv;+7bMEd8i{tj5uxpg;;RYuiEYLb_4_Lx@Ku^J~p2xx*l7^DfPA4>$$i zfH&Pf7<NBvpKG67YAzM3BGEYu*%iGRF|q2D7EX=b5{+HkK51J{|8{MUB|fjU>M_oY z?w7z7DT#)qV9IE@;-qr7PL5svuEA){1xe&|o^Ln)tVQlj;x1U6GOo<la`Rx~7iMG1 uiq7j10K&ieCvG13r9-L8QD%Cq2s_k(<Z~x@_rs!pl-cU{wz_|udH)B8&0PKf literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1e9_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1e9_states.bin.z deleted file mode 100644 index d133b27a294d5b9fe30050337a3f5f4dde5de500..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28161 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 F{|{*}n0){M diff --git a/client/resources/hardnested_tables/bitflip_0_1eb_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1eb_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..d76993719f09a579fb5c6d66f5c959d14c725613 GIT binary patch literal 1928 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 Ttm<R@`JVHsS*d?)YnS{RA#h4& literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1eb_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1eb_states.bin.z deleted file mode 100644 index 7a3b347bba546d927dac6af224d50ab5a92c0c0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15053 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 E0Dn;gZ~y=R diff --git a/client/resources/hardnested_tables/bitflip_0_1ed_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1ed_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..8574c08f7f7377b2817d99a4b2eab74d1bd2793f GIT binary patch literal 724 zcmV;_0xSJOT4*^jL0KkKSxfJE<N!fP{`~Tqn2-P%5D<_M01yBjL<B_<Kmb4h5D*L* z&;|Yg000000Kg2IXfhZfrXxlS0Li9<A%YrWG+@9CnrJc@A*Lfn3;@ZdgCT+%Vl-eW zDIzKQnGror4=Ly%)AX57x7>=VpHfOeg(|PM68xTTnZ(LuoI-jGDa5Wb@k!93#K~DQ zr(%~GSbZ1tUqp6Y-f4>rrc%i~l6=ZcrGz;A5q(z&6kJ9|S<!S8<VuW^n2N-x?h$12 z2=h*cOtOq)7?_+D<R9S5Iyg>>?wG>H3|M7WPU@#&lCvf~7ozk-vUwn4UCdp~e2(GZ zUxUozuT|~`6gY?SaX6Xo7wAK|JD4zV>`1)Cqa{pPEbf^nnpYVyD~PxzM8X+mm1JC2 zF^Pq6vS3*pGBB{NI5Kc?V}pspJ;l;=j9|kPgieA}780k>E`)mp@e9~L(EQ9e50PI| zb|b-6cqMoj0^n28Rwh-9p@Rj63^I{ABEQ&PqAm(L0(Sy*_p(^U`3%9txM7mW$%h<C zj4Oh}hG5`jIHpDh20ARA7F`9wj*2=jAr^5=m6T%!68D%mSX9gwR!L!)%AMImy9!Rm z9v#Zyx-85(bWRhaGRJit)n<B~hFHrB$T5rFWBwc;1EywnJCg<Q4im9hyb8Q82+K1m zvu0!VKX<VG&M%qJ{ugBE|EErv|Hr6b0(yvJ3{&Dt{K8=$L$OrBb|vvI;qZ8I#m5eV z_C1Cec@ILdA5!)|v3`fVq5aP;5v*5b(=x*|@e83l6m~izqPiop?6^*cPMr>h7%^h8 z{P+}9eXx)R-lIsxVt|wFia{p{SW!`c`-%aHg%rhNr5LOVs>Tpef~-o!m`h<*YKX;y z6<C16#HJyNiHgK9Sd2=-Qy2_IfUH=S3?jw>V-R7AV8R$;j2M-R5rYE<{}*yaI8cyF G?|J0XGCb4( literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1ed_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1ed_states.bin.z deleted file mode 100644 index db5d216aaacd92d42ab4ad6982d0b02d7f728a45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10353 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 diff --git a/client/resources/hardnested_tables/bitflip_0_1ef_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1ef_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..7a9012f472da88765c2e52c0bacc57dbcd68cd7d GIT binary patch literal 414 zcmV;P0b%|^T4*^jL0KkKSyqOJvj7KmfB)zZ2si*32oQh}AP@pD2mk;PK^0K|5kW){ zKp2Do2w1=Z+yDRr01X-%FpQcF8fXkK0MVhN2+5$)rhvl$4H_CSjG7G^XbcKUkrFdg z6CtC`Bo9+*Hm8*I3aiMV8B(XiD!g*+KU28q9p_=xOb(}b;Olf<=gs$n^B=hN2Wk2f zgX-YKxKYWBnN^kyCn0u~F$`76Uc!3}UgCS-C-nar&3(?}gShc{F0<NH_LJ&xa2yAM zd(@w>jAt-;k#!kK%`XKU$%@7uLgb~`KAe0@(O~i%2MeJ-PKP1l@IG%)=CJE<W?yD` zoZOy_a(NxDrOoj=4|w=5_4Z%Gqs;mTnDvKp9<_qP&I~vfTo_@O3o{AeN~vC&sF0rK zB~+}v6sfX?OiHnmtgHmgMQM{@%2^8~8Bv2JO#>EHEHKKNq{y{Z9++G#77GPfSXp8# z3=w5mkyyw^7zP;<W+`J8GRaKJCSXv@2_|4H#aP6%0I`KxVwB4TS)mxz*x&fOk}1N3 Ig0wU}m=V{oX#fBK literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1ef_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1ef_states.bin.z deleted file mode 100644 index 15eeba048a286e14b0dcf3a087fdf20c612e0ebd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4125 zcmeHJT}&KR6uuOZ2T-cDCGl@oYeG{V7Ms|IlI~zyV}glGs%A^79a1zTO$?1cU<>TU zr^Z%9f)=m|vxza#P#xBdp|D|x*77HnMGK`ZZpTpS0$W&imtl8iXYO%;U7(~8B8g9X z=i%O&IrpBw?>pyyc6-XzS22>Y6%BmSMG7Z$uQiuH_EB<CT&`tTzq|dswK=)}@KdMn zerpCv787P(IqfU{ic`+&9nhtBpxJivUi<W3GTxooxCflR>F^Y^l41wx;}tvkLZ3%U zN(>|IcNo=9c;$6szI<L}!~p)(aQ~<=J`egrovF=`4@NQtx!TjqEAh4PJNWgm)dt?6 zV699+HyUmLl6e{Y92Ay~Dm7S2L~D$Cw`8=ArbDZrRVAhtOh-+b;O^N@qsGJR`xNil zp9kH9RYt%@Y@}K{X#jd%kXyltyhzuA2ywbeksk>)4dZf&&Q^m(>JQLByzjyhxCO=P zHYTcBM*%#S?(nneK!D8-@B+BcQ0VQ8#-A$%@%gpfvVxZsZrCl|qd|CbNo7>^(mWkd zC||-g+{62VXXev_kcCX-IImfQ>LeWz+cV2oFr{%zn;yE@eJNZjA9vc=d~dj^GigC) z0505ti5>b5rH~9mVwRe(j3zb0AmitV^9j9&_9aBm(owvz8sAN2N`XG<`cU~p%NxqW zTcj3<<Z2whxB!{xj*ZX8x?eSzY)Jli-GSsWL6a81GwkZ3)R4AqF70a^#t6xD4;RTX zLZWct)CXc<&@_p~XrK_vsS|eo#{1^sO}Ed5;bymHeKY;JhL`w717_)}c{ev?O+={t zt$#Aikt`K&CQFv@?9Mc^e6s7~`(-dB*lEZmPP5_QKJYqzDk9FRbTi7a8hQ=p;gSwg zsnS~X3)BKN4g4t<sJ4UcX~u&+I0HNopEc;gEj|+mD1g6_y;JfVU{r-x(n2)i$!U&d z564c(glg#a5-Rd-96!T{wk!**T+LL5VIGF-j2YUQc5YKx=_sx@zBG@f5W)Vok<j;) zW?Bb%#9s(0C<_v$Ur1trCt6-DB=a5aqPbqqRynd<HFn#>C0AX1WvQ&1u$O?~$8&)f z{*+)2;tytm$$cPrJ<f7WEzkge6Kq<AauSA9j(})@dm5Jltk161xX_^%jm<d5=5?~Y z`q%%-=36dd=QJrByYA)Xk|4l2u(2ss{m=rG?zY75quSWV(RL555xRr0Diy|aaO$2Q zb3sWDqe->!r64k-v!+eOK{#7hikb}?vIbxXYOsnu+uXd;r-5wsc=;04ti_M0?BCL? zy<6D7f@aY_51CI~dG?rY5$_DY*lw50(g3__{t+%KoQ8eW2yYIhH?a+lL(l{(N`7OP zN?+Yr4PC9jes8SjM`IG}`LUiK#lpICtmi)%o><R+Fdj>9u^aqSC>9o*zQM<Oel(!} Oz3119sekP#n*A3pvSIW9 diff --git a/client/resources/hardnested_tables/bitflip_0_1f0_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1f0_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..058cbfd8224ddb270471570d8f18cc296e763c80 GIT binary patch literal 511 zcmZ>Y%CIzaj8qGbeDUz*TSkuqUs7-0T*1)6z{$WE>cDW2frEiT;sUE30|;m^NMR6M zUID>b^L*XrUFw-P`5UM9YYq>;1sn7Z7Kk&gEKp_%Y?R?<ls)jfzu;gy;{~o)VqCk~ zSPnKe9p+J!ZwUV;c))#wsN8~81zbIx+Dz}bS(^+Z#0!?O9Ms`BV4(bg>mBzK9XZFw zPvQ-S4mXxF+BwEG%5crlXV@U}fQOmofDKE6`wDG_7tBlvKr^+OxnhrREkC^AFv}a! zrai6yxcL^^G;fG)Z1^DXh3SQ8>l+@u!#7I!8f_206Te`8;b8M8gAam#I5vnezOi-Y zZ+uevMr_3fgVoGj1_pLa_7mC<#JX7M@G%|QP!Pl2P@unHPh;Q}fdsELtO<eo7c|9K z6TDdxCN?eO<`S)B@~CrEO<;*(nc5ioo#S9a(*X$`9uWzx13eNzz{6vZm~b#cX+y%& z#-<GhVH^h*GlkYQ*)SP|Hu-QJSR<-+AYq0YQ+R;Lx`uTd6%)25L<A;AL`3j!ci6Wf z&S0h1^krNjfnT^*%<#}KP*}$0_>E=i0YL*%A4cbIngt@=4Iu@=jGhs~jhY3XdR#r? vOoyhkbh8}NY;4uhIv5eg6`{tMnAn==&DxNVAjbYr?@3p|LdA=RFW&+Hc!0T_ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1f0_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1f0_states.bin.z deleted file mode 100644 index fb3df75b7d453231f20ff4957a223419ac060ed5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12014 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 diff --git a/client/resources/hardnested_tables/bitflip_0_1f4_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1f4_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..69262a53fdb8a13e507af155ae5d0056251e95b0 GIT binary patch literal 3035 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1f4_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1f4_states.bin.z deleted file mode 100644 index fe2d56c90e1654312abae383cf9801aac27dc870..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21104 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 PPzvMw3fx%m(T4vIYk?w# diff --git a/client/resources/hardnested_tables/bitflip_0_1fc_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1fc_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..c3d5507871b8e41bbb6254aa53afcc2c63c3235b GIT binary patch literal 1127 zcmXxjUrZBs0KoBs{-f=MuK#~ofX;Ok+Fsyy%N{yVRG?)*(=8Utxd`+QP3FteC?ibf z*8fP0ofD9I&>;9H2qa!jmejB;y`u-1_`n<w@ODc~){usn4aYxm^JU-1&-=IW%dbAg zPoK4T&z63_g(3<5o3FQQDbI7N7(tM5F^V9k<OouNlnBa`@8ti$@9OBqAR>C7g4ZE} z^toN?hX{gRyvBW!MT)NDz(pg7qOG~HYW%`+ulWT<oj#|VS9km{I6E0kS5h}}_gP=b z)TOywMGkumZDqZ0kZMx#%J$GU1JUa8B7eHlUz%$Y<87oZ&>}K?;HRh@Zj`gsK#}Y% zH@^E%m3-Ubkwi2#T8&rptK=}HdmJuMywG3!%oF`3R&{=Y3x$`oPr!q??cX3rUKw6* zU^j+u<Q}i$Rd@6Bqra3h0YGKWm02wILLcZ{<CFV_8g^~!Y46Ur##dML+n;|l>NCqS z8K3Gh`^F?XG>z?_a2`Znp3|<s6n@6sWNftI{DD-pk=_U_mm1f)UM2|ZiB@oviR*oO zI9CvfJqR^EnW-$ZPy3m99q&Fy+*2?lMbq>Qj(5T|nc#8@V6I%OoK~=<yfY@d!43ys zfeha7jRl3kJ+x&5Ygr>Eb{j5m72zF_PJ#>&mf=phs`09GpiT;UWZ@%8R!GIDx9zKo zHPNN=Te4Zm6-;M_CNK23Dz{XP8E2u!$a=J~ls>7P$!EHywMAULezPK*Co)7&`)dC9 zEvwMu(Hd$mt+?vocR%uf&I|&tN)#3N-G*49_v3oIE(a@encluVN4HFvVg^m2zg1^; zP?PNWVYz-Y!N*mhp`Ui7rN+}s(LWr$zg?AdF(Spj%KXfueXS}Q=n8pOg8A15qo|@~ zg9+qaxGA5%4eM3w2UF(k5ZXKK2&^b8R+{_kY9ccgLf?D)lc8?;CQNVlhP^`dYr7({ ztsksOc<<iNHysFS$&p6!ro^Y4S3J7*Am$wLnGM#YRuU<u7#uPbO{6KGT`2{ltue~& zvO&_H%~3?!g}JbHgB=iAPR){?jt=GpQ(307Igb)8dzjqMH?kvb3!kw`rB;d^gQEmJ z$K~i4wCgDv>tGXflWw7t(9q4OjWHm+e<Wm0U_R^=b7#DxKrB~tS%_Lt+k!>mCsBe~ zXuX!RV7fG10Fd!#(`1kz!R#PSk~lGDlvn2=WcyIyRVN7EXARmlw>7CC978(|7Ci;* z29bix5)2JzIiijC>dA-*&@|v9fPrLOo*?GMCLy(|e8QX6qwYQtdMpXpkvK+>qZZtP z5fE)Ex#X<Z+?l{#fQVZo6XCdW`a@z-@3sYEEn>1=%;8~boW}s}ZbwmT(kR)KLa=D< z68qmR=hdd2>z&bhvxbcr>?nBJmQqd+G?kgBHJpE(4H1jVs7F82E>9RR@7+SCZGd!i Vrw}$soZMTyY2~89%e!Cr{{uNrzNY{H literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1fc_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1fc_states.bin.z deleted file mode 100644 index 791352bfd00b694cd9ed228ad5eb5d1c6cbde2cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14387 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 diff --git a/client/resources/hardnested_tables/bitflip_0_210_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_210_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..fe85775bfe7cdafa269bb9b1c2202af269e763c7 GIT binary patch literal 1680 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 N^*D=5@4XlI{2wZ5kZb?| literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_210_states.bin.z b/client/resources/hardnested_tables/bitflip_0_210_states.bin.z deleted file mode 100644 index 479bacb03..000000000 --- a/client/resources/hardnested_tables/bitflip_0_210_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xMnFaWtщ|5o}4Lg ObOjzߟ1$_K߿rK->ɷޥ/~}K?kxzI,t_~[?~O}־}~;nnr|_O?鷷>ޯ_OCe9w}{}zǏa<㯿KŷwKIߧn;7I?鏗O/???O/O{??O_o/_?w_w_w?_?_?oO_w_Ow_?oO_w_OwO_o/_?w_w_w?_??O_o/_?w_w_w?_??_w?_??O_o/_?w_w_Ow_?oO_wO_o/_?w_w_w?_???oO_w_Ow_w?_??O_o/_?w_w__Ow_?oO_w?oO_w_Ow_w?_??O_o/_?w_w__Ow_?oO_wO_o/_?w_w_w?_??OO_ӿO??O??ӿ/?{g{gO??o??_'{???ӿ/???oO_w_Ow_??_oO????O/o?o??Oӿo????/?o?Oӿ/?O??w?_??O_o/_?w_w__o/_?w_w_w?_??O_o/_?w_w_w?_??OoO_w_Ow_?oO_w_Ow_?_oO????O/o?o??Oӿo????/?o?Oӿ/?O???_oO????O/o?o??Oӿo????/?o?Oӿ/?O?????_'{???ӿ/???OO_ӿO??O??ӿ/?{g{gO??o??_'{???ӿ/???OO_ӿO??O??ӿ/?{g{gO??oOw_?oO_w_Ow_?oO_w_O_w_Ow_?o???O/o?o??Oӿo????/?o?Oӿ/?O???_oO?_??O_o/_?w_w_w?_'{???ӿ/???OO_ӿO??O??ӿ/?{g{gO??o??????/?o?Oӿ/?O???_oO????O/o?o??Oӿow_w_w?_??O_o/_?_w_Ow_?oOw_w_w?_??O_o/_?_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_O_w_w?_??O_o/_?w_w_Ow_?oO_??O_o/_?w_w_w?_w_w?_??O_o/_?w_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_O_w_w?_??O_o/_?w_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_O_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_Ow_w?_??O_o/_?w_w_Ow_?oO_w_Ow_?oO_??O_o/_?w_w_w?__?oO_w_Ow_w?_??O_o/_?w_w_Ow_?oO_w_?oO_w_Ow_?oO_w_Ow[ \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_0_225_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_225_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..15195d21385b0eede73fd2ebfdf61354647a4812 GIT binary patch literal 12468 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 GUjI)zux=Cp literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_225_states.bin.z b/client/resources/hardnested_tables/bitflip_0_225_states.bin.z deleted file mode 100644 index a4cc5d58c54c0b63b9a7a73ca28792535b688a30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77058 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 diff --git a/client/resources/hardnested_tables/bitflip_0_227_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_227_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..18a6d49871207a91671b9bbecd09e0a98f45fb6b GIT binary patch literal 2268 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 G%zpu4Rqjmy literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_227_states.bin.z b/client/resources/hardnested_tables/bitflip_0_227_states.bin.z deleted file mode 100644 index f7bb63eb7878e931d723a7a353d2af818d2cc96b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44320 zcmeHweN<HC+V`pKXjx$&$}!W)JVs_Vl_@F6&Nzx`hTo_tb4&{pJ#&;05tuu*q9mQn z56TaAhKPtTDj+EzJ2e~?W&8j}K-tFE00V4ihM7J4>%QK5@O0kyeb(Dr&$FKXc;EHz zHGi-dvlnacd*9b}{jT5j<F_}|bsbo=cXUu{p5<ChaP&I~-=F_7^~{&k_1gGH-+g}5 zM0;lXQhR*e^?t+qZ1%%801kqn?Jeq(D7+#^iKV=|fvevb++Yb$)++XKnnI+%itHN- ztyu<JIa4RlaY|7-%n|r>Sd15$G<mQA&vQ~8t_kh#T+itYSJ_XZye$gpl9jdli=YA$ z;m%+wDIE;{j~2-a6C_-Lde=!lb$ft|YZ5!XA?DbY_~v*GQ{)Ke4eeZL$QN9IBVuoX zMe66$?9d*#X1lO6jjfUfU0Svv-Q{BIE=jxKQypa%T#1<1SKFFIW$mCOl%8gx7@7k| z?XRMde`J(9xr5)z&7jf#?Uslu#-(5?#U@dTRidrNR9xiXjvqr`QJF6N9drxK-7vI= zUAw-Dxq(NPn)a0Rpj<h^1w1>SvB2e!EV;kJXLayV)+`n(cd$k%z!8`?@mKD^#e3Xq z`z_Y1;l&%StVF_h!MHhj*tf+YyUaOBtyYM+`b$fojNR-EoZJ`?XV(p5-iN9@<cAlz zP47b{$LD1<JIJ4P?4PKlZKM+5%;otqm)pa{%g3jICQv+{QW27Jc*PaGtIVi`yxA3Q zvTK_jQ8wAVyF6fy?s5(7<eQG!VE8wy@Q7e)L@0Sw^-3r+dL4ja5RX=%aS{%{<4ihO zM8DLmEeVm6H!%Il4c_#^UU&Y-*b=9k$pzjRJ5CIWgOY87SXW6SOoW#hkOa+QIO#F8 zE9{G$8{7VZj?}PbfLDPH0rmtoU!r%TJ@%!YjNd~eKSE_?;q_X*t@faThduCaI<nTX zjoy(`?RlK<v^1iJJ@G5>d<Q+h3ufUTJ<JO@euwQHNw*a)Idysn9Wr-{;k{3o>}`~B z`t-6Av=Lq^Eqe*yPDQiwU0>8Vp8sg@=7~FApfcicSi3U(;>?B_En}}}$6TeBCd)hI zrXStZ5SZA;H0_UsZI!U)2fYVPXXxChcl7wjk@sMDzq+{)dd=yeAC%d>P5S4cy`0(V zpi|ATWY~w_p?)vmaGCZ}60Gw)-6wfBqqRkcy?eko##R(-_>((hT~f+8!}3yiz1C|! z1~>SaT<BoYcqJkpL_za1+=a8S1^R;i%Lv~O-4%2XDlL2?<%Vpa*5f0<IyQE|TnHTH zR|VSC5xENirXp}*xJ-fYJP*PzS+`4{>f-$p+qzs9OIEVe<?`TiYhRi?amTnc$0*4^ zI9<~i_L)t`X`GfC-Q>Fz{_O*YF}ZdYC&(dKd1P8KP)O4WMbDxlhU!qtIfU?z+o0#% z;Vff_XDWY!;$P4!l5revTnI7K<V!J-SAxTy|5#zC#zM>75Ur<0;!Q|rZy9caOR=jJ zP?QOEv+y=g(OZT~h9_#`yulwU`-JFf=3AU7hCPDXv*CuD>uv)1j!n^7j8fQOC7_fp zKo2|pE3H$~OWf!stHr(eW%xKTghB5#Q=UnPKA^b^J0P9!3x1Q^P`?gsr*A1U8@ans z-%7tS3+9Ncw}ppQYR`$OdtGVY+VkE1K|Rc#^nV5SB#7yf=@?vNo3QsVq>O=z3)EcY zPZJDt#zT!f)(IC{A?_M7*Up9oRq?}?LeX@bBZLD}DuG~2Jh0PNQFLJl-%7WL^H?d3 zge{YeN@Kuv#;rB#vd}6k(-)435n13AkRY4+-{Lje0*QCDm|q~WVR*Eg@{%Xs3_Bql zQvx~Q(!dDJY0%TaErh0K%Vny<{i=s9M9CY{ht_dNu`TZYQhJWVF*)C>+oTNr9?h4d z=S$Qs=7?hY5|%cfzJ}8p(Mj1_4+8{U6=ab=UbftcE<wr<?;Z(-7)}bEl`rc)SKgWr zVndU$S>vAzwO;FF7;3vM>OaAnKFRseq?86yKf?&{!hp|07EWf~zSiT=+=EkIKQEjn z*A8Cc8Q%@u1rzfS&{b)7;k@MA$n4Ab9ZbGI>6%VXcYI2I<%cygkh53vF5Q!w<smSp z9md|3=N{E83xPGaq3;XWZ}I@gze9=~odYwZ_=0e&ZRQGTN{lt$$qTrtqABZOd5f;w z_-d_DqqJmlBNX!thbzyi9|}UuQuqj8JqT~O((DwBeFs_^sP9ZQA}WySL@PA>D(iw8 z>g02EHqA~4J2A>657mbZO*KK3ICC^KxO5eiNrdxmjfL)zv)#5@=h+zR{M_`AiCk)q zg>7^5)z;#>RE#6$E>y<8A?uozd5*)MJD6;K%(v%{1>0;);m)+H%%6as;P+7PU6Xa# z=ILFf)Q~N}z~eH?aYf&Qu14y9{QGqmJ&kpjp{56pbyMHBv4cHO)uWBjp~2y0x)qxg z-Az<=-r&zz+}gM{II|8c$F<P~5Iq$y5t+r_EC-CUN8glbd)eLw{h{bpJ@FklVaS*= zTS7U+;n@b@UDQ-JjK7@7V>U`Q16vP87KlFvYn{<8bjwD6$x_FJ1Y4fyik}aziBjZq z%nB;;7FvK8$)=z2_AAWGIRB`kxvZ<g5x>Bz&Lt~hhJ%`o&-#V#UVF2~t^3FX!@D%1 zeMk*jri|Z5Zg)VRk6mMBC)L`C9$)hcm+3scQF+wv9U+*f*wJ|Gi>?Vpc*p_hJDKf- zT?Q($^s@$e%8a`ZI-np6r~J^;L{&jiIXVJV5hh#sGaNv&Et)I9w~A)-DG!hA;)opA zi57W%rQZ*RdE2?;7xc$?>ct`Ojhnm0+zEqf23CuvZtQkZ^YHyt>xbC^razMh!+b~f z?E#uAN4^A$I_25GG`W4jqMtMD2<QfdEk1#nYb2Ar;?8<TiughqYf}94l@aCk&vEJ; zm=On?BPesYJZ%}UqhYl&un%s6-#+>d$Oq`6&0G^pe_9}ci$9A|jw4=@G8%L;=53lw z3V5QRN3qBA_OB&ohHO3w3!Ajt-OLxi&?O%3vK{sLwg%R`$?HN|Tp#Gl5QuzX)G((= z2b*hvW$BE^TiBH-wJELB_V=YJmYp@s_h^AKx}C{FyY8i>i`u2o9fB=vas#;KpU|%B z=!P_fH-#r8q%r?2d)3*T3!$eCdDb~Xc)d$do_+yNaDvn+{|SsTUqW(Izjq*X7Fy<u zUhP0c;(9!+*d(Uih>l5`xX$oojjn1xvug>R%iKB$g*|f9CrM==7&--Aj188!ib5>c z-&Cm8f^IzizN7C&$Ig>NQ7gRz0>^`C3l6H>E*AY*=4um}`A*$cBtq96uu!ahf3U7> zT*FU+@QO7{Y+#zlGI*w9Un<eoT$CVBROS}rNnTPw2>7u;g^emRQVKTOs@kbU%-RhO zrsxKQICa^*wKV`}89Ct+1OQ@WB*Rq&Nis5vngHMK&Wk?*#}xZ{SLZcDgqt$uGv$sM zp8OPrghe?#+R0s%a~i3fIyfj#=|WRv?gh)|9_AU?*}^p7l#B2qCZ+lkKXfO|z*L`^ z?+g`niL7Sx-WGVd)0{0@`C;g<@Y71ga)Eh5<leH?pbQs0-?mTDa9pYI0M-a3#XaA1 z_EGWS&4-Qfsc*mk43=DS?Pg2X&%NLPDMP(*sH_iY8Z<IVCJP+?PV#-)fr!mew5>1s zRc~@3XNMNku+{q)m!N+a=m%`{9Hk#QZo-r=uWtU51eOCe!Y}X@Ir3qE&q(#06|8@u zUc0!sY$s#kHM(Kc<6~Zhb?B2z2DweEP1dwiQCsQw-N^2>=<H&kOaFwD_C2!%1o}x) z%j2_2g*A}T0=J7X|AY<d95t=}H6ifb*HGiw*urgawJ%Ik_#67g_ZxtOYPjD4*urxu z%O1a|;=EPvp6dy^CCPZIi7}NmJPeCcbq_&&`p#eB1ukoA;FzyrW~qM1b04)#pdj}^ z$!h$t7p^4y<^Elt1${y9D(QL#%b@7*LgWEz3+Vmff!^ec{>dD;2Xk=IVTg`{OMipP z<B)Y2ofgH44Nm2S{++NFXAJWcdz14}b|_ePOX!Q_2^k7C)@i!|)#s>fU|K}&YlS6z zb&p}hq`4W)T;5W@(lN<08k<~3r^L|k`cWvF-B8Sfr;)<YfSF{>ELV&>snKK)7vDlP z*!^q5`jt$MNdKn+?pIDf!(Wbmz3)^WypgE*eGJ!h>~Y-RUQ{b@AzNnJKKj=*cs&|o zRxVG_?zU9hBNm!9m#9}4L%yRox=y><Hks-tegs)PQf<e`o>uMR2SKy>he>X#&ln9H z#LO5Rs`v`I8;18#zOAwEGNg6FfPz8>BCVQ5|3@I3atxVqSBPlBO7u+>$D3$4==4?h z-hKGRhH<_JQ!e)fPEOL|xj>7s+-4MEsEOooH`?iZTY-~r-Pr1e&oRj)*;M8&=8aA| zp^N#hOEW4;+oRhh>W)hOCE^4_W7wk-L<!M$)ARQ<@Y@HGKdOKpf(;tLeGc6Ln(^~M z<Tj?B)wppZ&rmR}8;W=_i_<a1y6D@mw2|7Qn4d*!kHNUV;^smW5d|Z@DZu)S)8HIM z`%6wmvN9&O^BXHPPdJ4E<LB1A1XJ%9!oK#2N$Cans+`}Udlx1t8J{sdRj6Hz=N$-l zyRgY-Rx-ZEI~%lTQ1a!9V)=7d+>QV}DVOfp(mj_^UAl#%2MESw3ma|g>qX6sO*u<K zP}FP|`v;NbLfPIRFPstr`d2Z#LL!@P?r^0Z$3M2pna$#ArThuSlxfpsHMs`5mRn$P z5ZLxI?u6}!+hJJ+oOD>`QEzXjcU@)1!Phc#LO}m&Ob5CTgjpf?TUdo}5)6+K7NTs; zf-~1~p;U-I9a7EXk+k5}cj&k}DEWs{(PV9>>)hN~DhF4$Gf7w%0*++4okzi0??bH% zqWDxO-HrJjFkR_=;6B9qFX$?@kkY5`hI$(W)xcW<Y2VhBrYg~0I!$_Xil_J}Bpgu2 zY}cKnCw2P50!REEg|+Gi!lG*I*P>koqZ^Tb!m9<4>7`!*w}<*0_V+bG;bq)+vd#&^ zS3cEo4eBI3pz0NfSVp~H&6M%K2PQTk?yBECxJXi5pM!o2u4xCnnJo8}$$ozbqkoWV zrwkzv_wHD*b3a3Xd!!fcVILSP+RA+6!v>utPsz-h;NSW)ikw}i$PvGozq6njB0TmM z?CJ<3$3uA7<jbpnlQks2J`FyEqS<^8957raDYr4<=~~0}I`;uNxeUBc@5d|G3TaZt z3{O)SN@$m+fn$zbk|Rf&5ngO1#XGi*xgxiS7Wn!aI?emF<`iPh7_c?CnfSNBy1i&T zbKE1CSI9-%t)r27U%0u^&ZHS`US@dN>a^rw_@`oaWlcn@l!Q}B_v+&2=VTcxrN$0d z;6^3c?S9p3Su8*6WnB9o1OEhSe#ytnWPL|+YV&KOErOu$YW~or{TZSw&)+XRei&sa zy(Q;I%U$5mL%?>(gJo1q@PBW~*&=m)25C-aoI>SD;V+8uUntZ#rJ~xZyReh<U-Wmd z_GsM4*>WycnK4vk@@~V}&WgcZ@cj-d4Vwnxk7aaKtbG$~XH19rA?@Eks~k9k8m6Xl z2~iGo0PSKyk&UwzW}CC26pH-Gs`4J_a=}nL+Al96d$^$-=X*?kmi$m@X*HBo;z4F@ zt!0>p-i-#q=;O=?muV{;TLmdj|3Vn(U{Ztq>tK!?z6;$uKkLKW1#wDRtsPC1Qn2`i zTepz8+DdM>&*VD!F-A5{kaVF#DiX7k@}ih?6Y(^>_PR)K>y56;T$pNu$=3oUDwDM= z&>jp#*PkL?QlGADvQq`GpBvUVG#$P|o(+BnNx^*@*m;;)K^m}JMPbk2iycX;Col(G z4;|6$ZVEc)7-Cn9mo88%lpv3uzmD7-wGZbMBSrSx-MiF2@EZ6_j_-%Im1J6*Ezv<T zYZYjMP!(_+Ci#M8->$wLkXF89!7<SGkW4Z|8C8yVFM}&FP`(<bIW``IAFE)_9p-Me z#ql&X=N9mnsYvwjCLpcczdrj!=maF$9Fmt0c)kmRoO~SERq`E-kMRBsC_>me(gs_p zWDxHt6Pqyi6rAX!YP_k-71MA>fJrHKikeM_+-S&EB`sVixs}GT3{K8XODVwtmJ@E^ zdE3fRA+WBO>6x(5`m5`ZTi;60hv_2Mt{Ew3X5krDrq~Fsc$!C(sBX=NJ#>%Zx?-Oj z)zG5dZ%PeLu*0l8+Fm#h-}EFI;IoUUGZBXb^){=MIFg$-UxNWvx?8^Gno-V@xV}m) z`T=M5)ILjZ->>`3?LW?@9chiWYuC4-F_Yk}p|t5cO(M3|36xdNwZy(T6Z|4^+BS4p zd|;h?Xf@6iqMKpcRj~g6+w(JU?h!8d4A$=^lpl>zA`dPLKQX|Prr#FWeU-HA*=4*| zxMCueYNM63?EjI&YjF`?z{oX)Gte|4PPC*0e@53!;Th$Kj@}3EL#*_D=*ntI=|i#q zkwK$kK)e?mRKU(xEcQ<QTKQY0a~Y7Za4-)_L2tlOujQx*y@X~<x+kIdV(dXhTMjD( zQxObzGDjd>LC$1zGki-x;Lceo*xJCS{P2;$JSwd{iruBZ2PVu?qTcW+gkh56`XwLV zY}oWedlPA7$$q~Fv37Fp4%a9jC2$sWs4u3nwPzv4$J1bDzWljNzW>m+o1ETsAD>ZP zAZK6ewlOb+Tu8!^Hz4|FA!{CWE(zEF1b)7}`g|jh{7QR!5z2ti2tnfaD@nP}SoU4? zq}Jqd&74ayr<ub;Q!AL;nx!W-lvpu?4HJ!NjkcvN>_qIco*~71UnqRos<k2<{TZ$( zMX%{{-LO)i_&g{*FEHy%3Wd)LE!2xmOk7En5Y&(~agYv5d-g5Br8Z^{igH7Wol2*w zg}HW1e#;hXUe4l4$)7a%N6^f5JC|dMKZ|M_tv|y7+X^ppQOa(d*}n<R<s$!@vM8a_ zf?@)+`_KcJiXHan-=NZvuHIGhPyRC?7(#Hpjbzz+AO81ID4N^)0GZhZx$Us%4tnD{ zGqw}5+jV(m_>J@==Hi1Aa~O`KD6bl5yN*=GxE4$=(^akn%h&Sh9#nWQya{4zEQiT{ zP99gvPP0_CaaD?I{Nf~wYb)603>kAa^mPZU*~ND&OsSX9PDOtR?ewF(Mf1hWO^0*s z%#|nzt)qIZfydySxMn=L-QoRiv_^Yd(3M(vwr(L|V`JUoz#2!G)0kQVt7Ttw#r{JH zoCtoK%W7eiVmP(&ky0Ub&(8$%t_)ZFCRdmVAD~Z#SwIRo*~0x49{~%8oiI|O`mE{V zpvE1xz_z?X=-RJ&TRHL^yKEb~kVEf{$HVRH2~=#vIS6WdbaxcH4ILp^`aU(q43B!8 zJQ(yk*|$Lyn@Tck7KU3w21aH(fguWeD0mhyuWT>)KtTr~vu9C9_$ZI*F)2Dq(tad` zZMF7S{4;S{2Y%RO*iL(QoWo26t`$f3BXrAeAGQjj0qQ9uYi6hiKIXy3ZBbxB6X)T> zN*S-hS*UL%=qknSl9lVW4(3ss*Z3ivxS)H^jvoJtO6X#DTcO`ybD@4^H<NVPR$i6_ z*v-Y11~<E@gzdS&FjUx(%gpurh4Ac|C+L7&G}gyN-az5-(y!V{ZrvGtCt0Q$sRZo8 zT6ie~4)LkoI@;-c75$pDwE0pbq^whxm@=L8DVs|Q_#0l%y7=1OW|d1I@jKu%LeAiG zPmtx(y^Np0%o=>@LAN&3Qse!kS$^Rdb7TS<bvh&xoghqOyI^kjCY8&#Tue<RoNm=8 zr)PXDqFYX8wLG@k@0+H84_*4J)Ckb8#=5>r{QjYC{gh<ebvMdsX7)l4)E5Jd%B&L- z%93JA*6K;i9_}thm!b{IKG9n2p-hqB^u~!<>y^ZNmZK<6)Y6b<K}i}UDjG}nP2`ao ztI~+{nULJf%;}A-@cU$|54wUu059y5z$3tRH}yUyr0Npx16U+kQ+#8Iybcr<-Al1V z`$>e2O@)EC*d0PdIa*K%p+agMX}H-b>HWLVC>&6MN)^8yFhwDh(oQbuMMxtcaPMam zdl*j{)n{A<%)e!v>o#$deh*AEu!*jRWXefW+~l?`1AF@SnW-U-EZOg$0v$=N-AIRT z>fNy*2Hk^qlOMs9kEgi@xsBRp^1U|5)CcrK{)NxZ0y#TnJw>3;>#Z*KTTDGvNo9&p zlH&^s^5xY&Pm;j8PYFCtjtD`5`uTdq4Gn)gr7KvU9Drz!DhoC|yLbt1!EN6v-s`$3 zG2{j+d4}R%COtmQ)R5xMJ|}9&qSM$#jp)&JD_ewBxe!(Xr{fiFXeAUj<zCeuOUADc zhTJCiW!BMp^MqIAGT8zrHwg-5*HNIBfJ4r%q!**~F`AO~ORGED|Ch;NX@8tQi1{<- zf&<ROl!owu`o({NeH+;qCS183Yrv5~3AJ+nd+@#Mwflu<3$QDDSBYsG>jjDZ8Hy&N zKLh(J!T$u{dEu@h=vT;;^)tcJfp>m|4=jW5nXu07PIEL%QwH6FaZ1>v&UlBk1m>h* z(`X(Zlh#d@&_~UdOvw2hJqx;g!}zOkx;v*`nY!`tRFu_C7hP{mOplOtHcbnUC|EuZ z^cf}b9CVc<8A|^U+Ue;Qjr`iY!GUX*!iOGFa|0h_%9bhqHTrykq_N50jHk|PVR<FC zUc2CodYR6#nvQR$zC}w4aCB2|bj8}4>jE0ka}|fT^ZC^?+OFyf`j9SZa$*PSw>X6G z0Vq;V5q*Wc147$+*`mPRpsgjaHU>da9(8h}CbCj*lmFBa*5Z94M!v8SmY;O^ErRVz zeR7XZkt~OyqgzKoD7n_&t$7z7cdYU~m{fs~uYwRI`-lKAS8Ci46h(4)2fWy_NrVsA z9vWze{tC$?bI|k?=)+r-s}8+hPt7TbYGYn<GxK=u26wFdi}4u`l>R?6%F=xT;;yuK zp})=kLU@Bn?Xuf8j@b<blW3M2?$k)>jHS}otRf2;oe(aN>f`ob?^~`pj`(}9#uYy3 z2pW}q>O$5CoBuLp%2i>;C3mfuN|?qO7V3SoZFH+S9SYZD%Q$3rJvZ|voZkZ<HqqIJ zPoJYk?L#qmuz;4kdZ(P7N6_ewAY&dxj)ZDC3)lt)WLIhBC09#i)3!vHWnJ=7PMHzn zva?l8Lm?#G5!1}3n^d8l-9m`voSS5nMR<WG$$OK74euYo`8Fu+_J_pL3O53Fi@gv0 zKG{n9petWNN*{as51BPA!uBrorL6Ul^>h;Zy1+D($?RXN2=UA-!;dV&rgMh<M^Q5O zdtkzW8}@0))X<mW-q9TULHGPh(bvdE5@rBylWRwE(xdlxtd-pa;T<#X!LNj;A!On} zG#tqHwFx7=sD8u0n`3fzfh3r|G`>#5o*o$dPduvH_!<r4yWt^UUj5Qbk^JhT1PFNT z^D7}pLVZ1Ax$DJ~%8!NiAVEq3M~ma;wMM6w4@>Jb8?o~SzXLaAdJ`gqqU|6T=8@vv zdJTOqRJdsvd=S=gnkx}83bhzpO6`dICpHb$uQ4p^av3jq^+Qb&czYndz1)hl%HiFJ z6HG01gaSm~U<;4KRibOPaJSHYbV0c00AF5h)Axu{hkfZiy3jlB9<ogsjI~a~(G54x zdH*-{L`AFaQ?Tq$xnFoRGNHwK<9Z5x7FhT*W~v2}W!L-gzYq2I<?9~-Z3~JK(E^@+ zuZMd~LaW5I924_(0INOuGd8tT9m|+h)+VM+>_JOUL-eh*v2`$Z1bS7`jrq@M3^GJC zq@^?w^jb1=;ky11+UX^@n{x2-PaoSwZN3%0@%Sn3$L-8<!@jHJcKdBE5C$6rO{|Cc zV*DO{j<BTE@Oj*SNkc&Rfci$N%2&weg65rGwus4=(IqnYjFcoMPT5f{+*)S{vh|%s zy=;zO*c4bJX?AWy7sdEawmaj$FCEaekxa5joV!&SeI9>r#i_M;N2B{4n34^dXVBRk zx+%bL=s0k@(JB1sgM@DR?GxyRS^$rwiFa_}Z`UaxNPh>W+FPtBvpKB+B$u(7w817M zVt26=cR^uC;^npIn8V*J>OvdCqonv2H}&AVb{M}`($da^6Izx*inLhkm!O2FFSi57 zS+0NK)ED&5Ut*8vowvPfXRi<@a(54VlbY_G5w4`=p?D2}%pn|XG~A{xw^8lNkCHX3 zq@+Ukmd-!HSpx@`P}Z1iIjc*M@gqCn7B45S?`>8S8%S>Ia}b6fVUGJCf7(`t#PvRO z@@-{Cd;YkPp%a*XcI~Q4-Sj*nk?6bzi#Ou66GL>bQy$q==t6lyByC%{7i&(*+9B|s z`=Ms<yR~wp%W@Hh>;vE2JUUE?oXsYDqOdOurdEo~_PW7Fb8+vdYuRV@xAzgz%iLs6 z=lotrL>KNn(z4eu!G;4kdnpX_5z7Z~g$-I<8rDo3z#QArLr(%Oj`6aQ?MNe-s(NGV z-#USv!05;X2U`D-S;KuXO*5M9BkP-`?U!IA0f8?bB*b$m=QsJP6Akn<%~R}&#@_)G zMxJlzof?u9H$eRR!^(q`Z<<LXOZNL+u+@-jZ?et3Po^^X2^r1NZ3aIdPeVrG-u?pl zzM^vUS*X8oAD<CCOU^!c$AYFLeJ#jEhrsfwD?Hoq8981H8ed+W{0j^xKkv`8h7-&R znsX%OzLXxgqsu>cDSL^vNk*-a{$fxXI!&EfK^c0|(#niI8g03y_%ahG+e~pphZ2~A zE3WABK(_Q#(h}kCWsB`_-HE!FLSl*wb!~`o^^c*^dl!hJt<)J`B7E{n8BS~u%#{-@ zXbhBefS(lwqob~@8ale7uW4yS;YP8oM4K0aGOTQbj@t~!%1xUf$a3i(+QH8)-#6$2 z9BwF@_C&sOKMghSM~#OEWz-t{*l$oNu#Tiqg5$-<$Pgls;QC6EWs7|H-`A&7Ke6w7 z(I|+#3HfJW#g8cZ7R<fLEJ;>A3>FMK9`>M_FxyXBDu-AZQW@=+73zH1{_B_?EX20M zs$b~~U_D09B>P!fwUOD8o_(FomTYSZyy>=qU=_jyg|)z6s-gZR?v8{K9fWq${~@%~ z--N!@WAiV}jI^TfOL0m8YBT8<!sqV#)nqImI^fV%%e@NtE+57foG3}VZ0m53KK6U6 zl)0j^+Wpi<m;abe1oB=>CsUL?M#2ZMgUCpW6mqhK2Z%nl2xhjx3=is8SI0uG-FU3h zyvJ2Pf%;UOJ)!LUv&@MG_-?fvTEi@d^%^AtaDF>;MzUI9mJdt!_6aDo<XK<4@B!We z@rE*g-#kKr6Rt1?wp)FZE#}>XA23?<+{fi2yaObYRMB%fb%Q;Y5|8eR$M}rNU(`-l zwAD)gDCIfIG2(LtndE$T!~jCK{Ptn8!GfU(4P%T5J$R!VENov1axbu5oN*&^NGy&1 z%0qpka+5c)cT8iu;Z=vG0x#djyj26wK82ih%xDulIc+f%UB8WlU6#~j0V{Uax-sFR z9XX$i1ccD`@w*6@-#dTV5;rs?d@)hU5H;Z;NXN6!={9ySpD4wWmqL63SY1tc_EdP6 z^S{G{w6rY6=Y%sCcNUQ;jd(h0MhmsZV&lWVl+9%}F2A=~WnI`u>=1HB`Fto@E@qxQ zR7Umk&WAg6)9GAC`$b{OLNq%T&smpz3V%SD#v3l<O^2{mIAKG%2O#z;D+Y(%?1AGg zsMZ^ORP($!{BkS17fr?NExC7Y9@N2Z6)Q9Bu;3CJ2klT44-_PsVx37s&4#81(z4SX ziSVsO76aX;_%0Mxgj*c;p71V_ze|Yajvg|~BD{b%1ouc(`rIt&6p%?Ohlc4OT|}AK z_rU4jbOJP)BRfgy3*`ThS;HRKC~01RR3BL%z{bCawE_%y^O3kV)Rm0-t=a=Q$2D0U zIyUk5z(fhdxB8}rB*ksM)^~K9f4{vUq>&~2{Q;jchERnR{b28o1$X>i*eO0GqYWg5 zl2LfM?jp$>y7f_yV0Qel`}k}N_|EP!;L(lCuh^K83i|VYG~GRd9B-50ZIV}ss?m?+ zSKrVgfE@WI14J&+XR@Q@tJTcPF7bUF!lI-E`OSi#<O=2bNXe1Gl=LJYf(@e#4fAns z6NPd~@n$CU=sv>h6dRh_#@v?rx~dn0aSz0DA{(?HV$6~IbPFYU`5QRWY~Rf^UCmnV zAevX^;}$j%#|XChfPTVF!rTK?Ar6iV+0b?7X!Xr7Tk=}BFr*Zhi5vap=rM-JWj5jc zFCevqez~FGH5}+Jo3ie^-8NY+TJJn5_}_)Gwq?If@dz!}TXL=w@fFW(0(~5Q3^Pj! z{_n-JXO;EmV1~f%#dNh2@U#+i9@BeqO9#=;UgA?<ISw(RapNtnkw1+ypHOrW-7whG z^0f!9T%>0}M1Ob_Gao6d_d@KQh?~;3p7*xl_wP{pjB-BM<Yg+U%N!W6`3PpGCU6Z< zpGsCW@sFXME>qrRN8b2H-5Ffb>81`Tp(y#hs6EDh<RZ7b`S~@5FLc<vUojor)>1kz zB*LUyHuQH?DfA64Iw$SgK4#@3zVW4}if93ne0%_r{JDLFyb4mT^$JMzFN5wRX~1eQ z)-OdX;zCaCXDfvVs*IN%Lu<U-+}OOLNplhpm5QV`M&#+4P<@9n;1qJLy<77v3~8+P zJs5wNMrK^DQg67A2rwR?Iv~Cz-4`q~FF)jlipFW9YrtP5nIseM`T#B;N3DhM!6|fT zL+Ld%y8~r+>+W^fykBWXbwXkbks@vW8Tn|e-Ve-FkOvsW<xQ5Qr@vVb2#4GP{W$y& zgsP-e7O*_xG--qFbQw~*4F}dj{8zBhqluBrPhjge-knywG(j=GeM4lnwc?7bq^Qmc zp3^~DO+{!F?6lnyL6Tw%4$4Eidgm|C9kbs{xIt7hgozxf@IA(-@Qt~UX=m@4K`6FJ zOuB|Qz9EKhWZJNMl$KK^uByaUmAI-BS5@MwN?cWmt159-C9bN(wO8hfREeu9aaAR* zs>D^5xT+FYRpP2jTvdsyDsfdMuByaUmAI-B*ZcD<RpP2jT>md|Yf&Yxs>D^5xT+FY z-@m-75?58?s!Ci{iK{AcRVA*f#8s8JsuEXK;`-nJ&uUfTs!Ci{7gyEARdsPyU0m;5 zwx}+ys*9`Y;;Op1sxGdoi>vD5s=BzUF0QJJtLoyay11$?uBwZx>f-v}etD4U;;Op1 zsxGdoi>vD5s=B!T%d$mvaaCPh|GRIDQ(atD7uWy!rdZX*^*3v>|H=zsRTo#)#r5}J ziLAP~sxGdoi>vD5s=BzUF0QJJtLoyay11$?u0!}%x<#DFN@+>0Rwf&j#(?XLTWi#1 zp;cC<ukZC>S>%O;<n1nI-jT(EWB)`Y+5(Apw3uHYvSE0%yO#s{_uF2ZflDI>=FI6o z<c)DBWotbQ5Ols*uBj4NRpP2jTvdtd4QUE*3Rfkrs>D^5xT+FYRpP2jTvdsyDsfdM zuByaUmAI-BS5@MwN?cWmD+Ez&DtS>>7KU3w21aJP@BM`Aq2O7-yt2LE0|gy~%$`LZ z;iEjJ$E4^eN&Ar$w$<8S@z2C*9r$6BDsfdMuByaUmAI-BS5@K~P^!APsxGdoi>vD5 ss=By7_^usP7gyEARdsPyU0hWcSJlN;b#eXw&c)Sl55PlR$7Sw+0J6!+^8f$< diff --git a/client/resources/hardnested_tables/bitflip_0_22d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_22d_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..fa1be58fd4b26d23f8c0a258942ba3c6ae602cf8 GIT binary patch literal 4981 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_22d_states.bin.z b/client/resources/hardnested_tables/bitflip_0_22d_states.bin.z deleted file mode 100644 index 4e5b2ff279cebc2f552d994ff58cf344c8e4323f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46813 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 YcrbzoBX}@^$Nv|>1E!zF|8dy=0=RtV761SM diff --git a/client/resources/hardnested_tables/bitflip_0_22f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_22f_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b6c1eb54c9a47adde8f344c3c51fa06cddd1c782 GIT binary patch literal 1135 zcmYL{Z%k8H7{<>zx3{<4)_aQudL<ODVK@;2N5Y4e6};6AW>%pNmAXuJlKBCWeP|3g z;vk$`NED|Ar!LjFtQ#A{LEQb~LS~&u;|vnFbcSu+vgn;_93s=sKO1qNtDp9MdXx8; zC(oPbS^rvxZ*5@vs@Cl%Hcv#r#@zm;r%!J$mM_tL-6x$#)4;Y`0~&x65G-F0_Jbi) zyaE27TgO*8Vk<{-qP5?TIBTyQreJUF)YQ%k%ama5=s`sv4ITg%-)Q58Rkn_c<X~;b zrDZic30V1UP0b3tq0wdO9BEWLkCXx^bsiqR5-r5B(oKbHx!`dH*z%4!hiY0j1rOAy z$z<oy;h~Y4+QOapTM~IK=d~l((EG@a!nRX-7<~54(j;F*`I~%us#5HweW2I$p*my; zr^N@5xqHg!xp*;dQtP0;bq^yiGQ)mZG#pTW9a4sse9B1B#@?kb&_vwFC8WS^E?!P& z?LS-annSFmE1xuLk1o`qtv=2WLO%Xa)TX(nh0F4kL!yTu2`l+YH|XYu!vz+z2t5J) zs)u!PllEC5)XUx;NO*M81PY)|HfN$sYFhRx_Qe72I~kXdhGY-yw%i9D&pp=v5b{H_ zRtswnwZ!Bf;l1b=RHCOLu0ATqO1!wlkRQsA?Fq?j&N!@A_!~#tfZ{^EB$C6F935jt zaSaz6MLH{^h9WzQ;M~9^3C!o*gRH_>Ga*bn1daHzPmgmqIJ#v?YY(+&+`tQGWSeWO zdW#egLJHbtW8)_DgOfV;=soOfAO+T$>y(Bhu8Mc@Gy|EG*_zQG4#fTDKQJZ7Jz&nt zKVfxfLGP#Ssggl=#I0dmWxo0soTm|S5;5#RtTiFOCBa?xu~mF8F>@b*wAe>To0>ID zngjTG)hJ`tO<=EjPQ5ig+&aT8M7`)dE{dK8i}7M->rcE+!Uep^-+{jiWCy${0E~Uy z7*-_evv|3y_N#*W`5e415WnhIKTNuZC7Pgq?Odo{YlyVRE2iytxXF@V-K32wN`6`Z zZ-g7n2CXmdrym4TZX!YE@803#uS+ymAb@@|BLB_51G@O@LQ0B1M49Nna5tYSj(gDq zNQyX+7QPfd@nnIN41B^b(r~GPEAH|$p1@QUHL5@avSQk&?t$}YR)~1mS$#_GD9%*H zyM<8mnKsjkX1Ou1pjAqgcmf1tOMRWV&(C7+udLa!l1eL3oCL2qAbzB0cbrSNLGnsA zz(x*@BSYcPgoT}=`-zgTJ4B-r#l&O<`e8FsT-vEpNb<-_w>fa^lDHAe5m9lbUGU{J zQu69mvU<+?tO!td-=M8VDf*aH+Smv%9LUSlPlFD=6)|Sm7%rnMY}c~hD#bI~cuKbM yq?CJhtAP65h{epMM&USMEUYYNF$V`pBbvxclPu2&Ubk@ez4D8LgVzqeN&f>&!H^vQ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_22f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_22f_states.bin.z deleted file mode 100644 index f8686dba6fe9851da2a7484b5352f4521b575ab0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23650 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 diff --git a/client/resources/hardnested_tables/bitflip_0_240_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_240_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..6d1908e79244a241457aee82c5587bd1f30ef123 GIT binary patch literal 369 zcmZ>Y%CIzaj8qGb{2#f!mZ4-zEaMdh76t|u76umv4h9B>1B`b{7!=r87!LRbHLEpx zdP=2y@Cub+)cDM@xItA)H7I;u!;}J+#SC610m^%X`kMlkmupRo6m(MwR|(@X)i~+4 zs4vu2zA3O}@r5b1LQ~z7R!kG>QP6kw3T_bU(b853v`bm+DyeZ~v8t5D>xQYE7rYDt zLwZytR3*F&ybM6Js)Wjt2b^w<fia942UO)9m;xVgYFaQY+CO8#n#r1Lo*QkHVywu? zYk0-L#K6GB1SEkTU`SxN$H2rhqX~=}mMoRZ^>-E25pmhTrK6!`#njEP=zvH>z|w<` zfiD6plzIZI7M;=oqQC-?SfGksB5_<w@huvOuC1Z5f}#aX-5iSrL-kkbEIKL{m?_4} z6~m<?)DjVxu;@@Xs~D>omySq;rsxM&F-DOBAmREbB*^`)q6@o2koE(P#XojW(md4C J*tQ|90ssyfbqxRj literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_240_states.bin.z b/client/resources/hardnested_tables/bitflip_0_240_states.bin.z deleted file mode 100644 index e4f4b6ac6..000000000 --- a/client/resources/hardnested_tables/bitflip_0_240_states.bin.z +++ /dev/null @@ -1,2 +0,0 @@ -xAP ,Ձ;w!щG -! {4܆.R-W/OOo??_=?ϟݿ_??{o???o??{??_w??㏿_?w?_?ǟ?_??ǟ_??㏿??g???{??_w??㏿_?w???{o???ow??㏿_?w???{o???o??{??_?㏿??g_?ǟ?_??ǟ_??ǟ?_??ǟ_??㏿??g_㏿??g_?ǟ?_??ǟ_???w???{o???o??{??_w??㏿_??{??_w??㏿_?w???{o???o??㏿_?w???{o???o??{??_w?{o???o??{??_w??㏿_?w???㏿_?w???{o???o??{??_w???㏿_?w???{o???o??{??_w?w???{o???o??{??_w??㏿_??g_?ǟ?_??ǟ_??㏿??ǟ_??㏿??g_?ǟ?_?g_?ǟ?_??ǟ_??㏿?????o??{??_w??㏿_?w???{o?㏿_?w???{o???o??{??_w????{o???o??{??_w??㏿_?w?{??_w??㏿_?w???{o???o???{o???o??{??_w??㏿_?w????{o???o??{??_w??㏿_?w??o??{??_w??㏿_?w???{o???_w??㏿_?w???{o???o??{᏿_?w???{o???o??{??_w??㏿㏿??g_?ǟ?_??ǟ_????{o???o??{??_w??㏿_?w??_?ǟ?_??ǟ_??㏿??g?ǟ_??㏿??g_?ǟ?_??㏿??g_?ǟ?_??ǟ_᏿??g_?ǟ?_??ǟ_??㏿??{o???o??{??_w??㏿_?w?_?ǟ?_??ǟ_??㏿??g???{??_w??㏿_?w???{o???ow??㏿_?w???{o???o??{??_?㏿??g_?ǟ?_??ǟ_??ǟ?_??ǟ_??㏿??g_㏿??g_?ǟ?_??ǟ_???w???{o???o??{??_w??㏿_??{??_w??㏿_?w???{o???o??㏿_?w???{o???o??{??_w?{o???o??{??_w??㏿_?w???㏿_?w???{o???o??{??_w???㏿_?w???{o???o??{??_w?w???{o???o??{??_w??㏿_??g_?ǟ?_??ǟ_??㏿??ǟ_??㏿??g_?ǟ?_?g_?ǟ?_??ǟ_??㏿?????o??{??_w??㏿_?w???{o?㏿_?w???{o???o??{??_w????{o???o??{??_w??㏿_?w?{??_w??㏿_?w???{o???o???{o???o??{??_w??㏿_?w????{o???o??{??_w??㏿_?w??o??{??_w??㏿_?w???{o???_w??㏿_?w???{o???o??{᏿_?w???{o???o??{??_w??㏿㏿??g_?ǟ?_??ǟ_????{o???o??{??_w??㏿_?w??_?ǟ?_??ǟ_??㏿??g?ǟ_??㏿??g_?ǟ?_??㏿??g_?ǟ?_??ǟ_᏿??g_?ǟ?;m \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_0_275_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_275_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..15195d21385b0eede73fd2ebfdf61354647a4812 GIT binary patch literal 12468 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 GUjI)zux=Cp literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_275_states.bin.z b/client/resources/hardnested_tables/bitflip_0_275_states.bin.z deleted file mode 100644 index a4cc5d58c54c0b63b9a7a73ca28792535b688a30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77058 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 diff --git a/client/resources/hardnested_tables/bitflip_0_277_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_277_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..18a6d49871207a91671b9bbecd09e0a98f45fb6b GIT binary patch literal 2268 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 G%zpu4Rqjmy literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_277_states.bin.z b/client/resources/hardnested_tables/bitflip_0_277_states.bin.z deleted file mode 100644 index f7bb63eb7878e931d723a7a353d2af818d2cc96b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44320 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 diff --git a/client/resources/hardnested_tables/bitflip_0_27f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_27f_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b6c1eb54c9a47adde8f344c3c51fa06cddd1c782 GIT binary patch literal 1135 zcmYL{Z%k8H7{<>zx3{<4)_aQudL<ODVK@;2N5Y4e6};6AW>%pNmAXuJlKBCWeP|3g z;vk$`NED|Ar!LjFtQ#A{LEQb~LS~&u;|vnFbcSu+vgn;_93s=sKO1qNtDp9MdXx8; zC(oPbS^rvxZ*5@vs@Cl%Hcv#r#@zm;r%!J$mM_tL-6x$#)4;Y`0~&x65G-F0_Jbi) zyaE27TgO*8Vk<{-qP5?TIBTyQreJUF)YQ%k%ama5=s`sv4ITg%-)Q58Rkn_c<X~;b zrDZic30V1UP0b3tq0wdO9BEWLkCXx^bsiqR5-r5B(oKbHx!`dH*z%4!hiY0j1rOAy z$z<oy;h~Y4+QOapTM~IK=d~l((EG@a!nRX-7<~54(j;F*`I~%us#5HweW2I$p*my; zr^N@5xqHg!xp*;dQtP0;bq^yiGQ)mZG#pTW9a4sse9B1B#@?kb&_vwFC8WS^E?!P& z?LS-annSFmE1xuLk1o`qtv=2WLO%Xa)TX(nh0F4kL!yTu2`l+YH|XYu!vz+z2t5J) zs)u!PllEC5)XUx;NO*M81PY)|HfN$sYFhRx_Qe72I~kXdhGY-yw%i9D&pp=v5b{H_ zRtswnwZ!Bf;l1b=RHCOLu0ATqO1!wlkRQsA?Fq?j&N!@A_!~#tfZ{^EB$C6F935jt zaSaz6MLH{^h9WzQ;M~9^3C!o*gRH_>Ga*bn1daHzPmgmqIJ#v?YY(+&+`tQGWSeWO zdW#egLJHbtW8)_DgOfV;=soOfAO+T$>y(Bhu8Mc@Gy|EG*_zQG4#fTDKQJZ7Jz&nt zKVfxfLGP#Ssggl=#I0dmWxo0soTm|S5;5#RtTiFOCBa?xu~mF8F>@b*wAe>To0>ID zngjTG)hJ`tO<=EjPQ5ig+&aT8M7`)dE{dK8i}7M->rcE+!Uep^-+{jiWCy${0E~Uy z7*-_evv|3y_N#*W`5e415WnhIKTNuZC7Pgq?Odo{YlyVRE2iytxXF@V-K32wN`6`Z zZ-g7n2CXmdrym4TZX!YE@803#uS+ymAb@@|BLB_51G@O@LQ0B1M49Nna5tYSj(gDq zNQyX+7QPfd@nnIN41B^b(r~GPEAH|$p1@QUHL5@avSQk&?t$}YR)~1mS$#_GD9%*H zyM<8mnKsjkX1Ou1pjAqgcmf1tOMRWV&(C7+udLa!l1eL3oCL2qAbzB0cbrSNLGnsA zz(x*@BSYcPgoT}=`-zgTJ4B-r#l&O<`e8FsT-vEpNb<-_w>fa^lDHAe5m9lbUGU{J zQu69mvU<+?tO!td-=M8VDf*aH+Smv%9LUSlPlFD=6)|Sm7%rnMY}c~hD#bI~cuKbM yq?CJhtAP65h{epMM&USMEUYYNF$V`pBbvxclPu2&Ubk@ez4D8LgVzqeN&f>&!H^vQ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_27f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_27f_states.bin.z deleted file mode 100644 index f8686dba6fe9851da2a7484b5352f4521b575ab0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23650 zcmeI4ZB!K38OO&MOEiht`hgTBYho%#O~f8!H3ghn+hc8V+!KvrR2<YqREldt5Gt~l zN`0$(P#f{BvbIPT1l%eL$lLf9hyfWv+zlX(NN|A_#%0;r-I=-f>0rL(Q@?pmKHPb} z&e=21-RC~%e}4aapVYSgj<rWzQCT^iZ%4oX%@!Q-r`w;*Go;LUXWyG|9BEFrJ~%nl zaN&<1PkQO+saF9bBEguOg$kJac`3T4IiAPD1K;Y3Mkf;IdHR#`5-fq}mF64Ss^krX z3qm$x+em^lwbo<vM#QM~)h^$0m@FaLC3cj3X+IOwE%9Dym7Q-cFRiV3<gug^@jl_e z3pH2(63(JKF`Ypukvukl&mp=9?AL<xg8ULZ<p8pv12h}F65l?_d;qRuQ)r8%2C&2- zi66pN#M?)8dQXX6s^(@5wd$?Jx`9dogzm0oUd>lmwu$HaC7(xGZ)ATqXc;}|`D@iQ z3#65=67sK;>0wVEXpN-O-s!_yPW8k~P(rK$rC$~YAjAT^BbOy}+hLAo4tt?U4z&A! zKPYS>&dx0jR*pCn(XX=i;a)rER4oq`nbcL!8i<AV+@Y7;H>1t60I?V98j0cEQ8}xb znXSb0VEnWyXptgDFmIDbT-@$J%5TV0=I8`ut##yf!Sb~2$rt%*&3G^MZywcvi_gt~ z75?z{fVlS5XU-ZM@y)IuG3lB^vhTlC>8wzW4f?0q-+y@BZ<0iZgG;PM9sSVfFO#=l z>FR=QE@_E`s_;mLiJB4gURr;6dgND)Fl2|=Q}9bn*wPxG;)C8nlvD*K{D%-HdkyOK zC;`<548vT#`v@s;_)4&Xn5&2GR}x5Yu=!a%A*dH@z!S*o17VbG7grZrRw~$`vP@jF z*Lf%K>v#uLyFwcGy_Y;sIOvJ6!!DmFD<`lyGxD{Fo#0xBg5<1~k_F!gjZ?=kTiwb6 z2oBhG<M9fdRILEp(-j!q&#F?}D4XOom`U<6#kQi1SU<{=t*=k7B!!(m*TXYyPLt$? zWlm^;<XB|rhQ5BA2OGDhOQaD-F8?lbJ!o8QYP>jd1ME{RLomx>D1ablFZvplJGIF1 zP=Fe<_@!O0CO0aKzHA4>ZCG|NWMcu`0oJ1qK~Toj<*buipgG1_-t`HgJ4m2M0fOuN zyy6bFfnme&N@dm0Z-yHxT4&x#kgE2=aAeI$9fBVs_OSu8dhjX83s<$Ytxqga|5^lQ zXKsYn5&91VPyl`NZ1L-X`y4WSh{^EApL4lPFHiVFf7vB#t?Xc_xO_8k`O_CyJDZc| zfhwOcSzJdAn@%q&_D1%h+6KN!<|6B6<seC0UkZh|(kCT(w{?He`=3Z9yE$~|oQBIt zdc6`8>aeef*+EJKIMt3SNy&U(F6~B&kl&25b66~Pj{b1mLo!jEkHv2l(Wp-EMP-AM zp~jD+)*KZe`u^!(?8}w8-nbu9?FB*L6unrEYI>qmT8()S^gZk6FOV$4;rhuhGmqO) zjiwoy48L9`GaHCdi^iP!yi02FZ~sCQHydq><+5W?5E`-747mvYc}qoSZH88y%rN0Q zN<6kVNWxy@NpE|mz#2NhR76h0sk0!?RD&2Mb@kXKfKtKOVC(@NV+CA#eX`#}w;s|K zNGg7=)x3Z2kDo3%B@Xhvq?IiiQEFqD5F0xLhhXz}?7zWwMPDMD!wQx=qy)~#K2^-5 z)5)b2z(0~*=+EAbsPDo>7awZo$BsRhPUJPfB@-j&9A4jt#P)#vR)iNFz5z*N<90>Q z)!WOb2U6tdIN4GTi-1kShxLt`;g8Ywq&4!h+!n>D`6Fl7ydDN+ZA%j{G-;gPShAI1 z46}G6Am;cwZxWe(6TRwQlmtcBoR+NfAc^Pz6dK^E0&C@9hIv{(@h!|&LHOhF9w_52 zWH_K_=Rz<(3-MFZ1b6jF^Tj}L10PgJ0{j7YGmOlXEn#|TAA)1BN8_Ib{K^-cs_(xQ z=&OnvQu^Qd!!K_UEO@d>P0W*FSH+{2v>CBZ4{x#r<ST0ehwW4Et>kk_e1kS25iTc1 zbp?El>;{!@<I`YXj47t^%NZ59rm4mAZQqK>C6*PTyw4I3CV%Z@RgJ%b%UtY)p#;+^ zVub_KaC~pzE`;Tb8#Q7;aEG-(aS`B4{1K8e9Z2VXQRrG0(8L=ZQxDJG3`fUiKTB0l zR@3sp3fwJdg7ru6M+*8K$%F|m=z)8D)I}!lJa*O#@S@&Ts$t}fC-4`|%1oO>79X@N ztb<~CsP7Y$7O<Rizu@$-ijO@}1q&7Ba0eH}Y`s1w5<(yGyZvWB=A-?ZrwK!CpBUg5 zDe!6uVwjA&?nz$Q<Aa;p-wCvf&)Tj63katN49KiQ(f=bR>K#2n!wL0_zP7L2s&)at z4QDEQ&F*6ahIa$x6IdN*!nZFg1$pA|XEIY_(b&_5q-|KNG<W{%_)@3m{#;mxxl~BB zSz4tz<(cj`{rrzBd+*#Wv~AP2P1`nY+q7-dwoTPGRohf;Q?*UiHdWgcl2AzU|B)Ys zBovZRNJ7~*W!sc(Q?^anHf7t?lBAa8^D@|}+NNros%@&asoJJ$o2qT9wyD~tYMZKU zs<!C?Kzaa>9ss20w&}TT{T2d+BovZRNJ1eAg(MV`P)I@{356sSl2AxOAqj;f6p~O# zLLmu-Bova+%kA`XJDo{FXOhsFBy=VTok>DxlF(67bd=O{9E?USNoq+_OOjfW)RLr@ fB()@|B}pwwYDrQ{l3J2KT}u-7Kv2Sz^(X!Z2KR@> diff --git a/client/resources/hardnested_tables/bitflip_0_294_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_294_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b01f02208ef4ca4c78fc6566fd6e0c556e11ab30 GIT binary patch literal 5424 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 I|Eu`_01i(LZ~y=R literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_294_states.bin.z b/client/resources/hardnested_tables/bitflip_0_294_states.bin.z deleted file mode 100644 index c8a8cf4a0..000000000 --- a/client/resources/hardnested_tables/bitflip_0_294_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xOu3io%VkLSMd9E bJ!HHK{| us~~ןO?y}\כ7t{G{s6~W.כ{vw?~>߻oϿ^珟ϝ8_uܿ?}/~]?|כ>'{߿>kO1W}|p?~==|kymo7ogߏߎ_??6ÿ?_;~o\??G??y/^yXopaߧ{tWMkQ|Xկ|G7___5~9_/ߟkϷ;/? /7?j?4[<ֽ{okOkoG7}g?W˿?o<?cϏv?:v|j?}OG_FwƯ??j񏎿vƯikۿz=}]?3n_}4^]V?O_V_/dU{uSƯn[wo]}߻u?????_?yyOkC1xwouw Ͽ7:coooo_uھ//ko;?7QW^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>} \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_0_2a1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_2a1_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..15195d21385b0eede73fd2ebfdf61354647a4812 GIT binary patch literal 12468 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 GUjI)zux=Cp literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_2a1_states.bin.z b/client/resources/hardnested_tables/bitflip_0_2a1_states.bin.z deleted file mode 100644 index a4cc5d58c54c0b63b9a7a73ca28792535b688a30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77058 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 diff --git a/client/resources/hardnested_tables/bitflip_0_2a3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_2a3_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..18a6d49871207a91671b9bbecd09e0a98f45fb6b GIT binary patch literal 2268 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 G%zpu4Rqjmy literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_2a3_states.bin.z b/client/resources/hardnested_tables/bitflip_0_2a3_states.bin.z deleted file mode 100644 index f7bb63eb7878e931d723a7a353d2af818d2cc96b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44320 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 diff --git a/client/resources/hardnested_tables/bitflip_0_2a9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_2a9_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..fa1be58fd4b26d23f8c0a258942ba3c6ae602cf8 GIT binary patch literal 4981 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_2a9_states.bin.z b/client/resources/hardnested_tables/bitflip_0_2a9_states.bin.z deleted file mode 100644 index 4e5b2ff279cebc2f552d994ff58cf344c8e4323f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46813 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 YcrbzoBX}@^$Nv|>1E!zF|8dy=0=RtV761SM diff --git a/client/resources/hardnested_tables/bitflip_0_2ab_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_2ab_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b6c1eb54c9a47adde8f344c3c51fa06cddd1c782 GIT binary patch literal 1135 zcmYL{Z%k8H7{<>zx3{<4)_aQudL<ODVK@;2N5Y4e6};6AW>%pNmAXuJlKBCWeP|3g z;vk$`NED|Ar!LjFtQ#A{LEQb~LS~&u;|vnFbcSu+vgn;_93s=sKO1qNtDp9MdXx8; zC(oPbS^rvxZ*5@vs@Cl%Hcv#r#@zm;r%!J$mM_tL-6x$#)4;Y`0~&x65G-F0_Jbi) zyaE27TgO*8Vk<{-qP5?TIBTyQreJUF)YQ%k%ama5=s`sv4ITg%-)Q58Rkn_c<X~;b zrDZic30V1UP0b3tq0wdO9BEWLkCXx^bsiqR5-r5B(oKbHx!`dH*z%4!hiY0j1rOAy z$z<oy;h~Y4+QOapTM~IK=d~l((EG@a!nRX-7<~54(j;F*`I~%us#5HweW2I$p*my; zr^N@5xqHg!xp*;dQtP0;bq^yiGQ)mZG#pTW9a4sse9B1B#@?kb&_vwFC8WS^E?!P& z?LS-annSFmE1xuLk1o`qtv=2WLO%Xa)TX(nh0F4kL!yTu2`l+YH|XYu!vz+z2t5J) zs)u!PllEC5)XUx;NO*M81PY)|HfN$sYFhRx_Qe72I~kXdhGY-yw%i9D&pp=v5b{H_ zRtswnwZ!Bf;l1b=RHCOLu0ATqO1!wlkRQsA?Fq?j&N!@A_!~#tfZ{^EB$C6F935jt zaSaz6MLH{^h9WzQ;M~9^3C!o*gRH_>Ga*bn1daHzPmgmqIJ#v?YY(+&+`tQGWSeWO zdW#egLJHbtW8)_DgOfV;=soOfAO+T$>y(Bhu8Mc@Gy|EG*_zQG4#fTDKQJZ7Jz&nt zKVfxfLGP#Ssggl=#I0dmWxo0soTm|S5;5#RtTiFOCBa?xu~mF8F>@b*wAe>To0>ID zngjTG)hJ`tO<=EjPQ5ig+&aT8M7`)dE{dK8i}7M->rcE+!Uep^-+{jiWCy${0E~Uy z7*-_evv|3y_N#*W`5e415WnhIKTNuZC7Pgq?Odo{YlyVRE2iytxXF@V-K32wN`6`Z zZ-g7n2CXmdrym4TZX!YE@803#uS+ymAb@@|BLB_51G@O@LQ0B1M49Nna5tYSj(gDq zNQyX+7QPfd@nnIN41B^b(r~GPEAH|$p1@QUHL5@avSQk&?t$}YR)~1mS$#_GD9%*H zyM<8mnKsjkX1Ou1pjAqgcmf1tOMRWV&(C7+udLa!l1eL3oCL2qAbzB0cbrSNLGnsA zz(x*@BSYcPgoT}=`-zgTJ4B-r#l&O<`e8FsT-vEpNb<-_w>fa^lDHAe5m9lbUGU{J zQu69mvU<+?tO!td-=M8VDf*aH+Smv%9LUSlPlFD=6)|Sm7%rnMY}c~hD#bI~cuKbM yq?CJhtAP65h{epMM&USMEUYYNF$V`pBbvxclPu2&Ubk@ez4D8LgVzqeN&f>&!H^vQ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_2ab_states.bin.z b/client/resources/hardnested_tables/bitflip_0_2ab_states.bin.z deleted file mode 100644 index f8686dba6fe9851da2a7484b5352f4521b575ab0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23650 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 diff --git a/client/resources/hardnested_tables/bitflip_0_2c4_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_2c4_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b01f02208ef4ca4c78fc6566fd6e0c556e11ab30 GIT binary patch literal 5424 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 I|Eu`_01i(LZ~y=R literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_2c4_states.bin.z b/client/resources/hardnested_tables/bitflip_0_2c4_states.bin.z deleted file mode 100644 index c8a8cf4a0..000000000 --- a/client/resources/hardnested_tables/bitflip_0_2c4_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xOu3io%VkLSMd9E bJ!HHK{| us~~ןO?y}\כ7t{G{s6~W.כ{vw?~>߻oϿ^珟ϝ8_uܿ?}/~]?|כ>'{߿>kO1W}|p?~==|kymo7ogߏߎ_??6ÿ?_;~o\??G??y/^yXopaߧ{tWMkQ|Xկ|G7___5~9_/ߟkϷ;/? /7?j?4[<ֽ{okOkoG7}g?W˿?o<?cϏv?:v|j?}OG_FwƯ??j񏎿vƯikۿz=}]?3n_}4^]V?O_V_/dU{uSƯn[wo]}߻u?????_?yyOkC1xwouw Ͽ7:coooo_uھ//ko;?7QW^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>} \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_0_2f1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_2f1_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..15195d21385b0eede73fd2ebfdf61354647a4812 GIT binary patch literal 12468 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 GUjI)zux=Cp literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_2f1_states.bin.z b/client/resources/hardnested_tables/bitflip_0_2f1_states.bin.z deleted file mode 100644 index a4cc5d58c54c0b63b9a7a73ca28792535b688a30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77058 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 diff --git a/client/resources/hardnested_tables/bitflip_0_2f3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_2f3_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..18a6d49871207a91671b9bbecd09e0a98f45fb6b GIT binary patch literal 2268 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 G%zpu4Rqjmy literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_2f3_states.bin.z b/client/resources/hardnested_tables/bitflip_0_2f3_states.bin.z deleted file mode 100644 index f7bb63eb7878e931d723a7a353d2af818d2cc96b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44320 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 diff --git a/client/resources/hardnested_tables/bitflip_0_2f9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_2f9_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..fa1be58fd4b26d23f8c0a258942ba3c6ae602cf8 GIT binary patch literal 4981 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_2f9_states.bin.z b/client/resources/hardnested_tables/bitflip_0_2f9_states.bin.z deleted file mode 100644 index 4e5b2ff279cebc2f552d994ff58cf344c8e4323f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46813 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 YcrbzoBX}@^$Nv|>1E!zF|8dy=0=RtV761SM diff --git a/client/resources/hardnested_tables/bitflip_0_2fb_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_2fb_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b6c1eb54c9a47adde8f344c3c51fa06cddd1c782 GIT binary patch literal 1135 zcmYL{Z%k8H7{<>zx3{<4)_aQudL<ODVK@;2N5Y4e6};6AW>%pNmAXuJlKBCWeP|3g z;vk$`NED|Ar!LjFtQ#A{LEQb~LS~&u;|vnFbcSu+vgn;_93s=sKO1qNtDp9MdXx8; zC(oPbS^rvxZ*5@vs@Cl%Hcv#r#@zm;r%!J$mM_tL-6x$#)4;Y`0~&x65G-F0_Jbi) zyaE27TgO*8Vk<{-qP5?TIBTyQreJUF)YQ%k%ama5=s`sv4ITg%-)Q58Rkn_c<X~;b zrDZic30V1UP0b3tq0wdO9BEWLkCXx^bsiqR5-r5B(oKbHx!`dH*z%4!hiY0j1rOAy z$z<oy;h~Y4+QOapTM~IK=d~l((EG@a!nRX-7<~54(j;F*`I~%us#5HweW2I$p*my; zr^N@5xqHg!xp*;dQtP0;bq^yiGQ)mZG#pTW9a4sse9B1B#@?kb&_vwFC8WS^E?!P& z?LS-annSFmE1xuLk1o`qtv=2WLO%Xa)TX(nh0F4kL!yTu2`l+YH|XYu!vz+z2t5J) zs)u!PllEC5)XUx;NO*M81PY)|HfN$sYFhRx_Qe72I~kXdhGY-yw%i9D&pp=v5b{H_ zRtswnwZ!Bf;l1b=RHCOLu0ATqO1!wlkRQsA?Fq?j&N!@A_!~#tfZ{^EB$C6F935jt zaSaz6MLH{^h9WzQ;M~9^3C!o*gRH_>Ga*bn1daHzPmgmqIJ#v?YY(+&+`tQGWSeWO zdW#egLJHbtW8)_DgOfV;=soOfAO+T$>y(Bhu8Mc@Gy|EG*_zQG4#fTDKQJZ7Jz&nt zKVfxfLGP#Ssggl=#I0dmWxo0soTm|S5;5#RtTiFOCBa?xu~mF8F>@b*wAe>To0>ID zngjTG)hJ`tO<=EjPQ5ig+&aT8M7`)dE{dK8i}7M->rcE+!Uep^-+{jiWCy${0E~Uy z7*-_evv|3y_N#*W`5e415WnhIKTNuZC7Pgq?Odo{YlyVRE2iytxXF@V-K32wN`6`Z zZ-g7n2CXmdrym4TZX!YE@803#uS+ymAb@@|BLB_51G@O@LQ0B1M49Nna5tYSj(gDq zNQyX+7QPfd@nnIN41B^b(r~GPEAH|$p1@QUHL5@avSQk&?t$}YR)~1mS$#_GD9%*H zyM<8mnKsjkX1Ou1pjAqgcmf1tOMRWV&(C7+udLa!l1eL3oCL2qAbzB0cbrSNLGnsA zz(x*@BSYcPgoT}=`-zgTJ4B-r#l&O<`e8FsT-vEpNb<-_w>fa^lDHAe5m9lbUGU{J zQu69mvU<+?tO!td-=M8VDf*aH+Smv%9LUSlPlFD=6)|Sm7%rnMY}c~hD#bI~cuKbM yq?CJhtAP65h{epMM&USMEUYYNF$V`pBbvxclPu2&Ubk@ez4D8LgVzqeN&f>&!H^vQ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_2fb_states.bin.z b/client/resources/hardnested_tables/bitflip_0_2fb_states.bin.z deleted file mode 100644 index f8686dba6fe9851da2a7484b5352f4521b575ab0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23650 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 diff --git a/client/resources/hardnested_tables/bitflip_0_335_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_335_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..15195d21385b0eede73fd2ebfdf61354647a4812 GIT binary patch literal 12468 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 GUjI)zux=Cp literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_335_states.bin.z b/client/resources/hardnested_tables/bitflip_0_335_states.bin.z deleted file mode 100644 index a4cc5d58c54c0b63b9a7a73ca28792535b688a30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77058 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 diff --git a/client/resources/hardnested_tables/bitflip_0_337_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_337_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..18a6d49871207a91671b9bbecd09e0a98f45fb6b GIT binary patch literal 2268 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 G%zpu4Rqjmy literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_337_states.bin.z b/client/resources/hardnested_tables/bitflip_0_337_states.bin.z deleted file mode 100644 index f7bb63eb7878e931d723a7a353d2af818d2cc96b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44320 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 diff --git a/client/resources/hardnested_tables/bitflip_0_33d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_33d_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..fa1be58fd4b26d23f8c0a258942ba3c6ae602cf8 GIT binary patch literal 4981 zcmaJ@|5K9rzV{obJXj&}fSit{fXM^u6N59ZvssFu5Efsa2azd#9+&1KKh;jn^u?_J zQ9*6dpe4^~6BLC<-6cn7+Ge)^>s(~!-a)V2)9mctv2J_Dx}81dDYv$^F8c@E`}yJX z!{<Ho{`PvkU!QlQ!SvDohW2u8yY&3$PqY47w7L1As`g+0K*_iq$;imf-kUS9{>Mx8 zEr<{DKmmn{kT)JuWmHfmAx%);=q_r>7(pR!Kz*npBP$5);%Bpzt>nD>BG~&$zGFPf z>XXr__<k{qvnw9Mhsw)sIbFppC0(OwZLN5fQCyt4m?`HMn!6@stz+7i1Cq5@2R)M4 zE7|WdyzZNiLwX-OR9Wbuav+*6Yt0oK-0QID$|mQD(QxyBg@oi_AJcP$=*zg7N37=N zZR#tLh+aQ7?V3r9bOdr@vm8_mC559puGgBdl>w=WTig{EYVRPts9!w(NJq0in+lry zQ31(r9ep-seHKd2?7fpyKR!QsCunL}9}4;`rz(C@y--E&a8P)LvZy85^|H}+`B^aU zZSM(rPsN{7je13mD$$p<4HCKN4&v|@aDTE`v3V?5O|miz_0X@W`m#D8CJ!LtfKNvo zU({*@6+;f~Gr!q=A$UT9z%!9yZQ~q+?MwS6ZhDU~^V4Ar)0Q*Z=fY}I>~ZioDrlOr z>l-dUGBW`rRa0~xAlSYXwVc3piYi)iMp{+6(HS`U{q*Yet@F%ROkhi0?<^nr2zknz zJc87PEGN;e1{3;3{uAn)1}L}nnqRb(j$J9<gWb?(vu9UIJUPwRd-OuiWIc4r*E9G% z`txXyYUW`eRtJoSXU1m+t}rlp?4v`Ebi@<@O<BxS+%bk}Sc@dGHGMQ|Y)&(*hCAB} z7$1k6ZO%T|Z7>wbjT;)ya8m-P1h5}(@p4Fh-vi|R<#6*4of`yRZIwSq|4v(B13sOr zZq(p6d#tg;Er$W?8r0KJ?>WHlApKKIB2GvE;*YAI3ep((;v+x%64QJXXNP)mom`a8 zB-BCLCO&i5$38B+pr}4o^57V+lCl8MV108u_@?5s*vsn1_1je-=@*(ujbrJEe&PjM zqix#ru=Dvb2;Bxr&qms5gl|(=RaT6o8ZIjK<t55NV3)|_);SHK_gN`;u~mC$XG53I zzEK7IsQvY%y(e#3GY1v##lm_S2m%0*7n{gh_5EFyn1;MUVvdxC`OrcdtD~mR1KMrw zm&gWceQDR`TmYE~;;jFKAbOT*-N`-5IGX0(diZvACf;V9Q|}}RfxOjRho%;=oMY7L zWwdQtEB6b_2_yywah6aB0;M~DMBa=VLhpdQE$jNd7Bqo&W_D?obs()5yX*E?Q<8yc zv_?WqwY2?0`_20GzsvdO)dy0f-zH&;-6KJjA-(WWN>moBL28gS#xFFxJxx3iso@SI zk>Be{m!oE0_J3B&H-}<%A^Y>3_lvFk24BUNoPRPuLJ$0Y?`wkI08g6j*(<6T!|qo4 zaaKDL#fGZ8YK21L)6jZzR@B@_n0-6kUeIEao2Nz@{;NFb94hifF+EUZ%e+83Z2bx- zl+j*D3tu#?FP537(s|1(RcriM6f=Y@-8{QB)vAiY?FuEx(2eSagjWbs!um=rsTW&- zQp&Vh6Pfq*;+PEC56a<icmcH&CVizURnS<BL>U%Llb8bXmXYfu14mJyN)8uxX;z9! z#NnK7C~7j0>;!K18UmPGw^F#~zYmZIUC=xg#AGPnngV-GU}$^+q!C`3%4?VcL%n7% zO5m){8<L!!K?Dwrf5ShS9uMM1W}=^eT(w#b@Q*R`(u_I!mKG{{>0u}v1t_f5OaT9M zE-E?i?5TsN*waZ_FYzXC8$cq9MGMY$h$W+We(&Jqyw5#R;gyl>z1VQptvn;YcM$5M zg|Z=X2uaTHa$h<-yPPkwHUnVeoI<f`lU9-(JWp%k5J>oX)0weL|A2@C*nA%Y*HPFs zLgxY1uuwRD0`g9V-6tev9$1Koe9op>PG0PR>et>Al66{&${{tsM?a=LW0*$_eA6(= zKy)h-A*;xl<~K;PM(*Jkt?z&bEw6UzY4zr|{{)aZl0Bw<P?7M5^?D)jH{v?fzXs-D z;q>(S&w>ESMS5P1n?3g9r5#o{+^)Izkol~7t%LN87z@>7hUxp9%#$<79CTfE1$fT< zK5$O;mh>7u8m|JjN$*Ho#7&Ctm8M-2KE`<lJ-V3iJ>|Epp>HVnO50q_E#d+#rL`Xe ztnihh@X@u-pMg#0yR5(qBwzcZ=I*+|kDuW6o>BB$VHwz@&B64QjGaF)#6e8)4!R+) zlvfshUNn&v6E)qmltApzh74pDeSP_^&pf?|9>{tb>>;gR$$CwSUdX{&1fK3ehesJW zIg=HGuaK-)N!F*0ZAraQ=>Gb&!{3?}n^m+^76y{l|L_AZ-@c}FDm=vDd|Ba8&O)%u z8AdlbkRvjTTr2YuG8AraN`#J%52^QQ3X_IVMYwE*%HgB!a-0(Fa>uTbI7m`&O>z@c zLA)D*7x&6C4Hf8fp4NZOHA0L96)T5xLOxONbw$GBQKkWwi^0*syi{3u3K2Wp()!15 zQ7vCD4B$GXM)H9;3nUGrLqr!D$n(A9fA-*c2c)>`EZTP;?7imHE1C<71WnwV|EA0d zhexuJ8lLnl_x<Dd=9{NV6x>Z1B)m{;PT}bABVLM^M&!LNqQrj98KW_8=?45C@51z; z#Y}s~H}^w-29a6d;dek{deXn@UsaqRsPc=fC!5UKicq3WUPU^Bz<M+mi<&ie^3EuJ z7aArhC22C1Jz`rvl{-UGobss47fZB3UX3R$Nu#6dw`EKyq;;xeu~=dXNe_28Jnsnx z&I5&2K-z(j=$9f1q*k*oaccp<Vn*grWj-tf0}_&3Yh9L~(JCgfk<JF)p`%>-!$l3{ zHF3Skw=Qd$3K@dJ;B|`H?w|Blau*e`6jj5p&VmdH)TiPUO^_y)AgTmI^2v$(8cAL( zMkG9LCFoH1noyi215|z-KcR|*hg|zLi$&(Xfns$HuTl$;0s=&wb%Dn+j2r>d6Oxt_ zFO;g&v@0H4>=tanrx*H9DQb{)p@wG_AwwK{0zG*Jq}h9M96#+7kO;;x&P$Nc73x7o zcTpG(F+AB>B1$AYj4ByE_7tHe#(bA=Q9&SYPTSI5z%zRY-RMvuEB%cmdPP%&P^ekh zwOSU{0i>WLD^ac)3TV^%0%{5LG&jzaf{oXJiW|~1tw^jc-;KuRvQmPafT<mN)O7^} zeWn>wPzVw@j-~&+tn@l`+vV#(#WK6TQeC4=w*){|$-!>LG7^h+3)Bo&Wy@&nL4)34 z^<axFHj>>w8BCXxw&GnHS!ShNt#(c}#ReYnPr40<#ARCnZcWpg)S7TuQ!Voj>+Co^ zB-d*QJ=ux|g@u9SFj@=ps<Fi~@xc8+yoz~fvEmz2f`KijS0u{4H%`j3Xe`n3G8(7; zHQV0*=G0Q{Lsd>rMlCBNr#U0~I^+L1e^Iu=V_jIemukHKANf<|S>2cazo)EG4L6Cf z{-k~R<>af9tG_jUofH&(y;jaO(1<3X(7_+?a`@*OWY$%_fw21yy5`7E@3|e;NZX=3 zbcAUm_hnPz7fkCH0fpF5P95C4HYjH|5LeZ?{uz03`Ji+|++L2{00(m=QvZgM)umXE zpWZ#V_X+TfI<R2~-WCq%cWa(h)38sK>`Jhp036hanl0A1_K`jL9sYib0hC_eW*2Q7 z&wI182wDDk_rO_L;uKZ8wy(OjS`q>Od?mfqR<ziZu)I>NRG%^$Dw!^?vArT@3NP&W zp|%#qV)&EV`WF-Nji=}_fGeupb?Mu#I<aZ>i}8(x;~<q?skpPRZ236T_qO@<=aUyo z`d{v@4|O)pDW24ggpLi`8j^R7#Y{&DxpXOiDeo6nvlTziUpYsQ(y5BC<W42)_~FL~ zx9UH6{6(~RzIxy*NBmQERpV2-KRIJxK0-efbs1UWkrAU8_fL)BSj=?I8Ql&LB{J>{ zaC`$!T>V>d!-L{->H4EOMHEW`0|(bx)sYWI_`Bsjv>x?G<&qKOw45zyirU$3czu<4 zP23%Mw$JiUme{C2eVobjM>f7uUl?@##P?$>V#7#KR6visUHbWpA37-8Xb<=GVDD@i znORn6Sts{i=EnKmyLZC}v*NO1;IU)$%S;>hruRL^A9_8U>%Zpjs<!lNrX-Dfkgq_+ z5*adH7x1tT@RE#WWNhpQOKi4>xcYf})0o{oMP=!68x;;;Bm2%vT~A<RF}06s+q;x| zXJ6zZzhsBh_pBH0_{*NA5}xtPo!QZ&{EpJ~rCjpvlI;BTG3YEO8_;}N@kM52%eMpo z&!I)`*<vzC!?7hYmADz(BOc!Q1V7i1e6K#ExX?GcSkBVx>wCSTD(DWo%EoX0h50J~ ztwwWzccJ&-oDjlY3&nIYWJ>gb)?~N(HORu@aC~9JgkiBIGOJq>QT&S1#vh%Aw<+&k zYiNz8L!+r>MB3ENS+^OfvY!6<x4Z*1T-~Qw*6WQh7T&I+igx!~PP4=Y7IdR2X)I=7 ziS!PtDrp!wiDCO8?11%3e$*+fb~JvhSYOrkNu(imC3G8$BqM7>u*nn-8$GuC8V<R^ zM$Wg9hYRSEvS<*-BJprIGB1=(npP%w6V#zJ`#s7&3Jh~fZ9v5gG$r?x)60y*JmZ*+ zlDvLc!r8mhHzdZ*Y8|v-@!9>!70i%nla7d}qT&KN8B~N<`dIDo7##l1pS&vr74b6y z|C6d64e@XGNke+kksaWW_|nFL=e#PIR$P-3G5yAy0N(XCZ&vPUF#CF9Jq>-f!g*%` z1VIT8?~+MJ+XX;2H7%1vsFDc#T;T<Ge5yrUsW|$h;06EOp)Ji^;{&OuToE^oxKcdZ zq3~?^Aj%7R#jW6Aqtapb=oFD9o~XgW(!}S-;r*c0krRt8?YbK^c4piW3JX7MoTIM_ z`Nr9+rN$ci-l%bgOr=s;dwd^0+4{KYe2ciKXYg4cDA~a{I~p&i!dOov0X(My<jm+~ zo5e;(vmah4py#hmB=uPQ=GM+1F8+7qRd!R)_|o^~mKEGsOgs76(m&|&yN}*9yxOrd zdC>KyVbi|d68F}2;<XoD-!YEPb_VaM&su)7J>Hk?->9QEZOrBVd~p0=>4!rTj|($@ zrf-s+OI-YP<ECCH3h0GYw(n8~+kW|`yRKzb7OF1Pv)bjIBWDLC$?%e+KKnVlBzYiv zwfgervD`@Q0c-3&9JTFiG5)!n3^KDxdicz)n+-Oq|H9~E8q#ioYTn`8_uBg1AY}zC z3UgGqxX}YZ=`o;jKRR$tLRQ3cZ*{di_84K!Tt+-RFBi!eto;(HsSJ0mQr)wCg9Q!v zq}3$g0c#Z>2`cDhiqPYel#Y5vjoMP{idiP%>m2q<P#S9Iw>|s}GkQhJa;g9QCz107 z+<8{WMqz&7y!m`!E7++RnE1Y!VVo=6Coj7;$+#4Z4Ar!_SGu8zXy?OA!HcAy3cqEO z$#(w(q+=9{Pys13;vA~C7=rz`YUI*K^6{jR<#;LpT<dXf$-nxZ9Drtt#g_9ewO5fH zc?+T7?yI5Qnei}Qi`!amphp}Q8?a+X{-`Op>HZ&E?(b$HC+{B<9g*bIsc?d0v-g)~ zJE~Z?D;{2=!pma+d8%rC6UO3I!Q#@BSF)bWP;1$ZCKkhDYtf6)sJo4fs(rkdgQ|&y zW?SsMc!rm|TA)a8hKhyOJfjYk;{*>|8>Sb4Jhc^zfsM<J_pcQwqAqMjpwa6F0V+3s zT|f>U2GDX4EPw=55l99#UPqu33@M$f>Io{_;ZGrVDf(_`{ZVWdHeq9R1IxAUrEIc) zs94~r%*}MrtO=fdY4iw_DulyJJN$IA^Q!%ALB4f?E%Yx4H7UO3gxX>s$Bjx@ZOb1w zg|XN$`&u9*Zl!DV5XQpdgwdqjUrtN~sC04x<SiC(=Nm?Fyr1$ZNA(f3CLk-G9vP-q z5%Wx`3pc5a=HqPbgp9-U4VbW%2?<qP430nLYBoj6L9%mY0LE5At)Tw|nN?Hn)<oR{ zORC_K!U3C{UU*5<0*7r>R#$JBHaT*5SJ{HPj(1uyZx?ammlt$y*r+SWGtSa^{L>Co w;BbQx*p+lXQSPwGJ6rZQCCW$d*d|<EGr>Ba35(BHe_(zptyQ_Ag8u*cU-)1DiU0rr literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_33d_states.bin.z b/client/resources/hardnested_tables/bitflip_0_33d_states.bin.z deleted file mode 100644 index 4e5b2ff279cebc2f552d994ff58cf344c8e4323f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46813 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 YcrbzoBX}@^$Nv|>1E!zF|8dy=0=RtV761SM diff --git a/client/resources/hardnested_tables/bitflip_0_33f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_33f_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b6c1eb54c9a47adde8f344c3c51fa06cddd1c782 GIT binary patch literal 1135 zcmYL{Z%k8H7{<>zx3{<4)_aQudL<ODVK@;2N5Y4e6};6AW>%pNmAXuJlKBCWeP|3g z;vk$`NED|Ar!LjFtQ#A{LEQb~LS~&u;|vnFbcSu+vgn;_93s=sKO1qNtDp9MdXx8; zC(oPbS^rvxZ*5@vs@Cl%Hcv#r#@zm;r%!J$mM_tL-6x$#)4;Y`0~&x65G-F0_Jbi) zyaE27TgO*8Vk<{-qP5?TIBTyQreJUF)YQ%k%ama5=s`sv4ITg%-)Q58Rkn_c<X~;b zrDZic30V1UP0b3tq0wdO9BEWLkCXx^bsiqR5-r5B(oKbHx!`dH*z%4!hiY0j1rOAy z$z<oy;h~Y4+QOapTM~IK=d~l((EG@a!nRX-7<~54(j;F*`I~%us#5HweW2I$p*my; zr^N@5xqHg!xp*;dQtP0;bq^yiGQ)mZG#pTW9a4sse9B1B#@?kb&_vwFC8WS^E?!P& z?LS-annSFmE1xuLk1o`qtv=2WLO%Xa)TX(nh0F4kL!yTu2`l+YH|XYu!vz+z2t5J) zs)u!PllEC5)XUx;NO*M81PY)|HfN$sYFhRx_Qe72I~kXdhGY-yw%i9D&pp=v5b{H_ zRtswnwZ!Bf;l1b=RHCOLu0ATqO1!wlkRQsA?Fq?j&N!@A_!~#tfZ{^EB$C6F935jt zaSaz6MLH{^h9WzQ;M~9^3C!o*gRH_>Ga*bn1daHzPmgmqIJ#v?YY(+&+`tQGWSeWO zdW#egLJHbtW8)_DgOfV;=soOfAO+T$>y(Bhu8Mc@Gy|EG*_zQG4#fTDKQJZ7Jz&nt zKVfxfLGP#Ssggl=#I0dmWxo0soTm|S5;5#RtTiFOCBa?xu~mF8F>@b*wAe>To0>ID zngjTG)hJ`tO<=EjPQ5ig+&aT8M7`)dE{dK8i}7M->rcE+!Uep^-+{jiWCy${0E~Uy z7*-_evv|3y_N#*W`5e415WnhIKTNuZC7Pgq?Odo{YlyVRE2iytxXF@V-K32wN`6`Z zZ-g7n2CXmdrym4TZX!YE@803#uS+ymAb@@|BLB_51G@O@LQ0B1M49Nna5tYSj(gDq zNQyX+7QPfd@nnIN41B^b(r~GPEAH|$p1@QUHL5@avSQk&?t$}YR)~1mS$#_GD9%*H zyM<8mnKsjkX1Ou1pjAqgcmf1tOMRWV&(C7+udLa!l1eL3oCL2qAbzB0cbrSNLGnsA zz(x*@BSYcPgoT}=`-zgTJ4B-r#l&O<`e8FsT-vEpNb<-_w>fa^lDHAe5m9lbUGU{J zQu69mvU<+?tO!td-=M8VDf*aH+Smv%9LUSlPlFD=6)|Sm7%rnMY}c~hD#bI~cuKbM yq?CJhtAP65h{epMM&USMEUYYNF$V`pBbvxclPu2&Ubk@ez4D8LgVzqeN&f>&!H^vQ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_33f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_33f_states.bin.z deleted file mode 100644 index f8686dba6fe9851da2a7484b5352f4521b575ab0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23650 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 diff --git a/client/resources/hardnested_tables/bitflip_0_350_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_350_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..fe85775bfe7cdafa269bb9b1c2202af269e763c7 GIT binary patch literal 1680 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 N^*D=5@4XlI{2wZ5kZb?| literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_350_states.bin.z b/client/resources/hardnested_tables/bitflip_0_350_states.bin.z deleted file mode 100644 index 479bacb03..000000000 --- a/client/resources/hardnested_tables/bitflip_0_350_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xMnFaWtщ|5o}4Lg ObOjzߟ1$_K߿rK->ɷޥ/~}K?kxzI,t_~[?~O}־}~;nnr|_O?鷷>ޯ_OCe9w}{}zǏa<㯿KŷwKIߧn;7I?鏗O/???O/O{??O_o/_?w_w_w?_?_?oO_w_Ow_?oO_w_OwO_o/_?w_w_w?_??O_o/_?w_w_w?_??_w?_??O_o/_?w_w_Ow_?oO_wO_o/_?w_w_w?_???oO_w_Ow_w?_??O_o/_?w_w__Ow_?oO_w?oO_w_Ow_w?_??O_o/_?w_w__Ow_?oO_wO_o/_?w_w_w?_??OO_ӿO??O??ӿ/?{g{gO??o??_'{???ӿ/???oO_w_Ow_??_oO????O/o?o??Oӿo????/?o?Oӿ/?O??w?_??O_o/_?w_w__o/_?w_w_w?_??O_o/_?w_w_w?_??OoO_w_Ow_?oO_w_Ow_?_oO????O/o?o??Oӿo????/?o?Oӿ/?O???_oO????O/o?o??Oӿo????/?o?Oӿ/?O?????_'{???ӿ/???OO_ӿO??O??ӿ/?{g{gO??o??_'{???ӿ/???OO_ӿO??O??ӿ/?{g{gO??oOw_?oO_w_Ow_?oO_w_O_w_Ow_?o???O/o?o??Oӿo????/?o?Oӿ/?O???_oO?_??O_o/_?w_w_w?_'{???ӿ/???OO_ӿO??O??ӿ/?{g{gO??o??????/?o?Oӿ/?O???_oO????O/o?o??Oӿow_w_w?_??O_o/_?_w_Ow_?oOw_w_w?_??O_o/_?_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_O_w_w?_??O_o/_?w_w_Ow_?oO_??O_o/_?w_w_w?_w_w?_??O_o/_?w_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_O_w_w?_??O_o/_?w_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_O_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_Ow_w?_??O_o/_?w_w_Ow_?oO_w_Ow_?oO_??O_o/_?w_w_w?__?oO_w_Ow_w?_??O_o/_?w_w_Ow_?oO_w_?oO_w_Ow_?oO_w_Ow[ \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_0_365_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_365_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..15195d21385b0eede73fd2ebfdf61354647a4812 GIT binary patch literal 12468 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 GUjI)zux=Cp literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_365_states.bin.z b/client/resources/hardnested_tables/bitflip_0_365_states.bin.z deleted file mode 100644 index a4cc5d58c54c0b63b9a7a73ca28792535b688a30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77058 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 diff --git a/client/resources/hardnested_tables/bitflip_0_367_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_367_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..18a6d49871207a91671b9bbecd09e0a98f45fb6b GIT binary patch literal 2268 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 G%zpu4Rqjmy literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_367_states.bin.z b/client/resources/hardnested_tables/bitflip_0_367_states.bin.z deleted file mode 100644 index f7bb63eb7878e931d723a7a353d2af818d2cc96b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44320 zcmeHweN<HC+V`pKXjx$&$}!W)JVs_Vl_@F6&Nzx`hTo_tb4&{pJ#&;05tuu*q9mQn z56TaAhKPtTDj+EzJ2e~?W&8j}K-tFE00V4ihM7J4>%QK5@O0kyeb(Dr&$FKXc;EHz zHGi-dvlnacd*9b}{jT5j<F_}|bsbo=cXUu{p5<ChaP&I~-=F_7^~{&k_1gGH-+g}5 zM0;lXQhR*e^?t+qZ1%%801kqn?Jeq(D7+#^iKV=|fvevb++Yb$)++XKnnI+%itHN- ztyu<JIa4RlaY|7-%n|r>Sd15$G<mQA&vQ~8t_kh#T+itYSJ_XZye$gpl9jdli=YA$ z;m%+wDIE;{j~2-a6C_-Lde=!lb$ft|YZ5!XA?DbY_~v*GQ{)Ke4eeZL$QN9IBVuoX zMe66$?9d*#X1lO6jjfUfU0Svv-Q{BIE=jxKQypa%T#1<1SKFFIW$mCOl%8gx7@7k| z?XRMde`J(9xr5)z&7jf#?Uslu#-(5?#U@dTRidrNR9xiXjvqr`QJF6N9drxK-7vI= zUAw-Dxq(NPn)a0Rpj<h^1w1>SvB2e!EV;kJXLayV)+`n(cd$k%z!8`?@mKD^#e3Xq z`z_Y1;l&%StVF_h!MHhj*tf+YyUaOBtyYM+`b$fojNR-EoZJ`?XV(p5-iN9@<cAlz zP47b{$LD1<JIJ4P?4PKlZKM+5%;otqm)pa{%g3jICQv+{QW27Jc*PaGtIVi`yxA3Q zvTK_jQ8wAVyF6fy?s5(7<eQG!VE8wy@Q7e)L@0Sw^-3r+dL4ja5RX=%aS{%{<4ihO zM8DLmEeVm6H!%Il4c_#^UU&Y-*b=9k$pzjRJ5CIWgOY87SXW6SOoW#hkOa+QIO#F8 zE9{G$8{7VZj?}PbfLDPH0rmtoU!r%TJ@%!YjNd~eKSE_?;q_X*t@faThduCaI<nTX zjoy(`?RlK<v^1iJJ@G5>d<Q+h3ufUTJ<JO@euwQHNw*a)Idysn9Wr-{;k{3o>}`~B z`t-6Av=Lq^Eqe*yPDQiwU0>8Vp8sg@=7~FApfcicSi3U(;>?B_En}}}$6TeBCd)hI zrXStZ5SZA;H0_UsZI!U)2fYVPXXxChcl7wjk@sMDzq+{)dd=yeAC%d>P5S4cy`0(V zpi|ATWY~w_p?)vmaGCZ}60Gw)-6wfBqqRkcy?eko##R(-_>((hT~f+8!}3yiz1C|! z1~>SaT<BoYcqJkpL_za1+=a8S1^R;i%Lv~O-4%2XDlL2?<%Vpa*5f0<IyQE|TnHTH zR|VSC5xENirXp}*xJ-fYJP*PzS+`4{>f-$p+qzs9OIEVe<?`TiYhRi?amTnc$0*4^ zI9<~i_L)t`X`GfC-Q>Fz{_O*YF}ZdYC&(dKd1P8KP)O4WMbDxlhU!qtIfU?z+o0#% z;Vff_XDWY!;$P4!l5revTnI7K<V!J-SAxTy|5#zC#zM>75Ur<0;!Q|rZy9caOR=jJ zP?QOEv+y=g(OZT~h9_#`yulwU`-JFf=3AU7hCPDXv*CuD>uv)1j!n^7j8fQOC7_fp zKo2|pE3H$~OWf!stHr(eW%xKTghB5#Q=UnPKA^b^J0P9!3x1Q^P`?gsr*A1U8@ans z-%7tS3+9Ncw}ppQYR`$OdtGVY+VkE1K|Rc#^nV5SB#7yf=@?vNo3QsVq>O=z3)EcY zPZJDt#zT!f)(IC{A?_M7*Up9oRq?}?LeX@bBZLD}DuG~2Jh0PNQFLJl-%7WL^H?d3 zge{YeN@Kuv#;rB#vd}6k(-)435n13AkRY4+-{Lje0*QCDm|q~WVR*Eg@{%Xs3_Bql zQvx~Q(!dDJY0%TaErh0K%Vny<{i=s9M9CY{ht_dNu`TZYQhJWVF*)C>+oTNr9?h4d z=S$Qs=7?hY5|%cfzJ}8p(Mj1_4+8{U6=ab=UbftcE<wr<?;Z(-7)}bEl`rc)SKgWr zVndU$S>vAzwO;FF7;3vM>OaAnKFRseq?86yKf?&{!hp|07EWf~zSiT=+=EkIKQEjn z*A8Cc8Q%@u1rzfS&{b)7;k@MA$n4Ab9ZbGI>6%VXcYI2I<%cygkh53vF5Q!w<smSp z9md|3=N{E83xPGaq3;XWZ}I@gze9=~odYwZ_=0e&ZRQGTN{lt$$qTrtqABZOd5f;w z_-d_DqqJmlBNX!thbzyi9|}UuQuqj8JqT~O((DwBeFs_^sP9ZQA}WySL@PA>D(iw8 z>g02EHqA~4J2A>657mbZO*KK3ICC^KxO5eiNrdxmjfL)zv)#5@=h+zR{M_`AiCk)q zg>7^5)z;#>RE#6$E>y<8A?uozd5*)MJD6;K%(v%{1>0;);m)+H%%6as;P+7PU6Xa# z=ILFf)Q~N}z~eH?aYf&Qu14y9{QGqmJ&kpjp{56pbyMHBv4cHO)uWBjp~2y0x)qxg z-Az<=-r&zz+}gM{II|8c$F<P~5Iq$y5t+r_EC-CUN8glbd)eLw{h{bpJ@FklVaS*= zTS7U+;n@b@UDQ-JjK7@7V>U`Q16vP87KlFvYn{<8bjwD6$x_FJ1Y4fyik}aziBjZq z%nB;;7FvK8$)=z2_AAWGIRB`kxvZ<g5x>Bz&Lt~hhJ%`o&-#V#UVF2~t^3FX!@D%1 zeMk*jri|Z5Zg)VRk6mMBC)L`C9$)hcm+3scQF+wv9U+*f*wJ|Gi>?Vpc*p_hJDKf- zT?Q($^s@$e%8a`ZI-np6r~J^;L{&jiIXVJV5hh#sGaNv&Et)I9w~A)-DG!hA;)opA zi57W%rQZ*RdE2?;7xc$?>ct`Ojhnm0+zEqf23CuvZtQkZ^YHyt>xbC^razMh!+b~f z?E#uAN4^A$I_25GG`W4jqMtMD2<QfdEk1#nYb2Ar;?8<TiughqYf}94l@aCk&vEJ; zm=On?BPesYJZ%}UqhYl&un%s6-#+>d$Oq`6&0G^pe_9}ci$9A|jw4=@G8%L;=53lw z3V5QRN3qBA_OB&ohHO3w3!Ajt-OLxi&?O%3vK{sLwg%R`$?HN|Tp#Gl5QuzX)G((= z2b*hvW$BE^TiBH-wJELB_V=YJmYp@s_h^AKx}C{FyY8i>i`u2o9fB=vas#;KpU|%B z=!P_fH-#r8q%r?2d)3*T3!$eCdDb~Xc)d$do_+yNaDvn+{|SsTUqW(Izjq*X7Fy<u zUhP0c;(9!+*d(Uih>l5`xX$oojjn1xvug>R%iKB$g*|f9CrM==7&--Aj188!ib5>c z-&Cm8f^IzizN7C&$Ig>NQ7gRz0>^`C3l6H>E*AY*=4um}`A*$cBtq96uu!ahf3U7> zT*FU+@QO7{Y+#zlGI*w9Un<eoT$CVBROS}rNnTPw2>7u;g^emRQVKTOs@kbU%-RhO zrsxKQICa^*wKV`}89Ct+1OQ@WB*Rq&Nis5vngHMK&Wk?*#}xZ{SLZcDgqt$uGv$sM zp8OPrghe?#+R0s%a~i3fIyfj#=|WRv?gh)|9_AU?*}^p7l#B2qCZ+lkKXfO|z*L`^ z?+g`niL7Sx-WGVd)0{0@`C;g<@Y71ga)Eh5<leH?pbQs0-?mTDa9pYI0M-a3#XaA1 z_EGWS&4-Qfsc*mk43=DS?Pg2X&%NLPDMP(*sH_iY8Z<IVCJP+?PV#-)fr!mew5>1s zRc~@3XNMNku+{q)m!N+a=m%`{9Hk#QZo-r=uWtU51eOCe!Y}X@Ir3qE&q(#06|8@u zUc0!sY$s#kHM(Kc<6~Zhb?B2z2DweEP1dwiQCsQw-N^2>=<H&kOaFwD_C2!%1o}x) z%j2_2g*A}T0=J7X|AY<d95t=}H6ifb*HGiw*urgawJ%Ik_#67g_ZxtOYPjD4*urxu z%O1a|;=EPvp6dy^CCPZIi7}NmJPeCcbq_&&`p#eB1ukoA;FzyrW~qM1b04)#pdj}^ z$!h$t7p^4y<^Elt1${y9D(QL#%b@7*LgWEz3+Vmff!^ec{>dD;2Xk=IVTg`{OMipP z<B)Y2ofgH44Nm2S{++NFXAJWcdz14}b|_ePOX!Q_2^k7C)@i!|)#s>fU|K}&YlS6z zb&p}hq`4W)T;5W@(lN<08k<~3r^L|k`cWvF-B8Sfr;)<YfSF{>ELV&>snKK)7vDlP z*!^q5`jt$MNdKn+?pIDf!(Wbmz3)^WypgE*eGJ!h>~Y-RUQ{b@AzNnJKKj=*cs&|o zRxVG_?zU9hBNm!9m#9}4L%yRox=y><Hks-tegs)PQf<e`o>uMR2SKy>he>X#&ln9H z#LO5Rs`v`I8;18#zOAwEGNg6FfPz8>BCVQ5|3@I3atxVqSBPlBO7u+>$D3$4==4?h z-hKGRhH<_JQ!e)fPEOL|xj>7s+-4MEsEOooH`?iZTY-~r-Pr1e&oRj)*;M8&=8aA| zp^N#hOEW4;+oRhh>W)hOCE^4_W7wk-L<!M$)ARQ<@Y@HGKdOKpf(;tLeGc6Ln(^~M z<Tj?B)wppZ&rmR}8;W=_i_<a1y6D@mw2|7Qn4d*!kHNUV;^smW5d|Z@DZu)S)8HIM z`%6wmvN9&O^BXHPPdJ4E<LB1A1XJ%9!oK#2N$Cans+`}Udlx1t8J{sdRj6Hz=N$-l zyRgY-Rx-ZEI~%lTQ1a!9V)=7d+>QV}DVOfp(mj_^UAl#%2MESw3ma|g>qX6sO*u<K zP}FP|`v;NbLfPIRFPstr`d2Z#LL!@P?r^0Z$3M2pna$#ArThuSlxfpsHMs`5mRn$P z5ZLxI?u6}!+hJJ+oOD>`QEzXjcU@)1!Phc#LO}m&Ob5CTgjpf?TUdo}5)6+K7NTs; zf-~1~p;U-I9a7EXk+k5}cj&k}DEWs{(PV9>>)hN~DhF4$Gf7w%0*++4okzi0??bH% zqWDxO-HrJjFkR_=;6B9qFX$?@kkY5`hI$(W)xcW<Y2VhBrYg~0I!$_Xil_J}Bpgu2 zY}cKnCw2P50!REEg|+Gi!lG*I*P>koqZ^Tb!m9<4>7`!*w}<*0_V+bG;bq)+vd#&^ zS3cEo4eBI3pz0NfSVp~H&6M%K2PQTk?yBECxJXi5pM!o2u4xCnnJo8}$$ozbqkoWV zrwkzv_wHD*b3a3Xd!!fcVILSP+RA+6!v>utPsz-h;NSW)ikw}i$PvGozq6njB0TmM z?CJ<3$3uA7<jbpnlQks2J`FyEqS<^8957raDYr4<=~~0}I`;uNxeUBc@5d|G3TaZt z3{O)SN@$m+fn$zbk|Rf&5ngO1#XGi*xgxiS7Wn!aI?emF<`iPh7_c?CnfSNBy1i&T zbKE1CSI9-%t)r27U%0u^&ZHS`US@dN>a^rw_@`oaWlcn@l!Q}B_v+&2=VTcxrN$0d z;6^3c?S9p3Su8*6WnB9o1OEhSe#ytnWPL|+YV&KOErOu$YW~or{TZSw&)+XRei&sa zy(Q;I%U$5mL%?>(gJo1q@PBW~*&=m)25C-aoI>SD;V+8uUntZ#rJ~xZyReh<U-Wmd z_GsM4*>WycnK4vk@@~V}&WgcZ@cj-d4Vwnxk7aaKtbG$~XH19rA?@Eks~k9k8m6Xl z2~iGo0PSKyk&UwzW}CC26pH-Gs`4J_a=}nL+Al96d$^$-=X*?kmi$m@X*HBo;z4F@ zt!0>p-i-#q=;O=?muV{;TLmdj|3Vn(U{Ztq>tK!?z6;$uKkLKW1#wDRtsPC1Qn2`i zTepz8+DdM>&*VD!F-A5{kaVF#DiX7k@}ih?6Y(^>_PR)K>y56;T$pNu$=3oUDwDM= z&>jp#*PkL?QlGADvQq`GpBvUVG#$P|o(+BnNx^*@*m;;)K^m}JMPbk2iycX;Col(G z4;|6$ZVEc)7-Cn9mo88%lpv3uzmD7-wGZbMBSrSx-MiF2@EZ6_j_-%Im1J6*Ezv<T zYZYjMP!(_+Ci#M8->$wLkXF89!7<SGkW4Z|8C8yVFM}&FP`(<bIW``IAFE)_9p-Me z#ql&X=N9mnsYvwjCLpcczdrj!=maF$9Fmt0c)kmRoO~SERq`E-kMRBsC_>me(gs_p zWDxHt6Pqyi6rAX!YP_k-71MA>fJrHKikeM_+-S&EB`sVixs}GT3{K8XODVwtmJ@E^ zdE3fRA+WBO>6x(5`m5`ZTi;60hv_2Mt{Ew3X5krDrq~Fsc$!C(sBX=NJ#>%Zx?-Oj z)zG5dZ%PeLu*0l8+Fm#h-}EFI;IoUUGZBXb^){=MIFg$-UxNWvx?8^Gno-V@xV}m) z`T=M5)ILjZ->>`3?LW?@9chiWYuC4-F_Yk}p|t5cO(M3|36xdNwZy(T6Z|4^+BS4p zd|;h?Xf@6iqMKpcRj~g6+w(JU?h!8d4A$=^lpl>zA`dPLKQX|Prr#FWeU-HA*=4*| zxMCueYNM63?EjI&YjF`?z{oX)Gte|4PPC*0e@53!;Th$Kj@}3EL#*_D=*ntI=|i#q zkwK$kK)e?mRKU(xEcQ<QTKQY0a~Y7Za4-)_L2tlOujQx*y@X~<x+kIdV(dXhTMjD( zQxObzGDjd>LC$1zGki-x;Lceo*xJCS{P2;$JSwd{iruBZ2PVu?qTcW+gkh56`XwLV zY}oWedlPA7$$q~Fv37Fp4%a9jC2$sWs4u3nwPzv4$J1bDzWljNzW>m+o1ETsAD>ZP zAZK6ewlOb+Tu8!^Hz4|FA!{CWE(zEF1b)7}`g|jh{7QR!5z2ti2tnfaD@nP}SoU4? zq}Jqd&74ayr<ub;Q!AL;nx!W-lvpu?4HJ!NjkcvN>_qIco*~71UnqRos<k2<{TZ$( zMX%{{-LO)i_&g{*FEHy%3Wd)LE!2xmOk7En5Y&(~agYv5d-g5Br8Z^{igH7Wol2*w zg}HW1e#;hXUe4l4$)7a%N6^f5JC|dMKZ|M_tv|y7+X^ppQOa(d*}n<R<s$!@vM8a_ zf?@)+`_KcJiXHan-=NZvuHIGhPyRC?7(#Hpjbzz+AO81ID4N^)0GZhZx$Us%4tnD{ zGqw}5+jV(m_>J@==Hi1Aa~O`KD6bl5yN*=GxE4$=(^akn%h&Sh9#nWQya{4zEQiT{ zP99gvPP0_CaaD?I{Nf~wYb)603>kAa^mPZU*~ND&OsSX9PDOtR?ewF(Mf1hWO^0*s z%#|nzt)qIZfydySxMn=L-QoRiv_^Yd(3M(vwr(L|V`JUoz#2!G)0kQVt7Ttw#r{JH zoCtoK%W7eiVmP(&ky0Ub&(8$%t_)ZFCRdmVAD~Z#SwIRo*~0x49{~%8oiI|O`mE{V zpvE1xz_z?X=-RJ&TRHL^yKEb~kVEf{$HVRH2~=#vIS6WdbaxcH4ILp^`aU(q43B!8 zJQ(yk*|$Lyn@Tck7KU3w21aH(fguWeD0mhyuWT>)KtTr~vu9C9_$ZI*F)2Dq(tad` zZMF7S{4;S{2Y%RO*iL(QoWo26t`$f3BXrAeAGQjj0qQ9uYi6hiKIXy3ZBbxB6X)T> zN*S-hS*UL%=qknSl9lVW4(3ss*Z3ivxS)H^jvoJtO6X#DTcO`ybD@4^H<NVPR$i6_ z*v-Y11~<E@gzdS&FjUx(%gpurh4Ac|C+L7&G}gyN-az5-(y!V{ZrvGtCt0Q$sRZo8 zT6ie~4)LkoI@;-c75$pDwE0pbq^whxm@=L8DVs|Q_#0l%y7=1OW|d1I@jKu%LeAiG zPmtx(y^Np0%o=>@LAN&3Qse!kS$^Rdb7TS<bvh&xoghqOyI^kjCY8&#Tue<RoNm=8 zr)PXDqFYX8wLG@k@0+H84_*4J)Ckb8#=5>r{QjYC{gh<ebvMdsX7)l4)E5Jd%B&L- z%93JA*6K;i9_}thm!b{IKG9n2p-hqB^u~!<>y^ZNmZK<6)Y6b<K}i}UDjG}nP2`ao ztI~+{nULJf%;}A-@cU$|54wUu059y5z$3tRH}yUyr0Npx16U+kQ+#8Iybcr<-Al1V z`$>e2O@)EC*d0PdIa*K%p+agMX}H-b>HWLVC>&6MN)^8yFhwDh(oQbuMMxtcaPMam zdl*j{)n{A<%)e!v>o#$deh*AEu!*jRWXefW+~l?`1AF@SnW-U-EZOg$0v$=N-AIRT z>fNy*2Hk^qlOMs9kEgi@xsBRp^1U|5)CcrK{)NxZ0y#TnJw>3;>#Z*KTTDGvNo9&p zlH&^s^5xY&Pm;j8PYFCtjtD`5`uTdq4Gn)gr7KvU9Drz!DhoC|yLbt1!EN6v-s`$3 zG2{j+d4}R%COtmQ)R5xMJ|}9&qSM$#jp)&JD_ewBxe!(Xr{fiFXeAUj<zCeuOUADc zhTJCiW!BMp^MqIAGT8zrHwg-5*HNIBfJ4r%q!**~F`AO~ORGED|Ch;NX@8tQi1{<- zf&<ROl!owu`o({NeH+;qCS183Yrv5~3AJ+nd+@#Mwflu<3$QDDSBYsG>jjDZ8Hy&N zKLh(J!T$u{dEu@h=vT;;^)tcJfp>m|4=jW5nXu07PIEL%QwH6FaZ1>v&UlBk1m>h* z(`X(Zlh#d@&_~UdOvw2hJqx;g!}zOkx;v*`nY!`tRFu_C7hP{mOplOtHcbnUC|EuZ z^cf}b9CVc<8A|^U+Ue;Qjr`iY!GUX*!iOGFa|0h_%9bhqHTrykq_N50jHk|PVR<FC zUc2CodYR6#nvQR$zC}w4aCB2|bj8}4>jE0ka}|fT^ZC^?+OFyf`j9SZa$*PSw>X6G z0Vq;V5q*Wc147$+*`mPRpsgjaHU>da9(8h}CbCj*lmFBa*5Z94M!v8SmY;O^ErRVz zeR7XZkt~OyqgzKoD7n_&t$7z7cdYU~m{fs~uYwRI`-lKAS8Ci46h(4)2fWy_NrVsA z9vWze{tC$?bI|k?=)+r-s}8+hPt7TbYGYn<GxK=u26wFdi}4u`l>R?6%F=xT;;yuK zp})=kLU@Bn?Xuf8j@b<blW3M2?$k)>jHS}otRf2;oe(aN>f`ob?^~`pj`(}9#uYy3 z2pW}q>O$5CoBuLp%2i>;C3mfuN|?qO7V3SoZFH+S9SYZD%Q$3rJvZ|voZkZ<HqqIJ zPoJYk?L#qmuz;4kdZ(P7N6_ewAY&dxj)ZDC3)lt)WLIhBC09#i)3!vHWnJ=7PMHzn zva?l8Lm?#G5!1}3n^d8l-9m`voSS5nMR<WG$$OK74euYo`8Fu+_J_pL3O53Fi@gv0 zKG{n9petWNN*{as51BPA!uBrorL6Ul^>h;Zy1+D($?RXN2=UA-!;dV&rgMh<M^Q5O zdtkzW8}@0))X<mW-q9TULHGPh(bvdE5@rBylWRwE(xdlxtd-pa;T<#X!LNj;A!On} zG#tqHwFx7=sD8u0n`3fzfh3r|G`>#5o*o$dPduvH_!<r4yWt^UUj5Qbk^JhT1PFNT z^D7}pLVZ1Ax$DJ~%8!NiAVEq3M~ma;wMM6w4@>Jb8?o~SzXLaAdJ`gqqU|6T=8@vv zdJTOqRJdsvd=S=gnkx}83bhzpO6`dICpHb$uQ4p^av3jq^+Qb&czYndz1)hl%HiFJ z6HG01gaSm~U<;4KRibOPaJSHYbV0c00AF5h)Axu{hkfZiy3jlB9<ogsjI~a~(G54x zdH*-{L`AFaQ?Tq$xnFoRGNHwK<9Z5x7FhT*W~v2}W!L-gzYq2I<?9~-Z3~JK(E^@+ zuZMd~LaW5I924_(0INOuGd8tT9m|+h)+VM+>_JOUL-eh*v2`$Z1bS7`jrq@M3^GJC zq@^?w^jb1=;ky11+UX^@n{x2-PaoSwZN3%0@%Sn3$L-8<!@jHJcKdBE5C$6rO{|Cc zV*DO{j<BTE@Oj*SNkc&Rfci$N%2&weg65rGwus4=(IqnYjFcoMPT5f{+*)S{vh|%s zy=;zO*c4bJX?AWy7sdEawmaj$FCEaekxa5joV!&SeI9>r#i_M;N2B{4n34^dXVBRk zx+%bL=s0k@(JB1sgM@DR?GxyRS^$rwiFa_}Z`UaxNPh>W+FPtBvpKB+B$u(7w817M zVt26=cR^uC;^npIn8V*J>OvdCqonv2H}&AVb{M}`($da^6Izx*inLhkm!O2FFSi57 zS+0NK)ED&5Ut*8vowvPfXRi<@a(54VlbY_G5w4`=p?D2}%pn|XG~A{xw^8lNkCHX3 zq@+Ukmd-!HSpx@`P}Z1iIjc*M@gqCn7B45S?`>8S8%S>Ia}b6fVUGJCf7(`t#PvRO z@@-{Cd;YkPp%a*XcI~Q4-Sj*nk?6bzi#Ou66GL>bQy$q==t6lyByC%{7i&(*+9B|s z`=Ms<yR~wp%W@Hh>;vE2JUUE?oXsYDqOdOurdEo~_PW7Fb8+vdYuRV@xAzgz%iLs6 z=lotrL>KNn(z4eu!G;4kdnpX_5z7Z~g$-I<8rDo3z#QArLr(%Oj`6aQ?MNe-s(NGV z-#USv!05;X2U`D-S;KuXO*5M9BkP-`?U!IA0f8?bB*b$m=QsJP6Akn<%~R}&#@_)G zMxJlzof?u9H$eRR!^(q`Z<<LXOZNL+u+@-jZ?et3Po^^X2^r1NZ3aIdPeVrG-u?pl zzM^vUS*X8oAD<CCOU^!c$AYFLeJ#jEhrsfwD?Hoq8981H8ed+W{0j^xKkv`8h7-&R znsX%OzLXxgqsu>cDSL^vNk*-a{$fxXI!&EfK^c0|(#niI8g03y_%ahG+e~pphZ2~A zE3WABK(_Q#(h}kCWsB`_-HE!FLSl*wb!~`o^^c*^dl!hJt<)J`B7E{n8BS~u%#{-@ zXbhBefS(lwqob~@8ale7uW4yS;YP8oM4K0aGOTQbj@t~!%1xUf$a3i(+QH8)-#6$2 z9BwF@_C&sOKMghSM~#OEWz-t{*l$oNu#Tiqg5$-<$Pgls;QC6EWs7|H-`A&7Ke6w7 z(I|+#3HfJW#g8cZ7R<fLEJ;>A3>FMK9`>M_FxyXBDu-AZQW@=+73zH1{_B_?EX20M zs$b~~U_D09B>P!fwUOD8o_(FomTYSZyy>=qU=_jyg|)z6s-gZR?v8{K9fWq${~@%~ z--N!@WAiV}jI^TfOL0m8YBT8<!sqV#)nqImI^fV%%e@NtE+57foG3}VZ0m53KK6U6 zl)0j^+Wpi<m;abe1oB=>CsUL?M#2ZMgUCpW6mqhK2Z%nl2xhjx3=is8SI0uG-FU3h zyvJ2Pf%;UOJ)!LUv&@MG_-?fvTEi@d^%^AtaDF>;MzUI9mJdt!_6aDo<XK<4@B!We z@rE*g-#kKr6Rt1?wp)FZE#}>XA23?<+{fi2yaObYRMB%fb%Q;Y5|8eR$M}rNU(`-l zwAD)gDCIfIG2(LtndE$T!~jCK{Ptn8!GfU(4P%T5J$R!VENov1axbu5oN*&^NGy&1 z%0qpka+5c)cT8iu;Z=vG0x#djyj26wK82ih%xDulIc+f%UB8WlU6#~j0V{Uax-sFR z9XX$i1ccD`@w*6@-#dTV5;rs?d@)hU5H;Z;NXN6!={9ySpD4wWmqL63SY1tc_EdP6 z^S{G{w6rY6=Y%sCcNUQ;jd(h0MhmsZV&lWVl+9%}F2A=~WnI`u>=1HB`Fto@E@qxQ zR7Umk&WAg6)9GAC`$b{OLNq%T&smpz3V%SD#v3l<O^2{mIAKG%2O#z;D+Y(%?1AGg zsMZ^ORP($!{BkS17fr?NExC7Y9@N2Z6)Q9Bu;3CJ2klT44-_PsVx37s&4#81(z4SX ziSVsO76aX;_%0Mxgj*c;p71V_ze|Yajvg|~BD{b%1ouc(`rIt&6p%?Ohlc4OT|}AK z_rU4jbOJP)BRfgy3*`ThS;HRKC~01RR3BL%z{bCawE_%y^O3kV)Rm0-t=a=Q$2D0U zIyUk5z(fhdxB8}rB*ksM)^~K9f4{vUq>&~2{Q;jchERnR{b28o1$X>i*eO0GqYWg5 zl2LfM?jp$>y7f_yV0Qel`}k}N_|EP!;L(lCuh^K83i|VYG~GRd9B-50ZIV}ss?m?+ zSKrVgfE@WI14J&+XR@Q@tJTcPF7bUF!lI-E`OSi#<O=2bNXe1Gl=LJYf(@e#4fAns z6NPd~@n$CU=sv>h6dRh_#@v?rx~dn0aSz0DA{(?HV$6~IbPFYU`5QRWY~Rf^UCmnV zAevX^;}$j%#|XChfPTVF!rTK?Ar6iV+0b?7X!Xr7Tk=}BFr*Zhi5vap=rM-JWj5jc zFCevqez~FGH5}+Jo3ie^-8NY+TJJn5_}_)Gwq?If@dz!}TXL=w@fFW(0(~5Q3^Pj! z{_n-JXO;EmV1~f%#dNh2@U#+i9@BeqO9#=;UgA?<ISw(RapNtnkw1+ypHOrW-7whG z^0f!9T%>0}M1Ob_Gao6d_d@KQh?~;3p7*xl_wP{pjB-BM<Yg+U%N!W6`3PpGCU6Z< zpGsCW@sFXME>qrRN8b2H-5Ffb>81`Tp(y#hs6EDh<RZ7b`S~@5FLc<vUojor)>1kz zB*LUyHuQH?DfA64Iw$SgK4#@3zVW4}if93ne0%_r{JDLFyb4mT^$JMzFN5wRX~1eQ z)-OdX;zCaCXDfvVs*IN%Lu<U-+}OOLNplhpm5QV`M&#+4P<@9n;1qJLy<77v3~8+P zJs5wNMrK^DQg67A2rwR?Iv~Cz-4`q~FF)jlipFW9YrtP5nIseM`T#B;N3DhM!6|fT zL+Ld%y8~r+>+W^fykBWXbwXkbks@vW8Tn|e-Ve-FkOvsW<xQ5Qr@vVb2#4GP{W$y& zgsP-e7O*_xG--qFbQw~*4F}dj{8zBhqluBrPhjge-knywG(j=GeM4lnwc?7bq^Qmc zp3^~DO+{!F?6lnyL6Tw%4$4Eidgm|C9kbs{xIt7hgozxf@IA(-@Qt~UX=m@4K`6FJ zOuB|Qz9EKhWZJNMl$KK^uByaUmAI-BS5@MwN?cWmt159-C9bN(wO8hfREeu9aaAR* zs>D^5xT+FYRpP2jTvdsyDsfdMuByaUmAI-B*ZcD<RpP2jT>md|Yf&Yxs>D^5xT+FY z-@m-75?58?s!Ci{iK{AcRVA*f#8s8JsuEXK;`-nJ&uUfTs!Ci{7gyEARdsPyU0m;5 zwx}+ys*9`Y;;Op1sxGdoi>vD5s=BzUF0QJJtLoyay11$?uBwZx>f-v}etD4U;;Op1 zsxGdoi>vD5s=B!T%d$mvaaCPh|GRIDQ(atD7uWy!rdZX*^*3v>|H=zsRTo#)#r5}J ziLAP~sxGdoi>vD5s=BzUF0QJJtLoyay11$?u0!}%x<#DFN@+>0Rwf&j#(?XLTWi#1 zp;cC<ukZC>S>%O;<n1nI-jT(EWB)`Y+5(Apw3uHYvSE0%yO#s{_uF2ZflDI>=FI6o z<c)DBWotbQ5Ols*uBj4NRpP2jTvdtd4QUE*3Rfkrs>D^5xT+FYRpP2jTvdsyDsfdM zuByaUmAI-BS5@MwN?cWmD+Ez&DtS>>7KU3w21aJP@BM`Aq2O7-yt2LE0|gy~%$`LZ z;iEjJ$E4^eN&Ar$w$<8S@z2C*9r$6BDsfdMuByaUmAI-BS5@K~P^!APsxGdoi>vD5 ss=By7_^usP7gyEARdsPyU0hWcSJlN;b#eXw&c)Sl55PlR$7Sw+0J6!+^8f$< diff --git a/client/resources/hardnested_tables/bitflip_0_36d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_36d_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..fa1be58fd4b26d23f8c0a258942ba3c6ae602cf8 GIT binary patch literal 4981 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_36d_states.bin.z b/client/resources/hardnested_tables/bitflip_0_36d_states.bin.z deleted file mode 100644 index 4e5b2ff279cebc2f552d994ff58cf344c8e4323f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46813 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 YcrbzoBX}@^$Nv|>1E!zF|8dy=0=RtV761SM diff --git a/client/resources/hardnested_tables/bitflip_0_36f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_36f_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b6c1eb54c9a47adde8f344c3c51fa06cddd1c782 GIT binary patch literal 1135 zcmYL{Z%k8H7{<>zx3{<4)_aQudL<ODVK@;2N5Y4e6};6AW>%pNmAXuJlKBCWeP|3g z;vk$`NED|Ar!LjFtQ#A{LEQb~LS~&u;|vnFbcSu+vgn;_93s=sKO1qNtDp9MdXx8; zC(oPbS^rvxZ*5@vs@Cl%Hcv#r#@zm;r%!J$mM_tL-6x$#)4;Y`0~&x65G-F0_Jbi) zyaE27TgO*8Vk<{-qP5?TIBTyQreJUF)YQ%k%ama5=s`sv4ITg%-)Q58Rkn_c<X~;b zrDZic30V1UP0b3tq0wdO9BEWLkCXx^bsiqR5-r5B(oKbHx!`dH*z%4!hiY0j1rOAy z$z<oy;h~Y4+QOapTM~IK=d~l((EG@a!nRX-7<~54(j;F*`I~%us#5HweW2I$p*my; zr^N@5xqHg!xp*;dQtP0;bq^yiGQ)mZG#pTW9a4sse9B1B#@?kb&_vwFC8WS^E?!P& z?LS-annSFmE1xuLk1o`qtv=2WLO%Xa)TX(nh0F4kL!yTu2`l+YH|XYu!vz+z2t5J) zs)u!PllEC5)XUx;NO*M81PY)|HfN$sYFhRx_Qe72I~kXdhGY-yw%i9D&pp=v5b{H_ zRtswnwZ!Bf;l1b=RHCOLu0ATqO1!wlkRQsA?Fq?j&N!@A_!~#tfZ{^EB$C6F935jt zaSaz6MLH{^h9WzQ;M~9^3C!o*gRH_>Ga*bn1daHzPmgmqIJ#v?YY(+&+`tQGWSeWO zdW#egLJHbtW8)_DgOfV;=soOfAO+T$>y(Bhu8Mc@Gy|EG*_zQG4#fTDKQJZ7Jz&nt zKVfxfLGP#Ssggl=#I0dmWxo0soTm|S5;5#RtTiFOCBa?xu~mF8F>@b*wAe>To0>ID zngjTG)hJ`tO<=EjPQ5ig+&aT8M7`)dE{dK8i}7M->rcE+!Uep^-+{jiWCy${0E~Uy z7*-_evv|3y_N#*W`5e415WnhIKTNuZC7Pgq?Odo{YlyVRE2iytxXF@V-K32wN`6`Z zZ-g7n2CXmdrym4TZX!YE@803#uS+ymAb@@|BLB_51G@O@LQ0B1M49Nna5tYSj(gDq zNQyX+7QPfd@nnIN41B^b(r~GPEAH|$p1@QUHL5@avSQk&?t$}YR)~1mS$#_GD9%*H zyM<8mnKsjkX1Ou1pjAqgcmf1tOMRWV&(C7+udLa!l1eL3oCL2qAbzB0cbrSNLGnsA zz(x*@BSYcPgoT}=`-zgTJ4B-r#l&O<`e8FsT-vEpNb<-_w>fa^lDHAe5m9lbUGU{J zQu69mvU<+?tO!td-=M8VDf*aH+Smv%9LUSlPlFD=6)|Sm7%rnMY}c~hD#bI~cuKbM yq?CJhtAP65h{epMM&USMEUYYNF$V`pBbvxclPu2&Ubk@ez4D8LgVzqeN&f>&!H^vQ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_36f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_36f_states.bin.z deleted file mode 100644 index f8686dba6fe9851da2a7484b5352f4521b575ab0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23650 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 diff --git a/client/resources/hardnested_tables/bitflip_0_384_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_384_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b01f02208ef4ca4c78fc6566fd6e0c556e11ab30 GIT binary patch literal 5424 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 I|Eu`_01i(LZ~y=R literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_384_states.bin.z b/client/resources/hardnested_tables/bitflip_0_384_states.bin.z deleted file mode 100644 index c8a8cf4a0..000000000 --- a/client/resources/hardnested_tables/bitflip_0_384_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xOu3io%VkLSMd9E bJ!HHK{| us~~ןO?y}\כ7t{G{s6~W.כ{vw?~>߻oϿ^珟ϝ8_uܿ?}/~]?|כ>'{߿>kO1W}|p?~==|kymo7ogߏߎ_??6ÿ?_;~o\??G??y/^yXopaߧ{tWMkQ|Xկ|G7___5~9_/ߟkϷ;/? /7?j?4[<ֽ{okOkoG7}g?W˿?o<?cϏv?:v|j?}OG_FwƯ??j񏎿vƯikۿz=}]?3n_}4^]V?O_V_/dU{uSƯn[wo]}߻u?????_?yyOkC1xwouw Ͽ7:coooo_uھ//ko;?7QW^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>} \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_0_3b1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_3b1_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..15195d21385b0eede73fd2ebfdf61354647a4812 GIT binary patch literal 12468 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 GUjI)zux=Cp literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_3b1_states.bin.z b/client/resources/hardnested_tables/bitflip_0_3b1_states.bin.z deleted file mode 100644 index a4cc5d58c54c0b63b9a7a73ca28792535b688a30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77058 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 diff --git a/client/resources/hardnested_tables/bitflip_0_3b3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_3b3_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..18a6d49871207a91671b9bbecd09e0a98f45fb6b GIT binary patch literal 2268 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 G%zpu4Rqjmy literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_3b3_states.bin.z b/client/resources/hardnested_tables/bitflip_0_3b3_states.bin.z deleted file mode 100644 index f7bb63eb7878e931d723a7a353d2af818d2cc96b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44320 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 diff --git a/client/resources/hardnested_tables/bitflip_0_3b9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_3b9_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..fa1be58fd4b26d23f8c0a258942ba3c6ae602cf8 GIT binary patch literal 4981 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_3b9_states.bin.z b/client/resources/hardnested_tables/bitflip_0_3b9_states.bin.z deleted file mode 100644 index 4e5b2ff279cebc2f552d994ff58cf344c8e4323f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46813 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 YcrbzoBX}@^$Nv|>1E!zF|8dy=0=RtV761SM diff --git a/client/resources/hardnested_tables/bitflip_0_3bb_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_3bb_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b6c1eb54c9a47adde8f344c3c51fa06cddd1c782 GIT binary patch literal 1135 zcmYL{Z%k8H7{<>zx3{<4)_aQudL<ODVK@;2N5Y4e6};6AW>%pNmAXuJlKBCWeP|3g z;vk$`NED|Ar!LjFtQ#A{LEQb~LS~&u;|vnFbcSu+vgn;_93s=sKO1qNtDp9MdXx8; zC(oPbS^rvxZ*5@vs@Cl%Hcv#r#@zm;r%!J$mM_tL-6x$#)4;Y`0~&x65G-F0_Jbi) zyaE27TgO*8Vk<{-qP5?TIBTyQreJUF)YQ%k%ama5=s`sv4ITg%-)Q58Rkn_c<X~;b zrDZic30V1UP0b3tq0wdO9BEWLkCXx^bsiqR5-r5B(oKbHx!`dH*z%4!hiY0j1rOAy z$z<oy;h~Y4+QOapTM~IK=d~l((EG@a!nRX-7<~54(j;F*`I~%us#5HweW2I$p*my; zr^N@5xqHg!xp*;dQtP0;bq^yiGQ)mZG#pTW9a4sse9B1B#@?kb&_vwFC8WS^E?!P& z?LS-annSFmE1xuLk1o`qtv=2WLO%Xa)TX(nh0F4kL!yTu2`l+YH|XYu!vz+z2t5J) zs)u!PllEC5)XUx;NO*M81PY)|HfN$sYFhRx_Qe72I~kXdhGY-yw%i9D&pp=v5b{H_ zRtswnwZ!Bf;l1b=RHCOLu0ATqO1!wlkRQsA?Fq?j&N!@A_!~#tfZ{^EB$C6F935jt zaSaz6MLH{^h9WzQ;M~9^3C!o*gRH_>Ga*bn1daHzPmgmqIJ#v?YY(+&+`tQGWSeWO zdW#egLJHbtW8)_DgOfV;=soOfAO+T$>y(Bhu8Mc@Gy|EG*_zQG4#fTDKQJZ7Jz&nt zKVfxfLGP#Ssggl=#I0dmWxo0soTm|S5;5#RtTiFOCBa?xu~mF8F>@b*wAe>To0>ID zngjTG)hJ`tO<=EjPQ5ig+&aT8M7`)dE{dK8i}7M->rcE+!Uep^-+{jiWCy${0E~Uy z7*-_evv|3y_N#*W`5e415WnhIKTNuZC7Pgq?Odo{YlyVRE2iytxXF@V-K32wN`6`Z zZ-g7n2CXmdrym4TZX!YE@803#uS+ymAb@@|BLB_51G@O@LQ0B1M49Nna5tYSj(gDq zNQyX+7QPfd@nnIN41B^b(r~GPEAH|$p1@QUHL5@avSQk&?t$}YR)~1mS$#_GD9%*H zyM<8mnKsjkX1Ou1pjAqgcmf1tOMRWV&(C7+udLa!l1eL3oCL2qAbzB0cbrSNLGnsA zz(x*@BSYcPgoT}=`-zgTJ4B-r#l&O<`e8FsT-vEpNb<-_w>fa^lDHAe5m9lbUGU{J zQu69mvU<+?tO!td-=M8VDf*aH+Smv%9LUSlPlFD=6)|Sm7%rnMY}c~hD#bI~cuKbM yq?CJhtAP65h{epMM&USMEUYYNF$V`pBbvxclPu2&Ubk@ez4D8LgVzqeN&f>&!H^vQ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_3bb_states.bin.z b/client/resources/hardnested_tables/bitflip_0_3bb_states.bin.z deleted file mode 100644 index f8686dba6fe9851da2a7484b5352f4521b575ab0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23650 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 diff --git a/client/resources/hardnested_tables/bitflip_0_3d4_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_3d4_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b01f02208ef4ca4c78fc6566fd6e0c556e11ab30 GIT binary patch literal 5424 zcmY+HdsNz2w#U`@1XMJD%0(lH5q_XiFRq(+1pFDm7a%`SmQO}nr1OVyC25i-O`?MO zGi?CD*G*GEFg(<#qjxk-Ql&UcX=er*?6g^JuVFBgIH@&h(&o{0F8%Yav-bJpoVCwh z>zuv!=X+RE#eo85?cVBI?<$SF>+g{-Klt}sm%73ti=)6WRXF-maaio7u&51e<N1<^ zOMC!`iYVq=F#?X`GU-y7F-$9RAdEs=!Iiyx%Oe-Veizr<AD$nU>XNlAmWM^>4-Mz< z4htL6cU1%L_fw)Tox9BCCSRw{rB(@M@fF)8pFWY?>Ii5x60Mm1obNx_&G$3<IJ1ny zCdl-vyKT#km_5Sx3B6n0#FewuBm8YmRZH1Y@|xu2m>qM1$tXS)i{~`;IVi#6$NV}0 z3h+c(>a^fXQ;R`~qteMM{Xeiakt$#iq8^H@vooK<MXXICq%GA|y><&c;dueOp(H1^ zy|=EHH;0%+dxNY&65bd*z@LY8Yl%C=dQg}O*dB5!1vC@ql@^iCx&b!yRuxFxyw~0> z2cfs#Q$@5$6EvT&d)gf-3MJ=EDg!j?0(f!|^x#BdQ#%SzTEk@yiuO@XByi+d&5EMG zq~3B(@6_kAwJD-wiqpDxS?kDEC{GA2E*V#pB$venRT+wvl$Vx4N`5=w^b2o(QN;FT zbn<8Qa^4K=E<#4Lr?Q`rUI^3erM7q3;WTPIB=Y+8X-Tb=eN#d|_>*3O_$@Fg0KCVq zvZGD9j}7R4c*^Rq6(LJTOv+TX!*$6!Djc%g%SFCjC1T?hxaYPgdD0wpOpkaE_z`#p z{JYsh=yniHLG-Kch1kH&8epCJ27AcRmiftNfbD&NCNfT)NWeH_lFPd>MWD=(a=Ft1 zZ}j!F9n7w@0*}~9ZR&(*RI1w4<X5waCVc@e>70H@mCMdXc>5@9W4{omlNyxlmmLxk z`qSCN>}Zs($&-cxb&&pm=!Vf6(6y!jWH)>cQK#0*>@_?;om{R4(?G6LWwall#JSDm z#dop~A@=jc{51ZINjYw>0P9#4%*+c!DCLWzCbQ&0w@k8Q`ZhkH({glIj2?cN?~sCW zB-)>M-;+YAk0$Ey<`#o2Rh`@v;LQLEbpl7Bgo8&{&XOJ<U~MLl2nl>w9z~kInl)vA zrefW)=TRli$!><_6O%%1tBntx)QMh4^2!`3r=ZG*?{(k8n-)j6GVHv&OUqcBT~|qb z+&Amgv)uw?m+Ok<Hj1s?E0VylyDp+mRf%@dK`XGH6_qMbr3puzP*aT>CA?`*AP<Kw zA`OK%&%(YgA5DYU0>qA}Gcdzmy<xe%(hqlJAj(Ml5Cm0T(ka$@#Fj~6g7@&POWZ@f zM_hv^_x;HE6pK;nD$x2S<hQ(;iOdnW$w!MT;`JxVa-$Ja6ljm9jGL!%ogAG@G!bo$ zwus~6g;KqT=*SiA?Tiw6Xqhy=qA1#q0()jt4X0TAM`BDgMk$J6jfpCgrI4Xmo?L)w zrb7Awct${DTKdUxN^2TV3`}EoYj%UXnY}>Y|32vcu3Ka%C&V$Ff`nqnGt0griBESb zsT!g_?QQ|rg|*}$p>z8`%(;o2X386Xp|Dyc2Fvj#CC+jj#;a^K`G#*m``%7&b(dW) zHZ^%q0!|gMiNxmHbvFT+K*D%5%dyw3NKwpJqRnViyKa&)!e5Aqtl6*fi>?+Mo~pK0 z+vYjslk7??upy6Ut=EJ+5io&#RCbd|eWsg4ud`wOg_6dt^v}F!^aG?9CR?4hfqack zw8_CHtLY)5uy<eVl+az*vyjx*$27Vs^<qK2W)s;})7N#_bkcl_w3c!zBA{<4typ`e zaeB$06CT!?&IlT(`u*Kju*qEuw(@51Dl2aqM|#{fEt)`YvbKpXf=LN8bf?e{yH6x6 zf#2XY9vc5Fe<A5?bn>ZalE?PxnPcd4f(A!QO9MB@jtqcaK>&iU>GwSm1MTP^u+UTX zJ;xxc65gZe!yKfv^#S&GqlJ!#=DRy>*1F_&@I3o3pG^a=mwJUOHSm%xziB7G#c-0% z8Rxs}m7Uhz#5VIn%&r*pyr2%H(o1^I^QX>x?~?oHtu=j^Bg^qjIE{Qqn6csC(?PQc zp2uLSfXm)@Nw-m{$C9BsOCF_Z$+)DMY6^nJVCq3#Sx@5v>-ev4F8<)pCcc-Hh=6oZ zmL_=!P-B$UyeXj%Pa4uTd7F82k;EQ35~9||vlgR!i;|s53dgu*M&}(Z;Vff4rB+Dt zm0A?FhD+9JMp?EwjEqfz;539|8O2|Y2g+Cjn9-7&zOawYMD}eW_AH6ZE)fkr;=cqd z(0x#nDqORhhqLD<mtl&8Lrf(+q;`}6(WaI{b$o=wp9}6ruORs|P(07tHKeUTrLm(i zjNXFGCCwaff{$nBk3up-Q=wW=L>WzL#=-r-Y~*UT3g4r2h`GEaxSDBPvhGIEh)s65 zI+`>WZ5$xE%0UM&Ul}DfdYgRYag{aOxW=23(Np`F4nR?ei>F*OcXXF<Dd*OX|LJna zfUfH6#D57PjSnAQqgCX~Spj${VH4u|VB3B4Iw%gMl#%xnJQAO|E+x%G;hiKr9M4)Z zu3<alBzD9(gw#OeC>W;BC_3MzQ}jh;Xoa;2lnK_7na&Qa`MblRdLMKz1;rP0^<SRp z#jBZrq-Hc-{Mtwi3rB|wiiyRn%&_n?QIgJJSa`89M0sm+9EER0Xp4<WVHj*IaJi(5 z5*8NP3{8lTh4DicUPO)C+wVEoU;f{Mk;`0;aU{$e_Uq>EADM6TH)6-_89Rz&417YT z(c3~-b;f86O}}(EuXC(T&!f5Ybmrp58S}YLH{AHV<e6EPL6k=ktO5ft8H|oqsMdx1 zi%*;Ll2DK$N;7Zn`-!w3DjD;DWte-EGY>8oPufeqFR9~ne+MwYCBy_4pRBO0Mbu-) zsKouI6*y=GyoM9(7^1LFUqoCCg3D00HPLOz(})U6ayYDZ(k+MeA{UE26??1mKJvTH zhwzI|hw(o4UhhUrF58}>IFTR%@8RJLHd{n58APw<04cFE=IIoQLaB0uXkOC5bRQr( zXhhBGUR%BU8dVZIOR&{5pQgJ%(kl8EvCF)L_;@zap|Wvds7iNfo%2#ZNE#tvp)I}h zVNs0b2s=qm@f(z|C$*1F{5JBA_s()caFidaT-c@N&{Mnc{26qkOy^UDSe}eG$&vg8 z#P!9L01v~kzlln2cY<k=1vqX<Zg^4)gbok9QqxD2(P1aI6iZ|ER?Q%~nXE>$dEerN zjhCG-6PSz7V={NbcQRJ2ZO1ODlis&9FqeSqY@Y1`WgLU+MhC4@LT@2~s2BGN&c-L` zC6RS(%@+0`RZ>!fgz*HmTFrM$@tT#Ed>OviQT->XB3UkuDpge=Ag|DCH&?Ly-P?Le zEb$^SfXCy>UUwm0<uJ$y!W$0D?UG@nUMEu>fwC7@e#_c%(8$%S3G6^wiPUV_6vlZ- z6PXQ`dfQ~=6~LK1mR&&us<{$GZ*OeI9H(r1Pk7JGdkI0wqnNg)t#slK@rgv5tu?Bd zMy_QiohFd(r|><gCb&Z6q{wmPnaRik)`}Adl%mY@ds+^&wh5#l0U&f|y7I_1hnVU1 zDnWRCavfN|&iABYJ|X$kJu~=FLu6AFeWbyVL`!LVFJ>0sskgmI6fhq+J3gS)a@(Px zXd4I+|A}d0DMq>b!aM|Sq51Z2I<KQHyOPq3Gsz5ctQ8wVgEUE@kkL&hEAT=S<ZAqM z{)$45?HVWMACKK_OLFk8Mj^b0BfhdV$~6t~ALJ=jfDP+5k!Jd(TRpRy)kGEdgdnFi zXO{ff{)+c8mNg};#egjxzj#uMB4*g^IH^vF8Bv7<2$!yAt)T?9U<+MsPhKy%r!Qr5 zMloU$J6S4PN6g?Z4WkfaTB%j&ON%F3)GR+;-E)cu)<>J5kQ2|bMe^u2`iZ7+3ukeZ z&zm4m$MbnBO0%-3tYnm2s#!%?mqas|mO@qXgWh9`qfPgDW8D!0Y#!u^J@2}4C$Wp` z&n~xCojk<K>lo-gz}6paUPo%4sS#Hns#$suO;F7aHR{N#u`)VnvPe!L<BCv8C-_sN z!eKG+s5pcvl3Pmh?I{H7EULmDd1TeBNgn=6cnzMTuCNW+9XB!qs?MHzD(9JA@*VgX zd>kr9uV}+srzZBy7T`3`$<Q+M8F1$b@*8vzQc1|#C;U%$PG^_`uvGO!G-<;S<c6{l zWt*VVGfbV4Wp28#7HJ3#JzdR?J1CHXr%kRrVoM(74CsR&AvyI9M>}snAmhSAcI|Pq z^Hxgi?YPDX@^j)NK}{h}P@7$g0`-QLT-IZe6cAI|N!$EDckEm?-u4kMo$@Z_U5NC3 zJlaF!oK0$HJwcHlp;QLJ`{-9}Km0uDv}#juB=(N?R$QZ^AcbQ8B^tBIIU|a(K*5NU z+*8>NvN7GH#i=TfI1TkAIJ7?)PN45+uNbz|*%rfjlg_Th32KU>QR(V<k<*IGZc!uZ zdW(=|I7mPdOl{_QysBr?`!mV=TKnGm?uG1HB>9L%ZCpj^8q66hvOOgdkzl8rRFxFN z-!_LpeiU{r#LlzX(d=kb(~?JJ45S_eLLl!IWWA1sKYmJ;@bF#PZLDetz*CkhfE5}? zj*zpw{sQ56SC1T}RUl?k`$W6QLpmpa$}z5M=?7>e-IOh$rX*qt_<6Qkp-D3uo9)n= z;v>g3E=bI2QFB@a46=_jWrv3&E|N{`S9*a&SEA3?^#20f_TacYIkm=y3NK)}2Us+6 zp@9+M1LP>o99l+K6HPEM4(iSFcs?C8W)+JqBXQ;URJB@|Y8l}(7=3Y}9|4mgFtlQ2 zc($k_bCjr5T^cheJDRNKD?JLk)XH1x80%zqMh<hvRUKnsc^arhMb06G6|6O0z6>!z zG%ndJ6RhQIjmw}=;^J8=t=LdU>!jvTF0;)g`Xfs1PLI+u#og)t0r-vK2BAk~Q^>$o ztQ~loS!OXxNCsIrJS2LeJ+5UfOD*zR(u}DTvZ;+~(vqzeRJ0h*aYD^8qy>pKg<4Ie zYu4k6SU$lch}&{NP}3LUkIB~06$>XLV%oafZ~U?x)iPWm|6`0>5gw>`5c6gv0v(nV zhQ&l+B1vIkDVGXgK97sT^zwQ-Ad!J`8G?8Mv_0xKYX5(R@3oSB700)#1f!)_iY*pD zv-)0taoC06r;OL|#>$-sACI*DZEU!<_9ORSKmW|3e|y+a>;K1x!JqCFU$h@t?ejM| z4PxDOgsi!qtvbwF*j*jFw#xqbgR;_2uI~NgSt{s$PDy*mYyC=4=Nqb^8g_ZE2y&3{ zJXM~Dn}_OfIRvpMXmVV*?2GVbuVWSx^cOq29zp(RH_x3<^zGz9UmuYcK0P=;pXH2r z{!W&NAg#>O8We#qOG`OtGX_(T(15i3!&Oh+mHDeFn_nMF%Wz!FNgEq6=q5^Telynn zB-`^g;%x7Z|Hs2KGxQ2^F8=eGJ%VQ`@`6*%Vx+Jr^zzw>hT25kJpF@sf_5kC7m-N* zJ|-qrW;f`3v;HqNGvkcrQJ}R#xG4A$uy1I7P40eq_wRvU|DJI8FO{C_*FF1xb&N<J zPyQ1l`F+QWG;Zyx>+R&f=|78;{QhCPBqts5@S|#)YEt@TF5dNdu53-aUCtb^N=Grb zJ4LO9b5+)aDB9NcTP=U6E-#|j*?x|(jO^!Xu5WCPg34JXcR=rF`DXPC5p{9B4ba93 zkzYD0dM8Qc#%EW*v;%K4hTi{i@y*-4A052@cso5m-#1ryd;cVDY|O56`~9nL$ElRV zp0@~hCARNZ0vmPnGy6X{O|$)KK%C8q`f6O7@F!epjr8zzi{kKyzJqu7sqF5C>$3CL zQpIKcUpG))=hflrvj4e}?A=bQ<IU6bzM1KK?`QG6FFgJ)szd>)TsiVqYBT-7E^8X| z9$k2c`%|Y*_w(K???O!0ivMa-hwBY<DW~N{=iJ4ayJV?lisHWc=W^H7oWmy@Eyc^F z&1UzS<MYhby*1@l&FqkpUbuHS$!cND_`GwqwTfH(j|xDCtIw@Cu(!s%hF5c|v+eMe zS+NBV+H>htg3TwE79TtHVgd7xMs9EK_{H|B(Q+M&AANN4xTbY~`}uEaSO1gqsYiiT zV@L1|`@>nqmrk2c?$}R5jsMMjEeC6`D$l#xHOk!B3!v=d$CK5^scnUm1XN&$`q;UB z6#KaFZd7{?ez?|P59Y)@yYYp@+&*%H++e-<*TlR{vE;UA<NLe{hIi@u@7E+IL$kY` z@BzbrW+HDet1}_R_M`!oZfmdZS(h@DjqgmaJahik|Mh#&kX$jdW|>-B7u%apq^BUY zy@gk!?w_o`^w=YBdG=w9T^saxFATb#UYDP7&fm=Xww}GoXdiubZ~s0~qx=bUHmBod znP}?<_Hsb>5&OY>Wwz_p*)vtE9qWDhU;L|RA2Pn04Nv>7O-k>t9{3%!{v7}Msx=*n z+IMNnwRX1eYx(&yQ^O$kwCGXb&>xO{kb-TS8+mK|FIj});EkNGbdBd6*f;L25!L~r zx?@gS=$TfOm(F;kW+bi@l#jB8=@!p&VQp?axwR74a|cJwD8)>RZRJkkT1}1F<yx|e zAth*)H(gkcd%?^4X-(Kj7D~JJyl8|{lXOF7k5kmjFsK|wSwMlJ2w6HZ+%a6E^Sj5# zJG?DZSN>eSUcr@($(w7&ET0us)2icHLkb1HxwbSEK&l!R7mPTg2H3j_nk|f0hLSo2 z_NVCvCdw+niL}vj>_Cw%c)8Lc$oVm`XBI#D<YEzhS`PJmE;YE_+gJ%VhNKu18y<8| zP2_*k2cg_+d#`+sths*w$dY+lt{QhDnT18iXQ4r0ZTw2D7+0;y^KJb*u+6!FNKS{Q I|Eu`_01i(LZ~y=R literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_3d4_states.bin.z b/client/resources/hardnested_tables/bitflip_0_3d4_states.bin.z deleted file mode 100644 index c8a8cf4a0..000000000 --- a/client/resources/hardnested_tables/bitflip_0_3d4_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xOu3io%VkLSMd9E bJ!HHK{| us~~ןO?y}\כ7t{G{s6~W.כ{vw?~>߻oϿ^珟ϝ8_uܿ?}/~]?|כ>'{߿>kO1W}|p?~==|kymo7ogߏߎ_??6ÿ?_;~o\??G??y/^yXopaߧ{tWMkQ|Xկ|G7___5~9_/ߟkϷ;/? /7?j?4[<ֽ{okOkoG7}g?W˿?o<?cϏv?:v|j?}OG_FwƯ??j񏎿vƯikۿz=}]?3n_}4^]V?O_V_/dU{uSƯn[wo]}߻u?????_?yyOkC1xwouw Ͽ7:coooo_uھ//ko;?7QW^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>} \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_0_3e1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_3e1_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..15195d21385b0eede73fd2ebfdf61354647a4812 GIT binary patch literal 12468 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 GUjI)zux=Cp literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_3e1_states.bin.z b/client/resources/hardnested_tables/bitflip_0_3e1_states.bin.z deleted file mode 100644 index a4cc5d58c54c0b63b9a7a73ca28792535b688a30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77058 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 diff --git a/client/resources/hardnested_tables/bitflip_0_3e3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_3e3_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..18a6d49871207a91671b9bbecd09e0a98f45fb6b GIT binary patch literal 2268 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 G%zpu4Rqjmy literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_3e3_states.bin.z b/client/resources/hardnested_tables/bitflip_0_3e3_states.bin.z deleted file mode 100644 index f7bb63eb7878e931d723a7a353d2af818d2cc96b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44320 zcmeHweN<HC+V`pKXjx$&$}!W)JVs_Vl_@F6&Nzx`hTo_tb4&{pJ#&;05tuu*q9mQn z56TaAhKPtTDj+EzJ2e~?W&8j}K-tFE00V4ihM7J4>%QK5@O0kyeb(Dr&$FKXc;EHz zHGi-dvlnacd*9b}{jT5j<F_}|bsbo=cXUu{p5<ChaP&I~-=F_7^~{&k_1gGH-+g}5 zM0;lXQhR*e^?t+qZ1%%801kqn?Jeq(D7+#^iKV=|fvevb++Yb$)++XKnnI+%itHN- ztyu<JIa4RlaY|7-%n|r>Sd15$G<mQA&vQ~8t_kh#T+itYSJ_XZye$gpl9jdli=YA$ z;m%+wDIE;{j~2-a6C_-Lde=!lb$ft|YZ5!XA?DbY_~v*GQ{)Ke4eeZL$QN9IBVuoX zMe66$?9d*#X1lO6jjfUfU0Svv-Q{BIE=jxKQypa%T#1<1SKFFIW$mCOl%8gx7@7k| z?XRMde`J(9xr5)z&7jf#?Uslu#-(5?#U@dTRidrNR9xiXjvqr`QJF6N9drxK-7vI= zUAw-Dxq(NPn)a0Rpj<h^1w1>SvB2e!EV;kJXLayV)+`n(cd$k%z!8`?@mKD^#e3Xq z`z_Y1;l&%StVF_h!MHhj*tf+YyUaOBtyYM+`b$fojNR-EoZJ`?XV(p5-iN9@<cAlz zP47b{$LD1<JIJ4P?4PKlZKM+5%;otqm)pa{%g3jICQv+{QW27Jc*PaGtIVi`yxA3Q zvTK_jQ8wAVyF6fy?s5(7<eQG!VE8wy@Q7e)L@0Sw^-3r+dL4ja5RX=%aS{%{<4ihO zM8DLmEeVm6H!%Il4c_#^UU&Y-*b=9k$pzjRJ5CIWgOY87SXW6SOoW#hkOa+QIO#F8 zE9{G$8{7VZj?}PbfLDPH0rmtoU!r%TJ@%!YjNd~eKSE_?;q_X*t@faThduCaI<nTX zjoy(`?RlK<v^1iJJ@G5>d<Q+h3ufUTJ<JO@euwQHNw*a)Idysn9Wr-{;k{3o>}`~B z`t-6Av=Lq^Eqe*yPDQiwU0>8Vp8sg@=7~FApfcicSi3U(;>?B_En}}}$6TeBCd)hI zrXStZ5SZA;H0_UsZI!U)2fYVPXXxChcl7wjk@sMDzq+{)dd=yeAC%d>P5S4cy`0(V zpi|ATWY~w_p?)vmaGCZ}60Gw)-6wfBqqRkcy?eko##R(-_>((hT~f+8!}3yiz1C|! z1~>SaT<BoYcqJkpL_za1+=a8S1^R;i%Lv~O-4%2XDlL2?<%Vpa*5f0<IyQE|TnHTH zR|VSC5xENirXp}*xJ-fYJP*PzS+`4{>f-$p+qzs9OIEVe<?`TiYhRi?amTnc$0*4^ zI9<~i_L)t`X`GfC-Q>Fz{_O*YF}ZdYC&(dKd1P8KP)O4WMbDxlhU!qtIfU?z+o0#% z;Vff_XDWY!;$P4!l5revTnI7K<V!J-SAxTy|5#zC#zM>75Ur<0;!Q|rZy9caOR=jJ zP?QOEv+y=g(OZT~h9_#`yulwU`-JFf=3AU7hCPDXv*CuD>uv)1j!n^7j8fQOC7_fp zKo2|pE3H$~OWf!stHr(eW%xKTghB5#Q=UnPKA^b^J0P9!3x1Q^P`?gsr*A1U8@ans z-%7tS3+9Ncw}ppQYR`$OdtGVY+VkE1K|Rc#^nV5SB#7yf=@?vNo3QsVq>O=z3)EcY zPZJDt#zT!f)(IC{A?_M7*Up9oRq?}?LeX@bBZLD}DuG~2Jh0PNQFLJl-%7WL^H?d3 zge{YeN@Kuv#;rB#vd}6k(-)435n13AkRY4+-{Lje0*QCDm|q~WVR*Eg@{%Xs3_Bql zQvx~Q(!dDJY0%TaErh0K%Vny<{i=s9M9CY{ht_dNu`TZYQhJWVF*)C>+oTNr9?h4d z=S$Qs=7?hY5|%cfzJ}8p(Mj1_4+8{U6=ab=UbftcE<wr<?;Z(-7)}bEl`rc)SKgWr zVndU$S>vAzwO;FF7;3vM>OaAnKFRseq?86yKf?&{!hp|07EWf~zSiT=+=EkIKQEjn z*A8Cc8Q%@u1rzfS&{b)7;k@MA$n4Ab9ZbGI>6%VXcYI2I<%cygkh53vF5Q!w<smSp z9md|3=N{E83xPGaq3;XWZ}I@gze9=~odYwZ_=0e&ZRQGTN{lt$$qTrtqABZOd5f;w z_-d_DqqJmlBNX!thbzyi9|}UuQuqj8JqT~O((DwBeFs_^sP9ZQA}WySL@PA>D(iw8 z>g02EHqA~4J2A>657mbZO*KK3ICC^KxO5eiNrdxmjfL)zv)#5@=h+zR{M_`AiCk)q zg>7^5)z;#>RE#6$E>y<8A?uozd5*)MJD6;K%(v%{1>0;);m)+H%%6as;P+7PU6Xa# z=ILFf)Q~N}z~eH?aYf&Qu14y9{QGqmJ&kpjp{56pbyMHBv4cHO)uWBjp~2y0x)qxg z-Az<=-r&zz+}gM{II|8c$F<P~5Iq$y5t+r_EC-CUN8glbd)eLw{h{bpJ@FklVaS*= zTS7U+;n@b@UDQ-JjK7@7V>U`Q16vP87KlFvYn{<8bjwD6$x_FJ1Y4fyik}aziBjZq z%nB;;7FvK8$)=z2_AAWGIRB`kxvZ<g5x>Bz&Lt~hhJ%`o&-#V#UVF2~t^3FX!@D%1 zeMk*jri|Z5Zg)VRk6mMBC)L`C9$)hcm+3scQF+wv9U+*f*wJ|Gi>?Vpc*p_hJDKf- zT?Q($^s@$e%8a`ZI-np6r~J^;L{&jiIXVJV5hh#sGaNv&Et)I9w~A)-DG!hA;)opA zi57W%rQZ*RdE2?;7xc$?>ct`Ojhnm0+zEqf23CuvZtQkZ^YHyt>xbC^razMh!+b~f z?E#uAN4^A$I_25GG`W4jqMtMD2<QfdEk1#nYb2Ar;?8<TiughqYf}94l@aCk&vEJ; zm=On?BPesYJZ%}UqhYl&un%s6-#+>d$Oq`6&0G^pe_9}ci$9A|jw4=@G8%L;=53lw z3V5QRN3qBA_OB&ohHO3w3!Ajt-OLxi&?O%3vK{sLwg%R`$?HN|Tp#Gl5QuzX)G((= z2b*hvW$BE^TiBH-wJELB_V=YJmYp@s_h^AKx}C{FyY8i>i`u2o9fB=vas#;KpU|%B z=!P_fH-#r8q%r?2d)3*T3!$eCdDb~Xc)d$do_+yNaDvn+{|SsTUqW(Izjq*X7Fy<u zUhP0c;(9!+*d(Uih>l5`xX$oojjn1xvug>R%iKB$g*|f9CrM==7&--Aj188!ib5>c z-&Cm8f^IzizN7C&$Ig>NQ7gRz0>^`C3l6H>E*AY*=4um}`A*$cBtq96uu!ahf3U7> zT*FU+@QO7{Y+#zlGI*w9Un<eoT$CVBROS}rNnTPw2>7u;g^emRQVKTOs@kbU%-RhO zrsxKQICa^*wKV`}89Ct+1OQ@WB*Rq&Nis5vngHMK&Wk?*#}xZ{SLZcDgqt$uGv$sM zp8OPrghe?#+R0s%a~i3fIyfj#=|WRv?gh)|9_AU?*}^p7l#B2qCZ+lkKXfO|z*L`^ z?+g`niL7Sx-WGVd)0{0@`C;g<@Y71ga)Eh5<leH?pbQs0-?mTDa9pYI0M-a3#XaA1 z_EGWS&4-Qfsc*mk43=DS?Pg2X&%NLPDMP(*sH_iY8Z<IVCJP+?PV#-)fr!mew5>1s zRc~@3XNMNku+{q)m!N+a=m%`{9Hk#QZo-r=uWtU51eOCe!Y}X@Ir3qE&q(#06|8@u zUc0!sY$s#kHM(Kc<6~Zhb?B2z2DweEP1dwiQCsQw-N^2>=<H&kOaFwD_C2!%1o}x) z%j2_2g*A}T0=J7X|AY<d95t=}H6ifb*HGiw*urgawJ%Ik_#67g_ZxtOYPjD4*urxu z%O1a|;=EPvp6dy^CCPZIi7}NmJPeCcbq_&&`p#eB1ukoA;FzyrW~qM1b04)#pdj}^ z$!h$t7p^4y<^Elt1${y9D(QL#%b@7*LgWEz3+Vmff!^ec{>dD;2Xk=IVTg`{OMipP z<B)Y2ofgH44Nm2S{++NFXAJWcdz14}b|_ePOX!Q_2^k7C)@i!|)#s>fU|K}&YlS6z zb&p}hq`4W)T;5W@(lN<08k<~3r^L|k`cWvF-B8Sfr;)<YfSF{>ELV&>snKK)7vDlP z*!^q5`jt$MNdKn+?pIDf!(Wbmz3)^WypgE*eGJ!h>~Y-RUQ{b@AzNnJKKj=*cs&|o zRxVG_?zU9hBNm!9m#9}4L%yRox=y><Hks-tegs)PQf<e`o>uMR2SKy>he>X#&ln9H z#LO5Rs`v`I8;18#zOAwEGNg6FfPz8>BCVQ5|3@I3atxVqSBPlBO7u+>$D3$4==4?h z-hKGRhH<_JQ!e)fPEOL|xj>7s+-4MEsEOooH`?iZTY-~r-Pr1e&oRj)*;M8&=8aA| zp^N#hOEW4;+oRhh>W)hOCE^4_W7wk-L<!M$)ARQ<@Y@HGKdOKpf(;tLeGc6Ln(^~M z<Tj?B)wppZ&rmR}8;W=_i_<a1y6D@mw2|7Qn4d*!kHNUV;^smW5d|Z@DZu)S)8HIM z`%6wmvN9&O^BXHPPdJ4E<LB1A1XJ%9!oK#2N$Cans+`}Udlx1t8J{sdRj6Hz=N$-l zyRgY-Rx-ZEI~%lTQ1a!9V)=7d+>QV}DVOfp(mj_^UAl#%2MESw3ma|g>qX6sO*u<K zP}FP|`v;NbLfPIRFPstr`d2Z#LL!@P?r^0Z$3M2pna$#ArThuSlxfpsHMs`5mRn$P z5ZLxI?u6}!+hJJ+oOD>`QEzXjcU@)1!Phc#LO}m&Ob5CTgjpf?TUdo}5)6+K7NTs; zf-~1~p;U-I9a7EXk+k5}cj&k}DEWs{(PV9>>)hN~DhF4$Gf7w%0*++4okzi0??bH% zqWDxO-HrJjFkR_=;6B9qFX$?@kkY5`hI$(W)xcW<Y2VhBrYg~0I!$_Xil_J}Bpgu2 zY}cKnCw2P50!REEg|+Gi!lG*I*P>koqZ^Tb!m9<4>7`!*w}<*0_V+bG;bq)+vd#&^ zS3cEo4eBI3pz0NfSVp~H&6M%K2PQTk?yBECxJXi5pM!o2u4xCnnJo8}$$ozbqkoWV zrwkzv_wHD*b3a3Xd!!fcVILSP+RA+6!v>utPsz-h;NSW)ikw}i$PvGozq6njB0TmM z?CJ<3$3uA7<jbpnlQks2J`FyEqS<^8957raDYr4<=~~0}I`;uNxeUBc@5d|G3TaZt z3{O)SN@$m+fn$zbk|Rf&5ngO1#XGi*xgxiS7Wn!aI?emF<`iPh7_c?CnfSNBy1i&T zbKE1CSI9-%t)r27U%0u^&ZHS`US@dN>a^rw_@`oaWlcn@l!Q}B_v+&2=VTcxrN$0d z;6^3c?S9p3Su8*6WnB9o1OEhSe#ytnWPL|+YV&KOErOu$YW~or{TZSw&)+XRei&sa zy(Q;I%U$5mL%?>(gJo1q@PBW~*&=m)25C-aoI>SD;V+8uUntZ#rJ~xZyReh<U-Wmd z_GsM4*>WycnK4vk@@~V}&WgcZ@cj-d4Vwnxk7aaKtbG$~XH19rA?@Eks~k9k8m6Xl z2~iGo0PSKyk&UwzW}CC26pH-Gs`4J_a=}nL+Al96d$^$-=X*?kmi$m@X*HBo;z4F@ zt!0>p-i-#q=;O=?muV{;TLmdj|3Vn(U{Ztq>tK!?z6;$uKkLKW1#wDRtsPC1Qn2`i zTepz8+DdM>&*VD!F-A5{kaVF#DiX7k@}ih?6Y(^>_PR)K>y56;T$pNu$=3oUDwDM= z&>jp#*PkL?QlGADvQq`GpBvUVG#$P|o(+BnNx^*@*m;;)K^m}JMPbk2iycX;Col(G z4;|6$ZVEc)7-Cn9mo88%lpv3uzmD7-wGZbMBSrSx-MiF2@EZ6_j_-%Im1J6*Ezv<T zYZYjMP!(_+Ci#M8->$wLkXF89!7<SGkW4Z|8C8yVFM}&FP`(<bIW``IAFE)_9p-Me z#ql&X=N9mnsYvwjCLpcczdrj!=maF$9Fmt0c)kmRoO~SERq`E-kMRBsC_>me(gs_p zWDxHt6Pqyi6rAX!YP_k-71MA>fJrHKikeM_+-S&EB`sVixs}GT3{K8XODVwtmJ@E^ zdE3fRA+WBO>6x(5`m5`ZTi;60hv_2Mt{Ew3X5krDrq~Fsc$!C(sBX=NJ#>%Zx?-Oj z)zG5dZ%PeLu*0l8+Fm#h-}EFI;IoUUGZBXb^){=MIFg$-UxNWvx?8^Gno-V@xV}m) z`T=M5)ILjZ->>`3?LW?@9chiWYuC4-F_Yk}p|t5cO(M3|36xdNwZy(T6Z|4^+BS4p zd|;h?Xf@6iqMKpcRj~g6+w(JU?h!8d4A$=^lpl>zA`dPLKQX|Prr#FWeU-HA*=4*| zxMCueYNM63?EjI&YjF`?z{oX)Gte|4PPC*0e@53!;Th$Kj@}3EL#*_D=*ntI=|i#q zkwK$kK)e?mRKU(xEcQ<QTKQY0a~Y7Za4-)_L2tlOujQx*y@X~<x+kIdV(dXhTMjD( zQxObzGDjd>LC$1zGki-x;Lceo*xJCS{P2;$JSwd{iruBZ2PVu?qTcW+gkh56`XwLV zY}oWedlPA7$$q~Fv37Fp4%a9jC2$sWs4u3nwPzv4$J1bDzWljNzW>m+o1ETsAD>ZP zAZK6ewlOb+Tu8!^Hz4|FA!{CWE(zEF1b)7}`g|jh{7QR!5z2ti2tnfaD@nP}SoU4? zq}Jqd&74ayr<ub;Q!AL;nx!W-lvpu?4HJ!NjkcvN>_qIco*~71UnqRos<k2<{TZ$( zMX%{{-LO)i_&g{*FEHy%3Wd)LE!2xmOk7En5Y&(~agYv5d-g5Br8Z^{igH7Wol2*w zg}HW1e#;hXUe4l4$)7a%N6^f5JC|dMKZ|M_tv|y7+X^ppQOa(d*}n<R<s$!@vM8a_ zf?@)+`_KcJiXHan-=NZvuHIGhPyRC?7(#Hpjbzz+AO81ID4N^)0GZhZx$Us%4tnD{ zGqw}5+jV(m_>J@==Hi1Aa~O`KD6bl5yN*=GxE4$=(^akn%h&Sh9#nWQya{4zEQiT{ zP99gvPP0_CaaD?I{Nf~wYb)603>kAa^mPZU*~ND&OsSX9PDOtR?ewF(Mf1hWO^0*s z%#|nzt)qIZfydySxMn=L-QoRiv_^Yd(3M(vwr(L|V`JUoz#2!G)0kQVt7Ttw#r{JH zoCtoK%W7eiVmP(&ky0Ub&(8$%t_)ZFCRdmVAD~Z#SwIRo*~0x49{~%8oiI|O`mE{V zpvE1xz_z?X=-RJ&TRHL^yKEb~kVEf{$HVRH2~=#vIS6WdbaxcH4ILp^`aU(q43B!8 zJQ(yk*|$Lyn@Tck7KU3w21aH(fguWeD0mhyuWT>)KtTr~vu9C9_$ZI*F)2Dq(tad` zZMF7S{4;S{2Y%RO*iL(QoWo26t`$f3BXrAeAGQjj0qQ9uYi6hiKIXy3ZBbxB6X)T> zN*S-hS*UL%=qknSl9lVW4(3ss*Z3ivxS)H^jvoJtO6X#DTcO`ybD@4^H<NVPR$i6_ z*v-Y11~<E@gzdS&FjUx(%gpurh4Ac|C+L7&G}gyN-az5-(y!V{ZrvGtCt0Q$sRZo8 zT6ie~4)LkoI@;-c75$pDwE0pbq^whxm@=L8DVs|Q_#0l%y7=1OW|d1I@jKu%LeAiG zPmtx(y^Np0%o=>@LAN&3Qse!kS$^Rdb7TS<bvh&xoghqOyI^kjCY8&#Tue<RoNm=8 zr)PXDqFYX8wLG@k@0+H84_*4J)Ckb8#=5>r{QjYC{gh<ebvMdsX7)l4)E5Jd%B&L- z%93JA*6K;i9_}thm!b{IKG9n2p-hqB^u~!<>y^ZNmZK<6)Y6b<K}i}UDjG}nP2`ao ztI~+{nULJf%;}A-@cU$|54wUu059y5z$3tRH}yUyr0Npx16U+kQ+#8Iybcr<-Al1V z`$>e2O@)EC*d0PdIa*K%p+agMX}H-b>HWLVC>&6MN)^8yFhwDh(oQbuMMxtcaPMam zdl*j{)n{A<%)e!v>o#$deh*AEu!*jRWXefW+~l?`1AF@SnW-U-EZOg$0v$=N-AIRT z>fNy*2Hk^qlOMs9kEgi@xsBRp^1U|5)CcrK{)NxZ0y#TnJw>3;>#Z*KTTDGvNo9&p zlH&^s^5xY&Pm;j8PYFCtjtD`5`uTdq4Gn)gr7KvU9Drz!DhoC|yLbt1!EN6v-s`$3 zG2{j+d4}R%COtmQ)R5xMJ|}9&qSM$#jp)&JD_ewBxe!(Xr{fiFXeAUj<zCeuOUADc zhTJCiW!BMp^MqIAGT8zrHwg-5*HNIBfJ4r%q!**~F`AO~ORGED|Ch;NX@8tQi1{<- zf&<ROl!owu`o({NeH+;qCS183Yrv5~3AJ+nd+@#Mwflu<3$QDDSBYsG>jjDZ8Hy&N zKLh(J!T$u{dEu@h=vT;;^)tcJfp>m|4=jW5nXu07PIEL%QwH6FaZ1>v&UlBk1m>h* z(`X(Zlh#d@&_~UdOvw2hJqx;g!}zOkx;v*`nY!`tRFu_C7hP{mOplOtHcbnUC|EuZ z^cf}b9CVc<8A|^U+Ue;Qjr`iY!GUX*!iOGFa|0h_%9bhqHTrykq_N50jHk|PVR<FC zUc2CodYR6#nvQR$zC}w4aCB2|bj8}4>jE0ka}|fT^ZC^?+OFyf`j9SZa$*PSw>X6G z0Vq;V5q*Wc147$+*`mPRpsgjaHU>da9(8h}CbCj*lmFBa*5Z94M!v8SmY;O^ErRVz zeR7XZkt~OyqgzKoD7n_&t$7z7cdYU~m{fs~uYwRI`-lKAS8Ci46h(4)2fWy_NrVsA z9vWze{tC$?bI|k?=)+r-s}8+hPt7TbYGYn<GxK=u26wFdi}4u`l>R?6%F=xT;;yuK zp})=kLU@Bn?Xuf8j@b<blW3M2?$k)>jHS}otRf2;oe(aN>f`ob?^~`pj`(}9#uYy3 z2pW}q>O$5CoBuLp%2i>;C3mfuN|?qO7V3SoZFH+S9SYZD%Q$3rJvZ|voZkZ<HqqIJ zPoJYk?L#qmuz;4kdZ(P7N6_ewAY&dxj)ZDC3)lt)WLIhBC09#i)3!vHWnJ=7PMHzn zva?l8Lm?#G5!1}3n^d8l-9m`voSS5nMR<WG$$OK74euYo`8Fu+_J_pL3O53Fi@gv0 zKG{n9petWNN*{as51BPA!uBrorL6Ul^>h;Zy1+D($?RXN2=UA-!;dV&rgMh<M^Q5O zdtkzW8}@0))X<mW-q9TULHGPh(bvdE5@rBylWRwE(xdlxtd-pa;T<#X!LNj;A!On} zG#tqHwFx7=sD8u0n`3fzfh3r|G`>#5o*o$dPduvH_!<r4yWt^UUj5Qbk^JhT1PFNT z^D7}pLVZ1Ax$DJ~%8!NiAVEq3M~ma;wMM6w4@>Jb8?o~SzXLaAdJ`gqqU|6T=8@vv zdJTOqRJdsvd=S=gnkx}83bhzpO6`dICpHb$uQ4p^av3jq^+Qb&czYndz1)hl%HiFJ z6HG01gaSm~U<;4KRibOPaJSHYbV0c00AF5h)Axu{hkfZiy3jlB9<ogsjI~a~(G54x zdH*-{L`AFaQ?Tq$xnFoRGNHwK<9Z5x7FhT*W~v2}W!L-gzYq2I<?9~-Z3~JK(E^@+ zuZMd~LaW5I924_(0INOuGd8tT9m|+h)+VM+>_JOUL-eh*v2`$Z1bS7`jrq@M3^GJC zq@^?w^jb1=;ky11+UX^@n{x2-PaoSwZN3%0@%Sn3$L-8<!@jHJcKdBE5C$6rO{|Cc zV*DO{j<BTE@Oj*SNkc&Rfci$N%2&weg65rGwus4=(IqnYjFcoMPT5f{+*)S{vh|%s zy=;zO*c4bJX?AWy7sdEawmaj$FCEaekxa5joV!&SeI9>r#i_M;N2B{4n34^dXVBRk zx+%bL=s0k@(JB1sgM@DR?GxyRS^$rwiFa_}Z`UaxNPh>W+FPtBvpKB+B$u(7w817M zVt26=cR^uC;^npIn8V*J>OvdCqonv2H}&AVb{M}`($da^6Izx*inLhkm!O2FFSi57 zS+0NK)ED&5Ut*8vowvPfXRi<@a(54VlbY_G5w4`=p?D2}%pn|XG~A{xw^8lNkCHX3 zq@+Ukmd-!HSpx@`P}Z1iIjc*M@gqCn7B45S?`>8S8%S>Ia}b6fVUGJCf7(`t#PvRO z@@-{Cd;YkPp%a*XcI~Q4-Sj*nk?6bzi#Ou66GL>bQy$q==t6lyByC%{7i&(*+9B|s z`=Ms<yR~wp%W@Hh>;vE2JUUE?oXsYDqOdOurdEo~_PW7Fb8+vdYuRV@xAzgz%iLs6 z=lotrL>KNn(z4eu!G;4kdnpX_5z7Z~g$-I<8rDo3z#QArLr(%Oj`6aQ?MNe-s(NGV z-#USv!05;X2U`D-S;KuXO*5M9BkP-`?U!IA0f8?bB*b$m=QsJP6Akn<%~R}&#@_)G zMxJlzof?u9H$eRR!^(q`Z<<LXOZNL+u+@-jZ?et3Po^^X2^r1NZ3aIdPeVrG-u?pl zzM^vUS*X8oAD<CCOU^!c$AYFLeJ#jEhrsfwD?Hoq8981H8ed+W{0j^xKkv`8h7-&R znsX%OzLXxgqsu>cDSL^vNk*-a{$fxXI!&EfK^c0|(#niI8g03y_%ahG+e~pphZ2~A zE3WABK(_Q#(h}kCWsB`_-HE!FLSl*wb!~`o^^c*^dl!hJt<)J`B7E{n8BS~u%#{-@ zXbhBefS(lwqob~@8ale7uW4yS;YP8oM4K0aGOTQbj@t~!%1xUf$a3i(+QH8)-#6$2 z9BwF@_C&sOKMghSM~#OEWz-t{*l$oNu#Tiqg5$-<$Pgls;QC6EWs7|H-`A&7Ke6w7 z(I|+#3HfJW#g8cZ7R<fLEJ;>A3>FMK9`>M_FxyXBDu-AZQW@=+73zH1{_B_?EX20M zs$b~~U_D09B>P!fwUOD8o_(FomTYSZyy>=qU=_jyg|)z6s-gZR?v8{K9fWq${~@%~ z--N!@WAiV}jI^TfOL0m8YBT8<!sqV#)nqImI^fV%%e@NtE+57foG3}VZ0m53KK6U6 zl)0j^+Wpi<m;abe1oB=>CsUL?M#2ZMgUCpW6mqhK2Z%nl2xhjx3=is8SI0uG-FU3h zyvJ2Pf%;UOJ)!LUv&@MG_-?fvTEi@d^%^AtaDF>;MzUI9mJdt!_6aDo<XK<4@B!We z@rE*g-#kKr6Rt1?wp)FZE#}>XA23?<+{fi2yaObYRMB%fb%Q;Y5|8eR$M}rNU(`-l zwAD)gDCIfIG2(LtndE$T!~jCK{Ptn8!GfU(4P%T5J$R!VENov1axbu5oN*&^NGy&1 z%0qpka+5c)cT8iu;Z=vG0x#djyj26wK82ih%xDulIc+f%UB8WlU6#~j0V{Uax-sFR z9XX$i1ccD`@w*6@-#dTV5;rs?d@)hU5H;Z;NXN6!={9ySpD4wWmqL63SY1tc_EdP6 z^S{G{w6rY6=Y%sCcNUQ;jd(h0MhmsZV&lWVl+9%}F2A=~WnI`u>=1HB`Fto@E@qxQ zR7Umk&WAg6)9GAC`$b{OLNq%T&smpz3V%SD#v3l<O^2{mIAKG%2O#z;D+Y(%?1AGg zsMZ^ORP($!{BkS17fr?NExC7Y9@N2Z6)Q9Bu;3CJ2klT44-_PsVx37s&4#81(z4SX ziSVsO76aX;_%0Mxgj*c;p71V_ze|Yajvg|~BD{b%1ouc(`rIt&6p%?Ohlc4OT|}AK z_rU4jbOJP)BRfgy3*`ThS;HRKC~01RR3BL%z{bCawE_%y^O3kV)Rm0-t=a=Q$2D0U zIyUk5z(fhdxB8}rB*ksM)^~K9f4{vUq>&~2{Q;jchERnR{b28o1$X>i*eO0GqYWg5 zl2LfM?jp$>y7f_yV0Qel`}k}N_|EP!;L(lCuh^K83i|VYG~GRd9B-50ZIV}ss?m?+ zSKrVgfE@WI14J&+XR@Q@tJTcPF7bUF!lI-E`OSi#<O=2bNXe1Gl=LJYf(@e#4fAns z6NPd~@n$CU=sv>h6dRh_#@v?rx~dn0aSz0DA{(?HV$6~IbPFYU`5QRWY~Rf^UCmnV zAevX^;}$j%#|XChfPTVF!rTK?Ar6iV+0b?7X!Xr7Tk=}BFr*Zhi5vap=rM-JWj5jc zFCevqez~FGH5}+Jo3ie^-8NY+TJJn5_}_)Gwq?If@dz!}TXL=w@fFW(0(~5Q3^Pj! z{_n-JXO;EmV1~f%#dNh2@U#+i9@BeqO9#=;UgA?<ISw(RapNtnkw1+ypHOrW-7whG z^0f!9T%>0}M1Ob_Gao6d_d@KQh?~;3p7*xl_wP{pjB-BM<Yg+U%N!W6`3PpGCU6Z< zpGsCW@sFXME>qrRN8b2H-5Ffb>81`Tp(y#hs6EDh<RZ7b`S~@5FLc<vUojor)>1kz zB*LUyHuQH?DfA64Iw$SgK4#@3zVW4}if93ne0%_r{JDLFyb4mT^$JMzFN5wRX~1eQ z)-OdX;zCaCXDfvVs*IN%Lu<U-+}OOLNplhpm5QV`M&#+4P<@9n;1qJLy<77v3~8+P zJs5wNMrK^DQg67A2rwR?Iv~Cz-4`q~FF)jlipFW9YrtP5nIseM`T#B;N3DhM!6|fT zL+Ld%y8~r+>+W^fykBWXbwXkbks@vW8Tn|e-Ve-FkOvsW<xQ5Qr@vVb2#4GP{W$y& zgsP-e7O*_xG--qFbQw~*4F}dj{8zBhqluBrPhjge-knywG(j=GeM4lnwc?7bq^Qmc zp3^~DO+{!F?6lnyL6Tw%4$4Eidgm|C9kbs{xIt7hgozxf@IA(-@Qt~UX=m@4K`6FJ zOuB|Qz9EKhWZJNMl$KK^uByaUmAI-BS5@MwN?cWmt159-C9bN(wO8hfREeu9aaAR* zs>D^5xT+FYRpP2jTvdsyDsfdMuByaUmAI-B*ZcD<RpP2jT>md|Yf&Yxs>D^5xT+FY z-@m-75?58?s!Ci{iK{AcRVA*f#8s8JsuEXK;`-nJ&uUfTs!Ci{7gyEARdsPyU0m;5 zwx}+ys*9`Y;;Op1sxGdoi>vD5s=BzUF0QJJtLoyay11$?uBwZx>f-v}etD4U;;Op1 zsxGdoi>vD5s=B!T%d$mvaaCPh|GRIDQ(atD7uWy!rdZX*^*3v>|H=zsRTo#)#r5}J ziLAP~sxGdoi>vD5s=BzUF0QJJtLoyay11$?u0!}%x<#DFN@+>0Rwf&j#(?XLTWi#1 zp;cC<ukZC>S>%O;<n1nI-jT(EWB)`Y+5(Apw3uHYvSE0%yO#s{_uF2ZflDI>=FI6o z<c)DBWotbQ5Ols*uBj4NRpP2jTvdtd4QUE*3Rfkrs>D^5xT+FYRpP2jTvdsyDsfdM zuByaUmAI-BS5@MwN?cWmD+Ez&DtS>>7KU3w21aJP@BM`Aq2O7-yt2LE0|gy~%$`LZ z;iEjJ$E4^eN&Ar$w$<8S@z2C*9r$6BDsfdMuByaUmAI-BS5@K~P^!APsxGdoi>vD5 ss=By7_^usP7gyEARdsPyU0hWcSJlN;b#eXw&c)Sl55PlR$7Sw+0J6!+^8f$< diff --git a/client/resources/hardnested_tables/bitflip_0_3e9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_3e9_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..fa1be58fd4b26d23f8c0a258942ba3c6ae602cf8 GIT binary patch literal 4981 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_3e9_states.bin.z b/client/resources/hardnested_tables/bitflip_0_3e9_states.bin.z deleted file mode 100644 index 4e5b2ff279cebc2f552d994ff58cf344c8e4323f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46813 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 YcrbzoBX}@^$Nv|>1E!zF|8dy=0=RtV761SM diff --git a/client/resources/hardnested_tables/bitflip_0_3eb_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_3eb_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b6c1eb54c9a47adde8f344c3c51fa06cddd1c782 GIT binary patch literal 1135 zcmYL{Z%k8H7{<>zx3{<4)_aQudL<ODVK@;2N5Y4e6};6AW>%pNmAXuJlKBCWeP|3g z;vk$`NED|Ar!LjFtQ#A{LEQb~LS~&u;|vnFbcSu+vgn;_93s=sKO1qNtDp9MdXx8; zC(oPbS^rvxZ*5@vs@Cl%Hcv#r#@zm;r%!J$mM_tL-6x$#)4;Y`0~&x65G-F0_Jbi) zyaE27TgO*8Vk<{-qP5?TIBTyQreJUF)YQ%k%ama5=s`sv4ITg%-)Q58Rkn_c<X~;b zrDZic30V1UP0b3tq0wdO9BEWLkCXx^bsiqR5-r5B(oKbHx!`dH*z%4!hiY0j1rOAy z$z<oy;h~Y4+QOapTM~IK=d~l((EG@a!nRX-7<~54(j;F*`I~%us#5HweW2I$p*my; zr^N@5xqHg!xp*;dQtP0;bq^yiGQ)mZG#pTW9a4sse9B1B#@?kb&_vwFC8WS^E?!P& z?LS-annSFmE1xuLk1o`qtv=2WLO%Xa)TX(nh0F4kL!yTu2`l+YH|XYu!vz+z2t5J) zs)u!PllEC5)XUx;NO*M81PY)|HfN$sYFhRx_Qe72I~kXdhGY-yw%i9D&pp=v5b{H_ zRtswnwZ!Bf;l1b=RHCOLu0ATqO1!wlkRQsA?Fq?j&N!@A_!~#tfZ{^EB$C6F935jt zaSaz6MLH{^h9WzQ;M~9^3C!o*gRH_>Ga*bn1daHzPmgmqIJ#v?YY(+&+`tQGWSeWO zdW#egLJHbtW8)_DgOfV;=soOfAO+T$>y(Bhu8Mc@Gy|EG*_zQG4#fTDKQJZ7Jz&nt zKVfxfLGP#Ssggl=#I0dmWxo0soTm|S5;5#RtTiFOCBa?xu~mF8F>@b*wAe>To0>ID zngjTG)hJ`tO<=EjPQ5ig+&aT8M7`)dE{dK8i}7M->rcE+!Uep^-+{jiWCy${0E~Uy z7*-_evv|3y_N#*W`5e415WnhIKTNuZC7Pgq?Odo{YlyVRE2iytxXF@V-K32wN`6`Z zZ-g7n2CXmdrym4TZX!YE@803#uS+ymAb@@|BLB_51G@O@LQ0B1M49Nna5tYSj(gDq zNQyX+7QPfd@nnIN41B^b(r~GPEAH|$p1@QUHL5@avSQk&?t$}YR)~1mS$#_GD9%*H zyM<8mnKsjkX1Ou1pjAqgcmf1tOMRWV&(C7+udLa!l1eL3oCL2qAbzB0cbrSNLGnsA zz(x*@BSYcPgoT}=`-zgTJ4B-r#l&O<`e8FsT-vEpNb<-_w>fa^lDHAe5m9lbUGU{J zQu69mvU<+?tO!td-=M8VDf*aH+Smv%9LUSlPlFD=6)|Sm7%rnMY}c~hD#bI~cuKbM yq?CJhtAP65h{epMM&USMEUYYNF$V`pBbvxclPu2&Ubk@ez4D8LgVzqeN&f>&!H^vQ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_3eb_states.bin.z b/client/resources/hardnested_tables/bitflip_0_3eb_states.bin.z deleted file mode 100644 index f8686dba6fe9851da2a7484b5352f4521b575ab0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23650 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 diff --git a/client/resources/hardnested_tables/bitflip_1_002_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_002_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..4c9093b38881be020ebd0aa575671ca422f5c51a GIT binary patch literal 7733 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_002_states.bin.z b/client/resources/hardnested_tables/bitflip_1_002_states.bin.z deleted file mode 100644 index 226c37a2f974e9fc1376217582082e42d3ebd688..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34594 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 diff --git a/client/resources/hardnested_tables/bitflip_1_008_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_008_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..89d88b572a733280b375bc66523de7d8ea338bdf GIT binary patch literal 6132 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_008_states.bin.z b/client/resources/hardnested_tables/bitflip_1_008_states.bin.z deleted file mode 100644 index 209bf5e9ee5d792e4a1451835cc1721183fd1bbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27612 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 diff --git a/client/resources/hardnested_tables/bitflip_1_00a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_00a_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..38af88dffe626c1b4415b38407451f87793ea280 GIT binary patch literal 8688 zcmaLcd05hU-!E`mv@ES$11cLgRD==)r*X=1Lq$jtL7+5c3x4R_V^eci)9RKY<OYb; zREnT%DhN(>x4A%yIwJ^H&el3(Hce%Fcgy2B_j8_eUFVN;egFIZ{aLQh>zzdBet}G+ zK}j^<(Yc64v)ev$e*bW2)hf4bt0ZE#>;RwaRc>y_jxELChX0;W=@#kMI_EJh_Kxh# ziHzC?t6UHjnXdF-Tqa(4EYd#`mm7J`EoWPsT9MQ@km|PZm^(Sr&Bs04XJLEf!fLDB z+YQC_5}}dkA`u$m#+m>_xD4(fgo}0?Ifp_|4B5*9a=Ami8EE1;k1FADOn69*dWL`= zcJmNH7Gy*=EJG9Do%13Db#!tR&W}&aI^Nw+D*yA97rIz}DDGkIb7t@Xsm^D@wLDP? z@C5w`NFTiqk<>#c@&s@)BjT>Yr9z%OQ6)4q!E8fzjGNuW05dr_lh_VHqJW+e2}qVZ zz#wbsXnh<W<)RuOI)lb<O1l5g7jq|o5~TRk>dU|U_2)N1`0we(Kb&grIB^DA(Bb~6 z`Q^CdDI)3R3Z+AGHOOnUd>u3W9dplP<0!~7cJF%WU>eI+g*l)e{b768dvcJ*lnm>k z3d^H|*_~KL$VgKr7$RqGleaOnxu|G+e4K2gJW7%ouB0?5@s!BJd&q|?-5WNhZo++p zk$2+KhWgi6Upc8zT2Y&zNa9^~Ydb~59DTC>+Qb{yi=Ux@(RF@u<Xty^(#ZtvTDfAS zS4+%h<j8f9<>UT$k7}>In62y9)_Ep8*b8FPGBxK1CI(_7X+i^-rT`PAv0hrVl^KY? zCB-1{V`Ee+T#Fs4)Iz4BXx=^oi-67cY`{cy+F0fVdM0(MI1UBTv7;JvcKI4y;Vpi$ z9|kpM<iuiCfYr<s%BhYX!znb?XhrIrtdW>RRDTS9acu13_5nOPI}yHW(3b#@T8Q%P z<HRk6h6AE-G+qU1k#S-nD1)%w0MLWWJ;Z|`877BeZBX(tr;s8($J*<~7I9EG6cy=3 z=0yR44b_D*xn{tIN~m!!P1-AR3ywtBW)fn;bE1m-b_6JPc*Ip{QB)_oJ;gW465x{~ zK!h3qnozWZXRIRXrs!*uj9?LmA{(Sn6tNpUxw4R@*oLqS*_4#Pq{J@M5<vpAcANZ` zE;M(7Wm2KMRK-;!|B*`64g?rL_Hk$mFL2ZJ7CD_^Vxibx&VFb)f!02lQOl%U{A}M8 zcGy9YhbybVT8PRxWF=~&q;Qn%+9XA&=Tfc1J;rIN&R%xA;X;uK&6YGE+b2_-qCveB zGqObyI}AHZY%Lt(vDiSBDAc{vKwnNl;9peBE1}2H<h&W&hcJ9NH)O^{x~929@r+R_ zQOIz3c2RB*?h10*UUye|bn>*Y-hd6UA;R=gZB=4@z|e)zMLB?+kWK@q=V!1}jL5J% z0s<n%WXOXpS(bP2VS@1R=tt6K`Pu5hgnb3Te%_BW(~oVxr)_5=^=9Vk8-1sqHrB2G z=b(XSFo+7YieESFOYnQwacAyzR%L9$ll-8KZ;s@CAgzo#X^yuYxw`fe_vs|{URQY_ zyx7_6{l$-xvx@JjW<3)rw6d6-fY*N;gjXvQ_x~I9mH=|eCxd<^7%d|wm5PUl?mM0~ z4;iG4pDgA>e|NXL*0%_CS>vyztq<0vRnI}I%qm5v^YDp3o{mRnt;`&Le@(x-ZVylV zO8cA6en$W8gU5pBoGYp5g48){MEjd5_Vp7hv+`s2?!Q+tX3ev#1n#?nI!2ytZdTx4 z>>aeJAC!$3@e_rROado&ik8AwmT#Lfw>g>MIEo9z4_rME@<B{@yWjp2M|~jFBk)Wg z9<CG)un~}^`tNYN=-s-}C^#*-!B#}ThcQOzypn=8|Cz2!@f)a82RqkMDizGERa(Rt z1cj=|T-z_H!Y;z<gj_o_1w~tC>rgjV!Tm_^Sc(*k)-f}~)dw}Ic%%?ZBGIB0U_ud} zRt-$i0o_PFN~a)MX1j7`p4uz}mo>!YA7&#vQ7fMlBVN<eCjq3JorV+25SfdW3?H5Z zWh8*K&_KM0D1gC318qZgt#3;d^rmjS%^`Mz#B!Mv$wNeQQ7m#zWBuDC+%=7X3_W%} zN!R&cn;lQS&su~PHZ6}FkSbuRHlTB8B)y+OR}pY#ppdFtRtP#)nz&J0*57G!GQ$ek zp>d~BU{G`eive^5`ajCVMkMDf^3;5vJG{xZFED3?kA~NC3os+7y&gR%GFyuP%$(lb zz#6VDj8Tro)-af4?quXR9mS+XsycggMKLmYdw&rrgxU&Z@B=icrbX`UlTb9y6nSkB zcOWWLqd8q0jtvB3b`zueH~#!Ada;uo5v2w{RGDJ=Yj{<FHJa|6vXYhuNNY*t)~uux zsjJ<+!T1cRB06U@wY7eVB5e?<J^TklAWe%XO;LbUT_r>@qlA$bxEx@D9M@Qb5E>Gb z4E2Z^hw=$2Z=~KC8Y~C{5yTT<48SE{<R4KVal6}wDD0_PHcSm@fD$tMefI^71eWzg z=c-?XCVhcVD?8C2z0{~Kl#^Bold;J;QXU~d4&@iSWX5a5`fyQZFfYj#7{;acFuiz~ za29N16+cz*eCK%0@Ba)tAe?40i)8Cxi&kUv)vAuVcTaB2J$kU~^WUd8`xgNRu*!{p zcke2D8l(@X4V%_ixU_f27)Xh#U&Z7y0~xnEMvknH9?r_i`MC9(?ccoJ&WC&q)z$e0 zEhzM}VF#%VAVk`J)HZF#4a5tcb__K>^DsIA1XhvS7Dq!?6w&;AL6lkoUPR)IpMu57 zQN}iGD-f=%(dcxR7HT<;6JuwRcAyOJb72pOSod>R8oXk&Z5yYyrtN8d^YPG;TfhIX ze)Y|vaq_N`1FZ)z91L&0BETY<ZmGL^weBB9>kUu-n#=nI=d3;o`Ji~R=Hv;dyqU~x zKJgbWq3k7YChLxGA9|d}fnWe`F_R)cg`dPT=N|$R%cPG;jbtsY%B#oBF-U~`5@E@4 z5R7}P)5--DhV-lA7l09Ow6lzcLLOaMI6@sILNKc=ow^o0(>qtOOyPq~%?vN=Z@Wfs zGzqZ80<>Aw$y3rNrWGim8EULFp0lDYA~MHtTu!waI%(`8iLjPJ=Byfx;&k?ATcK!q zt55-{l!lwx<(av14*u5sBxa0;f?~K<EjX7$LGie1)6KD7kD$FP2fioy01b^D<j*El zL;yE50TCGBky;CRNax9d>vK#QVqwnevgmA83I>523VE9p^x4H4Ue17O!FP@R_Yk^3 zGF?k4Dzo4R*p*P9JPQ$0OcatRWSRi5#0Fzpu{%(vku@pP$pk@Bja;vhxgdHEUA^fV zU<M1u>66UDskq|4I57`S0gJr#N<)cpD$cOVsi6vD0szgoUOcK3nICG39;-SxAaQb? zIs&ir!dklSo{Ynq^nJ+8kJq~ENXF@#LSS00<1lf5R9K8Vt2$zn19>e3ux>0C8Z$-* z(5@c|f=3Hkr}Y%-`U<fbc4@xfT9m5&qjc)5)u$y{Zg4paJb9*vWSG&@b9&~F$G`sa z*WQx2xVeTEq*)?2D|kD3d*c!|>pP0Tbu7kOSfvl+1jN;)e3;()&CCYL79ZR8wpYgQ zXxnx1PuJttcJn7jHm6_e&MD29i<rds_w)v$_Q4*E5nFaF<#eghC+M{xjIzQd>9gL7 zI|VJ0F+OuT#>P+Kz)~R96z&+K1)ABFI`IQ5X5xApg}Nb+)cHU&6*zGk6W9`YhtUhC zGTpBe_GWf$54$aG{3Ca2bqsa*u*>s6YBE&mUK6Dpv&(yNgLs$9F+4iLKLKgE9_IKF zf{BqEP$tJ-dfaSB1d?X!5{A70WR-IuH{WmnR%Tbqin||z5umd(&zlD2n9WDAALZZt zJK@Rf%Liu-i~qefip%sqOxi9q16Cdr#b1*OSmsK#5lOQ{uJU(h^T>AuuMU-3(N>h^ z)$4-awgl~p-u3(+-@l0Mf44c|h~~p1s1_-$B7yi(Z2+7A4Qw-HEJ$}uxF7Q@TeV?d zeRzWw+IDwnu>8Y6E}F9bIx*Mq{*O?|rPp=s$~*@u;l2%E;~lf-XHV|A4!JOKxJPhF zuyflp*o9S_CVKrRw`<ka|H3LKDMsrGUHnB1<OF7q>3jO$oJm4WFSrkBHn4k7^Ha6a z<|?{5OL!2I^8qG{u%h16F{SZ!zKpuikV^{NX?{k17}Ot|c;BrdzP{gUhL<08NSRRd zGV1WNK<U|xSJ8h){k?wWA6sRYlt<$UTjFHXQ&ZMHf++8JSD$VYAr&6Tc(DCIbF$F( z<F`LW=eB0r(>|HqW?@&+N`Y5;SH|j)*%jHDzk0@3pI+A0kdK0kFGMuGuKi6G|F>%Q z8{{8JPY3zvF{!9UHVQFLSTViO-nGV=Q4cSv!rAkbVLkxHIcIBw?|j+I(|-P@pgHa1 zhZ9vCB^w-muD^SQ77;EHvPCh2-sQ+Ds->ka%e0v)-?eeKZ8LcjlCCrHY0Q9^F>nai zW;Evw%QJ2pgvieBQ2Rp#B!=;9OXmU2e%7TJYYUe;2thU<KZ#gD+1+#r9E)<r7Bv;s zb?4lBsLZpk4|upg&0*i198lF+p#DowtLOQs<!C#PN6B>#aTZ!>P0_hX@%Q9);m~qV zh<6ILDivREYv-y}t!lt%FXTZnvMMiZRGUG-7?@wP!Z^^-BpjFwsPd?(b`abJh1zR- zR+CrRQY#h9Q@C<z%)n$Qg)A`n4hggE_R%VKaq$HNDp1&d?M{spb=|kWMwqb&E5t&N zeZN*m%?~?Cc9iBt4r~GupcrQ0!e>~MA0l(<_RhHtiU2kt(*x#=#XHB70NkgV&=CY> z%bv%=Tg9K_-c3nfUxvMSwlO(%=4ICWEuxvU9W*?etZk7Y)iR2OzvNoO-R=^7Ui+Kw za)aF5_#)t`oMD7686Ew(d3Ah8TE(l45f9!jTTFhD`KyN?84|jXQUR(|ZyY%c)i9>a zJ2#&{d`qZGYpqnoo`4qoCjYSj#e~d?2Odt`w>2rcI-5^Owx-!OJ^kWF-)SazS9FK_ zjgEEHQuEx!xyxPg_v)ZsUvf%?Na0c6xzitidcl+PA08%wtQ+z9sMx<BDNgE{2_M=2 zyvR=YNg4n2!WVDy^U=dET$6adXdSaT4=gp_2({n6w8e0Jn*Xz9bp5Ua4R_y+LJkME z@v0v^-h28+;BxJ(%hiG2JDB!2A9~``R<Emn)Ga;YM?OMSm*)LRCKr0{`og`il1Ic4 z$uB=U4r=(s)s*$)Ja_F+f4|rs9av_B*Md4@1hmia1Z)E{6*TA_K0nPF6)c6n0*+)R z*0d8+T<D@s-I*UHgfKu_O_dQ+;KBPmH^3%xElYA%B(2Cf_ckQ;PQ+p@5!Sts*cM(2 z)85QUdX~P$-bPxUVoGs{0ay_v103kfZF{QGCdmbQ&-kSb0B2vF>*u?vK|^9mARHY| zNDnU@^per)Emde8UC(tvO(rW|OX0O`fq5h~JV=_YzP2-0o1)AodQ>78Etv6VDGQvP zTz}^YbJ0XTY<4%iYm>H!xj^X3Q6$b@8x3IkG}1_rTtLQ}O&-W`wy~EE=Ufu{`3(fC zNelN8zsPOd61A<#?wj?)Vq7<j<OnYF(i2<ttY#X3p-V>VGt;Gs^?TBzebICZ#Dc;w z{Ya_N0WlR$+Xyn8kd1GkdDHw>p`~$VN;M6!6zZWSD*=j6{bZtuhN&MDL8~27a;G@! z$sOW)GBs?Xge&a9pF^1=8U>}~VHb=U3bHPT2E-!jhnz+e7GKm(NNqxPB9#=hn60N0 zMY#j45>>8!^9X^xIWbt16VuRMa|4z=)>d?1lO~|R2mxqpI|C_>sg*Wt{*0lM&`;Da zIg`?8n+V!&G&)cEHE3}0iE0uQ^Nr6*3D>11Ht+WSQZi_YmekU<UdX&p|ACyhW$ob$ z^OBFS{s(gW{}1F;d)<!swBX^Zaer!~d1<(RYxRP@h2`7M*>jdTrXV{?O57j=?r|Iq z7Tb5t>t@@}1QNw+)=V8+YJ&J{R8_~?mHNoV%JkM_VDtnlCK-<vf)+FpJdziqhq(R! z_tTw_Bc8+_b93`J25oPzAZ0lS5H~kB|Hc|$9@@2r*iaVh6sc#AGQv|{zpH}8&Cl}x z(Hn;=qs%slpfn<xJW<s-10;u6Ez{UmUMSEbTO7}{@X_#EzwC)<tX*Ib$;j<0jfugU z1Q*f?{yYeo)q?a7M)b*%?5gW}__LoryiGR8$!tfPe*62|Z!Xk9x9j6}jE_zZ{^Ylj zBsjX`-~2rXaKqiiug|AmIfFk5`6jjZpE-AI)s0_8tXy{;kzb|j%|e&{+>v)Ayr5DE z4-5^c9*kmoQs*m*F(sw(eMMmmZTdh#jeWkj!FUY~5jM=A^O9esZ#@W;SG-KF*h<Wv z34Tneco*>G>${KWJ4rDewFpEiw|Cxaw3+u-?qJKQt_vMa&kJsJlVVq2KN*A?4Ylt1 zGj`?6pSms{$kSFn`FnP*>2@jIY}&M`syErU7+s_A3vU3c8hL%vl<G+wA&_m%fL4p* zs4A{OHy*|{5Fm62J>5xZH^i9H9_E@71R(_@hu*}C;L&kO2qZ7HBxQ;_>;e$zSjad> z9~+yQ6k>;KijOn=TYAV|ITO67P8PekF|2WjTT_nh8~3$H+KYrbd8b7bilqz<CHq0c z1^NYmw4vUnr+CQKn)l0AR7UWMeKc`nI%O!Vm!0ZwsU^1c^rjE1wY-oKlQM%ceu@HM zL?H~D@swvx+d$8BNqD8NOSBw-E8Cke93C)D<zqOE<w=Gd9w8jlOY;zU>HVNXJgi+c zTu$gTsY+U;JlPh-Eu|_Nn+(k!$8WRqR9v>kVo-e@@QqyRFhnUlrBG=mMkTB<%rgsW zM5f1ZZBv!PlBo8d;l-G|q`-&E28LSVd^j{t3r0v&nV7MZ-Qw!Q*vj%?b(41}wn5BB zkI+;*ZuzhmbNw<>-==Pjl%}HF&zsX~BElIk8v+XwAc=(%aqZnQZQDASnEPGiP^LdS z+LxiMX`~3a=eLI+KR3x}RcnHW%rLq>EFN7B&l$~dg?t_Q?8RAZ!h;Xb|G&1P&a3;^ zotvhcH(hnx^9E+mUupiRe1GKZ5=Y60Ef4N|`iFg&e9-peq+u(x7D^M!*?NFe{-=EG z`Xk@{Z?4-WV{Sd6+#Hnd!@OPTy2$zUJGgfBR~^hc55o8FtJ7T1GKcQZ6)X?D)zlPW zN$7_0M;_ljQfNH0%Xc(&Zaq>L>+1UDvZ0{(h7GD6nH%daI(=^t(xG{~)^w)3+4A5Z za5?_EIEW5kli0%Bk#nnz>Z+>ga{{BRX$oX8^p5|L0rRpw>Vus~ixwN8PHvED{W5dU zYhEq-E9l+-#u3SIKTqwU$07|6bJuFmY_Ap0ce8#4%AOx8KHu}-GBVQS)k43?q*i&= z4_&6^6fIc30}))JZ)G>pO=r}Uc@v>P`oa~UVvG_!MR&1;s?4-n*G`3E(CZ7*G)}y= zEi&D>@nufLE2?G^h{-ikGQ4CW(kcyW8Bc;_pc(4=$<N^1cCdU@LoOtz2D9)KfYFPG zYXj&}ka-LN=oBXt27&lC&&-oqQ%ZSMUSf3izH}L-e0V^jz-Cl7n%xBx@SI^e#=QvR zCBjF8dLVK#CetTkG4bWsR1BCdWYvzfb0#^-fnl>0m2h=t;#dp4nUtOxtcmwhkF8q{ z%e@0po${9IA)`o4wFN)LCvbZGr7$}!l2MCAB+Z}73cL!iSD{BDCuDd=56aY(sPSHG zYp51F`)gQ*COOO6CT#_Qfx0N%p45EYH8>mv+=x`$(>^B5^ka}4NchR~G`=StHY{xl zG_T=!!6_K7tFxdiKX>gy1J{H#n%K0(tEO5Qx7zv&g@75xpyPY&G$@3&sybv%U`Z4G zmX8RZ2}jmK5dl)NjHAG)1aI&V?`4C5(z1(mWtDt9-Bv%h_<g`TAH7GLK4+LlY|Mlz zZ|CMGYrNE4O2+yWKxt!a_B@0`g}S4(sg2MYiH1R<QiwWV7ovT*#aqhllkstQ7(=Ql zDhDx1A-Yb<cYm0u2f8>zPp-F|+FL{O&#q6987_#v45VJV`qlfhUwyZ-<k_>VFgayo zq;2Kvx}!A@qNg%R>9<OHchH>aE$yQuL`WY#)?0q4`Oe&>iWiATH##k^>}N?zor_7S z9BH_V#EZ!5lCvG)SVh%-=yFY6z#(FmyV!|=$PrP7rWm2Hrjklg5NHsCc$zyHwkX%= zfdNC}^a?T}sztaaZ*DPNGjBP`50eJbw9w~goA=bsec1fp&e1PVef1MEh|WPfuR<fd zzE>b$zkc>;B1``A`Tn{Ja!vT#ypd<xy)*Ab+of$!KM1rl8*}5qx5q2tQbRCflr0FE z+Cj;LH?T6HR3nj}#N+rNN_3-ednP|npk@n4%HbrU&^gie@f*8l1T~u4XlV*p1F?a* zR=STOhe8*O`hf<CfxfyFR3d}bf&oP-y@|My2wgA5CL0)&4w&0aPWjlF$~(NF&FXLz zOJn`eP!zifJP!#RjgHmQ-coOc0|tnRqN|cgUD7}~nqpJ6sIYRzXCkf<THF-EXB*5w z`WW?q<7{O-KD84Rs>A_-xx8eLRxSiyQ4n%pCZXa1p$6TmPC2lR(JB_=p{+TumKCIK zILCri*vU_`=hrd-$5N;aZ46Ws@Yo+*;-Mq!yet@op0^yCV;z$Z^wpT8r~F4lF(t_m ztSC^Xkr!exv3?kRTqGhYH9BsJBWevH`P*)hmEyjiizmGz)hvy?{agG%zw=9S5Q_)$ zadI6k^vU$Q_wA?uh()o_J&<197elvviO^R9)&V|P=D5(-b89VPJG&yheR{~$l%A47 zE0V@PEJ;Hvl9jdKtZQWs(g+*SqWPPd^jH-`XWKa$zYmX*D+1L6L<U_VJ(pb>ZgB zbaBapu+tqb&(_VYdzPd`uq=N8Dw&4eQb7kKEy1RP5wFolOJA(cy&PJzH)two?0e>= zG{=Ul-Ac*+>bZkjL3iU7`Ph!o7;Ap;^%$De0`3wswzH+Q_8lB4OdvN_)SwIbY<UK5 zyh5IcsP3YeX%Lr;AGvQ5{{Vge9z8E_MYJw9!>CXYc@1ktnaC>8Q0dgg_D5ayck#-p zO8Ewp+<C><{jPtHD}&mIz95gK@TfewX_^L_GY`slZ$kG<<xG6f^g3{fv-DfSz(e-R zt8YjMpci<ud#w>pYmfTjXFp8!k2g-AS!-9{`*7-m>Ccyke;>RdJu-}YbH%{s6aHpf z=~E>%SubT^d{+m>;EW%h%DVmT;w99UEBmGldQ9F=b!WcY{{j5r+Yh@cW_~?+vTN+X zTp-VfQ35?TF;S$kXoMt$f``Av+`L~n$H(aC@U<+Y<<sZCVph&JKX3T=n3VVDrNiMV z@33jV(s=db+qI`V^66il_*0zLu(s@yr<432pXea1`ipUa1Gp6O3-f`N?hnKGH#Iai zI0J@rhVI@pt?GHq7Gc)&{u;Qd^!9uuKRRBu_hJET;F7N9{-qOZh;Puvk*-aQw+YvO zJF@&~f??O!htx-85@qw;*%#feG)uzz^B*kto1b``=^NGq&Qw(G?rlE=n0nVhVuv>? z&M-CiP`kh6Ta>}k4zVu#@KU+E1U8fMa69Z`!^-sNHd0Ndavcrdc6aXR)W(B_k1n>H zy?ec7`JgwC)uPKumm^d?)l*~gu|1;-I0!}8{zoJ5q|8p%8PdPv<h@5l5BDB@KE0pA zZGm?>jplo5X=@b|&PPz^Ed#~b-7$Rz4mtb(Py`Z6K(kS%ZZT%bd=!ESxPS06Fdj2% zdAwR46tkZ#V&*cv0BeC)DR7>1;7f~?gYGSoS`Q!WI*eKVFspL*X}7X-zcdh%`{EUX zRs#h5FNIL5Q7V~;mx&Lsbu2}q1qO6@5vYbiA`<}x0X8s*S2cy1IR-DP&^y-}3il$G zwE2gWup~`fEC8aHCl#_3*Y0nCDXUdjp~$Blpbjp_(+wz<+AGJQI(c$uY&4TS!mBs2 zu@NAd73pY+ah2sKN2lsi_FP2wJ98eycSYHHPI@6gQ^@1{71Y{*)fxBmv90rQM<*LK zUPOpI`it_xf6(FP&95YLrf$p3<^5X%&s@&R{JeH*BTZ%+1l9z+j6BpaT2NQ>?AyMy z_U>{jO0~N8y6Qr#?efa?b7kU$$Nr12dOp=SWYI8L82|&CLavxzOP7;kS7=91{MsU^ zb&PcF?ERfEX#GI|(VosnN364v4-_o9|28dXN&KrxAv5~H-rE;n+|#azyOLLsXTH9( z^uB9Qd^*I(XX>j{n?7#khs)pX${pim;lJE?dGh3`gpaJ}zar;t;h!fq_G`zR^*?`( z{;PCSIDV>jvj5&Me@_4Q=9`2o&sU$Y#_mc^<uB?s4+d(^zh;W!bVq<`#;2{Bd9!s3 z-y<Ss^br~FXGlp&A5uNUlH<^jtecV?Qu?lsQK{Zh!8sr6m%q^zVd)YEqu0%N4vDMs z_V$!ZI3R~A1dM8@1&B$YQ4APO$~6Jj@`7d<Wmyl+r*VW@$t@TA*b6f%;<N7xN|Vm| zw{I5jX#m<b`ez(dIs^svo#gwtgSKlF$?<kYu0#^*(^l@ICYNbP7FzJR)S3YWnMJPt z8s})vHv8*2E&e@@DtM0^m7L_m;FEiKJ}Oy+IRwaAU9r~Jh`X&km*HAQ_mE)AUitQj zFPBjo5U}sy@yY7=B1^ttN_Y+&q-r9hYEwI7kQyyER+;6A^#OI7ld|B@Ab*v(XuD*4 zM)1MhfHXDPXQ04e6#z!d`)uoUprJ>d5=mw@utE|=&$h9+;~rXkkxJs_kwj<Nin6)k zjZkb02?i(ZU>HMj{lOZeXKjd!B9S5WxSJ@HG}py*+xmkb<B%dp(?74HiJeVY+|%@# z4MI;nf=^fJ!ezJc5EX(bWu_Z2G-wZ|Lf%Jjkb6-m(+qS_5oF|UBqAN2<OshJBGLPF zR4kE@GVoEA^J$x&*!V@;=0qBPIq?qh!0iw-a&@hYnNhkElGN31tdYnbWoQLVc+aGH d@=Nu|G`Uow$G4!izWG;U)IdemZOtO;e*s5_=Dq*` literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_00a_states.bin.z b/client/resources/hardnested_tables/bitflip_1_00a_states.bin.z deleted file mode 100644 index 63f0a7a5ec088ff9bf84c81e022aa8e0adb18738..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35498 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 TGZf<qUaqPJV1U%K<?4R`mKrbY diff --git a/client/resources/hardnested_tables/bitflip_1_012_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_012_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..492261923c4d616d11d5ac062798b52ba6eff1ac GIT binary patch literal 2678 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_012_states.bin.z b/client/resources/hardnested_tables/bitflip_1_012_states.bin.z deleted file mode 100644 index 659e697f27e45a3d951a13eeca6f4ef2268b93f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20925 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 Z>C%Wvxz7*<%#quF%VXAcm-f8*e*rN#(;EN) diff --git a/client/resources/hardnested_tables/bitflip_1_018_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_018_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..c0a5923785f3eabbbbfee990284b0948b5d123ba GIT binary patch literal 1623 zcmZ9MUrZbK0msi6AJ{%&e7-yXHld`%_=0^Wau;cmJ2j0+W|M#y0{+uqCq(Xk?zHyJ zyrC}5Ft))yTWJaT<4LGpQUU>6!G80kk@yau(@s-W_D9;JJa~+0WU4BwLM_eT^4#zD z;rsG=_<mo$XMXkW>*C<sZ0PNn>5E>&%Fmzf{okr6vooDoJBH0*ZJii~W%`@;SBLo{ zUBs|=KI_M@lkZR%_LGwq3?qJT!Z18IvwVH*mnT12Q|A7@kH+mUn#GsS)(EDj)^+8m zA+ubo-zkgKe;Dr2w%xj~yuz7Z{^iPtqyKvLrtPE4*N+C=_0Tt7+nx3Mz0Sux;Ylbg z(VJvQO)Ef=WpIv$ZUplqIMIvHA|2lJuF|A*);ySyvDQU!et^QM;<jazDz*&cEzek_ zK7L>t-CMC*bTLTkz@NxjsU^$MXMLNrGaY#nB13dKk<BLF!ah~aa-<p3>b_&shU|E) zre+biJ!jt28P*~-cVY}n9F_D@_0{}x3!sPot>o7+u$WE1G0@>8-~+$@yTKQ>g)3j2 zcI|GcrxV{=>EpX_tyY`%h{E0Z#}^#<YacW02~$&h`De8H<%4-@W8u<M`@UE9eBZZW z7<+zAbjyUd<o)2)ue+ViRPHN}0*c+L;K_B*+4f~29`{LlPN@VKd$RSWx%n}z=sAY0 zz#N@9C7vEqpW41WI9?0w0{S^v(+vA=&a#-27|sIcmsLTB0(wL%0Q#TXW_{D1%Z4kO zb6XB+%E-1o>(#^Ba-PoZO-;BMhR!98iHw9qbQO#+)H7SVj>O;utX7ckzQa<VKKhF( zd3pjo(6e<tD@g~o-PWI+-@wbHZX5l)HQjM*ia;gd(%!@0{PV$opG1Ugi$5dBz?z!) zuIorgGH2{^+UM=htV!jK6C>b6b;D+*_qKKmw;l_{7Vo^X9=``yO?l3gB=r*`bXKh| z#he`$gi4ohnGS@OR&6a!l9w=WcWM%M5~FQTx!U3k=x>#VxqXv_x35D(mRkM(#ere; zTk77!=N`@yQHPa{R%efUL_1Dr;Z3Gr8cQgPMmnO%00upYq>-$k0w`LIRK3DF7!ac) z2;6i59*7R=Mmpe`<6+*bMj5MVR=-LuMUO!MP@@f1aF0?tuW-~Kb_(aF(1HT5*DF24 z^04fc5h$-1K**jW!f3&j4hC=mtWXUBRo~@E&6g?PBtq>w1wA+{Rgq<ivmmOrSR1?8 zGfAC4ti<rWK_EsQbmFW<(xvc2%_I8(32DItuHR?vGKi4^ESLP!mR*Dp?+b!ueU|s9 z1GE%`MFRIoqNFC0c419qO(`{{%1Oop*A(H5R*M3lp?j5tRB@-Ipm47ylwkgxRIj6j zjB0G#K{2u{OL|7<h2h}g#9%O7Mg@@oH<EOqv(cNwIfhPY1r#z3W@Leo(R+cPu>fsl z=!w@rr!NexX@f@Y3|GhF#`eXuN3*A`mNn&eoN2$IUEp1WI|oDw)haQ(H>Xs~wJFh^ z%^)?I)lrFMS<XrB_(U;=^FXV{a=2ZoNBiS2M*6Om2I!f3;TGY2)H6iHhs^m4_yFHU z3=y!r1sXna!dJOU`{X?9pmx->?}paH7>OQO2rsC<PmOZ}t}dULXb25453Ai>G~^A6 zc6by~GePOH*rvrjLGJ~|)v0Gw%kjJLJ`owQww2L(fF=AqsP=;eC25fg(e@%)cXg^q z7HL&YDihE@**-m}6j-ku=tCv1idL){Nf+~?m0;Y89CJ8;rdLWtFcL`{67H0{*<sqE z#1xVRnc;{4&*6NCAz%d|eU2f<|7KrT`5@1SjP|_9cvU_u2cv!2Eo+xa?}_sKA^7hB zN*B*JT!a-AVxRysYC5h}hC14&SZ>ZO=y@?MW>5{5Li8)k@!R2j`V>`&WM>^zvG%?< z{*f>5<!0xN+YxE<+NOC1ZL-$CuBLyRtCbrL2DkrX@Ubk$e)?#2`4o2QNTC6muAT|= ahiA98-#6$_k}q?AJhs$-PMrN;_skFA?qbyd literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_018_states.bin.z b/client/resources/hardnested_tables/bitflip_1_018_states.bin.z deleted file mode 100644 index b825cfd6c178dca91b025caf98c4317da9e09972..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20107 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 diff --git a/client/resources/hardnested_tables/bitflip_1_01a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_01a_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..98093a999bcdf03c47c0e4af1c64f9043b6f795c GIT binary patch literal 3415 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 aX#-)G4%FE^K+Ia+yzb<s%oCDlRsRn`cmF~F literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_01a_states.bin.z b/client/resources/hardnested_tables/bitflip_1_01a_states.bin.z deleted file mode 100644 index 61d252b20798926c6ae7a7304f84db6ba4a1c788..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26647 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 diff --git a/client/resources/hardnested_tables/bitflip_1_020_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_020_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..333dab4c5991cf7676aa290c4561dd90ce101966 GIT binary patch literal 1536 zcmZY8drT7t90%}&_L}Rp!@jOu4Njo6w57(DK!TYMT3Q~Zh&{M+5_CNt3Djii%>Gd0 zOzCSBi-S@SiHj&Lwnx>IVB(AqI6;9wwu-o9S+an-#W}MuB=eDF8~-eG@t^M>zrVh} z<nuK)w(rmz_ABf5*LFOqW&P3mo%sis0MG-az!rDuMj9apv?py103^MD3V=pf!m;5Z z6)@8=)&m3j%^jmgH@|$iJym1DfE24V8mV8JYcD)j8&P3z;BJNkZ%Pd%aJ^2|1k<Ox zbIO7rX1YnQ6wT*1a56IVN4kyHebj8daay5`SoR7A`1QG=Sd}9@Xwpo0#^J9%>&!}Q zQTgmSwgOAN%p@~y?iy(L269zZvm=utDkQ>YVhvN{&xtGR_jLDwn^Lx2&e64Sl%S7n zX72J3f9ASonnBC_oqJ(smlQcxv5MaPttI%1f1+Y3{+dseJ=f3yE-CyAzRj#yUcM3$ z<=DPidA*DqkKmr@X*M0_q&Wmkz!D#gAWhqi>t#$WL=uByj?OlHOb)rc@x?nWKYlS5 z{#vGf(Pleb)IM*OQ<p<_v8DZ?oF~`zh~?txEcwP2S{r#j(6+7m;S2rWS;wJWe9dd2 zhq(wXU#?8bbF<_*Mg5f%+o75HxuG-I%tB)fSWe=_hNWwY&4b2IMTLWLYNceatpvfH zeokV`l@sn>+AqcuVzq^OU`Y~$7#?DD0ffNoi2~4|3xQTS=tv5zu_{ug)`hxs1s19` zu2};m$3YI<J*!3~+Nu+2#@BH7s$@HFmD_z0B(v;%ElLk<?Q3=s^!OA*(+L;dz=7WE zEE&40w<>mtQwQNyLU-=`I<hW)nEKd2NWnilXHG%3PR9s63M2~{)Oy&49q42?5Yz`| zLju>dan)Wxiz=mv9rUaH4#JLFEdf5CZ=^%nBr25*;Ur=A@~Jwmry6v2lQI)Qut2Re zX2L0hug{TW`$OeY7H6Z|m_js61u2753@!CKDJ4@RmR!*FHFsHK2`78%5^h>h_)g{& znj52=si4Q)dq!MStnHDhV<$~=Y&M%Vc*d|;VV~7pc{YCTXH`Mo!lC?MkKQc3eCx*C zN1vnv>Dds#q9Fh>@Y7h!pQ~U11k&B?3!P(ua;x#ZG!$z_l~!erCu}npZcHQo7Oz*V zBZ!YL*}D3l|DfqT|M9R=p>EFOu_F@^TL~6MeF>R@hv(IBxlwkC8Wde05G*3lLO4cA zt{De&OKFResvJsJIHN%-R{fx1zWGkMKA;1a>D;TR-izvWS~*WDMTw;9&Ut%=fXULr zF1zp<J-)bmCA5cAa?XAK?e5u%xn^c7iTiZb(3dapSDA3bTHY;e(xb=sSB<ph4ZI8A z#@?YxxNh+tY~t?B@i!Azbh-k37Rq5V2J?S!JL0T+)VAqR_Ss8~69FW3<0@gTvrkMG zUK{9Im|3lW*8+(DsOVWN+_CHSliKg^&v{eKl|EFfah-yH%4G^;t|WC$9Vy-vS#%z* zQBsp<lom}B67LcHQq<K^NIkwVQ6p&Tk3Qb(#~4JbXwN<E3{%5yvrkoQ9Mo#Lek+NV z!AT9JMLZ)z<>_NW4{e8(Rk$v6K^LOzpfj&csCa}`zAL`-U-9ez6Tf`5L`&eyBtg_) zCknjm6W?YiwbnXrt!X{eb5qLCPrXJ~^DmCv1|3A^az>uZ7~+AT9|g&S0;VM*tXSlV z?mT7B3iX)xrJ4OSfjOpl9IoGwcaj#8kRk!G=)9N35+vmiS`PY^2w_JkGJM`QRR^{Q zeXU{A!I#jDrrb$0nMV|)<+KR>?rATNqYj$J+&z+h3tHZ5?;6!4jT94|!DPyQi#L6e z-5O=03*%~YWK@%Aj8~UV??1B*ePG{sMz+m@IlQ1XOgY0f3f1=E;EMzEk`<#dkiBj7 EAEV|+qyPW_ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_020_states.bin.z b/client/resources/hardnested_tables/bitflip_1_020_states.bin.z deleted file mode 100644 index cc78af68fa9b6cf1dbe5af5d26a81dc43b0f102d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17327 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 diff --git a/client/resources/hardnested_tables/bitflip_1_028_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_028_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..7f2e66c326848a9985b488471b083e066389d016 GIT binary patch literal 3493 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 Q$K%sckFqjDs^9VcA5+vH@c;k- literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_028_states.bin.z b/client/resources/hardnested_tables/bitflip_1_028_states.bin.z deleted file mode 100644 index 1137886b1acffbfef9058c5c75018b364e2f8500..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22552 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 diff --git a/client/resources/hardnested_tables/bitflip_1_02a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_02a_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..18c04fa4739a7f9220c05a5b4791308e8a916bcb GIT binary patch literal 6158 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_02a_states.bin.z b/client/resources/hardnested_tables/bitflip_1_02a_states.bin.z deleted file mode 100644 index 12829c1bf19af0970111dd6c2330bcb8160b6fac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30656 zcmeHvdtg&#wr@P#8O|B+Opkg-M8u4P+Ciw1K}0~hM;WQwfsDK=6xeFj3Z+D-P)i>l zXVg;}9vS2jfx;F`sX*HRrHuvJjXYYQ&_GKYXrX&(8qzjRL*B`LeCw{=s^d9l?!9yG z-~ES2((ESt`@Xe)ua%El-Mhd2+&^|hnX~d}&xp(7vWzA33({l%pfua9Z;tr*zF!^Q zV>xta%45I(>0^&Qeh+xO0M2loaz;8qA!n?o)FXnK%g!yx&h_<}x%o7-7sO8jELRg) z!nm~-#abt@aAS{=_fRtxV2lzx;X1~=%rsNTvvMSkUCi@@ad+|YdGKk#2Dcem`!d8? zyKNxRAQZ{rR6VmuAmjx_m(I@tiwkVAy#Td$7E_t8kASp@^)N|#ni81pX7ZkfsBI-w zr%&zFMlHXAV_eW$Sp)R-s*G@%Ay=`S^xUkuX@Rr=d=}yb`nl6{gH-fLqCZ?rqObV* zKs2?N+#vz@jmQ_%b5JK6vS>cs)dEBLm10A8D|1ELMjxll#|rx>teDvWCYKP9SM4Wh z=eT_$X^(Ij$Gv>OpYP@Eq4ziP_XQbBWX4|tJzc~_LAt2*>I2#kIUx_*p)h||My2!5 z<#vnfWyS}8AwDSSW?Yn&Nd)e~jUY51g+M1iQyvzrqp{Qo`Jtw~5Nv^Sltc{8P+ScO z*{~(3KoV{FGZ^22axf~S7g9j$()xtbv*a)wfpzcz;HxRWAKDsi=b;vcLg_ht;xBlW z^`Oz5_={*vYh)VP(Z@nyiYH}2=1^xDpWMWsh6gE3w(FLI=9xdsX<g>c0di2uyoRsR zd;t|UGU^6g!v6&LO<*?B(n)Zs3*MrZsbGgXFaq8?&Dw~yimoB}ZpOC4T`sEqD||~6 z=sg<E8w+7GB*<FLT57ur4||DBW;ejCKK^93JWPtA>NSRHenp$6(DAb<7nIo!g1-%7 zT#T%~gE!zU{H#MXS3tdC<KPVG)Y4JlZv#5Mn$L=A+d{i-jDZQH76IKf19u!PR1&zK za~V~m&XH;;$dQY>id#9qO#OQ*iZ{>|d}m`ml>6D~tR7qfQ<nU+m2B&VaeZX_O_nW$ z2_9kn1=toU>Ph6;6gjP)n4|h+vLwu}Qt}n6Xq%i{rRYXLdJB8|;ogrH)r#gn(O<gx zM^-5*7pTd?njuw7!UJ#kHtf0z`AWWghP27r8;p7G@>}ps5{##5b?izzGeLIl3?<E! zl55HIyWl))-D9kPTxxp*j1NKiJ1`!%LeX&k(G`l}32IalaGfjL@_ewYj_=zHVX>eM z(xSe}4j2W7{W4Q6r~2SCu=c{pX0Ro~YfkMFIbX(Y=LOd};sx7XsP}2P7-t?S$R@ip z8mhv!D(9Ihr#+ZO1lC!gJ`z?|HB3_fiGO6rFXr&csIsE3|Iv2VxhKZC$7pjZxrD>N z!gcB;@HM&djUjN`p@8|R=3jfbmO#_0R*{Uk!Uv<eyAUrAZ8@c|=NVkn7IM@#<pzuo zX*HUgFGAW23}x<+dOsuQ<0@Z;Vg8usiS>ot5L{}df_6Sl+9<p33q!IM-UUX2I8!-r z3iJZMUOoa^bycFmj0UK2P!fU<DC4t6@mWh1?oBOaWb#}eY^~>esUI&g3a-O;EAF~! z(h~kwBqq#%05P(q2kbJNNSOwxco_KlD8D<Pbwc}0+<seN`R@1-6Jori1J2_6`-#X& z!et3c{G?A|u9NeO97|&~hd)iEo)LQ>qe!{n<oaZ71N1#ZpNA2DxTk^aI-&07wewp@ zVe5CtsX@f!w5@?Dm&g~8ZiNUgl6oBQO8L)_HO=$JDP%uW-_6I56C1_7RABI2z8eq( zKOK>P2cb<K+C_j6D><2?ESwQ#zS5PFg?;1~(V-g6@8n_&=-a5rPR`;1`yEXD3_fch zhimAF6lw~=TzHp8N0ruT<vMx>PcfNC6Wh2t{!qZ><w8yLgoRWI?@mgbq)e7CZ#19n z7+-HDi(l)NopvW<=Hmp)E%nToU0>wA(!?{V*)V6Z+*45VES<X^itGfETcFB1LdvQ3 zCe;G<2@d(fUMqjB6oMWyy9GKVp(7k~GJbeC<`*kq*M7MWu8`}Ha*W@jWL>6wqEv)$ ztPX3)W@z{6B`@5DGitfcP#+?l!hU&(<~q#Z$xO<ou~GIeyCq&z*hzFNddh=!Y}SqF z`=g_y1t86&YCG;5yd$SXqrwzmDfu1V<!`Y-dOUE3PNTPRWwC%6-;)z0x%f-vr&buf zj=TIQjG{4Dpvs%pp#BTjF32td79{dK{Boe0rR)aXZt@-joJ_J^u(_9U`*963ptvGJ zdZL@^6>DkX<i&eL8n!&0>+Ffwx{H-?I{5wt<Sl;NZR0WJh+!eS+rrFcl#KRvSHPU7 zo`K1-Egn7yg%a!F6(@hrs&CuF{<%C(`*lQNwx0XIMnzEW&X`EB;dmihcZPkG`1+ zlZrxqdpT_jch=0zsc9uMYe~Aq6e|b3!(67n{2B7Db8GA@&=GDgw%TQ~l|YQ25!uOL zxytYTMSM$r3H0y7yTWt$DIS1VTbZr1XUeeMty>SvJi5^WnZKWyo0;smYIyk|I5)r| zyM8jwtbpBzqVi6=KAE>2VRknK!PHa-vs08<7nu<~R8AAaY+I14lrOZvS!Nx18?0O5 zbCTE7<w|xtZGBjt&cif%0m=_TiOG%&oe$PB&@YAN^I+Qmzs4hb9o9(XJpo>lmO!uD zRsa=2{zJ;_*Easa%>9*-ZMXS=Y`&XQG$$7nZ;0PoK<3Vd#BS3bBIWeL({{mR{1k3G z-;wy7=%lYqO>~Y@&hk@f`MFMbUyc(VXo+!<(ZWSO6tQiGDc$_%UZEIlzH+~3Y!A~* zf|2pT*iG1r^gKPZnk-l^+16Y%2BZ32q@_-HLF5<9>=e2l(L`(D2pq;{bq300CmpBR z@UcX`ayu!P0Ykzt$E)^Ps$0hhui{qG_18niMjj3^ek_iPxe%l-!6(Cs|6Ue`cGKb; zPT~@^bUX|R;Kudg#ys^NmUyNE>q~&>6gC0w#Dh1QvE4>eF2PrHn48!hC3m$_41ye@ z(HwpRuC~B~ezFeR=@6MI!M8d@qj?j{s8NaOKOO2xi-FA~Vw8pTaKKqu;LELos^&u@ zb^2V8l1()kt2j@)n~lFMkd=;#4|87SSy8ri8zfzDi<lQ-hJmZmcFofmF<h2Yq58U? zYttPNZGM;?HP2F*(~1-NieviBObv{Y`z9;qELa>Vxt;Oo1?SaBVsnfT<6yI8+h*{| zL)}q*E4?cvxZ$K<AE&NGi>0OB+-6QVw9Dt+wm`RtCA%3<FnA-^Mq0x$X{KZjjzv>* z<;w?fBddiYb0}y-T3-yfeQX<iJp&I<QZdvkT=*eyxINQI9OEO29ZX|{t5mi%(GTTR zZ9;1gydkIl58xlqo0p=PheP>t?8j}Jpz|zm@%EI)Zwc}H<@rY36E`a1Gt#!4iIPe? zyUGXc?0hN+h8hLLg$MY!Fqp@K$qduqfV7Ly8?`>?$1W`tEo?)8N1yUD)$tV_Oec04 zGnNz+nNRum<Y7S8$&t#+7vKo5XydW_Xx6UUrwsKN3}Tkkv{hoJe-(p(S~GRCg+`pr zLjhXn3&yBBVr`Hsk!OZrgMxK0^9np{HG(mUn@at8N&<Yw>JWb=Z-+dMEEktX$y`4% z`aGv^me^08ESLESsl8+AHWOsdWbY?i&hddTymLi=hoRwYDyL17$VE4s=-7UT3nzt= zT4ATiPnV8KG0|zT7rr!Gz;cReJLK^pxKlz-SNw6E!XBlUlF2zY*b?3Yt;cY%8tZQA zU%-|+N1V_p9Hr%ba1IZB3~-BpyG9S~B@^7bPOYSs*jx0I_`qIfFZI007g6oM$76vU z)x{NQ<#6_P$qLezVf?}Q0;zGP2>iWTWlgEbf0B2c`lzsjO^%LH#<-!-6SM|js~}m- zJV9ry=C=tBWsFsO2v;WP{MybY)6{FEJj~Bk>cnX}I`JjBZH;sU;j=YZobg-bM2)lU z_k|Y_$mlPU12k<S-RI|DR)kn;9tkhw_IfUmOU(jbO*B%Bddy@`18Mm6kW(-0qxPMF z2@Pa>rM?HW+n|c(w*<_0`5uwIEw9i#>tLsmjr(A>n=hnli;~UNbi@UkivRf%R>`C~ zV7MGjosNZ?cSlu{LS%#q_h>4=RdmM#NT!Cq`ALK<r`^3Src;Zh#Kr%9Qkeh6Ej;HR z3{}itIf6Ak&Wa3&+93hh+e}#Zl2*(R;DW;3gxMEKAM6NFZ67}!>H-F*<f?G!TjSlh zK37N=(`Ee#gkCp)Mp=IyR=bHxyKd&)Au4_8zb<woqio0a`WHBHRa+d6*$nSK2KUl? zySR4p)3uL2kG;`=@2dpLB<?VH`Fk{XahG_p0cR<sA3D|Hhy7RR9?5r^i6hKh9tjsN z^M-dJc@pf3FkhU4Gf~4?{LGreG%cQNR$F-lJ`9*Yq&ue4GqNF@sw{+YgOgfM^kC&} z+48fuWg(;u9?&aQE-AHWEOW%qRyvCVUkYNhqWcVqFn^+v>;~TFEF{rhH&+2gd_^Y{ zR7&?~qX{&wo^e~2f|bx?TjOQhRG6DZf62j9Q^|*qN0Y^G&3rSL81-0R&pKF>QP?f) zbaU0P1A$?6kguc_H8cfRFdtS&jR-(FuKq6F<AJe-JW#(lOI#7%t3;Tu`DV7h^=|M& zc5Yn!0}b1xVE1BD7FbzJ4(63nQ!SEBR!5Wap-42qh{iS}H%Io!St*=(BCV8Tc!>UU z`ioN)9RrV@p)X8@FJp3Lu-Twt<VN9WkS%~#vA_457DK7PZzFE6VJe+2KOmVzXDI6; z{k#<lOQ6VYDg#%LypZ<_)kYD>Mu{zwVNg<U!FoK6TFUIA{LT>fA*@?1+sfn=q@VfX zwc>aQF2LKk(Jfn{v<lwY7cspI0v`$AF<hD+FD@*VQ+_USGNSP#DqTH`KW!O-lrWa+ zWiEoHtlkSB$vGqVlLvWU2jA)?Cn)1W6m3-U@wc|w8O^Du_fcm{*m$glf4rIQ30vP6 zU{(k7{tQ0oPct%_>BuI->fx#IXt8~1#+JdeD!12YL~Ma+E@7wNx`Ar%kT(B!$Ht3o z?lTB%g7@3l>(~%M`#W$+WS`6Ypi}=VP_I!6o9=`k%xL*K1Rm=n{nfJxssp+o^Aj)b z#n0gVT5>GNpToYZ(p98|F-U_|YNJ9G?8J=9J1*h5i{>M^$#oOh(UQI3w3HB9)iSTh zm7lpUgm6s<!6GJGvR8b`FpB$&h4D@y|JccPGBcje4$QVgq)K*%+qCp-w;`EqqtdQK zEj6Aeqm`*9TlfsU)`Shsnb^T8^^T|+3!hW*tiRQ3Y;xoZW$i*7_Bdl#U7s*zDI9%z zU30kJ5;h>*c}<!XEE3G)XoZ8f$;GAoF-bU1&(KsQty(z{wC<?B`Ei~rXmSMEJ#^K~ z{iJRreyHEl#30LgV|PPb4;j!eZr%EC+;-eN<hIEo_k@>wm}bn7bj3=Xof#E@*<Q;N zhUMJ}9873|QME8uRTVnPl3H`ZLP%Z*qey`98cqZd1&)M=C*u7tv#ukLBEQY`!FyI1 zF%fP|r&=$Z5J^H1f{lD*G~r=*Oa<REtnntvutXWwbNYUOV6?bY;q1U?$(+AVqj^bb z+L?EJW-_GdMJ$9vuEgAgPmw<$=7}A{Z&8>OT+&k`1AMLD4k^^~0+Oo;o?V5{%4>k} zLS9I?xuqrtGB^5R`b{uQ1(V7?Eejh|zF7`JnS2$l3t<aPg5*|uq7PCb#)(X`0IZbk zlCa#VASBgJ_3M<RX|U-V(4yR9$)QYOZ%pn9ueOierdn0+sf+U4Wl{iX6DWfu^y4n3 z99d}601K^F)XjCaU+qZ%ZJjl)9Z*h4-3_Zl@Fw1hyLh%VryhJd${RkS)@`9!jvV(R zUrElE?|J5D&qI12RgcPh^I_vsgfgnCGTFs17Lz8!rM~~F>707>C8g@Ur_Kdn2VM4} zdg_`~rEKkeonWxaLL?{NcQLuipve84zJpN|((3oTLK8HahyDOuAG2pFP03Y?FN2+q zaX<~#_(>?Ly^d91WxCe0q-QoKX4p*hHM@?^zg(|Ja#`*)HVfMgV5-!=#?O;qYlT_V z@-Qjo5Dj);fU!<}WuYM%bsN|}mLQ4T7moQA_Njn2nDDjvUD95plp|B;7fEUzU&5$| zQ0-Ld4bb1I+O{Hy3MyQ~Zl`{-Z6X|E`^h7eD61ko<lSMPSwO@04-MDxI&I=3*~#YZ zvN@EyLmt_zFV&VfRh)eIBuxQhb5N_%42TO61a#PSP-#=)^RH;(aJU)|qu=Kb_({PO zBbQ!}aP*drq6qdS*u94D=;Wy$(ZeY>M}yg>($b$H@ODL@b}}F#yOc+nD1`8w+#sz^ zXbY;GvN=MYieG{Je)-5|ukTuz=T~)4NeV~bXWYC&GU-c-P5Tz-GmW9TniaXL+L7M` ztXbLSCSFu<)4T4nJ0b2e`J!5B^m4=anpWgC0%zo{lHKpAcE|@0=VZ5RJElnf@|VN| zq2eBHH~*<T3R)b(N~yFB_UhgQ@)V+Vyl@7jP7%{4x%gatpX;pikm7ttwpBt#EB7!t zlJ_qMBA$HZz$97}<r*XTp@^xHolK<wd5T_;jj9aj4j8`v*ckk+i|H@VvgI-!;j`rP zP>f^i1Hiv4)pszr7uDKq#$<)eg~f+RXfhJnp!xS;9S$dIxesN}QkatDk4~uLD)Y=K zWOA_!bj3y}t`+qyu+x{6s+jutN*9wJ-BJqc$o+7Za--qh5&Y&Gu+!0MHQ$0xR3`J~ zEs#1F=IiQy3_mvmqWzbtiU5NsLe;>hsEFKXGf%?4Lb_%02WH=n#mu)PVm?E<qlVkj z*A9qOvb)LXD)?$YH8tv{LSOVcEULwQbT6E-UI>w>FXQ)E3=fE@d|tMkiW1}1NODbV ziS{DQs!{v1ISw)#$rE;74`xSdSa{<axeh(v)E@mKP)9kUn6AO@ixrMKQ7*pBxa@{U z6+{RF2$ZCY1Lx{CNun9>kfwHAi=uB0GZT+PYL~?QS<%k$KzAl2UCS$51NwHFt$8*` zUX`OWMWI6>SQNg1DlkP=oz_$Izh$8PI&EP(GM;aVOpvU4U~?J&T8J5iJrA|okvy4` zmnlIwbrV*awI{k^u{aEbk#}GrIHJ+C2c4vsQA;b}FY1?Ek|FsL>MO`MufYF>iP~tG z>sBt;!}UtfNtz|?WyUDs%w-}9pjtO0E{hb<+~3r@6lbShr#cV?&M+4)nfh+PC_Q0{ zm$}{WTXBuZFQPfG%H^c$1(<sfiUMgRM3%Zu);N!}I!KpQOjgM6nbpwpx->he_}ohJ zxG3LPGbgt@oVJ0aM?Di@iA(3EmNGo^^I<`;&I0e+`OD&%g&&VJ*S`UCukc?frou9U z4bB&G1)<mOc~ry?tk$CO;y|S^?1E8}v*Kc@q`lKaYKc3NxLhv&4_MelFD@bV5$iuw zD2Uwf9|`eRc-RH^*~xYl-1zus?Y2>6P<j@(W*6xYR=4RX=Z@H>`d~4aA))-exL78g zaCs{fo8S*>zucklg(9r!X1nE48{sdYr-+BDBRUEXQ)HTU|LvO|V}{3!a&MSU4(B`{ z&N&(H@klOJ01nd{{s%2M!&>L^<C8qoP^~_CQ*zzJSNpx<N#5hZzhwHndI@}uHKCRA zx&7_;8DnYQ4cF;H-x_h$HGMWpnRO28Y-nSr^X*}5v@yRM^9e0ql~XInq)Mqj$ep;y z20Ba2pKOZ0ybTV7*g_Pd?$NA$LJ<<6)~;3csvU5fpNrfkmTu`}99y|f9-o(s<&(N? zTL3l83tUe8Y31`HvN@f;GhhBqPEEQ0y`|Tf?A=YYJYth}`7>rRBl$l!nQHlcvZ=>( zlxCLQ@uzKKCMXSbXaHWNE6sk`>M;75<DJ^#PW@YQIgC&eq<j7ROH$%eNZX#q@T<Xe z!|I~LyCZDK^NFy7rx%g-3-Pc@vMZ$(D%;%(>GbPma+(?9T#U=1x*4~j+yz@&NuAxJ zR6hw$-^yEba=VKJK1QIO0;V>8R+MX^ManUV|9g_xU&%)^udV#W7FMts>nFXIH<imf zp7+uIFEYe1yS&YkTVr1d8NmR*HSZ*KWh?|CntTF1wXh@QHi=XfP-7jF`-2uH2;4lU zu{wUZ6BSunxL-zjYTF+ERt@%v6y+@yf*h*j4lpZZtwd;$oduas*|uw4e(pIaG4fdf z+*AB&d6*Id72PTL)3>prJ}eK_T>tbMjQunewc-MPr8`Mx4w(fBGpP2esl_BheJxv~ z3^|2<+~YJSRw38u371-qE<vk{K@QPhk+5at2GFU4TMBatDxKIZ2E=l_`VdvXzgM=@ zlQ%~+D&}%Cc4B;e$xp)AG+jRtw+L`A_SWz<_+`M*BmrXlz#Z~BOss~Z!N|w(9U4I* zO!g_qNT0-1LB2%3fx7F+kjX|WgqklXL7E$ElX{E7d|D3_go<m~685F1sPq<Dx(Ta7 z0&?2J;BJSB*^=i2m>6Qh<kzrTZJj&%(O*BR9Mum(u=Kqd=d>)Qog1QDC;1j$_Zjc$ zTK`xBnD+2b9EVL<SXIJ&9f>c~&m^=mxeI-i>1ELSQq8b_7Sq+r`Xmn3=i>L|WwjA4 z>O(8-D2%FRn<@k>2=S-CM;3>Ah&zb=<JnBr4RX0)oC=v)8E(RoNtBC)G}s*`$Y$GU zKB_I|M2JQtm+MKm^lt!nPe@nv6~GJE{5nS)8fRakj0FEIrgjhIYd}eyBCmNX>tMg& zGP|&wT_U9-7f%5jlT;5=#f5QE<5hhH6Iz&H&24$~2jjL*HEwt417*QdGi(p%R<%kk zJ^x?6?dLN0g6Ne^@#sl=4PESdK62#qU~s-1TSFHJe&^W?h2%hD4PDiDaDZ8pl8CU1 zntJ$u%jIlQFXMd2%XCNlQ9ciRYocV1qIM`_pJ?W(r4JHl7wJW2(iF-*pkyrv<J<5` zn{E+$)jtT=V=iN{`A;eq8z-SOe$39FXH?^;YnoQ<g;-dxz+K@W=(E8XqOmRs%yQ{3 zL5q?PXeC_oI?A+YJ9*?oZ(;>dO<ldLRkXEMSZs2^$%yBbs1QNpNmz`>Fb28h^oUhS z(R`7AjV#=fcR`s_sz8yIbNyIsIw$hM$dEVxEo!^Mj_QUvlILqxPI(5f7EM2j74#lW z7a0kxPD#$7JFdbHno7Umq|tb}4BY<<*1;RcP(JiCr{H77sM4py-=Gs~M9R^xT2JV} zLy4kL9sZE4N;0S=%f*>;>OPrqMftP%+&xs=LR9?<wVX5P?x-r4%8gP`EkP44fjTXq zq%QFM_IaLkDvOf0mGL|j#V8dyQL|3D(WW*3M2U7A>N<T@j!pMNkY-@9|B8DU>Z}e1 z{r<bLGfA6x2raUO;$8B4n%M2BI$5I)74M-oo-DL1+yku#VU-6i@_fy7NNa~-TVRYk zvDuWz*Q&DrVn0_&8~adUkCC{bIT$K#VNydYW5iM$yV^#?FlRhYkGunk5nVIMMI1^k zU-y3kl$bNWlbF-}<Q+IUuWA+4y`fkmhHkR`ELj?{PH^)DA<G8X@K?~E6SkkMD$@RM zjb7xFXL)yHELc~|X*Xq_IT0UAvzCE5cmZ}z1;b4_bwm_p6;IFKHF{Yu6bIR_?@dHW z$jMcP$R>b0Uecf)qWNc=wzRw0h1x~SUd}>4RvF!%Z@S2dTmPUrn-tL=)5pPm;_<*F zSkVxw4-+_tR(8V12J+f&cGXdsT&T<llSI3r)JM#2&^0p^KGJ06x9ZF(&K<!=$+T_~ z;&&Fn9RYM(m=Fky=yfpSjxc0W%Oz?nCrjO=xlrdK4RA1p-1JagCvT+Mw-m#Cm>-4? zB-8y4k$IC`-v`6JGK*TV;EVDRf^5i1b$#UM8hAj)Gzq%84d9TO258=bmuoJyM)?wQ zo>*SgqPmQHSv7UL;J1pfy=FR{NSO#qk1_pT!8)w8%Wi)T(tkK%;S%DD7EghEKR;yy zUhJo{*ZPG!eYo{CZ*C6?Uw?1jlv7s`De_x;|C{pE``9IJam8F@#@*JHqFKM8=2+g> z5Vmql$#5kcJ_)r~u{1mf_lN?Z#jDk^Oww#>>`HWLO%gXv%~GIB>V~FDkg(X}A-V!T z?_j?2YfH>f`vnv!=ymQO^c9zPD1yVgU<Ym+G=`jB&r`}8xfnr2pPTK=oZm2OCjSeP zVIOlOa>?i7O!rU0Vjs1-4D}W$Zq0rWCZnkq@K|rOGuwvolZ$m5NplD3jtH<lNc#M> z@vK4K=H+=ga}rtE<=3UVh$0DFgM5TqBFYf6zE=5o+D+I$8dP2$f`{DZRI<1nJdJsy z@r@lpU#XL~$W3`FHCH1YZ3XH>s4R~LjV464-_bYhLEJS=w(W~K^_!@WSRgJ_yh)2! z$1iv-?_wC(AY0~W@eh=d6jf=_sPPbT7e!@B`ny#8TR(ZNBelE^U6&yNvRvM&`Y-(g zP?8O7K(!6zC#vEefH$0w=;Ur#u~rN1B6(cWORBzveKL-6Yx)tD>+4OXVr+b+i9*$J zYXTaQxov#TX$CswRgqEYq<4fZ$?4WN>!H9Bo~#@auwC-MfC?*9pptK<F>3Jon<|}2 zpQbK)wauJGN1%qDY$Ek;%W}xCS*ySSbTW~CSQXaYWp<Q6Xlj-D0nQxaws_e#YF$E> z%ICx<_I2=B+S(&F9;Ro@iEWrk@e5eJjnvct>Hh%5Zj%x(hS}}iLR!$eIMG8k_rN4O z3cy=7!6G+tE{*5!M4DPWt9td$4;63(ym0LexFE8#X-^3>Dz?>1aU3}sWW4$g?mCQj z@SPktSrq3<(F%$CA@9`lU(oIZA50i%iy^+9ayP>0M75#_I>AZO72R$ycIQ9a<cf{N zz^VxH=rJ#_qvr~QoK$pAIN9cFFiR|Q3h`R$2P8Y`2Gy~7o4Opwn7PnvGZ<mnxG3{5 zsSke=oEBv-T72fID0RY2(fp1a?uH7vSDvySD?B@u{y|x1$F|#KhJ&}bmJV96$Cr{z zo9=Ky??fXt4+GmK_zIWrx!hiaUoza~$3PYNpBnpLDfhlq1<sprN@3>8jAp}Ekl10( zY{ac{Z+}<-g4};7R#|maU0o0_qO6D@PWxX3>E0KQ!;(-G_1ApVLp5l@4z$+cDCZ5d zRv{5=SNSR{$)N>~pzx5N{~BJFgo+=c8(I{u>ju<l_8$sQg*z~v@SEZs7PX|{(z^QD z0??Ks&%#^I6PYL^MZ(;|thkYEqsN2<Mr@;r%Dx&cwVs3HfeFDA&(h@aaD(VVvNM!; zkOpO#Ll4aX;|CDsrS6X<m(c@1<4?@Q_R0^7Pm2^J__Cg*vw~;B)1tOVVO1yp0=$?_ zw^TAReO+Qa@@#c2xL|3}=L)&5_UzBeDQZcy*;uDFJ2!W=5adG2nN~-OlS!xZwIt&Q z@%h{D#OD*TEyOHs!o$<t4J*MpwU%T_(iOHI-RsXI#%F19I>Eg$5^mIOt`wOEVfeS8 zTgNq{8Cwe_ZFt)&?aU;vC;jA_L)LwYc{FLkJwYnnOovc8z^{{b%X~O#JA}i#48X@H z^%&|Ea9sk2i@#5mo0x1`ep&V4Ge_G(u*A$?l=WtPX(T3!DpQ&h>K*KMRZ}_#?5~-c z(l{#uO31e&w$r>hatVAZwe8Alk3Qj`#?4**lvv+c%Ft-cPpjcbj`Hz8qE&keb}PDL z?2~YX+f}oGvdywkD4%#{qU(8`XDk>l51+E0I2^FM$#hnD$E#BmW_Vx=I#kLY1{O3> zZlz?KRaF#qD%+H8=xbB+)xWubE;qy-hWzKzQ06DOxDVpyybY!j#^1uOkRXVPTAj3O zDH1Oj-U-3s+wy)MwUj`KM84C#Z4g@lOS{+^(!D5q*U=;kgR*y*{%gp-VmJT^f8!JQ zZXDDPwDX*KX-k;%M6ZWErxW<ahp28ZSH_=&%saMu^fh!apetL+sGj9!+l}aJq<9RD z%q+O*ufvteRVMYQU~YI&=v54J;RwC59yb0fRJP~!l3vJAx(ogQWuEABSKs#;a_JTy zdk|VTGTpM_bqKG6v^s*FnE!b$2d=QeqdkSd<P4f&C;VLbdCfC12jH70b2s|ABKH;% z5*(xq_D)d7$mZiT>3Q;qX2$;~%wC)R0jz&I7t7u~4?RY?U1YK(#;8fIQ=;zm2E{xr zjOYCCrR9>40j$50Pj80FN{9)=Rv#ykC##Xfny<n*r7cR=pa@#2KLLNiek{g_<G-h= zzy4k*kFy}pRu!uL6drb?QJ|vqPFNnO>sF?9lKJQ1Pw-D-ahSX3%b^X}8%Ok0Oc#yq zC91zGlP-cJl`Q@a10TUxpCxPRbfSxmD*B8%veNHKz5(+Z;7J<u<XsHujX=Jt(%hX^ zwo`58lo_dv!8DZ-o`JSKphn^J5^9qEGLh-!gZuvU5LlFi+@9H_Po(olt8RhG9UVQj z%aWIuuG%`rFB!VWZ<eE7Y<xCyP||IPi|TX9A*Y%ctH%&oX)E|SCawrOi<QjXL(Vz* z*R0x+uhQ*#cU^{{a~72{=IlA>x%s|mc~4695KIaagJLcvNKpr*rbQ?<)q&Ib+mpOg zV(Pm*Je;iAnzu0TeTK&L7=pH=&*kL$7PITEpJX`la*x}%G1UcL?jUyvioCH0sBJwo z-^L6<8~jHgWRLwNOd;*povw|19Gvlx_?MFZsE2whIe(bZTNxycXl4cZj0C%7nKI0Y z=5l}UFR~HbnQA~L*~s6A%61X0%H4C6-xq@4xX2Qz$OUT@tx@|qQdg}{PlXBeX7Z1K z^L{YzS7L9GuSP<}80>z%us1$<0Iez?e;qe^oP(tGF~djGcdtTNN2{YF$~PP1lg7Xs zXJ{-2FYyeefYyuT*Ii2vf0sSh%fd>Td6W@qb><%P$%uKiER=zDGCrNsF9n4nm}|WE z08|B)QKcT;s}*Qgj&BX~TO%<GR2Qk$9<%m!wBQuvsKhOyZKu(!|4$N7t7y3+k1vG$ zs1TA>hK@R>ni1|`s_jf`Xjlldj4<>Hh*aAx9y%9&px>BEbn%7J>T?AX4k{pxPr$8q z>Xw?5TL0rjj4HWwFgv~4bj2_Z`>xi{{0_?1W3RSyts4GBl8clU@EPQ(w;3N{C4uY@ z?%95qZqD6ZF}GX1J@SBpaIK!?c3a!&M{!+NJ(=>P$r=qm7H1A~Ta55;%C$&;h+PTg zGb_Zl78XOxcQB4T%E!J&td5{^m<a|jIv)Kzk_s!cXxbs_$pY!^iIV-pEWvUpoLP@O zZj^XL3U6xVOA_DyM<i+kS*m2brwe~6tWn<0QcT5U_m*y9MI963H^3~#mMXvMB<sJI zs58T;-Jz9;R3sr}P1}|nCL5Yz18k?MuYM;{*MBcj&ymwF>`E4|I?2W$eCA~mRT>m! zcY0m-*<fA=oYyLPx$S8*a51l3dl{s1S4Ia{7lH+x%-`@s?PXG_ro*9(3a=}ecEM1` z=2~(d3yc;pQ1?q93*gh^htC4ZrAyMl83Dti;FQN{)_$N|{m#=JDQ3ACwQP2+TTd-* zxBf9}mwXB@O4oc^)Veso*13$&fiNpSF){C2mt1@;IyY7_k8c$|1k1Cu<tYfaQoK{M z$G}8IPQ<+R>OJ#4-icdLwK;SlYM=`IHktx(%VAWI^z_1NC#mlxQ>Ee-nlx2BN}aNK za;Q$}gO{k(1&A272f0<C8*nFkMd&$?;biVUYrp3d$6@wD9Ruit4jOwXj6M^FBUBR0 zHmG!VYSbySx5NUd7xU%J5g0c7TmE0y1nJ#rox~0w!@U2qCw$^e#4a12`N{vYD|}k+ zo}1k73Xd%Y@hlS5e35{BAY{6VS!BuZ2r9toe)KvOP^N;{7tEO8fX`}<(G^uNsXwIT z<=QEeF7ZaV55-W8BK(Sunhf8HqG3anZG|Mo6m=Sp{g7FN`B7auc@)YT&2^+zFL~Oj zBhTa*>j=2+PMlbC|9b0Ko@R|c;^&MUoTQaG5;<6%>NTf`kIevD;8td5c@JfXjgh1{ zYT5*<h~SJj^!kIf>~N6kiOC<E9}kU{6p7S~`LNzY)(gyC@tvE@^Jf*qPM?uZ!y{q5 zO4o#(6C`-rZSrYRJ5U|wY)lFbIEPw4e>ti?w3+O}2;Q5Jx`cN2_6xjZhN#)_IaHrL zU~SP7$GgtLqR!$RfVtpUuzad|2Q)55&8=gx!5T9Zv@*(G7$ie^?>c-}nB0EuPoWVn zK=I>w&t=QV41NdBS~Mj4IReH`Rw+dBz->8cApc@qMKK<`Ls6su?ovoN3dhvUyH!Dw z14JL7%Q=!e^Wx}YxxvwhS^Z=NDGnZ@iU^m=@AJjhyRd}aP|^9pNOZ}BR_-f|PN}); zqjK_cewD-oe$op<3lrAv>zOj~;oJxxe)Z|p*^gT1O4e5;HiKRsAgPYe8m>w^?Tilm z94*O%4XPVVLYR-jj7|>{zO-BgQ{CCfeku`+auMtNywfYP+#W()jrv^1U0kq|iS6m7 zTNLGqx5mEwIefVPK1;?sHT1G2sCLvo?I@bmfE~4|2D(2w`AVH2WxFLTqI(eLU80xj zNqRzm7X|M}amjEFV=@Cib$3t*VY!`9hvMi6uf8|M9^!kHy4Db;vM2Piio{|PWjCZQ zqNPr_(M(zt{zsmTe!?C7_i&cWgnz-TS?*Ltz}Sq_wqND@4}!k|*5tnJB%eAChz*OT zk_sm^MWTPqa?GNycAK^WmF>xQZCV@kTy^eKIB`aW-siH^u~X{43nU-%nEIQ1T0QIz zs8IHG+=i}NnEn|_Hem5~2f0q!HpY2qe?uyYTP{C4QjO?f;@%^(Bg7xfVN`t0O@fcK zk-fU_1B$l4ewVO%E(|C6RUY<g4aD|=){aB~UQ84F0~h!FkW;ptfXs!MZqTfave`=U zTi=IAL^c^(3dnnbzkxPY`PB|6zX@&hG%Ab{z(|$=qZW~h=gB{*koL_bO6Ie?<%{y^ z6+p<HE^Myf>_Xoe3Bx!@-t%JtIbl34EQPo`SSnH|&O7{{^<z&ONY-QRP4~AmN6qDx zPc33jj;hf99sPI`#P4(bzv#yX6T{vQy(|t3r8mP=4`F-XBLz?Qo5stlCJ&g#?XOFw zRj-!Rur<|W%#)DRYC5P>@;0j0e)SzDT`9T+Eh?IDu`aj1lr;1@9t|X$`LSm31<V*U zozfSnqb4u%5plx+9~lV4d%ib++U~%4npL{eMU6*9&MP#+*mZF2E|=CyCb<p6Rc6cm znUBlLNMuCWe1vMp(Nr}~8ViZz^QLx)!fUcNT8MdwwjzDMZ~RS^kkz>}W&d@`y0)Nw zMTKuLo~#ZL3C%F&pgQq|BPxvpOx6yz^?V2DUHl)1ZI6K2%A~vD5rE76Q$K67mIdqQ zG5ZEmL9PAq)Zg8^7v3Dnje}`!|Djn}X8IHBYb*Y`3YvODIL~71vXdbwy`^0>l#=<l z{NpivbqIl+UXH!=?(<e=tV{S?)}^mK?_%k8aJ*V7oiJI?hKRvm?Ca1u?a;M#$8~Bg z#HlS#8JqQX-mcIjgVQ_eg7MkBxrH^KVE4|v30_(FZh9piZe*pttNN}X<!2(N#B@QE z?2327XjOFnV*@j91j6F!@H!^E?CtSWEP}a}vzL(~xA`sTlk~0NRX)xNWxPMWxHmN_ zmggvQ?NNV8<~l_u<#qBE=tpYPXYey~Pl(pzFl@m6U#*Z?(t%p}z!LHpR`%=A8j4jz zs>6c>9R`lwrDmHa%Q4n<3mV??DX}!HbN(h8JnfsKI23+D@ejW4nEo2V>L8Q0V1~X- z5el*DGQnL-xz2DnAt)bttbttHs!lQ7kc6+0z}hzcz<}Fa{FUvKb}|K9x^36OY4sRu zHva-+rsnoYM%g}Pb?|SK4CvSv^A4zlmsm|m8`9!TqWN1)P%U~zvCev*gMy{-gm_wV zKKrYn_Sk;x5GYD%3cKL*h<|qgUY9&&Dzoc1n*M=oX79gC>^JZe%&&|%{4eR!+%`I0 zRlN^CcoX}Ud03Y|Po0)fJPWCkQrc~4;Y;AdC^wm3ynw8YG7?Q3kmw?i+JQ-c+3{h8 zy9sC1m~#rs@oK`^AU(AP#p>+U*6L$0!J)=+)Zv&>lM_6nh^kgQ9`wMjY9;d<a-YOW z%w}@JXQ)yxVF^=(YOGBCLUkR|g2UVW*?COUiY%9G&KvM?%R{!?BpM!a<rh^>u+)S8 z78_ei9P&T8qS(bXC8fCHXQ*DKx&zYpeD46%MlA7N!L(7dtDlvk4Dps%=RRyFoS&D@ zsao~F8c7DGIS5{8o{d1Sb7quG4jWcdteuKrh2m1xcDU))`T)slg`06l#!%7+#~uNb z8j7AB42x#fNvl^ORH>!k;APr~r_@<2S1;}|3yX@C(HQ)K{*Zq(B%4+T6n|=qhh410 zBN<`-Oq2ICnLW<@vF?B?8fXeC;kqU?7!resPf6}+3WjBU4h-byL{igAk?<Ufg>iU6 zEtB-ob6>zoyvJ~!pBpV!N=PNX*qZZIX6eAtZhdpRWpObi90Mg}dVyH!p}B&M;~Aws zVJF&|ObS+oLP)p@Q-cVa|28V<g>6llGi~(W>Ge>o7l!wOFJjENANYl^-)SDNB#)tw zH-o<x3Ys=T5yxzRk(Pusd86vt*<nYjl9T|+VGxq&XXGoqNo@}Pd@sD-t6d^hbSK(S znD{OsHseR^xeUzPmEu@f)xi&VyE1c(3zcIIRTolg7iHWE(<*T#9^ieJc`|wk-*aXO z-awIT`4bckRAfe+>OKWv!jHVCI5hz+pCO}Ub#my^v>vAHRlbw%ZlTcVv<AU=5pD)E z)5N5Ra2nXR<P|XSi<e+<Xm@aEcW`L8esE}aaA<dMXm@aEcW`KTaA<dMXm@aEcW`KT zaA^0b!J*y3p<Q)YU~p)c45&_nL%U>fXjdK_+8rF)9UR&n9NN_k4(-+t4($#O?G6s@ z4i4=O4($#O?G6s@4i4=O4($#O?W&T|5Y6Dw?%>ew;Lt99Ma|&Q?vKAka&TyOaA<dM zX!rXs0U8|I9UR*I+x*Ai(C*;S?vK8=ZE$FJaA<dMXm@aEcW`KTaA<dMXm@aE_wRh^ e<KWQl;Lz^i(C*;S?%>ewkA`-E{kqNk!T$ms*E;h6 diff --git a/client/resources/hardnested_tables/bitflip_1_02e_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_02e_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..2ecb621b35216213e87ace8d2da09f65d36e9910 GIT binary patch literal 2012 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 Xq}$xb=WRVdmR6#T-uCY=FYo&wFg1+% literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_02e_states.bin.z b/client/resources/hardnested_tables/bitflip_1_02e_states.bin.z deleted file mode 100644 index 44fb65c0d6140c3c3d56721609a07fc07dc74799..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14873 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 diff --git a/client/resources/hardnested_tables/bitflip_1_032_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_032_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..083f1f0a58e4f2902e760bbeb89947f979a759e5 GIT binary patch literal 3614 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 MJ1za)*Z(g5e})KgDF6Tf literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_032_states.bin.z b/client/resources/hardnested_tables/bitflip_1_032_states.bin.z deleted file mode 100644 index a8350cc171f42916d6270422c612147e7e81a9d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27648 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 X%m@z~!GjY9;2X$)3@ok{uYCD8A??jj diff --git a/client/resources/hardnested_tables/bitflip_1_036_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_036_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..7fa414bd8b7405f400b7b4a1ef837582843f6607 GIT binary patch literal 1975 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_036_states.bin.z b/client/resources/hardnested_tables/bitflip_1_036_states.bin.z deleted file mode 100644 index c14426d0ba138f637ce6eca6c82e76a98b6087a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14397 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 GIsX?@ANphf diff --git a/client/resources/hardnested_tables/bitflip_1_038_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_038_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..15f739f1b73f21f7825dee226ce83821a7c83b31 GIT binary patch literal 1274 zcmYk4?@tqV0EgQ`D{U{7a<qJ1aH6Fua2a<-6XyIyolM&k(E~geB=<dhq3@c^sW=zf zt5@1<hY=M|;xE8esLghly{SJ)de=MLOOo-zEWT(L=GfwhGIY+cI9~3_=O1`Jd3>Lr z_?T!px`8^ny6+xm=s&ys_q;tFirpzIEi)JmW#bcLW3^=lLuh5T0`lJQf8eFm$Z@zC zKVXa?-)#BGW4*+kK)~^nsq27DqPv;A=fIX9)#J=aiDmT%CsVDcr*sC`{O$X0ji9BA zl#b6X-Tr>5;cDma+`tpl0IWZzmDuPGx^rWUnq99SjHS$^Un@7UnqFh&_c-H`N}|Rk z1nD+2ugZZEWCMy;=xi4bBuQiCnZq}I`?<@ebPi98LlgfB#XxqfFj#Gi@DApUQ<=?l zOj+!xh3G;^LSesC9l`1s9fRggh4ipV6QhmJL$jI2i8hlcwN)t_b9k0A75fH4eFIN- z6;In14)3tN7J_LQuqIrB%u+dt$ptg@dGp-Yjt9wp&&)#G+;*dI@tM-o^7fOpo8R3m z=axa?<%d7K+qUMjEUInyEno8$Yrr%@%YT`&KG{o;@^wIR+_5wu>&RAIBpc0~Cfa2S z!3(3$tFEe@h#9*2Tncc;GG#eUWg#7odI^GN@_^2?dgGy-28J>otB|t0Kop_(>9J`* z0vN?e0!BCCc@&TVpzyRb&fRS`+^>}G$_-h+*cjn@5q2^s-FI>~s?rZ_nf=duewiw% z(7}<Gwo%kJ`RvMz265ArZ!%6&lL<Qlc|PfR9?V*>R-${yuS$IITW)cU5Tq>D8SNC# z>MTrl+tCU5CAhgN)?*H~7xq{MiKU#gYg%GOK`k_wJJmuB);LdtbJdUEI4+%Ps{E(= zy81^CKXYsJp!0k@H1*qD(L2X7Ol}%<o|$_5QFP<%yNfRu8|BlkU0?j%Bk6x`0}IFO zqvr?jEd?K~y}YpVN$BCVxwk_->Y}^p0jtip7Pm%#&hrWLOq<&RnhJdvgRdRL(??M| z!sJ)^nA-)|-BckxO44VV!e8kxt8?cZvHWZk^UCwA`tjtlc_y=ar+Sy>ah}24s6%1d zgiC2OyKB{yEhq+1>+a=3Rro#US)xoGImp5~M$*VGJdYrsUeHo?8Y{_r8CV~V9|}hR zeZNZ0ASB|?>4{2x<zRs_lcb-82#rH5P?<-o^oThGBSwy;_gLyQM${Azmub@N#_(wz z#t4XDM2Aj57M}*XK+qzd&iGWfD{6nOwg-9KuLE3cpKq{@D)rr7q5^iPSCqYBA3>t7 zgxwmB;vAzeqReR-m;^#g(xjzq9%sOyrH5UVtrHs5F{Ms*h7%T~b0uz70R*IzjC>Mo zC4rnIq9qm#!i1%k=CMQW29oH)>J#=dRR^p>p_NQ-++8Wkf^LKtFgi)otPVE-Nps^c zp6qo27SNQ%?#2*Wlv!~_rT@;2`i3Hj0a0|Rg>f`Alr@I^QhTx4!|6nTZ|*#@l9>ya zTfs1Z5f|Z&mTEHF<qcl08br$q6IvD{u~wkK@(R%0dm*(>hzlA{C;ch~kiDS{J&dfM eHuhFPfl&cFXz>PRfaCqI&eT!7)p%{>Z0&yx&jaWH literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_038_states.bin.z b/client/resources/hardnested_tables/bitflip_1_038_states.bin.z deleted file mode 100644 index ec0b39af2915cf4ec6246ed0a1bfa5d0e5ac339e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15087 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 JZAH%S|1Th%Q?md7 diff --git a/client/resources/hardnested_tables/bitflip_1_03a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_03a_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..61ef022680304d5eff1863b388b5631e1da6bb29 GIT binary patch literal 2736 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 F>c2w&vupqW literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_03a_states.bin.z b/client/resources/hardnested_tables/bitflip_1_03a_states.bin.z deleted file mode 100644 index e301254b902d2d18ffd50a90b2116d892bf05835..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21014 zcmeHvdvsJ)ns0F#o9=P?M%$~j4=8Q45fMs7L|!@cLo*UJ^3W(D97hJD#83?pB81e& z?wMAbM~M(3A~|-aLkyUd2%#h)*>*P&NFXJKq)0+?G)bjMDwWfzN<GeF@9%ym0d<_Y zb8pXocNTTl%34$vRj2mZ``f?QcV24^wx_+*_whR)el@Mzk+`Guj{6=gocxE^x7}FL z^8Cl!vwjeGM~0s-zB%n5Cl!Z&k_<q2446?k)eUQE3SDlekuIe7&>Tv7Cn*4v;nhiL zJb0vRV<Z(WL_n>Ur44^pwN$QZ{1}UXzH|}a$QH$9m)}dCP_un+3#z*u`01~*Re?%1 zIRN2lCEnU{QqFBn+}(C0N*n|4^!J<$^e$XyxF(UB!cyH&T!VJwR_OC^QVsr`fw%mD zOf^hlBijgF1@|@yF2k#*6nJ7gAYkNJGa9MKo2t{DM%p0|15zJxg@Hjhm;-nDGt(IS zULX!3o$!wLxud#pgCjQ#HJZPVE)0??UtO({0^akmUW-MzH{hZYWN_zP*deH!A;}44 zQ^;d~u5&J^G2q=Ov>Ki+eMLAWGos`^u`mY4uKiGAEGp;9UEsbGCTQ|dxH^4Th-AfR z^AJ3w=N;2ekX7yoPj=|;--A~py)t=KAD0WUFbPQ^sUM#4(u=FshHdV&JrTvt%HRf= z#>-&ye)vNzIRVG<=sXE^7l`f!_jZ`hTOb6TLZ6Et3=7TV#4<?c2fIjx45d-NBL=Ak z<Ilawa%M+q4DQ)V6u9vv{F66>Tif9vcbqX2bcxx(JW_ys0SVxXhn&yB6rRKfL(ngD zNydcJ)_F_Ubjd5~L>DY<J@~3YWJR=s{b{auCL9fU@&;lI)-roF8+~{hcl)K<FF=V{ z(_ysb3`7`R*H6NNMWas|wiIyK8N4)T4U>LVG)4~VCL^UoD_R{A?hlgC4ETld2D2NZ zEkDsnGn|Ie9{??-e}75-g$FkO2o6kvnjY8?tmVt$E!YgB=gF${y=Hh0CuIhIBc1>$ zhSl;JEQdod>T~EMoumgpm7kX5%Cp=)c=|UU>jH<<C%K9n==+5Q3-)h}$V;F$8?W@s zxoS9NemkkzbuX~AoS9SiLg?tmkdn-O^{!%|6%I#`Rk&uudTt!3+AGbXHH&rcEMhNB zObZlL3NbY)1{DEejaN8d2x|fY=pJuYkW}u>f@)nl*+}{ccZJ-oknCvSTwrG+bQhTc zHXEP01Tw(Anm@?o9egZa_#5EXJ9sUh#!pK|+E$OZa(p{CE++ajOXC?513luIEJO_d z!>gC^lEvJ$i&Y%qrE&0kd`8OTL6GEGQF1_~FGZ;;Yp(ayK(hgNt0XGEqC5HKbP|9U z{4}bPlKPFuGC?b$o{BK!@@Z><ZP=~C#wk9i=mhseylolWmd7LmUJ8gyHp4g{32qkl zPAv`z&5#E2uUVCsPp;tf8J=p86a(&ng#oLx0(>y)gIA1fyPBdYUoz6sXNR$&ggeRc zpK7XjQm||S_gt8>pV4SecMlo0iQ7sEb@S=-4Ub`6&L@)4SSSJaX<19wp`aH!;N>nR zEm6pfIHwUhrcT!JIeTAa461<^IXXc0!v?@-`-x7x_YA+>vWi>)nZt@9%J6Nn^v&3& zw(-meBV7`+{t2I5Kq9HcPmec4w~c$hQ00o4u=OUKM9MB>;}9cM;JN3>{V^Dq1P7sv zq$YlA>CA?7!)X+CLkl@6sBK`KH)mZf9n%7LJq>x3N{sYF7TAxU;Pxn7WBDs=i^7r$ zI183bFl&$&MM1s=ZkfWDoAqY%<zuwPeBAyF_kS1{?UAuC`nohIX#D3B5m(Gw^$xrn zCIWM^T5i4(>=Kh@UeGPZ4A(#(?K56K>gae8TyuG^pd}1{l=<hg86l}8d8K?vk4W<M z0fpUg<)z!<hB6)q2~ikz-!k6DNeC>PKICG#^q^*VVD#<07JfoFslxA^$VWbL)9T%i z-s>%gSz_{Da{pXg@nW?T^q=g?^uSCpX(nXkGQZy9U$_3EcM0ThXPC?b?-$_mOfDh? zWX4;2a0t3nIG)0F;K_qr3JVTw49Q(EMV-bfAQ9~4J(2?b5P68#`Jh`+;mYY+?oMi9 zbO4B>XGq(qc97C3@W#@Df1Z)=UA&6*kdlbF2Z%z5=ecE&M;w_r(c;!*@YO)-er9(s zYqehfsL!7@+En3@POyCbTV8)waEe4TE66n1V^)xvKB0{K&vm>~m5mgR?;3eLHJfKK zDQ??zN~7=pRNuz)L3xBPZvZwVM6LSp_<#hpSOu><?%Tj)>n5+|@u6*9^%Fr*Wlu?p z`^)U#>KlXAObi@4@;zlbYy`FSMX*)zq8LkXx}ce*c=J<W)bOW#ur*#3C(e){CcOpC z<sgsqXSRggwNTVUj(ABTcNBCjF6=d&ap4T~fFmS_V1f^)<-wqE{G=v?<N??_HSBnj zYNXA;LKlK1gHW_h2moH0&CnF3r(_LIaom~AI(pp<2;V{;7Go!@H6p($a}_bzry(p! zuUB$U?<ZMCK^u@v6_>L`K7^a^T5nPXc)W?N36@72A*oj!6vCuim5kG(AsprjjBnNo zZUfm$>TGF_V1&2=J$1*(_V+S6!YM?m55yL#t|5(jd<CazWFqX2$`$;9wLr?pE+L5x zx{w@}4O?qKEGfj3p91UjT_E%r;bypjP|{OJcX2Td7K3W+Ugc@lNH9=QD=NVxm_&+M zYJ_<cWisB+<RJH4ABA-=aV=!%<aFVrm%*jdK{3PdMrlBY1rdn}BRlR33M}&Q16kx| zEG$tRmsGXRneJH3<oPPj-AKek*S*H)Xj&J7fG72~A+3n7P>4}e93_m&D<RKUG9aWU zBA$|t1_d}4iKMhk8U*6iK-v_shHPNJ7t(@IQA;Gv6^l9#KsWh`pW<bM?LkOo>#LfY zXl)EGgvCi}!G5v|s@kJX!hkV$IwZpmIHD=}f^M$L6#lf&?!Dh~qElW`FE}9oqUJjZ zY5BO4blpexJ!{BZ{{DyH^om)%5YwFHIIns@<03)?)oNklM4q#gPniuv8~9OG=re45 z<Vd)Ed;?j{uT^Kmt(}4zNYTTvg<#$BsIGGj<eKYn|Jn<&af~{?7ym*fUwKIR6lkxQ zw2`matr7^gkbYs14AR7I#dyRwnbNSZ7rG3qAAUIpYE^HK)U8G)CuX<dGOaHYgVAaH zlAxui)q906jbB6sU5?M-`PPHD>AwZLv2L8C!`Lv%Ni5A!o=#@=Xej}*yq@H-q#eQw zhhF7Ak5V!?7>q#~jIn&FBM2gY(1^u^QNvK`1Y9u7HR6O*aNAxe%>rK`oY%RK9D<9# z?()MKc=I+a_L3o3o_`fw9cpn|Ap#3x=_G4ANm3B3%*Y79avdsyv{g+VBz{sivfwvu zQsw(}VFzhvLe&BC6-#Qng+S|9O7_v}LK>Uj#~X{YSV0;ICTO&TNvCDQ&L_f$p)nTA zyobT{B~K{sgqwZ#rSJqVsh?2(TFt(+U;Ps7$t<RktSDUKCC0=nmBn(h9-4FEm;AsF zRq7~b{BBiLVB7<|8cNtm<*-=VPtaNyWOQ3c4ef_*0vvE_jabdNgoQ0(6E7in4swj= zbb?vrR7vrZm2G0b5b~2>bNd~9M}XuJ_(7M|a^EMABgu-NJ??Va0gUK5hvn_xlMD~+ z>2tLOpJi~j5aT=fjgYyBSG5tZno}RKO#>>>{KC)p=B#1lHtITf>r*~M(*#ur3zrC& z;wCDn<ryaCGZ)_(=(Za>=%BF6C}^ITw+vR-?3zVh-LP!s>!BItun-V^dMhKT{Gd+| zW;Fe#!RyQ37V{GADE{sNaaO_l8Y38#DoHz>rrQkndEzqK&co3F&GrhmCQ|drc#pge z^muC(hbq6zdk;)il7P0IYov-dr9kC1cS<W%IRLSv>x^ozfZ#}L9TZ#%yL8#_IUjBd zz){8XQ8kSku`*ds)|0%$5KprYl5HP@Ge&X3B}Yj*%RLN#;jX)&Oo8&rCJOmIU`cec z3<K$fy@G@~oq;Y|(IxfMV{xCm+`EnLb=_a??;-Pju(E}O)sm#@=93U}9JwAy0r*uD zXmPB)^w}sGQbj&79~@^>3+lk#2T7+9xV+FthQ$65@`t^!Bmj@Q?CDUj42G6C3K?DO zi44-RNIm-~Xo9><KP)f9QsTS?vZnI_KUT{ouPn`m{<H8b*crJN$DoxI_js1zG>0-x zc{2{~AW@0s?gQj^`Q!p(z<R`NV^&_z3>(go&!DZ4-qyqgQGZFW{P+p579)i@1Ka&1 zG?5I#=bEf5Um*b5^P$h{fU0vbnBam4C+i^0X$*4TBga5tu&+GV#B_DSN$!T66WR<7 zUnRe5gDALxGDvGA9WVlzH|Oz;xw@+<2Ftf%r5*}fce*zEYNyDmtpP{t!$BHtfW&ps zcxh13;baH6s|V%H{MO|lf2ui|omFXv5VnpSMGfSjhve|=SJWf|ZwwdLD2%!8t@gpL zpGC=IO+-<Y6=2m#8{E43Anajel*OP$j6M@2m-&uzH%rUq_alzjO0f3fF|uHvKYSU` z-S;-PeG0#r#P)1|;$oanQ@#1b9&vuce=`E>HpP{fbnzY19;TI8M8adX2%2*k?~Q!W zQ&VBRUmQOt!q&=xLwvCL8?>QH_lJd&`or9l^%DedzsAus>)7oL2JL{G+i-qNwjlB} zaq$VFf?1qLKJ$Y)jc@u}BO)@5@Wg%o;+^-11`&^k9F8aYbbsJ(KfL0Cje>r0s#C{l zwZcoH@4<(uP^Nm;`WnflUjR*XZQ<#>{mxZ<hRL200nIZ=8SZ2GQDJ3%3ePp@U1T4P zB49t;WQ3W-XvazMs392>!TNPg^W9wqX)EC)oC{F=LsjV3)+>jqj_q3$m;tlPkbvX! zdTv8VQ}l3J0Jl$gR<p&}Fqw~hVS-BYv1xp#+~pPW_pas%n-U}9D!$(MH+9c53B`<k zqzq=@b;31iwQPDZEK~$Z)T(ZV*M}>gele&Bw_;Tc!*X8bDGK|GwwQ&l$Kc^ewtn#M zELc+OdtDD`IiQR+t6tt&h_ssE{05wyV>Z>`Cq~Gz2nit@{Tz(p(FP~;@G<ic?wdOr z64Z&Li`=W)PE1@h;luN4QJr$oC|0r*Xbi7O&UbPAk*}@l`$3~(6}hovVN7z}RZpNf zeOt0$AX6nne}|}{%wDjUNn$QSpA}x(QwZsb5tHPXp}I{q<q=QU3ZmngZ>8s%K-*42 zvsOId$>Zl332M%Zk%S6Ay{LJBhu5a*($p1gxF#EYVYWJA)g?G!lttkk=@5k!A)C2; z@>!_gOtv*6R9Wk@Rzsw8xNskbN8iMaa|<qYc%~~{QJ&-$1h+?Bau09G0C2EyUCLaT z`Q-ZrFex7ntRQ7&<Q@)c_DpD;Z-C#u4S^H4y~pg_%@4fDE2o1npG$0P8!v(vys}0w zsIELN_dZ}%S}E^UvV#T`!sG3PE_)G6PO?hM;!w5~j(CM65fE#)Y6Z=>WvimznNpHm zYB(d%4DRP)paSNXfh!+w1o;Lar|5aDcKL8!8=gJKKj_yAMj>@2mLa%9gDJ53uUzi7 zbLSkK*~2K`pgYIRt<w{_#T=jmeS*fVV<^md#wemOdS&mm+;>wW(|PbOJ2hUSwByt{ z(;HDkfgnlZ9-XwuzM7v0yt=VCX4p%awM2KG4Q8*asvtZth;xD!<Z^pyl(uhp`SL2Y z%u5(l1_M%E!vz>KPtt5NV2*?J;;Z06B!RQazY`Ag77jfmYzkPHX~?{r8pv8c*`f(x z9DHWTWe{7)x{519h_Oaki$SxZH0;XFCw+#Ny8f(^Ei0-L2nez#(OutFW1{N86gYR~ zL~xwyKE?qGfOpOl{Kny7!#}6s!KZMdS-$^k2Hl7<4Z1cAy)SS-;J)8Qwo{dQ_}F$_ zA7dD){3t+62Wd4-7S%eJ$Yp<spJ@EilLZTP!EPfpyi`}bX;Y9!&>F6K|0gnq=%2%} zWskL!$}Q>Oz)3o7g{^_ua)zZteETAp!MDPxE|IBLj|t3!)xD7<wWtG?uPT5JM`IvC zr;By>i$I%6KoKfg-9=J)tk1jL<(>w9&J){^?*S@x&Sr`l5}d+e+(F}HF%ws^lu7zT zw-E`r&P(iokwI6s#OC{-TZ3|-M|`qZE|yu))B;^T*!2!6HRRx~0!S{)PTNmP`HWOg zO%Ijilt7WYRZ={#k*rc(vCZIW1Scn^iW$>vFRR`r=+*oxQ9R`EqCHI5z@Okd*to|a zC0N^5wu%?;Vms0R`O?Lx_-9QR6uM;G9aD@{BW3t-{gI`vG`w~2=s0993fzrj>*ij~ z79gjQGs(!N@@4Y(z@gdmK)~5{5CsxH6BJkvwr9Ak!G{4{)}hPC_Aq3Iq@+u*M1@Z^ z;fP_f%1-DOjv0G}Q6D^ORK23U%nCl)Hoq2PoL3COGd_xC#Gy*6!=SIi=+>K|HsCrk z1i389Yt~Yd2d;7YF!*%c0JG=AuDwLt4DZ5n511fy7>IV0P_uRG4tVQj*nt$KQ|Kp% zF0MNVhmh@9Kl`gD1PrQNf+Y25tRN9qo{5XOA-SFZtB2luACNil_SZ%Df-1e(4F4)# zRtkmxL@8XvlLI>vUGOjp8^V2aZNHzV-s&Z#uvGPDwri8&LP(OTdW@3d>?fn&!ka7p z-|;3nAC^Q9tunEu>~W=3*yr;K52W1!VeR>&kjEdNORKr0^E0h_riaKHt3FI##oywG z{cscbzpuk<FnK?u>PGk>!x|-1RBs}@hsg4J)DAb_f;{DB)K;Kit5EKQ=56E?2z3_7 zmCI)Hbu}kHE!;CwdEu;I8XsA5D`KpcM-52lk{{kMl2s`4!3!;L&QDZnG1sSy>Gy!V zAFOwQ$HedF$iaFyx2@xuWiYL}W-Svpu*OVveH0eX_140XW?Ssg5s+KsuD#%_z$+!J zG~7*bu@Lg3sUjf*#-SOooY4qO`3U4p$bV1B^ob`ByV41rARj>xHtK_q;E)>;f&a^} zbflT2s|#Y}4idI)cp=BIzkQj0+H;Ndi**uIPMyVq#KeW*P#C@2lpVH=$PN;he+q47 z16r~#4fgZ9`l!N`;@EEI1@a1itP~a6pGV|sRAw?`Oxh5Vy<9;J7{YBYLgv#Txqjwq zgVkR7Xi&^Ge9f+PsMxd3I?9TFoTo;G<zPRAAfHwQP!2#>;03aU@Pa|9i^PsV(o!~d zE}zUN;xTpxHx<X_AexF}BVMNw#ZfphtT<*M1~pM>`>LPC5S!T_WyulvBnTTQBe)2y zbs6}qPc*S<FWkn2CpoeQV}c(SAyU{kw$t=lOZQdD@v7u_RdT#4IbM|<uS$+rCC96h z<9}PpF#!EjFd8s3Zj_Wo#8k(5CZ3Xw&4m}n!L8kfFd{#WC*zyAsLx&#wp!*v!Fej@ zg6+HRGORmL#TTm0bU%4ZQ*t4<H?L<x)VhZ(?Bn5zr&x{)s@q%hprp`<Re+AF3m8XQ zU`Z4BGd~YR$;C*{D&0Gt9E}`kchoL}PHv3~lb)(!o(s^{@A{D2gPMC`4WmacSi2-x zVff>6br7ykg-4w5I~0E2f)iVz=?Ju50B<}4Y7e6vcV1*ovYK)*ViNZjn6b*h0E|2B zbB0dno&~Uw(N}cZVFxivjW<Fq$nMls6}4DRNCM{$6r3i&DYW{f!4&>a-KHO;4k{y> zrK~6!{};{jLk8}X^wIC~uwh>RW<JckhkMi539z73?tAdL)hxhj%ezfJnSzw#Ao4m> z`ptlt8}3rQbKyXh=9)#GFPGdckm)4<M!x*(R>R->PHU{+!TdSLwOshSZ`6Zd9)L>J z$BAW20UQ~TF84!0VB*$92!rKK7^J5pkXPY%zI9pKcz)?VfBqjkQ)81&>C(2cAcd14 zXh)-ZwHu<ECx(hwfRl|N3FN0w^OyW^{s0+@CcVPYGJJ=sLJ0lcgFbX_H@(SaLyVaI zOB&E*?p*go#h3WpE=`F*Yd@T0DQe1<Q?+b4KE!tDJhi00GbRi`ekCyIATR%dyQEB< zb9zeP&^i{&g=AExI+mD@eC-$HYxnuS7mQp(Baiay=ehm^6{nG+*re#jt;6c^Cc_gm zwMiRllVRa!;Jyw{M`#U&e;G`${I~^lHII7&k-;EHvgyHwhLi*Rn7%&QKiZK7LY=2t zFje^0oiGrUU*qZf`HCKh`Q2aKaKUtl@jC=dr*OR&9yLX?3_gZ=kW7xjz`_NbWR@Ws zm*NuAs;y?CruH59Li?j9AT)Rv`khaDlBYbyPe#N(0aIX0+`JAo0>6LXhR@Z?jSYib zOA*{LIM0&(4|ob_HD<$Hx}bWu0}g6F*`o<LEN4LT7i%8(sV=o`fLO&`FOZlKS>ls@ z>=NY6-k`;p*86}g7jz%G7gYpEM3*F{l?+f(oX!1_Kdk}X*o~<!CdAn8ikP<$Y9e~> z%Ww(ReGfd1u_n{?9ptHt!G4;%4iIM)d0a&|jW8LtYv>e)%oTT8xGamNEHhT;8SZt) z4puOh8qJZ`L3eoi$;d?`rPL6o==MYy`q0}NhYrs}ouGtZ4hY?19oVP9*m~|vgnIa6 zNOq}x3sraqO|fs{H#HG*Ff3*=sW(y<fG+~lvU<-UDCj$y$lVo=qf!Nf=9467kdII@ zh6P=;>?DK?*I}w@dbVGxR;>Xj1N%QQSf;zq8_!LKdpLa>#$69^1Or`{(-}YBxmEb# zBBGmq8vO`*#V|EFu@$H8!^im#86T~B+rd?(Igf&PAyRuzhVNaO)}KB5c+5E~eL%07 zLO{)R{c(T*2{PprP~HASqSrxVQCBrQo96e77ykAc9bscaD2$JM+kGRV<fe}``lU*W zhwQssKc~TZ>eieOA?>|@%pL<G?HMo|DpS>x2A8PuySbuWS<`mo92qiy)yQL0o`LH9 zPGM;UC+{;Ta$WfzizOs9kX@)iPQy5kfGLmbJaBV1`VZo$H(}g3{4N@|fn?@ehROlw zt2$Va#xbwNnnVV99f}|}PP^E<a3%PMr{7LN#3>yMs1b1yUpf=x0A&G6*8F43wg1J4 zV{FmJp#^-Q(H~|`@sq`HEF>zJ9gtJFD=g=|{{$q8Vh|RF>}NSCBm1Gc0b<~B%ge{D zNV^(u{IA3t$LylviI)GhnG{Td$6(w>p1Pmw4$$J{Ku8`-PUVw<>}%uD0FOS)C<fMc zapJ;)VzoTaT?$kz9|;Lz8~|gZxdBM}?!Nh->z5V=Pq3%w!T1ea+!+_M)Yx?JW(p|9 zr(inLYS9|t!H>B|6HSZ!IEfR}n&;@mFm&uq*K-=GqPWeUB()*3Ic5At{$?omUQF+; z<-Va~TNe5bpuZy&=Ju;8ZS~R!sQG7Akt^$0_ZkHr-wq;%Y@%ZdgR)3CQ*q_BtDdl5 zY!4de)ktwGZB}!WBP~mC=RE2WD#4Ww+pGBRqeej*s4}Tpl?jc-ujpuKJXnZ%%rMEP z2)RPp(HQh*ltYD4rIPi7o^zU@)2-o>UML*dLgMoG2ZdpL(k-vtSkoN26!rU~GsWZ+ zg5D3Zi!4)1{X*?q;gC=qA{G6vib%={K$FW)mb``LN%KKSI}48-!Wc+1X*wgid%kUX zYiTfcHlUa~JH4kXUH1wsuY51aVaaq6>dzo@n*^>KG0r(CM>YSY0CYoA8ho+DQ0|6I z(dc~@J*k7H0De=yTpbllBTx~dosioJ32MO-c<rO%3cI39%B?3~kTD8`pCLMZo7}EW zc<7u59^j_i5mfyPFw;XP%z$exL*y~0S4Uh6Oe5jPBSwP2=o7qIYz6u_3g#)dDsX-S zRQ<_JtIU0hci?kmk+<5kz{f?x91}cVGw+xIZBX@$YQF4Qr~iec4Q?xfp!qib&Dhe` zsCYnuTM;jQKT6|H?Euwg!(B%(RXIp^H9&baynHw=G2-s_7b&1K(+A&t6qJWYeDD!W ziHH(0rK~EQq<dKS#W1SO!P0qfHlKS6^P1?qGS-g}%&wCOQ={Y%*f7A6a~Qmsuroa< z?^`gg0-!nW{ch%Wq*5OY2}vhl!vPw%Zn|LR=q8twYPgVZ)V>dTFD8bfW>t?9oD@7t z?}SP}S(^$^`xDMY!VjV9`yC&uW;@JDU#J(hyTI7?EK#J(8-kf;c_|_m;Le_~X)q*5 zG3hYI^2-RUVShx0n_De|0w1e}p)H8tdBq6dQvcu!N7pg0x}?w8+`E2Kaot#u#~xgo z%RTC>I#p=<mL*2R<b4>eVf>8bExVaj8C8#6Gy^>th(I_QCj+{yGv^ZD4j7NnL+W+0 zm`bwEuwMqa+=Ho85pJFSW}BKfvu*&^j%4Kh^)a5Dh4y#lomHiOv-^FrQ*MAsKSB%o zp`riK`+k{ae;oFn1q?}ly&rFC9kd7FI2rXz6XUn!T($|bxl)2dIJ_NO;$R3ka919i z&V{Kvtu$O)l5?AwsN#=tB<59KBTc*L&s2i2M5>tnnoISg+K$()C1R~s$ZH#!dw^7y zZ@dyu%{p#90l7Otoi!gp7lVO^#rj=zF1JpHL)APy7^}LiB=oqS9EX3xU;$?ScY$@% zh#zssL(Q-q^L)yyyJOi}6SVa}xMC-Ge+SmJ#&a-6qst7}5qN|*LsArq+RQq-=~Gqm z#{Z&L+W22t$o*`#-lf!HI-xt^e1tq%kkv&ma!9M6fy+5w$nt8+s}lD!Qe%dl?t705 z^O3&oh6x@sz}gAFkC00-@jUI01CK9qw1hHUkefauwTEp!KPOyBG=1qZT2M!dy^uGR zKF-So)pHoiBL$^8WLJN#g;#gLbMN6*IJXRDMT~I8E2_KAZNUA0$&JA%olQ&S6+_Uf zm1rKn=hfUJ%~-0CN^GzT7?PVDr27?2bMx@S3apBm*(0|ul<GnoBu5{AOebeyE6nPm zM<87W=YA{;lSWL5T#z<I#VoxZsplaa7h0F<=nob3!83I@cU>;REB+GppYvKNwqLZ$ z`@GhOEf>0CQz{^!z%#lsSy&6bA*>v5CJR)5nTz!C^B~q@J!*46h@s8OT2`8*M?X)h z-DD}72sg|`AKk;9uK?}yw3U_fxiwH*2=h<V#VlKwgGXF^wV!^dikgI`5oWeVvV$Sl zJ)~;esJm~1scC#rcXc=0W^j4G5mRN^2GdS-Vl8}h9wW#2%4DEkG|Lh!_klMCtp{<R zxSX^evbU%u-mvE^EbtSPQ<;Zl@K=0uSUe@GG7>70v|{H6HXy`F1KGNcPu}$T6_YVC z?X!XgxR&tjELACg;;XO?w-a6RT<%4P+(G=ddqkD(g<dn+_%KZDRD}lm5Zvi;iG#b_ zIHplov6XIVFbOTRIwfd~@>@SaijQGNm+>Yuja$>cNAH?+$#G$WG5TYk6V&SO_mU-W zYZ^xz{ypRRJ;h-gaR^(Tc8b|70kgMmsD>Mw%#gO}HKE&NyWBg#66SILB_kzEx5bQ- zju<@m4)|}nO+a#&)E#$@c=JU%i8R=<B8C;I!gX)}&DfOym;6E+Slhsr1x*d~cL=^0 zU0(2icLsjj0=tdC0JNmDYZaljIj#@8^1+Bvor=knsaXL`kz``jWo{52=ffF<q<lP6 z%b!(pO^n=qBY5s6U79^4q>o>HB0RnQ*Aq07)<?aNc?gnXf=~D+I<btqJM@VmG3yjW zvV$=Uw`~CB?LmbJ!4aZkv0R$U=Q@}$0lxo1D$6lcvARj(CU3<QH1bw~CG#GriP7OS z4rUWJ3b3e+zX00>xM7G~J18xMfUc+f7^}i|Ms>p>C>a~_HtHBfaYjdP`Uf^Um&=Pu z`>I+D*P+u~GUSSjdrY6Xs)44J6YQ8^YT3}=ne7!Oa!c40PdOf;=e$@5cf-#hjA=$h z1p?++F=cDRE0lqo19sPJg@fJnaAI#*bA~H0^V1k!c<oNQniXiCd{Wa~MnldipdKw9 z|7y)tDf<}Zjh-OGHTT8QGhv_Ij_f0V?&{iZTFi5O@;>fKhrLyNeJKx53BAUT=yI*M zBLebVQvHmYvtH1keOn>VqmIfmvDjVez4fpRu=Ar!sUD74c(=j&ypJzJBH33cFT+Sa zc@Z04{M63)vR0vT7~(aN&5->sxXj?jCP@1P0)2838}^^=d61K?A__@hSQ2q3#ou?D z9AG=flBHHC8wdXkz7saOwtAfr+_-i1+!?Uw9!Ra{dpyG2zKVx1*LP@Z9I6b#V*;%Z z)?PUA2^4uCB$OJl%$mx@Cdd6&5U9Y;#C`)?3-DS6G&-b}cthcSDBggMcUGA=kdbAA zJaINyk!c&`eB6Fukj{b0L01ju7u5_quhlTOlJ+c?3qE-|X|BU*Zf_z<$AM-cc^^IR zIkxB{<1dH-(-YMl!c&_s`7s8L2waXDz7M0A)KAh!efE+DceBZOMTbK{C?LGii~>-C zNEG>(Q)pC|x7L7lJ#(S4t4n6Liri>)F-&C4Sle!5x>SCDlrlQGnPLdC8WvsTZZp{! z1o=IVSx8fJiHrSVA<#m~@RKqPtke>Gu+cYJSf!e&>;yGwD^%q0*g;)-)M+Y)QBH$f zVcC%UV+=Yrk$w`8n<Rv-BZqY@$E;*kSXy2$Xu4oRo{$@aP5;=x&6@BDB=6_BgxGXI z36sljZf0^nV%RTX9OBuPU-O-$Ub!{w#O$!$80lEKoG>c70_a{JB7b7m`MvU%S2|C| zq|>zA$UQ)IMy!`%-EorC2JaYwLTJJwA_>obhsCc^J+mS7WvSxQmq`()`x~@z3byQq znd$o?WYrCrTEE^5F`5~p)jb$i^IX87*f5_j#v!!vdW2Y4BtnaC_oH(z_p1os>Q{+{ zGZ)I(Q}G@97@IH-d5xrM&3=}csoh^#HHfTVF{Ff)pRWE!OX-BnAns#_|HkGOd7++x zb3wOZUAx2U$(7oD)AQ4)D!<IUJ@~vVXYcY7S;FqL5zX+Z0{JU3%1{u!teaSdu7mNE zm-cT7W05O`HDOPe_uF-kJgJr>-_Nl3<?H5^2ltpk_d{?Bi_~!CyXap<pd~)W@-A3W zV;H|zu&yu*-wZzn45c>bT^1~<;*%u*9MuUmtDcg{U0w%XMJY}(vOR>+`7-D-<HOV7 zH<(W`M>~#lE{a`$;_!}!1XWOPh2^Koq{Q8~{H(aa`ZTuS+4Ag&KMD)duC(ASN_p1- z@sMBIS&0<(Ij*}0)-0Wcu|Tz3E->l~#AIwXVFm_bM7%W9V}`Q9PtB$arM*Goc{Psl zHoXnc+-?*PfZF~LcQ@PCl7X;u05ZL#yPSMD7ktfx;}2_V#nfjTci~ngDcEsw0SwV+ zuYdyMea48kJ3ywuDlRTFvN1u+U6bJwbEOOy?umTH&rz5j4sN?|kz8x%Rx<Ty9*UrY zo<tpD0V&ndr+QX*9=og(W@fQPgW!?sRq2^d5a?QL^bC`8*cC}5;`Fe$Ooav5Ye_Fe zt!!)+BGeNNBp8M#3)I)VJc3;@7|xCv8GT%jJP-zTNgZUK0DG3<uI4i}49~;4W_tK0 zm|X|0W67-a`9AUyxH-K>&v9V@jFB?K6^Ft&{DK!Z3*$4*x;Bj3Z~q<!ME}7I>7hKB za1QLM^EWa0DH&<lX(9NgFQItOr3D@2cBs?=nHSclhvUqDu+z$_;fG&i|AX%i$T7Qh z-}#u3r*QCRJn8Zjh<2DAA{`K@Nl5L}W6IvC)qav3gooS7E32eKZDlMhI<2t0mtG8$ z<O&EjC+n9>h-Jf@#3{n!btgGaq4VUZ>K_cG49_YPNmw+Y#3+e)qTfVzM^5FFU-1KB zan$DsM4c6XAU??54!;VM5))$$vz9L*>k#ZE?FWoSelM-dbV$0xLqri&NAzg=_*ey^ z>hE|IPyIGehcuu)FNa)Le(*eA^19ZBxy$SNk+&t_FqQ3rl(As}>1Essn~k%O7p0eQ zeF&GJaYZ^ju@!<0<9DeJ7J|frn5}TvuPS%8!g_2t#cm+<1y+9DOBC0a9vNFW(ju~= zUyI=+l_uq`=DA0^u#?(+yQG<|FG=H}&jYX3ATVF4JmC`RtPy^R%M4=CJ<G@iK=o!i zHm2}20_TFMJs9GBnvTz{-m40+SgZvhnMQxe$YE^Km<CCOfIVF&0D=F)0GZz+9QC<G zQq22BpP)ZoUz0k^^UfZ!B$uz54^!EI-7l?)-~w^)G?IO=%6-fbSMF_Fh><0FbVGDH zHjX=%SgV`(M#BAic0H*U4YHS$A<!S*!>hgIv3gq0Q@ps(=MrAD*K}0Ec5HxF{!t?< zg$}a?x}smYs3BkS9f2P;V@0_caCan~n8X}8?h4X{UD$IvqYs%&E@HB})S3t;IiJH8 z===S!t^-O9z9=38w`13H<l;7lXwghIV%YXz2#^J)BLgXbk;C~uh&y1;&jG`dwM}r) zXTuk7z)Sm;PceQl(oK~TpgY$to`oPK=GqGGdoZCFi`B!KSQixQ*3TQ_!ZK1(3~~Tr zl37awC{J7%2A^baTwb8L`;A7?s5Pv)sN0PkV{V5XZvN8yM#|&5gmdOP_$QQXO!rAL zRe#HGz3`kL@{)#)8#<(>E<XvaJJ7nZVN=!XDs-uDd|iZ(qfmH=+l<RfA*kg4s1!;e zafvjvp4FPd#_PT7e{fBm{3%an{yISnG>dBOE-)@m_X|_@W`FW6ym{~6fH#W@!Pvmt zO{~crj=cSOi$Z2x`-`~b9aGPga7LdRjKIZMMstUl%k^eODP~0hM90|e=8g+V7ob)b z7ckn2?Ds497&1>Ix%DElbed4;eB7#gFf6apSN^~CXI3z&+9#;O7zqwn@Ialj60TME zkaIUwb&=n^f0=%^b$N<fA(JGn!k&*y@D3`>3Or&q3oOUhC{uR88w;rNs<mG69$8C` z*cL#ZLTuHZjmP=&kxurT_QOB~m6<A(7k5BSl$aW@BtN8!2Q=9D!wv1+S;ZT&ptZ~9 zc2u+}7Xso%j15e@rp^sF>tqi@kYARLa)2AWH|fibFx>*TL6w^coqhDupg1VtK|dWd z6~|k3xCNz!cfU~_Ck-o(0%Fjuh)R`p*H)srLZ<bJXys<1pc#aET!c?0qMmJodk~$b zfd3M##+w?T;y4o*Au5i-79%+8d$$W$CC96h<5kHK*Zx(>@v7u_RdT#4IbM|<r>OrO zB}d4xt0~;`C%=$Y29=?r0r)xZ5r>Ws#O2%lNQ8#v$9Nd!$5wg!9{i_9|HxT~PX3*{ z>`rTs6kyNS(=7QsK|v{5nPx@*ZlrhgU;Ah-Q-aL{x)AB6E+(6*i{E{gd-roe{LL~q zbd}R@ZpSb?s*Q~y6o2gXP>`JD@{8n=2+8!){1B>wC-{#6yS{~57{~(Wr<!fU<t{Ya zDzx30_avt$1zp&O0!k6b+f_A?-<6@!g0V)rx{E~deipwTK$%Y7q80Rk*>dX8;S=x) zJ3V+afO=Yonnfeb)X4h=ja${E2Gp;xw=`jb=?9&1k`c{PcMwFH|G8!v1Uj8hU-BIu zHq7hiePnnR4APE18y|D~5pF9v{ks5$Z`R#~9vnC{E8bwkl-;<Ts8h;pr|Ezywl|R` zb#yj6c9vszP$T(v2+7_pq!gU5$%q96I-yzCCw`+IOkBdeKGF}PpFd`}N2E(6J4=O^ zhg1nw1;dF(rGfW0F;gJck^k29z+BgzH_}QGLlS$*f~t)n$ONyaLRPAo+e>PoctDIn z7k2il(@H~0v!P@eD{>1j1kf@pKyJAm+wPrH2!7ZvhoA@ck467Q)*wAZ4rlJaCTR$c z;LQ=h`yx08NFDhfSI+hMJNGHl#TcEHeiMb&;5yF~OdcfP8X|0|&N|u%8oL21>!PVn z4R?kLyLjW*z1P=wVed6e3pp(tn*P0tBk{XPn8<$lO>BW4ZRsX85^9s=AYiid2O9m? zcuG0mKa5Sp`;2^cipw4)OqPA?h7%=3jQHC<X|t?<ZPQ?ZV}MOU72dng$Z^BTu(I&# z9Vh;q-f?1havsN<i@p3Vs&MG1!3vfF@1e<yoETsH?2f4YQp|da4se1i^bCVPmkZlC zpK)bYTTZ@ENzV7Kkz-k^?vZovS_?X4D%gt+?IbfaoEXNeV{Pj!5{={CNB+hc?NWrd zO<{cavFYH5DETi<aE%8h7nAz)zvWpXuWllTRq5;7JS6I}>aDI5);ic1v7|xby|SiB zmlJ#5zdmzIf0rE&l^9>`k3d&HSo2K#cjWOltmcQ%d3;y3>u?Trq}RCTT};Zu-_J9Y VOPKcg`bH05zQz;QZ9iQ6zX4&>fENG& diff --git a/client/resources/hardnested_tables/bitflip_1_03e_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_03e_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..7dd251575056ef45d9a285da96701d14f2424500 GIT binary patch literal 1515 zcma)wTTD|206@zSm~dxtrKL3lM4+|w26}HbfrLj;2SRT^tkB-20s3@?4=HSksD&X| zEbTyS3p7EAIv><d+cJ}q2&VJ_ZEsXE9WFDjQXU;c6hsipW82?8cfQU!hra$M6UsxW z9F+fK&KEdXxxM+DCe##il}P-G7=jCl#zlX&I}eB3J&ucx#+AK@@&Vhp|5Ei&9Qb$q zABnkgBl`CEfm4?bvN#8`^S^g>KHSsz-BIl}c4_UkL4L})2ye_|>lAxVeniImELzht zzM#dG<nHKQ&iE)Auko$N$0a<IbRp;QVQ(7yr+h0si$&5sByp?dNiR8Ji;?Sqf!UL| zh6nGx$bLGx{zqUd{n%q@zQer9{ZI*SMS0E|oXtQkeW66wsd=FnP39&g5c-}kEkR4e zwC04G4S(xoaAHjK>dx!zr+2+Mr5h6~alvcT+tn`{Rxdgg4SDN*Nxe@%QETj6*0sYQ zfGp#%Ot+js2vqK0so)Nsn+R0g>EFiB^ga62J+_GrFj(rstpZH8&VH?Ln8>XTWCQZV z=Gf#_Bjfjt;niUJt$KOMGkJldVtINrz<*5KZk@sR2d~Y(g>pjFIdxZpn(27eqUhyQ z-Q4Mi!xJr^K$!KX{6VPg;znena#b_UG}~vO&M6C!*Cw*B5#@i`(|`7?4rI}iKW6uo zi0>B{Z6r9bk2MY9QP0k%Oveq<HFRk{vzNB(*ouJZp1)B+j7Q^V(rMHJ;#%3LEk1II zX5vQ>0~M_#gnMJd1u0b>f;n318fTmzXBr4cp>C5yyxvOX-{&nyJx3md`igRdT}9ot z!gu&G*5wLAmC30IQ^Xradi6!M!?sTM`^ul>s`--3+XsVq@!I&gU#7UtT0eo1=%U%6 zT>3`$+eVh>94R)ae8*ilkFGsE;X%1$s+9y;M}7KEc$gDGP29wrmpgph=8q3-(|yo; z-ez^60YA4jx|wjjPgn6Fi8fp2d=IhgzV%nZ%E0nj&C8*1es9ea)Sfe*TgZ-i>}31Y zD%_hAqq1ep%>MF03Y#d9A3`=y|9TSYXmVhF0_;yivk0Mj{hMA?rczsHK{Mu0#Y7!> zzTQW1dQjB9O9DZ~lv)V02oxN(QsXWzt(9m}<{)>Q1BJUHy&h4gJ$cfT9X+HA(DrTm z7vKT>@#$KGXPt#s<E*o>z@rSfPLGt(v{?}fE+`Y%6Lbz#qM;U-b7>cN1z;L)@X`{} zkwo_<xn*bKLv1aitvi<P09LoXS?R8?$|kaRI0ax-vYt|&j|%Yh3l#_-@p~S%I3?Vv zZ2z<2opUm>EtAhzk#CNdpFu2kz{ec($5~K`LZBwQ>L{%dR~j;p-^wK(*L}EESm2*L zVYstpG?e~OScu<htd$aVQV_Yz7hpP1$|wnEr!(4RJ>H#7ZMMsSn8P+Ln-anaE>4$F zi-cpy5dp-G6q5FPKnc%F)OD39bsCsyVOnP?3Rry`B#T{TY91z35WsSnf|RzEbAa1r zLN{>4o=A3sN5(k7QHKkV=%s9s$03o$?k*7l)a+ECLZR45b_k?oFM}c$+d+Upf_QGd zCa=keVO|nqmWn_rPg>Vji(#pQUNs~Zdl}Rs^TmuBpJ_zs@TT&5%vD~n2XVnt*uwN^ zU9guTQ5#{{S%vAeBaShX2SVB5BBBCPfo6Ds0DJdhpj)rVs8dV2j$<0K(ZyoH911G# zLbRAP9Fp{SjAFC8$Jx@~sR7O60lJ>MySUKfq!JjP-_)KYqhND8{}z_)9<f?%Y7t0w zuwZI_7$menr5aFBdpjyrE4$jtpsVOQ32YRnU5C{DXtFs|`RxhM!+jPcA}uZTd1f_W zy)m0{-P;`nkO#XXc@CbFgr0Eg7(f>#Rc%77zBp!kW^alj#%e;C_W&x>;7Vemopzj` bSeH5j2%rnRDpJB$+EiQ3^}T~f&+qvg==-~f literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_03e_states.bin.z b/client/resources/hardnested_tables/bitflip_1_03e_states.bin.z deleted file mode 100644 index 9e5c059f567dde9131f9c3027ee925b4b1317ddd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10863 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 diff --git a/client/resources/hardnested_tables/bitflip_1_040_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_040_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..87d8693df1453a2c5d4ad7917b0252b1228fc130 GIT binary patch literal 415 zcmV;Q0bu?@T4*^jL0KkKSrY>VjQ{`uTtU$Q5C8xGkN_1x06+)`zybU@P@w<-2mk;k zr9=UsDJdzFBhkJj5>Nb)Njk|DRCP%wVM!)ZNveQVsU*@sNzy?i=P4xAl4?mcNhYL| zAQ>g1StYbfB(W@#(pX7s2^F$SB(g-Ox^<-DnKVkB0KpQ#d8(4)N-ki1q_mG*lO{}> znocUN$udsKJgO_oOo?_0IFJuX1e4l9B*_Gm`5=;FK_tLQ&calH;wqIAxss_Rpou|= zP?da1l9Dha#F<f8Nrae_>52-;GMdSn562J%$Y$aOhyZ{900e*lssKPn01fVxP#_ur zAQ}J@QmAOjpeZR+Pf&iN+7PO_B%KK)$t2Q%jFMQ8DS3z_w32d3G?HYJX(YfcNs?(M zq|#)WOrWKtu_RoLEVS8Byg<UG%!;@NfTt9x^n?7SQzzurrkJ>cr81o<;wte>sdN<L zlpMqoT|^REAd>qKl46xfFcj!efMlvwBZ^fd$V5XFN>%MlqN4(srbSp&3SyrH+>uTc JBn46Y{s4xXro{jN literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_040_states.bin.z b/client/resources/hardnested_tables/bitflip_1_040_states.bin.z deleted file mode 100644 index d3f655b0414dcb31d9c59c1909c9d628065cb463..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9771 zcmeHNU1(fI6uu$oVih7(sc$R31St~rr3kV2MG=1>h!1@b+=}|V`XJ4cG?NFhXu;xd zltLDi(idfYi;$lQ*5XfF7F!`=%--0)ZAsHfvT3KgvoptY?%ca>m%Y<qUhmU#H?uqQ zoipF}opUzBf2}UPyyL=-Zy$bHoL0f}X4cD8`|rK~ldrG*@y7d^yUv~X?u!Rr`s=BW z7T$TS`fgB$f)TZb$;-@S6&9a^epN0TV6s@^=H|}4Im3Bzuw0u_!qf)Ki*S>h#tQze z(R!-Q)b{``85CxkUT<<uf2T$9lfn;P4x0Fp+I1d&Qyvy!60U{|!Ph<4j*YNqAP|)! z=VZxDs}p7qT+VvS_?6dvPX$IchnT*xkYh#Yxz)_WG&H8+dpN`E8Se+cZ|$2mQ}8sL z%h9r+%Dla}MPsG!OIGXi#&Of$ah-?o=qn`<H>!n-U~ifF7(B~#q0&6cCaZ<X1F%G| zxFK#8?$>&n#1j>9Np%UM6E2C*1dr*SVVID77!I2X+@k{gws6mB@UAfx)co+PG;J!` zK{zF0Qwla5F2oHg+U~pBw)UXG_Yo3;89R?KrTnz(`9!vNSr1g;Yi`Cd5gtXu_x}7Z zQN3&Rz#M=Z2jF!$O2K#=G0H4OW5gV9WopC%ID!Cvb!AIv@J0~<-(1K(PC4>qpfi-B zIAY%Su!^zEoTl8&BeWh$4do7_z|Zq+xmJM(>$TbKM;>oOVN%BUFl{!C-QszCGqWst z(;N=i?}1=HZtsF+DX$2qr<ON8VMHU;Axa^TF#-J6tZ8!?sd8tAm_ekPk0dJ7g%3$2 z>P5?<R~x-+W<aoYvrEsy&YL_;Ge#XFOL?v`%g7bnR6xT_2)HT&SPK^-<%qk)Od@Z* zRyFZ`%Ln}v-U=c5yE3@q-#xE#GnA?BP&3Olu7z0<CYiDtb7TQz5x}QY#M+2Rfws52 zMO=mSMg;6?$={C=@jRlo*QP1neh07FN#;*hXJPk7bp*M%-N^3+RJ9l%3Y!(WZt)zt z+BYv)UGL&Z!~ovYl+N(-FEKiOE17#?3w(_E+l!*v8;W3rI@HS`K>6YDdA+LiF47dd zgD6X(ir_1XNF-et_vooZ-`aI%3VES(6*#X48Y9qujfFQll<8g~av3%)b8*uEZs>sk z&IKI)S*3-vZFmt2lT&SLW!(xSeo%dYvKa(JUC%em?i;tN+2{_nZ@!9>s22i#C^4ew zM8X2_2|%7iE+P_F_LjGFPGa;4!Py*}Cyn<0MkS1>912t<Ro#^hK7_Hs@(Ap^SeD4e z?M6OS_!u81Dmk9Tv)S<gHq-!_6?YiSL9-P;x&@k}{EWfwT3M=r25L%V+*_{z+I1$6 zyij}wPO99dG(&$<8PH2nN6#Q4$2C9+H=TnOm79a(oWTjF1J$fRA{m?&$_PB<S=CJN zqU?AXB~g`7VVst20WbnkA=|*q9To~5WdIY9StbO>60O*lAPLI$An0Kf%F-`Ifn3~f z<U@sz@j2@+|CsM_xFmCEj%LhZFsiu~KDq^(VR@y^zRN`+bDImrYGehZA{bQ?kyfb` zJ$2|?yUqm23&{#_Sn?}E7Zc0D9Bz6L79<~qAqM7<(}AkE*lOr%Kb3{dk5umV^GWlB zXH_$y#`L`+qLDdN7^h`h06+lHk!=+~hTT~PRG@F35WJXZ#ZeK~UD<XUwN66$u^%88 zw;TCT;bVM7S3KDZ%o~GKg5N^3(k9tpWPK}qbPKe>mP6^%X+IGB3TjGZ1=Mw*B~a7R zDwU$A4t;CyOE~gEz=qi+uwqocvwBvhg!XTW#^^q$1C^sf%rq8<s4O&N8@4OD{d_{d z;aSy8tg@-Uxz5dX-)Y$v01yCYc{~f*aY8U*lB_r?!n!vZ`<n7Xp`!RBY!11&-N*}4 z_!d4_JmE9rHO)l8*3qn#PBs|)$}R9Q>JbwJT2mpba$m7I>>*H7Zf^)}vlf<KXb|?P zL*MAlxYA`WGSrVtwsn(^euOsFIkbQ6Ypt?Q2cmY!YUosP80!hGFQRzahPCZ{f%@6Q zUNy{ALX|y=M_poii8(Dh0`Lu&Y{OL^kAUwHf`O#AFfPKnHyNc{;^*3oWY3yW<l=TC zkHZ19gBYJHp75ydxupj<oJX^gD%oJ-d4rpeahKd(pq0WxR`MrdlzNEHhA?W@s3Syf z*ryJCqc`J97rrp4AE#{VCLH|;RnLmg!6n5SO8QO*qISq?Xx?APLQbh)TMcX5`M5mN zvlgmmVwHX82@YBItOf8K7FHKs<*_u(BLummagV#7%B=@Sss#ZbHtXRSrK1&ZL$;O3 zb5eK}PpF*nd<7eOl^cVTXjVcx45o}Dm-xOW@-gm`y9>0Gs7dL-D;;?K&xxvApwofZ zZ8Pe0;FS)%(t%g_Q%d`&F&%g<rUS3GQGPn`ikh`>z}^}!r2{YfyH`5!qI;1JyrN&T t!XNbA4K_|Sv5%vPT{`ee2VUvG>%aeoNe5o>e^aCbuN7Fk+kbOn|GzU613mx% diff --git a/client/resources/hardnested_tables/bitflip_1_042_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_042_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b757bce02eb7879fa821e1e1ca573407cdaf1a81 GIT binary patch literal 7642 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_042_states.bin.z b/client/resources/hardnested_tables/bitflip_1_042_states.bin.z deleted file mode 100644 index d324368a663ad3401f9747ad9a324ffd5d080d64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34648 zcmd?Rdt6lKoj*=C-(9zxZrL`CCMG&fQ)AWOG#6ut!fBf}#-N$4Btb<uNvI`Aa2kma zLFUOO+t9@5#2XW@Cy5uT2qP*?5aA?6MHyujgi%H~RTxGXhLIWOa&FJ(_c?>6X}jIs z*YEZH@B8xg0=doQoagy`-k<m7dArNEtGd?vX;qcKsjiS@p01oD1%Eg#b^n4lC;xs< ze{1-$f-hgWYu;sv&g%T+@y)N?_kVu=+&`!epaK-nf%q&>k&~E6-GDJ`w#D3Ct|Xol zioe~%yuZA}+3c-1Nl&QC1@fKM16D8d{uH(O@Lq$Q!*_@Is~*pbWGI=)#bH);_#am- z@&%Az+@lhQ>vJv_1n@;Td$}VkBBr%bb(B%R7Zx_r($l}t(Iyz*C!8!jOg&=I-!3<H z&sOVb{_maf(6d{y)UwmT8-n9BYjGHa%gSy@RdX5*Sx+e^l%D)QBtq(Fz7I^+knC_@ z6Z-kbVH*^97+*FVtzy*fP<3FNNl`QS3_^<!s*g!t$?<A^vdo91*_D<mm>C~}iHh-8 z5bxsdCxYKE`DoBo4{x0&KW3ba(<{$8Vk)=iJB&t^X)_&ADxA=hA~s28#kmC@6YEXj zIUJ&wVKF3F;iiseK{HKzflRi1W-7CCZRAsuAVtCd2e8Pb-*5HFF4^{lN_Zt>18fTA zrqKQ_c93jp0dEwpE6j8fj=)^wGt}4sZ7{)T?u_RCiu#YT-PYtVmn2VE0=6H5Jwn6? zEC;obij+~fD030g*OMiK>>`!FN1fMY%9GmE2_xhrJPIGc(TCxXi&Vp_&_uJHG%W?@ zOa$RWu!v@A2Av%5D_3{IRJtw*H-&?$K~~IRajMq?Hbzf6KZKR@!K3Ir@DwzQOqe;z zr;os=um^gf8Sw8#J^?(cU4J9@B*}vJpi_Yx<Q$0_*Fjud{l{Ir_kzLBKhRnWx?)%* zlL|#&!(8ekAJNH_dli@`X-h~Kw{#oKQyhhxpgJsM&^zPeUQwMrP_q|~;ujyo(_v<t zQaJ%gp&ak!eIcF9gvk(GhCAY-Bz#)e-2qv@f>JmHadN!G1a)z7@0?e4BP5EyaRwfD zTVABQcYy=n-VSi9WF@tC%JC}x(;g@;?u#Q(zAwsnNBAh-%R9olFwq`6?l3$9^I%-u z4?w$qS!yZZJ98-f!;l(2D<;{3=0h%92Gpw;_#dh_i@62k@gdBOUT+)g#1${R4hzUo z|JoPYJ=2)89zj{7suO$l^O)H*rH5H7RED=)WW%8BOa%LaIR+hN*Td?8+!i=`-IL<Y zwWRd2`vQE2!tN8jxug7VXu~B%Xm4CrG7y|~n&c>@PtczgtD9>XN~;7XI6hkmx_Y?u zx$+ETL+&nWQc0a-;|937W_6hLMs)Sj#*b94fL?n!!jz4YZ^3E_l6(Ez13Fn3W`;=N zVfYN!%r!ob+TP%t(`_rs<zb!Ed4y!<E1Y1uPrVwn6ukBUl)n##RG6MaS}8P`>KZRW z`@1TCl7v^~L#bk|2IED@o)6jTRGQLGy024QZ#vacOG}lb-KOjChRkp9K{APNuKy9u zdD@m*1$vchuiJZ!G8O}uAI5upB~%k82}6*+6Y`pwbTc#onIIc0!aVEaH(cR%Ka&9Q zBXAOOz5Mr7>$3{KA127~T^Y{7#1XST@<30kT%F(GZP3l}v#qkF_}f{t3wnzE4H5iY z73q;Ze=5Q+sC#mgJ?VX0&@{BnU*vDb-wbNsyS%>p_P3dWtjMZ0s`e)0UYW2+&YmRY zh?b@+VIgbO?qs6zaL0vrLkfEimr~pigk{cu5G=KZLHNhGxIVH_OxM$ngQ__soR;F@ z8ZNm$z9TyChP|KhkSapwt)lhMDy!Fdpt2cOQ7#B&_C#=qq!seDuWmqLC)7cDC#~O& zn=w8DkK>p4gC`x3h1<GRbv#QAAJD1iNzb52`WcCL%eZ7On7WKkc!o|0z?Y;x%=i?c zE5a>30&jvo0<}+q^@s3A4;1UfQfg4@S4%hWsiH7~dwU+;43lJ?Vp~nesb(=ApAX;r zU5n&Mho79Sf#C@J7HmG5yp#7^*s&lvAN2U%!z6MMmS}s9Op*obFgUL8!z<xc)z%QJ zjb;^hZrqoX%SPId9((>Q)F_9Zfk*e=Nb&035RpAySQaklMc6q39d-3HKc%I-p*QTV zZSnX!cEY1ln=}%*Ssc5}QDVx2_D<MGbpxs`F7CGpBI_ViEc_8!cgPRNM7A6vU3$A; zmsqTPhU@xOtj**ln&M(l^9`fk5iZ<L>usdP|5*3Fop3^72if^z_I|ilGVOrO_4=`C zWHizwXHNp8?WCK2^9hr^iyS;hY8JACaPSoD=>@#TR9_-oig?%aS&H)$SfsKCVTC|) zGH9-cw3k7fVjNNK<V@4fGH;)kS?_t$rwhcZ{Q9u7orw%UVGh3qulWtEEB#=_&ee=J zGhWtt`ST%8bST->wKG;nPa86m=;o+CYMrlp=jH1>D3bpi&6-Z?r65E_Xb9Wut`;dw z>?Z7lYg88(hub<n%tQ&1b&@WqqkG`axSR00M2`8%zqpJelzWICt&rg++}TGC!1mbx zu;|sp4nD1&mT!bo`PRK;QzDS!<SGO(D7;UGnh=8@t6?*=ZwDq~(ryd4<J+~^D|Pk9 zM;olN=@=IlY-;=LKgxz$Mi28{T+wwUr(Ug-MB?&w8;C!6jZvJ}_^?`<X5`;eY;Qrj zM305km+bXbdwtFmupX~~Eg2GQ!g1=CzEB_kB{^cOOAaen=&XX}Ve5drdZ4_ExtI+T z5FYre*nWO~Wt!bzm)Sz{RDQ2oH)0vI+$<?0Y`DBX>TD%@lIT94Wdl@ra8b^qDNe06 z_W5m!*}gnX4neIGJJ$|uEF<vikgjD~GZ1@N7lcDW%L5Eqvw#j)@S!E!;g{3FIsmR_ z?gSW(P|OC^S<PJSTIM&vc`HM*PpUGm$Cmw&%)3p`cER?b|1vcu(&r^(F%;H_X%1{w zcf(W(I<B)VenVafsZeQ`YEZCeog>%bPz&RAUxvfDYLDi^=0P&+I?Ph}b7U0%H3XS7 z27WH*K!?j(M|16DK+=`-d$$S9S0rj}A_FRGm$&YQmflbkZ!4tkGiur_H@}5ml#T34 zNxUXJk?E;UBAF(C;&Tr2yWrGkt$4AdbZ82fQu&f%Ue6CCzN$ousKM<Otx2@T1H1Z! zjU&1Mp9$stkRPOT*5N{CyJ3NPmkbxd+6WaE#`lqu%kN}5olG8Gq9e|Y5K^FvvVC}` z_nT=cu5KNLEzqaC^UJws;BF%$l3HJU9~{VnJ3hTfM9i{ws%W5WtdN>`Xuoi~o`~E! zlKe37o&uqpHsOU-n`x|`U;}?A={X0JQKH&rVs-Um-PnT_68rb%QTR8!(z>{J6rl|4 zCzfQl3E6y015s$AUB=gFm)QcE@#g{&9~W1qGF<`THAPREPV$b5FIYneSk^D#yVNS% z5MqPH_&m6y9tZy^xGMkZ1+j2Vw88N3I$z*wu(@hxiQn5OG`N_Oht82Bo}+KAozLk@ zKpk}=G`18cEBtuywmG->+oHxC<*2uJw7KddDv7R8q!~QdwWj|&#q+93GEnI)sz+4L z1+F@8kn>7$YH<et23cV`eVVN@EpFTmUA^o?cyK+rkO_NzY%*C1jTAw;442jN@ot^O z$mw3U9CBVB?vF-We3r1EuN4Y`4mHZy51P8%U*D@Oxa_qBSN|RYBdz570<4SvVIgk5 z!b6b3+Uc6}Bdk?zk9gY*HA3i7*>(~h3PFySo#Jy`fox`z*J9dz0?PkUMlA4hmbOKX zRw0CQg<(sSchbR{xtqg$zjAaKQPt5(xCXU<MgzN>R;kQPpnG_TkU9$YhA**}QeKyi zPn`?SKT<ZIvX9d%MGCH<`YpLGI2K`>hYaS=%Ahogd#0urrbz7iC|L;lFgz5Tda1@e zV&<J-@f)u|eB9x6U#MS&ris<H%+7`U5Z!c@&dGxd`?Zc7xAgaZW*K)xcc~GWU-HAM zJfOyFFfvZ&*Ql#XmWUZ4;$-(gT-={l1|TgkL95a35DqYiLkrw|D5yWiJ_(N9<N{-9 zEKr1}S5~!(>-<sv?PWdRhsXnEJ~)=Ufhqp>ktm-heGhhAf_)`)Y7e+aEO&FY0-5Pi z3|Ax@o#tXayZw?@L~Foyn66z9Lmszb8q9K&`NjFY`VRd*^~&|AbEb1QN%J#(y3v$T z;!||axv-WC@>68)W+Y3(g|KEV+~WjZAn5>^wp7oK4Op_IaY442>IC8(Al)jzTx?dk zTZLvVn12BkZ_=Nq!fUvL_8_w2E|eyZT7L}WXRtsN{-Fe+PWs18Dx;K`>IF-wpV?ZU z{Bp95|BZT6%^a>LQ<LBKlb1pF8E0iwHQ(bbqLb8VKDeCURNS!2$I;yfb!FwWaW~&C zL{5-{^!VH@T;&Gh6Ui^d!VtAhhs)%K2up90bR)u;)ha1^`NwHZo?`uGJ{a`ywkM#{ zN>)epTS@3N7n#>(Oru^AYE=FViR$a1;UfqJo#MC)xLprJ6G_1NVd&>8n5y|~FU`)8 z_lDtRkzGNa+Hq_CC|2&c(4sg$W)sfBV%a}aD;tMtt{;}R-L5={WcrNfL!J-Ax=!Nq zB7D<Ek813uL;s=ZkB?#-8~5ofKtMjw5yA2us}^TqMFPx-`?5;0^uwHaR6p?ipstlH zp9@Eygykx$hvmCM5Di|8z0fQ$ZiPPfKk;Jkg3Suk2M>bzJbuP2d)8wW=rkW*qp5jZ z0pjzI$r<Jb`zQz<E>fzjy8(UhYwFqsWiE$g9zzfAZ=#3mWcKx`4~eD2<6*vH&7<Wm z_CH{U=!m=Ui|OEY<()SlbwIIx4zRnSbqqsbacqUf-FPvyiV#DXyKhwmtq3Cc^1;PU z*eh~XCNO*mdfPq_1g+FAu0>#|quNC%6kx!u&zl7ZSntFK8n_Im)xf`{)*aV&tV_lw zZE(SdDoLjsA=ncjS4eyD`iu|3OZOy)4iKMoEn`|ce@WGQ<y6zpU?}3$b}P9n&>P&% z1uSxjh?k&)TBvmv<U1Izx($JpJ;;S!9bh%Vu`S7pvjJWzRy!KWv3=s~P?O-<qU>xD zE(VsV+4%w6Z)9r^PK{@PwUazCw*;Cc2SRioLMJB7|D^2Ip;`x-ya!apCoPf=MD<-} z^*u=lcpuOF&5|<tgoC;J^u+T-*u*{FuxW&=K)zxhoq9lV2BG5`{7Q_dWWK*x=~IZy zze6%LjM(}iAaVl3)wualTKbs!cnSP$CYA4115x7;!!<4)W;+A<llkT_$-&kRo5G&c ztO;f_BnfJo`PFbgHH@-@Mz1GPO*sg*BRFWV$HD4^5jusMqf9?DLS!-DC}wxlb=qnO zGdsfkc8MERKBxufurf~@AwmZXC9McSPKgM3rqT4EGCzgt*M)g9;;7)JO-c+mEFEc{ zC@~|j6MD7z|0e!6P808GqyaFLC{U(C4v1Z(F3q%6BsD4&_(-RSKi0--W%fxDh`;ld z$&2LR6>(l`E4wKdu87%7TVT~m({G<tj|!}|_dZmdXP{#feq{a$*UVx8a&BmId|V&D zL2;Jxvz*+FF0vT%tg$_(F)Z<MUqUb!%(e7)bR6!(JNo!Wb>4A!x|e>dpTP%7k@=jG z!jeM@mB5t|E82fh7P=w5Meipwupdl0z-{I)LsuVv2qOJ_ij8lT@E*V1Nk$o$gbjZP z*Y6NBzL(%Yb`1yrac9W?KnYBM)RFo5yUUi-jR#7Ck>qU)I(=rOu_m__mSiCDlrN6D zHZ_LA^(I+uexcKJ!?pnYk!i+}(KSP5;>Y_P2wNLZN8`B(d${`%%+{EoZmyDkD5=`- zmKd!0qu2N+p~0F$7G|4FhZw|jPtf#<uyX}@<b|i#(nd)L+C!@mJOr)3Q~X58=(lo| zes**wM<=(r`VHIR?p?Fg7iq&{xx8flK?D!2{MPMY59gWr%Tjgdgx_PEP4{`SpZDfk zNj7d9NjN^nBs8dXs-x3%pp`yT2+P-ir43TWQuA4%pc!lQN3ck=%z@%Jl&u{666d_H zw1M>Ct#XkUWQ?4UOCGVo3Kud}zYg1vw$%8HRkmNv48f(FkTXc$gw5WjuxAL?fI-T> zD-8F7g&uWy4(Oht&dXrC0Y^0^=x*EqYy+L<ChKG}gO1&+faA%M7@_cdnDGYG5mKjm zW~=k9`VnICf?dL~J@h^G*&~qqDhSsVXBb=`B9&n5pe|&CYGJy?-WHlS2oF*&iuEY% zbLd#i%u=nFAsEmr>L)5=qjO9D%npR~k$W?TAN{EN@*24JM8q_7x;4~O3=b?rDxrtJ zn)P;F^UZ=D^Db|OU%gy+i(II_zaHraqX)l(e=zJ0Nc=s3gYe9~0nZy!;?6vhv?Ez5 zg}7tC1<R>#5D9uD66)zhbsSdH&A@NMMf+#2(KZ7T;RQL7WFcqQrxdQ2Vd-2jCQ(Ze zH!U-noYNQtOAv{IonXwPZ&ID=dY3v>;Ye5rDU64F0Ya<dp`;>U4&wHTjT<{56|ccl z<l=Raqz84X5LQ7$0X~VGfuB=d)aaznOzIbU$O;#2R{2gp<QXaZOWNH_*?JrbxM-o* zH*bs{)G9?qKq#VxUc5hwtpw==tvcY7#=Vp9oUb{Jhbc~4FF=zj)cWC$+OJe&t)CzT z_$4)Df%726f*ki#>c!?Uh3xY>I($rQP8;jNS;)>^Zdzn|VO7r1q5w%?9Q#RF&TTJ6 zI`*CM{opyLWUp;pwnV%#>M$WQg4ID`cpKzc`L6K1xVQ_OpiS1bE+Ho@XNABm>Okk` z_b5=s)@rTtRaH0vakscas0eV<rE*&1O@S0ue=Xy@)}9>ce(oSYlZBai+!j*;Y&{11 z6ed^Mg)?2RA)ngbguRnXya9F&><BCEt<0CoGxS0DgYff`1T{F*$FD%Jg)K|#Uf5t_ zHM^7S@G?P-1F$7x$L(~GB7PDxpc;F5(**3}6BJ<unM4W0g(e&u4~+O#(}=FseAcXb z$XX-?NT=U?o?on9rC<FoTly0!Qxsv6N|(#rdzCUdA%wX~yQ2~0LS&gCPUONQ|8{53 zfOeUyp~{XZFSwCyz;Y=wljQ%JCh&E^S;*-?!pd;c-n?>2a)HZT=P_qwNIlLHrpqAv zU3B37pl?c@!%o`5<-4CET`NhIi3$b9k#<2|i>MP3-+CxJ%`9tB+eUEC?{R^AU0{cU z>TlPY=#$-S%_FR^dP*Kd)FmlWUDz{d?B-7)f0E82E;437VaZjx?Q`aeZJDl^z5x^K zACo<!>haN3A9v#@;0UV~<MX45HJJ&#r)U~79AmBbAp6J25?XSF+pY~-(?aBRGs%(n z^)eoq+X=-ghv<P!5_wbRBvDR)-c{RFoD7hn)(EUHQJ5ua>8h3y5RRzL3UgF>x|S@n zLqnjDRVy7hH~Gkv0BomxiE>tkaF~zG64-nt#~#TFLtW2OUa0a*oj0-|@d%_3XYW<5 ziGb8;S+8|3)J90!4iZvG6kGo1z$Vb;K7Qi>Y<GA0t=-6seixdRsnl^$Ihwg)Y*ir% zcz~uoMA>$*BM_Je&N+~;%`RM+ZBVy+`C0{akvFB3?V@@&7Nn;YOApkZV5hAnmlY+X zzLBttByNJw_bZk*rU<(23mHb)aoRh#)`JZ!Y21Kl{VhFtW9u;{jd;mrdVz4;p?YL? z($tS2(*Xz8#z0J1;WsOD9;3aH_~&J27H~U6<0CE1C|M1Uhx9}EvUp1MGl0BUl|&9% zNtbdonN~dnUju#XLc|!cIs((+Eb~wAtU0y?=HpwrY?>i*8@ia*^AN08*lB9rO3EFh zcm8xn0DceR3pm(Qtp*%I%)A_{>JNZSf&39ibDyyx3iYnP2Q<uo2{cyGZ6Z<y?_g=5 z3yIk?ua2isuqjfg7C-`gCoWDSKKjxoiN%Uq4K-(>L}gd-3%dFJv+3AmqSdW9JJsch z#z$#9=rq#eC<5)+qv|9^!dEGdfq4d3aTC&m4N>lhVMF)JO7k*fccV`de5LfBfl@*K z^^wJ9C>hOQE%Z2DmaIN2XG?^yH*JHr5nBBFeuvlZyq6?Obt7zmUXxeWlz&8zfX8!A z<eHZKBvHBvD->%An@YKR7<MUJzic8*-wFwRBtF<~=#2y;@w--w_Jrp8V~{nPD%v_j z<#QTp2TR>vCH;WNmzUH@ZJykZpe-7oqr4ZErsfe%bh85YOgCkn<U6jAPrJKezH`8j z<GB350OFjqY(R`tz0PmH43jp)XLQOOa%GS<Z=(8Z{0kstD;cQ>CbZeZ|D7;1iojN} zorf}CaH+e~7w=MgrKMp<?gj|D^n18s+V;XDBV%}CjE>-)dZ$GqOAmu3>d0I<3?IX+ zFeFIu$N=KYlO#v7re6gVv-ZH1PMoP~T?U2A1821=c>LGiwwz=ZdJ0-Xun+Q|wruGH zPhcRwmD(DT>l-_%^>->+7vz1>Y_BFV`Co&)4jQRYosY`x`G0VK6HWXcoTKm>Fs}h8 zvJcS__wFXw8m6GC5OoL?&ep&x^Q#CViV;8j_h15lQv(?H)>jwb#u&{jhcahcwKsvY z=xYf$IV5Ig8cdJ4+h>>LsBa@D<qPZfuznG>$vb~LzASun&D#A#@wxKPCQ0T8f5|Q- zIS{?o7T0}znqQUyjvAs<)vy7l;OVG7n6m=5tMIBe7$M_U3bnW>bzmriEvb!(jb<|( z5$i3c29ZR<hLO#B+g$y&4`FGuVRBHHAQ-)k+a`u=$(Ccp4zmiTK<$7>P0NuMfn^JV z##M(9&x&+=uOYoLoq<=7G#8*e3BG`5YQZv0aNG$61&tm5p4#v}wJxdBI8w5J>~=Vw zYlgQ>+2Xl?nl@iuElO&{tIJBu#e&CQSJ-BA%V|DLg(H7e`6lQ{md!|w4vQ)|BO+YF zMTL6}-c-|`2I~Q6Gj$OzoLdE50rog;9?<9XM+|uFyf>K>yzzMHv_ra<=7Gsm{7wGz zqaMleU?!s!KgarM{c5?>KS3YQrx|F<KsgHJFRC}G^#juW_O9lzvPNw1{F|RREj|2w zt=zp0IMfXqRV=Od^5k5|D{{xl;eCpAVh~;k_|HV+Mb-+bLD=@Ot^g@K{y1!tkm23~ zECI__V5U2F{|^*v?oC}xsj_{)E5dlXcr!K0{F8gb=Ix64qNUT)1xWF(QpdgXavyey z;I2M$NG-I0Hh@7*gy7ug)e4aHq5rNp9v&CqKZbv#E;n=dUk5~Ig&#iA9^#RA73&A# z`_IC^Aa3(-276JAc0I^}e^?`3({A9KV|OQgT?+Z>2oRn_KD#DJHlcus^hfnJ{OqiC z!&^ehOj7cRHTi_6@mX59P-NTa)o4m6C7NvK^>S*ylItKbQAJou`3f6+N8~T!!<|)Z zb5J?pP%GAjnNDK=CYmaEa6NaTNSQjq-efl?$8CSA07yfWh-&%~rLeO%#sT5fi@Ze~ zs?V3nVfYGU7cw=UAgol8P6m$?Yqy%R9R>y?@SK{R7Qs1jT-jGDR)d&uJi`S^rN>7| zk%%Z;BcPqtkmKj~hRZ8t@_Vo~fU^^hsR-y18(jgo4;-&1nNn5TZm?5FN1=KgK8r88 z;cX*zo|^@Bd0o?-)ISOtAey2LM+ZDz5Md%TRg|b@{Ea3O72Z|0N!R>AdkI5UG_&HI zrMoL)4BU&kfwV4K5r!A_%6&Z*_fT_*wNo)%bks1R%<4$big*N>#y4rZDXjBKsc;<m zymmgf#4Gay{#zCaRrs9hYT=9wM_@%qyxZea8&B*Du@X%iBAuj<V0X3rB_&$sBh9^} z<wkigd);SgGn^t9Op0&;%J^L7+)if7x%kaN*c)Nn{nrFrA9)&5wkc{WEc)SJ@h9Do zBE5Qu-3CULCIS~(-7IWJhOgX#-Rfm0Z*zTU?x`RqhSWE1p~sWM@I6tt0o?Rd@fEs! z2S@>eiqnWifJ)gR`)IokI#nY&CV1ZkE)-m1{cylPFXTY6C}x}(peS!xy?3J-K^Nqr z{1$N4Do0nsshBFqWyoxTYAB+=a6xV%GNk!*oP?v%2(sPZg}b1VgN|g_Q$o*5A|x@n zr*yWxS_usjjY8q30Fo&$tITbQwHc6>=E59F)>&XVW%Gc~kh#?q#a9goz`u@gN><z_ zrI$?0Hk*FTZ*Y?XMqnhm@Bb==c@u`#Gsi2S`Ez_qly1Yi(XlaUhs<0Dlm_F56JVbR ztsBvJvgwkgpFi>{<YL{YRtqdTPCWtL=eN{V#4aeFB%FdJW;lfnBmOY_50GY-$bD$o z9z1q3VE#|UF^?^=F_|z2>>4n4hOpz>rj&Sng=$zf?>eMjFm9tUm5<pTxVwa&=PW{g z$@&ppvi@0gRPaKsO7qu5ZHtRv6YL>!kbQojiR95@ghkt16=gA5(Sj7M?FpLLK^O0Q zE2@-)c#p;FJ;^`sVJk!^6TJ-vx786cZh$Tk76r+bM&HPUbf$K9L{-A4`B7y-PKht% zKNR7ghja_M0YjwH#@OIWm%if)xiQQ?g2Ho<vsFWNC8TH^b(d(}7^@$s<E=n5NfshG zm*Q}FB3(MW4@XeLD6>rs99oqp@9^erNl}?u3fV5PSD{ZjtR~8&2R73y@2bpc#34h$ zHG|E6g<^aoX;$*QDEx)RVj&l0T-3TrbsS$y6m}(u3rU+dMd1Vqj+io`u;CZ{#vxdW z)XGyxokOj5qtk1kb_Hzq@h$EnZ>bw4EK*Y`n+{uVkXfCEg)k$GBKcheB~C{r<GAKK zp_}8Z??H!!iZ+Q`<_hMY{0+K#G+jh`m~l=G(u}bsCw3v$DRLGg>>-F<Vu)uLJr*$_ zgnv+6cY+#EX&TL41GM}*>L{IBik$QVd)P*J4@+)bx6FrKFuVy+mx|$TlN`(lL0fn} zR%0x#)@j7MOS{Bbs;wHYaTHOC$eSU*VYOWAEx)e&44qh4;q6FN@CAkZtFC5PG{`*P zjT({?TBTU7vRj`f85igqN<9)O_j|~OAUmCG2=NhnlviYZFLXw>4Xo#1cJtmmOF9p4 zvdZy8P~+i_m2{~QIS};2pXlA+Dj8;;0lgC<%_JeDKR^*vJm<15WV_%hQe*ml7>PRP zAf8%6m)H;##)$PQ)o>6x&cGf5dgNO;nZ%qMW^90l&HzffL*y#tMkqTBM~grgftD^d zOKI*$?$Q~mgV|HCFMU94FJNOrXvS#F>=`ttu?}#pP-de6!01-uV+H_MUyO4K`%%Y7 zHn!W3le^J{P0sZvI(ysN{#&x^@Sd-2S3KJd+)>i~Uns7R^p<DmY~2L8;*wID^&FxK zwgrc1M-AMoR=bAz0@QqM=gB)tJmF6J?0H)qLPa7D5c@*C?rV`4P`C+77cIxFg6=xm zct_lymInCU@cc}&Ji;tSA~=Y1fWL+<6PQ)u=rg!|no#kDgXjz7KO)5g&Rzz+YlTMG zA}l|ik_c-={t~|_;8*}n@}fl%rdc5M^!Qq}xT+zYTAxy<oc{@FeHvce1}k<nUV@j_ z!MtXO;F4jb#shxm{iHc+eH8Xd{EN`h2yMp|XDjU2il1;@9G9#v+C*+{kMNy4;0)8J zlgRx(YdINi2Y;Js8cM?#HTnk7gYtJ6oWH^xl_v>^Az_=^{30y~d0-?6#Xd`ZT_{Qr zLJgtau1RH(1!uy#A#xMwtqDkTqx}gkj>78#e7{z>t}^qKTj1jiEP`1v7=re>LYPgg z`&Gk3W8#Zuq2tSj!BWK_;l`o(5<zv3bm6;)sZfsM)v$UUZ%gv*``)m4b~6R52a4H< z`a0v|jdHp1KO@{5B$J}kEOb(AFOZQkfLd2QM|(WD*U)j`ljE&Drh%w&fZ9gY9Isqa zR+us0WnBaJYw)6krmsXTPYAs!XMae4EvzaT5|666LoGw>n3_yJcTgPsc_D*8M>a3D zmI?U{TcArK^W~W0c};!<8ix$$M^GMnwpdAV=_di2C^RP~@)g&DgJ%SzsI%CIkRC;) z;HK~->H@uRc97YUx&d%#Wcp!=N1te-flrif<R*?j0qb7WXb_v3Spz~3jWqVlsL$q! zrgM~Wrh6l<P=+wEWQds;CU*6sV=&7j;Apr?**YqOseeV#x*OuLLK;S);uOC{;JPIG zvaHs~SbMJ{PCN-qwvtZ!*S^cC9k2quY7*H7+C)=?#xE279eR)|Y;3;jM5|DUd4bG- zoG0(XO|}$SNxm#HBMG)PdrOJYuh=)rR%~F?)IAZQ@#<)>iO)IFnpI3SBkae!;a@z4 zk23LMg>1Cc7q3PRh`Repd;TAz{*c18I8pOOoD6f$@(=YgeWZaJ&V#34Egb)s<3$Oi z=}FgpqSKW4zvNv$hN(TK0KDPSoq^QmZxAh<!s9x=45|srKf7H|0?Y(hyMT7C1HN7@ z4GCe?D>bE!3_)C6@yEN#aY-^}VEsnt1=3U5niKT!08Z2K$d<=xR#VHGqpf>+hiPju zMAiJV2y#P~2tTCM|G7ZuZ~~FZF*koI$|@vg36&Y`3Gmf?hC`HQDAl-btxq7QkWGbk zP#4*=GvL=uObf<;gPi1xZA5zZ6Zo|wdmy?g83C_6V3qaQ)z(H)T6XTUP80Tx2yM}9 zXY+tL<32SMw0ZqzaGc_wcaytBN0TzjDWL&{tpX+4U1z-r+r`NK@Nv@>dP(_cJ-<vn zJVuE<L7$ljpEl6>E`BY&N=sCDU@#2TvLPYHoY*?;5wEqn`~1krR+ru<kUZW`)hi|V z{>9Q7J4)hX9N9En_L^Q>IPR9`%jM>4)nDysT&?;SLw#eJ8r<H?XUgS%=RR%)@68Gu zKLAue+B^B@ySSs^F#X7>SLdP*b61#r0EbR%TO>OJot!owOdBCqwIg@U!#;8z)kQGV zY;+7kUcGt}u7t@XZQ^lDWEoZG5%9w*6&@Wrz|V{)Of9`dnxOfE|BZ4q6lD}BoaU_6 zMxqT@xXE98Ih!G6l%F_)j3|pdV87uHx%OTiv4UO@j^G&e%7i!N_q?frtUOfkO;^+@ zb!uT3{cNG;!-zZfZvy!uc{%fk5+EO%y5&f_tcx-JVG@+w(vd*@AXM?s;(YdHcOO{$ z^ta|hr4-kLuZ4I$?Cbm+luLq7$;=X8lwW;y*{<LOVT6o)abg<vCqCkW9OnZheDAME zh--8ToqYgOWW{g-?7jM_$$301YZbX8A)}gF%eN*8A+3n!g7H;VoCsGOc5V?xZ||mX z|7jM%seJU*h&7`s395Ps>iL!%2s)XnHB?OYkd!cU&EGr<S7|UxXH)^<p%$ICE6ZDF zPr{NFitp#c3eyNx?QmQs_JCPtZWS7l>OP=py~^+Q(^F#vZzrS8k?gN1yi2zQ_<xj; z&#?V~>^DVarGVGR3uHP<rE6D`^U^iB;c6kgu=d*m9HPw68J0-0r_~x#=18esQ0;j? zQsnMp)TEb~M+|C75-I2XYv4t7^_m|u>64%<2p<OggR1c*iU1}EHGhKI9@8lCN-%op z->cqtL^2;H9*=_<b7(pXgEvtuA6(D)&Buf)O)$@u$wn-FtDyKkBqy!G_)lYVMJX&* zP~-WXHU>4GRvn1>d{7zSFHsbclN6?jl5q6SPq&KJ2l=Ic-$2f@XNB!v$31_m9^EOj zZ{eg6jsIybMGmw5HjQx^HbTcznils?hNwReg&P#MZR;gwC$zjxv(Y*x@tM^Av=>G^ zdu|Ot0`eIAKjX!o15-tE2A#LM9rziq>}Chct9T8&f`+bSAI(Db=VNk#f9)1yG2wq? zEKb78lZIyl@!bjN0%cu_!N&gs%novQeEPwQ)NXTa*JX1M$t<A!T-Y^+A+R{^gzDp1 z?_P-k&3G9j1mARmDqXOr66Ob)43%=<2X<u&@H{p(=I|Q`3~`5I$sBHkc01d(g6f75 zdAtJc)u0YiG#uuy*4)>%5p2?2E!-nRt@03f8r(<`?2k;W|2{a?c_o9X&=qQ`U$mbb zklD^ix$-W(;z#nHYO#-IPZHzSBX&m8=Af!q*<9+`O*&;Q#8HM;SX%|KD$SWz615gX zMOdmRf!9-l#=%nFF-=U|%I|U4NsfMW=Ad+elj}y{%aFHoO4J-e)<<KdG#&rdN186@ zaWMB;kkMbaZ!~p;J*Jb#g?P6!`^32;k3`mR<l&EIZHLAwOm@+fUc^T)(iGLONVIyO zq6zi{{4#9niA2weP%F$1sYSiU^WY9LJW1A^mumcSDO;lNEmI<oO70QiGD$9}xym1M zd*+(VJ~RMhYe$)9J+Dxsi5AgZGx5^d3U`CQBy>9RCCiIoTn_p?{w-jw(5t50wt$9% zo}Pf?xQb3Q&71$EkIV`&1LECzVC}}}hC|d1rgGBP$&E#dtzX<+rm*9E1g>*wOzP9C zhKg&hn`e!pH!e{NZ?qysHI)igFz)u85QPL8+G(%`R#}zlL0BOJigkyAI7VnLh^X=R z(5L&SFX!$JdyWRpJ9qIva?+zg2Z}B3->ZLmL(1lPZSUQqO}Q0Q@FV#)u9?HQX8vs3 zv?h>TM4iXrFm+{Od(s>n*!92W(C$*>X%^ghhLp(Ww_x>Y_3oI1sw_;}rD18YsD{8+ zA1m6w5_hzKZ4282FH^mcvWS^VG;xJ20snboSxL}OC5x4Z;0CD;VZ*<S>-REw<TNbR zvI9s*d<;X__O);clu|QFEkDI4Zld@TTyZx!k?3jp_09cr6YR=EsdB%+<gsmsTso_c zChgVycz=(ONbR{k5WJiad~o6aO+w->QGmw!b1ag0&tzvLt4Vup=eZ|f>eIQ>0j0P) zY>+p-h~QxtnK272KG$SY9m?{q5iqKxq&OT~I-Qy5<${V)el?o=9n@JQ=gVBBx@ebL zI!x^Ws^16Yfq30!-nW5_lKWs^Kwn5Bm!mTnSf?~o^nl9TOSeHpKj}$E|K{SA&{2y@ z<Jlog_SRgNu*|q;*&rOa2JM&NI-Tk))oh?a%8fe455c2UuV!<ORObD^420yG`64y7 z1;$6<Wi2a&_o|P}lVT8JE7FN>xfgRn4x_X=lf4c~Cs;y3iT6&C*8f^_f%2zBs}F4V zpw|r3O176|?hSZpre&Ykd<mXWkYVeRtmtB_Hm#7@YVf$(sQjo*R;p{h6SH6Rgfwpk zJN)R0n358tkG_pQjrF^{7z9cDLQ98?5fuL=zky^%EK`Di&~0~zG!F_khvy>9>Ko+| zCUIv8^`MVS)ghpWyMgf~ffia6a?21Hc72@+!95a7h4>Zi5_|dew|t~$phQ9cI7W(? zd*Gkd+>0LCT;B{UIoRFXlT0m(;8%mRyuo9&^zwc5;3d)fZaBMFnBw7GPeJ}plvMIj zQejVnTfjSNYji9yDmBv~!&rY+QqA&p=W^AWgf`*!VP3Fs1ja?U=WgV~eG>X@d4}d5 zAoD|H;jIK2^-z6)JPPJ!zULZ^w|}D+75K;^Ox&QIL?+rea~0O9rQvoH68Gdt8GH-3 zm1YHrz$)N6WcUKoI_bn-M)N)LRSuP(hD-8q@+OwEP(+27d--bkip=nk7}+j7jA*Uk z!5V^{z_LvCn{b>Zu0|Ml`JW>E*}lgk@DJK{E=1Y{Q)Drc9orM^RK3H0Yu0@AJ|-!p zVvEAs9Z!$yp82rx7+pjOPpZ`B8|Ll;sCfvq=o5w^qVf|f*_9P*Y36xRw?|*8LuIEK zQAn(4g_%4RBOn`l$XzJ(ZbFB9+A48IJ$xlmOqZ>e5F{T_=*FYX*lV>aIs|EM{+PO4 zai#E+AqPk5V!2$I*`CoNI_yYyZ{0$EBk6i9n~p;wrLK_E?G^HU-2rk6^{4m6{7$jF zMM-mw?xWVF3iCAOQ7wkH$ifo7CpzaeSug54khHLdRZFLvFQBvYG_*3_!Q33MY*OBH zo`9MjWgY^K3*dU4B&qovC6;iCmj0t!zyz;)yGir3YZH-c8J0rKqVVUDXFGgXj?&lB z%X|Ru!uHWSUY|l`hZS0fnEe4;1p{Ud1T_2G(IOYCsm&r{ggatcxmS?2i`WnqVVI23 zq--$nhj}tBKdg@TL*jL&{<wxSeo8HpwNCpV?udGs7mH{4$i#05CN*!x?4pv2<22rN zWFy-fF|x>rOr;2n@reR&gcCNeYMI98*NqA>i%*`0Z*xcZ1?220!(=N7Y3RT{Y<*tf zUf!c7V#{JQMq<qvBSDU&Rr=BnNU3$+EQAwUYC~cBE4P{UcOJYPLAOO6Ejxzf@*?$n zd+wI&`=e$L_h!lSrpb1)xs{2fN%$h1ZXZH-HhL#&8Z`p4fodc#b~(tNk^Eq0rYvTq zSxm#?F>X~$(<gtZRHh1IN?GIg=PT`Hzu3v-nPHh)NfyE87sIw|FsGFqK#vf7U#D*y znOz|7woZi%oteCFk=al7_p-f`b&KhsdKr2#$C~_;q|CoT8Jaurwo^3ACGjh1RvvC@ zI#IHkXd0U3nqdhCD02;A$|TH=-TNywFh5j2(OZ6daNvi<yETMS6o3huck0%KW#*E{ z1QL2+QDkZ*nxxA-gUsC#YweqKN(uAglDaKqku<MG7}g2nnWi@<q1t5V!t7XGcs}wH z-};)DSQKgsgcRpwZD>Hr6NiRh(a!)Uh1<q&pUU-7XHul1e>l5i2Xs1lw4$`|MZMM@ zm4C7iX+qY8jj9wM*<a50!*TeHhFM~$#d<1MmVFLSAKX`eTuj^G0&gECkic~Y@~{4d z`INa%8aFFu473GwxCp(d8XGV@8MB70?!#MJSx1*${Oi0)9OYP~7()6{2ASsgA3(^* zw5iVfB8H!6>fhonSm>?C6%}!UFdTF5JtodM+mdL#w8*pu(nWr)e!jX>IYpfhV@>p{ zjUlF+;wTXbrY}Jv@eQ=jAX3uI*NZ=bn#tJf%pu(m;0n(6ScJZ$@fy{O<xWeB;ZNw} zxXpr)sTfX8J-=pYnK*BM`21}>MN_D?QPk>nxZ8~>Ql|@J&Jo?5CGuy&V=6C{pE%X- zsZQ^IW_z-p_efZ$*JgfXTB#7;DXE^oO=ETVWTV9kFY;U3N})@MG|p6K?GnXmdT9%e zOBi6uKd4qeHE>gu2Z=-Pbbdg#w({cxJd_k}<4uxW+IoDgRQ#NA2a`h$Z*`)BB=VY% z3r{&9y(&HpFR!3_mo16D=56i_HgZBw)UunKR%vaZyFxT=fOs`Sp=u3<Jz*wY-uJW| z->q8QD*HSb+&atyxh7!)dW@#H*<r<BJ(6ak6VRf7^hcPf__J%|M2X3&R$rwRdGHI^ zd`0h=?yTkOdY-Mj1gT9>egICXhAK>fAH^&)Gr%QWhAf4Z9LZd{>DwZk1;Xdx*o00* z1Fl&TlFGM0!Z1`u$L`e`#x;sLYadL%0*CC8W^ji&VRULk<4F)JLGSfobR=c;{<F7S zBe-ylGmz2ZU((X7%oSR(Y-Wm6ci>ivCB)(YpQT<J<zEAboyROk7_LgeZ=_kBV>Z*D z6rg`3>n2Jt_s>DCMa};$$}X6(Heb7~ti&uP5^6IDTu!4^1W}JB#7LSQ)$Y~c7na?{ zc1z9LGh4ZZx9#;9hFRPd-#@bL2y>~CpFR)2KSsp;^8s~WP{MX8-^e0&VxiBy$fVPy zg4Q=OW33ahJ={$jHyA#$_<h2kqfp&0LtRI}u=CQ|#$xG(K_&9E>EJmyl7zi%pM#w4 zvS6yt_~G4mxsGjEV;9Xog1xk2VrYuC<KKqzUUDmqX+jmZb;EkT+7(%wBpOxaz15<% z1h`tXlg4*Pd&i&V-DntTz5$P_Z=@5Ug4EW-)>{63DtD7MYS={*IylSI`7e+%KV$au zD^8GY;h7g<xg%R+eH`m_Njprtqyjg$T1Ik6D~v;3uvbc5A4>g3CgxIka%e0Qb1RU5 zajqtL&;H_1Xfl5_5-cy?LdPNo1AZ>4JR*sDr!SoscCVTSdq>S%pq}K09)G}j4YU@+ z$y_eihbhRcygq`Zu5c5kdPpo>=LF}w;3|?YLY^P~Sij{rbzi*HnAX_88&Momet#zg z!{vfW%B5D>s98p|;Oo~E3Vq~vVby^pa}O_2>%SiOiy3Y#d#6KP$gTC`PJ%V~{oC%_ zGZ>FZ&sXa{|6AJj2XL3j{)rL!|5*6C*V-k`j>YeP`7v}9+eH@P8#>iNNc5T`k6{oR z(|a0e>*!|nmHP8!3EFGVk>8Ic17&zgG$gvW{55})hw@FZvpMKAcfY*5I0tfD`B*IC zAp6=|uaWE+nX)DQ92ADa!h`Tb3Gsn;4g~KGAH6l<8P}-USS7c?lO9b1TP1G0?#^x| z>daWCmhYfXD-2y5*Lu=*s#i!AJ*Iqs1?*DBMh;I#Su*a+0Lu8x%MpUoObjZao|_G0 zdhRHG^Hx8=3RjNWT5yCb@s>}c(2q805l}?8|LGQ=a%dQt{l9X~hS538q0720<Qb&8 z>)Oq(2{C!7xRL-_8io{&R7njylmOR*hUb|nkiqwB%2%fgR&iWVJ;m|oBjsz84WsOE z;)2M1&euT**51%OB1Fa#9#ZvFe1ZYm^{+z00C|0ZmRK_Wj4oXJ&)(9J2UF)X#PhS; zIWJTCwtCa=JFEFywVbCFZA{An)}Qx_Ob6F5ueEi?oJ{|oPs_DOS2GcQ*_-(Dcncl} zUn}WyP~?hzwL^OzSGTBd)Kew$qP!djXRfKBBuu;^<5GPFWK14}S<#rK1d&yvAcS1% zY){4tJkKDIujV&2@(+0nkI#)L;ZAtSr!{@m->`+ze6|Zk{bt@9A>T>&o3%K707rK% zPCrE4qn<bG<}%wWxc|3L-S|%=Y%p58H|&3Uly?i&iaz9nX7mkGBqvjR@w0HA;Y%U= z^4A8i{{PAVmY{hgV;LOP@OLt|xaJ#1<`sru@g=+mUgk^s9?la8PhQE_>@zqT#|1Dn zIAtrJ?a`F^_I|PkoxX4+L~l#Ey12NiA;_6V9Yz1kxUKapY$;h~a`=>oyx}}2tYk*5 z&oN5R)Xk@g6#t&DX`0zxOuMc=k!v4a(_#pSvq>i5Pe<(+9qVCJBwi@2NLoH>Q5hz? z6&`DE#k4?LFUgR$2jEatY?Hd&ZPBy?ig6aC<xpv&YTZWkvmkOzpT<gS*N=Q7aBJpq zIffwr4=!jPW@>(nL)H~oTF$e;4(IRHpwuoEVN~<XMtv5P?;>AxsOBju`$w{i@{VZz z{uqLbmxW0~WbD+G9gyJi)U;H(bhUDGsAh<BJ^&sY`z#Yt_U&4HeT-}w(`ty7t<s0! z*ejqP;To=9#mHbT9+xo+OSI(T2hcXk+P(nWb+i*<*7iYo!^XvIAz3o-5Sm72en7Uj z`nGr>1w3!foK^`44?R0oV{u7ANu|o(CBt|Rag8`|PPhreDJ?GJPm`@#;d0Nv+rLS* zd{@i)o}%O=WrF;(O0PZX8*!Ph57XF%*yMj;TJYG76Ue?Gu8AOsi5X1H-Ip7dWomCC zCIQeTrKY9S{o7hKf<#Lwo@%PkD@icnR#aD|9@KdD`8G=gVYrBv=FWAb<}Y0###!{c z(h<=ia$XKL?u4rE;sGTh@s992F&M|YSKT^vL;H%6kW44TP*wv~9wbqlR2+_nwO>2` zbzWwpmY122uAd^x;ZSW9DH&qWPwxt$<M?+9b5lTr#~iSQ)$%gU$zfOd%JWchhS?E; zo_RR++zl&tC8G<K(VQDm<gxomGuqAbcEQhLej$x`zx?hcS`w1kRX$!;nX8Z|Q{5}~ zUxkM^JFWuK5a>iN8Aa6;_Z-`dMr0ZC!`Ax0v9lj8U9OBiQW*=%crTD|Ps0;6QbbT` z9omGM0+;ICplBXnq)M;(+rKEOs|?^w?javF9y6VotDvbDfdTe9%wC7c0hm_=32|}D zQYh-nXWiBzI?k*4JDmf7$5902d99OiRo{rsGVE3~>sUsNdbLO?SC7H4j|<c<D4gbD z^k9+F7SU}3<Zbr(LF$RhMki~r5=Tv;9qz$n4eslAEb(yDgKS>AMdDYCz>O$S)OAzF z*m(cFFsmOe8<s)7E5a_dpo}J<`1=H;&xJ3`+2;fCnL(sKgLudZrrC^p)X=D-M1qVi zy&JE&q_F`QEHKDp0vg(!^Zx=W>>b&hW`-ZpyJ&9PxKFo6{R~g%9EDF>ges~qCW>s& zs+qPJNO(upX_2aNvB3-pR4NFFYnt(j-T*Cjw4LgFGWW-D`U&v-9)<>EkU(Sy`Tkqr zU}zZn{T;_3r*AA$quonq+ZZs2;5sqNlwf2QKMp}39P0;11B<t%$Mf)e-#B<chtMFB z2czq6(#^jAE>VNf`C5nOq)6z7vPLGagmeU|X5`4T{3Ht-dZmNdeYPs7PhJTNE^<TZ zRpum8OV(#>Q*$L#hI9bUYggcRDn#nN7SXuK+Yu<PvILN%(dUqr%06kzTFxz4)B}mM zCMevB&A_0D8H<gY+hOhhDly|#rZhX)$(wn3&{$H|Pd2uoi2}kSQ~ls_L637SIX_aK zAegU!rzlr7)i-+6_h1I<3^mqq8@0m*=F~#^27VKD^*}}*?Fga>auPnEq$X+!$f@aq zu!83c@ZyeHKADPuqbTtk*#Fjn0%*+AsjOddbU1iCRtIUN|H>uK7J)Nh+UMZ|F(idq znN{!-f|h+`l)5ZCOs44U_0BbKI8Z1k{!Uwvy{3F{aYhcQqMdM9{S1<4K~}G^=!JWs z0Z%#;V`32|<EM&+zg9{Ws}l~0aP<VVY6m=}MVM6hBZeRW^~yoFVa`L)rT3UaA;S*R z*(|K?!@MwG3ls1hhnj)gV*ul3#OAo4#0TJ{%Rsq2`A(4xUM6v`|B~uP7-2r$3=?pN z%e>%+CvMl1dDL^A!?0)32o&1>TE%%KzAb1-W1-TH2V-dxi*}R^KE#tMa}uw#mawt8 z;W1<9w$aEH>ngvFC#?aECk;@`E`r1K?E-OU+&jxL(yQ3+g>@R+@rpLLAjzQx%d|sJ zV#nF&G{qhd;KFmbpm+q&o!OE~GbWq-o6o*hkAShdB1Mpo`wRVHgYeHmZb*D&65HlU z5eTEMMo+MNcRW~6!ST^q?)q4Ec1U_kt)8)mH_-xB9f7)7(|-`we8SPqeDW@^hd7~p zZe*6kJ`O#XGM#!Cx1FmVu~g{FtR7UpET_qHy}DygCP%h7I2S*bcwq|Qz%OH>OJ|X2 zQfJlHCnh(plJ}{y)fegJnR-9PesH*;?)JT!g-Ru(jTOVM+!`tB(fZD;XvfVr$xCjX zzvaw@vAkMg$vK)Zf~IrQC8eR|Ck$82ebPP-cSO!t6tO_ZWo?Tb@*;$*RhcQ&U&9wA zIAYPUL)uX-NH5_T6n{nop2N$)Z0F&IA5=7|Fz+WJ2aW!NPJHSvs5uPIo#6b4)M`8w z%yf6*K~k}xOV;h6i!Vx$vxue2)~Rqt`PS;ZHA=5P1a3J!jO6gp4_A`kB5Qic7oXj( zujhYcgBM)Pv6$%o&iLzcyt900T#X+L7g6ao6+x2*Bfq4^Onw>rvMCLHW6m24p3=5M zfvrfIVU1pcQIwlHna|KzfV+H_^KjIo8+GinP6FG89ToZX`W&jCY?*xuEh)?Kpp)&r zj>+#mLXA6+lX*Bqaya-PLe?nmljYjcgm{i%Ev+OiVP~DEz7bDv$@M|PA%^W`<TYYy z3yvLZThCQ3bdW=8pQ1JP8jsK+$BX0C@2NPeHqUY}f=4l)rBg95OgR^sERa(nG(!rV zz&m}H#Qj+k8aTdEoV%epBCM9!LNG3&Z^G2E`~HXk4_$;6JNXNj_)l;Lp%p}$I{I0> zI->>H3rs4t{d7z+cU+1moG=`5Uy}{)D)Ux{&$@(J%Uk4O;REwEnd^XgH#}YgfvaN8 zZZeNxx-NY6W~OzST+WwcVCw*H_4r34NwK(UygR$1mo27f4asPL$`&T9E28{(Md)-P zjL86Q_dP8gH^m-%pI=c#f5Lg<^|F&RrmbPbqizhlwxV=E@<5M=b)^gw^vEj8YI?^g zGs+C1kK@+)f9Bja=NGV~EBS!RzeFuvy4L+;^M_+HVz<X&R$p35fWec^>{{741YPKR zyIpw@$;|lsti!sQ+HoXzynY_oiKHl`>c&7I6X2KHF?w=%#x2`=%JEH7X^_3o0f&%p z0H>WS$yRaNAA6yfAsvh21iaX}9{3T&Yrc)F$MLgu2?>Z^8(u@aM)O_e-Q*mj<xHfs z|25I@PE=SQJ^LK}to{`F9^~$TfpFTN;5YQ~xF<HY5V0UV*gF)29(yZTJp9rBA4J3E z>tN3tfXG<*#D~C8JM0MUO%cqUq@<tM0ISAWp!pMxy!s4MHH>CD^e<wQZVw~DD3p;t zIAK%RurQjLWw{Q=;SYwALAKuXc3R7*el-T@=@wjqXl&GWE2d1MCp_hf+r*ksSgC=1 zkb54k1|3DDp9u;9gmwiXs1TTheHhvGla5SM<JaZo(1q&FNa7TxJWzOSZW>(KsZ=8E z8NsPBfDMzqMIs(WIA4zwky+J$wEW(BUyy6QL1M`c({#EnoCTj!n<9N=SyJXs_6HsR zS^aDfvm>4b)?X{0K}!n)()rU-jYD3Hyhuxc{r}oK|F9;{d;fFJ&d#o#vz71WIkT(I z?95u$DyHhHvn@VdUF#~f+5ANn^;zdEtzfgllq$mAeRn$7x|&tNOhupB@}m?XRfLF0 z9yhC0Q^^D&NQ7q<LWB@v5|WTS&vSpy=T1Pewd?*k-|PF&{!uTzF42%Y_ve0p-tX7D zMV`XV2Pq_%S$Mrtg{nJsg>4zQA8UlePs7s^`Tb5<@TB-Cog~}JO?zcyty0|NJ*x8i z(MS@<he>eJhMr!JPu~T<feETH>WFTA26hiX)gWFpj6=vLC8y9TH<cP9Iz=j=SJTIN zyUSEl8BIzdZ+oEj5q$K{hlOa05dxS$#56ule*@YdB`v$b`nKxjmB2v8;zhgiO)Hh7 zzrh75HwxWU*!C-k(9NFFOue`PNGGv`_@N^HGlC;$Sa5`H--3I{fU&oeY@z%1`o+md zHN`QVmwooW0}uI0?Y;P;0WV7l?YG6gYMpl`-Z0BHx`xPMT+$8_Oo-{>ts$}b1o^+r zn18y3>Q_r^HPb~A^RTgp_V*tk%P?Evx60B5aOOQV;6mS>I5(noLu16-;xW}w!ihye zjmq$l=my32uWUf;W-M5VFiyYlxdg7|+gpmuH|!%n-zX_a;o7rVX5h0Ow-T{+CHh9S zTEe*Lo?1;bxfSI63+a#MPife&prk*5W2<QvJ>xoi-E|Jac~!__N`!A@>IU=bsV<nx z3`iG=*WJRm?h`a_9nN#HD0+FPX6K%}1kpspN_PIik+gm#^S?lra*Yvpxk#=bv6kb% zp)Rtg4}O@jgexN2cKRZ}`#l^U0{YTEIF|3|(bg4YrFi9t=S|Wd*@w!5TUzBMMHE41 zF(pAyUV@rh{=FLbOBY$y4W+}doPLa%%r2jSYJ1SC<ZOm1lZewr{*f~oU2pt-Ig<)y z{(*wKG90`u4ggEO3L9pP6B4YSV-{@|TML?{js-AvKCJD*bJGUt25_<ut)WSi!?2xB z1r-Drq#r;Z-Xf^`BjkV?W0tsRV4HF?V|YsMDLu;Q^f$u=g_yNz=8wNZrFJxLn)89f zDImXrYFN<nOVm*dwMLN5VWG1QUIxS-6UPBady9lmfV~<o1xd7vZ3}#(PYV3o&4-}t zq-uK@&;$1aG&|h_dHUM!0P^(65<Uvvht>|LeQ(UQjfcm1o;m(L1>X(5UnuNZb5BFe zQ&H0|U_Lia!+I?O^XI@f1#Q~O0*3k#*wY~aY+euPbernbuO%cL?_~g_oOX?OgWs%- zN(W7{_q!mvjaBTZd=}<;xyNuM9*uqA+J!NpT3{)pzLFMT$5WtPE*~&i?P97UsT3Jb z(>&yUu-!vq#<bRA*mRYvScDiGmgGpmY*ylf=)3%o8!-QvPlZ#dvZ)h?tt~-zdI@;I zoQdsIrM@ULM$Cat&A3Po283>XlWrS0Mobbr$G-^XPJRbSwhZ-)RcAq0aN`%sj=*~V zdWdM4C?Evo^#Se5zkhe2SptS`RcCwd3U&R|O*LM#n&I}>c!3^_yClk0Y3yWQYlmT) zQN_W1)SDZ3N+2iYvt)vX*ajhpg4G0{|7iMNbh&IDVr~RWc(Y`{@PS-MqUW~fJv9{Y z3&+)pq-LScAyf)r?&?;D!wZ<L8YjLUvDB9sV{{rLrf>)>BVnVwotrEO;*xM$venMA z9*|GkcNbKvh>;BIXW^=)oh@L}?XXs3CS})kp=5j0A<iM5tNw`2&lhK^%jKl#AYNf( z592xc&-@K?CtkD`tD4Rpz7sPhwg_hk!a7L8>49HFO+wltT403}Yo14w-}sRFN;q7c zt$;ZTZ78-GNF3JK{lpZDf8^l3N#<W?%wWBS_^H^adh;)a(cInXN9GTyHn)4t?gq<4 z(GId}5cbO7jBTAzI(3dr?-xC))YiwRAPq%_PEJVMNmj}FpGU>#>ybSZ=5C_5AAlpq z_`Av$PkF^)0JCurxCFsww0+>+rCh~Vwl8YJpply}&};$x3w$iz1*Ksz*_*bwOEZ@v z`CNLci{I5NzI#8O0fuf8&Th3OLYePjgC~LqnC%DK==5T4);6@7wn<S<9XBkM_mM1R ziS5fhqCG$!hz&8gH}u{MyMBk+iC^PB6f+>t(@CG;c#2@X0Ggsqo5t-H=E4z!=>G85 zpr6^gDE5I&1ag7k;PBHa$xhPJ43q1m#kBmLkRc}k%1lUGOsWq+QWYd1;4AL2F#mxq z(h}TU1cz`&<>t@B8YM6bcY+i??baF{G;o7Ce$d!eOrDS7!C{_>v`RgZpA4BmJlLzQ z6}yO4{6fNMCVWIzETU5g&L^Avga>1%c3Ife|0do`*v*82y-y#5Md>vCcYnVxba2ml z^c>Ezr<?T+G*>=Mo`_;vYTu0Z9-_&&+e^i21Xqif=)Tc}DjO{d`vXz=p>zB$bW<2l zkr7L}=l*xZL5R%Hp{@rfKD}#!BHj}NfkMVvo3Y(K(|9hP8<8+K(mJ9l%=$^Qt-hHa z4Am{CRh!lRXG~RNz6tM(e6?jba!(JEz{b)e8ba(|H@JRm#&958yTyP^s%djn#_RZk zMGxbggIQIaaR#r+vqPk*m%K~PH}iET;b;kFR!yxC{w6`XJ@bQ&V}Wi8h#TZnE9*DQ zXSTqJc#Z^=koCIjka&DTsuItw#^nfa&>AeI0(wBF(HbM>h<nMKh|8c{D#Hr+`2Ey< zoB7idngAIN*qjC7NZ$9mr}=cP^#`+6(htSW(@KL-zdc%9gRw4KwW)R#<E4LO3<TOi zFu1C2gv}q(;mI2#<5R0KWG*hcIxt9N|1H_hg7jl#u3IpT05g65?a*qsSj>W~f7?Q_ z%V^)DNsSCI!L{+aDFyllbQRi>^@?85;@3*mtSQ3%@|n(pACHA4J2^}ISUmlm5}!8B z4mloa5fRl1cniJ&m>B<qk{l)&gS^dMvB$|d3-!CaJw2FI87k%VRBBY0DZSQYTWZ-g zvE8?)Nm*nKJ5K7$o{Ry8BtI&)=Mg!&6;|xGT!v{*ak*u(n|L!VV&6#XUT?dNdlp6W zFuZ8v5R&47Qklo=j;hQ<bzJ-*F&&1?y_rlS)wBw(z?>EzcTifjpk_O)SW4Df3P6oE zb+mQjGuHHdu>0OQ<})>ddB!K6d}o`a4$lE_1U85?m`}N&A!a}%YoMqZG6zIPi!Q$- zfGE-HJuvj#zqxn#Up~3$ynG{X&R9dlloopfywqh0%4e--yls16X|x})CM&p8ka=w! z;`jqu3YLcTzqy4uE)8?%yqX+!8!aEwWZe&y=ae{+2zhgExU7)-dUvcv3C}b{%IIq< z&Ioo1HaNj>q4x76)_dY%6`K4Br^P$>#j>v$-e2EiS_8LW$Dd`m_*)N0#vSb?zk)51 z#H@weXmCL0VnL^!=*f9oebO)fGiKc6UO3hrlU)Z~&>%C>^*^KdpEG6{ZaxZ4_z>q9 z^~9qHj5&((M^+#HT)Qd4b>#|HUei~Z=&eV4|Jr5LIO>G7*!*5Ay*wGsd-0`;`2cta zJR<g145MRVHnRd)JsE1;orX*Lansb=AN3@ero{MV_L9U`@7vV{yq59>uy@8-Zsl{b zuaR1OcEj#I%nGX9Qn=E_kQ=|+@QYD2*&tj95o|(Ggmv-E%C}+jAnBB~%)B(-U7;Oy zSCDg%^Q=Ky4plC+S>y!QibLf3LJb=J(M@rx%TKS}XfC{wYbO>>fj0}$VxZa@VY$Tu zrMG3NvL&0)=}V)#&=ScMxcP1Sm7+RKws39#PJR>K_!_L2Dj$k9mgpMO1{=+tXK=_& zFNWiS+H{g$7MY$m>|HHIsXp4^7Oe|a%&M8+g&iIa2b4i^b#P%Mf{88ti>lFri5nrP ziAZlKh?=`i65Sw6z7b(|w133-ip=sZn&TRnhh_k8XW|@}?#qEQy$W*V?8A8@;pB*b z%#Hhq7!V6T{DgiIhTR2syVLq09VL5k<##c5siO1;3Zc9$==IcHdnY^~NH(cji>IGK z6@N%~^pJYuTUSS}^obTldI`5c&M?MZSf|SHm?KsH$Z&?by}j~hQTZooPCDqHfVV~o zrfy6D#F=GS2T+&%$=;GZhqy~2=sbuY$71-^g5kqDMeE}~fInk$kJQ@W1%VvHg`CZX z<We*+jB-oA4;kkfwSEO8j;&aIfU<PC>Jn^CPO=Zu(2!@R83%#+`4}{Kp^^l5C-nVS zt;SxWxnNq4J30p#EaZPz!c@4t9>dT89DNtRBtwmVNsV2TPWLg4D|+)@&9fo{R?O)I zf8)Ku(ugSwk)=K25pW~Ry&CG39k(q{bg4dq<A@Irj4uqr=R{qWj7D9KDpT1U6N8lk znjzR=zFEZ+chghSHhHb6()CH1+;DnXe9LDjQ+_CrfXf+PgA9Tlww=sT;SI0G=;IWc z+<vGdoUIB2#--64`~h6fm5OC^IIdmT??=x>@|)zDTJ9T3-&%lfes9DXeb{GeiP$$% zaRc4vT^4cYs0Vt`z%E`^_&R-_a<<)2<;v&8MxQo?Teh0dQy+1wrWR<AQO$WbW9QX{ zQa6V*CuOab(ac?&21%A1zK$BTu!UyEv-2Hrq!YyyB=<;jArOi*hMKZvyn;?pb<c~B zR<3c-zHO77OF{Ql5X$JpFjv1I3wuq3FqDwGpMt?h`Z;;~q3EnnOfh*%n;R3I=G!b5 zt%%#JgUX*n%}hxHMh7Wq6^5f<M+*lPj|g}d(q7WvD~sPi5Lq)y=VBH6Mz8dURh{s2 z*_2&BV=XCR52@FY4n!EuJh-eC0m--||1(>0=D2M+uRMYsCBbThg{>L&dSZMfZ1_{2 z7inOOLTdXH0!h82RE|4^Uha$!d;BC+EaV#D{Kta<uIaiFffmTMek@E)YDjG8MJqzg z<!_eg_B2&Ip1%~Ad&~oRLE7eGFEIx1j{th_*TW*}?SVL>t^!+5_?-*FTz3ji%}RK3 zIOG!xqXwiicv48?WSACCD{bZ{9_J>(%=yrDE+X`x>r+^-dezxf3)DIy2J@ds+xLoy zcbmi6?j=_ziZk6~Fl^PLC^B~fe)zZ`+x~(JJ5YUmDgz^D4sb1@%vNKF3!^l)GeRDv z!Mkvt+DqC!Vtlx*i8m|w;kp!~A-XVg%$yrNcmVFHRS^6oYcSu~h{QTL(hW_jcr0YU z8;&yVa&!I=EIH3%woa<TE748bsb72=-4IZB54?#6fb{vuOJ)Xuxv@A!g(?q(MO0(M zGC2W`kjkB&djgi+C)AIwUFDnTWAxgD!8OR=Y2#`g>0h<Fv=>$vv>%4Mmm*Qa=m%NN z@o-O)!8+OWE!_ET3ZP&7j8y)zoSp6rgf}+B-EksZ$`}I`v)67^QVhd19an3672Ig< zw(?ihL==KM6}$%^j=~u>6yJvFD)nf4q;=8Y2v&bVmxFWW?i*U#jA#gL&{U$#X@wh> zLgb<P!csNkp&rWg?uF?LYw(d!)6A{t6FbYaLDF^&F8M&kw~W!EACQCRq**lcBT_-N zZMZKGkIzI9nD`=l_?cg!ztV|?y_!>f=mGEJ{E0Y~Nl(h|enB3FhU5GN!j{7*-+=uy z6`b2=j>o3^BvPQ}J`b~s#I<UKC<?5Tooil7VVx<sZEi+@Io?#`E^<W_)x=mELY#a4 zJ(cSWbFX>KuYm1qqr=BPVHlZQ93_8sbiqZb@<nL<Fur_2jJ0YimGN?KYxAN&$8frx zQD*myk-sj2kS8)wpKZy%jsp+eq@sSTCOHHnX0~)GFVo{)6eR=E6B;TP!;I<YzQN1% z3=$+Brs*dkIUhH|^gZX=G<@fG!#Oryd^Y{m9^WR9(NA;j+JIEjUWre3Ek;@Br!i|T z@zNAD@uW5Znke4K$P4NfBc~qrhtp}3bGD3|d51fOd>Mohax9wYEbIZiG#VlZ1y9{2 zh>zY!!l+HmxCq}VVoXF&kFFcc=35Lv4e|$q?NN10zTNz!Mz+0$xD9S9gAL?nfq62S zhS3^m=v1)0<qSR{C#bN|r*($Q>nvhh0rAkJG5q;Trx45@7i$>>3dC4{Vs``uE^=5s z4g((h8mM(5klxVBw|wLk@PUVYG{e;7R2SQb(--|%ay$ary|fY!u*Gm)HEZXo$_@QJ zra;FbPAi5dm$<|~M<%?3wRRZcf#>9fkiU^Oos))(AEbFHn6Mlda=FFztKSL-nM2^# z^&(AzHmk7ZNm|P{|DC!^FT8FR6wVR)k{>P~9VfITjaD&<x1rQ+XF1ItF?bEUcj#j( zaS7EHnr?&}I8=Tcr=WefHcZH345%~sS$K@<t+1i{$eey}4e#vc3ZU4jqBi7IwU0pc ztp@}i2-Z=g=|l{vp(PXrXDobT#ZYXk9mCmhg9OhBoOJMugs&lY=DX!e1Dcr7!Z}Wy z^mcm$%h&q2D}hxHTS{y=@D@bf)QYE?hT>|OwWQ_7U|v^(FGts>JxLg$ACsdwKGV{O z^f(PX$f-#r|6wq?IZ?NDC^J@{R?&!1XYL_xeUCPcn-P=5aF_G@bKDCi(h|}NsM+$s z?Kr8DLAs3TVuD%~^sCX#tlXUK+nu3QIm|n}4TNlwRGcuL^JI@{WSJL8{0-NI^z+yw ze@n!)iCiwjMfxM{P;J@(r}{=rb{g+2@<#ulreA}%qG+Tup_hFSYBcAAsT_VHut|-- z##J6=ACXmdScP6cvRIKaNpSU{r(`~dt_q_lhRD(z#PJeJjdd!IT>-Y|>Z!&^;F1Kg zxCY2q@=z8(BN?jjOUFbL(|j;}6S7ip0|09gz>ZfU=H+a<>E-kxW%Fi>+FO|Y>hzB^ zNr+Gnn+Nfz?|9-W{cE&PdDej&e0~dg>LoZ>M_!15wiA*+2y3c!R}wc$AiT|ovEz~M zV2VEj<QCLhjwsbp(QUd!u%>HX1g1xJjyG>N_@!uMVyE^1WZ1atLMs0V)qiVVnoBvG ztMHG`)V~3FcUeQE6C0LN{&kfi&CP!umJC440+`?h|A_T<ox{r+(UYE~rbD5}lw)JW z{cg0bq(4h6=SV2v$GpydT<A8&`k-29*2_w!G1DeihS@%US`>#)L*^l3u|=fastyCg z2z`e~E%1gLLHuGB5R;=KumpJ=o77)p8xk12qI*~zVtmmas*8W$S6N_DjGKPAg3Q8C z&?WTn>)1Uqtq{aNk}^gAE2ae{e<)OFFecLFwVnwJ7jRW7IQW`^kpgYFOPruN6Xq(x z@E4n1ptL@anF70LA==yPKW<!CAJP$BTcULt;cZgCH?NypLDo*WU|ZRQED-T+rC}SS z7oqiZSRu(HVwG8=N+&6oGQF_!<3OYFycCH9r1bscl5{qCss|DBL1na{$#@mkor6fk zt$ZPVulN{qEwS`1UV}_8Lk-S+qy3G=OGqNv-UlItCcLnLW`1be`w4>RI0Lyi&2R3D z<~;G~?a^a&;@T)4V_*2oen1U#cudB?emqjU7ydKhr)e}b00*an@t4zri7s*WAy|bD za)ur})*K~DWb6WDMjb=@xF(8wo~LkIhR)lj=kaI0hV};R2nY+|YqY0M*8qPY4Bj<t z`opMV@x<pT770Fal5fvj%EH{8=mNFRg;tO0G+b0N5?;V#%<rk|Yr5isM&m)y+DJxh zhIrM<jG&nGV8o$#e@ce!HYcbUf*0JRMbV{+kaQOB2`%9DvPbO<2M&g@JnX9tUKsWp z>-NV>*gD{sgG4+DJQAL}(0z?72t1_AJ>)D!D$<9rRUbi#puh3l%(Ji=eu9vCaf^DR zy0D)gpvItjKfVP=vH0Q_BfhORUBrsBGm17F(f@7V5A`k~NLldLiB?$80Hldz^<o?_ zy5YS>x>4dfTa*LH7tL8*@Ql;@!q#e9Ge44EqheAC`JZ6A8Gg+`W7ZbN2$uP~tq*Q- zxH!WlK!08S{pxaMBG%jeK-EWr-_+L3u;zEWgfFjuvrp8Yx9wYZe#F+MEy96x&vI7i zGjIdmRb(obgi{K#spyHvoznv(qS(BGt<#TI%Z2;sJ_~$%BIN(BU@MaD1Rb9o)@DZL z8zfxRd=HQII6h2-0|Ev{JA0&)@Kr2b(+17KKrx-x2I*G-QDR+yqTeg<^-&9`s4Dg5 zan#QxGQZ?@>gNuu09fF{5d=G174v^U)mB<E4UA97k~rdOvlZ@|EU&8?S^rgRLLklX zGDe3`qIw<7Zd}1OfdMp((r2Y`9JYJJtJB2`ir7gBvf14V{xNew&`H<0$c}${FtI|7 z3@TGIT-x)sFsRJIWy}1Zao<0{Fe>b`_XOT@VdGQyqXuth2}f?TZDv~UOuYFk#5J_X zF{O==3_mZ?sa@pY%kVF;<W{LF9k(<rSXn?+@Knbh+RJH~ACjHMuvmoW!S2hp^E_Lw z@Cd*UNTm)wLxqBZ>25A6Y(j1X7s4Yyq}k~cW7z?eBYL^dC2&=Yl+4#zXTyh=EfJ(} z-RBN5@L6I%`td$XkdO<_uS6f+V%`3u*8fdG;&B=ly)y%L6!HGD%BaJC!=^yeMR>h= zf58K=?ugoIxfcOQyh~bq5jMzmO?;Nxv8_8Ca7==hz?{-xtzE3?h6hvxnIZTLYP;!G znvp3k&w#@XaO@PM_Ctko28r_xJsOoihiPx?K}f+KTpN4`jsk=AWVDSwF6ttJ+2*a~ z_Bu!{78Q`$vU3$0Fz4AF-!(?b#u4~lP&@(WgU>M==qX52YrZIx-{D94iYsv0@QFZ3 zXOC$e6#B)pNV~<bH2YpfG7c<=jS$n2JR6}Sm=g*dpe1(W2qy+HntY0Sx4m94^$K%= zA|yCdhD~SD)@$C#c;`tDQe@rGAH@#1|HBlvIyxO)j7Nn1hy_L%<3x%mJt3Wp=bhgQ zqn;vP>CVGqRTp-!lDn{uHP0KTa@<MZ=(=+gYm2J;R<vK$-G%I<`A>@5;Y;u_mvAyn zJZ9*c2AZ){NN6k-g73?CD&!Hsml(Ij>+x}g*L==TH0U2^ks{q$?r~T>To1k>pXhLj zt`lYhlwKx<Cy`YaaXUw}_2L7Y>B&E;S4MKrN4#@!_vu0(4qK@heb~&5_>C&>oYqOC z>H@JlW||A2$1<{c6=d4bCVX7>hMg`6{-h>-J$jY=hN9orYk<|PyP03cgwO+)<4}*u zcK##i@tJZ@z!`*?k0THZ%c1fu)Eg+zt}|iy8Q@h$gTlRV#EIy@4nQl&kSbn<j3C8* zPEjr9o(#<QXmaO(e(|01CL0)a)7*yrQ{;wpA)<++_RpjDVeOAR5*|^XDrlJ<`A8M< zwd{Z{r1ZtZ^0DKI%Yc)2Ap1RgPG@U*U>bV;YVJ~-e*d<%N-V_DO31`c*Y)Nu;=%GZ z{Q>M4!O`eVhtctXAg1NeChUc6!p+VsoI((K8L3ru=@=FvC1L5G6HeDMhkMZ)dSQsX zkHDcma*!g9Vunb12Yoy6<HNjUm?zb4LKI4<#nePt(MUJFU$p+xm`wwIQbDFUg?)5K zxU^)5>=I!M<H(2C<e?jq6<|C^i#OAX+0ZsOzXB@10ft@RMT3DjoWD#m&7-?~{Cb*- zDHvLr52ctxJ_t+Faas}21`@YNOYeohVvM3{9=wGE$1u$8<aKbh9HdfpDT1R}J>@>Y zR~=DQ8s-5$0(0$5#XvGePOP!+9&Rg&EZ4-piudIwtbQG6z%9;^4Hb%Kzy>`oR&DFb zcKdL|z;D9Kbcak5ST!Zr0e=P6Lt<evhB!J6@AShZ3*4V2o|Vb25gR%{anATXaz`>_ zze3aA5Y^LlOJo6oE-Y&lTbN)ZgxN(47_++08)KE@|DNioE|Y?7(wkk#1_+lFXJ7EH znW^S7iw_@bFj}o>Tls9<Lb~}zoDSfaT-g#XZ+n64!Xu0Afzl5_tdB()T#+fSc#kee z#?#hnmfA=}xMOCSP*M9pC<WaX)nW{rwOst*`UkXnKJAHQtPyq#O@65)V2h<mOtI=V zbY~-Cs>;g*$Xn#kD{tt2YqS^8j<!-EZ-J-0*#F>t8>hqhT)Mkd`^4Ab__VLNbPl9_ z5w~y|?k!R`jR0f*qDP23+qCnS%9~vlm-{@iH}we1h7J8f|A_qrosQ5%E(9Y~-<bHc z!TzZ!1Koia$DE=ab<}hKo=wLOH3rbpQ&WWLJ5=ahVsM0O_#{oI;#{<1?BZa`qyLQ) zhUJg~UmW+sCfbCL!hFh(%j#2ZG)Xi1*#~OnregAxl(=H$Os7yt-}0N~Ci7X_FV^h9 zZPT6*86wsByWzRK$8YKq3>tN-goRxi3dwaidCT~n2TAp?*`~f%FRu#riNT-=ttfs| z_ef<fn7+!WX!Z~uR39@AK))#>4vAOT%o3YgGJTp@?Lc6Dgq*8>i5B&Q;Nb{ftzoVo zCYx_FpBhF4^rEcyhz&8ff7I0Y|AZR$>eKX@W7*BqYwyGj%M<mg?jPlE|0sX^|5E<e z?%$BC$#!P6j@j!IU&V@+U&kt1YQ3flm+<#vLfnkUH<FVlDIS*#q8$=G=y5=??G;g| zk2Rr<HCF$(XzH2J<II!i-HJkmL(5*ORVE}oBzO;5_B;%YyD&*9W*NXs`UAqzkP~}I z4qW@-&vUERcW2Y7=eY`a@5%fxGaOtu^p8lRX-tW@Ej5@;8w{oJI+}j7tR)#|m4)-@ ziPwDk2pUFaMak2gqg}$quxE&rdeA#k5EhQZG8dm3bd@$2w+c?#)+3wl@$zMjsl((- zU>~YJ5V*F;R>qfG){ZN!#OqK6U5+4>ahVuwtsKq7j0O@g&UJ&n+drjDv}qC2-#?{P zj71C(T$*9)Z!DlzR?K29Uvq)GU!CfNA!)Vxm8Q)j96MrM)YX~903y#$itxcc)^Ob> zODtSx58kAgI%M(2%+ggeUn=qznd)7cw!e{r!J-v`?#K4h185n+Gq?kNe4`QymwGrK zau_<rYlh5)8*jVAX?!eu*VIXJW1?A*&l}H7#&|^g8dCiNHkKn=3K1(9kid~O;q(;N z$2W0ANA*9Q&>5|)qZecG`>*wqAbu}za!Z?|J&nj*wnA>0iMBamd#XD%z^_DmZQy2i z16e_rJu~0=N&UpJ7u=_UJ|(!`T;y8UiACnDD4eyb-+iz{+7}a3oZkq*+D0|^L-Dt4 zKIjv>BKmsu2#%tRD3-nsC!L!_v7KuQ%3g_F@$n*4Q~sUmYtiUv;54t!@on*qgqPEL zbh>h_#&(-Wb0o$Ud;b)6XBgU85->h0A(Q1we4neq-yCaV(Z!oswksJ@^u;$otRJnd mJ3V_;Pf4hhQQ5!UIs2-L&e`((J5|yOim+D&&|FE-`u+#G@;__< diff --git a/client/resources/hardnested_tables/bitflip_1_046_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_046_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b1454b4e802e0f6a5fda39902d7377797fd6109b GIT binary patch literal 2351 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 C=moL> literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_046_states.bin.z b/client/resources/hardnested_tables/bitflip_1_046_states.bin.z deleted file mode 100644 index ff59e74099cad0e185b4b240c0a7d5e55051a675..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18495 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 diff --git a/client/resources/hardnested_tables/bitflip_1_048_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_048_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..99563f5db7d28436d7c1bb55872686760a75c4c1 GIT binary patch literal 4419 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_048_states.bin.z b/client/resources/hardnested_tables/bitflip_1_048_states.bin.z deleted file mode 100644 index e21985aa386214af1afab6d3e593f5dd8ba3068f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26711 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 diff --git a/client/resources/hardnested_tables/bitflip_1_04a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_04a_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b31851187c14f4aa24da5418dd70af61e1c18302 GIT binary patch literal 13641 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_04a_states.bin.z b/client/resources/hardnested_tables/bitflip_1_04a_states.bin.z deleted file mode 100644 index 45c58fce2827dea576fb8621e12ab6458a9e62b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43565 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 KCYPh3lK&3;_SQ-O diff --git a/client/resources/hardnested_tables/bitflip_1_04e_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_04e_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..d0a946c4ea8962be0c61cd50c8a53e86f4c2011f GIT binary patch literal 2913 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_04e_states.bin.z b/client/resources/hardnested_tables/bitflip_1_04e_states.bin.z deleted file mode 100644 index 3966d1b1064ce602c774055f0f37879b3c117248..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23874 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 diff --git a/client/resources/hardnested_tables/bitflip_1_052_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_052_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..95d0d7af7e9ca9daefb6c8ef8bcd81ab6b1146b6 GIT binary patch literal 2732 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 Qj_(qUsrm6waw?nu2kM^3G5`Po literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_052_states.bin.z b/client/resources/hardnested_tables/bitflip_1_052_states.bin.z deleted file mode 100644 index f0be53efc8fc89b1527c0ede596b138259295129..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20931 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 diff --git a/client/resources/hardnested_tables/bitflip_1_056_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_056_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..92dee0efa573910fad767a32aa32fd14d1de51c5 GIT binary patch literal 1540 zcmV+f2K)I!T4*^jL0KkKSwCvC4geQ#fBo5;fw%#m6&)oVfdBy*02qK-;Q#;-(SQ&b z1YPyX;0wP1eI-bM0;)g&000000y(BeLna7l!eEUwXv7UNWMBXx%`!3>FhfQY1Zks2 zAZe2$009nZk&wxP8Zek6O&T!+Oqmz}2y;w~hD;FAguxnU(TEyk$iM(VsVNln*(BLL zQ`Ff_sL;^UMuDS7ni^@K(TD{lA|fV4)EiS|%49uFrlIN$05l$>)IB5A{1@S*kWaBl zOj4iiic<eIDwvde%2_H|OCut{KA|R843s`2DvTxwadDZ43@pD&?MsT6*N89vB2Z!Q zs{CPMe+qtAAC%#bkj^H2?BLIlfyc;pI!=eqJi1*oh9k2dDcJOMcwU2n>U3OR;C-j> zyLLTT&-fX}cwBLp45t=ZSu)GuSvarEEkv0LWJx;+#`!!>HzN?nkwm1t^;f`sPq}}( z>3>4)JgUWm3_c^(Jx^fbaXl6Ak8>Xh$J}^!F_o}hQNlPG(*WyxoJL~8<c=Y8QAtga z&Y!_!g^fBA@$6tr2|}6&(D%6GI9SIA3+O%PVfe-!zY$_*6q8Am(wT-d=1;O@PISa# zK99P7!{RS{>1CLCTxa4lq)+ZXGl$S!r{2FqkI?+blOL2YV(rnG6xU=dU?n9eq>|r{ zBkGz{3#p*gS|zC4OARSvb*D+&4Y!qzyipkf<8)^*qI*-6)G?;&i;7z&`nT4cUjoMt z4{~(*pHrdHi?a{rKTw~fzB3se7D3TCvP*?A{OhJ)NtNo%={S?Y<@v<P#lo?P|4-^O zJh&fmg7Q2o$#`DU?R1@#V~LcrBN$H0u*)uoN*=5x88}`Ki844>wOyYAIxE1QN7^Sq zbXSt{aJ>^1=)Y{nF)?uVk3l%A;ZF+Sabac*vSTk%h{^JfCR|q*JO%C(E1{JhjE>&I z_NuXa1H;h9OyjhNV!Ww>!xl^y93G13Q>4mMiv9tRu@@%dX-@hz&q{6@$h{@xE=Iy% z3B@>KVq`oRp5(;%&$T=+!G#*cp*{jGNxaIY(TN*LEJF;gD)*xK-?99U)Z?ePmxP&L z89`zwgY<H>4@0DPlc9x6%aV=+(Ajf3jx$1;l3G#}jOitWxT0rIvGX|kUt`0`Jqy6g ziNk|9vx7cTm+_RZ&P2j~L|CPXS4B$|VSMkQ`$ln&k72@lS=ou1aLcum!7*G|?U|jk zi!K<tGU3yUEODGNtj9-#)O1cRjwfj1&KU4;ILcyToOZao4%|CslMcpHvm#{jQ;IGo zSu$Ru986YMl`yd}IGI-l4h3c5F~o3WoGhc&3&5Ed-ujsO%&f!IxUM9{i-#Oz>pNUH z;c#@ja58bmQxn{HL!jxE#f}z7uudz4S!I(ZPAe;k()-IS7{)jwrG?VP#v{Obo~6?D z8BW(o^e!idf#5qZo`-G(^i#^|#nF?c)1c^`CF<>PvZt|BvQ8!$GH|XZ7Go1ElPiF- zTp4AFiIT8mE+Z<);>#n9F_u;`$jOFS9^>F%(-#SzPb%^g738>Lv6C~h_r2rE(HOxv zt``ww6nIYr<HNw>%M3HAb`54`W?URDE{t@#TrA9Sabd<8#{-5lr$%Fp=szH(DgU}q zq`w8B0v|Dp0AZAsn9OB_z{Oz5U@S~ztXP>yvlUgtQUV`>qaiY?tOap}DNMh6AAv8l z#aOZolCUhIU>Jpz$}DAA%OYiEm11RN%#19IE*?;&c~MEn05}(Gvn*JdGRn!4uG}~& z!P<(h$d1QmF=dt}R$^vZWEq8-Gcd<vv_(5kGZQhDgvJ?`GMO=CVzHRaOsdSL6DqFK zcB~zRQQAq`jukkohZRdWvT-LAn57v?%Cfkrz_2mFIl)tkj!>PL!=)9(lEON2Dsfh% zR!M-x#lo%>;<!<9i;M${i-O?6k;ert7>gL9%PN^NrD2l8B~g|Mmkt2n!ZVA4SYb<r qf?<VNVKIePF&To)jtm2aD&s2S1~8bxEHDW}{x0N-aG@Z6)n**Cd# literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_056_states.bin.z b/client/resources/hardnested_tables/bitflip_1_056_states.bin.z deleted file mode 100644 index e92d411b762daf008f00f23a650ba966377236c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10868 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 diff --git a/client/resources/hardnested_tables/bitflip_1_058_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_058_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..ca2fe1a7a020fe5c20f77e1a395d16e40e0ce975 GIT binary patch literal 1573 zcmZ9L?N1x`0e~G0Huha0#=hgmc&TmP3@38eMVm*U5O+Wfo@p>P*UB5dAFD<`Ou9`L zN;0zA#z*kstVsaXt!TxoW2gmow-4SlTKl*oRa+@W>LglK+tKxdmH7k7SZLnp_`K&| zc%H}d+UQTo3$NBYUj0d%y-;@Vv+?}>=1nfPgvr!}GM_pS56EOwg|cF)^q;c-W9LT2 zsTuvUChCtW&W&c_cTQtB&YdR6<!;}vJ{c9>Sa`#KqvD*r{^f4t&*e6Fba&wgFIJEh zqZJ<A>{Rf^kE79dU#$2|XNI&6e`G+is}xf1`v5h8UQs_adt@5=$C=1HGSr!K2BfuT z8iVPWtZRQ#J20=tt&N9gVA-&thKkCcLS;iLY>khr$)2xl-ezStY=dAA9i}35D71H> zt#C$0tYii@4PE2u>VNsi%*wB-5Ig_0cmLwSWo#QlQB$~FO}mN55&TL+K`u$9+${>t z9_ZNRND^$9cbNwdW%)H*Cl&8o%7NS+Nc->V#jMw%&@Q!i1#;!zVEsl!60fhB%N2M# z`$)dm-rKIc-Cl4g`zy(b;BqDMrB|U)?RtAUb0tdu7**YOT%$QWThNAl%WPSDAl=nS zf{%zbKits%w?qD*rYs*j>M*irW5bumhUH&x2?xKtbNEvF_hsUgkUL*WU#(eqtX!<( z4tlcJyPiOMDL0Oqro<7n{PkUL8~Y_Sr(H6;H2kgUfZ0kdKByL$F&u41YUGF~Lu3G; zCo;%`g5#zBSi+EVLW@qkC`5KQm*0%m3P~H3b2kU6sQ%lOOP}t>n_5c^kCm}&nd6ra z&l=tjzGXQorR`IZX}K;;*<8qdka9JNQ%P!_Y5y#EP5GCjx4!URY54ph@<{nf{#mL2 zdNRB9`S{($cQyHkm#e=yI`jPApI^Gb(8Rd??uA|O)EBqJ2Wmaf0=H9_F8SiUbKKw1 zTAEr<L=g&ZhE#r*pqsHsOvp^2I1mzHmnMYaukbE|=$}>)k<2tEvJ)zhBwZ#T0-MbW zJR}tX1QBh<=3r`ehYXcTEV14dq6R$62$Ko8wE+f@v_A~e`*eoeA*W&Hl`Ewd=DiYa z&=C|?C5EPfusQXyKK-6<yINUr(27$Z6`9L#t{hn1hzrKHAPqO)P`uxxRNmSp+QRk# z9e7iE^MyZ%`LU+w{=mb2i#UnGRD!&!gaQ(f9@V$V@=VIEod}B0Sw2@KXEQt&nRybq z+tooHRYCtTpS5g-zJtEljK7^Y-x3t~CpAC%(}#I#zTSMzf4@iA_#;|U*<mn^2WGM{ zz$Mn$ArEF?<V8?0x5SgJCGvoHB9{qMu3ECPj+5X9^?YTW8)Dr?RW_K?<4)xJuEu@G zhhhC5mE@#2YT`gdM>B~e9gsqM?0L=brh0I-e@}a)x0yoJ#iYqkSw8-)W0FX$@abq} z1Ekwlt)zNObn60^q^Mr;1(8J6Hp^PbRZCA2R-=jyh@{h(CP*8O8#O+H)XK}|{9L?| z7l<T=UjzvN0Pezx3^z%F+ern4h5OEACW^cDoQv4O_?$gd<Sm3P(`@6MW1(LnR*58y z!YY<+^6;y!dfcd@J+nLrJ5Msua~^^0MnJSNgSiT$h(jH3OenN!7o?8(o!mBBuLh@r z;vlge=~GXuXA{B10A0+_reXDZlB6-4L5QQoc3FG`1KaRPH5fmF84*ql5n<GjAn-n! zKvEu>tfK~KtD<Q{L1J{P?gMrZExhwOi`$DOTOUG5G;=dIu%U|y17e+*JZW%JmjqZk zIf?BcUd)u<A1X)@34R%ZM^Kb>z$YhG8d+YP)`{1PIB9(?LpzE>CpIwZcIp)8%&0uU z<Km5Chc=jBHIFQI(x%_Z6N}l{hO11W1dc^VA!GMd1^QTb9Z2bIW@ibDEf?|9FJ=}} zO&~J#vwW|}m{vAqfA5-X_;nB1!Ko@JNg9`glx>iSn28pxn)G2Qcdc|Xxiu@@9f4a_ Y+nO=Z^6CEf;@7wAy4utCw0_zD0K{~8y#N3J literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_058_states.bin.z b/client/resources/hardnested_tables/bitflip_1_058_states.bin.z deleted file mode 100644 index 005459173506359530b9114445a5da5ee53de476..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19459 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 YqEo&2zpVQIe^9-6%JALx&R@Cy6I^?s(*OVf diff --git a/client/resources/hardnested_tables/bitflip_1_05a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_05a_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..2771dced1a435e55080a106988b46d78dd04d33f GIT binary patch literal 4469 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_05a_states.bin.z b/client/resources/hardnested_tables/bitflip_1_05a_states.bin.z deleted file mode 100644 index 1dfa63c7049561e4adb866f37c74cc01e9b11f2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29724 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 He#-YxetZ=# diff --git a/client/resources/hardnested_tables/bitflip_1_05e_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_05e_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..94c8612fd3d3e38e229b7568d5f358a385055d60 GIT binary patch literal 2026 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_05e_states.bin.z b/client/resources/hardnested_tables/bitflip_1_05e_states.bin.z deleted file mode 100644 index dc0789685e2c6c56ea2295e7528f09801b89deda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15828 zcmeHue^?afy)Qkz=cf1eoX4hVV~o*l>&c<1F(e_z8o<eEl9I%<G_eU$#L0;oRH9ph ziiqr+oSxojQMbm(#wbi0LP!q6R1paB<IQOlq9_wUS^4FptjmBaY<Fju-TC!??{`3( z{&?;=&%Muc|2o}$9zkYy-+5==@Av!p@qM@Vj}I-~=S#hC+fNoe{Az>8zu`-Nv*E5# z>fdhp{n}sAv*Yzo9r%v8T{<*tZPsH4hJE2*LzIFPR-kbR%)VX@WN%CusgGK*-c>ZB zb|+bVJ#<qyc}XWOYI<OQfDWYPTiiodotF*;&XUPU6AVG$SsIxQrfIG&_^t->U3^Da z2eFa)6hA32VwW7xH?(Sw1y-FOLdIm;CXEhB6dD$8Gq~fds>L;K)WKEgijp5$M!dks zjnhe<b&wE=k|I$0tip(vsRecK$yN;-1GGHUQ_DW?if_&uxJae5(4}}cUNgNX&nH9v zn;=}^D!jyOEtkZsYvGyIOzw>t!DQDeQ?Wuzi)HQ^i#)&z6$n~J)HL__h$`sN4FynD z4~`FE*<se@73YxU;7MT$lhUB{80(k|--KK6-7y=AFF^4U*l#f};K3v|&+2ws2O`ok z=pf_J;Vq59-wnYUfX|}x%{olN-#5cJ)PnPK^Yu_ht2RUBbkJdhuOlOH5!$_S?3kA; zv>M`qDLn)tD9i%|VfgOl=WowQ)tMMP9?#sEsvd~sT!r*=aBVEOoJso#w-gQz123<R z!NFCssnq%4DmM<JVY1C46_(r*fUo#@$gn((R>u+68|BAhd+&ixa@zn)55SsSm^TQu zUb4Rp`U0GfZV%COp(Oj>n>XH%=oP%4e3A4?<W~?TTg;_;o*OO_eBR0)QVg@<<$w_y zn8lGuVM{-G_9SeHM5`egX!Yh*?p8Pl9zp^#9nmWc{vvFZW>jq?O9QePY!qN-kwx65 zco$R)q+pvidkAkvEqlaVW-c{xVA*^<Dt0?rhDm;Eb};WHAMw#fAKuR@h(I;j@3M$R z{Jfr5O=|J13?tF%CovjMvL-+?DDAza=r`=@sG1&H<)xib?%3VO48ZjqT<dqr10}Rb zoDb=O9NXrFQ&oWu$o0c4uVXm~$6T#jEcH`wnojlyAV;D*cCNCj6mLV^N?$^PeHQ;V zt}d^O1jF(xR(ql%Keht8UbH%@WT=jQWsU?r;BoonmH1T6<eqqbeMlZvW~AQ%YXaaM zA(Bk$!})bOZ{k&(&a$|`1cPTvCp;dCe?_cqcRV?KFy|CE&jWME#75Vck*kmu=V0$O z(sF?H$Dv9Sz7m3Nt)aw%T`K9*p`Tdte%0I628Tu<3a`ZA0%`1VTKt42c8BCWQSyW_ zxZ3m<nvSb%Mk`xv=$s09r^&oF*s+g3>B~s2f#Zw|#^D;1zu61LP)uH`0Y~8H`!#OZ zylKqCj*iWQy$4-d5)>*_b>}sZNjQnoUtkb>{RlChgyGGd{CG51cADO8*0S}kA7;VU zrdT#yY%&X()Hnw3vBTpU*N>6?gvBp|>>{hm^s?9{@KbXpECYJLr34p)Y;hTS)-|Zf zCUZ6bjndPa6F~7xj2Mt^kL<0G7;N+L2F8{bf&-Ap^0W1v0T51t&%|}0b3d|jfW`%U z^SyE29j4Xln{X{g8LZT%!d7GlSaZ}K*wC~t3Fa2D^^;M)6E>zmN{>d<Cg9Lj+SiE- zQz~@@f_WS)2ic?=QDFq~dZAB%vNYyNgPcJqpN?AtI>89_Ynh*@T%lg*fm)w@rvi@^ zL&NvsHxW}PQ(!kJOCa4+%yflf61t|)G58SnkXO9W)d_QVuto(Q;Gx2z&uRILG(}Q? zH-tt8|G>Pe3G4nON@=<^BOxK-oVbN4%S~MG1GmTYzUVG^j9KLsBx1%=j2VueWwr3o z3d=KYuD$>ZB>uY?ha$Pa_-b~h3^JFJKzPwfj4V$R+?4QYNQh_FnC^(#Fsp|ToBukh z(A)7K4uh{<xe?|t;KlP~uEnIznY9c~`e_GSWMI618Bh4ycbMPgG+{AIdB`dk;HN2& zSEn{S*^|WFlf1zNOsc{w5(L116@G0suna?}WBCmKS`Cj_+&?nKgvPKOhZPoYaUo)l zI#LFFNuDp=9eOe(KCjW><}hiC1PcelL5))?dFyqZ*F4Y<>-=^o;b%_4(#xPoA;oj& zMAT3E;!4QM1dDqDR`1xiga*|?lDrSjlfSXQKH=W4D*PGPT6_S?d&m#9<qaSCWsP*= z-AG7yVO1Hq3({brQ=18kV7HD>BcI8dxVf9tHL8=VT(}<kF#FPwFv&R~X@$NQZiZ)A z9Y!XWF+sN<(W@mYpB@r(B*$XitZ!>+jngQW067DE2AGRkvxeu6d;ptb_2bU5sJkDk zE^>V;Y#4K9vmeGt6poVrp75~AgEub6lXz2RB<ip)J|UrCgg9f90fD&W#DM5t0&$m1 zQBEH8L#w13SVn&=CHjM-sxi00%!17>ed$?hP2JcN`^dgM+%JKj4_H)Q${@kGvse@6 z3-sBySw{2QIFEEgv}m{4ph3a)?DFY(ozuu<Jm>vMQXk?yhOBer+_DQ$?IY#wd|1}u zS^%U8T<W>-rRhsd_<s7Nl{5*zT7Du*&caU3(ZZx=P{hgL=Ua=}V`Hu>-Qm@g&(=uv zWIDt05o_6~C245~$vZia)U9&w2FZi0-Ex{qaGK;iPUDz1%_OI3-`s?IVKtM@n^YN~ z<vHeu4@|MeHKy1__B_moocBSA&4=rkGWFx*rcE(fsh!)h$+GH#oNguppZgeOD3*9- z5-|`9wp*VK^iLS>vW)jkw**f``AM9Z0tf3AUfw!R6(Ktnex3&5Z9&8AxNPw^zW(!* z$3=323FpeHGwxW<(%^9xI|u8=9LE^f&l~~4m;{7b;m_VB>n$3daT}J>*^s==^k^DZ z6+6qFhEw>yzYP+6;0dKGm?7?io_}T;Kz6bKDEr8o4X_tVA%{8cg#(!DC$*$O%sw8> zP3rsH3RBWRJw^87NjIJVuE7U)9D$!4cMWO|OC>|YS76T=Xx3To#+Cp1&vU+j5mT3! zrOjBEHBbaZ^!VkV*n-%OdxGRv0NI<&NO%y^#VkU@j=SMN8Z0QZ$c4+7CyEB3U$3lh zJ^PO@vRE@XV|fE~zzWLA&%n$Z<9t-p9(_LND6A~`7s&Zom(Go~TQqo<no<@BrL4$( zm?1{-)DTziTu+JcMl2`ByN(V7W#<sHVz*iyYj+nxu&^n-C4#ef!F1yLlU<A-vE(p9 z(oFkCt(&@)Z<24ZIQ>U<={sy7nXNb7nxKx5C5K=cYagMElrb_n$wP2EYkJRo8{>S& z%6yjCqtk0D{}GfA!C7i2{-SQjeJnGX{o5Szmsk$2uReP^D_>LH*C0`xYtT{zk64)K zb4Cu38YWmE@>wwBTt9T|WDOR4gb&3}<Ic87F*M?%4&!6S*Q*8ig%&qL&chiJrCP=~ z--=T)@mlP|H(rlMqgEj(<Cod(cN!#DByBKb`2=(s@S5ugd>fLnj&zIg)f?w0B$!K2 zSX?g`+uD?W38q$@eeCbtkb)NlYYxGeY}{u#R<i*Um*bxG2=YE>i`Y#edO3!9`7|!0 zD6yB(s}HKA<CRUOs>F(+y#tEe2O#-<BKt~6fRi$)J|l_{4C<iEeukwutzF=021)Qq zNlOP2W*rYnK0{;%d4sh_?kIA}N+Y~<2ONg~Hg&l#+}a5TAaH9Uq*ub8aP6ke9aMFs zO&xu;pn!>{bO)SY#ZF`9ewTTfQVRJj_edmm57>G51S}8yM`<`DriL;Q%<Lb>yd^RL zYySb4pEoMarKH~A^}VD%y0s`C-?4mznO(tXJk?z;QREn2PH&kDmtS;kUH)PW_?AsK z^Q%fE5V`|JZ*cQ?%vLKDNc1DrtqX#F53pWJ&PQph_$;idW^`zvo>oMiV~U%R5Z$iv z%h=K&borfIAQO`EAp<e@b=aH!uaO)9?#H-Jdc{OI2BY!Hu+#J`W{%&nOiTlae&HBP z2OeQkkOdnUCgTt{E<|z>jUhB|0woA+MMmV`^{R5oak?-Y9zu+J{L}>GWI(IuAT4rc zvB{Pi(}A~tARBHGYmz`b2stas8jG~)T6a{M$Hzut!BQOlq{YmWmJw_)WPi(Kj5M<@ zFye)Ci(ErzC!jkrr>J$(K%i3+;GXnyk7oT56i%Fgj#V&*sqH1o`h3EnHd?zEo<vYR zo<Gh4>wLn?7WA7z&5)jBHP0dH+>P(^w;+JdgATwXb=O?S@3v0HA9<oVyeFP>B`nXg z7J8G4$hetNtkM0JnBUFM2C@)t`8MMpg5Klc*vyi$5HE?4@(O#XKhE`-l<^Zx(3A4@ zYUoIVXCGpRkFlinLg60R;f6<s;NQJm4v#mS)Wn^q;=B~fTyL&#i}Jmo%mHBtntrQe zX%0z8qjsLWm*%Ji^L$*3#GSjRU-w)albCtnW{qsqFOm=79Ql-txi7H}Xx3&RmXd#G zB=*C%puG(8Pe&vddp$(siBpR`!MmlYy&nr#6=CpD@a{e)&Q*kiM}$SX8Qg=jw|b`# z)o0I~Q0Xc9ibBJ3gISEh@~9<R62ii;dA=_IU1Rx7)HAI155ht<>tVBDJ*boLZiO6o zgpzQ1i`GnBXCF=_nGg1o1sz669I&EldRdWc`S2<(MIs?nej^^MRc6d7T7v9Ag0&@j zFwnHo$l76*Ps%FP9Q;e1D1XYtsECzBMqb$YV`yz(0BuM^r)M|vHq2>+c1DjqDbd5@ zu?ECU$lvTVa&MmL)kv6o(o8PY(>YKMXzuv}czs&NFs#G$k$jG%fU`y;79F&>3(yPx z2`F8{HnXLdbo`oL_%(BU6Hz}zRYZ#YKBzUwFv6|rp%W51Z{BES1Qq_J3~mCp8rBNU z1La|IN}Czjwh8fFZXIz4w1&ED7~Yn|xtmY0UCo!juUinc@{4}6sYs>y8uujB*H`ng zZ0)Auy-*v4@(P(b262kZk;H4B<a#oU$#<A6_DzlZaGB-^U}AcKW#VX9hR-AXL8Ln$ zfB&KeV-me>U)iE(jMV*Nkka5qmER!pM)NlmIG{0Z$B=Fugcmg7WpLhr8&DT@{{d_S znu2OlVQeZL+p~Q&uw$irYnv{uy(>=s`%yS|#5D*;jfo2|3Vma8?4vQ17xKq+C1-r| zdhM<PvP~)@4V!=!7Bm0xQ#R1bE_g_H`5pIS&R@j-`B6wxnNuS!Rt0(O+zFiJFgeS8 zjhOr`<mH=Td=@;w+D)lI<%Dx^7pzu!;4*+K#Hh<ph3scs=W&hRRFeV+)?ddZT@%DF zBXxo$WA59aY8JV;FY`1U1*|d0F8~)PPA(%qePFKR_vXAQuGzpAKc^!p43@$nfn1tr zbq!#Wi&4Xd*M(M&sj|SWp<k3MLhnjCX|<7!UQ#lWb0R7>6v|Ptr31Qlf;V4Qxb$_f zf`i5rETEY=<H!q<RoKiEgg;}REXN-kRVxBkHa8I+g1id41!ChYrk^g?$}@dk-IjMs zZQ`pNt{sCS843H_x^f`Exnz`}7HrarpNC4<xLG{xt)sC~LwvBPoX{RVmI|L}iJe>z z1p8s2_aw{Q2xJXZKBlMhbR?F~JPK(<j=4NQuZ8#!PBTQCLv*g63#()hbi{Pug#E6u zOn3s5GtY{_GMiPBC&DX?AJF7a6<Etb>{^68!*Xl*CjKXYs?B-wQ7fZt3bWWcQ!tzQ zP3NhoJd9!2fjLpIHHQgA0KxWLh5viW7M8MYVaam@W-egzu=z>1N_Lb%BA#kGqJruu zg~_0|R)F`Rk|nb<*^r(Bg`=8M20c41&m^os&IIG#L6eM=5giU-DpjHUG(9mzgD``V z5X`-vL%TI0CxrFMnL8NB@y=s2wV1nvb*Xaj8n^SQjPqC?qI|vTei|B5$*)gX3tHII z2C35%3mLz_s_u|SnP}&AM?yjy8Ri?qT(>H}^b|Rx-tw*h8%&YeTr?r!TQyw<xdz1x zp&(*#Df~Gd0wr*dAzwqC%7#@B?}~d=xI#wa!O@7@#g>hm(#1~sdq1LauAhv<Q57Em zmJJa+Rq*<x&2&hwoq{@{fz61*TX8`J<t*_*Zj?k3YTA+hRv{zHJNG)$+UB38FCq(T zKLfK+dqOm$z!AX}bzDX5iseH2L81vM_?fRkQUM5DyTF%x<n_Q>pU@uTtr+}+<sL)6 z*ed10`R}tu@IUNHC47AM5ppMZ7yOvHe+;wyIYYxGM1jSCcLPym0jn@$rnlM8o3fdB z6`#gsjVQG32^dvSY5fpB9bh?Ca01#$KQvo(-Pj_QZZ6flctNKT`b{VB6`f?xX<C*> zu1t#x!<cjr0pTon5L6|uj^Me6%30GCw()WsKzt6?NKjQlx86|mW+fzqh{fB|-Odn_ znv2)d^OZx;GBh9(rWFZC=@Q-a8Ct0jc&-GDB~lPma7vo+CM}n2e($u}wXvkTt{0Ba z9%75{XWwO{+T>E$p){+-M;DBcnw{*q^$3GD;5;0NW#LIx9s%VLYC|1EFmF)+u7C|d z`k}9lWKWO)PW~xeTKiz{Tyh5gTPp(BgiBqtY{qZDKEI<cMlZo5FLm`|ic|e0f|?l< zXg~eAcY!{$!q~sG!)>{?`r%?=uEyz1j@A3=mDo?&Yh@OFT!LM#&=+^aXvkKWO22Il zlL=x+HfMkP$H+g3>NrOLV$-FGPU;ncmmNapA)3M=Cdi^Wy@c)a@fAEdL<DI^<YYAF zZG}-)FiG_{Ev__1-x%=5WP>_lk2rIig4~WJ`@`H4u!UQkm;jmmWu(Yk2W4bi$eb~0 zb_}%qc?CJ!%DQxNe_{QS&1<xnIZu<5vDlGQI;=CuQ8F=ri7VFeNHMF3!VQ`wT?+9d z3hlt>Iu0|Z<?-9#%X@%t!%R_$1tQ~hjk6%6i6Eq~{U2J3P~{Oc^0ArG8YO)S{TXH- zo*f41Fk2Vm6p(I#g*NM$p0E9H|LA7+$QgaJLL$<XI+OgDJpPNb5m&gype*GSOs2lG zabwJamQ^K$;+=I17)aFz87%CK!<jsA*rfj~`Hh(|X*OJo!qbI?O|gxT8xZ>S?;YNy z$tq%YX(MVelt_>NF|nWPU5$o7-tzy+gf9iS<Vr^jTIWNUb6SZ1VriRnX%%FjWZLq= zl`C9NUKWOkc5D+RbgL1Qvm!~JJ13Ffj-T!6LN(&m5H60;jCnda6eAs=s=S3a>erU- zG%RDU#eML0e06c$Da9*8$O=0TgSLicXpX~J6bf|c8$fjA(}Hh=b5Z)>em0~DPX*w( zM1IHI+onLrd5Aqh5Ye8GS8Z$l9?P+4i2GFqgXR2@kXin2DE_MAc!EZ9eng|vvF;@B zlb|V?<|lK<+?UyIq^5r??>6j8x+4uv*bHY8%WYz{4{+txq-DscA>-N1Jz~&SV+kz& zf#KCPsUpft3YUw8r|T+~$>3E3uFy%EZ{Q#_F6dAi;pWqHAt^f;)HjPkCd{`g4C;(g zZ_?cJj+WcqB@@*3978E<L(5vX6*QLQGw%gXScx7I%6G^M`BOR<#nSZ+T4S}O%cO2> zwq=yElZxi(<TkTIjCh$`-y5YH447wd3s9`n7gDOyROqloCar+AZusRC<?tiD{Vwbm zz{kAEC&josvXtr>dU7v>c{8XW%RF3YVVUUfgdZ+}BtxS)m2e=;=UM&Mzo302tY@D@ zqYy={>98HZj0E)s3Yk{}w<4WgZp&taxJdFr)(E#M1vYGFIViQES7SC^G3mMx+^RTA zu#T!G7lJ_rK7b=IYBmsBW|@mDE-HjFCUmY}lOK_|m??||u&8>!hc(FQaVdy0k@E|u z0IRiQ0jsdQ2ok2>u@CHe^s08S6H<%$IYq84-zu(YZis$L$%%-&3|u+zyVW~3O!Dbf zaJ-c4(WzhiYQ_ISfP5te7-Q@fIC~KGm%)Rp^`&LP*DN#B_Xj0%^WMv_8u+7{R4zlG z_F^ya4Q75HyaX8ecBuZ~6g>ioklaqvD@jBZHYlWKo1MK+Ll@Sc9GlRiZ-GmDrNy1V znzJ5idvT&D5J!<-wV%Q}!)3DBz*j*PX6!Gdk&m~g)+8=jZH*rPhROBPZPImh;xClH zKg}3WHuHEjsQNar^iZ%)#`2>V+*^kxqM116td4-VxeYSP3>e)S2xc;$A3oK^m?|Fk zLi+gl_~iymtR@=*RWE-By&VI#aSc|}5U{j)(~5~b*#84W2Y)*<Z>x7)CeALpvg8ux znTGip>2_6ULk7~u?HPr&mtg@&5{Z(D`0JClos@x8#SOW`?ghg%%_p?MTd>&4kX~_q z^0KWPjzNwSSK~f~E<G#Sg4V}d6>>ik<0bG5gX_0M(_X-GqII*6EcA)}p?`}DQ5^4! zd-m|7ope9!?}WqmS)Eh-^owI({PybNp$RHTuQWB#AD*!p4icpqwR*7Np9XeJSgLBg z_I!*ga0b4s32By2zxd?G^w9xWZRPO|M$kOQ$jkb{sfF{-TAMSzz?7rf3<X|8E5XUK z@YuJ0Y~@&vk8C^h;mcECtb_Ovbv$f1sx6OeOe$kr53uAOPz@v$?v=22AFRdT3(2cB zsmx__iYyHcJ0VkjZK0Yko%L32UpF3ga7oZHK-<~JC!^<4yA>CJTW&xE2jebg(duIZ zus=HGc8OLdxN9Kys@yKw)VmIo1_odi1Po4^kZl2pcxf+wi<Av>_6lXuoA$N22l{JR zk)7b^rqv4V-B_m4auW@*yHH$>VW1AZ=%MSdGNrzZT2ymfGJKv}DR~bovKi|H*@y)+ zZB{#sa8alL)g~3(Gf?@URW9-=>^MuxHzi9bWGSmHPa2!g67lU>#Abeo#w(j=SXh%0 zNt@~DwCagtLM58c{ooN(f-vhOoMG_m0G$`X!ajRD3_uRZA8Rvw!cNsOLL#_)&eIKW z4rk~VX>hejCUs|s(}b;z2gynT^$I-QeC&a;?Gei@WffE|Nlj)4E$#K2r#!I|+Y^(z zNktsIu}kPxdlx~$cpUSs!JRaPY~a^Jeo*Irpn1^|T)PSGucTY8OueYwmIB-Ap-bob z`r#`vxEAH#3*q2WJZY7glxHrT5;|rg7_r~Kav_tnHG9=@g_@2z@CF;iJSCt*yx1oX zV+0N8E^}L(<giwWll;L6Zcb5A0H@{5J>o47aw_;`S&!KcEX$0NA@!3D19G<>3lvVE zp~r(f4|30vfWnvEuxH?F@D2F7J@6v<XR9i580$ES6vtuVBsw<Ei8!@T9I;4%e~(A` z4h<`|G9VwtvwGMQbW+CPTS^VWSWt{U>NrXt(#@xvy-_jG%D5Y)IBd5F7B1HY5NA5& zfZg~IYZ;1ip{sfrR%oOxn%)aJN3o<rYIv)g@mCNcsN!596Rv8}1uobx$%Wg%^FI1O zb+X)KHefA1qvh}KB`2PT@YNW}P5VK+3K2lvXpuK6&4qIhu+oj@B3=9B=60@6hdKmC zF`?Sbu4dDK?{FfkoH9NeRqmP8CBF?^3%&lvcK@u9^r@ew>qtj+)~^Y-s$`zQ2j8O) zGT6Wpe_+xrta>e=v&`2simH456?5x}5PAQ)-V@~~B3a-mWK~<tMXN2odr9mzh|Y!A zPr}bd(%H%+6IO=gT_IZL6T9O*djj+*NGS{<eEu(@Fbu=Op#Ze&FRWqi@54Xo6<n@< znyjwCwi39k1x?@JxM0x<5+j!xZ?7N4@(Lz*r<_@6^~YudszN_~Tj=T~LlZ?_61@k? zAa9e-eF!fV+8(CGKLg$iB$J2lVX(Ih5DgtExB$WTWUUY@6-Woztp?5Y@~`)!pzqww z1^^1QT96rZ;mELctQP1{+-n;>Q9v{32xNO$-y~E{!1qzs6<NkI=)>lcsi<AZyyd1d zkm~2`u*KR}43E=D6}*R_(;nF6az#|cQsnI-#3*E-6FRprr`sU!>&|+WL?N$I){Q}l z^kQarB2=Ur9Ep-ih32?ntpu}TFp5~uk2iy=;A-B+F8<!cta;fF*W&qSG}1K;3p%;G z)1Xq($S^cY@HBGGF7)JGX@=&sg?FDY7$vAuzFtNqH152YtOxN~RtoYxSR=eFrv|v) z5KRU2rT#cdgHKNt5Osbj6x?dBcl1SF+tP-~eq!5YX<&7-Pue3FuF-wZ!P*qKElN7n znNMOI1{`&eSw)U3aIsrHY3`jsVv7>tml9qu6WPJ}FfR=@wnaRt+_!a2{6do)zP-g( zB%fD>bPBcV>7zh5X~E-go?*P(HRxY=k;Ra~a`wT#A0u7nE_TAoakIJ`otkpQRoI~u zH0huUI%(9=S*pg+&8bEk4n>au`~=*)@y?JMa}lG@q2!ujI`BJRMMK}?AB=acZhpp` z{~QYz9x;XcEZdANWRix;&aYV}^V3Prrh<(sekKHO#6Zh4wY9qoi!}a0R<IM<Gh}qb zTV=?LjntSt)w(oYHqZT5%M4H1d7}~GX;&|bQOLB^X(_^^@Mnoc&S(9FX@Y8ph{CwL z8Ql=fzD~2!k_Mo-#N{KW=$mA^7s#rdQc~XWo8G6*K%bh9=(~Een8cixph2t$;*2Bv zI42epVewTu&~jZeh7D09S9FD*<)K}+kslCjmBTwl@j7Ng1Mt_mHp-^*K#Qd-*o|{W z50pz>s~~HQo7QUR(wmHzX^;AZmVzP(%FDgvh``<mJEx?MgleBK&*vTn?^!G=LSK)Z z!UkSs%2~yE@O|_(M#!ltP$@nD8`0sro?TwSejz5Lu|pqP!ba2UXLbvM^o=M9#O2YD z$82Dnq5p-RyuS#FEpE-N8!aKs@hn}0<REBOR?7CFcgfQy9gQc<OTo-c#<xuDhw>oU zCd*P+hTk#T2gMQ7J!%MhVKdCeHnEUAt2+ss%VygBWK$gf9OAS^@b6{}9adC?xbH!( z$m<2;h?!M53y1#Fr2T!(fECk@+P*6pH;^Ws0q=?~=qZ5tjYUP!0>)-8QeSVda^;r0 zz^8J{EKdtgOd}QJnm0e&2x>VqC3r!i%|l4rj_3ceCwnd6sD{MaoWL#VB}C%hfHaj` zp{E}OcRglRrPZPvi)iYJQGNw#71MAO_RN8`E{0VFvmBXLG53VHkK?e`?9#|pat^k< z1wG&pK!--3<4`|>GzA5vo6f-%%=Ja=tG3hV$K2FB=DyWd_ESSVDo0b;Z+e-(vv;n- zy?NA;kM5VrH+)~?R@<G4;V&q_^m%{ySB>k;+F6n#eYwAPn+$SbtrjzKMTlz|-SUbt z;C*{QNR2^PpcirVO&zFT5p=8^bq%N@Pttn!VYPUC_gjz_gaK=CGPn(l*q#gUw>Ji; z32aX5ofY6b6`#Yb->~F7eKQ1`(En7i5?7)t`aWV5xgsD4b?p`Y$}3i%<#7ZijaXI# zftJVMmE|wWU|g<Aom2FOE`WRA1y2Dqm>h@X8E;fSXWvY}V;9H7-CX@HnA}5dN6$!U z)`W}^coUA<`bs4TEtVHj%HW>6sNM4LWp62*Il+<)bLIrB!@f8>@e?7Ez6UPup&Qz( zhOr!6Uw!s;GCw!x8E~emojDcocVb}@FS0%msu27^z>7vy?IheU0K&`(d??sKh4BAR zB&`=#^+Fc7HC`oQ-g2^Kh6gp%#rCz_xL@|qr*U;&hJq<xz~ugb5Q0Za3=(1F9fv|b zg>zU(A_16g%bEHhe0?Lhqf*h(#GFYowc_kQf8s+@_+^z_K0+Qw+?NUMZ^481a$Jq= zWk?71!atc}%)-2EFQaJ*=biJWeEi64Fg0r!LScMBb^`=DBz{?!)E<#NVu>cUagr1G z4D%E&Az>KqoK`zKz8=%V^kq|xqbb6K_u#&?bj();6LboMPun|h{Q{L_IC=UET5?>u zc{B^#lgxC9vyWmI5o$6>duu%;giWU(Aap2DuyWj<Xti`u%)>KmVfjBu!;hHrGt6ar z1zBTY-a_t+wf{XHRolBzfEZ^sh1pn??O4*fs-)3w$xK@!`9@VSOd?UYOKhhNZ}HhB zmn_H>vrc(DeibSsJA^CJrwDdwuLe(O2zAF%#p$3l8boPB4CY>>nN`@hfelIPtt?$D z2W+@m#k_Aqw?Vc{tGpdUh+k*kfW0?=+d^UQ9L9C=9k!y%J;XjVXT#ckkp2-CuqpIQ zjzSmKfqZBJ<NssxX2;i?u((r>qSIxJv-|?lvK%6bz!FxLF7OS<4f;S)x*%Ezbf{l< zcSmO+;`;*>{_So9j(dp?ZL|*=4)!{Qf-n1Mw+_pV>?S~KIWY_9gHXs=?Lk^~5p0ue zn5d^9GOhKn^k258Z!b+_Kl!?tI*-k2G-HorPry={Pl28nnR5*UN+aGj;LpRO*d)<O z>#jli5$NbeycB?aN9eu>ne+f)3^k#e+JPO2=p~Ya`{1Rcu(V&9>!X)_@RJz%eN^i6 z;tdz(v)T7CZ=U(=?d0vvmM01Y?T{0Ln%`h)=FQ~X=|;g|-_FaQ#xsKIjN0OQc4whp z%fXsQnNVt*5}fJ?^ZLAcKtU7B{tIS)ob8_EK80fnWZ!3@nEcOX61(m}EF79RHi?Dn zssOYzWobQBwQD(dD$3p^kg}SkKS`rt2kMD$jGIXzaZnS@*aF1nBiz#{SgF{lluGg@ zb+Sb-g(|iT?)x|MKQ|>d_^`X&Wd^np%iNzcWtK>tDxV4s|G=zk+9T<LgzP{ihbow% zZyI1FtKb7GW>W0#{R^D9=s4tBxnRn%K_9K1c4tD^!D3%DVzv>IJ^{zTd9+&%zGPU{ zwgNTXGk5L|*owU)?ytkSGKP(#sLJ}zDiGby4orJSf2YbQkK`g9#@-I>h>4O$gH*c7 z5%_vNyDns<pGMS=vp}RcX}8@9aXN{>Z|e1G9`;f67@DWA2Vwk>i%xg6VQ<6flcia% z-tiUVvTq05xY0{L8tRbdB~^3Z5f|-q0V#rP$I&d=L@UqTO{+HsyhWMpwe3E5*+M|w z05_o@L3&L@e*Qh<LR`RJ1imvqHSVu+Si4SC$6N3$Vo?otqTFdCUAyn;`gKkH_}2d_ zSN2|5l5r(q1cQZ9)6*aDE=fAA!J1ZZuWDc}KleOK9Du_&;0D=f`EGy>Q=j<rR=NLc zMZH#$s|P4tewQ@fear@0nPvN0dF`e>nDh6N+q$5m8M2rlAR`zI&9G+~7s4}6Ilz0$ zk#&j`wsCvmKFGUlN{K3VB3?4FlfMU~%NTWYB;t9Kx7&MP3v|Mo71OwcoG^IJrcN|N z$ByX@ZG4^Y*$@}N@m{+-3X(p&M{#^}Z~IND@c0zhtS0-ecS@5H#WDFfiJ&+qVYd## zYs43`pczg+w)1zRTIE8oSVTkoKvbyEW^J?r<CpWTT-1dhKpAo<rb##V(_V?(Qw=+o zVBQg#`?)FRDP!{gQ|1ZFwKRR_*bd@#7Z$}}<yg`X6g5GME3}S{Ufh0S3q)(N5@?x$ z1%=m$9BWkR`%Jr{yXE|dwzW8meWw>b#LV<=eCv2HO=nd<l1JrW#G59;&)9BNia-<g zEY{V)vjgDhgZ2CEZ4#PQ3Vw~BKmoE>PbxGsZ3WV9$rRHyw`n@C*_x{4G<lE5)|hVL z7>Z28gyVvyJQ$!yz`Knt3TwE%0Mb${;Z1lu;GLLx0Z_G39W^3mzG<>bqEP5{E{55g zr#DI5k4NlH5{-Xtw*G6g^<SH<<-ayt|Fzlrze=<9nh$~W&df=L57wnF`CLoKJ&Mb5 zqf_3|NC(m66iDXaH|ctL10wN1m3J2me-(*Xwasw$LVpe1eO_7@;GMD70AGlmfg0|! zYn8~p&sd#{<*m28swUanluqbaCYyA|X`&SzVmL?=t7Ih6lFkOZl%-yy$u$_jj@u{6 z7z++q!Dw;1nl84LR~Vvj5YYNr;p|%tMypf`3!_rvjh%^u;hD!+hSjglJT2yuU{{Ra zsQ(aLm2{$jy{={)A@74+2MyI*EwP`$r!1p5;%;@F4+hO730{FJv_wgtk4{sL0v|~` zORgyJ5k!$s&bPND+IyS!T;JP-EOTTP_)S``()|*2xLB|cw_=&zm2?|@hoS%fHvFu} zA{J^*wscSha+9k=lXnH^X}Cg4P&VUY*v&nJ2v~M|JL&CZxRDMG1Yr)`vltVwiTkr& zuTUV8ih?H>)3~dg!aW4zvY5lck8lfOj(MO7dlFdeGZpttR%&|EIMkg*xo4n4*3fr4 z7llOB@)bxgM&Y>57VxLuX;*FJ`GTuL<)q<E<lDU;d8L|kGbtRz{iNjzmHSBit+KZ* zZ`W1&vf?Ob&I0y>_0v78e=b1Ujid<)djK10{p3A`o_~wIp(H+vGE4jqO61D&7+ivx zxlA36k!`JSMX|>UvL|Vuz0CqI<<+l+l5ErRTuAO3b6932nj2N6xK+j#BG}~y%WXoB zz6ApROqel_z`q}kMscF0;Itf9;l8OhmxJi1daoip-Tg<>$j|1u1G}Z?xs!MQEvg;j zka}I6_)oTHP~{gd2cWrih)|bVI36QK)HU}h+rES+^sM<7<Q@sZ0p&(t>2?kG+y*SO z>c3Xg%NP9RYx`B_74n`6FFl2i<%_@n>2ELm7|my;c5q@`d^&7193cds9A$;8KC3S) z#C;{MZ}nQisRm~3<De|*i%<VPscRCRhe7W+OF^N-aTwcb?W5~vA!kHxwK$i3qLFvd pN;nK9cx=})+(mNJ1lpP0uNK)m-!$C$#>32ASKx2HbDy*He*-LDNQnRd diff --git a/client/resources/hardnested_tables/bitflip_1_060_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_060_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..edc274c4bbbbb3830da0840d9bbadeb5297d5d5a GIT binary patch literal 1534 zcmY+DZ%iA98O9IeGv~9L@W*!?7Fi7bQ|^3S4n!t4r2&jFU<|Pj8y|>JpCJ=v`@p1C zi@GtLjqQK~9R@o!Q4=`@Gjq7qL_$i{CbKV)7^F$S5~<BH&1n;rp|#6Um!?^#jE~zR zJ<{{(`S85&&(J&c<Lbs9T~|-zxxc9L2GjkGe;(Ne03dYeD_kMKNpny=Fe)WDKm&*p zAdug%Ic)`M<#YcNMZ@$o0OYmd+8-@?LN{%{|Kh-2xx8~c7M;{{-3nJMMHbFO8HOJT zkUs>|sU-2au;JPmL&i|_=pOSPsZRG5`Tb+!P87<mJ4>Gp1gp;&My}qy)-T<AR*+FY z2W9&Ra!@?;G!ggG%*=Mk@wW<l{WQu?HS{j^G}9SzhS5W5yFeAsgDkNO-9e}T!ub8Z z2_^3EM%w?GOZ+<**)<-s^F~2ok;)?KFC*{~(9t{bpp)JYuF&hP+0OV<)z|U+1&9R+ z$Bvbh5X@zrQyL%ai`Pb`qbB2Np{9|4$G&1GJ41){buG|tw8dL<iky;9HK{wW#S-bf zqaS*_I8|0=KU;=pH=TiJqtDL-sj-4<a<%szS<Y1W{Pg_skM4R;aOqoO_9#2@NySA8 zD%X+Js{bIye`ik2`{g1G^fyrLVB3iz_(PHT?Dm|Lm(w*ffg+zHXU$zI6qd!QZt(Ss z&`1Dg*h68c9L4>UswCO)2U~!;<qv)czKx8WCy8%bvI9qdT6gvK@x2$w@t9k9A$x|5 zEc_#)_?>cL!V5d6XyZL|aLxFi%7rs;5oEm0wd9r4GI|GkP}5~H#TPGI*fOcNnNM6^ zD635RgywL&!$#??x_Efis4FJv@oa~+i}v`2alUbw*TGtfVqF<dSRcSr#V9PauC><E z);Tj~N-V<Zb}1jPo^+>@dN`@2NHv6+Ak0D~Ww3yISO@EhQlg9pC2f<KOW3fDTS%I< zc{8SkCCByglZYf3+itXF6%&u?<!0h~<txRipN9?WzHWc%X9Rq`ts&)0xR=yka}Tbt zSa~78%6|k7uB)Ok{ei<{$T@tg>I-=n<u2j9>OQQlZsTP%mYl_tSAX!=kMs84T~>W{ zqZNQS0O(8uK!f;c{!4BYc%O>_G&c>`4!)us9J0-;hW?~BOqJ!E=9G$|tg<${-C@2Q zlW=)$gl6N^{26?$9-4`tS8rQPNLmk5RtAM^K3CFF*Mydea!fb!3)Y=-XM&lFvV!bt z9n-@79|3>At8ia6K019j)Gt05_3X8N2g)82`cJj^mZHNxaZ;0ku7r*6J}IX3#X4xS zl~G0YAdA6KlgRE$Y8@;lEFL~dVJa0;+i_Q%epJLOZtzPM4H&c4nFZuEI6iS|bMq&v zk935dSeb1N%o=`4uh|x?SK0<s)ioVwb=}vtl;N#qcq?+C#!>iDIq~Kx%}%@Vh7-O= zt=K;(uN~S+>_pesx}?j7r~2^8;jQee-PR}Px-#Fs<(y+BM@3i*SY8^!n*R7g`RnrY zMQ=;MJvB563QwC*If+>qc0l&MneX3HU4St$C4)KFC3vRK=X*jM)B6(IEiuPgthrxw zL7Y0IS?f*V-;fmohO_=dvRw?tETWV*wJQ1+8<5>wb>y5OXMu-x&b&T`jbfjVO6ni& z+kZQTmL_h2eR%&qAHF3r_bSGJBMz@>D*PuN`yBNV&79Vr=@Mh(9Xh+dYItk+XFZru z!)NFrXa@<ue>lLbR>w`kyRqHDXs`*ME#$Ay<IRJ<`}&F=<0WoVVRpHM%vhd({7$t? zLn3^eC5{<Gy@uhy_~BJ_CE6zC9UbCl9lk}-$L2$sd}#pjuuL;W5=pW|0x(qNy$z-7 zwge?64Xk?>o<!l=NWs6tRmYk&yP`K~<4U7_=~wWC-?%+JM<Dt(n_Th6T9Gzf$+PBG zH*rLYpChKD;kZv?t}I88pv_bTe@~>ZjSvD8y3K6_D7F(@k(ZadUv4}Mbt*I`ZhAVn F{{lcKP-*}G literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_060_states.bin.z b/client/resources/hardnested_tables/bitflip_1_060_states.bin.z deleted file mode 100644 index 72477c138b78d8adde2360463bb6c965d94aed5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17332 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 diff --git a/client/resources/hardnested_tables/bitflip_1_062_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_062_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..5b50711b397bba925cd5b8e64b7d4909815b1918 GIT binary patch literal 13374 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_062_states.bin.z b/client/resources/hardnested_tables/bitflip_1_062_states.bin.z deleted file mode 100644 index 53e85964aa5cb51088094a3744f33615fde9cdc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43839 zcmeFZdstNGxi`FfNZhTB>^29RM4dOUwbU4$oIDF_ce`7nM5on6qNuCZTB3+lQBZ+- zn%IOIqf?KQcwlX#NEKmX5Jp6JVvG_cG77=~11xdG5r$zH=D1GJ{oaF`q<gpDdtKl6 z{n^Wl00S9j)_R`%{+;e;W2>jCv&{Xh?T?$Lz49%ob6$PzjTgrMuHwkiKkd0WZ-!`$ zTm1C5A0GXq&bw0=rmTql?$Bp`@~5911s9BjxWY}<Rr?_9p7Q>M8K6wInIM;Bw_C#Q zRu<kysn9S`S=;qO+%bpy1xc&v^d1N^=N~9jtg05SB*3Yz8&4RU;RUH**B~n2*Qw{l z35?L(xv8LRkovqWL^IQ*h-u|p5I+78BR0nt;R1NeI9Ar4Tg{u3zQ<}h_5M!|aXR+x z3+MCLH9ACc-Tgy$v1WEvdPf1NRN6gd@6ZroUPqYqDM5+;iN40H2jF8^KHwr!(^Z-* zlu&1u^<Ar=iE)MdRN-y>Be{z^BleId%N_3L)O0hP7yO21@v3*qIcs`nO$|3p(OjD- zeGFgzR8QEY4(}st=!m><sF;awv$!5eRx{k*T-Et8NBrkFGR;lKaZ6yM@+@%<OkZt_ zqg100ljCaYWbi*%5TkGd{Crk>JADdsot|v$CB3jOOzy^Lr(ijZ%cBF{1zc^|(9M0y z4bM@5{uRs$X%h27n&wY#V`MRt-Sl_Rx|>c_6E(v;iHrjNAS)YiMO2G?bsx)ihBdM_ z=X4Wq8h{V9p0K<ermi#Yyh`)~R8`G7nC$W@8s~)zuoWKFs68^Ahh05Tb(fo`mUSlD z_|M^oFa#cjlsRmn6@CjBSe|Ap(JXse($gSrgW)UzYQUroQO^qsd`{MaPEIa^l_FfP zhTmxnSPE3Vu4WlzE(~X&M&tTmEqjKwzXwA!ou&hh5f#3GT#4rM)!*Vrv!@kZz<LJ~ zU<(|k<7IJakt$_(bbS)wt1GJ}n8TT2O-u<-r_l9@Nb<u<VrQO~Zqe9E)tV6qhqJ*k zZU=aR9k6b#0KYkzW=%?tECXCTEbJW-u<n3DJH5ejv-h5}W%OjsWnFh+r9yI4cjXO6 z)>rr3nXXMJBd>Jvb*$4Fh-U@|xSRM2wnbeI_M<ewO82n1%kX1X5wy=^;WO+y{DthZ zar^qy3rSOVX{(!yug=v<$7lup4cc-lhN1Bw994)xrWZAuz_{J&?ml?RMce}>KQDy1 z57o5cKz;{1TS+stK=kg{Fq5WJhD5e-kyMGycA6Glfqa!)aGMLHK>7-pCA?IdpOvYS z%gn@L@b;DWinuCaPm69QG<riO8<d0R^$zYABrftfbOP54>{?11y8!%Ixa8no0&9{Z z6!7kZ8h75TusBUh?%)@J?Sy7Hz)Z(iYve5JDzppbY#U2ZhlEHkY34rFsas)hgskd? zs!OoY1Q+pz+O(uT$Y4%}H+Uzx3k$rsTxO~|ne&l;{P-M}4XzrK2E(1)O%l;D>qQtQ z)?Ta;w|mpop~X!R6M+RvL8>j7<ryj#dp_kxt84o^MT?OPDSV7gIsJ|<METrEt@S2& zg`%t%hZ(g;lZ4-GDi$t?);Gx1NJWr;k$E<T`^Rqa+CV;7#%jMmJw_)B+gVy?>J>0t zw3$POPAJY?sTRG)!i%8jv@v&^WIsvGw_tRnOHLFlr&ywsJL-#RRfNYN5~=BIR=L7* zKW~N`AE`6JrKXN#Yc-K`y<&&ZrnEY~Gvc*JD&F@CnOf&kTmb>{J#E7s$Z8U&c5xvN zFBurmvphBgW)erhewqulu4!i<bDZ<q6}G7^2%FRu{jQ4jIrG3U6og~!^|whKgKDyU z=5Z(-qL8i7`$Dmw7LaXzVq#pP%qg6Y-_P8mY_LFuyQDnG-4@dDu9SM<#B>-hrrRrj z!Y;Qv#@Znl3M<Wfn!uhJo|*y<QK&iGC|UCGnN%@LEe%FEtSP?*Pa_K#`;!i7-BZg3 z;NQTY(sDNLIxPAeQe|=q?9GrQTmMXQUbS^kz3SJd4Rbzk3%h4<$2J*XHFX=S_;d^Q zggX*`RkJKV-Qs$Am|yjZT>~GCYFNJcRolvZuYK*0^EOrUF6o7<etanG)@1x)#(tNw zVML!@3BJ%3B;yz{>u;{}`G=fQe^5(<rBFFW__QNjLLpb)ly);u18tjWDE5m<Y@Sm1 z7#vh<J8|o#k5mV=7<nd{Bd5B!8Pi#PP)uboPucPq@u=z1QvM+nJ8hEd5qR5{Ae!P0 z-{<A*I#R$=#%kG(P;+>7+$@c@y7@{r$E%QGq+8~)HC>3@hS=NmRaU-@l&!)|X+4Ga z@h)ym$);u9%z&CZn(ngZeZpst>j3L0sMQGW1i(7j2CnFKr~ng7cQa0+X(B!nBS9w_ zz~2z>Xwm(I{ix-yF!nke4cfA+AO?;=a^1aJDwaT=tiJ(ou}lwX4bn2du;>%m31*d6 z`C#E~;i^jMXt)MjNg;bl=H$UL8o}SVL2B3#ZG1cYJX%0G2`)ndt66&2z-qlG$#E@t zKNzM%;xJgu;*M+lbkO0ebKxG1h0&7Odxy+~nQSdPwT)OLnthq9DPx9i$?z;}Zp5cD zFnj~M0qkK|>LKD45K2i`lW>DwV79@M#bKp@X|mT-c8DLMFN1S-(_-Fhn-dg!$SF22 za!Rv#zr$|EU}KPc4Qu#UYvEVM**?B2?0Fm;J!dC-u`;bzr>gFoqQ$2s3}Xu*+T>#- zYg}R<iI<<v?r8CuuRx}sXNpJW*VOB^cG+aD3_FU(K+R28|K*^`YH{Y_#jaIjSd)#L z$b@3(2|ere_Sz0Z!lTAVG*XC7V0f52DZ1|P$zYbrQ7OGl<C2+wMapb8+tDCwh!j2y zp32o)jgUNqYv)4Qml-@MmyNPbZ4#gCf+jM?LEN{!XCcwgy}`lC2D*mTD)@Za+DbPa z+?>4-AwLP2Z}GpRNBSMt5$%B8mla&HctV$&0<ZV*v!s-^)C2l4dtquk)7Y}?NY*eh z4w6Px$7CdPu_w9L@6gsfeUOxWL_9JfjaNzc#`!ee%6jfv&ci&7KLM*;^z;NMbJLZz zWTj@^sJ*pf>Fl1E{FfkgI!j>B;4)D@rH9z2R{<VZ3jzt)T=D8ax}S?Izh9fhJA-Yc zpUz>pl3y8I$TZ$K?<_m*<hH`wY=6IP6BKl5g0T-4o`bVN!Zw|1cioUKlvS#4j(0+> z7c7Fi*PL1zj3AB?>%(7et_EAQ;b*W;HMNurlP}<cmKwrGMq`)z4QyfMz2q)-iGcMa zt}0u(_U{WIaShCH%IRAP7Zi>%;VIw^lJMJztJgc;4{tU@0V~}n7ru+zg;VGXz)jVU z8>gia`pIq(B3vc2ob?OJp&4veWpvBoqE&U#W$SK+%~wF*PL49&EyO$aFG1f3t8PK| z72I@!EHtT5`{yS%ul8j*w^=K*!ge|BTwGZF7!hBelu$E--Gs`BzTy>Cja3BA{1}AI zG5S1GLRgu}yEc*_#At`<Fs;n5%O8m~#5)#}r;$Y;&?~kLV=nS9!P9CCB)dp$B-sv! zss`5iJm#^Hy6Uc5w9T(E=fB<ZwqEd6h}L&t2aOT@;y%R1BZp8nXB8bFlZVZdQ{6Bo z;%eeoEiHHYXxKGBLrb;O>q}vtTHuD>AeNM!P_Gf?+@yi<5?0goq6_z<L&57i2e)N} zd?LqqPCEf+scw~9rtOjy^M--&8&GAdm-UDr=Ysfxd|M+4E_eglA``Ly=U7U?5~ee? z_(mc!%MhJnxGLE=+bb@9H}upICXf4&YJRaLVmXBOB$gQhP<oN>aT&&MgX<0Cbd4nr zzCw|&BZ~BXg(3|npzP0J55Q+|7yoSzlR6_jgnOhnlG+EY0|-@WI+f@Bu2=-c8}90_ zLRl60Bt(AcAE%Yo_$|S;Q1DZDJyFuX!ykZ<*J@i?AS7GdSC-<^$evrT@X2iJ`Elp5 zs(8yT5;ryY$ZD;^wc1H%vMkRtkZK`m48}-FrOX;gpA4s@_Bt{H4*f#PW0pR047O_c zx?CKToe)A><y7&u&aDWOw38O<{{k`@Ndx_WPENg$05fqT#b^`n8nnb7ZXPuD$%QN? zNd5}Ttt>{N9*y4*r&nlvnv`C}^s;Wi)*<Ej`6AgqQ6>gAzlbEw2LBD%E+AH<?_xQ% zTm>xg_{}9rJgYj@!c?fe$k{K8nLbDe>5gl8nt&h??{F_P!zuDdF0us*edZ3bYAj3) zA-vSdrC|L8ZaB=w@4!o~^ct4Lh)$Utaf05;)s?1`=RCpyS^1geFn9y8SOG{Aw4aXC z7Uq$Du-6w&)E1dsBi!Ei2S_pZ)AoDSPH|b=B2LNmoB*f0`N`0wW%w;s>~xS1a1L1) zg^Ce!UZ?sXQR61MYV&W?ixFNW(WW>q%uT^wgWYi;MnmHFIRcJ6h8tAH58q%*To&!L z88DPZ3wW|h-+%LP%@bsDeCtY*p5^Vc1RWc*`=n)LtlH)`?eJQC{HmRipkYVOz7l=6 zzre{2;||icap9c1WP)sc$1+wd@QL-2l(15J(JMSfQ?vS)WS7v?7@zqPo!v!Zf;MZg z+bjpWW#0L*>gj2-en76u*~7%O{XT;)Wwq8Nr#ogc`%<Wn#H>`egjnoFF-{c7WLtqB z4z|{jC2amSd_RJ}I2dxuMX;;H(zdBPBBhdZHMSI*%^FI$lU1zPOIib^)vRtTR=+4H z4i61+0WPAG9R;*p`}Nb+8#K!rR&#i-=0E7BBUxWKt&=*v7bu@BVb$W&w4(3AL5&1Q zZ{Ol|T~^5Ek0DV_8D9tc8RtfDNYlWu6{ZK0@&;a=2K&{Nc0?d4$;c1Vo+h_owL)>n z+AfRW?h=<T;=5$B(b(eEm8V0A198wGJfuGb;U(6x8H*<HEA8d5QlLG(2GjAqkQc!x zDRaUYnco&6b3h-0r&vo*>p-N&>joAXufUQ~m-{vT7T=Rq!799O#pK*1I%6Aqe%M&) zN3FW}N4PxFB27<&Ywt#j<xe%IRCqycbc-7#OM_Hs+W{>u&dC1NmR_X&uNmYOpY6P@ zlh0(Y3Iv&h_#!0N2>yf-)xj*ci?dQ!Yk|M5i1F_UA$6A6Fp#ykbXldItk9HpSmESq z)l%#<*?U0TMVoPtjQ7Gd9dcmn1n_i_Z;>Z~?1w+X!bq!+ENfeQKpF1!5#N~^!y&9v zGq)q{%jSG2dXA;*sy~OH1_`p-tv0erEjZG^BKFKa*yAD9Y?|#8|As!vdF=@{!#WL; zn@L9#36;Wx0(wl<pPy`H^ZfIs32`OFlbOb*E9x`&H!H9t^pJyo=J&S2_^GfON*W-; zWt06$i-G8%8fid!Vc+D&ZcyYQD%OIa%R9+$$!6B)kS=f4ViaA7tCh%4@Lnjx_shdo z6H-A-G5NMG@+o&jg@;wc6&Q6B5v#aGUF-itc176XKHzcqDnn~Gri-`4PardA4J(&| zBSu=Ca6`3!DthT@i(yeKB*WWT-D*vK<yH6I3u3O&L(>eox&e#AzKG1%E`*BJ-VIu+ zAD-+ITU_D^EKY}A;64v&BT0a`WtgE1WGvwvYDaJ&D?eANjHfZoS`B4~QHLo@Cd=SO z)pLc!0WF8&Qj9i65^L|$c<v<kM`TNR8dlWnR8;4?z90pMh(Dvh*haSp^<_G7=_gqp z)izH(8Y10l*+F<pnOUnkUx;}1L>0<`Y}THEX0rK9;78M=im6;Rb@J0$`c<8pr_N;G zq7UVGvOGaAHFpcb0dV$*l^UA9iKT90H=1C4ALRN#x*dH_AK`nl7i!+*0c#f<U4~G- z6zkGGTFwPcf5e479}dZSTu<}ifGmmuFkcd8`|M2=Yb-9*`C#_v)!NR6Y`O8WF|cV~ zq+YCqK2fe%!|X0szWrfivmnzOq`iovs#u~E$@8`sVP-RD191_|gINb8`wn=efgC!r zsYHZ^0ew7M7x8Iaui${<T99Q@uW?EAIjewNU1*eTtpUo{HbJ4AZz`q(a$c*fmxVN3 zDcpb{Z~Jseb-OIwfWy(Yw7LmDPgD%mMvYajXJwKhx`ob@FSy&fe%l-1?Tx^HXuk-M z9`YGvO5%$w+G9S(x|Q59*hHB1GBi1LDEjEzKyYc1S>YvVYSLyc{6j<+mNeOxksNtO zbG78rcxqA*qJy+ReJKpipk7l~_zzy;f4UuPjkLBMb~e${QDDi1lcECqP#=m?sDsF! zY?|(XM0&i$d|3=ieHnVUpmJ@<XYQd^+eccA7K1A$v)jP9UR~VnXS%Pl-*+wPft@m( z4st8C*lw*dzK6T&uZAzn>~~;pEnTXS1pyKwx9As;V*k26#`{RQ#@EXQX?23u2+sf) z#f~QAIv!fp3e|g~%E>Dl_c_WNmg7)<lIKg|O@%*&x4PjIAcyFRlD5daK#a@80)@E2 z(=!UrBs~j>A8=hy_j7T^v<NPi@c-iW{rW83$Hdj#be3|6bQe7iu6#J|y8!)k1sg&t zWoYpm5<6#-cGc3VSTfo5{D|%91<|!fUGJ%juYQM$WTkfwEB_pN{m8mhC|B+KXp;?b zKrdVqCk*O`jt=ko@T2p?oEw?5U0LXhlCOxqzXs;O8Ff)p?X#EH2_|G8@)CzV_@r4F zcWzfuaP!Y1z>Ynx+Woj&NwJzur2Y=Op$@EE#|^KenEr(^znPkCh|c!I;a6d?psVMG z!;&F%21<9f7n7JYW{=>Oi>E_Dw`Dve_S=f7Dy8QdzkpV^corUkSXr-ygZ_hTOe17Z zg+!k@9~@Unj&UoDW-%<5d8gzWlfR)i9@8xNqN>P89w@6tK-PxDR_nHDcn{A&j5huv zN$udeFT;xKEX=DJ{rUAfm($e8$;rcbuWW;oW0WrVAXDS+LIix^MA0(61%!~0$7+uZ z6nzOr9<ZiD>0A<(Rhm(HjFVIC!u32_t)BhO+6c9avg$yjt@xj)hEdhGMAz-49Y(A< zg}yhJ0}-q@)UG=V;}Lj$XDp1|#9}WYCi)BBlKmPA4c%(^Cor+cbZ>`g*>Av8atfk8 zc~`x`**Kuaw!_5eqC_-0QpyTR)}O%?=x&A6UFo%2!YV`yDG!Pd;w%2sA@TjR0#YO7 zbWk7QP?NBIqKW02K~cp4HMmuM6lD)^gh;<jeZgiV;r4IGt`2t=UZVE@E}6c@f!p8i z;(okRjw-1px44Gr^1_)s=ns?44D}IV_i9z#PbX>i;JlD@H@n6EaufZ51=+S1=m_5} z)k-o!znjd9bh8Q#kt(r(tJbn<-(^dH2`5PC;FS<8Mz!W5v&U+>`7Lt#d{~q3D4}bc z1-fZeUVMQ63OGjJm=BWQhq6&fQB4}(&YD*chmSu9&$U1&cSol=rsdose@48Gcoo-* zDZ<^8Qcj_;qKkq?5O0&=-t`p`pP?kacGsy-bF=6)^`N$HCFM0XG~dBW+8bln+OlZ+ zP_CDjSE@f)lXFwIMYn@^UeDwDv)={lg2nB>4NJzL`<V(G^Ikf9Q5NI%4|7%~);zw0 zq>0Ai7h*$|ZEE42g2&<m_G2)^`i}0ig@W#YVUDEV4*M=~h5cd21#Q!a9YNx<tbOxQ zc(#j<>Y;G)iV}32ZD?>jT3+e3_J_LtC48Do?Dix_j?39EsO=R$X(WzOP2y}HHHl2# z=Fw%_vWbzn`OW0mX&PeT<33>pE3V}Nq>eWEY==mwE-|f6ch;q^b<sU|)w#v7#O}%q z3d$5{Zh|oZ^A*~LHz$~6#Ey${eH1+uJwTtwAV0Ufj=ix48q3K?aJknktg@HWl}^-4 zQHXp84D(@|B3xRw4dqE83`fQ6kD=zSSF!E0tr>;PX)W_!hm={kNMo7%&vaUjxt`Ye z>Epl+HXteG>3h|6j7#`f+o<w=sx(aO4vt~AEKT$ZcBuLJN8&4WB<>(&-$qhJi=*P? zg2BT3JC{ZCuUah>eNEg^c|p{p&2NDBG)@oY#NGlKiY;UFTz?MTabe1rQI*ovjV@Hp zdfH*J+LxcLT4Pay#*wH(R^>O~FHmBxMI|!&OXz5!a5(}6%#nFDfv9MCmiOB6tNex; zq6N*X4vT551(JPGne(kqg?>(Nc-Lte;&%{eL43|}ReD(+!Gv;Zd@4SW$My&8b=>+) z)fWFigG~NfgB(3flq-XN{<!wWG+R{<6hv0qgus$Y_9|8AYBl9UtO2(Px;4oI!xf!E zyATV_#3Itvh27{3*0QII!sI7mntU7FK1PEP{=X}ZSQP{5$ze$Af;*@|qU18D*$v8) z(GI>0O6SA;kD%-fx$e}EV4*}g9k_mk>Xl5_Lw^NBWJehUlR&AI3~3Goo2hY-PE_)Q z6n<JFo-4TOZi&a?eP#mPJ^N--7Y)kZCJ)*l=?aU9azNA@NylaQLUn95x0(th*J;1y zcE4pLDv)1mj`V@%xCK5)uj4X1!}}qbg9?w#6}YJ35LXr?QMpl2;Wj`}qe+Try=_?! zJM+1gZ#X4<0xaQAAx{$B3H1UCaH;URal$9{mkal(F<q|0PO@2T?LW)~yuUEMN$YmN zlP*$eG(YWkTgQ0DOI%nrydNzc<53Vx=D3q#E=hSysY5rSEaXDq;a^ucb_MMFEJi8x zh$UC!h-7{jiSIHP&!U><3#v0<ZiS<4h(}9uu)lhsWdQaKZ?akK*-A(YwL*NaPC031 z{*4#^u+_<Pkap7>7PHsvh+n&TuUA+xFsMjZ4$yemvL0+*<O>hft1;NoTLUH=>isMH zx+BoRI9r;X-^89y(}rud@+eRS(?)jJKxABffiXe4I%8rbLJoh&AWH8~A8VW!DOQu} zC38K@cY7P0_N8RMDkiX5agnAjnyF1ri*nO{LA3K167U{ITq2E&2piaS@bmyK+Zc9l z%^+v0Ko%KY$h)DqhI^X}yDETQ%DUu?)k02RVt3Fo5`o|FfOvrpGrj_UVC6m<*G8_N zgN6$lR~hE5K5t!&F}v7JYISuc&0gD;koqLhp71!eEjNELv`ObTt3(&Jo%V9c6rDoi za1E)01-__oP8PL83FSNTwAwxv{n3CfTETkB6CUz60^-c+u$T++Rcdx?P-sP~N+r3s z$>zE7%yvj^h|j;LA<mR9X(`K;>#DdyrvHypVw)6uLvY`MD+8ugH|~MLt#~1Db&pg~ zn1lkwbOYTk#1{MU8=0@tDiDxmdf*0}?g9Rnr@wf=Si5n#aARe57AY1lIWlZ9Xj!`Q z$@&~r!Ra;-(P<8+wxqzAi=cH~sO=Qo0`WMrN3iQIByX0P1f9*7S!Zt~(M~=D`L3$l zMu@5(QcdH{-o@-$8uumYix5Zl#UQ&bfu(GG)MKlIeLiamOwV?8-EwgA`w!*TUL+MR zMXPz{bFnPXnSt#OMiO1Ti;ma8=<aDcV>_;0f%Yk{bX$tSd{am!$2Ya?sDTc_a5acc zZI8^Iw$sN@+O$cW`wsjScB2<!84VX)Wjm>NfSX{RiVVTgf#@j>X?6|lZX|COjs!5= z;$5(?E2&+2VGks9c~7xy0fFHmGG+h{GP*o)S%DpOaEev<QcJirX=w@wDLi}`7OhAt zYuNk@=C{36FWGNX)OIPGeJ35%tVt}@h4&)rT*GRg{xJOV7^L=atxkJB>J)!Q{{wxo zXW^tH>z>?_VrQ|9_kFES62N~|3YS9R+w3OER40Z>nxt<>QkeUJ<bM<^`Luxf4smpF zvs^LBg6>X=yPGA>(YEay;J;5NLA#hPG|c9#OYM8Bj3E*}cr;AQ)kn7^y^Z&vBXt`z z5#bgz%Ne$oOC(SAwhl^2ttuoASbne7_+w_fxJlF@ne6n`&rqUo)NBFn6zDWiUG$_1 z^C~C78zM?<DY@FA1ZMR^szP?cHU8;%SvOc>Ek7qc&{_gV4Wx&6+u?c<G|tyt=uFFb z<K0|Y5&dzIxhx3^JJ>UOqb|}qIip=3XD3luT6Ke*^l_-W7mkPVO$euEvX*$<whhJ5 zZj-HVz<!zb!dVrj4;aou>OrKOTpc+ZqKnmxL;uLIHb1V!Mz#=aT<=0cGTIDVuzoz} z0Bj?tZAgi133dF$un=X)<(f{N3P*i(afbug(oV>Ph?=g5OS`oB0s9uA71~(*Ft4YY z>5{2A5driG;0mjJ;!?$_%hRM}cldUM8$wTlr%WWcAHAiMV6SO1TUyHe3O`lNq&5%r zg=}A<!&x4uA+9)%%^*o*$*}}onoB0lVvxCGp9H;%cU`FVH8!y-SXc}nK}!?1$tc78 z7Q1Nz@wciaYL((8tFgsQ)k^DFK^pvoZSxB&6tq%Js4GNi#!NLPYQv$#|0pD=gS9D2 z$D%b9*Jx1n_E#;=QQIT?-hZgCQfVxke&6q&K;KRs!k+9jZHWP6P?<iZpugtuc=cmw z?HkBA<9iDR9BcdCI`qQh9t%%ZbGHS}TZCj7;}myf#RxA(m};>tbaUyc=WpMf38mNR z_?$Ts9FIu#Y^+KfCu}EsQ3mRv>F$QgU}X;d^m`87ZrV}c*KH9_(8o)3Ni@|0<#8wJ z-v65sj%|Ieq74E7gq@u_J7^g@)@$j4{f_$h4lr&PYNtTsWr7isHrg9hm(K$8H9m!r z6z$Ob`<&f7{DI>$hs;ryTRcsk7{&k6u;O09wHSmN{$Y}zSQ8tB)BUirhex}k7rcsn z${sl?cA6u$Q4J`u$<`?lz6+&CQI&ZVc_!`isp%K*ad}+FmxKuCh}uBnfR<U6cuQ!j zI<!s`!{luCtd$x`%Mvm|R6}gO=n!niXTtbN4VP@f`vl`cV$|52MjBg${Q2V`#)sxb zs+;~uv;0D($6&ZZwrd0p`AAJo;NU%k`1~-0opt`@`&|ecqjq*^zsr$|t~a{dccjqf zxoDUJTQcDuA`KiIM4D?qK=V6a*ML6yAV~cRiFTrouA9FUthaz?#nO+j#Ot)Id-~B9 zF5>u<+oM06v%{J<aAXvT723pS)DiI&%oo})=$YzrqZo8rAnYDeqRp4`I{YammayxX z97Zc4+Cg&IQNOMh)@NUol~C!1++)2lhqZry4_47LRln`eh`3}+$mAF|$r$Y+UqVx~ zhg9agW!@%m&p#wW`!2&DyxDdU;<a;=`bD3~G*nJ>@<#*qCcytWY6Ty!VrW;py(sb( zxOvLH70o#rm`l}d7_hd%GEJ>v>Degzmv@^G!5H?j(+&AIv8(8vBATQ=usFT9Vs*O- z|Kj8D_$5P=WKw;et^;E~q>It18WZtKw9mfF9<QE*XCL8vU{^i=EZ=hnzOt;WMmT>~ zwbw!6RdO4yRYBVY*_s1SW8jGYh+40~#GuaOOSO?h>|BSivxH=k8uEKdDmqG<N9}+! zY%MLH2InE=Hau^9t(=wFU|*N8L78wb)6t7qPv c8gDTjb)<C?3C?_1~-Oc7%BlQ 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 CdUON; diff --git a/client/resources/hardnested_tables/bitflip_1_066_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_066_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..e599d531831036cfff71c167f4e616f70a2fb1c7 GIT binary patch literal 3290 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 E0pAkN8~^|S literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_066_states.bin.z b/client/resources/hardnested_tables/bitflip_1_066_states.bin.z deleted file mode 100644 index de23de8b35699ade41c23e88e9d27f8f77c05c0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25704 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 OPmiampk(T!k-q^#2#lWq diff --git a/client/resources/hardnested_tables/bitflip_1_068_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_068_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..d52f1573d6d267762a2b234a99f07f885130ae00 GIT binary patch literal 3548 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 G|M>qwo+Oe0 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_068_states.bin.z b/client/resources/hardnested_tables/bitflip_1_068_states.bin.z deleted file mode 100644 index 08b3e5439607ec4c417c3556d6d08c13b062b0dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22536 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 diff --git a/client/resources/hardnested_tables/bitflip_1_06a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_06a_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..05cdc35567db4620c2bc20ecb115b9f5bbc1a92d GIT binary patch literal 7596 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 bKu8CEM=&zo)_<gzm;RizDIw5#=FtBGDP<W~ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_06a_states.bin.z b/client/resources/hardnested_tables/bitflip_1_06a_states.bin.z deleted file mode 100644 index 052898c7f15a6c4904221e2ca8f766acbb9932a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34536 zcmeEudstIvx-XsX8Ryo`o_0@dwVLU)mTkRcT5t6Nt5c^#m8r~V6%}>0wHA?LTBxET z`8>PRGFEHq1*jKTwTg^Ih>DOR!fI<J3Q81|C;?U_V1y82?paxDeeZb}=<If8?|sgB zp8e-}{6j7w$y)i|_xruS%eSG;RhXRr=g&`;Th6XM*Sl4GJwAPDUH`*x414Ut=*(*w zKYi-Q53c^yqfA+I_5I)d{0IO3#eD#ThG2Sh%Wn+6a7c30$hr}&-qi585EIf*59!|z zIG$NSMi=m{Ky&KSC0oRube&4Stcq4H>k6o4+F>$+(vYPBjzUOkqmG)*Yey$v28%D) zX1M~Pf6jKhTbKtLp&-R^o9U!1A6AA}fweyJRyZ00J;K++c=|$exCW{#l}b9R-YJ1Q zktXyOG{Aa=F9ZGi3Rteog^-}Es?)B#4m0ItHj!Jy#DhCKT@Xq@i71SZ6Lnd1HWRc| z>BDc@ye>zTn=wd%vtYhmP{~gab9k5IID8$@?bZ6i$pcQ95Ec$mcMCU?@aiKKN4p++ zw-Z)h|E<w|Vo`HXwIgJr*2~&F;))2<$CAac6ZU!8r-%t3pY1k)As~1o(QuQYL?%5h zqrKT`@dg$|qFq91P8TFzg+@D5$AI#*Nn@vA_fC5Z#yG7-@}(>62(qgIq;H^0Hs&#A zNia(Kyffqx*w%7r3f;5^%yN>Y)BujZD8F{Xif&S^6c89Exg!yW8U8{Zgx`UC3XHkR zAC3@h#IQ&23Kj>4i=-Q#feTRa6daR?2X4YyNU?%-E|gvZ_ZZqJ$3qM?z_7?cPJwQ6 z0yH!^0I6=c(g|<m08rr_eS(kAZiX9Rrc4k{K(v%AXN~h{{KQYX;2YQqPe7;#*6_=& z)cu}LqfA&gff}e;&V}^>618RdRf#KpsgajwvJTJ^I7ESl**>!R0xXu|!{h_t*UF;; z5cR1c6825%CfoH1UQJX~RFL~XvF@gpNOaWm)ES1hs|5~7_QG*$TLB)hgBc8<iF$P= zU9gY%uZ9gTiqWtH?xXnDZZY@-2|<lWzJdFq&V#cjsa8(+(J(}A!vCU7fHuwyXd?Iz zKP!ledfOCEOcY70k8Fh#^nRJSPQv(yQLn;5I0W}ceGFl^gTFb8&n%}<VK<D0?nsdo zGQ8DmGeQF65>DhmCYiS6Ei;@5I!>sCktTXa`i-u{vzxdUZzzMgkde^f4F!D@>e+Io zJ*?eGASZNtY#P%Kf$2^~n`RS(H=!deROP%Zvcut$!&1;{ooMMLB^O}F0NK$&dY0W# z0uv&vkJet5nHSjdI=?u=4vT4g4t*~ei8;iOy47>QVbM--ksD&k!#$b^6Ep^b1}7XW zd}0((U)y!o7UDkmV)+M3QViHSnD$a-<s2xu!<GOyi4Kg#d#kRK&_4m*9-oHVZV?OJ zSeD_Wxf{>a!$ymT#3?6(nU-jU-xW^W7Uqu7g)fkDAXekX@gITzThMOha_Z7Rl69{^ z=n<$m3>9=Y6hF!jT%o21As#Bq;Bk1XC6RKja8jW%ylq;uT(U}-S4}nbOhMdBPSDFf zxBCF-NY2_62)qiR=Rj&ARYedl!&oY;P)O1Zb{#EQ@6mX1g<D(6m<YQ~CYQom3L}8j zg!#;-oI2m_1DR?oyWKwdxsW&`B-XJlzj>f(x<mc(1L|*m&l&LBc88?TsdE=(Hobgy zR@0%(mT%h~PW6W`pPjt<-p}W$UvE^vBk~8BA8pzAlES68B{uSpH3gxyl1#?xIZLA6 zea%C)gA1^qw|g8VeNgPL+zLO4it_Rw$>{~K<{FqIx|K>U+|dBzg-2jIv8<Q+VdGDg zrVBx0I?oTh1AIVcgHQoN#&ij*&q7HMoR{%GKkN>WAUpLS994gDR)mYB2~vQ+qztao zn^5r%l>82McaTmu#RVJTdwlqzKF|1VAHm!3vk-hq(kQ=T09qNix(f_GG964Nkwl9r z0a<XIXZ*w~l$i`z#)&c)W;~>u?3GP=s96WxI?AL$^x(=+E2ICjc90MF*bKk57Gf== zTh=wfkMh41b<c_yMIOuWI25U$zgk2ig2FlnIAk_oW{yFX6>Bd%Sjxkqu0Q_?Q#-eG zk1RB5j5<)}R%**M4IqRpS6C~Z+#g~YueuhQ=c&YN?LlA1IF_+yP;*;BtD!*RR^kgp z{fcH*LSix$)RV&w;RjJ))^@{mPw8B7+zhx+N-Ti%2>caJ%JR+%^WUmJtB2o1pQWSH z`B89C6XE7T2H%*GpF!PsY9`n1`p`07pc}^?^>KDL&ywUiB{tr@LLS$tzkY;}rXW3f zGJH)hHHVYNQR@y6+^4BFN4V;+eZ<e8X&1>+D!c&KW<m2Y+1*X2trE3$FhLJrvi!fc zGuO{4x_v&4m@Cf)_j`1G#PN&*WBm!DdhadRY1mkNPq?lanH+<uR{S(^XB%vLSx_>W zcz1|gH~9)ycn$Ym&ii57qO1n`+yZ*l4NM=uoe?%swGsAX<GyZ#pI{%g!&fj2(!+2W zKEdUuXri8%<0sKWW#otck+UFv1XHt8HiVg|VozEVJVB$QqQ3lGv3mU}E{U`qg98v9 z^(9y@(pR1X_B3serL!rYF0skb5(l`NLuBbTaCB-{43Gi$lkX|sc3;WCbg8K_hq;|g z9nJjauNim)+;<Y@lD@6<(MuBER0b*&-JYN!POYC&G>s!0vLeNHzQiXqJ4(_m#-CbF z?`k$~q$AaBJ%=VA5l&Oa@D8MWrf^cs*A62!rv96cOyG1j{fD$Tr=Q`W<TbInlk8q< z{MvHq&>m=uke?{ko`SyNkn=U<Do3BCGpphE*>Xa!aWq6%LvBDLYL|oJsNBi(US?v! z30Ms2Mz|wP#U=U>T<Bx=ESM+5PQUdWsR|Wbb@Rt|^X5LcGNBe;d>Y)3!pwSZv+Q0C zGp$}_ikYk0Z1jOKP!&=1%Etb(9GRICWLH~WlGsdo?FP9S9@op~Nba>hV<GGh$9NL` zP=jlc<JxL+N)_6sBvOq?E)p*sYhau`>JEgp?S$QZWP%r_*!hb@-GpluCQE=HD3?iA zWQvuft5;!n<)+_q#UP?u7uLqYxLIuKNAm`ulnxRuiAfWB_)|)oPsa!!L*s_!=3pc% zT)lD60C*jV$7&ypWClWYXHT50cQ5cUQ)#{<EDAP}Z`L#sm&X_j+>_8}f&Jzxh1&<d zFS2Oii()P{jwVOwM|QZ4%>?#!aO>-pw4^4D)5%SRV+LM259>X|71m-Mr(tu+rMbAU z**@r^&qO`{KJ1ssd{-tI{tWGK|CZ5fx-5yi@XMd!0+!sHq{P{fq6~|Q8YOa#q<lB; z^1=iWK^T5SLp{WdOY`_=zQ!Qak)xO<!cE4B&EgPDQaAGJ|8x%u<cLDt{m(x|5(Gw1 z9}9A$VWgj54K=~=Y?zJvo?2W{<IUt$4}VT(yRhsK1>6LD<t<7sR;7wY?D#k{LcP6k zhZA8ub#xjs8c3sJQ99l@!4_rH$*0nV>MD2Wtw=#)IK(|BCeNrlY$>P%Ptc?kNDZ+X zDr|#vn{|(Soky4g$@^fI!4oVwcuaBmLQahZEIs_(9ugg5%0eyLkhR1O`^>!Hc&FB~ zq7C+i+!OpwD_<gO^z{fP>e#wMXtT5X;PFf3@(MWY&$Y0<OfzIVxYhvaxQ7GE0$zJ0 z?c(X98g_bi?-xoX)R|osjyBR3icTv?X5o~Wk|TF47`(n*aQ}odeg*-Lsgb0^q4iR0 zfIm%j4mjfo>*B#HR=G-UbLLMV`9auO52pe~TsR6}zw_2J+kM@3CN>OXJQWWI`8Q?D zX~c0lL~0L0XML&3`v<%RpJkJ*Q7lz7UbanDy5YtSf>nViWha3v0!YitfoJ3Ubd8GO zY=!kfHaf`PlKB)`5s(>#(_^hcNVTaLAXK_g&XuuFDt+)B6tGXUJKMan*%^R4$^<hm zgY~}%F&9_9pr6dZbgTY`IA*#u(*>8;4({8VKK?<f<Wgp&(HNU<6V<oT*VH}bOPZ|W znsMZFY&oIZ*iSd?lli%{3sx$oGuW`g1`s}%Q{ZR*##?a1X9!x-*_oidxIe8Dx~74) zsKC?>?<@S}%3EA5ds60=;24joFPs!3kuHTTBGq?NLCJ~SfCVRMI%(*4w)<27*;IKF zCLCiJJ0oR<7c>yWgfHmU%Egi5Q%v?_(ALxDa}OxF@*(9A&2_rrkF#LA!q1Fkt%fjf z?S<)5MJN5x3A~#(0+id1DleD0m|G;;$9K}TEpR%>uM$%_U>iiM8;s2XFZub0CGF$@ zqL&C0;j8Ez=~SYWwFi<;kt4GEU=H?^?2j2vH@<Jfa&hYDrA3VGNFC@ow+_lvMwM4u z`e0ws7bpNI6e|l!B~z?uvdc+%(hk}KM<e=;eP9!7WH>LC;OCkn-f)JkMUb_JWVuPH zH(HvlrPkT9ZH96iS_ANLG!1(!q4EOW>9ay;GL#ufdRU#m>bcA*ep?=Fy4Oz<nuylU zCz1^iH3aIzq?%g9Ls46vqV}n-v;)xoLEKT`8Cnq0G_8dngXIpelW5ds4mNp9qeaaj z;RAWF#!C=x-oq<1D4*7&+aGY$QB5ncIT>|YP`l0jQO8ngJA7u1lXD@;|1fATF|{>{ zdFUz3iqU+#1{7mdRH>KMgD~C8PyYJdE``*)N$V~C7{YFH<4wg#;_i(gwO&pdp2`K? zIS><q{uYbEv_s~@Anjq=NqVYsL11}U&<1V3#JSvh9O^zM=b1L%u8^z}_(@3n8Dv6? zPZ*F*f55gk1Q+t}!Uf$D>|P(k$V*&%ExG+DA_i!?MfTAj$=WZlXXb?MgpE5;i*NG= z1+U~j=D_QVI{p?8d*;uv<$ejdLrWz4Za;{}=ld6^o<R>CfhpA>E^#nN>?w|3sI7;; z!2LB;a}PRv`0%IeNGb`z+bR$NZikZ9AwqM&F-L{%Wo@u2!fHH8HcAHI)JU8ybsLST zFL{WKTrG(UxR(pexK-lZLO2=A^n4h!=!q+MlabxO)yuUGR&-?Nh#kFr8YJ+^m!KUR zii(c}ubiuYF9Nfhxcn;I04-$U3UbcD&$Vb=sdR$!tyO5Sr2Bt8-g1pIcXsO%BJNH& z2Irx)hp&<=*W#F0fn{AItMjGBvg(r$6op&of;ht0ol;(*!~J&nlp5v8NNwr(MkQx_ zoZa@h6GGjNwiOq`mTTHPXb$gwg*wkc+Z}!pRrI+oWe2xR)<Mn!PB)EK$<Z8gBZAQ8 zW%6M8COUgB-8&Or9c`;(i{K+LyGzgMZ!}oe$*ng?Dotwy?5lRI4n%*hkIj~o4g4=~ z-Y=$g`l6P>fj`La(H~WWa<D52_b|f_pW}wtavFvYp~tBTnGj%l=|irtu>;|yg=+d1 zaFKq9fo%$cocYvri|#J!Vjorrc+-88%C>>Nd?7vY0ZpWg1lQI1zYDqnXNXS`4#f<P z27FJL%+S|;#E#BmS9w@hm|w0=2oK?icNW)7SwwBRe{z#JiSDd$YcE_OL1j{G2h1PI z%&Jf-1m55owxv$CegUO1qVXMg1ULIvJ7~*gb&!ubPezHx2_(6k2?hRs?0;T%oDL^y zBEusZ{Gf*2fz=UmIB0#;k@y>Rzh8V3zTPExOYn2)!<F~(S3EO*58JeS9N4aDck|at zt%q%ecsHNWBD|?Uj-GWg5iVVc#(``Q6Km<A2{7Rn`~utju=Av!QE394WiG>&!FMK; zFyh0T3=YVXfIA1T=$khsCTxK7twc<UdmuSt4=CUk<BMH7r?IC|_nOq&3!}gjsr0w# zEl3J@GpqRxwcP6I6>o?$<@Q-skKl0ry30{NNMn%+AsBurCRn`;O0ePQgpHSoqpgZh zPs!0AV-|LkKhex3)bu1we-UQoSF-cjU4XbKuZc;OCipFZ3TK%0_iU6Wu$1o!X-R`u z7+%|<W7ffn?eyHlIoCpsrjV}q7I{ga;caD_Y>SkmCw8GatuM_;Qfgs&L^zE@iJ4Z; zBTe*1MM2wj&FNslDoI-mB?B4+V9E{zpN~SZS38e?SI%?8i-;S(!d_wd9HJEik}>H% z#?3K(WPAwLNX!*z3h06Z;L4+=4aFYrVGr}Nq8&|^`mW54Ow+&|=>G~dcJc@#N!h*e z98Bnk(RPyWC#}TG@A#(F#1zZ!?-2;5Ap&8mQZa!kf`ST0Z)5$DU11yuG_4jVNY2n+ z6*mxrkDW<%<G>K+7lO`6nZ3%wi3P<@!(^Oa7!juf<L@Btgnmsu>j6g(2ib+dnCQhr zf8zswW8mCU;4Xbo%Qj7)_5kt<_#bi$2UMoPZAG>KiG;})?XzY~d%zdQ$Ksz%d7$ME zex*L%_ni9mtpJ!EkU<}by7hP-lVak|-k{bBn@R?38GU%mIf?&dXr;a3vB&g+Z-W6* z$QERPO1rg`X(f$L2KSsWlr@4Nk8gsC*^H$7c@=j7#&<wRm&}h2L9zu_0TyjbPd||6 z$XS&;2rX)&#HJ)lF;1M~I{r*c29Pv}MoMijey>ZSOG40vRg0frP~jd_jOXY!d@9>M z#Pf>+q^%^U%`_Tr(&3Hj93F%~7KE-jxV9j?LyZ9+k@iFAW0E)>tmU|FVxU9a#Z`Jx z?G?I(G?|Bv(_ona>2CP#V0TapDR{Y$elfEMb{*me6!$v%goC6Rm?;07aSr}kv-$4{ zgc(7h(rdzT>I0nDgkZ#=&YVLOUc!%i9KS9&^7t4CdCiv9&>yni#dV(m$-V{k4oC7L z{dy^d$C|}b_Ha&x<Q(HS(fFvS+xJazXb)7-=VEsAJr3qo==Cz4q*8`5au_=v@Ac^} zW9i>P){!3vM-y}Ugqk{k@(ALwtXWYv-@&+R5g%4<mTLCIrAlR8NzJqX$2Lz^P{PZ} z6NM|{?tQNPc~IC6M`pn{A%2cq^D2EDxACj)gLU~-{MU%P4evBkrnrS^B10S;(nOg` z3O1O%kgwpXsF9dLn}vIKpiMS9z03vpcgXgeZi3slg#4DIeYNk}sJ3XEU~|#GI791v z+C^|){K0yk+7Pdw!WMp(CPqc6;6R-vmw1red<I)sgo)Y`HoPgvyXBINKkqfIr-n?) zQ;{y-a1f*+kpy^t2E8;iKSj;@WvY~Nh++3YR)@mG#SReyS%sjTNY*t$K{=CUfR8~Z z$s`>Yn@nm3_x2HBITzE_)ABF*iD&g22gH`kRXL8fI*oreWcIRgCyG|=l4i=gnz>D{ zZ}`2pQ*v7^#MP30Mmc1`%3yP$S=Ob}vmLz!JK$tEaD_7YKt-C<so@ADHyMB0Xi8Z= zrx#+Gac?p4q?~q&$rs5jJ|OD$>YWjoRj+U@f6Rwp#*qMddG=n&6gS&~3;bHwN)Q#) zBP>01pMTRY^=n5L%hpy%xNZ4}e}xabAEHcu;w6vv66~pGPML9|?G0PbG5D0L<=sdb z7@q)>CG819ddRYgD-k;&Ien8)$5t3acV8p_R&pQ=PxKnM!7*=XlfJzH4tYb1m0BKO z;0FJoNGxID8QN_p@sd!T?>0`Sr+TpWkTTOXcgSg3sdL%k=m~fs`}gX^WNe~8GqZER zWg}VpiAxr~VYZUbK$rllM)Es*VP8+1+t`7d^iC8EVz3d*6)ScOVYeE}9HrJ@tDsk9 z{o}!EgUpbky&SD%m9UwLH6LLagQV7*o%(+ty5m0KYhT`cM{bz~dta-W7VML>OB+b4 zROt}PxaCd1O*Zoklb^MOnPzBKSSoL=OhO)*c4j@ds5P9khMMaI?_&&P&xEANS<x6v zD;==An^i=E?|Kz1@R8A>0sh3lVPRdfTdwl&;5Z00$S$JnE9J4|n31%}6>)Un39y}m zN;`j^AauEln8V~KY?I7UQNN^aAIcTgF#S{Eypnj08Wy;rdVm@a({?}QPSN|H*Zy@Y z!_1+!S_HeQtWczw6&`U$Jau?EXSc3KCWxB;4&VO;mi+>*wBm06Eh7(mUVtYm`87di zkW6?L(gTsJ%D-8xu*%KP8k58SA?<;mMn#qH1jl*fCee0F@c>FqD;2hnZ+9bSf?S8n zb^wFOWE-q*B-_+-S`7DnNzbZ7=6_8sl*qeVju*g*R$H@)g#vvWzfz(Oy7uJt9k9}6 zS!oNJ0#<L&wA-wW`=H0M2|Sbk96C6jAhq+l+|y?H2zG@+LYATEWbiCyxr$Ec7k;=q z4f%(U2Kfg-{$VrSoSNhE9-vuOvgHPo)D8neBEMaDku5R{Udyz{+|ATb$(<%?$pYgW zw@}auoqXOth`-%<tsstFDQg<xua+U^!7Px`h5*c}azXl>h;pov@sobm>C#wX_RRPh z6#2CiJZf<dyi@aY$vBS=ixjMeRmPxUjKY3R3Mpv{*OVZlQ%4TrA(`Ap0xYcC53!P? zvY|}U-13Y7N30pKaATV#mhr>fE@na(*%wJddXK_#{?>`fwB<eEpVSA%a>ecA-&cf{ zvSk+%5Q((lP5Crd+T0=HAy=+=nGs2qon42-obZy5%g>qF6G7Q+S>#t`AbBi2pGkQo zP+h24-%|v;?4AiXHc^cSO2Q;N0LxdAYa-Wnj-1C04>{1h+jp6{Fr>-g>Vl@}AraMt z|3p-H4iyOe@njWZTtdWv-`)inLr}rc^zwU|oKgMZe+MB><Y|+|$F#Z_<^|Djt2?DX z(+=%%$~u=RdvG*8@cv~|wZpOpUem!Jk!(!*JSSDT3?7MIBv=d&BVklsL%Bn!#Z^lD zeNkT)$=Kccx^)}nv!@l@f3i`gs6xh>3n%8oo&|L?>zrnCLym3J*NE_Lq(Hu4nbxk| z+khiwV(U4>*CE?X-H{gu8=SBWJM9IlUJ}C#Pv@k{2@T}v=A%yHSX#&53b*9B`^oVM z5U{|4B60v8KLy1><3KnCrm5t^?}+Xoq~)ja{CcqVTAcLJ-Y^?<|JgF$#Lq?Yz~m;& z;FAv)1vNg{;UoK*r$<8DAfr+H*wDnYULo@pZ5%yv^SUf>T64fCC~$O$+aR@cTp@(6 z5|!|u&EJX`CqS{2oKcQnI-~p(Ht>Ijv$a>#CinZ4JcHBid&EX+TRHOvltlR@=SMh% z^j=#Xi}!ljOi`Q8AZ<MNS~MeBv;Tuk-5x?<Uc~oWxW(CH{Ej|%PVUO$YvM|x%zvA{ zI^4mmX@Zyw{63GHF)oLaTewB_<SzdnjT$n+NiTes;SyKoC@r_RfG0~M3KOYu6k_eO zI167H#3W~tof{tY<-|3z#XA+p-KHz#n6ec3r!1?eAzwD2lA;ZO^&>t*8MbA`A0Hz6 zU9#Z{yeq2haJ7w$h#+Nv80b7KqnU-OLZ!O^XVs5>P+?U8R@9cfPohKoOWhThB=%ca z5RN`3ZGJ;y-D?p+sOaMU5dT!~v<w&*6(y2CP}8=ksUPztoe+9gO56_*MBu8VwT#AU zzKz(!1416O!;g`&c1sLW?-Ka}%w0%%ko07#4K+L5#*n)-WU1D@12sov?LlT5ov(E9 ziD5X-OfmC8IUcdoWpH&uR#t?2TU|0C@+`QTNTa_3_g<Br)or{Bou)b%ygP@*-B}iR z5`IS0s-mA~(tg`30&>VB5Ab77L(?XepBNNM-c~gaT=2s{Ba^zjlZ*;gzaiy2z<-!r zYlnA3K62PoQG?Pu(jDKbbR_=uahU7k*E{&WP88*gQBj}vKuZ;Wn3lw-4Z@TTX}3w6 zhn4Zt=g4HV$v*8Gv5A@>Zke;{&C#xwI2Tfe;s-A9wJ?*;LC$E1bCZGoV5VQ2cD++F zx^f-7|FT-wvFEvBjU1uAq~-5iqi4O#lpY`{^8!ziV!u!c1)FFhESmr`gVl?C%r*TE zdNuo8XSQLqN{@6QJ<@MTSB`g^Hjn0(3#Szmz8lh*qwp_6=&vC8t!E%lv3_2sWeRKR z&Xfe$2+iupDXg1ly)akY_Fbn#BjqD9cQP3Av9E{NhPK2W@;u|wwLu<ld+y>U@*!dV zFp=)A;#(a?K;67oVjH^MZbduB%c`aaQX6JRQfmV*&}bW6T6pmsRJplr$j`2q(?xd+ zghCmRXmkpCJ^hp73yD$yN9u$-P;j0QIXAd1^I2&X2N5sfXnVNPMr<^5Ef0P(9|(^` zNkuo)m76jC>Q8);f>*%(BJ6C|R)Q@6RdM&s5eet`^hU->*&$ebBLJ1na9Bz_WycQ_ z!LdYEbHP+jX1)A*cpqAEnEjhSVkcMTHGJ0{VVN&;GAUK<5kuyPhrsk0B$_Qi%M0K? zp-3L+g?8pgQLDR{wJrKz@t+Tn>5V{SoS#9mBgnbgA2i&7p9AVW(NT(MjNv06!!wce z^J@FPPBsPE#G&#PjdrM6M5~q%G_$;>m};>M?$$5D`^1g($^tv{aDar-P;mz-oFQ4H z0?rSre8=C9Nam%DIO+9-*d-@nQ`ZnnIW`#*-2CtULm7Fio@{D>iXupm4FS!!NDv^= zgKtHORy3$4ZW-LV@i#cMAUOg>a$-+RS?E;1z<BS{BE(I$O8*@%QVXlAxz*Lh|AV|p zSrHl40gu(-h72@vyq$+Mo-}%eDQ=X*;Nv>QGd!6I7KJ3auAaEWy;A~}Rvxj^L`Aop z9)y*!w1i24{u>GD{n5*%#*<1xGZ;_9nP|yeMYT8iSLnH3et@QRGZec<7>-4-JE6de z+M$n%hp0INj8*WE;$8-Cy3xJR%YVLX1f>1~TCPHur(}wz>@e|pIKO4I4A0P9PX*5x z=>4MbHFZBjQ|6%Z6$8$f&TNtvG{9&V8RsE>#um|d(KawBoa9|+Y+k!arb~8{@}g0@ zmC!z11ZODE>$%js{)tLERC%#up~ENG2fJ^uJsC?*)0gZ_H|z#u8O%lc-&yje{7WD! zsK{GI$aGo|nfxb|#<%TK&;Q9m@m<CQQOw}u4QRUHbSr>trdo&LzE?-jmr7oiQl*&O ziV$3_Bv<MC$b&>J-y;b{nV=aQ)Pur1;9C%Y`H`jHs7+cF=F%z~r2K=6!n!Fr5_Fb$ zHL0+|l}YWcUQ0Ks(6GYS**f#Jxn1$7;qMsW|Jh8a{JEbxe-KIRfWmELc?Fad!F+Ln z6~+O0Wv`pBf>73mqP?AA=R#^Z<jSx)n9)-5-{|+{te%RR1LW7KoX>I@8UtV#*@JY< zHJB36j8)oP2@*dKeGbOE@C24P$l`p`s_@?vaR=ZE0|hD>EAnCTsV1@&?HRi(CGJ~> zGEFcg8*dVf+HMgP8NW>*18v=ah@WZ&?p1YJ?uNCsIp6hRHFl%#MQ0R+Fnr7BDa;^v zRwc{h+cLnH*+ec}VM8=D3wHYW=`eEf4;=i3?nw^SoAM>iRw1&gZl+x))<WQXWXV68 zt?qw~`kyYF?<HDtrcMcsyM~bS-+%}>b1#=#jtfM=DGlLzl<0=K?KVr6akH|lQPiZd zOBwV8>`*bs79`0jldiBMU}q6QeK)iV9N!q9?lIn$hxIedsi_xTVvSy3eAD+3!~95N zIO~+M9`~=?WQNkHOl(}zAo6G3&EdIE$5m{W9L0y5$POO#O1c;fJyx6TF>a7v+fSA0 zHmRhcD@k%C*x9l$Qh|hbMtJ`a9p4u=J_E%O@-rpLCnr>R`Q4JRr-u(yQ&_oQMQiZt z@DQKcM7lLzv^+&eY`vV>4<(niJ-9nW81y8N0KTW8?E?vbWk}Z`_b>>XIux#1zA*C^ z*#$p@><i3~o=<xC*piO1lKl_j0v_P6@GRZz6o=r$by%r`n7^S9Bz9)QN(6d-?DZba zrLduj{_?W!j;u+Q`*(O$(6Oi9I2}n%wJb`5Y-0;o>4ww_nmMSpu#=<(H)YZr$qa>~ zMW}M!Wn@$Uk~)EM+5CoTsOES7JlL3N;XbHx&9nv;T!mZ$cz*)&ZiPRq9jhFTiKI++ zt2b4)#?_i_Ol0$*t-zQ=Zw}HiMNK4u<Emo$r)N3m&gE~3y1yr0wg$-n_hXKa@J9|_ zgv!lm8yy=d2%Z3$4$Z7Duc`ehk_hu@niCK!*R!9qa_A?Z36?a3(KIvC<<S=Nn`EY2 z9n-t{ca;!l{XL}(@WrxviZX01-Xt6DJc)8lDg1HXbPvQgBXf15lbz4Q$$4~iDIYTV z>F}c{AIt7Xh}Xj(!d~1MvOY%IytPfhx7zwbQowP-6!gH=>*QeU6E1>2i4=I>ZafS@ z7hiLUUr%*i+&9Q$yYpebUcbg2EJJ!PgcIalm*vxNtU$${xnL=W#LuDfJXp8Gv&bP_ zfj|)2b5J9m4IRDKWl-6JS79(|s`i?&+GXoa-Y*;PY%ZQM<58m<cwW&?aj=zppgEXk z;g!v^sn))3l+7vJblm#WX=vn_6T!K+E!PC;pUn*;_{2+aJ)B%*cMw$P=aT23QpLz* zmt4w#ZnP~()=-PRQ_NEBfOsGGMyBmRTcglP)7F!=M?=Qt)Bms87To~MsYG@1L7IvC z{-z;nB@?u`0{eNVi+Mod0-C6(ce}|%sGdiw8UfYszk?%Re%Pe7A&3s3#E^^98^Ucg zJE8je>O<WqxD1Q>6*@|Z^z*2_@`M}+i<yXXWF%leQ`~L#Xa)Zb&LmOCAA>9T@bF#J zCUPi%uN)QBs8u;wMbV%^wmbz_$1SJ`bJ<M8SeSrD=B(Z4zC%I^705u|6i7z5t~b0Z z4$-dJCIs1maiPs&qNS#Ec0nC_eyl13>6=xLJj=<T$s!oZEMN-Y={$&Shf|%2d^^k4 zLE320bLK!?b}FQG@}|o(4Ua2F#Yaby>WE%kPty#j=;cm^-)1Yjn>BHy7+wN*Az5mL zbq;Rn9&#J5n_3$UPUADqBl^uf{l)g6l}e*cmZCIB6_{ho*WQ~16LCht>!W<kT{D+3 z5h@i!n=9E0eG$G8d_{JCl+x(1RdJt@(JQHLjvPM%T3UHrH~|<Dzt8-errieBu37Mn zW$AU;=RsDJaq_Nk;v6}9q_MMM5?(_S<Gc$tJUW|yH>Av@3$ZHJ@Aw^6;t9C3kaW?H zI?7K75o0pgZje}fCd7TBrPYU6gDGBSgOYTWCh0UTy6e?Mn)o|J$t{C1t<k43TH$O6 zu`*f#Uu=ip7=9vNk!8m+X_cd(yWf2ZX4k0pgZpm(_NRwkrjYZP$i2n)iijO@2j^Hx zr&2%1<fF*-b{>MLsBcrf@bvd*l~ON<gr{~tq*$0X#+2id`QPZuuhDIS%x_rHxeJB| z;RWkH64YPtLeN(5jqtghE$oM_A+nM7d|jf1LcJ-Fcp+j^##R`yXPVWX*+5Olsk|L| zwVR1!VM-7ANv-NLD`=+u@5pHdSidzPjn@z~L^S0*%=XBWf-rDfIH=fRMF}|iEt{lq z<p6b1N1<kINpM<a6+*|@i?B(mc^RB-kl(|t1MLuP{}u;NT!E$i{N=0sC#V<PM(HX> zog9TfQT7Vm>*aHY6mq(`?!;g1>w0V(R&S(l?T=6?r;b-@iq?J68dnNwZ5As_A?ucP zJ-tTv1WA82tzI!bQUE1=QqNJ)Iow`&!p(h-pKDKw(avU5e1VQyC~IK)qj6-5_UN4c zLx5{-c3jwQW`vp*wA{ji&?1}aXr+pXD@T&1YnM@2LLq#Jz12>K+U*dh+*Ix#A_8tg zPlRz8eh{@UY_Od&zC$xdMh@Tghd)=NJRvh@0Uf>fKToLhf-z3@hL61K4KMnhH@rNL zPjBU<$UpeOj)<ACZH074L+`(wEc27WKY)zUP@4$xqYt@hi2p&<u?8Y4#Bm;)f84S) z1dsBtWIvpwx-3|=KfqJ*9&Hh7AOq~-oHjnBaP3f$$e^(SEK6kf0{S*o76)PoQD`Do zjfEMT(}s4C*+^5Yh8-d3D5Np%{9mX=;VzOIpYW`53{)(5f+nvRf(!gA)r?7XlSxL1 z9!%**#E`ZhQX?bp@ZaKg?!Re(9P#ZSC5|^FXms;9f+3dr@}y#>n$jR%(GcquhJJBq z_E5($RLT3ohJDo9O&uwP@W~FYumnOQ)RC`0g8Re}bQrgEORG|>bf{k9s3@7B%7!-G z1S>a0T&w|SFUk3aO_!h=TGq-;Ki^Y(<neQm4u9ezSNW_QIJT!}+&bDAl=qBlV<e?g zl{5Kaq9;^DdN_BW2TdyFidI=W1u`v+Q&I5|mVD%aK8T)9mbS&o)>v4$QTZhYPsfr| zC8Ejy9!thCrYqZy&q^Yrvv>0odiiX05kCROd}#ApRc;c|Dl#}4+zS|{;I$FK5NWMM z&$$w54lWSc%LaHa!h4;%GsjMj4~0&Ix9dvFk%8dSvd7q&BwU~g_Qd(3aX6%%g{5Lh z8dVjVsn786O6cXBx{k2T%WS5Cn-KJ0yh5{j#pqR$lmYp@jc?iX8!_jg;f)VVtHv=_ zPjU(rqfcQ-GdiO<S_W;Bx>)*q`5~nsB1JaNgI#@4dmTrZ;vfoQhLH9iW|-N;rF@rs z@I&R*?~@OIMX|90I9VHnvm`+j_DPAGJ|s*0pfs8;Sx!x)QuQLyj2xZ_{Wz#<B<#Ao z0c|Gl-7{}@LB1V&!{Su^##i)t=LpV$$c?s&iO7QEPAZ%F2Aggzi2YK0Qyu?gJlqIb z{O>|Sx_sv%x^5t@UK17ZvUX}L>gMZ}mAK1pS$EHo`72o0jmDYuYTAx1{QI<_s<L)5 zIk(x{1ikK>FX2!x>}+FG4lrL0?)Mky&l2>F9DXjPxbmL=5zym*)KAYUlXXe_AL#24 zs3%K6QwtMcCi?>r5_8JnHmM3QXdxpiCay(HESo;TPykX6ze2;(9o4$@C7q1|mkJ|P z8FeM%0@M&JGI<ylh;y8=6K*O`Bts7?PJXM`U=0E9(BxI|WqiJtf8Ui{0$FGov^FP7 zv8Ewiuq&Ydtmopc9`~J0-}TpJ$+E4I8wtF-G6yQ#f!$to-I1Yi*zkil`KeHtW}{Vw z0r3QVWhcBST2_g|F4^&~if?hNeooFDinwUu48T3?GGn!r+sTyzhsU&8gnWUQ$2Jny zzn)jFD%sCOhSxm#H>KtA9LcV&()Y)@L!$B#ag-l5*3!ZNE=%IXp+qBDXDHL96w8V= zE6MFPHs6JocJ4I!Vjd07q*q{-T+qNjr!;$#>R>qH2IMv=Q+m(cc?r%C`d2v74y7*i z70tBrH)_C?6fr)HKKiBKz~lhGK~B9CKdx8UEXODn!+>mu*W`Y;yI7Nhn;&Fvhb7Ih z1TMgg2aTO{kC*?R#?paQ8)__LFpDK`pllNjr;{trgf1Ki$YRC_ZljRWrs9TJv=@i@ zGL=qUr0}&7cq5opy)3_+X;$Z#Zb)<T527z2a`aJh4!8nB(J%n*kx8lz1KkxUnVg-a zA2MQ~vhp0})sVaR!&#NWP%|B>7&GX}7@{K7Ovpw1Q0~Ku5Br;aL;ZTc6*L?)iYuc& z$-PQbTl8)8!p(k#S?AJJ611QVdwzHiH96W*XGPq)MajYx#48HFr|w}7cID@(X&3Jb z!jgb02&*<B98L@}QxBD$`E^R<s2tzMCrJljLw016$Vn1!J!1;Y`(#)6PknO9A<1~w z!!i8RwQzb1T@WIUF4o!)M;+L+t_Gk1_*uM+Y%nOJic*eDqnq-;x4Nc1C>qQ(KZwA8 zcXLSxu@-QI4s&oXwK?QTe#lT@15NrXnS=7T5<iz;FEvwR3rvU7Jlv;vyNnG%^IfFT zAA!S|sF8>t%_L}}&ZJtZxt*);V%p&i7mY#ND+Wg{72!=H!|c8+M*TMV0zXv*Ro!h2 z#VjsBINQx9>u@JhI5kGn1?S;eRl%^O4JE}^{r@D%|4))U_g^PTp!Uk-w*-=t*f6$4 zzR=TbtgzjK7wk4z6-k&#PS#QMfM!EMA)6P+l>JbtR(+yFK2Xyi_;m{LB&91!TTvlO z{Buur#CJVey2G3?y(#WpTKYP-8%^br<QIr)tRB-kuOFValMvmz@ek)M4U(=oWLa$> zV-@r#tHi?**_zL{x|l()fNZ)%WcY>zy$^NulyS@h={8HOCNj39-Lkc<2D(FZ*KhKF zeSx&?{tF#-$=t15Oxy{o<U!-QkT5D}U|bT{Wq)yos!;j@-6#P1xCJh2FV~BPNIEW^ zd6A*;g<`6_zr|kJL=${$GA+2wjU*c-o$3NaA#6zFSZR;&eTumabD#9#h><ErB!$r# z76)YxxRLjFykp{o*2I^UZG#abA}BGc(-vR-mo84BZ7%e)8_yBur<Fxyis7hlch!>n zU)!h(R2D<uN=S%o{_Dw%vABI%_W<ILM6yg0PFUthOsMcsqSw`8H{Xkl9L7Py_BYdq z&>;z*p)bt(5d{7Ps^&2fObsPwQ0GqH!c0d+-zDO7q7IbM!`67L12Q|(%WCiHobZ@} z^SBp1!D%XB8H6m>0J#sNXPvOQNnu(p2Wj3WAp0efK?&xR-te5Aq^=X`5fXK~5%z_B zyK!`&C5?y~qK=_V%zbb#R(c-uGPVq*+V~HCvMvT^{>WwiGN^3q7Km?AEg((Lk$+d` z%`bN;!}H~QRDSs+)CRZwoGPy!lrsjFibA=5uY8U=Kf(bbtNe)S9&<$yme#cnarTsS z5BjZE$nnWE`65DbOp<&I|9#+;*#<}D!-1mwJ9K9mc#WG!RQb(L2?U>Eu1#oV8w-T5 zgJmr+liCAmy(LP~pcy2Ccs4OtGTyx4Rnt9hJ%i?pbE+dm2({J0(gD!^KCwTunkEJk zQl&fWerT#pC$^@DyqJ7`9zK&DCuQ9nn)xB!I6jR(T=(Q4+fhiGgUPo!XNuLs-)_X{ zbe&8Z-7H1MRJ*B0(D%{WN0e>LcYW?I(7A=V-xpVCJ)dd4YF&YPE7bV;b*Oe5l(a&6 zK&eR4R-Rzqb!i)e>|99fV3x%YX%vpP&#G(U0Gh7G39t=!(f5$_;1>QzG_{i<S7Gr0 zTnnNRs?aI)cYtl2l9ZQVAF_q8v*@W?hw}WoIJ%qOcn@$7{*68u3N;(zAQ>S?J&f-~ z3aXoo+M1*zb4B5hq8o!TpOj>nO>eB_WX9$(J}9Lm>t}&Bg~(O>?Z6n1g;khi9EK9C z?ny3wG#XVM{CZhfgw_yJiu#U1o|Q_MO-!&NRhv7QObM`Csr7Z`>UO>hER76=W&l~M z?2UIE*#E)C1M!X{uZ?DekkgmLA9-!Wfo%Rj=GqbXv%<`^qa9Z;t}1O7jFym+(NvxK ziFxC@Ye(Gj;A7*2P}+ziH}Na=@weVlzrN%Ig9UozXQD2y9LH99A5R)|J>rh9PQjm| zA>_Df2ss!K7v61^SQXnoj&K9zfRX&xI66&@sxFjL8d+yhgM<*Oc^JH;q>G_$oBYiN z@d~{ZOGdO+xtG~O*)x<q$rGS)_tH?7mYd^(&RdCj=h&bb+)0}tWqaK+rPeqm@nT8p zeqa7J&78W!p3;W{V^l=C0ZM%2ZmKc|YJE+8^}^)Gvg`8Y6nHOPG!n|4lpS((k8B@Z z&-W<8ZS!q-MtO@R%;zMS26KDSBSM4RDOez}2?56+Q<{1$8EWihjfbvktN9%i#Bw4D z%8Zuy`-8Ttrg7iP!N*+VmLB8wMTYxSgo6H^!*PM5Bwi#hqDyq>ex-Q?!wVA}zY!f~ z(Zc4unAZCI;-XSs2FtDXDkLmA^6OmEsIdj!#5VoQBEQ)t`^}XwN;+@~GKJ}pCxxb? zMNI2C(SV%T953c|bbmtO##s-W{z8&VG>TBAIE-UTm$i>$o@O&Gn1*S!@>A8Dv)*p0 z9uaY=0y!?N;b^DM^lNma5vT4lm67w~5OjyN!Vja4>wmiVBUtiNmyg4Tq~Xa7#@vVh zCt6^_w{-Xb`Crfu54`n4GP%~u@5L!C>e%n~U%-?X_?;4aU(})=UZ#9ztH$w$*VLhq zL=&dSxS9NlrR*kH^<Drs)7e9BHVp0tqVD6JA(8>nDs^Hwr#e5{s$`)vn>)?xM+66| z3)Ga?xFN^KgK05Aatmb_F~0ho1OxNnp#k=H;Gl`O_zu<C*-BK^Wid=J;)tj2`L_^` zUw?5xe`JGrLu9QzgSt!Tw(cxM9QVInIR1`1kADi7EK+z%-=shO|HPr(#=|T)sOaoH zHJq{Kb2&7$P8DIkoOq8%aV~wH(&kbxl%EDnYTOs~yctReMW%n_e6<af2KgdtjhC;T z22NtOg7pF%hXvjzV&E3$y~c`ojD&r7<e>0t#hFsz+XmEB#Cfq*;p-M<w*NaNMJ6kH zImUcYs7JTM9l7Aah`|I_tsdTYLFI{$Uib<(@3HW3TsWY}9|uAkxA(GX%Es+D;|iQy z(2U6xSA-;k@>2=86XHxLh%|0yEv-x8pBW?qOVk58q!l(~ISH=^HGXU>gv$n{qKxM> zRZ6=N#uu<vEZe4^Sobd>_H`(83eU2)JSH6clkf2Hico?^9X&b#Lz1pG>u8C`-Dvs3 zI3+Hd^km7?d;gyg(0I0;*;mSQ@H;6hl?%f|0q}+mZVTZXT;?wTzK|a<lM9i`7?SBP zsOJuQA<n};2WdSP4~_Q0+)idYoa?<Zg2XnUj#lcpW`@jf^g9D+W8vFrBabeZtQ^H> zCqp*c&^|cXK^|{`>?`E3Kh31A<k1`f1~HLxQ@)dwtD*d&2%Aoc*2AhvIS-K;w9)=8 zO7l4+W`iL}V{n5Gp*byiA9Ub37DLBp7!-1y!J%j?S}+a`dgGCX5qT{nNtke&;^jT? z6-iSI9D|qB)L7ReQJ-#w<PZNMm!5{6Wk5tpgH(ta=ELj+jK4Eq!z3Bj+1-Cd#v|vd znd2UZmHy;iYNZ~B$^Cqh8lb?A&YHn`q;3`nyZ!;|*gU9G9xACP;~T#355XACkU!*k z%4+#O%);RdTcaV`4@X06=TT%Dhg|W)qPEnW`@S>etN)`jM2xY9+IjLuf}mH}NGj|= zKrGc<czq_iO&LS_U10MmNhc#(r33kVfix#Sd44``;&ji@42;T<3zFoniBDW2y#_|h z5;s|5YcfTHyB@{Pv<5gG*2R&!Q+4Z+fSdU;&3YFy`{_7G!+=qDMa|F_W4tGl5h%7; z9|5zM>GNq$S(!%_(f49PgdzIWRA_8sDph~-2{dGrWf1LptQX_F)_RHnYVtR(XZ!gX zqA);ju5f7*BK)6Wh5`pXS^p@_Ooi;AB`q%*<EQp1)RMgee7yygT(<r;<b5;5u?&W1 zp+<jcWvX0)6w4gB-?v;69OP#bZw_-~P*>w*?WOQKLy*r4GlO9zF=fBr3vZeEJ`@D% zcHUwpNb4H{@Ecm~|Lsx;**QWSGLf8_GbQ6Nd>T>6x|g2y0D3@b8tCUfrg9q^_7f@Q zJ;$N6fHX@z@qjg~x~>Z|2YiM9fl<DywpgnXh3xwv^=&*f1EEXmC+cqzkl?onMpXPV zghWOc?*EY^j#Yp7-yxLQeRvFrektvFy9!L@${`U3LCVjzg~*_>@KqRPV3>uVEjGR^ z562)Eq^pMQBqXm|$;i7=7<9XbEn;?+Ed?wKZfDJ_f|?iUI)kK+KPQ1xAiweM0U8y+ z=IVo3c-%2OTI1wT6m)=C)VN}bs+miWJ^(}3W9}n~85809sZSq5tJD>kz+oB?&&d(i z%DEEz1q`FfJ_uxhiHarpGC6=W2w!^%vd=T64v35Y&)pe(KoZI%IOc;T68YN+46h=U z<Zv9gn}OM=W?(YuwB!HOM0Q_DX~GR2`K8d4gSzS#*?JtxX99y4_K&jakG__B7cMRC zh81)}&RwtXA1Tz49rSdt<TV~5J3+N1-RBh`=TQ^qULi)R^L<R~kZ<_0ySbQBg|tQZ z$@Ga>csMF*U<_EcvI`s7D`NC@a$454K)h1W<1ieErT40zABSh06nNaLC07{Ffl__J z((?R@JwB2v6npYs+5Dy$v?R<agvSV;&V;8ixu<Umb+Mk{*{O<@SrtOSXhglOo?q%g ztOI%+?|P*pad@w<dDxXSApkhm-VzJm>>)8B9$8Y4qVq_@Xr%aC`qjh%(sBUKGu@g9 z(fCa*jG-4253&tJb;ckjfIcx=8S>qrRiJt>O>>c`alRUfDMnZ5#X(nSXczhUmh$n7 zD^4#6n)iB3^Z<WC;#5Q#6AiAfs$tkpH9muaLo{W=h$wQYddSgje4;L9pGT9fjQdph zRz$M$#wgrU;J$zR2oHL|fdCuvA{U=u!lVh%@}`0ni6I>R&0xvbgHhN4RTWLQp^(P~ zMF^`J%TgH++wx>UCW(2pzrazXatm4IF6p<7pDCa{4^a`b<GJko$bv+_Wp$@|Q$=IW zCWDFiMXVp^9afUh*0g9xL2M!9$1&;I`h^=>^Y-X3`GijpDLGXE3KP~Fw@b`JE;Jzi z;$AE!?eAkT0lNR{rvD-qljjjGDAVxZfw?3QCg*V^LR!8zf`;agWF-&Ysowr~4)R5C z@IXcv7!LCjX+<r6SP!cT<=92Ut?N~^^Z&=fFvYTbwbPaC3Rwq;7dNn#6m{!`bcyzE zZ7&Dz6-e6&#zzO4%|qaHLA6AO;|V1-Eyik0+~QSebj(|mbc_nA&XQh{y(!L3d-vHD z0uUmxYnu2qW1-k(Eh3Wmfy~xBXH;4Fvv|_TyHLQ8*Ijv+IrN;2+L1R!&+UT~9@8we zfOa-P9(`N&0JubWQcNOLP;(MjWzJmdbB}Le{CFQH1$2+0dcoH!)_!_w(g0hNK^NaU znjs#Y)sSW;SjTKl&fOsZk-+ef;l8M+WuYB*ui+%}r0k%YDE}V^t=<mG;tE7h*Z-x{ z`<I1m74!}`aXcS9Ps^)OxIxO}se4es-3Y-)qn;I$Bh=%=Q`G!n;Zt}~5-R`WP#vt8 z>30*f52^`T^oIh2Z=)ZtQMEH+6=~EKj<O7@GmzrJ1;1wjO;(SMd1~8tj*a0{TJX#m z9=gv9&7Ltib$)cs@GibRX+XRKD`cIm?#O0LSCxxGv+UTo9VMGpE*;0S$abqr%hQnk z1*Fz;`f5Hd2duNG5@&Gc1e>Y#3<eCcM$e8c@J*UZGXjd&C0j>h%q%)}@FcBbRR89} zPAbfVQ{~{ihXZtF1sW^6vh`&p+;Aho>@q5$*tJ}&mA2H8#Wn4bNXaF}X?GV5U7t)6 z?+k_P_~kTB(p1_^<!~)PW~vbuGBZ+OF(J!`#Gfqe3S$<vq>SLgal(`xlMSyOh|xgr zSL#_>mB-QjOIia2c}EYoD;%1-qBbuDui*e`#p6~~L99!t>Wu-*dbt!MVy?%w%94Si zdWo#RGGjhT9)J}lYN~)u_)HFn^>Mf}{sPF{>MBUIsTiP^E$d<ieV~}+`wj}Ys9~-7 z4rT@NV{YB_K_}rC@Y?8yyoW^5QXOn;(q6bBq(bfxxp4Wte|^cOb6c1Am>c>QU#KM* zeb>Ty8gb1M5nY@c&%|Rt{j#MS7J4z7?&N!rT{w&Fcu@}{v7fS2!BRv{k+o8rNM7q) zR;mo=MdCSgW(;Wi;r;R{(68+30hdX;m0xJ)XWW2?+-TWsd_Pgba|JDw+ZE7B3*Kb0 zXCi>iD$i4NuPNfAaDzX~p}njD9^8ac`fJ)^<%T_Morv|D<;I=Er3o<02;_E&DgDrK zg`X{%p>`fvZg7EM(lUS?$WbuxIM1b9la7gp>`&0om9?K*D`CQS)!R6T{|qY8K6Vt* zi|YES3?!<-S^kjBf2K^r^ITMZRd`PpH?RDY+1X(7T=vR0rUsOdw3$d*vCg;4au$L0 z6ldgRa9=dK<Wgm<3$AA>nY9^yEhJ)WdjSYdLJ!1uG7Ir@ZM3XVtzP&7HQA7yN3Lr& zdHB&?LThh4;wi}8e8+4cby>CYa*n5b37(#$q@5*4<+N$^K<PoDT(<tLpJdSNM<FM2 zRvI?6t)E3-D{0dFFlw?#V@hT1vSX@$4z4E;e-++dKXh~-nudmLp|W*1n{yr>QKllb zsn&R`WQ@6oS3IzM9I+kyPa^!UzU*_*;kBw?W!R^tFdCzJJMe&#p{E!ivA-7-H~C@I z;ygT*0-AP0@h^_xhdoIT6;olAg0Q=Bs*@<bp%9E6+?XlhUy@D@WlB;w{Q#zwxr(q* zBHyHG3C=`HBk0DY_?gd-oRSRcp<DC{9p#3anM&dp<QEDK<$D1G9IGNrU`RQ}176hd zExHxdkgP1MrriU|Y|D8>4A!a8;-B^{`AR{O`K$&cFY1GU=eI$DKvH5=E83P-l0jh> zx$uhag>G;7z8ku=T=QtAD8>tl#WDk)8O6*@#8VvcJRHsS0G^m}7do7ZDw7hV8e|l( zaKi8|+Uy2%wuv7iY}Z|*))t8Tg>MVus94ewCf7-0_RF(B1RFi1vRUp3T{5;YsZTC& ziDQ#a5p*o#gmjZcd+qL6XkY|qqkA4Km)J<h8tNz_t<qrH*unTmUIk4CJ*A#KkWEXy zk#TXba1&jf=+pJ$5uJ<lYYz<{R0e`ik>qBic~X>k%1%IMqj8;N2yiNC*z>>JJNvk( z%Dn$myL-F4ZOd<~)$PG%w=yyxX1mRd5KfyFDJh#SqN1M6yh#zclazF1u6DPia+S>o zrW8GuDdE%j1cV4@TSF3(Q9wo*;iNQ<I1Cf>eCC{Ueedrz13pyS-urspuisz$pQZ&3 zGuQcEpYP}M{-9{6665G&5BIoXPZlolS$d<yBfhVLL4IPlO0UjbFtgV^zwdTwI!ftr zoHa1%IN4_`RU`L#+yPiuLz%}NOjzvBQ@^@E6!(_!s;a&UI|-?x1hlmXg>iS2S6A<| zoRbIP=27#gIVxx5M+F+D8~1fpT)#N6lyJp}N|IKpYeR8iy+7#p7Bk<r;Q&ssDK0cd z=-m9k%#c^iS*~?$cSBYwObiMy)e%e@`7l)fd-T6#0w?o5X!<Pjh+~6-?>0Di2^3S# z7GdEWHJFP5k+I0rgMNVKFEA;HbM2skh3IE6st%g_yxFSfWA(u`u&53-8oVJ0c*WCE z63RJ)HlO`#R)V)JSXi7-Ca$B0+(LIZHMNJ%zsGhq`F}xokR5FqeBueRmStjNVx0fq zRvg?)n6sHa;=~NPG7C?<#ZD5!_%WM_SK>@8=RAZaBXnUtPUoW+BeE+;(H|cq-==7l zcs8^eX8m1BE=O&~v+!(_4y~}n!abNxGRP?2c$2MS3b;dsR`U)aU|2%#C=wd9TBr78 z!+XOTm^1c3End!tWT6H{q%4JIRf71d!~+)enBjqsCvP@Qu$F7t2~O{Pt@IvP;}IG> z;xO4VJnT5IM_V6WuVMmj_bYUwE$0KWPnc5&AL=b#IWm&QL?TZsf|^S%qf)8_U-0Rd zPuzvrt!gr2EKCRo>iEUlSwknj26sZ^oN2s4OK@uLCTNZFH<yKT1D0*oEywApGI690 z7mD06`0uT%D^J}H4Gd}YGV<=st3V&UU8rQbMh23vD?oh?=2t?x4c@|y5;>HI1PdRZ zHhL`_eiIg6CVipi&4tsOL^+fi&Wxq-D>xQvlcW?bd_8}2*?n`Xwc&Phoq$l49}y5H z^$6K=pDGq>eKz``)$|!h5V>NU3lc9{4zszzfS;Q_lEHGzd&4aJdZNd?v~uJe48rNI zA#nPqjiGM?rw3JXs!-|AWGf8ZOrRdHdW9NYVlerjH@eDLjmkkK+kX_J(h%8aG{m!A zh~qTdbD-1^#(!nuyQ{CPKG?6vnSo0JleaGBx3Q&ae3ga(PH|gDB=G9{^^Zn<%KQ z5w}LiO$4FN;KS2+{A9`xLuDgkxr;b5FxvwcGhe2{&~O`>zh8TnW_DBeU<dd=0cj=G zGrXoSIul?+tB#>K#fqf?u=SF5ZYDTX_x(QnDRK&V6r_4wQ;@1_a69F0*oYq20Pn;9 zRI7>)<6VF*&E^_^2y>J(itrv@4rWmi%}LNw&a4xA1+Yn~SfCm()3BVqZ)7)nipLGu zxORJ_u;y-M&aE5+^G)FC5Xp8FOb^y|^r@!1v}JB$_Uhsx!=T>q{y1+u>@7<AmVj^o z&@JhATE={f!8zlJ2e=`X58pgo7EPS-=_^Z+ADlX-f^7_pOX8%1p2!M5vIxM8yc?YJ zwKHDs#+b)rKaMBoi~V)+=-TF@xXnJg+YUL}y&9f)n*{Rb{uDgSk<rvP4Lbchq^8gs zGTrOh^cbvgYt#G{cAK=rhabRSitCYT1et5aLlQENO22@0jY7*}DN50_%W*X@c_qYn zWAQP*-5BdH^I1wx5i7-4dN&F-@1brTu}9+_V~dl+jD|(6=wUv$4(L8-q#xy4FOoSX zm`I1H(suD?Ac7@)Q#j+M);+zajAv=*l3?;|(Y%Em2q!lV*}o;?wcN?PmH~2O3<EJn zZ2oUwmk)ioi(Bd7PR@TuEc23LTcMEMU`YbyNQgbjoB9xpioQ#9CYL^A<L=bt4^`3G z3w_;~(O`mrQzb9UyD@M6idJc0>jIkt9Z#g)!QzVeY(EnsqmzE27gq0Ib;oxkHs134 z)}NEkn>NyxTaS%dAM8X8pJoZ2T`pZd`(!+(nl6$QudbKTdQ7$ELWDW1K}*n$RAg0= zmKxJ$)Ffhn1EEDT=PB_F0of?MfaA|z3x;Yltl)U47m8OO#F&DN2I4#FRiWQozEG!F zFm^J-I67$k$hsR{at|O$i}F!ZMJ*A&hIwSsI-KuH9;P28Qhd<Xk<oOf6_UG9hhvl{ zF@NrzvN8g?mfnuD1A<)`JV*yzpRk8ch_`<Rx`||tnz;#s`dzqW-4x+&&UpgKM4LVb z!*N*GhnJ;<cHCgEA}9MwMzOOet9q|d<k38urGwP9$QT|IxiMkX|4}+AoFmaHo0{c- z`{_iqX~Gg&Zwsw`7OW$!NExGX%&v8jlgV_u;9nYz_O$t7qF)>=<Iu}T33;7VsB)7( z8ZU_n+GZ!3AWi#_@ObPIZ{XJGE4~c|Z!>Rvj9Z*<R996b1;mzf<n&aUVlyYg60K+H z&)boRARjo|5dK%`o22*(eG}GRPu~pwFJt3KQ0H0p^y9CIK%lTuv)rIP-Ai@_NbyRr zEDMrhe#g!re1v(9mA{*;$`d_OFAlqGt>Ek7dYLep;K2k0uIg>}?;vxd`S@*?St_K1 z;5-)-rn*us?GU`z@7LdLE$K~OQA70xun+H67R<`}J%YH`s$8=1OoQ|Y0@ckrs&k^c zVK)L&bOyGFczc|6t#<+gAI$#zJ<@_*C|+HSIrxb8PV_a?p|)rUWVx!#B8XiRBj(TF zK|6hTBxh9$OMY`Sc7beA<iTBft8s~HIx0eq!MCvt9|PfHKh1>E@6J}fh9wdGK}G%H zqSuk)%rZHA;vqY}D=RP1JTQhAsH4N4@wAB4oPX66z*K&VmSGFi_jqI>$^p8!<+~W( zJ2*<cukHb4KtfJRlRL9NftmxKP+fa`69WdU)zEyp@J-u-vt*fvJ0(7;=nZ8AoeZ~7 zrw?+EONlsobL?%q?MsM;$ZV>+jWee$>A-A-HN?5&silN(HTKFMK>97wC~7nr;tr23 zL_F8sDx-H=@?7K_B(8_MtcmR~{X$fD_)5qQBVc|g>^cNbC{J&O!#%d)=mQQpng%V@ zq(VZqtzK}MEv}xZPl8AT(U4lO?FRRQ%I-#J8BHf#<#0umxmw`6AZG~VHC9^kt_~5` zEEPUw6z_lHl0e_YR^|Igh{C<A+Ugyzu1Ju7QC}hjcKEwcjt_L3v&0TByPAGE@^yM> z*{YpttU)QbY$M`SSBev7SSgsv&@KCaypT3@_?b(o-P{2;V*m-WPxQGs($J;*rdRBs zT2k!k=$pgQhKugg0ozF^X%@dqHP)Orp7;Z`K0*$THr`evb*>mQ3c<p2o<M~w>yAk^ z0h^`H+{Dt0cy`!R<_r*q_pQ2Ol<=rsYU~G^zKkrZ;}nsJ55vNSn>7B=Z1m$}9F@!s zTArzcgCuU%e^qK}C<@i&Lsz)&;ll^vUC1j2oBCW^$XXszH0;;rRQvkI-CTDO=&JaA zMC*mr{HV6!^z+@SSVC_?!T+xBBoFI)cg)>BPjH)8%_c(KS?cWXbAXdiv_1+;Qlx-( z0blF(6UY=o**JZdG1Mk@W?T_d=O4unflr-G=x6Qd2uLUHgu6!UZPY1F)1SP9svd>s zaA`A<p7{%b6|OKh79UZgxt{A~R8cc+f+3r-EdPW<oTZ2{h$=+hTt%sY=B}gjUDhy+ zT`}5A4u3`V<S)!GWkm&>kd)#3)Af$B$87_^!pFZCDYWOaRiD69_XydYa3ctRC(m~{ z?zO?nJd`4sqwH=pRZNVUDp0cah;x3p|Bq^-A5|M0f{-x&R?<mUT%{DlJ`{PAQL;8j za01a8a7^O{yHWDUvUy0QDT$D3!dH{V{56WiLP^)buj3KL#G$RCfaV0LSk(-#v$sqo zY+$V!89N2PE-KG942(|ks68zI%}L>?fyT-F*ZiUUnDES-CRrfI1k#u4sMA{B)kR5x z7oQTJ<5nDF$l&e2$*@rs`RvQok~nSmMOuPZihI`z9f=XS<3~)6j9d=W7eQG9qy=#) zhuTlfC=klEVSX-gI35rTG(G{E*TDs50l9$W>7imNwKbxPA{T2(l8g-0!0*;9;}(M; z(D#NT8!8lB0l7%o+fHU43v`lfZanN5h)9h@7HCiqFTaiXnIgw!JwQV4u5t2+9T-*- zTf8LfSR|vnv1~JxB7>u(b3~xi;QKAkmV;3qnNJow3x*+DKhzU$b%}Q9uMr7Hd=TPA z&D<kS_vg#q=lu4>z0edC=ST7@hIb&no@Y4sA}hf}TOVWu;EV${mZ8z%mMWOqYJ3oW z5Ppj^BV)AV_`FtSnySoO+9w>=%94o2hzb%+y`K;_8UD^UNTUIAmgekxVKlAChuNy7 zvb-y&0i7ZuZqCWdIS}xA3oi>IMi=#XrT!C$Pg13eJIohvXwxgI)r9B|%-(h)-A~9> zv=WZ)t&`p)9}?R_ZsYt9ro3yt(k@cUV51fO6aDrG{y~c1ma724ePG^1<2uNPL)j1W zG+v`7Fp}_BupYrRdQ6Bx`W1&np}KezId`o;qKIKeGro-(r9sp&_1__pJcDlsM2O!C zFK-F_Ku%i*4KuM`#ZA5dNryvDY-R;{9Wq0>??I`~LK5XO1qi^&nZS<kztLut#aVhG z!W#v~7d#ox<smj=d}BdVhWustmwIpEwmaa!$8ZdV_}2g>oXF>P8|q$cz<+I2i^R3g zq7}RJBGj+fthYv0%9OS+TA_x8b?nB*){f7Qq0Q5%;P0o40~f$Qzyang+U40c5g`&B zdw(EXoFT@8Uy%p7h1DesfWFf&i+}-A&V8RQ;?$BGP!}2Xf2fOO`Bf)6pw4P}jdIXh zV5b_dXc<MYZw2s+Xo1gFD4q=;2p*Lj!Lc;UV%hV*h^UY=nj`-#SMDc2iEu<=S&+XM zKM`Nz?F#u0(FJR{ECem6&lf4AOcO2<M|hke2!TnEW^d}R9~n}}?Ui2|rfn&Nk4WH4 zDD30@B4}E*Z@UEsBmJ|FOJR@{nNPlO#)f-<;7fo8obAxo3V$W#w&>#IGul?9vp_?e zPIT#4=1)|;>G&pa_(Ah4&-VK#ki1l}3DZW>E)2+k@CAL))X?O|SnY2>P%&Pgj`IHu zZfuu11YVB?Fj+2Skc;Tw{I;a=AJ~%c&m0ujDkh;-QsnQiC|<oVw8|TXF0Ab!Ka27H zwVlHj5*rs^Tn!~?p$O>l?h$k8!*dWQR`Agt8Q9k;g0KrrP1buTZnHm!>1fuAM1Zb$ zQHT-D98!s&QG$yEuP!H*+>cvm2yPCRcm8DBE!?E7@X9N&>{04<r0)pwLr#&))ID2u zZq_(vX%~)AUIvrHL@<jiipRWP_>S{t54k(rWJ`j+v(gp$-5vILE%2p!>qMoPtfu@v zz}Nn#etju5m%=mM)+Ky9EW>apK?-_gJVAy0*g^GBFVv#ciXPzT68B{&L{teYLTJQ4 z_<?pR73~?qo(}jSzKsw}+Qzy~+|RF~y$<|s&Is9hKj6e4ATs?SOHK)Dp3}Ac8YdQi zKl)yX;UpY~L9n+6euvxR2!Y`>gpvqCE=@r*MNo9eg~f1Emi~6jqcHh?Aszu-IQU5$ z2E10sXjQKY=nDC^+3L<8drQ(6Zdwlpxy$bo`BEG?Cm`*I#)qBl*m*>q$@mp*DpH3b zxZs?z#$b0kW;G(Attrer0TFN;!l;mb@5J-J(5Gg^#C&2>xj19maPm}?UMfxoou4lf zxTV)k45lXjxVYU_(ZwN%pt+mx&70XcwGoCIO~=!x_PuAfar$A)Xs)USorqWy9hW-R zkXl=;&F8kX;lgRK*q+1R0gI4q-G_jFE9{8M@#%GBt*k!-8JEP(4t{eKb2<`ggJP{) z7s6>x8C3NNOwPsl=3nuU%RePef$=+md&4*!pAM(-koy95<1;l1Pe1|SVwkxP$KcNp z8)kZ8<Hgj@hhT%M4@oI_(jPha{K?Bx+H{%qLRe#Nls-p>B|1K!Kx0ric9ch^4-|Ir z*hNM&tEzbuUOG;&rQkK=pOJOnm6`V!HgvrIu<>L++jK@5%-Tlx<U{HfzYyKFY;F^N z8i~SI)sZN}E27ABu>mBj56&sI4cPjy^~L@C)z*hWI1tZf#Sadl2VdHW-KmMEx$P?e zUsQ(}=uYgUryVS2fdn^iteeR(!B=QTSUv2L)6UOKpBf%(A@jc>ygZA3Vt6v7B4Os{ z1=MW!X4_Ivi-!v}M-U=+)|{!%G&K2d^za#=zmAudb{tJJQY6N5rVD-(g#Gwq*x?l6 z=p&wBI<2$+=Qm8=Gqr-H^=|>Uo*oHV0(5;?GcAikOLrgw&JKxPq%MTyfT6AdlwT1G z;+1ty7bP=SSY1{KCC70KeLKSkh>t1yyT~xDA_qFMDe7Xk!hQ5DN-9*7$2-kXky9q| zRWL9}2x)R=^<8ZCRLOG2?=wGzP8pRkatf)r0vx@#Bi4oSMf)yf-wp?P!!cs-=@YLa zr%!W{(s<alLp7CSdfnx?(?f1IJI~HVuj{{xD<xNOrH$gD>v5%l0DnknZv2F}>i-F( z?;5ow7vUiJz3|T0Xw`^0H6bFc;4dRKqd7US@Dd;sBj){k5mIYe=Bb!N#bMtXN2b4G zY{Mbij4K8tTrfm=f9u(nUq@5jvZx1JX3XaZwNUCT!ZF(1g#zpl7qMQ2>L6I!-k+e2 z;Ji>nVFSwdV9w7e&rOkY7&d0h$ZJK&ZIc-@hHki*q|}*wa#N7&q~)-buXG#(Lmv+A zn?2Q|X%$l-1;<03^kE!#^QlqmlA%&f#}(drTH-f`?KJGucvd_(eqXRHMd7jN?2XP9 zKkH6CX*nBeVAOI(z)$gVAIY)pPGKYcS{|V#hlyKlK0?h2(85ASbv0#kjkC$xndAIj zBQo_vE5v{l{3JgxTS-;uJl9fZe<O{do<x<sM8uXy%v{T5vx~GWk&e)GE4Wl4co(=X z@k!{?#{loIyd>oU+Pj4EXy2Lj(WddMU*5Kg*)<V2+WL2jv=>x0XF_%znRG$2z3QL7 zZ6a&?nOPVeHr^z*okAp0f}e`Rx%YY8Tv#Du1NwQL&uH0|VCV=-jnw%mT00>41u2i# zo!Q$dm(64npRtTBebKAAoQeo69}r5$kX3Usw!y2_R9AyYeug`|fNgEheqMOd!8zLX z3F3X3q(sw2;$5+i$4>oqwph()o`e^b$rcG`hsZPKEODarv%sEu1{{5Nqh}{3bpxcI z;IF%@Y=RyXJlj;xfV=Zb7Ye9vtjOIP;MI#z>-7|=;(i!%q*Xl>Oeum2spdX9eJEUh z5mJvrgI7N!$t8-ZxH6g4D!NkN%in6C<IAxrXL>-yUdc=~6Ml{n9JH{fTsq0{%Nqlk zg<X8rYy<76#wW*Ng3bd?)4lBw4nSTq{M@C(9F4|hl2#l4vIap7djh0o31wnw8HQTj z^QhG(WrwjptYYLf!4E~%u`CX}v6I%~W+oZS<2bC|K>x7^uw-H*Bp!}#$Q|CbPYpGX zkd9Ai@MhXtf|A>-xg`IdV`YJv8sBWJp&k&&h~-{$pyV*jxA-mo`qQGyVQf29BMHO= zx)tyT{JH8m!%(d5z%RfOAZc_Sxm0^40dj=uJfG?~DtG!ldHFO9+YnprH{XmCvAH9Z zyKl9z>S`E{oRHlM)L?h4TlY8$d&u4cy%plgZ84`lBj<MJuk{MHQ*r(N@MCQ*-Fdj3 zqN5k{`(8fP=x5$=+h3!fao=^`a17mNANr06|7&AU3JULQj{xdBFCglmB(Gv%to#K0 zzse7a@XMIz(`bVm5|XLu>363b1xrY?w5ujRsZ#W|JqUSCj(oR;7?-2DaF45*R=eRV zD&&VF_|L`*MDP?S=23e&8KM1Tl7eUU#O~%^E}H&O@{WSL*T<cwPx(kMyvTwHMctVi zGxXuO;OQS1Mmh2S%tN-z8>)h_iTC2fz}wW+X6ZHfQ4nr;KbENO21c4oh_eB2gspzI zd5I}<aRI<*e+;@SqMMyeOaFNgHFx58)8Z5F4|1GSt$Ri78Lx>}w$phYb<Tm&;q;A% zd-X0i^AZn=`4XCO%a*`$t>YuYMVi8=g7aRw$OaZoSl$KmV3d38&BJMqQW$P2q18?$ zbH_-&)XSGUN@ky?ZHVz^OPj>c3&o&10#=#zxMDypwmWaPEEwoaH=B>}BY!IA_dq_E zn;CncS2ou>%^@|tTi%{{Qe=S847qac+-T}`i<&(VIuw+4WCYs}<XF*xhYAiuvdWb| zYu+!yp?#X<a9d5~LOuM+sOnl^6HmGpY+6t$7S?92%2>t}h}pIgw?k!k$2Sq4?)}wL z--b2d5_2wlUB{&&IPV1`C>a?PO&=*1@<20}>(G6H)anMW*axBfva`r9u3RVKd3X|| zn30{4-Ngw}o20XE+y&v1*dkdixe<P6EyWZI<9CvyWMF2HUZ&$St`Q%0f_cX`#0Ok9 z3L5nHo7O|?Inp#uZTJw}d`-4-=dwP@QdZBkp29IC6LhTWB$-h>tG-R~tmtdl?%6$( z?#6qd6Am>Jrh<pyyqE^;(7mi#G9?_jwPEpLOAXmsf=<z{g3NMs-2@-PvLO@P5hVWm zU~I1rrH7b3R~(rPBVT6EY51<DA>6VKf$j<L1ZE#Y5JPp7p|FKM)}{WWzvYyl;mM${ zXfT%@+5Z^|7QEqUsLZmHs_+8O5XC%>HiY4lmbWmBA4JjO&e9_No97`J^^Z5<Qf;*A zjEhvA$%R@0=-6FG_m3!A^{KPm3xDF)wT1OiUotNRL4W{>@bO_STPs^7k6J7}rioqL zT(QX5?yl4#d%+>*;H{%Fi$;<HVN2cME{V+DgAJ&VZ+0nWJB1f~pCy@`fCoMn_LRvO zD-2Y)_E-x2C2y<xdNR5JioW7l*Vw^8%H<Rf&PC=XIWAj#gH{@s4}~=~;|oPQlEzeO zPn}7X4=WT`Nw2i#w0L&dl}$@*w@pV5_~*M<;A@bhCge@dclq6Wf?^6}Fi^o+v9;UM z#u)-r?^GsO>A}Tl2!a;v7!F`kUm^0>kiJlh^#h_u6Qj2atWfaxyF0U~L-QtUg?7qk zLtI#@q$fL(V9`X<Dv?Hh4=pK$+OE{Bq*)W;Vi(sfB!*zV8rzjgh+eyNJ)+$D&a3`F z2|k3b-Lbd=ksZr}2S~ZS&I?NebveqKx%@4F7lLEq6&fL0QZt(y+%MCtI>@%;%?7b9 zt}_sKNUXOXd_{ZbINo2bK+0QFPliTNII4QlFaVBLf!Q#=9W4E{G8nOA+`%La=HbZ2 zWlY4A(Jw`OBe$9)MgRWYCG+k`l8#acseGgE2Y(y?Q6P0opgEBG^Gr9CX2HkWO@JH0 zBM$_{L<i*t%2H{6S?ZhYRQ8CQ)a(jYCW8n3aa;(W=P){rbX06q^tr65cCLw5w>#82 zTeENi&Ph;xv3hUb-#30%h;<x8JIK&=pvr08n)OFM;RqxQfg}F~sfqYdE!hX@6zsBH zBH7?}e?5Lob)R*&DkR(N<rXqNP;nT_9KyyV7p<yMRWJ7_JlT}w5Iz8Wht_$;C$yAZ zkad}x8ZNWpPH!v1JNdmm+(j7bzyksHUpr}7A?^&!ItSYc)nmp~@RCRk>#eBL$7Kc4 zTh4+bSpj^JAmLYnsL1$R+ay|c0zE6`8ehYG$~t(kOJ$|Pq`_#L3O-^_V3VRWmz|)W zk`ez-lKeYK@;ylsaIf7tPoYl3)G6`y)X^s6){ZOV#Vl3d%rBKU`2FYs?NG!X<l@Q; zM_sa%;S($B14T3JUMH*(7dgdAEl^4NYtwKXJYPMw!O}A8mn`c%)+$9h%FgHyEPnyg zZ-=U&g%vGM#|G9K5@}f#qxi0|S4!4wSBp{(nS}qR&(YL{FWGP*eJVBHZk*E6sl|yw z)9VLrn@F3tJ?V45lypBi7B=v#TrCj%1qw!ZA}^HSHl4nSZ78>y<8T4E4T=|uQ{Y*L zc-+q~M9yd*)VajHL*KpIjLwhE$PN=<kAlJ@F2MNy9f$5tE2O!()>ce@R-7V!H^JD` zaun(1oJ6E~enWR8i?Ax{G9T$*1*Mn!0G+n@)y-F1helE5xsUzo?iJ5&6%L=g<Hrqb zL1i@lL8tIdjtQGKrLf1>PL<6c;jVUAmp`Q)D&2SGug?+g<_01oag6_TwQ{w$69zMY z=MvRi5UN-fK8>j%vfj%V7MnLG2x&PqgU7}>{y}J8i{x@>|LfI$M9lSf(jxQ(XRy3L zbY$6w)vC`A@l!``FTA(9JZNrFz=i=5FJMmT-Zi>yZTLQs>X5$2Q|o7fa35YBxH)WR z^1Oy?;)e&M&ScEXNJUOdKFj}<TXDs~#>p-mgRvuUG;J=RZ_q*bPi|1T&CCL_?6`bu z<i1(dBO-%d?G8gVa))DH{MsFRliieSt;ZImhOhJiJ_j!lV(wVx9?P}@E*8pA$3xBj zYg{|Ag^ce4*X}`&lCBS3UPvCNcpbtg$3H-k&+JE$zmBEtnu*w(_wV55N&wr)AKGa- zomHa_F3;IYr9PdR$3pkuIc5eiDQm3CTSa41ided5{u(r2=v&bd0yW6WwJrtn(8?Et z20z)wPqGz2yPCHTo8OnWI_kpHo}xqSoXJj7Ji;`eW&TWMn15JA?dVoFluJ**Y_4h@ zL@QR%J!1q<$w<gQZPNnNg6`T&e9!tn<cq5eF#Q|Lm2q@y)y|qgIImTac3=w_7wK2= zIeLUdL+M)WgDf($9Hxd*mp}iQY;%W_!PJNEi3@1D;$_PJn^1nW<NdeSbh`aRLV1RK za8qn$)b$wQ8tP(3y-xoeF@)^3nCqiQC2DswUT=X{@-!|P4g~td8!)Q6x1GzNvnpT) zD=8l6k?teX#kk`Qg@K$aEm%@>cgeX$GQX|mh-i?XT?D~L$gYv}APziYlfupS*|9xj z)QT69CfkZDW~<M5hOOnxKGsLD^9r{W?qmT#OjRoGt$EYOMQ}o8UvY|VaRbI9V51$k zC=WPv!QawRZg`q|8Vb8Jm9X-hc8FKfCn5J54Pzf^LOaab#T7i3JB1Y4SnOp@P~Y4+ zEG+iOU%(*;tdO^7R!BQ*=3JMA$5N>lq?%j<BlVZ2Y6<mll>>>OCgW|3;tNi2Tq9!X zN6b3(AAgS)Ry^V;N5R5f?#q_k&s1(ivJ3`v?6!*~+&;~H)`8!X(s(*fUOvUI9vIz7 zT8bfcJ*$dcgNqw}+?A@>au-KN&9q;bD?cZ1Hq->Zhd?T9hgX#hymjZSMMdrdv~d=| z5vq@Q%|GpLSf4WWB>{>fT{x5^9)9!x;0T;?V^I8WxCyNqInUqP9^PF}Pe#CpV?D<- z^Dn|{&%sY)_CE;rAZ(4c&$)WRa6~J?I#b!-6mC-VckaQ5sqVwbH(LiJole8&c(4XG zFmy(NLeTAe49{ab1Ui)#&ELE~&r*#KWCtI0e3)h=96&!TtBb84HBgsw&p)qASsENu z+hA#gBcmgG7crS&O9!WW&H3UViCG<s2btph$e$bd^S`8_JRRf^W-s`slvIb>$}!<C zqIV9LFv~w3&{3>6dV;38n;`Fu#uej>6Z075@J+nKY1zO6Y8hqV_lZdt%&i(A#e6IU K@@U!{;r{^|KBR>J diff --git a/client/resources/hardnested_tables/bitflip_1_06e_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_06e_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..f1087952d9fb6fd1c4a10a676f346e18b3cdd1b8 GIT binary patch literal 1976 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_06e_states.bin.z b/client/resources/hardnested_tables/bitflip_1_06e_states.bin.z deleted file mode 100644 index 5e678bd47a6c5bc6dc5e6813218166e9480ccf9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17200 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 diff --git a/client/resources/hardnested_tables/bitflip_1_072_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_072_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..138c17c0f691eb84a5ab05462b1596a3c31e76de GIT binary patch literal 4289 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_072_states.bin.z b/client/resources/hardnested_tables/bitflip_1_072_states.bin.z deleted file mode 100644 index 404b482d852f5062fb94472fb04fcccc8d5b3a58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29569 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 G`#%BI<$E;% diff --git a/client/resources/hardnested_tables/bitflip_1_076_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_076_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..db0df90a619cb040ed79a07a45ea510e5e94f7ed GIT binary patch literal 2101 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_076_states.bin.z b/client/resources/hardnested_tables/bitflip_1_076_states.bin.z deleted file mode 100644 index ac58f16e52be3e7de0a0a62869ba0e3bff5aae92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16139 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 J{=2Ma{txgr<T(HU diff --git a/client/resources/hardnested_tables/bitflip_1_078_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_078_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..2c6f9cd4dee91d031c692d7eb4a2cc7151aeb11c GIT binary patch literal 1284 zcmYk3TTD}T0LELOK+74}EB^;?Yw3};|HwJUhpt9YSnCEyxtHUDjPqy7+@88+0W?$E z(~E66qE$K%&TI%90_(#$Z%u|v&*?>%_<&)_d@!aEv$+iK(+#J|c-)uo>3jG+{J!Q7 zj=w`5Jc@T8jV{;kSNIdBMjlix`lHj8WtECDMdj@L%*@V8g~GpCb@8noivNeWxpH_9 zF$HkH6!BdCBoVqP?JdXl>|LQa+@qc*n8e)WkC;8gVPz0IyLZK+PO!%@m9;MPwdW!= zm27H`e0s9|*ME$yiyOtOe*{|6mZe_QuDc!%-UpF-`3u_}^PqYE>=LZmvhJ)tbACWh z+wQEB5fg;npbgAHZ^Ma<c<+b_9xK=0$(;l#iWY9TojnhPW7W#hGJ^D&%&1!&23~k1 zyL_@n`(R&uB%&{QRjv;jIeOHvPL9@AylUuLr_YgZFjwvQpVnUN`21S*Z|z3anv0A} zfq$zF#T%#yz%KXgZKczV)`tz|mzNT*hJf!;L*VIl)tc?`u2}t3*vZk9mFrx;eph`P zk>uFQqcQ1zAJez|`ikw#_Q1s2v)VK{Tr)M?ByKcb^Zi(R|8djMtqtA4+Vk3*{ku)O zqrWRt5Tb&^RC{Z;G5qceBW1W^Y!|}5Dop|z@}b<An;F-u$bOyBi7@-%HFZdIx)1pm z`7U`z?h^b=&o|+F)PW5Dtv|<k>Lp?x5#228DbA^=)*{^&MrlU{=Ee2uP$sM2l1E+w z2tp2t%U#1;I2%<L(IiLwrxj!eqd|c4TBC(39peH8lYyrV`A%}XEKC@<ey!Y^ubF>l z2?_$8>N)+JU1AwFm&;asX1u3*Xg^dk>FaG%BC5q0A5oFGH9k1-y_|N((YCxSR+o@W z=klpwrt#|Qim4IRNb*BzKssWi+<~|U;ttIdvfp7uIXczr^jdD6*gpHq*vBUtclrC4 z_E+C{b_#R398Y|sHOx!bzB3v9@|*14+6uSq95P|#&_+qRLtcn_t#%-EJlC{J2Qps! zp{1?RqV|(mkA(Ov)=6^AxH<wUk|ub02*e^bBvDkGX3kM5;byU`fYAj=ft(1vxIGW; zbgI03Xa2q70;c#uCwwQ`)2;lbM<5Hi300Wp401=4Q?+xfcy5{LjZws<KiNrVGyis6 z3KKK(0z+3B!!cx|=X6zNVhdo1g1U|&1bWUcfW?f&Fbv?7fhZ3qQ&=yWlu1k{(&GDU z0gNmCgK`Sj#t<M<W<)3BIiA0e%khX#K@2Bju?Q%TOqdP_t15>u52U^IS-{gNYMX|g z_bob0%N(jY*%<DTRH%Lsh_+}{UWg~yi<%1{1zS|HaV?t%S+F@G0U-pvkdW9;kPkU@ zd?EsIND*x&ozyHVLzc3OhRwr)Nasi<Dvp<$^xE-*XOTcl5kf{xgk(4~ABMPU+yHp{ zV7@ME!mUgg(h-8rVnZ4VI50@e%h^qQ!OpN8z-SR=@@(GS{zT7mTg^^vQ#r0n%EfZ0 z+7W0eN%|%XY1~x5+HdzINy<tHDG~zG1lvj&Mjzt))bUw%mURO9D=@jL%!XENQ8a@@ t%w*9ClZ8_4pu=PhR*HT)2M|w0z-%Da4?P&R<Mpwh4Xe$~mIKp&{Rg&w`4<2H literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_078_states.bin.z b/client/resources/hardnested_tables/bitflip_1_078_states.bin.z deleted file mode 100644 index 47474d218bac31948211ed2041e6d08d92e78be3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15066 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 diff --git a/client/resources/hardnested_tables/bitflip_1_07a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_07a_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..ea2f8386bd115eac8c22c27af9eeeeda6c9bc7f9 GIT binary patch literal 2730 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_07a_states.bin.z b/client/resources/hardnested_tables/bitflip_1_07a_states.bin.z deleted file mode 100644 index 8b4d446d63125de9e980577b9e4a57cefa961992..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21102 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 TlN!Vt*8Ua#tM7jP_R{|iIlvE_ diff --git a/client/resources/hardnested_tables/bitflip_1_07e_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_07e_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..00d59bf75ee928e1ca45f4184056982bdedc274b GIT binary patch literal 1565 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 PfB3tSDZ+$+<a?rM8L_yB literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_07e_states.bin.z b/client/resources/hardnested_tables/bitflip_1_07e_states.bin.z deleted file mode 100644 index dff5034c551466d873bf7a2b78acd24f314bca99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10895 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 L0AokQ=>z`*f|#?n diff --git a/client/resources/hardnested_tables/bitflip_1_080_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_080_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..54b71e2cef53a5594ccb5dbe9a8589c3607d7cb9 GIT binary patch literal 413 zcmZ>Y%CIzaj8qGbl$~w=kFjoTiOWS61_uEK0R~YA2L=WX2gW}ooGi=^K*W?4%Ix@x zRaMl)R&B1TQ|L!EFOO5oElr-2Rvz+Mu}0;PkLN+H5WfdPg$fgsS~+cAc`VfnRpeUB zs2;?r=Akk(L~GSamdURQJ)1lmlDsPYURo^knKb3qWTr`3zA6_aJy)7c<}_8AzhJV; zQ<Yg0)kDKSs(C(FIXPKd%zF!8P?YzS=>dzcOq()eQml|S2tH7G<Y42WGItV_Uy$dj zhR`XK5|&I3@;spOAL654YhypAuUc1tK0@}-?iEV|nH?@DWJob(g}6C8ESais@#R^O zj!LmE(Iw#`j-FHWG$)3M9GbD5X~MJ)l`Soc!lybkB#1oKnv|+FDMgEM$|}!EwT^LL zTni+YTCJIxs_ExB)l+AhYU7ek5z|&=s{Ca&nyWI)%iqKPRH~`%nN632CsYJ$J{2!& z56tkH6uV@ar?1L9ra4R5KTY+t4QljmnRKe5S7q9&AYYX^tajWxmF8%8M6)f6WB>pt Cew&K` literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_080_states.bin.z b/client/resources/hardnested_tables/bitflip_1_080_states.bin.z deleted file mode 100644 index 372d2d4ad490b57c710077d9a5bc3e86de1eb2e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9770 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 diff --git a/client/resources/hardnested_tables/bitflip_1_082_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_082_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..9937ecd2a30f6691f23f21c4e271145f5b262136 GIT binary patch literal 10172 zcmZwLd0f)@pEz)<(efH^0xByHRE`t`w;DS<AQedE5<ZnF3IkaCot&Jl#;G*LR7g=l z{B(Fia-||T)ijl73OXYSOxbsiG^esT(y69<e$DQ0_py)N{p0=b`;YhQd_NNb!4_-+ z2SMkEera}Fw)@yWzxnG4)Mcmdc^8*e&F{}mmzyrjPyd8(-kx<E?w(=@NWKkWc+{QV znU+Rm5?vx)TwF6;GF-w`DXj4|Y_5woBt=n$clYowXVkj1?i8wAJtAGAD2brjBwu!5 z6z&!fT0m>NyG-m}660&Dr+CFs+)s)nU`}pn4&?)U{<MomtHtFYTwEmXnkfGO>V_2} zyiZ0{xc|nK3j|93SUsuv=Ve(h>{ZP5`=3Jvckr*`9x?t}1M?g==hTR%AOT(nrjb*s zdX|+nHH@emjfONB5>7XFY{y^?McHhgJ_cpu<PR|&q!tGciX85RU<_!5jLWBJ6fupS zuA9;44;&znyd<}cR902vh~n6Tr%M%rJ5ut?ZNJ^B-z8Vv`SQ%q(mUU#`^1OZtqPx4 zCyKw1rsYyss|v$^Z1&u;uSnvf{_@Np>wvFF2EfWQXsz*AraxQz73Cl2m=CFGW^&j~ zJD_YwSD6STNsM6FK;_mixvS_wqKl3!N`8OCkXrKWU&(&MGSkIKi*yr7x7t5DaDP9t zYc>NYwbOq|j;G0sQOkadZkHEr0k?WhMZ1OM4A~SI81P-=56x$Zzy4~s#-cF)62G5r zo3rzU**|PPin9{6i{s;iuY}LOOS-#DC4ctp(633qT?_!!`&WA7#*ZfMzna>?gHlP= zQ5p)#dwojyCkYb(nVLuC_mUJ?t?cx$gpO@#Nbc$Dn^;xCFTwW+jFV%M8^4qltt77u zVw20&Mm2>cW#Pt^4qyZa<Aq845(`qs4hHzc4%Dxrsyez)ha;SOh%#OtV~`(d5Y2>9 z6@nfapX{-QQpqtB^pj^H`WXRmC$NBM5YUNj!m<Ijylx06?=-S7EOjarMG~2b?_Z8G z5le!Dn^d%|>(nj7XHjr)sA`~H7)LcnmDwFSF2wFYusUXF9XkGmjsWM&c(H!DdvdzN zPxs^!*pZQbsmntEYJM-Lpr9bN```v1ZHhxQfc>qNxEO&03*0RL3esiSPIM1}&&C_& zdLR{Vz)euu2if+)0_vB3-eesyFOw%RpzxGjlb2C6>ZGU*8i^As!U+a$8<;#5oKp|* zB_skMm_dLbZX(~t7d9?$j6lKnP@JL>z4PPB<YxbN55N1`_$t!r0g4HLMO@WJzfeKS zGh3)GV<}Ue#UC_wYc<b_+lSLe)yuQff-`L4rG@}EmuG2R4O*a%U3T0*aB2B7Kdq?! z4m`vG1Z%@vKTH{@VU%cB8>vBF%r*hK+5?xV?XMJhT)fQ~^AM>x$e8`(wZ3n@CO=M) zi`tQ_z^;7YRM|!QMUBWD8?$ijP(BC0l)D=j%@i@KSt6Fc8eOhizia_-jg?KGsi;N> z7d_L4_pJ`f$H0LYn;Hh=&dsO)Q2b%Mcd_Zo2p$wgdl9(L^Owx$=Ja`91<*&jf6Hq+ zzO?Y^iyfa+tlR02|4`RIeDwyNy>0i}MXN;gwQ-ILeXx0)um48Ws~x;MP2jPP%pQ&T z6gr*7`uXCmZ;qh;X?rNbzlpApKfd$4%RDw7e?fERL*~%-`m9HZ_|7*PZg!U#p^IK! zUm^L1dHBjXO(WZR(N^+nJpt@_^=8&_G^=`k`+nBdrv-QWt&bmXkI<iw2ZWEZw{7bE z)$eKA+sH;FxP?0sR8NPq=rZm)rUq)sTiYOsyo~W;3X}>AodtEYa3kDNzWZ#Xz=iNm zRfmAb%B<ADxNnfMmmOQAqymCqOg|FTrUcYVla&ThMTAvX?QP9bgrlniNMvT~pFwGx zRuwasP?_FDAtFdf4lh$CHzlzO7z%(4e_vs6E`FLL6ch3wRoF@@9o<~D{lOiAqJARx zOaRW9o2@7v(}FmQZHEVTSJmeQ=%S!sgiFy893JlJfq84wgGcsgzQifa){pn`6de7q z^<n}3YxZ`;HFCoJ9P2L1x@;@bbcuN^*na3JX#QA7+HZfdna3g{dvZoc9lsvCR&;6Y zA<76=uN;Be51lWd*k2zpvW?rbqV{*LCqV5ron1OuHhuH8y?w%u(ei3GFWZxe>nS`6 z$^158^a{B|Esc()umFjOf}gU%(-W`HAC11e6l_>sClom0@@-za;H*AOf!#@;h8I9L z#Y+n|#Y2_DPlk`}-MqDFa7EV_T>){>aW&g{ZBzH_tGn)e5v+N#$lLm44&I~`+(6C3 z(Wfm#@B0+WmCF+hf#^&Phtzq)6%MKVMHrxJ>2KYZC9`Lxrw)y{Kg`F<(@DEJo}Me8 z9ai9SgVm>`eB7Ni@fSKCK78m6Rb$(U*#QnHNOp_4e#-L}5P%MUvhiptS|x|$FE!r0 zcccJ5lE=nR9ch`Hu6iCVCwQ@1ONVT{dUkrQlx<{lM~Z3K#Dxw~J&cl<prgX6uo6DW zT;(7{b##jv!$qzRVjZw*n6t5*w<$B@X*jgBkbu^xsthFUQnJI-|C2dCNg+AoJZZxr zV(Hrs-;2ym7^Y-JC{cofqjkxjEAVl22tmllIq=n~Vs$+omluH6WxP2>Y<pGl13`Qg z^*z5UezU+D(KCB*o`5ZX(XK7#+^aeL_VX`-FGdiaEPncf>Nn@vXm2w<FP1f9Q{!tY z?;R41$5@K9X>ZAQW}npPet&ti_&U`5Vlyt^N>vlGgW=GHB})3RMt_ty7mvR@_tA&S zpN|yiC&$mO0j8|*CNMVXTm6Oe5wq#XrA^UYlFR1o$JRRStFrzER>-|$7yFlnpVx4d z&l|UVoF4s;ta8cM*<C&XKjN*F=Etwz7FQhqKI@JFwBmG+e-B8%@nEqSJ^pqrzx?SR zrUHN??Bno3r|COKJgny8?9!WWJGMti3&2}<5u7i~v2^R$ia#N^Ce&M!rvKJ%h!{9# zzMhrcQ#4z6<brx-O@#PhY|@V&MKH4U(qP)6e(I9$wy2ll4K-%9`>a$+KE=+CJDQaG zkAow>8rc+O*`*0aWr~x6)+SVaqV!I^DbO|Xqu$ypDd8vTnEp3D_+Yj{+48y^6$R}a zHLvvBM+0d?4ghCJ;XzWk;yO!HMjo<ubTwlgbDyVsr$)WA7il{n5#^$L!$FRAlqB=x zpGwPH18Z|OsYFnqUygCpREL$+@xhj}iP|x)SV#mK2Bz5u_-Y=gx5spt!`sB}on@w2 z??f0!1d;iU>KQFJr#jV@5<1+BAW%DcQ-y5>#JIGBL~O$ddUV_hF|qVeJ7_^+`BVsj z!!=I!_>cEds{Op(`&fMi6bSbH6cdOrD*V|1e)m9=Cxg?}inrtisfk)Ck1awwG)g`u zrk7MV7DWQ7D)t%(4-kT9H;kE?5{)5<P&=a0mw<BkfkC*T!`TZlSI2=P=x#@Yyc--> z5)>19=d_5$(V;_#?`N%nfS#zDJ>8G4{Z~+&Uy#~_6*DH#Q!`?rcDRx!CzC$l$sxIM zlCX(P1)U&LnC>!-cUgB?d#K>ZGIAYT6M30OsTvFCLIQ0Z0(WRIlu6NO2l(_bE>4<Z znH;V|xi&aMCJjMQ#-y?x;>iTM(Qc6}gqn%RpprYeRU)Jj4wq(@+VJAi`LZCjG+zkf z>RD>EX=(%lNZqwl-XL5wgr?I-RdS_h1Oj@Zg7*0L$naTAi0>!pT^vYt+B{AgIq$zE z16@vKP*drCIaR{s{Z3Umo`A+Mxlp#frLa@tUP!8)>IT)ciNuGkJ|R*D%0n)Lc3x&g z)bq5%`WeFklf{0Z;_a8b0#fwXbAQ~5eevTR#~YtFp^H(+QGT;O&Y{L61CKKvb#PuZ zC;fFIYifJ-FSjfT`dIwSYs~B>m2yPHmus!Dm^=*kcI^9UxDelZZ&9O{^y`m_Z0)R? zk9*%DeR2ie0;46*#c9$x<cDI0h#ho>T*KPX;~8imb>K7GyaRPRb6Kq#RFt01$t{80 z&0wNpIcQ~N5E$1^LZ$GDC61w=nN83sJ_HB9@*P~L-TNJZ)yw89f4<^dhv+eINdVW% zts1xW3Dpv{{!HUqSOs)Tt<{sDytQ@hxE&G%q*~Y?T$QopVGr+ho@3}_@MJuaz`!FY zMhFha*IMD@^}31>eioIZK2tay&L@cQ0+ZQWG$ESfOAaWfDS22O5oFATJ8Bm$UtTLs z^5UtPTQ9>|L}tlhN{?m0T)t26DLH}y=Akd{H4^C3l?isWHZr#;?f5@>HLs2wzmaZ@ zzhr*$S|}QwrgZQ7;_}kbXMg@u)AeoC7xa+luh!ESw>1vphw>mw)T3p#BGh?ZoQlV* zhdyAgshc}@X3L>}{%pL&?>&Ebs}*Scm~y-y+4*jv?F6w7%9a7BsLc8>8#htXgcDOy zs0<!He*iaW%;f+yOa8dW=!}4ko8l?3oiY*4F0$kv&|nf80=rYW$>xOo2IjuyuCGec zuDYh4M7}w`qjlMi0Xd~gUhHy0h@rdIg19OR+K;nh6<`+hWah$xL^%1@9ft+FL{Zq% z&Z#S0n++vTtx~mZQeu#HeJ-EhZIfiIMJPvT#*|6X=sA?{SV0sv3&m1+#WFjrP*-`{ zXnTEB`U5YBHwl;aWX8!o$|`%Ja~;;K#rMcFi#WU7<xq-8x?2xucNTnbjcqemlMJDm zt4ZDnEpvEl5>4ox@(F10rg5Q`n=#5(Ekb0*Y-}4!ccomEo(1?Mll_|&`>+L3^;A}( zPZS}Fo2rR?mK9V>k%=2X-${Mh<dhJ=`0WkK?$?^(Noh89Bqm^Z`OBaa6NqkQr^riH zhV@fb4(VpA)2JVa#G#hT*-nesMtM}jP;uA=+kzoPloV)Ats0E#?BnJ7wBaNY%`B3K zq4nUXY!FRdzj1pCA;d0I>(%WyuhlL@wcX21SJAyDC;wnPw7z-3p&XQqIBi+a{w)9b zHa|L#Oikba`;D5{MN3_0e^-4W(>6BbW}n~{(kJ$~<rJVH&QCn15tTtkXB~lM)^qBk zzwCIJ9@6#_moC-~<&UhZ2o1S{#`C!B@2ag9jF%xG;Yd3~fE$`Q>pv2uI^}jw&OF`* zp2k(_eBl}j?I%^|IF<OtT=A9lC#>H+&OUziMYL)7<)AoR(hJl0?D#Mp60GEJzy9vR z50*clUd^(fN};IgT7O^bh2vF-uCOcCcli91A?uXAtUA-sak!;en<G&pN6iTxqmNSI zv@78)K*v!AxGT^Om&*j~&at{B@`5it6P~oJw0pT-u_BpOXR_hTPXj4l#-wDUqE6}y zAnSd}u2Jvm$w@tHQNM4(gJ^Z<Vs#$wVHcXy2**>T5#S8ctjJXogd~75Lo4#};z{}? zrYl<~M-;dtIXR2G^XXpP%OgjWg}5h$IN*F^W@XC~)*HJzVSab=J<GijY(<6m@)5yc zaBy(w(5=iM$1Y;KnJ))(B@-YE!KbqJ#v34Tk;N&BzX-7KxwR9Uj*_UKEav&3zlEt( zv+I8Fi71&H`E-moKLR}`QAjRE&0@#LFCY4paw{HKItsfG4?fJxQe5D~w<Cv){YNeY zfKH*TNwS-AiNueEmA4a`ba<is0=j@9nij<+>DL)Li!PCnMbt`3FM_hE$o!!x=~n)* zT6?vwFUboF*%KP#UK#m5<ON|Im0Uq+8#OB+PHNo&XIrj6dWLTdg{z|sJ?3(>&NH>m z!OIP1pA&+g!sqqZSPAv8D&x4N3s&GhCvA-T?SXRMG}AYV;?;%byH}o`X7}KPfT!=Y z=wO_89r7sj!mi5AfXFm8o%P|F8dQk0Qn81pnBex+7sLvdE@XU#i8qaq47)|<i_t3^ zco!9WyXP;gGaNhs{3Cd+G<M8DK(^ZO^$A5sXD`4Dgnc}SumA<@Nt;Q`^aE$Q`FGw3 zGxi%9ZrTpLM{7gM(;z=orvGe&+<=1TwhW>eIixMi=ZnNSB3JFCMvjM@G@RvVf-4V@ zwb^hKb;?aCwx_C}uNBMN>^<%Z79~7XcAyN@ByEJJu`)|pnXgmV_VtU~cZ$OtB6>^{ zqlVdrsL$lL=xayy-Whrk#K16>pB!d8q!0vcq&nFKOO$CHQpTjEdyIIR3u)iL)Da1l z3bh&|Jm^kPb@zn%j}f(_Or8Yq-kxZ;B!En50$&SnrB&3@Z4@L=7}Q{rgB=14DvSfT z>g!Q%-OHymxKqnwbSZE`-Ef<|@y`uAOd>WOP?y?q5>}v<!>tsId6_tZR)szXf^UiG zjsc`p2!g)K8tZ3h!}x{aDYtFNsXPuW7lZPh5w^Sxln)^Mgv$iJPXgmxx{#|&Sq-{6 zpFr)S<guviM7Iq|KP9bdj)E|hQQK)XCAd_4z%1ASL>=4Nm3XE@b-zArs$JXp(>2Y$ z%$uXDyQ?m13uyx}nzoLmlrtSyOS84@%h&sMETkRcDwmH!R&Aw`<T;(9hHJ2czC9b& zq{{M+DN<Qo+}&iV_gRXP#0Nn_nEaQ{{T`>I?q7gmlOP#--jTFxfj0!5`-Pcxfi@^p z;Yoq(Jn_SwHtvAk3SjUYJ@p_*{wTzwXy;E=H(T4;!$3DMtb-9)oE*MJ&V{miggQLb z!K)?-HPR?fxJV43O+D)OISL0w0|SnB4xd+bIg?T-9LRjD8$I&XPmI^vQMueRK^?>k z>S<?~+PYO-X&O&1$jt$CM80I)q8~SA%HSYDqo+a?sF3L-0eiB5#lepo74qDu8L#1X z&e!&~Il20~7FFl-gkTywtRK$Q8a#qayNFNPrw4YG%ohiXM;tswJap<-{>)iswj`_M z)G5jSH{4PqMcq61=Jw2rtj;S<fBh8Wa&p;L7Z<<n@6X9)%lvNUZhzI{;r{fd3v3O$ zP3G!mj2j>ZX1GMUeo&$|y6u#Or1g0bQ?zQmJu)NAgBZj(>FNRV#)!*ZTp}mEdtx)R zu9+bXTI6Y8uUzck?zjR<p(x!?x{L$_AeQI2_;xBg?6yZP%WA2q$sJ>wmSt)x-Xk@# zmVr3Q#rgc@mm2W<8#j0yb^F=F+8YOTX%~c2Mi(iiTPd2cCT+y`m`27r75~YQ`-NF! zl7f9%dYls)v`7MhhRvuTw!jb|uuI`)klzc(Q9zt(pnrE%y+JDO9Fv`eq_(G#ACtFl zd3U{aCN7Wm*WiQCw&9N%@5cRcrTw!{@6G)XI?J=JeAoQ@S=AyU&{m9+ZF+a4SN<LQ z=9_|}KipznvgugH+Y@5&k4t;H=V$W1;C3Ys#en1$nIf*FyE=&>7=-8nyYqv0L2zaa z5HbIs2KnO4@YA!SGxVx4V6PNfm^$zIX3FPPCS#Z$9{tnb2KhzM$(O6|SgxL%Sm!46 zK~53~tc@kL<xSSn;@kAy=T?M`D}aAJa{a-@n!MPw7mI^q3ILOJhR=`wvvK;I&Y5Mh zy?l9SY30Ih#H97%JvDz@^8R}pJGk8-o(*;m=R4kne<%-f;wZf=j@~In=P^V5s-YP4 z9TAGrJ>sTd{tb|h6aA~~>(FbNxtkE+s7b_^>GL)!XndrSryrVNkB%eM`7xFWz97%- zfW>A6=_Ead<<yYIlonxL@<=^CE~uW0)#Jb!7Q2AH23EikzQ3TZo`we-hAH$E`yiwi zbYpc};^2HC7-P2;A!U=lVoLF9+W`|lPJCN$;q8gsDHeknCl%s0e{dtW>a>Okk+tMP zOVh&gl0>Iye5F&oM-b;-B5f*{ypJ(o0XlS?(&`Oda*ADjkgv6v$l<3*m27PYw4w^0 zni>v8r2L0Da$rI|dr&l@UIQGw+Mo-Nw6mhr1{mCi6;I-<EY|y_pC@s$1s01Vu6@P( zUy}iC1+Y+uuw4KOY)yKQGJ*Svc7HyPECeUm4sd*_wx*4gET8pwvayUuR8%L0ymH;~ z(huX&z7v$klyp?SWJJu=rM{z8+;16Ghh^1O$f^FE%(i?p?Q>*$S%5z^az9YlShm`P zR;;#|J!jkOm6N!R7t3uCqtZw{Qzbx4A_qYF&d#@yYJWu8-_-bUXX&-(pO}Ii!v@>R zQ3~_0>x+ihR;H$@f;m?mVzF8o`vCgAlecG7MxW8^C{E$8*@W#HymC{0sbvin+ZQwU zYx*BMR@As%pE>gHwg?psFXcZg*m8?K0(D}isgi`!^)B})!4;(`V!ZlIhir$>w|CmV zt(K45mcBXo-W8n&{y(R;<}NORMqT`&c;yy}P^bHp{^;3-s3pNup78bl^sF06Pp|B6 z4yc=4Aiqn5(3)@B|5$RweAl%u9r%9tM@2j*LGyIzWj(Hce#R{edH=Bb{5QcTuZ}|h z<?<w0IGrAR?D6r;=*#c$<SGtv=zjhsX~Zg6W)VHS69?CE^O!m)Nww)DAqpGXQdsTI zp$D~UK@J^ye2Dqn;|egrYe#V;)XaRlX;>YTHbmB@eR44f7U}S7v0KTotXDTPH*b8F zb=#0k2<lLZlO3Xl$ts>VM;|sF=BQ#RVua;tGnfbO0V7Ak@x11%JLpfTypHGHx7-bI zp#8o@t?)!}fYnY^W;XFL-Z30J(#(DO7_Hv#_RZca7v5bhUlL64<%@h?FWNZ4-?Z-| zj%qRI6}SZWkeKQ$4D*(zW%S`T?b9>Sd;@1uV0~M&(n~wWW1(R%`1P#e2f)2sf#Z4b zF-fj;7tCpzNT0TbSBL&uSpRy(Z#qK6{j7OO*LyX*a$xEk4hkYNZKJ!k(^a#=-CqZv zi9mpaZ6Mb;G-B&CH7~zG`#RcwY(1oU>TfZueKEZ7lIy&VFkZl_drIeQ2Hq_(0{aDa zzh}it`sSRXKjx3d=1MF)X~D2_y-vGup_wDDesO(c+o(iO$}F4eW+7M-VuPI(O3Y0k zsOoPhmWCWQLGcm8$F^2IdUB4E)4XD%L|Y77@BZXm`Fu5+@3+`C$C31rzD=*(x^?Rc zQj|ns%c@)?A!H@5q4AFy>k~B#sXTP2O?CKs1%0GP>GZ~5NIn*ACU~h^8-^^?9L<7R zN=VNUr539G2MtQ;G?46X?D<;;Wq7|TW0HquZ*AjER}Jm3ezG?sx1xiZ(Y=mUpPEHS z?h0c0Of4f8)@!srhaK{Rh?qRalyuGO^Ex`Ti3g-V!~@ax9Y>t7NBarj*K=ZtvAAYa zuv(3~A+s&6Z*IJ|xMfS%ptX5x<AfnDJI-#COzbHjDW|qytga^Iis=i_qJO!b9_{yK z^MR{}ePeIOEOU4FYN$<nwMSF=+DxcXtQ8)a`)J)Iw9||ig6m$^lmCpk;nj@Q&D`9+ zKv6KU%=^tNt*d7*i2o(~+E;3T_iq1>zuDt_QHGm!|M-1MW7Cr<lGKc$)L7i^#!z3u zTw`VTzKFiUw@tejPQ3uyy>lk5*}#ui7tG%reHZ#|I?OcTb0Nyki{AGcJRNsNcYkQ$ zHupi}cKCQrps>WEo6TmaITXerNT|Hbewpg=*Wnas=Ih~1<Xc<XxmHNzju;g$G(=yW zQApQThjB%C9${kxXJZwdj9S&caUFA0+AQ7>0-yX_=yFU=YNR10?LT-<rN*)}pe~V@ z%N=8~QbAGaK^H+!628rlmMhf9#nN#TED@9j)J-8L!PDfV82d)KqE+bURW+RE<xNYr zVXN|}sZzQC9K%^S4SQ1hBFzFbcU&^wQ$Q5;OT)poUP!(zkEuXmJfRZ^HAN`NE$>tF zIz%?SBQL7zfViG}zzL<himGGrWDLYW0_dR-mT~O=mbt0ha1+`B5wi4XyO+Ilnh$jx zL^x$la+#WDw4B8l3f^xsIDINLAP~PQMH(jI6HI*=vtlAVXxOimv*CM!*Qm1|m*=Gc zIV!W)G_%^@id0BeS&`_0gV0p49jz8QFv7kyRP#YI&vZwh6L=-OcKPLePTCNH$fgtX z9o1eq5n4|mV{t5Uq@9BwE<;1;?CL}lBbT1Ym9Q~P(amnCoJxk2TAHA(%+5ADGapZY zx4X6py%Qgm1}RuVP5~-;1VhD*>BtloqkD7>9`88KR(D8)P%#b(1`m-Ym_u0&#xowG zhQC?POTCNOW{mLYoOdVq;ZiIKCoTTMWheRxL^)Tagv)dDGEnm59C96AF4M9BgxRyL zEWWgxAu1E5*`p@wviDF3v3tB`c<n)^MtjdjUt@E7^f_hd>|b8dEyqgN$)msL#(()& z;n!H@KG8aS!kMw|ZC`!mdpjO>#C^m4UE9uSyEy-o<gDwft|6DMa|kjep+;<g69g}} zr!Q7@W%6PyLM^kY?sME;30H-S93Z)==*a}XYJYu-g_$4K0EM*5Np!Z_ILM6i?mHN+ z7RnT6xaGFq07(_hoxb`v!*zbT*WOn^+H#4Mhas7%`NGcI`iV7s@Ic=#G6K7{CpPc= zhayi8L)bie+2(S9QQt0ZJ4CzG@IK9h;97V9g5wE;#WHzPeyU?o7K>8rr*~};*7d^8 za6ABr&3yBrUQ!%IsKzQCZ4<~tbqk|Kd-r}wY8B(Ak$a20Q6bu!R}t*_TwvgmX^W~} zO~oq6=W+kt-cCf@?C-9fIMFq?ZC}BoSO4GMj-NaB`5(`gc0Kr`;YO6K_{PfnZ@;a3 z#aBwW(;vJ;>KbOZ{!+lj3st(c3+;t_Kb76ubp9J>1u#+c4Razkz--NWR$9LPi8kUj zx^`fw%En2PG$E>2ogS-48ZiG0-`b3EAVfPIq@yq(A>5ueM_idwJ1HY%uxSc8B*Aw< z7V^fCx-Kfx*tY)rK+WqYhNWYh%U}M0+B1y`Bk~|jVr`68<Y*g!AuUvjyXCcakbs(e zp%#CMfV;XfitaMHiG(zRW~DsKU5#zf*Wp=s)j*Gz!dM?vXcp!S5&(VQG9Jy?c9oNM z;%6utF3FeA6>usSOc7PxdjZ)X8OB`AZ1|)pv+QQa6K5;{PUJKy@CUgzU5cG(JC&-H zAKG1O2a{-P5xOLXQjF{NLPUxxK?6BO&=WAArceAYa-)f8L-n-G#s7ocmM!R*BD`4M zPRZbqZLZIef2C1#u^Dz4c@;O598j6%fHZ)s9A3M$5pq&Su9t?Q4t*5%a@UZNHmVCW zQCKi4(cI2xF5}^F=^<*G0~HYFsB9auJrDTh6b+O5UT;M4t2?$<2`)3}i;O`$ej74( z)feqvQLYKT^c2*~$1YnsSCu?+hlOw5{%<vkbts*Z^wv+?*g5d^U*<ykOrO_H`=n_4 zr<pND>>4^SKB9G+t8u(n#Sw|ekkP$iuSC}*%E9jY!d>BFiJlB!JbIMa+8#EUomq{C zaSu`}^8%;(Pwh_A-sqvwByHLuH!VHz@`l>7opq&4p1VKT^6cU7TYj(Dc_X#@WrY_R z#*d{1zr7OQ{UTTS=I!zA`@@UhU6Q}tFclD$-&s6YBBpfznuYS6dsXtz18GREnNK|I zx4Xe-K)uS6BLG^a@()LvRE6Z7=9FhN;aYlzh(&DWwj;<>`{l`qvMDGfNET>UxR(7F zxM>tA0tIa<v(1x8<GSalc8mxGpM{nmH_oND4LO3jx5uyg;0yL~*a~^w^8+p8y<Yvg zG~ASWs=o8c2zwlACD$9ggn1DXuVBu{^bzddy!gMp?S8)bqfPAr2@i+xL;F^03nM<v z`VcFLKk}UqJmywS@UHrG$yv;G@Q>cNRyB0|j*83Ackl)sYPdskQRD1*&^dN#-4+no ztNUv32OpTN@$&d?5}8DAl#LT&t=Si9wh`<jUD%%+t0wKB=%Q+2AHSC(8Rr)A3S+U# zaSTj9!D(knj}rJnI%?;g54%6>L;if&kl=_z;KrL`t~l*mZ9X3%Fa)MuZiMDagqlhT z%r7ti=TDJ+AW2Q#FfNn|TXhsQ4|5<NtDG_dT&$K0-d)3{S-MRihQ;!G93YL|owwKA zD6h>Q;p%&Fx^Z*aAO8+(JyxOlU@Z&eV<}z|2}fY7`){yz47)8jb-*F!;BGN(w)uR( zhO6tSQ#M5TE31-_yq%w8wh1LtY>}8Z?Kon<{jnRo)HG){7^<lc&XAfO{U@s(eh|{+ zj;L#m4CCjhxop+xRV}5fK=yKEe58T?vOi^@<Yd`^b{jJUX)N29{A64T@KxIGl^bFE zazzbhL4A~{AOlxP_No=i*-G^(Qrb;;US0qLL81rHRB9>4S2fvM$r#e5rdeXrEIS_f z&iBFfEC!-g;bHH14y>}Z{fDG^AqiY{3`I_0ilF}`Y0!pN?G%7xkG8K!#)?!JSr1Qs za5<naXR!x&f_Mz21EylzA)?mSRF9>QmqaZ@vLej_w?Rs$jA<4-tj(q{2Ek7^CDcM8 z8!Yd)5QyumDIXh~jR)0rBB);NuCOAB?KGI69vvw`dwH)RR#sLjLg_F~P@6=dx2fxT z*sSj2piCRm;Taf^sG42&P`0qT6rXk|{C>Ed6iA+G&G+A*2u*&C#8oFS7o(Qw3DD|! zbRf54R9-CGk`hmKV{GoYsv92c5QabBa47A*sw|gIOue7EX+>S;lT58@yS8L1bNKX4 zNGdzzGLe-;^IYDAWIM!?fiVeBkOZ~*!2yP$0L@|7?dqs}+Tgw|9XjmAN$io|uPBdx z<yijK9hw3Lr1iCeYPb~S;_~mtne#2v@bRt;xo0_ZvQ^uLFMx{)bOKgKc5BMvL&S0% z6{ojJz+NiFjtT)<71bED(Bwpu)Ow*H7I1=VBh{A_`)H`A@yz?b%ZM-B>R1fLDGIWm zH6o?i#T$lza0RoqyhLOO0%K#5y|^JAO=%qGXf65n_odkB$Q6i;({5)e;)dOmW{KYU zD&$<DY379oP}7ictZr1i$_{8J<xhf&S5MVcR0jKG*`CD3>Cip*r0CD68Z+|=_ZoEb U=Hb5<|1FGO?!G*+2;uwx03G0Gt^fc4 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_082_states.bin.z b/client/resources/hardnested_tables/bitflip_1_082_states.bin.z deleted file mode 100644 index 5d688299c0f0029b1ea2b83dba172b8bc752b4a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41837 zcmeFaeOQ!r`ab;Kbz8UG;+vIjn$EW7vSvDKzK}0)KjjuFYqM!aih6%rQ&PgI2uP6m zY?)H|GWkl0a(`V#GKEPIND%H61r=cwgb@%&7;u1L7-oi<xnDoma}8MAes_Pz@An+X zb3DiMhllII#@pb1f9~r#uk$+3lMkDmrO)qmJRS12ym`0Z(eu&i9Um>;xbOLvOE)`S zn*JR`G@k$RHya<`{%-%P6DRI@?u`*Iyzuf15`YUt=uLL%!(5=a4N25xCGq>H0o3r4 z#+G$PtD;&<fEo<}Ik7}Fj8|KxrIAXt+}F4%HC%#?u36<e2@JWdU>M(bR-;t6F$;`= zt0c+jqPJu{RKhT2O$x2?eGe|xe><ZO<R(HpQiM4rmF$D`!9Ljdu+ch-4teQsA?iW+ zl}CHEH7Q17dNpOT`hZ#f5X8?~BUP?H1Yff<P^B{WlcS33IXVxlCZ7O?P4+Ez(y0-` zue1sYo{~I;+sK|Hw$nT9Y+j}HMQb_q@k{7X;%C;tAIol)t}wR7W?3JT<QK>U<rF`$ zKNd2MlQ&EIdwnU#A@JYusYJGtH8g$>KXEIk-O627j2*F^+-Z7P|B@lc5*5&_Q}t)r zr(xE1KBG3>rx8sPV3Q{-%}^9jZonHb$plw5(n_eL$^Sujk(KhT74R_~qQsr81o%jT zpMlvMIGV;3k>-2|yJ)RfOiOrwyZ(My3cFsT>_sS=2d|5Df22C~_ebEC*QAnW;q7Yv z;SP9SuCMe}(uB9+ccb9dcKAr;0z<ZOFF>721jbGN4k4rAWG#PKf<H*cM@hU;tB!P& z^Kcf<!;)R3!O7o%Z{bbIj{`?G6jXq*4K~3waKlRY8R@etjGNsL>GX9cX|j`3W@ZTk ztZ*j9^%#Wjq-K$+f%mA<OM1wsq^J#^he*7|M$iD`;eQL9oRR#!<x{AjL)BanzwK?( zsoz2geZ~{Ij!-3^6)lcdSxBywc-p&6U>I3t-DIm62zVd~nw?Y3tjv_@FR%|Wy?oi& zGR;@C!A&emMiURp(e;6d!0D%8em~Ppc~z+@xlYLkXPPQz!{h?;atC{fx<8zx?2mv( zKU9d(x$s-O9n-tC;qXj0yzC*5z&XV+0V4N7C%MQ}$(k)fppI$oU*Z%sjMe#i4)Gu6 zA2pQ0`{8t*87wDZS00S(f)N(jA;9MzT``U8f!r#_PgXX;C!V4h1$Ou%*TS1>tXfHp zsz$~S^=NK~(A%aCIJ%AL##i&e8#~}C=i@WfSciO-sH$Jh+YX_Pczs%lVBM>ZmKm9w z0rhsDRRg<gI_RNup)>^WHU;K!1!4#grzC%4_Kk%RLaG|@>Do!0`o}J*`S(N)XZ-w> zE@nZZ7y6})jb3w?l1^iPPlw119sE(wL!m&H_Q0VESYm_=P$`lc{(Z`+8avDcqcRtY z5-BHW+TbdD1{?A3I2s~r{7ery4%`?#ufb<%5)G^qBPy6VRx(9nb{GZYcUCFoC=3B% zR-g8MMrt{<^Tk^0m`|`G1QPC~2qDTyfk0s0a(L=`=z3)mS7!};NyZD=BI{M$-rm+l z_mk=LT3VKCSkJQ?I>}5ac@sWK=Fd5klPibimTb3ap~$RNO-+(7yn@ZAE4G92c67J4 zl&?@s+u(}|=4}&Ms7y7x9@@@3=FkPAZqj9@pZNKP*04@EmbU!^S{ZPhg85mbrl;x# ztg&duCc?^jka3k=qcE%K^4I7}D5vSFYe*02Bz;VO(E_qSwta2MZPq+stE;B#uZd(9 zeL={UXIn2pT{+|&CH1%2lb}D&<~6|7k5#^c%vew*RQ9`0faV&+&VyJrlt$H&@HT4w z95kxAkftm7+wkcuRM~AZUr%2e1&`J^pSTLq)co$`2`125%I!N<)3*`H&9LoT(CmPr zMp8Hy(gEi7@Q0e<RspO%#o#^uPtYlRA)R;)QqDu1L{30hBb12XN_OR3Dv?{{#`X3C zfqbuF-x=<R)znzso8+ZQUPDs8w?=NRp6xmlxFxTV)P4BDfAiVv_8EBW2C?>*p4DLs zR;kvlz`b;+G5!TPHdI(5E?yhkOh&g_n#n<?Kl+^}F~qc;Xarjam<pJeGm~hTprJ)q zpuwGU?FQW6#znjarV8CCnBFM`@}#inN;vLwJ?$fJzz&GLNDeB_5wNzNR!aJnYC64& z&yUBtRvFi~N->L^gM%IWq4#0Dk|J@q`Tby5_zp+#4P%EYnbZKc5&z#cux7(9$n?T~ zcoG;zNAV-gC*iLHx7M7e>b`+_4$hcDH8c{6_Jc+a5jOJ6A;iai4MS9C6P$98I6G7D z7K{Ven{dXb@Ht*s+|FH7c+I%rb3uw8(x~_c@TpSZBI)K=!bVzH1OJVs^(v>pv{BWs z?`q;Nh_Kts_t@ASpnDrEH4sVlHj%u2WVC24bcgMNZ7&`AD!v_#P~#tH*IXa*;7^WU z-j3}eXC<UYQ`o5<n+Avdng-H9gu#jeqnsxUXS&;EhdGd3Ob^dmyc7~ztn&NV!+cVP zA1n7z7;l($F>v~~ut=P6fw}1VkBOVubNqGYA_yspGG1xEZPtp$23yfZ(ix&g?jTjA z^EqQ#cW-i{lI`KGf(0V7z?k1}q;FC^8{)EB!$mU8a6h*YoQ^7Qun4TeM%pZqOt9A* z{?g6m!<usaA+YynG=YbvyIlL+mIlbCnl&^g9&}eo>rCuxlKdt3r5xT`jL)sU9PF{% zbh4szg?_}j_+_qq%FX3(nZ3RCu&01CJTg$$>U@X7VWUswW~j{-d>L7z6xg{!x`oEZ z;7v6`BzA9_*gyLLUZW!FV8*~-tmE4kP9`h(wd%x~@aGRNhzs8rxgw76BqdzsKXGM2 z+-N##^)e<jmsxD*o6@yD;`=*sC?u_58*zH?7_53)aE;vv*%JR6)Yp(T%W0g2)a`{@ zN&l5JM5}Pem=CWhrWQdXreoRE3;}~=pQ6H|zKq&|(?Qe0S`D|2>OlQ$AejzE3BmF? zL$szS<J6g87Qrvf>r(2r!&7va6nBolBW4)v<fT~<>sGM2C=N>qmmnM84R4QhJPs_O zM7+70UzQhR1lM{R?~seVWaWNxN5Sgdh^@TfI_G8Dp;ejg!1wHc8{}Jfp2YZ>en!wp z&Do3y?>I=U#4eQW)9r*&BENyBd~iyDmoCGpP2>{2H5H7TRkoXP93^W7=!1M3<A*OG z1Q>~1u7*IEh&>_S0c&r9Dj%3b=atY95iVgR(oj6VjvK*mrCm-AQ|uw1f#nKl>tSgd zL|z7?%1K;<0>diel-Q!=aN06%*IDYTRbwq9%K~X!h;kMZ+#&p@Uap6%fO&3n%X{J} zBRNV$y~b+mGv3ljbIBM9AI>wgXsyUBq(vL(scEEsmSxYQq*~GUF^c{GOtR_marV!5 zS^QN`DF0>kWCqwCwpq2gqWhM|3Xdy8Hu#BKfB+w3;V<PzUvll=O`9b0Ak7vtMrR1? z8?2_vMG1Jn`D<CQP|5Z}_h6N(^)Y2^s3`vqiaMT^nFiAA80Zo`Adt_c5X<T90OQ<x zFC6woHJRDMOV*WYAR@}azuW=SRZ`ix$PZ)25Laphe@Cg?>)Pfgd;=3F%dNLp!kQ+? z^-ryJTiW>w)w-6}Z)M+v<muG08Y=KgKBB@}x7H^va<q~DevQ*^8B5yW(}5nH|1=zL zPCkJcp`6BAXlVW2hR{m-@lUCjiDuyE^fpOUrdvq7s9g?4t)@5k26Tu`9aq_XFfoD* z_mNtr#^?{E{2rSA)6OpSu)f`}P{<YaK>Y@`bL1Vzvqc$ZyjuNA^c5ziZ*8B}XHC5z zR8si~&{y;Ca?jD(9q?{=2XTs~YT%xNrFY1mVY>~UEpxc7H6->`dJvAuTo-v0&lC6p zq_jKdz^lZ0Kv|il)*az|V)7W#Y6g=NUZisov36o7z5xgMU#dsRJT<bLZ#n?i;UEq1 zk)8>1BNa%FFqW!?8(_Yk?PGE=6S915!P|?phGs)k-A`CH8CTx<iAAtrLzzu>$jc z3g3$T{6Zz+P_X@wx6~a?*pQaM3B<sIC~l~*krB9Ue7~|tCz?*sn2fssF2}&k+OC?5 z)nTdzANCVuBSRrY=<;UBE}8GYU33i+q(_2%`#X^9v)FFl1(r+@Af^ElIxX`0TdK0T z9rD-h{XmW1#dk@s8fdAKus1-O`t_qhqS<as7HN{S5*Lp}gz+;9k7!cBqRNesJuiE# ze^s;;L3je)<JI)w^PfPm7*YL5(ndaoxq!HlhEk)z^x!r87EaLSnQ-4-0LT7ug^fRx zaKO>!6OxVdN60wLaLZZYRv@j+T)`;6%Omf%=YL?B=hCK8TVI`fqPnLyL^Zt#Wqs2- zN~Y16QSgMpr52N3k>jmrR&=}AzKjZfeh2)@XSPZG&~1rz5Rq73I3SO;nU)akZAS}! z4Ov&sFT^%<8JfK8D0p%kxw--l3nmwTo4l(mx4ZS1$=cvK$>$3U>UXrbpkxilW~;Ss z)k3{vtz23!)s@h1{Yp_8T~lY4l#(M#CBn84*&2ES+jDTt$e>OB$atZ_$5*&rtKm$i z;@S*eLt1NWUm(-3{|q9#p{{|)6Wj>nm|Ac69z?(9U-`*raJ-VTbr8E8kz0`yj=D(> z?S3t5UM0H=j>`xyuz(7DyiKQY@epmJ`U3Ngi#+rPh$%&dfa7K8Pf>_Xvc^N$If`GT z9R=^q2?F?>WtKu%<KmlobUa(CFz4YBFpUB2KhRrIpYC{El}%$cfr+!88bn*o{`BJ; z<~c)R%e4i?YVs|5@S$KCys+2IsOkZ;=7VXF7y<qDZe9{%{hCWO{)FbR9I|HOS#2v@ z1Xo<-HW94PLQEz1(n<&vQ}LW6bV+>j$jA9z?Rp{NVsn9_h+Xy2EwE|I5^NjeE<@2J zHi-B)TY~uD1Y~BwYBT>gek+*oFt@p3>};ytmg)F_wvDIy*^^z5gMGLXJ!NGoH5Chd znlKzPuS0ek4V_Bs-5DRfBAfYTc171B1w50R*^J)cTu|zV5e;01$kH<@8MW*pYPlV= zkDPw*=os_EcHW;DPfH}>N%$Lk4B{H#yH3$=oCz`cSPJ!ZuthfCQKMf1vYviS`D1*B zpgW1BF#R^%QIm7r(Jc_Om$bwAfpfuiD9muxR4EQypbkUS7YWf8=A)1ex7oi?ehB@_ zLw+G(B{cq)oO|x(x>nV0KVY%hLoB7KrDJW@e4=c4Q)yFDKHBc~a?|OgzJQeOFuDkT z&SzIfo{6d?j<WYwn1<6<c^Mw;UU@eu4@71$7N&G;mHAaWKLglT>GCus_cG(xq)`50 z#oFMGgfJ7xe=<bab^F=U<urxg%U7vGTZzNLj+CN0*h(>@-&Ah>R*CjPoJ??RWOqX8 zc3P#@Nke|9izC#?Y9?`y65S+*nLpO!Yg{2mRl%%jEJ>oV6ATMw{sSdtJK3ThjHT{L zLf6DJn(u^IGt;hdm_HREraj{W_1a#@6v85)q#}gQrFhM)L(2Rme#L0j7tK<=$KCpm zcncFqGpnpw%_*e%_f*YiVEO~(MbHr)8kwKsB(9x&xJ7eRP4{uWyFm2@93_7`bnR<+ zK^=+5$h`JC6fTE_qsY_oO;Q+wp_n_Q8*1O~fm+`d$%F@Tvd1E)!AF5-VQv%I-=+0& zZ<o93U=KA;&3RK@R@W2mAY&9o(gb2v^Cj(jDxc5}59A%j5qP4*#}#yGp8$hTD<21E zAQCGe!b6q(MOs827QW|`R9!dx1=1yEh6CU3^X2^Ap!Sx0pcII@&pE$v7I}bnO`quv zaCHmh1@*;#(oN1ml4yOF9*4mS8nYrerfX=}TFANf_Ic>7(BUCmt%SPy!Y=LtAEIW+ zT5AH0ZTB)2HNaoz|Ln=g&Es1Y$TuwSQjDkQ0iS>fGj>0e{53e6)V-}a1vbTa4S6jk z`GE2wXcASM!gz2n369+}oY(?!7!CU~8MSS7;XIZ3D{v=iXf8YzPQqSRLwOgIs@&No z^7SfN-A_jOaZH~kLPRs@4qfY+(FX6x{8C4TAw|{Poi7CJZe2Iv)*fJs>C5UsC1U;q zl8>_1Q--Hy_5>_~x|6_cWq)(5Z^KL}#}-MXI%raD%O<pHGhlo*=XpqoW%wBzg44qn z8lzol)}A4R_exlYx`imVRNy~={H$PKoaAMM=6Wz?k);nH+_*#PSC9g)ar=4l<`dLV zbIJT}_>Iby$YqrKuC?oRiYWrG_C-jpLZlLx29=Uo3Q?W4!864R8|=%TgT`MnPM2!H zdB-AX`zm1p>{n8*WW2a{PlU#6{zNQU#@?|PD$8!yUx9_NRMh&Ic^!Nfm_pQ;4yz;X zL02N(tq|FqDW~ybMlHct0i(IegGlJ$E3mAWtK}bsmS6F+=xEuz^7u|Q>UT_r*jxxz zb!-gQDRv*}P_6I7ZYZ$xi7=Y#`dP{4u#Z=xz5(M&$Y|5HKwvaD-Q$DpSKtKR)-S#z z#<tKcgX2J^pU;x;hJRKFmdS7kJ9j$m&tdFX-P#nyl#fF0divH=kny5yol0k}H+Nl( z;T?~W;|H;8m<O4+5MbPpq%xfdDcoSge}ldexB!<!s}6aN)xa?)6vaXQD@1`o5EU-P zS-5MPHHM6aPnyzUrkZQyeWJF2sq7mv)*a~b^~*bzr?0u*k;y|whDbM{PVT5UI;|$W zg1=z+Z3jOtU`;s?&(BQ78i8b*9Hp9T-I{qc?z(0pe1VUTWc(vc?>Fzb!}pKR<|>Za z{~2_-x^4Pb=?SPSfHhUtEQj$rEyvsY16Kw&_`hLQ<`Yy)AH3~gI|-5i+;W*ulsP}; z?bNYVc?2;&Tv9@45A#CW-tRWqJ=B--YbKx|c}S8cD;%d%lfcw0+vJX6ylywMoqwV% zFkGE|+!f?|eWXh;egjt5NjtF!zWuO8c_uAFT9M3b6Sd_Idrqj@e~ax(D7jGB(UH(B zv7vCd&#NMYUoYZW((Yha{GRs+_HM4lmFOTR$n*5CFnSlQdo2uR*Yn;3c5dQUD;TD1 z{&7B4Lxk^#Mo_ZF%{SO^qB=p3HEV|U=)>_WaN}i0sT2;8m~@>I;wGKQ%m&%nhare( zG=3a0YJz|b|IJ@1nw~FinQYuS@1)0Gq$-5)9SGchKaUi(Fw}6LHF2}ce#O_v{@gl? zZnAR+eoby0e~py>!FBH;!JZg?xNoL-z%d1Ea{O6sHEgpZ6LxwmDcWRiaLu=IqcfHY zSJ?x!Y^w6;WiO4f9i0H#ZfmVz$ETE}B@LDND>|2So}Vx3KapHyWydbb*D6Cqj-@<s z%zZP*yv6XCkz8$FDV&y4V}$gyd3j_*crL%k2EX82#G(R2PmA70%d1J3_*D~aa#)v` z$sTvnWW;QZu(Xmt1&z(x#3u4}FaL}S-j_%oeK%8C-pe(Rv2Vf3r9r0dX_#*(qwTCu zWZSWs27&GIrn{golcxF`Uy@fAsL{>zGa8!DW+g6frgye2%aBNl0MmSkU%JG!Z7P2b zcBN^~QvO9KfFAeEtt<ZwV`X?)C42ix18L*83&-k`C#aD(A;yhQXJZ4N?!wkbAhsD6 z=fgZx*m>CF=d^trSFkp?iQJt!v7dxq(?2Ei5Bp)9hc5){8^MYAkl*^Mlblnd3zqH8 zV-`Y)8}DwMgAc+H>1Y?ZK-s;-4e@?xlWYTI+kxa;=9-ebtXz<?lhxvuGCnp8={mmU zjJGD$Rmve@ho4bwE#>gj*E6$SN4f%WNY||n3x4I``|~qfrtR^OsWjL(itg_)H}*w2 z-;o_%eFJ=5x0pV8JJeUQYsnWgoJve^cK!--ZMs7z;1MB%c?|-+zq2LpRMMi=ua4P> z&mF5qB2fj_-;)z~h)1sg{63XbA59bJ7-c5zHWXvKl5AASxGX3d3sp!h!>~34ZRDUY z-3v)Jm`M!P?pB5AOYMSoxP#0cxd_P6d9eN=^*wTsXijpHg+a8o<zX|7w&4JKNMiaB zu6e1ZoBz#TxN1G4>c5k$`WmvfiAGY^E0S~@9J|PeT!OgQaddbD){VihQ|=bVu!%Su zlA?9NT3BZ%S8*1ai?3Pt_OzG<Ync&t^P(Dl;d$OI#yO!$#NHD>2STco#zCf2(Ic1l z&NvA3kw3Y0ns0s}=t6<<Gh<|HNxSI-bw@9=1V_eJ(t{}B1jL>CW8u+PPVv~rau~IX zRMY1Tzg+To`=VE9j>r4XKN{x_O_K?)>;<>c?y_A`tgiA@F-1qQcWkw%<F~8AGFRvW zhV1on4qD|pCsrlNUWpdPY=g)Ltnw&1a0ti5RYGJX<78Ko9p?gNo9RNCyAJ<dO4l}P z3RGqaq}zYxjsGg9%I<R+41X13tm)L@s*@en(0>{!vGvYYYXnWZ?ebZ9eb%ki{%=^u z(at?u)*sm1K@#ZDE{VMie_0CIqUN{@PId9&hVfEH1%k3oK5KFosTcL9d@QbEB#oaa zOq=^q@E_esYcsCHaQoVa$Z5r#YUUi=3LQ4a&`s7VGJXu1pqlp)gb;qEt{tBD=)O6N zg`mK}ukmt8>d%A_B-IYVuhfEmv+gW>V>9A8!%4c8^bL-B8V6tP3!;lwlBr-ReOQ^v zm_-<0mN47!ewzBBvd}=|D#>uTPYv|xH*&Si7=AoW-s;t+*h$565F1e9o`A8+?V{#q zVI}>Qp{F_ilCc3FmTRt&Lbi8KHqBNy;!bf&4Y!6Pg$CSnL17>SH$H7<QR9LBS+Jap zP2KN><77V)yMwC(^WW7FH3WNkQkRb672%TTjvYOGiWs==U=rOyrtO!PpnbT)c}m_Q zuCE}noN~3v&1CNiW*?Ni0@(OkgOg_ulGj*1`k4|*L-ig!(Xkd-+ysZEgcyZgPG8+7 zG3|h-&`ktn-%KlE^aSAXC`vf_hf;Pb@UKB!5o6o|*1RC^_PPpNE_~pGFI#T;8gotN zb&%3U^Bu#ia+!H3y$z>@boQCXsQH`)w<rn8%OadMwwtBRm4WA!Ljk1Y*>qYf=+`La zIMCI=Ebv`(Gb12kfzev&^}3f|WDCl&?iBBAgMCcggZwAtD6F89f*XJu*y}FJgQ2N8 zfjBw#A;Y(Nv0B#pO-||#Oce5_D!-;bi;(#b6_BmD-Ilj3$J&!$nNQ+X{+CdzRBek= z<~Upy+tHcWj<|)8?pF|A9f0u=YZEm6<Rl#jiR~nXf5j7ck?N~f`EhP7#JN?UNpB!7 zdeo=MOBe$X*=D^1OWLtDOxXjG9j+5Jm5b}sI>~qs?4$h3{s}T{-_8fZIW~c=sS3O# z^Q?m_P}O()PQWxLye>c9CB%7H9Qmii+6vRRP%;V<^N9@$`e&3B2pQMOxH_2b`+u35 zn-oEInl*(tnQHTlS}|j<G%~yc_mXk6gy&1GBc)AZ@fBxBf@gMUI6USxk2o_*iBbbA zrXb9UsDv1=_GajIctvEE=|nb_#(5$162DjEE-`-?0~zk+MnsUKw|GKSwgvtS!-5Ql ziHC`oA#Azjj>h3Y(*3xZcU%MmCGnv3Xr#FE!O1E_o!+Ta*=8Sis!OLjp6rIN>tWPU z>K#F|rSxzI<2%L+OSN%4(lzSbr-N&iJ^l7VG1@e+ij6!9H`++=641ranB%x*#=Y1x zSU<ZOU@Wc-j*|r{+dvjjcuEXi4%7Y6fP*HpTxKWG)34H`Ex??lFFTpz5FE{ZVC$+j ztB)vW$!;H84u^8Fb3addNRks8aDy#Ft!N)7oA!FmgT3x7r<zC5*3;ct;FVlPGT;6_ zyxMAS;J+<P4Wxu4N#`v}QX=cY6)3fXIAK5pkg?7Bb3PBuW&?~AO`av0(9I>wIKL}O z|KF^xK(;Tim~(^=ummm#cM&#vm>sOsq0dyDK}kTxVW2_|EkCKA{DLfqr)wO1Cn@wX z!PfCD`5PnHpy)Rc7mkdP#sO}%{8iQaol^HLma+@fd{QM(VaIzC5zlAvBreu91JvV> zTiU@j(Lh<82}3uOvNlbY{?e!4o+szk21}Hx5h^Vok$J*3*VsMJ?4-TF-C%jVjGJmH zC%5_ULFSVkQe}ROW$yjl|8hb5-lQ*wZ}?wsXkSnR-$kT-$wL{q5>nFkHF%fLqA`65 zzM@+3k?v%t&uGf=6}_*JU+@b_mpc6piC5C6(dSduU2WWYL-GIvsFO=xAo+MEIn|UX zJSf3hZrlO97PFlEPCGYMe%4R6c}O;ySHo^Eh7*S&s?#)$YNo>Er|~2NN$|kWe%N^& z;g6{AU3WA%LpHg)2ADu*40%$iRS&q@p{o_@t`D++VGY`72Rwe3vNk63$SP%}6u1G# zPRKuuE09MZyNe(D9_TNCF}QV_OB*XV0fh&qAX87qZ6goZlOF1Xi4gl-#%>E_I9d}f z(dak05+}Tb-v&=XC4)<wa)2iX0HLdiOmE_f#ld171A97guZb%H{sv_BK#Kx_l0aR1 zi`uL9AmYP4F0<g4uFhrYS)E+6o|LR-N^rHSI`1I*OLeK!RKo)N;J^9oumwDe-zwj` zE-63r$VsZN2$BL<3STQb>{&0TFye{5I#XY^T4bu^n=APT4ZJ*;bduFuyc2VIYZY^< zJ>>I*d8N0CmhsMRA@C7D-B9ah?PR|E333)I+{%?k&59cH12NySzj$MUGMr}9v-Dxs z$PEtue4?^uTHS)*!25}~b%QCwgKp;Xg4rO}yIn(AElhMU9wh!U6wNkIQ4_owoc8sp zxcn{b!kG|sJLodI)T^xHAW=zu)PVH*2g+QfeOj(L>P{P9D_oiZ*Cf&JslL9IJqow% zqm+Qc<{uNA(^)^;(Hf<)3z12SY8FzhUU51u4L1}S=-FZgSFt(ONDqGDglw60ih5NE zlNgEr6LB4cxNfG&Yzn9GlJ|WB?&8YD1HN!afSs<^Il8<W3$xl12Sb6~0d>Nwjf&+~ zkZNpjmi(xt+0{*&y?Vn@Qf3BOd4CzCgrgW{BUaXH(ClL;0J{k8BYp71zum?#HP)~N zQ4#!AX0P!{W398WJ@C2L{35bLM(@;D772#ad=f2rl<yY{O<>4%JH|maPN;Q`D0mK{ z|C{~NRCRMjL@1x|m7APpGRV|B+@ueu3mKBD^suOzDpsx#@V)OImQ169dl1tqifV=D zsMc087G5*l*h4y@o5o5k9$Sj?6l5;>uHqT+28+-yHjOTiq=6s#$k7p!CW!hvP0tgj z!bY3P_-gXa0hphON*xRC&gA4@Gq)c`RY07odNwqPT$GSw&TN}d06BqSUU$;5jeIy= z11?v5@kJ*r6r)eFhXp+Y>;3R!qnO@heS>(#**K2vgcu>?4vTA;DR?cvAbW${<0^x{ zj&b;4#~rf5dd0zocWF0SJ#v=JbV(*$BT$D2dtUHAP5@#|>@ZC*-)+Vd_iq(D-I{A} zPwVFY0{2OCA%B#QkGJr<v&fzqPF3>{$}(xRk1cW+Erfze)S0M0<1>pS?=vv#SRr~# zaJ3-$B5BwqSj<mt)#S5269l?sCSIzlgqu<Z(y#saCs^}M^GP@JF(a@gG}K4FhPkRH z6W@~f7@EEzkS+P%E0vxzrx_*JKF_}Zq5^Sn`CJrpm$KCVZz;>wna>$KZEo&7d7jh@ zD{J6g8b}eL<N~fVt>3uVCbHCsQUzib`KUWVamBXPNvIOybd9it!FH^vfpJ)5{|f~V zBknSjMNtD2CNh%?0r&FbgUlr4#KTD0Jh>P0^PujXFi%j1g#%Z~w!3AMEmBNPzQOUY z4f=4~R(B$}9XagdP%{u*9ixPdA)(vA;)lON4$WBwz>BV(BG>MEqe9yOf5c+bnlg(b zxzd-|3cA;e<+KC*b2VQL2Um+N;C9t)X3v4^SijPmvJY1Ml;V$qH~0rWM5;fTVWudh zv{kanR@1xcu0A9$(+%#_{m~N*@oL^ku%k-R9ByeyaJ3G>@;yS-D2?Q>S}vp@Lf8yP z)m#^x3k)zzFxJNWooZ}WkK%fQU!krPAD562ec6GJs_8i#1}_Fhdb2yUK~|><7su&{ zPZu=9J{#%2tqtgGre}qyR{lJK0II(o+oA7HU*Dkn%u&8uVMH|};7~2kGE+TaF_68G zmR%=DcOW5!8o`MY6kp{R)A+6MfZ@O4XTW-pMCM#`V7R0Wgm80J?o|txw*D8?sZQ50 zHM_44UwC3WnFG7jEhBr`q%P)fiuD3N4W9NRJtm$Lj+%*shACX9b@OfcPh>-P$aE>= zHPE~WJA%w+@)K|v2aiFj3Uxt8I=Dnc^h}VA>1o2jg4B9Ln<!hZ7*QptxjjT9oQL7? zqN42&Gtg+{3H)NH!w$wXfzO$-^YD~u>{z@iMJ9@pHmH_xL?0wHjbQy27#Bk}tjmBz z%Ekl#rpzTuHr(Nq(-5`#8WT-^w?WgrKoRqoleR^&$&qo`m$0^5zkyh;TYvLdna^GH zEM)s_40+2nUX1>G@E|tWO$88DX|fANH#CQp=#ROwT06FL;#cO<6ZGwKt_l2Mhp|wx z23Y~?bVHxU6Cw^(#`YCh3+zNOl+<@|vD?TnJUgddslAZW%M|#?76-hnkQc>de9b@L zv%PH%q-H42)BlQ7hae?bwij|{(9U;+rBpK!adkdjNzPIu0>5%7bXspfZZC7jTBJ$Q z<}*hI$<3W=|6@@3)v-Ss9I+7*w9=hXZj>K^NQGTbwVwQbu`{(ropuNNWW4l=JN3+7 zbG(BbP<EX&2ei3x2gi98>mYlaef<qE=Rxdw8uo;mb95c$R=~-4y4b>8Zy?v;Q}`bD zCIhskn;#Cw>o9Gh!ubSN!BN+)Obm)m-lLoswlY#tt``TO|3v(b3J?YVy73SMMWriM z=<%|Mv_qh|jkxx@Y(h@o2Dq?cj>)W3_FBWA{^}{UB?$!iu^&O`{Tm#@$Sjidtnv}_ ztinTTQ671;`;l<E7i9;_jH1S>A7)rX^>d;<N|jG2nY5wM5IqWRes}#`I_>Tc9B9q? zOIE--O1D7NZiBrQjJ+=)JMw4WfK`SRODJ7@nH*|>sBVkAOqFVdJN?H#M5zpP2+Uc1 zGL6sGqz0P5gLl1bis48h@0XGryzD9kHJ$@HLN^YJet*;fzvdfRTO~72$-c3N{Mmue zSyTtI7IF6&$^S=;WPmwvJ2s%rPV$S~OM*{kaGCU2W|CTd%w`=*KlEwhoch`$DCNO< zW|DUROZv&jf;prfj=6VLFb@?|UoNwu)W?s2{02U`o~#~ZC^vbEnnmVVu+EOYTW3*3 z+2yjhhZd;$ZsYg-hz%ab@S&n_RRU9covmboZ1j6z`hI>zHSALspY~c1F|}F8+xek0 zq3+M9GGFrq;kUy?24+#$c<!qvW%Od2YP00p$(-NtlSh$wx~nZG-0*-!XNKqLBM)!z za0dY=iU-~7#Nbv4QRPCVpf#$JQ`qb9F~r;9+h<U<L;gv%a~&T4EoiZ9>L}a81jQa? zM*qleChY??w9}{>6+X!eJHgyojg*r$NlCo|ljz9pq={4b$5HyBQ%VwrPWWLX6iK5m z!#Zkx)yAKI=gGt%_ZgH&?506h^PWQSo<i}SLh+tL@t#8Qo<i}SLh+tL@t#8Qo<i}S zLh+tL@t#8Qo<h;j+*2stQz+h3DBe>j{(q-XyvGOL;{)$GmhU;1|NrM$HikZ+E1g3= zjL1X7B$u{aN}i$QbL{8{+~F?mH`TH8-MgHsDJZArCzHhyWNC;J)n_&s1``nO>L2%@ z{&8_0cmtWJ#6nr&K`36g;6roX;?exB?fe}nW+O(;bX2SwR?`sJ=Vca=-%n(kyRGdG z^V?>0xJPS918L`vD3-l^L*So9j^|JOM^zxzl4>PMX{{N(A*h>4Sqh;n`rFx){_L0A zIR8^^o;8G`3`Cu$>J~OKo56H|E);W?!<y8xm+jV`?Jca14h?_ynkK)mx!>GDyS%IV z*$F7mya7|uMyC1lfGJ+)=col816JwiTQDiOYpWLZEwCB=$v29rX$ia$gG*xTT&Op} ze1&rgj3cPeHRmb$>rlZKv^8+cW$rc7eZsJ|8~1~#yMaVAca@|4mR;cb8}WPN%7c2- zEz~XU`UBMGlYPvDYIuxe8XcOvSdZzU_vm;|^G$E@Zo@)hlEoDWZF$}0KC_*T!Rtu6 z7N663K6ihn24+(0KGGU-n!3@*j7FUqKz1tVDU8{T8kgc9ZFohcu&bSf?_>*hbBm3T zYa(f#+C4<Q!}1D0qaA%iY%|(K(&>1`Sgz~hwp-E74nc2Oh+5FenHax%z@&Ni6kT<c zemPbtmLAKNc37N2FP@nkRZr(p-BJ4I6^1>X$%QJDUdb_OJ*WdB?<Y!Y9dK$Jdh`CT z%OtXwWg&-C@ARPZd8KOULDLdC3!f7CO?WEsA26_jjwHFF=^)uY4YIWp)M+ci1Eki+ z&PBzrr2}+337(NH9;3=(%tZ|KFC%x8BZ5McL5bvj8*UGQ0}g&OM8?1iDB>8{*ylFG zsQ`or*w}XNZzw?4-64Ik;10a=Y7;XjBVe+ir^9Y_fmD*v3QA9aT!8oPJiXN_ePuMl zdrC)NX-22@&9uNkY!d#|uc=_j2uC}i$*!>Nv0dJ4fns^h74rBBh6(S=3DEgm^Q6K_ zTCTYPW{IJjI2XGVs;dZhQH%f6?qb&~Q#}bEv2VZ@b(m+QZ2hvIJ5nrik3)vnHK;nz z`=h~JocU98bWmm>z@!R50ZTaw$xQ3W6W{VaLF*@bd+_q1hCF^ugqt}JL4&|h{2Qrg z21N^Rp!+wtcJG5&5BYX(3csB^U@m&?Q89oCBL8Qr>h$6Zt=^sn-xufX?a6tSiqTbc zA1W%svL>#_ge#?GL_`cfaT{5;Y;EgYk|@bFeT)8Jmi60mjwl%wB+AAm2(s#H9Mc2O zGNq13;OP$j;cgzb?a_5x(p@0$UlC$8RU~i`T50hd`n=xQYVUT%w`%<3gXjAceSJGT zq9oa^4bq8Zew!Q;2HE!5wQ`(^#D>G-3TrWDRK!Bu7^tPOdj9$vI9LoP&p=fdoR-St zJ;|rZQds|mYFwkTFW|a!;sJ=?PwMStFhl|~qSoS(-v|f!c*)fmJKAZi_p|YGsKi|{ ztZzt+movlOU*0_^sDx)}jy-^i-3LJDPy2-oBha~>Uupm2_9<#=4@CCEl3G}T3ZGeR zrdO=l{hEIgR&E}2R#(%|(p&!t(M_c6`;e5hZICb*P)2nX4*ZGV(Q{W-*+j|8pa6bb z6NxN<`vYwK`%8XwG@5cT9Eu<7$T<R!$z%ydg;OJJaTrVfoolAq8E_=YG^+*mmKc#! zGuu@fFrc9ZeKih4z>stc<(55XG6#J(`&xQ_e1G-2q`KD{pjv=6)Alv)y`1q{#O^%q zLFlntHe-kxzj{l;#Cp3%qP=$w)<4Q7dt%SM{xMcNJa(9+QnVeFR>k)_b<q}x5;Pl0 zxSW|nuWk9kcoTQ|2Rr0X1(FIG#eJ8ib_#oYnUb=;QkT4e+s;^WSCI4bCfQ5M_3zvH zI^pOns2a|HbqA{6`sz{^+&pKxPF&japIvw^dy0NM>}c0@^WE15?tAlC*r2%lUROY8 z$}#g9uH*5vy7z|aYv+C5kcJM_9y0Nwj)t@dEAQ$ir%2=*)_H(`r;Z8uP_-TTISEk% ziOOLcq|ihbtXA0FA1l)QG^n?Uj#J5>QEdsMkQu;@WKw1*5vubt<M6YCAq9;EFwd70 zyleD6)Nda`vlNHMNEOY-)}Q@&RY#yh_SL#m?S~#vZF2gY`9;k;*{5rmA`7#OYykPO zyf`}_<&NT97ZWF_hx=mk7_WZ(|L765HO!2c)#&L#h54Xj=PD$sWSqd~2JI%PF!GM& zcbW__KTZ95!=x5A^Czvr>Q|m_Mdy=4gaVbv5FJ#SJ*VuZUBaZGX(K4@3pTJOF()qz zy1W0?XqoC%%;S}W4;8Vll5)4SVXtJr*E@wy@^8!%E2I7wHcNdgyN`r-FbW3F&}(cQ z##wOV&`uXMpV<~|R=E#U%T;`^5=Cri*7{28-<6e+69;vB|4*IS-|+J@3+aPc3DF@S z@zeITyrf#<mE7wj?Z&23;?q3y{<Hg;cLL0Dm&O|RYo%G$HucHpnbO*~IO=)>9JejL zpfQ`QQTbgB8trbrr5n;Ds>`I=im#T|N*Nv>{}&h@bjhHf7q--L4wU#7I0za$B<4Dt zSb}dYg&kyRk)gz(_V~MRMg^l6FsY%MzxmxeXB(xl0~Yn~)}5f%dN+I`ZRv#T@Ci6Q z{3=W@2+Ao|szqn$fNN5Joub}(D+k6^jRwV@+Q#1+3G<YZ{nm1{YB#&gBI+5-o`gd> zPsS>TIa>ttOyIvqd&!OlK7TBj(&$z%LAfwV6eH0Xhd%B4yFTp&@*%YP()TcO!>A4o zI@dDqYR*U3zzZm{o^f<AWdg%sxWjhWDJQm=#uu#d&?rfw$Xo6IUK&}8@hzP75eSt1 z#NjjG*FNQiD0J9Ex_~0Np|@eRiisv~|7h1nZ)CaPsxo#^qdQRcJy|GdJ>)@hkP$Yb zb|$CGJ+?zjT_xkmWn04Em<3T;wy^?~TF0Vlo3O!v2A!9`e%tyV%q1rOCbPkC{DF|c zR0R0>m~}<j<O$92zB4W7225nHLZ~_y-c{Y|`=C3AuRMD@sf7UA7I?N*Y!fxoPy_pZ z+$3(7HL(MQ&co?w^PV}uD80#e|I(q_!wBf3l+)cl#0<Y?Vws8kflYLwu!cl;nyGdP zoJ;9yarn@R|2#bGgWsSNsQE)f^l$jsmTVOIKEup~E56XQsh-)TD~jP=2N{M~*7BZG zx;p}emIU=*yZJ6}NvXXum?yUWZl0K*AJWGuqniVMX=K0VHajeWLdbOp5l9xVbIPaH z<}8(ep61;l)lxwyi4rUlci00jP=0|_beY@iCf#9E)Ib(-LUToA9NqQ@2x&4!<S~A3 zt~~OZVEi4RL+p&^ZRJsk>&3??7~4Z`2pN0m_<D%EMh**c<r%&Fr@>S`8cNOk{s|Sc zTGce2l1B#=K*qsjGUi81_*$rofJ15Yk|e@8dwr@&aP8<vi{(HB<9-y-&Q(etgAl~i zOfZ&AfE{q32simNL&{!K!u(99z8WRnLt!q7={MKI1Bnv~9RWqz-5u==Xf1sAFbw13 zQMa1EK@FL(!4=m{w$3LGfsdn6PAj3;&!lqlvYli+rqO`aKs%PN1!mTYc-sMz(Zn3~ znBIa<9gqC-In2n22R&j3Da2#+vAbxk*St_NJ_TWJ?G--DLk^3^px5UNocNS5YW@PQ zJ`3F5mUW3ztWJt*waZ$I&E;3fq@aMC+4+yKiNg-Qf+CPv31LT6-5&^QmNiTM72^Jk zqHby_<(h;;_-apq@i8$(T>`0%q_8YRwOIAmV7$Z5yVjZbMwCWjcA1w=TLG$D*R`yd zd3r-ok*x6(t{?q9ePGGsP0}*gKnez7;ZL-vA!Jt`AMYu$deL|{=>FE3$js+pe@)On z(Z+lW=*Oq{qv#a<7Rb3knYI5`L3xqsCo#cW{3K2j+(1+S(>9==EXRWjjc(0P6qGBK za<4kl>pnw2g-_*NQwI8Cjiw>6v+oefDVLy}@_F>rZD3;a(&2mZ5d?^<!KZs6ZD*y` zGgD17iqRjl`(V0R!??yq?CFcPX<F=J+4qxi+{!paqJ@1PI4+1ybf#iWTs{h(-UFzX z{3e&Ru0)ljt3!Za8M0}u9Crnpgpf7LM!yt#f$=K6w}p}#n{_u_|NC8#Y1l~lCi}~F zvVng^HnofPD`i_%R7keI8eq_2eZRV=0#@F!zSzMG;_ry>(J~o4na%x{Q_S|1mSXkb zA0t|NxRD1S$EN*+Ek<X(!h|bipA`Kd9WO(L)Uj4&#@zsn601A46;r1E$-g~KwT$b9 zTmfAI?>NXsrdb&9Zr6VYF;4wqx32YO&CgWQ0l&8I^hj8iHcW1W2OJ4Ss`XcB0~bl3 z5bFp6OXfVC{f+8cE}LGG7lr-Qy&b9WM^NETcBy<O07ArlXMO@Kb1un22X{-)y0BoH z?*GQT{o`l<dsNx-`%@(8V{Q+dom8k6J!~jdM@kp~bmRc^1wA>;3JOc*ji=Vw$wmm8 zhV^4mkFRpS4MqyWTIH~t-IzyQ-;jhv#k>^qu+w5rE!nJ$ylh?PHofjdDq%(gLGk4Y zl=kOVFh6H2U_YFuqUMt58tb<F#LgX4Rugn}Cs6(j3V~s!kU%vmESDIO59ZlvJXrJE z@gw}CpXk94OWY|cer?AeuAfwi*rL(q*6f47z$S^gYQ<T#gcc>yMNxjn17rQ>7&D~K z0`^7vcs0mVf;KQA+0hqt&)gM-D>-y_u%0=T5D7gQDyGjJy7tcWqiW24(9MLZ2>O@^ zpZL*|f*zk4S&+WEcn8FfCR0W0+X&KMqWW(5bRds16qteVI!s3;v;2H=2WT7l`Ci>% ziYsP%4WxjXu8nn69($#XryEF)L-)<1Y#(D$OSOTFbF7K1(ew=^eQaCK#tqys53`3` zsBBao`gWl(9*vkA6{D%r%%0;Pq{>csJKPW?60VX*#iE<XP_BKf*AQKa?Ni=HRF_SJ z=c1rfa|issKB~6tf+BPuOz>ID%H{-R)G;`f7v(~cNLDz9X49D%6RXUS$SX)PXkA30 zd5@!MmhDC(3}5eu^UBDql{$KaH;Q@_k>uRqb2~#Jh6dr38Tt*w1(8<yA{;QY-=WUI zu0GcTU12+dWi4zu)8u8|u)>-;K3;Li85QUp{fALeAW!vYw6T%=p+5PVMmY<0?hxPd z7bbUj?7m|S{7#HuiQcarp8@M-F(Bty>Tsax75PGpoU8C9)JlsI>9I6nAw+8>GzVLv zn*~dRzBi!WVMnXe1@;?=^07`OBRFiRVeuj=*Y_S}`p)5?x^ZMRG;M<&_(b=^ls;Du z8CwU;eP|{Ro(>G=LF-%y{Xu_Tbowp`+y%LnOfBlw_k-TZ?XF>*g07AKZ~pg6To&m{ zrm=^;WP}-;i<vj5eKU*TSC+YkQ(12C*&)Lm@2~18Mkjcd-C9^?nhjwUVr;PMatLAB zD9mx3i>4Sh{~t)Ozi8FnS$Vm%3o!8&vwFrCkQE6uP)-g@x`m+I0{X*>4$VwGu5d5B zeFG!i^0TCz&B2^S2fqqJL~J{lJ5djP1S3HOrewfs$XhSjxKj?yW8@T6-M69voZqhE zx55A=Of-8ElY21+5imVrJSF&E3}Ava)xiJPnF^AWYOz_vpMAWC)wTp#!c=QO{9dCl zBcX50b8v~;ecYpPb4-R#Mz2@~_}$?TL8pol50-;C^r0pjLGic_Qf1dgd82a^md|se za`Kn>yf*~%ks5sPU#5OTJb&eEh<_5l9;v>9A7V+kv&{FgFwzJFN)pw~n<;ygnt5F~ zo(}}+oPO^!E>=}j=1jNa{T}TUwHMe~U|KOyr7)?`CMWLX5y{3(&JP0nQX1?MmDC71 zU&Ffx99W}=!wk?Z<qxaMs!S!kfw=Nd(Jik9Q{0lbMyvwsHH5=<Z(I!yuD9MskgDbv z@|uSt{M->VZ!+V?psOkFCgk2>tA)q>B-+NW^XnD7=IDeT0Sh^%U^0!=!8L=y=?=Xc z=ffQHn2Xa!{xq**up!W3x|n4)B>22qgdzBFW0(zwhWbb_Z*)EU0x5xq)NGM&^M(dN zv`u-Nn2^(a@I9J69v16F^sem#zf125Y%;uAHaQ_x+>ckwOfD$-_nCf)j-S%#t)z!H zyP-iD7WmA@FQOq9%udUKrhl>XIhEuQ9U6%*hOg*IKb|L+faRE>>2aUs)+MIFf_}6m z9I@;GRe>hTw&T6tjMxlGT6B3|<s@{pAEw7zM4hS$24_{SQ#HZJOQf~dm?gf+V@*-n zex{w9E>=<#t2#!g2=27G{KRb7)D7!;0TJ6~YL-k@!7Rvsz&D&pCthH}g6#()8#MnT zGwcMx_OKBeg(x$FyyqwfpZEiS>kb^UVc<(Me>M29YveG&2Bvf_f}BRbaa4$5w94c# z!M<%o^S)EerZOd^q7nF2NW2<KIeUv)|1xD9tLIs)GsMh1O@|##uCePOX8{ztO)hp6 zCRgU<0-A&x5QJf-0}P|LjetdU%?T}HSY#L5a0q1V>`XX|!Ptn-cOaRZga;#CKq%LS z^7>#XXD~)OMAkU?13y||;6B@QS~c5pI%|cI1ipUj1S$Oh8hx8wX;!=Zj#92|lR_gS zqU;&{6un3fVO~Wo+eNR!(tg)4c2QZBjn8(QTLZUDvONn#x!RFU>3x`md+ar8{0q#< z(}Bs5R!B1-dD8XMt|@e%FYxoSTe)tt+uoo|4EnAWQ#eK_XljL_PM_{`3=SDahgMn> z$HEaMCwNX6ImTfzI!rMonSOC`lXi@iI2o5)ZM65Ic|Rl$O<{NA0FaCtWNXqs{xR>u z6i=>i)-MN))mY~@Z>fQG0^_obH2jkAYhbT{Cy9wykNpx8jTz6laO)xw>+#nAf(*f& z(i03vZSdiGqnUD}Ai3N0O2=0pDAPrA@!iO5Xr4jOqjQT)@5La7Cq7eT9ma`&V*xZ} z^y^HO5S9lmeliZflL&uzn=5QsKgng}B{4YaST*gJ>#J}+V%*T=M)tw<19}?<=Zg#H zP`4_9BrcGH99~OdJh^x|<2rqJhO+QjGqF20-GhlaqEctIipukmUe@l_v18zvk*tOt zJ=PKO^TqH*;cy&t6J@hPhyK*CVsdcW<3=tIQj>SMXV0UXT^r9VuQGGoiot~uhhU8P zyMi$$7lNbehl8Uk#!cz{$}piyfOqH+db+Q`2DRUve#Nd`(FTP!PnMfZK1&{(T4;xF zwm@^b*3HjT*(N)A*2az@k9VE|r7E!ouICc1>!h04MR6{$#)1A#b^TY+VLpc8M$>VP zQ#O!z+vI-YJsQVa?(oNqXmk?_B!0DO+>%A;mtKCl%n2|<<-db>Zjn{}kYU$$LWz|6 z89XI30{Ioy-y+GQNWIFh5+kW@@LViGmni01?&q&w=Wml>2yLSJ2zuV=eH}3SHitp@ zcYnh}=+<)Qh+D*PYkjzZzS~k_aZI7%a;14>g|@~tvhz0#EU{UCPE6!GD$u~hWu%6j z#l*g%-qCj7)2*5^GahVvnNAGbK-$FwbU~j`o=6O)Ts+nhWWc_`Vez0HMxTZFU?7lJ z;&tuz1bSYqZ|*P!;>41h<Uc9qh$bH7U!#fp$vl{)JXl4h0|q#a#Hur1v^qNZn@leA zw;$@_HF8~96n%+gA0XamgoaA%W&DK%Mo@N?#@Wf<w$OhV3sdfBtpCGVxb;imUo_0K zXyQfwGh*}damsC`J$TK-Z^!X*W)Re*V|9#q)Ihj@f;Dgxd^ZWMiGKL413x6Fjjp4C z$zpTD|BS2Uq{wNbwn^IS<Rf|&j=!Ypn|<1BcTVk*Trx;B=U{SY1=TL+zlM|@ZpZIP zsWqVaQ0rw5tCe5Th45LBk!8E!xr9*-=IPb9@~P#l*#z&A229x-Zh_g6)O35kRMfzq zTmefm={dJ68cv!etAYIBX&#!*_(pydqQqI?a4@O&Ygn0&Z&6|WbhpJ-hJ;=wCcdsQ zY6ghRpTXxo$iv@(aGm`V`g}tbeFjE22UFn&Drm>un4d#_oN8WDT<es#`XRQ042QT( zx<rw$V)6HcV`_E;tn5)BO09Z|G<Hi!!Z8lZo*H-=bH>oo96>5Xe&V2`+5f!E)WC0A z0Q;)t659{2TJXOIZOs^<Tz7XEE$_#O$JLqFVVoZ(1Y@&xwcg~7*NI2QZHE5Vmk`qe zu`fZ+n>eQHaCMol27}+%jics5I96cj%CQ6!=!5e`kjvq=;~XhMHiq5}R-z$&Bt!Bo zaO9lC{RHD<CdtU(Z94IQ8E5fXh5^pIg{j#yoW3uzwaSElY(~j1ME8d^yn0R!1ZJCp zb!a=^U%v&S0*ph%zKCJ37-+9Tx0sXNcaUF4qn*C!+0gm2GP0u8W#6y-+Ojci&SoCT za?JwjKM&o(tF4ftA2-X#;i`2qj)N;<i#fSw6EZsJ8NTJhd53I+pA*H}Z@y%z+_2=W zC0*Vr@aHf2D&H!@x+?R1E2<T(&$MUIn2hAO6f`E6mNoRPu<I^C5u7<~4P+u*w*&|> zRL3U;L#4WdyXFaMl-s(k?^w{NHmBn0M*b;J!dLvitebVg44aq$-wJ<%Y$!9V82s%f zGOovKRl>WiW7!`vv1h-+nS;3u{M}rJHQ+dkH=O&w+dKQHrp|P4zkPe=b*iU&X4;C? zYG&1{RjV1>T2v}~O*_g^YEyMAD&jt^RZ10^ii(QlnSNMnt){IXsfzBZMXFR%MPMkx zu2PMZN|dh%h+7O0AYcf|CfUi}&;8yz;72>o%voohKh7Vl#ab?vMIZ^!$9-S-^?NHo zI=UD?gF!Jm;!naOv$hN?5BTtV?Yfy=WWgzzZsT@%)3%=$3l_V~L;bjGq~WHou|p>| z4HK={HN_XSNB+NCf%UMyjemX|-zM|ek1FV993C?k+SEf--C;b^KAPZbNRFTNb*hi6 z5U~5qp%x)2s6{{{7OyQa{Z=W<1$(E@oncUzLUv`^OSY>^<e2t;b7<HqG?&$M@5{Dp z)M8pTUkOhQ$A%3*Q<-$jk>zGzgva7(6uK_rPjC3ep{rNW%ESh^+<Q(U4^UU-Fe`Zw z47qd@?T4>AwqRoNa26j@Zt`Up7&Y>P`w6aF=*Y^rEivmRI$4vsGs(gWAST<-f>h&# zkHPlSydk{!j79@CUui>%_A+1WzZtCH8n?sOeo!W+(By5bMdB}5%I$}pYrGX-z|*Jo z`VHker?M+NFJ?u|;&8m)uIbYCX9WHfMdz?qgx^X{OS{G!&;?kdEY71LfsjV+t&kIb zt`a7!r}<}niZf(M3x8Xrqgo{I_UQ26Dertwt8MsRSa1@Gi8{Bu24~XmIks$<)yp>i z%q4JUV5>5Xj(uL3GrLg$=#0_h!R>QT@@<#AzHHGT7}a^)#;&6^C7u1~g-$?A-Qdj@ z)uPiM%isAU+)R-$ST2`^by<y)(cwyt@vTs@o~39y-ZV(5YITMc>kdBe<R>54+l4~x z3EN0ngVSq`Oa2y0Wlxq)&fEzzzXlrmTKG{`6ZGm#-^dTOr20>{M7w<b3a5X_W%7BO z$Q5Iw-)yb$$4sTV&bs|1#$mpuJa?11DjN@QM>|Y~2zJZSj}k|(Sx1fvaD~d83}tg0 zE$yP(46wHi$}16?XuM+oLpO6o#7bRymuWT4dxy^B(8#_7551ce%dy@=Uv4WO$0eL% zUaKQH9b5}}I?%Mhn$wYZ?ZTR)kg*wbbD`A79T2Rj8<3eA?{C^6#)GYf5nS<<^FNPB zaeTy2OGOjw4+{SXs^K{lo=b7V!h<m>cmnZkcu{8KLHfT;i#VBD9#lvb{{kfcR+)Jc zhM`OTaWo{uwsUwRMltX3DmvyWnOC~B)jv|i*I0KeB;^}!FO6=8rBVn8%RrmO+`Lz7 zcV(Vns_O`({PUC)H5^5iE~;Lg-t?5vf|^-#7eJ^@RRgcx_bN?$kgqJu<qz}-yN?_o zEjLufc6xWe_=+-KHL>rOP}ceE&;au;kud+mIq_-zm=Ynmip!tY%lp7bU66nX1l}bY zL{<FV4r`kjyKshchvr(~Pi4e=0YY!w$wc`b9@-#eA(;Y+p*W*&w?3vRgZp_Sjua=V zmAlPqz6jR6?2u4Hel~oZ#t(7H{3N`>h8_ciDZURyc_`ibI-Y|r*1?CFpft-FM><F& zOy(eY3gthR1E0$LGWF`<a;ipaT=#kw#%%R&nCwv3!q8M)RPd(c!N=S-GrQ`m?j`Tg z=bPm5Gvr|$UrkN>F?L8e?}kfg3E^wXV5ZtT>mqX@;$iR{#L}XgE}=RigNl&CDEg9B z(@J-!nrVu40L)q9XAW4hukDW*h~h_2F-NWKn#Q<Kcl{x}sgaChEFa!Nim>c<Q27p@ z*~efV4KMo%l<?C=leZDd70Wt(536-OF$TaLHx=@4^76zqenlQ*a*~27yufr8nobbL zkJrQx$!fWRPVNp-`y?$|Y*{OVY8|FrWp*7r<R<I3|6bUgpR;i>+_aDRkQY;1cp6^F zUz2rQN<cDNN6-#+!X5h!f#%l22$NsTeuYLhM3Kb#G}KN$&4P4!P`Ze<`ZK}aX`L<l z5Z?6IR(3w5+NJ3IFf#^bK=yI$b(&%12uA&(jUC$5NJaZjR&%GZ6i$2Pe2PL}f(me7 zp&VWAGM2+PQZm9-7G@UJ;B|cHMn@M~XZAg(Mj`zbZ91yH_YxZg^24%e8pT_!h<9w- zulK5l=>dy^w{DtO0@XGRz5(57z}^VUvyHJ@4Q6c<)^E^*&0Zpd;5pw|rNR|+gP5nl zAuO<A6Ll>X*j&ytgY*Rx+)T6Ky1A%+xBS+08-ytOciCx{xovDMGauhSHhE9C6o+~c zd<UnXi9#4h)hHjG$t{TX6K1S4`!Tf&T?>qQ*Ldod{nbb@O5r%f+cl4t&`cxI71FsO z!AjewvTouT7|Ta>dk;wD*>)J4ny19IiiaiM;lYhhL-FQWN;O@$d_+KYCjK#66)Ub) zFm^z9jLAC(RZW^Ibn~e1LN(BVlL4#6pLN~UkDZLoS&>IQ=MV`nLkR0`Rlv`G*-8yH z9kE=!-{0PCGTw$Xur$PNCBAc?7k=eguV5D?+1ykSjzXIzK6Rs^nAxC~<JYwGNGui& zC#|x{&1#0j5|^{W<4b*>(FmL5c@9T>*7&j1BxP53MyZCUCgDANi4eHMMcz-oP2Rxg zlIH9E0=tFN=+LRXsUiG(sNT0+*Idtrt!Ch%{+NE&+QOIg_OCqFYCs>N+GYR2l1=r~ z5A0R*8ODkvNFSC<Y!`WMJBGZCQKelGG{ft7g0PK{yJ*=jtX;FAVVcziXsSz~+zfqA zhi0xs{!B+WcyB%`9clFAU}}Z1ncPWmw)k$Vxe`x7Acrof69)Cu1auXctiXM?ogWSA zmEUbzCif5UnJzXo5Q>%qt_7mEVjxK9(+WHHf4DR!U};X0Uq{Wpykg{j5`UCjo=c+| z@|yWTpe~Sl@Qz`t+|5pc6=yQf@W|6VV$%eiNishf&Zge*Id?+wUDV<7J?L+KzuZM0 z6+~a6l|S($T!Jda;^Du=3J3TDJXQcIF!JEUtxSvUveT}rj~<7Es9C>-l)O(XAtx3h z_t8pz#35=}sF*%$V~`6uMy_Pjxx9a?Nj%w&RAC)<WU;Lh9Z6R1BVw=>OLqDV6R7<F z=KVDB=lrAvf8k42Sa7A{#FoK1zqJyUD%M7oBSffh2_(kSpsIV<4Q^OdVxA91-b2{E z;tGSAOA!lTvdq+C?^%PjS&X1btfv`;pxsZxPr}<%;opOM9lDcXMT6!*=1qw)sT#!9 z6TO;8^edGCj)G)_3>7AnEbpNQg%rx6>AK*oZ+(q#LZ`zY#121$aTtMTqU-a7x+aT7 zH^`^x*@c7^^RES~1W-h`$jp=QkW^Jfb4vuh#h@g<thycBn5XKr10-u@^IgeNxGkyS zE_bWBH3IWk6=Nu69t_}8)(%hAp*WPNH+1YmX>O295bQHxb-1TXyF`goR0%CEltwrC z-Wr%p8>HQz{5ndGxSE(+SPAcvjl+G$4>Zcn*(Hy+ItQLj-ro?InlxSRM+e9~h8tDR zy|eQlHfTp!-y3`8A9iR*RuY4wVzY#iGpdR^BYwJ&ZsUK&M3eFRnS*-kVoao1NXDBX zqI0}xyv8n}*7M{~Hq9w3GnVeLC-+nU)$B{OBnL&@n}sjI)IGIa(g>ysiumHxZ0!=T zJ_*r&W24;kbwCs4=Rcq?*<g~}c?e?)H0nyM`On^-M}mKOttO&yWj%d$2-i~ytZ;># z)z%BrE0h~SnOQwmK(a(xl|wl^6Hcbt@e9v0M~Fdzk0=x6XB>=+-Af(6@xp7WyB_tJ zja-6^xl<kRHdgApL(6>`e_3h&E9JY$he?s^6_P(9+}KVwiTQOj@dNxaGP6$37JZBi znm5z~p*Ks3KCB$w*8|Vwi0l?>9jUemwkmuHMGFSuQ_!(k??m}_nDaEZAN7l>R}t~P zynSB$$liypMPVg!fQ8<miV^?wUY}jz39P{{73Ne`+~XXuESLtj0xg8&xIB}0hi19t z>Ce`Zzy`S>6?53U1*!-vE_VuF?hh2oFGkTXrx+_8sik6F)^-%<#n{FSNAp$2DIH4f zosU>7X-Y$r{LQz&3e5QHuCv+(woTKnaf!a(i@%!k@=W~)E^RMHDEtQ;zIw{dVU-}f zQ|#hZTP_y<O5pO7BooW|zu?FpZndn*a+W!}CDzPGG<a>GGc!NvUa9b(esdxnzl~er z)*R;&wZh96eY^b5)T}ea0+S2&V&uzGm^Y%R5=N!-e=a(;?Y2iZ*<sgwQ>wONYvl+! zsD`rN0RkV@7NWv^Q6BFIKYxTCR^(cnaD>s?u@}dr2@8a5J<O|M3J-+CJIa!^h25kR z9+8-Bnq3!3hgxckt1s$}QotMcQJOa$nvH&YK;|u4vuLuqA)oPSkn!MSVHcWxL>5Ew zENAZ7jj_q8h!VO7ps{U8*OT=tqx7aJu&5FuVG3h=c9YW>=%oo01AeD<C?DR%;tiE4 zEJ7nA`PCf(ukld`k&~p*CA8+f==TW<DWmqnBut~)1W8gqj9NQ(=9igRx~9#ssO>S` zBu8MA0xe(_uyP6evX;9IqNv-aueJ*)H)d|tBXb%KBfb1O+O~#zkV;#F_qlR8qgFDV zYQ?TU_RexhPnN^Ge6^spWbB9h4~YNt*aLF{Xh{CO2IE|ObvCXW=(QtTuTsR^M+Ihl z4Bc)n4iax|6v*ss6GJ(ENBLd&`B1k;y^<}!Eg_~k4!NDhfXRM#@#1M(vjf4c3A{63 zO-RLZiG!c0lJ@Ff0(jZP9VSaLVQ=vt5IY(4H<*J+2Z-#KjEBjb4Rvdks8%UDzTz5Y zA*gJuTC!Z0HyhRrBjZK3?uM|~YMFyI8T(!z$evB;URGNRENLV=WL6A&h)xR313%%4 zpyCL>QMMc>>rw26>ysJ>1IIiWbfoWnl#Tx#ba)||J;rLRnFjY&@7Itu_U{iw`+Azs zq@cHC30VL8=OxQ!xm#>wv?GGlVe~epSsr93CL{1MGKrzbG2~0hPy=CPF9yQA*%Jt} z%uCWh+Np4&8@FTh<@aR4v?N~ctxOiEmC3bgWm1HA2OF$RlG<*(&b8mb_LiSf<@JbR zsTZ!gk9wEQHKlMY7J9CKD4E0a^Ki90615N(^t6s)Ko_`^%Y6hr&)pb(v#=XrA57c> zk#ze~c@7<fMsQ75h7F4=_p>1s-b^nLtkPCn+E^D{o37Wu%@xQzK+#JU{49yR72>Rx z_;Wo5G4rqHj=_4b`=Me1=Qx-mQ2JY$2e5caT0(g9`kWiqYUc(Q8K{2%t|lc+_l^ix zHO-#^YMLWznNLjW3BkwJ3Vy2H=<HzwC()5@fYhu7%3O{rW;b^b!b}*k6UD*D!J4LK z2E_*H8$CoQnr#h=a7r;vr5OY1DtMNTd!K)pM#=rKjrjlcuhAp=FXEJ)e+z%P1a=5y zJ%5c%a6dDWWQ**$CTEml9NL>Ca|lcW)FhenKGXGneoZHgvS1NeDsyWO!Yb&TiWaXm zN|Yx;Tgg<=qD#11bQl!=1!{IPHT=2;y3|PTzW}jvl-u+M7`Lmz(td1d5ab1E!mo>T z9&-kL^)QJPVYWvTtZbTHI)89p0S$X>H6$#g3-a(pueKR6($r+6W2Tcs9WePPTtd>| zzVOa>b+XpQ{s1o!o1NrX;4O}v)Kj>C)S&HdYA_pX0aW+~`YD>8f~F5141k-u&Gxkt zYX<~LhULP73_K(Sp=RMRB}p7})_d^U4;)h`jtS3!@AQ!i8N{{Edy{7=+h#Y!Xvlas z`!++}5#5V>dBMa~y6|=q)gOMu<lol2gQyIn<pW(&2(y;LEUXGZtgRp3_&z1yJMUuy zu_@H-%!}Di*H`=Uz84%^pvX>5b~-l(^8Q8*KS1<O65TWRB7A`iPszQ4Wf-+2xLhJ{ z+YDtNnwsDQo~!Yg(H+u`&zSl?tE1Z#p^X*?QUeFQPX{p4SuJjAYjmuOq~-Uw<>{Mk zHu4ymD*p|yh8X{0hsT*H%uKb`>y}U(2uE~7c=K}UYA&^wFk|J7fI*>)X{c3Q6wmpW zZW5v0PiD50;>%=jTQjtZ+PY?Tjq+lG5~3J<h>czW^?Q5>#=GE8if-h&dj&LGe1}Qh zG^}V1x>r^VSi*1T`>6rV>J*EY{mJb1%ReMan8_SjE+lvjJbUKWA=LPN-geR;#f>S} z_(m2(PyilrF#NJDQN<3#FHpLjd)?R!=aWVuAZ+04&c->Cu@Aj1YQn}A(<?-HRNud8 zJsfvc?u2qR9Uy5S;rZ}__Z7A|BRTa3n=XgGt?*yz3oTV9?Y6{M_>awq%CP^vVU>z3 z5`KZ2Pf@Mfu8X(wGy5u%fqJxq2UDK^bw%<oQ1O6%EzEg4j)V9QSRNZ0m)H~WRy9sF z^|~P%PE^y;3AG|zCwCG9$9x3xs|r7qiI;6(I#|J9Y>k2CE@rus60OAHL?TuwS=`$9 zt0O`P=$t@62iIARL_VeZ;pEjiW*Gb$^X|uhZL=8$ml4KxZ3H!*gtxT77E6vQ*;K;r z3L~-aV-qKK6;1in&0O>tf8@@)yhtB+xlJ}$+_mTEMSgY@AF8k4K+W&F9EV)iW@fCu z)|T-X#UpDPncv_8JnAPo6i>W4YF7wPl_Srw!-`hRB``zL`h>M~P$^P7KTny7P`LZL z;4CfzjfgDWufiU2FOq|_BEm}EqgT+`yF3)M5~S6uEMbC~H_O5e(%{QL=y0Eke*D14 zY&M{^wYTuuNYZ6zGYp@M$zd8#-YT{BiJSJ!R#m(HTpyv>M=16YihYD)AEDSAIM7EZ z_7RGGgkm3|*heV#5sH0;VjrQ{M=16YioeYC>mw9@8LZMrDE1MG{}Y5_Up=s|9@sar z+&8g|h3fxh6U(sfP-kVSd$Zj(&6-bZtm!1Km<dQZ=uT@f&46i2`om1kHE2_DYDZUe zlRHEFp8q%0L#Zql8W4K;$LRHZF5Bd12*19tQpF1WCP(!L-u8t#t}x7U&f+oTshM55 zDEIn`RMS*=MvObzm3^GfDx#mLA=AB)_xCn$JvQLmjeK&USBb+J$5whBxtR=+bgA?0 zqn5KDKSASlk5A;f?J5SsRl*aylqEi>ZAIduR^)Q+TUYmLwaBHB4=Ixd@UvjiO)i|B z3A@f(uHzg?HjeYWTO-xxLTLpXLxZEzO^Sf?Ag;<Zs8$kjKG|^G0eeM5j)+a-=^j?` zn{Y;QJ7kw3p9}5(Osd6t<p-2j9hok{Kwlh#gdy^#IV~EF+0w;M4`fI?%4HVyix`c# zVKlV;hn?+`4z^`QwPJkxDn(Dq6T}e~hc8FO=h3)$l>CHg2zP~WHaISY+}z>NU_>Vl z>hy$7XBzk!D&yj~J%(2oU?LH}lIBH83q+sb_ggos_MSv4mcsHE|CLlr@-M+LO#gim z4t95&q4kU@lbwA`v%a3<ES?`{@i<2t>}<0%HbrmI$JIfvV+%Q;G0_>OT&k<X(7!=n z$;pjW6p6nkvFreXkk#ZOodemc<vSUpgMuw+k999HE%raTS^wwdI$Ko|jKMT&4-&(% zcf?`AOwm(Ki54-U#~jhar8C{6omJy0g?zf)M^1@a4}+~S?AQz6DY_I8l3>kD`T(+n z@FsHB-5O#UoURlnt;fXJ54jYoP!k^(Le;G4Xjv1Nb=G&BlYBmnnH?ykY@x%elbwrA zW<QVLHHK6t*Qn!!8_HmYes{Pg)l|TpmyHdgyJClagVW^6uYaSit1CZ2G3`J#ltj}- z;k4}CB6s1()6y<8Gm;7MZ4&t_{O^z>*%k@$$Mykc$WDdDLF(Mz-{$?M;OJe$(f1=} zU;yC_*`$JYXc1}aHs2SBF(8-_SAvAeB-$cWH#~&XZt8#l=?wPG)pX{~ib2Hb-=Nus zjD~(;Uty;Y!vUjad`19@|7)#k@^#E(;g*%L=qh?eZ{P3}`1CQIQEp<(|J=@InT3Rg zY_Xu+XFs1lINTGR!8`w*+0=C!s@J{!BeL{)&(f)zd4c8X&rq$qq9EL5nnQ;jqyb^R z^p!r<M|n%D*r~kzytmbTh&^Z1c)Ew^v*@+K^mX=g_5JNgZ2E7d2J&f?%Ve&OCdNR9 z$n~p%FREb_wmbQ9NjNV>r_zvHI<d^#5!P@ZHTN=|p8!?4<Pem!8{=ZFx%~Q(*7RPW zQfng{^hoTQI^j(r;#)|(jFa0b8wc8kRPbg>{s`PCgo!wxX(Xm3#=ZnU2P<(93MZ?p z+DW<NK^I9^>;vR4tyUis>VbLCUlAfb!%BLoN>c}f4n_c8_*zN+bAbB`%$s1mGtpS< zH~kSD=ymn8C&1Xm;!rcr4b#8ft4Cc>ujg0hIh{2Zk+(!e&T03x6lVqw)a=#sH<O)l zcEl|$Wd*852j^>QE~?$_;J??mFAJTuR1rP_Zsy@V2}d_ZHoe&DuTgEg397GbdG3_F zIjQuZ)7d*<eH)uRryspy6s~r?E)|Eb;;ke5F45I%da|jl+5Azvrf>>HnB*Ueb|J&H zrOs;Dp4dvW9Rq|wk;U8UOR8@ZBho5Y6@|&8lWEvC?wFf@%C#?^@-Oe+(=J&i$S)~g z`a;_LPv#DFzt*LRr07)`p#)#|4wuCYD;dy(XM<l(k;-bDdtJOS4E$#-U2aE#A9klN zZDXo?xJk`n$naNPlS-dcl31{!q`~LCL|C(K8e%c5R|G}TMUvf4rq0VwKfu3|Vr+qv zfntbr!+O`@xMF98@Xu_#d@hZ|F&g-|3x?l$RxdMUn#q_;ee4obL@pd&T`)mPzab~3 zD8-`Li_*96dPAwVFEW<v`twcxXW+H2pYIXc4tWWV&(1@rwAWNSNMWrI`X1D&<0iRY z^16OP*E@R{e13nlmMb~ZU0Xwf#q?Xcw&`Ekcuo6BTbpFcy7u>jmWWF(I(tjM+p4Ux z{duT;giUyZY1u<gufF$~B@CwN652J2affKsC^^ljvzS^g8;id3RIC%PLL|;j;x86! z1l-VKQ{@R5pF_UuM$yQBbu!zZc`Du^r~uL)oEeEaT$4~q>dy-=Db~%gR|3&+=J7Gb zQt?_S_ET5k`S1C9IP@T|lPkv0>TZSYB0o?c8yw6wRzq04;(9@<J5GfRCuViCKeE~m z?Qt@eg#n`WGP2#O(1L$b$uC=zb&s^^j5Urtht;yuR92{}7tl3QE|+dA9h`RD*?>QM zm%%aE0kOkD_ci|!)hRlkFcD(Tb7GMH4h9+rrzU51s6)^`3FhzaFq5J&)R7ttn}+E) zs?94n%F`e_hv5M36J$XyU9=Y<%?$%&q|M`%FbDb>?3O8z+#y4>k*I@lWiY>YPFpy| z_~A*129+Cdg{Tp;+3~&1d4sIQ2VJql-(#83EriGo^p!dao!kUZeK&X9#BmTvy*C;; yu7k``r0Fi=%)B$<6P(x9g#o`>`OHr~LP(DMADUQ=5)(u2?Qw0;{NBEH-2VrQ%7_^N diff --git a/client/resources/hardnested_tables/bitflip_1_086_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_086_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..30d232f69b44a50cda0e6ef35ffd2620b54e94c1 GIT binary patch literal 2874 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 D7&Z6h literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_086_states.bin.z b/client/resources/hardnested_tables/bitflip_1_086_states.bin.z deleted file mode 100644 index e640e39c6ae0dd32a8cb061a67e80aee5bac80de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22500 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%0A#O)p^qq#C-H3)YSVVU(H#-ipGBz^p_JE*^ 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 diff --git a/client/resources/hardnested_tables/bitflip_1_088_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_088_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..cf826e4169d117b4959509f12e04ef074716b4f0 GIT binary patch literal 3510 zcmZXVdsxzk!pG4vm9!K>g;m}V6}%#xr&>2f5fB;zKLlPgMR0(1PCECNuG_pNh$aZA zysea*fZ%O#o@!ZYVqR*Af?GRh=a{E@v|5|aYHh8(d)|NFKR*9_pXdAU=aa<~?M=_* zqL|$Ihtj1@z3pdT{KoeMaSk8${Sy!fylV-x83eiz018-wMxHT4EZ}T9xI3RkqK9UJ z>D}GkWEKorOAaJr`QrKos1I(m6ou-frKdruTmJv#E1~2=L)$<ifgjS`G~td`^qAyV z?~$xmCrS0cCnf-GXgP@uZcx$j`6O|GToor#P@5r!Vk5R`Ts0R$e!e4eOl$*p%+Szs zI|^HP?%pq->^b*h!{2ZR$axR>J%2prt#17@Z>76qkI_Y6v29T;?L+TT_q6>4oClj- z;5i|xL4q>EnUFcyL3&#ac{`ZmNTm7B7+QDK-aubsNfnrJt3;NTxuRSyywP;lx<`E= zfl(wyd!)(PkqA-+M4KPHLmy?WCMgcU(9n7CMAl3jH`=fbW?)>lFd4Fq28mpXh)Ksp z$(!Ti=`JYR<I**wUnzIR8OBl>F@miu%aiDh2=iLLRW<Shf*&qr=W`^ctvPM~d4v7U z<~aKe`3>(t%m7CSf5SNY>`2?0@NaqP;#7b?bFIL4`3q>hEsZHv8-`IR1Y`kuGkzQ> z;W!K~K{#s=8n`jCsQ5v+wp)3rrsLXWe=nP{oj>v))`7?A)vSZ_mY;X*u_omhF3F^) zYv(N|o4vdMVKJ(O3MHWD+?u)^YGNv$gh<SV5E8c_ug{P6w;&L)wH*L0`oe1T#u_=W zeuUgKW}uN)>37h^%A5(W|AesFZ({Tgz_A&;X^&nXe9-<Tx%zhK;`IXe)r836qGu9B z$IX^}NvHl*Qs@%D*>9<{vd=m`K36<`lil#LcktHM<wI*V%9@!0@qxA~^XnkS;xM-M zZ5;9)5TgA&+F(hYXj=!^N<@<wm$RC=3YdpP&&QAEjd})0ol;5KVsd=y4qO+z=TUe= zuaa{akLPuASdQtBE<SNDyX>e-+o!LlcEswX%U7!^s;V!AKC8L=9lBx{qWg6?`qLvR zOk&T^h*ZDFh2fYlu#R<c(Lni+mv4vu5UDy-R6221?<!KfsCyJyVi>4j$e=2IxElCV zivFK{534UWO?gIUm-pYD2VND;N2JKxlXuU0&!k#^9bmiy-coeUPe{6Rn|T2OIkj&S z6q+#CUuzzwtCfhXDVw=3lV_Nt5)&<AM($JpjX`LfjVrP_lM#!`^pqG)oI3yaB@;k9 zjB8u-?UWsJ96E(QkmZ?iW?;fP9Y}j#TxPWr(bgX)3AL!z7S;OY2<<+%rh(1PR6g(E z@Nnsz9%fiF8*Du9Vf3wnt{Ny9byR;GAr#tel~^DvJvkPrmqnEkvdq=i+Ml|UWc9zk z$}Xx2vBF-hZzdP0+P$F%?kVsPK46mRpHc?5en;VTf7a1yPYpadbK~QnG*_?8!t3w{ z&@~gRncQ|-n!7|Fq=BL!;(DIOXmzQr;#!YqZu}0QE&;X+k<ciDi*(DO2{Wm2$`v}c zO`@9;vg;^3g4My-Y@!2m4f6#)DC^SBy{Mp8BR*%wsDwgn<OZ?fv;n!6m~|5^t>vXP z^6YTYY?eUKwUvpX%<DvH_AQ%-lbkyuI`NpTJ0zU}-gLk!Bn?O4G!}!qcG#3KObE*{ zN8Hm*xm3+$p^z^a^xW}dy)Nk4DXSUNw3K7QI1c*KH(^<#`R2lF3N?SWpDS`}Qg$(I zJP$8@3&+`@wzK72WD7#Qon)lM-=rKAvL*%$GxYlzxck_WcAUxV#tknLou(!{u}&%> zpWBEWy}d3Pe;?M7ynpPeK0$TMQQt+n^gK(U%jcM(N&-Xr!WxqM)S3!K_T@<PP+baG zOQ6*mGaKMG*qksaFG)8WviP}~ueJl}%?LfbOs93FOZt*jr9QPo&8*4T44hDp%Saa8 zPx7|Jw2vzgJ!Dy6A&ascUD;&IP7Yui3z%8rdPy3}8CQ;1*{O9ruF#%Mi;(l0i6o&A zX!bF%2fg*fk|a4~Uce?2TM(K=J;@~#v!!OPgy+`CEqeOgG|tZE;jnWqyU2wT-1-T? z<-j2=e!)>#vO*~iP7s6f`GLPApy~k&LS<^xB6`?cDW2(Kscx7k`SWN;wTGx*$hc;d zL|novV^i4ZQIAJC_PM!4V<n__m9p@O%+UmR0U$KsA`I@7c#Kg(HP5-@p)hs>pYOt` zoSUM&NpOVR=y8kYx0qNb=XW}j3AxF6YO{#fNQm3(_9CVxX0fwep)4#pHd+<YjuzmE zd4ZVgO0C+8(yH!&ZTMKm=(v;WP2$;{Wy8ZvViFI3!E+RW(Gbm3o&3j6+P=%w;B6_$ z$Ag0t(^Yq9Xvdwd!UaO1Xl2TcD<`V;$)dR@G&p>xLulrE$@%YQPG>%<o2Zi;^>M|N zX{K_%byHMdgUMzUrDL6tbzMq7o0b>6jkNEENK^(Fd2NDn%3jK+GxLtfw=(cFRy!jq z`aWuVP{GUGe}shij{AZje*yv>{t@(Nd2>Oh-i$IrfEeE>*#&8i-;QH6!toD+d>ax< zL7PWG)btC!#UNC~s81RQx*6T=(+vWljENRKaA=M->hsK3$*4`IcJJ<9$o;jc_MO*P zn@AQAvg-h!k^nAC>4_Q2$49_8NI@e656kY=`Tg3Z1s@6&ZeiO5*Zw&Ee{Fr`Z*Oe7 zJ$}q^Qh7FK<xHOT>ywwspGMdVwpu&<`eMhgj$>dbeZt%@n?N>?QAQqRt~4xXjpw%s z7+(Ysl;QSlPlu9-PKF)nscbEzzd4d$pd(eWJek&pwZqqHZH!K&8+@ZyS{0q+QMUmy z<q(rpNZWkG66E{JDi+kyIaGx}&}Wo#ag$c~0rOF!E%sYAH(Iw_Hc(Mtog8&WsP$Ll zF~s0tYX6~64h4PlXyNIDtfTi4Z`EgvCsXl1vW4pB;y&YC)!tokrnYBa5@Bjh9p^*L zJuY@ii_Im=Y`gymF8KGszwrj72RAjmrq=$};nMwLxs-L~Nx^7u0-$sl*Zui@SrxE< z6`QnmSWjsl+{OW{vem$}oQb@sq1=6gy*#hwq~0LuJesv48+mr1F$oWJKLg}V*P)H7 zw_ir=;ZHV)0s5T>FZI4S_jKdk_t(#Vux@$X{*piVOLJ(W|B9<9q8&Qcx(z3q7K^F{ zXCIV4etYZr$gY{w`*X(j1LnUkkPBQPXVGRM-IQS5U_DdtP1%#+4W=7w$Nwunw^3ev zoEGt|_d#4As-tP`3MQ9Yiojv;1z&&l0sH#fj~7;F`*(lzu;LrzlNX;I!xx0}!oR(~ zYiDJ7-ZS^((_d`+O8Wp_^V|EvcgIdGJUH^;lyGG&yz8ao%83)Uyv3iZ3w!Ha?uVv= z_X8<cbgyr21uFF1<sYj@2FgcHb+~;yCh8+&@G&zE$-KyIo~~j5G8Nxcw*?}iVHiWj zZVT)@<F+PbdPr*$Eq>Pw8%<*8oUh4m6T{3!ETYf(iE}qB&r$f&a_R!W5KWnD=nlq7 zyN`)0Zg-z_^)E_tx|s2w3@+L@tcb}@ApD;|yoL0;U(DmrQvkBXe>2bqUSeR7r&Ks) zXU@LR0s#vTMnU%1gNFkwr=eref3v9B^ISFT9da7uVR(9-RZ0KdfhznSw?JLDaH_89 zYK*b;n`Pp5s>7@E>M}?rjkra4k6bV_%f>bxT>+?+@ZyU%<v1@-;bnCB>9E6Et)8`7 z9@x;sv=XczuBiydM=5(Fg!8!8Zf~H@(GoPXq3~BBuf*8MwsvmWmmIBV&Z`xfXT(CB zVd_4Nn&#$@x@+wbe<~Kvk>DhYiHas6RUkw-jXcR5F9SQI!MW*gJ`0a}V=6yB)aeZm zo}?_A|5}mM`SsIsZtK1eKOk^Sr6rnKyhz$bsR8!@ry(B&G?6Zj)BSY1rs78Au#Js( z{3Fde-K-L9Uj^P2yv<;~yqmOggXa5@qX`RnUrBLho1$8?x<Z#(agl1)R}ouiJ0$ll zuojkBWGX2KxP~DbRiE}3OHb{I*oa9@2Ci|e1tm->DYo(F$2MhCzl2OMAroyBX@Qs_ zq$J6<Auonp1mcYJDMMvHmMyXk1sneBFF7W_S#|=6Z$==d5nkNfutwa1;lWD~!}8(9 z!MWK)QzM%gi(^6qsPe&KW%ev&j0u!=Ovwggv#IE`Ff~s!KE{Wl&1dt2=v)k1-EB{% zbg{KVmLOWNuna44>o5;v`FW+us1uSp0%a17bKugotPHpY*Qh3po4LD^ygWHsRrTpC z%-RJ{bax9JV&hR_s9H2QOJtf%&Nve=X}OQ!J#FRjT9RxR_pKfuym#+mr$UYs(*Q9q zO)Q312632aS}`rHQ{)&rju30hW)l|E?F~JP`Yy4Ma~B1_OKgunqVVczi0dX{M#{%{ z)02-8CI6FN_V-eyQ&YGoE~PMTzuJ9xt>;NNoF*7T&h+O26*%dHvkxW^mIW)mLsl%> iaMPaVR$*VdcA+%cQklDNTJ^{BOHwZwvMU@O)cwEtsW+zp literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_088_states.bin.z b/client/resources/hardnested_tables/bitflip_1_088_states.bin.z deleted file mode 100644 index 07dae4760728af2bfa17511848a37e9a2b03b75d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22467 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 V==C{Sl-zKAP9A_^U&pJj{$DqoJv;ya diff --git a/client/resources/hardnested_tables/bitflip_1_08a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_08a_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b708bd851f5a361fb3c55758049634652d5ef935 GIT binary patch literal 4415 zcmYM$dtB0o!pCt<Wtmu}$$++6DR==K`~*+ivNGkD+)A#(uZwaGux;hCr&>2NNfEY0 zA;5DwDni^WQSs@rw$yN3bn^mkwe37zTq}30w%Vz-_3ZVWKc2t8|9`&kjgayUQi%x5 z6@8Rlzia^pdt^_HpO%(Z5|?%=DXt>3gtv4<T-*la!ka5TS-G)2jvv3Vdr{|t#<;lL zxcI-8c5PDJvSk%<i}-OB6>;`OopB3C6R(;VDnkw!5}SCn6l4*J!$j-?G@z>2B-azu zrrMZ^(H^?q^{g%W7=8>OE;ATbIa<*TtQEFjvtLkG+n!GL<Q{z^A@)a71Ka2vE5Dq# zTt2YMDDkucUJW~}=G?&w>_LB`5WSd2Vwl(=H2<aiu{JP^&84$Su_Iqf0&=51J+@TW zCx!cTef2%MjAVSLTv=_Jp@#>jV`wi0L6S9zxtYYP5=Utg02)EJgM-Tijm_FYO-f=Y zchatvt61z)ed;WxSB>{jP5G1UGFI-A6B#8&!dUp4+%$obn{<p)l*2s*!+=iuLvF&d zYB<shr*4ztR=LzL27(Ik&L6BQW65;Kt^%%8$i%StFemqs(>BZq2#F|01r$j~#k=^$ zL4R3Jc{t@l<6GrtH5@;oh6yM3dnwsbwAbZHc9Z+`S*aAc2g7!E9q&z><W@*j#F5ce zdO+fhkVMToP$A(`(W5EM{u(^fViB7a3Wzu!DJ%rW$I&%dlBF}{oA$|?t(+GQ!{wr0 z;g^b+zDMtsT}B8mJ^Z8glPkB@s-JgVC1m!z39_qxS$V6DeJ9^XBvg|mznVueVv}41 z7YHrQ=Ft5u{Jo_C_LhG(ymUFwYC9G2Cv^vJQ<C@41A>xfckSPGAWyAH-(4w-pW@5& z`&EJz7DSN)4gWfRdSSj0OE*NdL0f?OCdR%E8GxD&*NF}PTzM4#-KKBOw0ueQig70P z?rTz{k2_D?L#iZ7ORxX*r1<ro_d)HXs&r|)jKVhb^;M6IgkSrm(lSDwERJ&K+?6z} zmMwXH^72U>Zm|dxA}{98r35%X(rRBf5Cu+0ggMJViA|7M@^%IS&qAPyv0Wq$O0I## z?mlG%a7TcEiV1jqIw4uEw>VIK8p5ENDepiEWol^EoYU2m#V+NoP5-UI&dMXZ<rVj` z2l<lhYxwj4l>LBV#CPjA1e*G_lIBzObD5I-Nzg3^({O!m0j8iUD_`TH-qRKo<w+AG zbjtCu?%5uc)@W?hG%9#%8?7I{3vZ$66VMJKSx8_}afI@y3M4CvXyzGEu5t<Z)kAWV zdKatJy0uV1DSDe3>fuw;D6528N7`OFwiJ?s<q@P$#}wKfIDTPL-*rEh;v+~=R^~KZ z-`;DrScDS-ki;_jb)sem%<SJaz>DM}^B%bK8eh&2$Uq7)JerURmqaq*wq@6b+Yku8 z%cST)p(hZ#MjJQYD?Y_adz61MZ9ey4E5EJ6d}hI1p9j|J&ldq+ug{p-vI;p&YSK*| z#5~6fijUVNj1<r>oo()vgvS`0_-o6~mD<U#&^-+28%qyr-xoHvEF5bj9Vbah$gsGp zxrgL*@LQHmiv8tN$H`Hv1R>YSO+=<xpGOXngKbQ=!ae1bqI>!Von!3AW>;Iv#_)7N z+>q%UL-s>}Ad68kK_-sE@Jy_|z^&t5m=@q0WY?jYRJImB9-Lq*%%m=(y<UeUa5M6K zZG5!|MX_b1LTa_N5bZT~fLZ9eEJq_*O*J9I0;JpLW_oa}l2bw8s&(V$?u&1zvEFfk zm`iqu5n(`@x*^&}fv|RCR*E2%>N7g~qC+WJ$)xrXC57o>>lw%?xP#-Nm2dg+ISd#a z14XBwFTSV|L9F)O5;IVB@eFbQh2hq3pB_2du(IynL;2B76KU&Oeh@$)!fJlbKZ#2v zPw5G$7P85DZq1--@5`V@zeEzP9iEdA@7Qc0K5uUSp1A{6(x-P1RSw^J_~zdI&-0#{ zKoBsaTL=`A9b)hRA<Zbz#T2v-^3&1>x-MG^*aDj3yMO=u7Hetak^J>#Q;=jW@y~mC zJEr(QZJeSp$qs-4C-KIS-oZ#|D%L6tHTl{Hr6d<Q)V3Vcuv{hAwShKnel#Qvte75H z^81>R+k3<s4_{AL3(=<X=!mZkLEc?JpJM_7Z)JKvcWxW^*ahPDjPg2itN~LWfl;`e zXleF6b@8U##V37-U;6BI8Y6hXwc~-&r9K$C%lY9gt%T7GV7U))T>f`@$8u~ycca%> z)FKC_!6In}+ouNxAFkzM9oUnVCHBr)NQ%N2jaA=pjH^v!<2#$bCB|wib+Q@PZPHCQ zd&|G$&L92!;cKf`xX+w0xz!kS7m8Y%-09#8a<ka%c4ZhC46B$z<+Q4`DJT<k$=zXm zx1d5vgfAs88(I2m*>)6+>li?(dJ8xAu=sn;<WW0_T**L(WWllSarpH4M?ATc*?%Vg zS3mPW$$jDe)4K7&QRKy!3_kPChhj?$@>AT^VXfM+W-ZccWZ%LVGix`u?_Ya@aX*hO zFMrIPtPVpCBYA>Fa-?9a<PiWbAdqJ%W|`I0Ik38yBgY|?Fe?-Wh$<4Ckz{v)&<s|h z@UZZG5t<F&su>(*Fe!MUZ)>W+4L}kW*{ZOLjcdD-o=slrr3rK7=!Cq)XuGbYn0NC< z5%rof*!NMMZ2%1j3t#)>J?0mX-2r1s4i?lKdptQ+j4E8^XJ5$qHz(hns4@pGtgHwv zVY@3~ykf^D4etPXoH&XWit9DVF}+IVZb{_@YZseRc*Gr5+;!(Kdu*&X>(<S%f2_Q) z#Ls?`l6;c=h{6P7GGG)m&mgOo$%Y*Wl-wedqD)c*<RF<R7Tq%3Z)0Zu6gl+h!ND~b zb$7b<78YV!g$MsV{`tVqf6Lg!{`#k#hT5Yi_FJF>M_#(86N=p)9yt}3bIYy_m*%hg zCIzO!B_y0WkaDe(<AGBjyq<vcV{x1-FC!)M+Zoqx@2T5f+P#;#<>MXq4>G1JQ+_Mh z@=fuFKYZSHc1zxG$q)W5oO#^*N75gYdp}@I7Gu+E559u=J~fraGz48LeDnLBY!$xe z2{LDc81sW%C6eM8m{++QNjlQAb-!#1&aBxzj{<f-U70m?1buRTZyjT5|CZRA$4g3w zAF~f@mJFx7_RnJ<r#qiMoV@>PA<8^MR(Qw`i^w%VmSR=buG*zWByYIs8s1T|UQVam zV%b{i_qIfxjfU>=#wpt+c&DZ;N?3$TGoENk=T~RJC9!-jlTH3B(?%1S>BS?Zt78Dk zF3e(3yPB!YRcL1xdt1DS&93dn(?J4rI#HsJcU!g1S_{8PY#?*yUD<7oWv7{*tjump zMh4x1jn~z;WJ)AVL8f|)Dn2D{$PN04!VzbnN!;WG@iQ=^rs-Os6e*JPs$&+XpLbn0 zCgM^Gmue9G6t}`rt>$u6B}Ozx4JCIX@M8;SC*|#91g55tF9`^vC<+V)^hsCyJOXsc z213LbUVs&NaEmBh1Ug+wCd0iZZ2Pqs3@Z?DGcs^E9E=_^j7dSiz-)IwQg*A(N}S=F z9lcOcPPe2|o1#ny4Wr*E#$q{9p0P*GN90boz%w;$qYKkB0*4ylU3#htbDS5Z5?0B3 zSZGZfPoIHkgV{BbnIdUn1&iDl!vpQ&o<Tilv~21`FdAVFDrZ=$fq+Iqlk2WYQ&aLF zc1tP)QEwQuz^zO!+^n>^5O${;>QM%&#VvVQo*D&1!*Hn;la3M!BLO2=tt;VGW7bd4 zrEfcKbg_;3gpC<aF?EgCY}v>+v|#Ox=#8P|nA)DB9H8O>Y>_3;kQ-z|&M@2Qt}Usj zV2tVw!N0nF%-gL(n%YM>6!w$<@ci6E&x5#K9Y?DFkLU6K&+~-~Z^A!`dsdNGMW~Qv z(&-)5Q#J@zFID)FV{ysH;>^;x#H(>k(y;~AaoFTyo)J);b*92taV$EQ274`z98aUB zpUFR>abC@tx2z8><eq+lNCgEp)atvOqKG1XH20Q0!T@uSY_)iglt4enLUsEI`0KkY z&M4`)9|^GAE#P&Flmb+Y5>k1}-m-}rSf8BlWO1cv&?3zOqIk9YF)tbn-(eI16znP> zJP0*CWQ4r^+DN`dlz>`sJV(WKeh(wLqq0vA_P6g2UUC;SzBP|ysgx7dXm@qAms?`C zfwKdw0ZuWBMd@`N>BYSFAIRPy&&e*j9A^*x`TKhP-5q;ulM&OZr=Q-tm^Z6fUbq6a zvmp??L_74prFgmSZVRQh|1<&b{cJM>+tz+B{<<Jb-iuzDnf~npwbd!>rOj>EalhE{ z;`?*|%KGc-VD6X)d#wLwOxRZMV$a_JWxqT3FP@6rYQJ$qR0xK8m>dI^YPgOK$yzlr zuKLRfuFAe|gM{5}-FzN1nt@Rlq)Su;zKZ0WzfGKy%go(xQPqsx83d=G8TnQMrgMMd znq3|=-;1Ci2D8X*ENrZMLdqcHm?FDr$g?b>@P4&iQNwdN^=V;7axglB6`HDtmKXW$ zBxu~8J=>;2V5dbzA*qVofnY(<6N7M@F60mJzFq59US??j-ubY^ikx3F)%Ri2qexJ> zclR5!CTZ;>Ps`9|-cGJ|E$6_<KzU4uf<~2Fll?`VUuvB<^hNd}Iwqev3iYaVlmcqk zo(^<t&)al?%7BL7D7xzlxvdnC+&h3DiIo~|?@{-PEQ%CLVZN+`V^k|fBq2FD2r+|{ z1?yg9iT?ch!dUMIB#ZRqFNfD%aehdDbmP|xcZ$kx0CzgJN&jmia!wihV&%s#zI%6P z<HPp;8J5g%GG2N7PGo`p=vVi>hjPAp-I#RuWGBF-;S@~s^z}0CBK^S5E$I`IP@DYx z%{9Ag3Iw)i--h1Xq}T)veu^fCpgo??BX=JB`RC8FCnt3uwSKq%vo@FYE2F7u(VO#> zRO%3O`}V@^b)uo6>;A!=+w0!^`ulD^_t&^*&5QniI$clTSPj$8;bzcDvY~3Q14ULT z3<8}|o!u?jf++xTIi$gxJ99GYYM?6dzDxVQc;z3jo?D~5bv>g|wzz<6<UCG1@^oon z#p(y@S&KtNP`}*)Ap={>u1!wu!cIHv!kK(XOE@*_*tJ#hLAdhntEZb~6dJi*a<=K_ z(W0CLf$-kc_*j3xVDg46dTH|0lTU8`FmtdN{SJ31^MAI$iiR}G&(7kNpH^*s|Cbjv zfw?RDKFTY2XNGLReJxUF0biW`?<+sfe)qR`)=RHE|9GrJ;6Ee_M`myDo4<(p`Bh;5 zKkD}FQ#~!-@%hg6@1DIgbLP(VAAdXl!=bYUYgZu80f$YHwb|5q&sReLX}|b}x_|q4 ziFG{oTlDvpC*LhQtPP*}&b?`9@G|S|fs|&zC$K>;hv~VOc&9dB@aE}3r&*&N&BUwZ zh*mOqYy|C4&RUl5I;EqzaExQ9q;2^=E{P9`;NncjpueD;es-aK4czB2j3rBxYPe$m zpigJFHvlqgtjjTt_h-{ZF1LA>Mz&5j5EZ2EK{`jBLfDG6Q`)wQG(fc5FLT+C*MO2; z3_>cRtj`b?Ob#Hbr`!>Nxv+-8GL3b{m_u^T488-*j^OZxG__o8G=!}_!-!=Ol3#Vl zzz(`)s<Pk*g!s{H0dIn+wq#g)F4kLjSvX?3>%{cw^y=w}rAF;I-w>P*a6Eq&%xQOb Kt?J#w?f+kzimiMA literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_08a_states.bin.z b/client/resources/hardnested_tables/bitflip_1_08a_states.bin.z deleted file mode 100644 index 449c46f3c38132980930af0d5cb0ec0dfc52861f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26137 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 DP(%j3 diff --git a/client/resources/hardnested_tables/bitflip_1_08e_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_08e_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..79c5eec835299b6f639828cc891fcf7dc186bb0b GIT binary patch literal 1569 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 T%##cl|M7PuQ-ui$8`#s(+fm=B literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_08e_states.bin.z b/client/resources/hardnested_tables/bitflip_1_08e_states.bin.z deleted file mode 100644 index bdea7a0f151109e9b16d62351147e5b84198b864..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9989 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 diff --git a/client/resources/hardnested_tables/bitflip_1_092_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_092_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..917b8cc2f2aa99f9d5c773b442269cb003fda5d0 GIT binary patch literal 3608 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_092_states.bin.z b/client/resources/hardnested_tables/bitflip_1_092_states.bin.z deleted file mode 100644 index 6147f3fdd26022dcea56e7f8bbdf4cbbc4996552..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27596 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 diff --git a/client/resources/hardnested_tables/bitflip_1_096_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_096_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..f5b0d1e39fb2caae038e5db32b499c989ae33a8a GIT binary patch literal 2013 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_096_states.bin.z b/client/resources/hardnested_tables/bitflip_1_096_states.bin.z deleted file mode 100644 index 575a383144e15b05c19e402bb9a6d2301d3ce447..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14356 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 diff --git a/client/resources/hardnested_tables/bitflip_1_098_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_098_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..648c9f2b9307f5c3d0d1f83b1c0ad8b7b1f05155 GIT binary patch literal 1255 zcmYk4ZA=q)0LEMTBD5#c_OAWAz!b3!rH$TcmM~-!AuFKGruK!?0PFwogMO=tQC`CA z+jYIW24n-h8I?Efc#FFx``~<uy=xC=vSe&u#+Ga=%qTHTCYq_4&aqG1^ZEJk%kO#W z4<CJ-*mKC{In=fLx1W_Y`(M6V(ocmFBZZ2>Iz?gO_{7-QW`!cDP%9KodE~a@e^DmS zA3@G<)Vg>>e8;gfJB}XN_(s45?xyPQj-EMkEDSnqpQ&u|Jp(B<{I42rZZ2Q{K^^*X z@JCZ)s`<rhWl3@D%E=PM4i7-@CE@c<4tuwN#|TGBbrEMmgEkCt*^s7O&~F!Ewb`PR zoe0jm-3=H+W+*9ZVDHoqE*sq_kNK6fH#gKcaTUEGThzg8-qOmRbwXdUOkG*RNuFQ@ z3ij!-Q-!smTXa+YV4rR>;A~D%X{?NuZm9EiPQBnZ_GI-mzRkjSuH$>7&$i{St`6L9 zneosb9qA@#e4O!;CaP7@@O`ko;(qTp9e;1wdGq4ES|!^bj@*ns-_<|bT~?-l)Dg{e zf4j7_{7&Xl`J&~|HcMfC7N_L?5lq6EDjBhFmP4mU5HG0blMv_qdJThHj%x{;9bH0) zBp;%ISQjP&Lt>^dlanY&hT~R(AOl%I&bX{hD3b%9%v2PyDLn?_2-zejW`P^PxYJF* zcqN`S0rx&2(xfmRxm>N7HVT*1RoC|Nj%cI<p(ZoJv?0O|KE>Q<+u|hS_FR+cI4()E zh9}jnDsu(6`sVlf+#O2n>|4Bmijfmk%^E!gldXD_08fI88_0G|aDTp`Xw9m}Fkco< zEU;3(y4WD)OP!7-5_DU>eBM8BqTRZ>eJ4GCOF!04*S@!ED|j{>jh!1{!ci4~zF&Jf z+rY5r;qJ%xT8^L64Xb`?7v$e-h+o<)?>*VI>8|u>_qzFy9)xaK@-K`Zrn~f(`7}J? zT6il8WSZtQa~Ia$(B3iE^YKJ?@!|?%24cLJiJaa;2XEF(D?nJ;&h*HSExF#tui-<> za&6Ny%}P}l{T(@V@GsWaCQTcAxy6=M5U-T3qss=|JO141K0qmBE9mV_!#~uc<*#Cm zODXkaNXkh~B24fzFb)7y#JHOiGNjmy<WU*NRa!jlx6>rx!BChpTUl*6ho*EqKbVt% z5Rk~T*0{~iY4wV%R;A7failpR5=>MLDS>x7Ntg^|ODGAD)FewuIhZ6kluF~!N76B; z1F<}ajV$N_Lo5#Q(YdjLYOCYvUTU*6N!ue_L5$*U4zt;$LZDiVh(w2mA+vx$qd>#B zQP-BUO2+4`N}*Gda&AIs#$y3WjACnR3W5tE{T0A@*tOoHb#@>yBywvEV!~X$FJ@;y zMSPr&k|aFs0z#gKc80+r7EH4X!4W4;a|TY2kTYAeW)PW02qH<1BMo|8K&0d_XEHlI z+A98wKTNc>4V6TO3AZ{T$)K^N4xrPTVpF8XY-d~T($sa323|=96ba*qH+Qa~fFjcl z<Mpj_#TYEbz`6R|zeda@3(Dwtsg*#yZhv_sNBNC>hH`4CoB++Z9z+q3wj_%N2?w1J T!_n8=S6ePrHq{P4eiZr#*<AUz literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_098_states.bin.z b/client/resources/hardnested_tables/bitflip_1_098_states.bin.z deleted file mode 100644 index dee21c52a5ea886158cfdc76e21f9a01341629eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15035 zcmdUWdwdjCo^P|vF1w$d9oA)MecP_?45K(39Y&EyC}zho_sXmp78QAfVh1IoA@qz9 zViJ<W+`0FvgV4S(B9d~<vWOw+k&v_@B*onof&@}VN!p}I%ArXbQt9+|it6fmob%h? zsZJ0b+`IoyIv+kE>8|QJb$-9!_tnqzCk6_h+P~ms-$%=Ds`%+IjE@&z_|eIg8-M)c z`R*?ZhV%a6w%e4lU#zOu-o1Ir1OM`!Ohg8g3~CM>9)v(y4p8gEaa9JIvwaYBvp>?F zjzz^lll--?3}m595{D~OS3}0t`>9j;TRDwSdt<ZHF#uY9THN6PO$g=Coiqp)N+3+T z1ZJ^~k-@Z)Ocz#?v@VC#9J!t4LZ}HUc0n=>Bk@2Rj2tGy^ded=#K?uXzXYy_Ay_z0 zG`Efwy2=8!RnF8wVF;cOoqlCL<P^Yd1?1OVut&?^W2v@e2nI1o9J=75VCAz<+BLEY z*0KN#fd&oG$U<x{9%&BKz?Sisb>wGwq~QDPgdsMrhFPpdBi$-I&)Cwm4L#DvUT}7T z!^FqHq=E`d0axM_oPv5-31Jp+t6_+wuFihLb*X9Nx7Yh4#c(gs`YH-zabYDS?`CF~ zECnE-NDx`b-jbNQkQh6FY=BYA?~4)F5(S;agqxw`G^`j>55<&c41bJ_r9_&2_<zfm zZlc`_G+}NW&Ia5(+Tn^Y?dF&zX|Nxrj+6UXa5*f4*{pCi;QLvIKTq8c2Uo*|bG8tH z75JB07IX8d-xnvtFbrGV>{?t+sOTE-gP2SY<H|nzZZ28m^hc^TJDv6E>d(?jRRgUW z3-R0iTqaK-?kDMR`GD?MlP||3k$zaBsP<_HZ4fUggWKUe6CPmKS3;qJC&6uF$rkBy zizZge5GK}2xdz^`*M>rcA>lC<mT!lT4QYj;zvEVHaza(CQK;Al>Pj-p4;2OY&aa2r z5wapAn)iTm0B>6#jEjTm0w|=X4AKB4)LVu4jZjesO(*20W75ZVZA#6A@P6|LoXI5F z+9OM?y^lDFG5N0s+A~{)`#xlDj<*~Ut)sCEs(+C7A6ak753`5)GTsD7MYjj{-#gm$ zgQ3cVxrqi^HQ7GQ6hp2*o3!PHdN3&uUq?2Byx!Riq=6N}F0ywgv_fgdjk+q{q6joe zT4pJ39DWs84*XX=0zY6!13bePH@i7(gp5HQOES{Z3j;9c9?}9KTTV9xaN`E3ia&0H zaT%X@Hv28+u(5f6@@hmbY=O@1v`XFDGtfchwL#&zb1d+9G|pt-y|Akgmwnnfc-<E3 z-0O4MHLwkA*?R~+{5tsvTwm<;fX@=yH%Sc6cSxB|{L8)2ItTno7CZ}8c?+TFbRuN9 zQ)oVW1^CN+zAd&Ug$CqcZ)ah&Dnh1uzw9Lkie<yUrpryTKrc-BIjc^%N@n_TsK@tS zgf+KSw!QP74%aW+-NuUcrQPSxr;n0WwIKm136?g~LbH?In~Y~nSNb$zy8iFQ;k-MG z9fOlGITPQGFCT#stnS?~G!K-17$x4hee3?oWMW<ttO}J}xRp6lAyi$Y@<5H#p>{j+ z>SQ7l9D|Y}!SQ<+@SdjDz*>6M>$ky<20@YOxZvx87vLCK#Hz_rH6x_;z-j1#Dg1Kh zW_!oijzjUKOUd9>-wP#dTJ{ZmR8CFXj;E7KGZ>}4V$o63_Dy&^L*?9>F+a&mit}<= ztwYjobtUix`{-ZUwGWerK)I205WfNYHR187*p5XSbPHX7360utUV~wh7Rp*!zFPos zTizd+8sLX4*a_X%GItxkUEc0|`(a==IsK$OK&xw`Sp3g+k4TLRU<ph+VyW%lsB-Q7 zIz0X&op$F+7T7_0@IrTX@SbH5OMcMpXl2+0O$vu2uuf(<^H@_Fx}C^_L3y>VyzCn5 zWBC`9kEwqE9th`@!v!)fxqE4MJ9(qh;mwe5YiDjy!0s!=<P_iH_$$?2hJB>nRlg19 z$5?P=Gb>A^^R$R8z@g}1LQ|unNmVKN3XPK|K`nywH1sP-GCY<1HyiLB1gqqvEXs1) z5@h1orEJvTw{h*T+>OJ^jk`Z|y5J<ff!T3&G$y4)R*kpp1JT9GJxUrft=cs|39*7O zO`GCv1MMH%B$Sd%8QtuVx{X+G>SHG%p)V6Hh^Lhrm~toUkieJ?a~L+%AJfpotbRUw z!EsAsr0erme7r*!f9frBdoLtclX-)d#HMf21%;eSyUP}_<aZ%_LLMQ<h(f$pTn)Ko z39hi4qd?0cHe?CKQQYD8=%ONb-No(`<b{V|#|H5t`vlJ6+;VE<1-<EAunUJ47Jtc2 zWCS0_NQ{px{1wsI^m9XYPJ}!!C*kF#X$MD?A2%>xiz!&m%V5UDRMN>2JAc5C&bupZ zcW-xuoPlU2Xy-q~o`N~P<E1Q)HEGDtxx1*P9D_5lY=6jB>WlSEiZg|`fk7z2Hn0)8 z+ikVTOxDt-(u-_a+zLJIB*-~<X$<aQ{0(Lbw_R4GkMD=LhC4W0BYFdbfjw`8YI^0+ zF#@H%PzlK(OJZ4MpE9*qj;l;wPQG^kDUy)j?*4QqV43mW$*+rdsZULLDGs-3M{Gsc zgl;`Y7gD9{c~|`*-Fwm1EGPdw_)czS;jv*S8i`8~`qikgrEi?neE~$&!4&LR1+a_S zf`)5*j>O4`cP^L%)6S9XUe0K6HU!EyAra55pdJ5|uxcl;&<2i$NV+6pmXHL(lDrRK zpB7izfse<wP(0MpB$Fx{Nmh#@sl0bEnS`dFJHbJD^(ZV0hb|TdI>^)D{}ya(hsHRL z|3s0B6GJFucjNx+#C~r}89Xk27rsCqqVGi_jS>HWB;3(KF4+0?cG*KLx0NmvpigQ$ z4as_WM-bW?;96|*J2jy`5<*y2xExDylvp_dhl8JCjs#k8evw|#w?kVG2OBG5`A^X9 zOu*%kfj`Iww-oOBY@fTdj&3r==Qm(6`QLtwuxh@`WzC2!k3;9p&h$0Su6jGXi>I6& z1RPBxFiuVz)A#~aw6gGkAy%%&uBASbDy5=ib(mtwHlZEF=E`;umO&$&l0P|#18@Fj zR*aL5Z|#0%qq`6Gc~{{9Gz~`l{D5mCWC46@CBvR2nD8)^g1kzDF}Qx0d<K?b`{|#9 z_YDyl{&<YwR>8u{euu6mr8iDJp{b2$VCZK~vWhJkgBVla>+s+A6od~XN<j3z38yYE z`)xN7J_{zn7vH|?>R?+l9U)uX9Qd`IA{S%%?hp=>H(_8G1WO?=MdVv?$Bv{U<!lR^ z2_KT|u3tnAB{HVwX+w?0vL^F^;`3=jU$bgYzq62)!W@lnyUtCBOL15~g75uq-0nw3 zgeLek678+)S`AGPRj~V>cFxKJfk+xM3fvZDjn3obO|!(UVELoz3O0SGPM+o^LWWbK zThf6qp9I5C?S{g{WRdx1@2h}NtqE>hQoeW<P^FOwHd8k!G?qM1#gMtl%`>58T%yzY zJ2>*G5m4Yg_NOObg$E*1T&+UT8t3f@0c)p>Xw>gmbNF2LJql%2bY?kwoXuoi!b?!` z4!l}JatZty^>5j!K<~h2?BlKu8?QKw3;~-}vql<4M0QFh=qA4!ueO~19Irm~m3URy zNZme@^s`4orr{dzr%fdUHXYZr(DV+6PRyCeRth8O9c<J?3AN|=cuBj33_%)i!ts;x zFz$xS`zpMU3cf3(?eet!!!(tKGRQ>sJuC!I$c3EA2u@?Q4Q)nvJS9iGnJARdy@tIp zpu-*5z$KakL&YlAp}GnyBwLj>8BEDxj@4Ecxwq8|*I^~|Rpk$58;l8mf;Z#Ee;lws zxg(lnh~MF9#3~#F;7<4Xt|?~1py~er==Q@9c_%73R5)-^$O0bUmYwU9egnyxu7>3H z@{3H8gYB?86Nqj4E(`t6Bo}FieF&a(n6QjBda%d$`g_RF(s0VY_0A{RtO8O)oFRf6 zp0}9EGB}+So|Ch%?#`<f(uO4>PyX!-B~rnRcTz%m72PXKL#{cPmIiX1*eZDC5{7%L zVbp|DI*0E$-x^xjVE7gP)B`xDyaGXxpYp#5E6))tg58RPmuuQU6j&3-(qVb<N%ChK z2*Bnl=r41y9i^;zlVdt-NaDsexZ6qxTOqPCA>VF-6D1c}t;#3qFbg=liK|nsp$!p9 zLb2IsoQSemRY@zDSOiEp)ByA-YB}_jLDfyYwo!EqK30Tb#@lq|Iq0>P;bxV}@GT+j zQdYw!?dc||l!=Gf(nIX8cf;a{^nflKIA-{*<lr@npeiHqKI@pE37pJ`G#`%?a6R}W zVk`a#kL3Ra-J!|r+SoF;Bm!^CFoV*)qXyIo+I}!+BQKSY^AXw(dnY%nM@^}k$$?JZ zm$ToISkjuYsLd`NNJj;-_i5(=4cd;upk?X_sPDDpxbV_l5LU#>A&{a%1)Fvx<0mYl zxGD$ncNy{{R(LEk+t$@>(3eG?yuV<{_8EElemM6gY?V`f!><#p_7~zv%o-WK@+wPM zhnL2e2$?4KHIYvLE&HUL?tMjrRZzq$-45yk0@*iVC)V3kKKpEhbFM*B5tz0O(t1rB zTZ?>QN}@<~Qi+^!zxcm!hqt7i7CDV*@7A+^>ZbCe>c~cgY?c?-h<NMra*4JS<U^Hv zgo^nHzTrDo;3AcB@g#T@&VlFZAq(;9<*-p$>(-70+uHGjFCvYd%N9q-lRZl9c(N}c z+m^yc_b?Km^_$(~M(<`RtKf;Ys)490bmGJ+gicZxEv1q%XJXXyRgg;EWIc=A4!zfr z2ecpuN)tp3N@B7ToRU8ztw@Ah;Q?&%IqWaL<>>N7z8nQ1zcLTRKj|aB#vz;ym+!P{ zsBIAV4pF0qoM?a%oi~!^U(2|!PvV??qsUEBIFQgOv|z^xu-)r8=KY->&<WlmMCnxx zvHUA;xmFgla{9)(*y2%92ZmPQ$W=dehnPGv!Ruv%;K0sel?kM>m9%-Fdo|Pyv7Edp zG4<e6;5T7=F1z_<N8V8^Iq*lHxq%v7b}Z(#Bcy&ja51yiQ)IHOj#vMkD{0_h0u>A_ zcFuEZ{p4&8_<Wza$w8MKc7$JpbED;kmW1VAeVQlrWJ#!RBt+Ub!NL_eQn6D2f58ui zQ|ZHI+Do>~)n!Ls&PkEjtP6a4g-^hE2z3IEUHCJ9qBgJIn6^WE`t_M_N3VuNRckYJ z5SHJUZC8h-n5vVXhVh@{Z$hme%AhiV*hiYre7<*}4(3BCtJYkh2+>V;(!c&c2ONS8 zD4wi@J;6+p)KI6}giRG5D}?g4a7;J^%8to4c&vd`u%MB*=3m`qhu8wR0svOzCD<E0 z;yJt@TA5<cz)SgX@>0&?)c(v>a7cS!i!?*kG$|?zQ5I2`llpIh@rYafI}_5+93t+G zZREm5&Z_!!G3^cfMZ4_6hv*V2l)5)U<!NYafLDu&We06xTuPCXMnHqw5Y}lQAPGV6 z&DEC!HRKSRZV7)6d2ul{2LVhEKBoMZm6oz49**4Z;mG^zNY^;ZR~$h&^D-&zzYt#L zrTj^o<6;x^)f}kH=QAicA(x(?%gRp)i^n64+k`#BViS?{tbz9PbT6W=aVeeWuqV<9 z4hVTCO~e<l({S2j_n!P>5MAVbWSs1B)y0#eBI>Uffw|g-ig1Vo$bd;mdwyDieUyY~ ztto$l$qt?hR=iL1l7da!p^CEpIJgYwhSeD1w=uXA?pL8qm-Ok0`GANLls8FZ5V6u1 zz(dQ~WW(BtR;-dezu$@-^2&dw6_4qN3+8qZ-iG<(X1_w7FXnLFUIB6iz3@z&;B4-K z1#ov%7pGWqcoMPaLV?$cnd$xrS6G)9Kzzimj>ExX+}!;qNiNLm$jqRweV#2lRN3w1 z<D@<(Br4eWqfxF)Wzl-sm(hB?BfMCx$*bU7tQ{6V*p~zxO`O5uS|F>kaKw4+Ty&AC zYQn|{d0P)$(53rD_yq)F!iccM>ZGdgW|b?OzSD5acpx1Yu7{E!&dy66Vo|eAY8+uJ zwt+HGcpIR3&IsY6R5~))?TEYM^2doVyaaiNpb@Kd8y4x^mlx@KOyW9Xwnk32GL<<q zd*$*K(0(0IbvYlaf{pBY;wfK$6cGNvI(pSLcS947#h*oUU@Ddwj%$8hyi2WB;Xxd3 zenj_(GVfF5lkkCR%^WAw4e4V&6i*7jfvI=umU?JcG9XHX$=^5tzIB}_kcDvE2|D(n zvmul#r(wrJwK2`5-D~k0b|WL==R&A}O|!?_%ScPN$_Uonuw;%J{>4r4;FDa+4v>}} z_E%?EpVFi%v<Z*szY6v?NP@%ocr@B;<eMUlSw<G)7{7Z)mLc+QT&^#F4@6W+q_!KO zo03=EIW|L8<Rl=#!ifQIS`mZ-98-*7H}+74bQfD<bgUMY)#NzR*c(uX7n(-mODuCV zEmF6Tr2h%zFneSnGY@&Pdtn1g((+g_lOD%XY=j~CaDq3mT^tE`KzKPQ^O^Yw6zw2I zSlmV)7nE>S`2$)~D(%>^cRas79UUOwI)tJ$dG2LuiQX=6hy)9FL(UcHekUx6__@}f zOxWtC2r<gAYmt>lRfALx`&Dx4ZkA!BFKsbcMHMy&9-NH>FZmx<7!_<TyA%nL)ZQza z2L+IFtJhmxEap^HrSMceO2C2jD6xpxemq{U+A{u#b_SNfL;)O?SGxlnzy6&NQJ#Y8 z+Jx*_c`XohNXJd&FF&N}iDrcolu_qgj=<)WyLVx8ove7ieP6F<bNbV$XP`F8rPA)8 zkg6s=-_KcT04V|WA4N*AnIR<*HEXIZxicq5lh23<Vk`02S1Zl50XV(zp_ceqv`Q0> zylJUaMQ7nNHz#UI9`eTbK8d{fGv5iU49%;c5fnvcbSJjLCb=LAF#-0jca*Ve`ins& zm9&KSqWI5aT@!*OmmN{@^kHH5;I^I*og10dG+AW6lm9YC<?Y;YYKM>WTvJdOJ@1g# zTr()wnxt(on(_}o{KO=cT^o^ep#%BJ(y!ttqj8nb<*93E+(H%1s<x!ee7KJ#f5VoR zGsC4b5ofJi2rEl<n$UCwB3E<)P$Wmn-T<en5ZNJg7?-~quf~7<IbL1zm3S3S8+xG% zPdF>v1|xbT)~^aO)6C9LNM3kD(wvwxVon<BqRZ??4<!U&=HsPLm#hhMK$;D2aE}Z( z)up~V`<U=9`&85VwCTuvUyI34)4h+-1-C=Z0IQQ=R9QU&X0Ljp16D`)OoWq$)T>3> zPC?^-K(S7CtHa1lmJ`oa@v2gTvJM#Zuv&d;??Lu6gll!Us{A3$VXbftZihwpY}E1_ z*UJv#clhLzis4T2tvP7HGb;H@Fz1gmu@+q~6OMm833z<#4z!Wes3|H$X7)(8L)b!_ zm7bNiMVm76|5c&e^lKWcOE|C!;kO5S)*Q1<H;TkCc;p?FAZZy(RCC9HJA23;yfRoK z!_5=0?#QYIVDJ+8qbrq2(u&j`gY&pOSk-H~S`j6i<k4UW`W=%PZp)zqDyW9acfD_m zA+_|91?20;PfQdD>S^3J2)qPCBJWn%2>$sZBQ%4$Rg+(3<#qI1?^6o8MT_EGE9{6% zs0by0<%y_~b5UW8p|=X}o`Gb*lfC(H-Ra1QQkGK8P;0t5M8bmRG)hoOt1QDvTBM$; zQJ2Ul01}NZi&LlUQ7z(J3yTGK-QjK8d<j;@Mck~O9E7w>sG#{=C>gZ4fOx@P`ZUWa zAh(}_UK}&~@K$p0I)R`HAZGg~XaXlQBrAtbO8X-HAwSXw#<B)@!?4AaQUF^S%fDz! z2O<z+`x}{xUCV@992}t*lfK|)86<{g7LKn8)*uGuc)rgVQ8z{d;O_o7F{>WT>!2d8 zDq#q(h(itBcg+3&d#2|VGKUprk*9|~(Nc-{Pc^bvN>~o6)2GQvY@ELD)o=~eM);qH z-Wb0$Tq0zeTv6~8D9w-_<fdYXSNe$1h4Ys0Ed)KtX0u8>($b?M_`lDhN=4cZB43#1 zS$bjl43{BbG~S<#vwl<rg3pnQdWTR<>LR(2qJLjjRasB{hFhQihoLzw*g>9bQpeaV zZ1HmDhp&z*@G)PG(zdDvnoF*I45plX4OR|azSBe&Jj6T`Ie>(;mDMSHyhm?m4WP}2 z3@d6#b(qlEte6NovEx{!Z&<QJo>k;aZc@v3;fh;s)DFhw$57S?u{fuqV^Cd$BbThz zs~wc0CwP4?)I(7gt6b7Q3=edd(Tdj``G#T`P=pf{-H`d|%&-2(7(CKkIR<}@@^%@Q z`WCU^K5is;$Aa8No@jNPVjfv<$lcATV7!RMjyxw=<vuUFQ+@c#3LR2o@Ew*cJ*Ug} z53m)A|09IVmM5a(xRjZN`rFUiHa90eSGi_J(<@=h@JYOobsj0|<2K|L4%0hj&rreP zh38#V87=SW)8yBlRHWySNrjz6Kl6iyrlHra^s4Pdf#(OR6!_Z`7VP4(EYC}jF*GXQ zLQI)-RZDEpVLzgqtY^9A+Z&Uxkt=~FtzLLmhO%@rPlafrg|kA?j6u)Nza$4<)5;Q- z(Ch!@&T;XAt-DtMzyjQlFwM`~<m-(riOxzsUdp#8FJ-HM?Nb-xgg*hl>LVl+A{&6M zcSKT1n;vl^D^nu2{Ala~OQFHE=M&DVFiX&9;!AzL;t^?yk!Qe}RH<t&0R<JdW;&z^ zBXFD?gS#SfJp|jaP7C3cY7N0R4+nIXvkSIx4&HbDyScNQH9F8fQU|O&4@b`RaO5@h zY;LFS_f)8a_E|^hzYt!u56EGS<6;$*3J<8i9TSVd-$oJ_Guqv7$A_YF4||o}F@Q)K zEwZ;w$#Vqy{RwApUs#>c{F)>^^QCCODZ=H<PBfZH&g7`rKn_-+a2sk(479U0x>3b+ z&cZ&z_NJjN9UO#t8QeX1s-oYe{cUjGbeLl}MH1)^GTFGYI>=KQ>v$?7eu{Jn2a_I? z5K7poh3widf`|C8<<{*}vaOiFj^A&^WAKmvomTw5g18`l1A@Hl<CmM!y=mrf{d^I| zVvM~p6hXP|p}Udw3i;!6FgR(@nQp1qiY-;Y8rMRBaaXF-#2Wad8UORdY%pByhFJbZ zU8{A(3+W#v1)S8cz`>-|xwaUw`UF~!e;KWZ$6(Rw26&2AXB?I@_i-6;G)=k0s)n%l z<9YcvGS&TXx&WT<lJ_X&x=PwX<!$f|+&7eClBruZb7gbtPhjhDxle-iu9ABR4Dm|s z8-X(JhGH9_LLRmO)1Rn=HWa1$#frQn*;s=vy2|pH{{mX80YofYN$=%Fddw#6xP!BT z)}5$;I7#VI7<qy^Pr4?S3652E9@=5zDR-_xp*jJ(P%=90Mwlhm7RxTTqY;WATg-N; zN|?_n1ETu{GMkYL-$R2qE**#5)8qj~u94w?v*|}p#)-C}U9PNT7R)=&roKMuV|(cf zOmE1xe+`|9YGYprMa@Dtk0D_2tZxn#7O`bs%mry_4zpoZO061fjF3BeYJ_(y6GcKh z9eTuB{Bx&Jh*Sw?geL;-bEQL7Y}E0_qf^exS2<2RLOhHUc{WBF6aPGnu>kETBO9Fu zNZNCzmW-?C9Tcc%PlmBdhDD4|aZFJM&u38uIhM)m@mEx$Yx}njQ=W3G8{qW2Qr?i- z7$t@-(Z0nL2JMwrM%9pes~M?<OVWqJ7I_V`3kpiY<ITK*1t#J}t5Ba8k{NZS7Yn$X zz1r)a%wOQjLi`vp{ZngB2u=NgQrLm97Sa9N2hwrk?ef;uLd`}dfBi~yKL_#($XmET za#$nL0_chJu2uX^g4)$i%og1p$;2GMOpgO4hTy2~{8O$<<$sT>T*2lhDP7eed4f3~ zRVe=Auh?(+if^JARX8xjZ3#3v4T3Yb2_<0pJ(O5T&jhb08UnzkFD2Q^Q>Br+-a5>3 zJE^$68FOs@AtsE$jTP<>{>~(`q6<y<W6YK;xIDFXKGorQ7ukyE>gSqfTm4xS^^D`F zO=hl#Jb`^6vMD}%WgAigll(QO1h`{2kox%a^8{lh6LFf;B5Y2u%7d#HM$@hAdfxke zzh$o!JN4iz873w{X8}j<dTv7^^4{?|^5*A#tG&2wWYiE*6v@9YoWr7YQ!xa=l@26? zRx#aCCUnSg_+SJ6^WxkI!II~_Q1P7N`w42Rr8q8gA{OcWybfPEWWv01P*jI4_NP=> z;Fz^ZNTkmQ3<;}I?%Da$tVt^SLII>*Kk}0we-%G@Pa?H=qoyODz%BoFTpT86lkN;l zeip&G712%UBbf5K<pu^$nc<KkfH>_+E`S&Fd#shsak#7h0vw00#;ejSb_uWM@i~LG z+3(|3SQ=5JO4yqS80DfO28#%|b~dhQ|NOA3X6FoP`}7YY^v8Ej-|2ec)B!pMh~M+$ zlPX4Pnr}<@FvKe12d<ht?vQPVXrl_ZE=FByLc9Mk&6c31C;+v!Ivy``&O7S!aL<Ow zS-7qW@>H@v<b;}&mnF-t)l@wI>VDymYKP^IjkpyS(MdxE#dFcJWkA`l&{^>sd`ZfU z6k&<{`ISmUj*G$Tpcc1>?JVyi$ztfE2ZSy|uqH8_Z{$Q3kk2D{!z)mXy6fgy69s~P z(6tzxk$=P{jN)bRY_|hO423YB@Wik#COl10;$~<!7Rp(_L{_&Fd3shveI)?zJEX0L z)jb8W?8)A3D1{Y{L9=Rg2&z2RA8ls?Y=2UzVy58?MIu;IO=*HQH{}9gy(#WClktD9 z7n6mUwRG2x@iwjIvA}NZKbKNyFlq=~C@G6`0THvj-4?1A`@Rn=am=8r>4Db?1XW6d z8uB<Vbf)qxpOr&-Si@8Mjp_VIS4G4YR@AEztZABKJ3_ZgPOJvmZtSv&pc56gj^YT7 zJLC&)Rxf-pXi0KejWFeO9f=gnR4;uX96HF<A~(642r5&b+zl0M#<e<e+@56&T4*C8 z+ZP}eC-fv9Xp8G#%4JM#yHG2@Kt?KdCnGk9FJ3Jm-&gGXE=$J7xCHLPH$Ub0Gdzx^ z@mIbCYx$+&5^<)9ih`#=Az+?|+|`hIrN0CB;=JX13qcRE**Y&bgS7N&Ldi#&fROCd z1mp{T&qY?*Q=SabC>6<)Q-mU<a0}~J{BV%guQuHdv-O;1;H^8YhZmx`{0E>p{l`OW zUr$x56XGrY?DQoE1X#?MLpAKw{;$kC3M2MZzC+pyAUbA;7KV`M2kJ7dETp(GC)9Gx zuR>0Ap$bwR_VQu%iD3lSH!g&G(7?#LN%Pp3+@$Q5druQ;;N|b4tYJ%>infB-z(?-3 zQzB3IVz=d45^l|hD!-_IM7DC!J!B-8kHJ$1X{i9;G0_c4ej1y8OAD;*OSeD{nmEHd zQR<sw3IEEC<okmHXNOoD{NYi|#vZsoT4e~6306Bbla1qFx?t=SbhJWkMpj=^;JS@Y z5k|Z{JBK$%9GA?F^Gu&H-q);tu5zu92I#ccXXAzJ@<`F+=xFg^WF6uxo=rgt?w!{t z)*i;-_zDb;--1j^9SavZ#EqkAm~B_iT#S*-+~nlKvnMTK9#2nsR!2*0Iwpw`Rq7bM zYw3c<wBUHu5yL8{+aSV~z(G^Ap92=}ll_$t2**8E7>Z=={LkgUQ9B%mN6FXLogjNO zMGyQw0H*Hs9stJ6UDIXD=&T4+xc@hCDLH5j;X=JRsf=T8zO9|LP^U3L=x!sjA|(cn zl549V5ZvoUimM;wtV+s-$5r5KcyJ%NzsKJLB^_!?&7*>bsfcuS2#fSqY{4C?pqUA_ zEn5=JM-noF@NhtmX6@DBMTm`Ob6c`!bfA4iO5=VHM-F*7@}Cdd@jDdasZin2ul(}D zuNGcHGa%K#ad9OGNe`%R-Huuz=3SaTiG?C=<KL0oXlAM1_%!61XpwClB%UMi1UZ<L z)~Qt!nqQ=<>&wxAInaZ0W)3%++YU~S3fgTONktxOE_G}(9jOE}?mPyT)DLDqI!fAS zxO?zaq5qRj+$5c3BpIq?N>XiSyM+oKiH6s`RK^^bi*Xknd$SHFtvODn(B+@4xJ1ej zyI|&hq7~C+zu$^mVa|W26~`9hhXJIL&s*_0x;LM4xc-}v0j&{fI~PH@+op?+x$w;w zp<>dYQ+3sA#Y039Pq(LYp;IRf4WtZ>HT=)sQ*J~LmAoKyE1}>R*%Q6G4JJN>63+=X z(MxFk%`c;M^$<)gYhj&+csA+C=U$}@N7FQ9a9LJ$S*BTa`3FHt>CAcX+Cq5ZqTx5; z9*m67*nug?zwnLk#$7di5zV;;))Cg263k4tKV&QQu{wyipc{&9z=RvH4GfTjA!c$> z%F9Ugl(AU@RgT{x|KbQ3<v{_BEx)`-uhqc9BuQ4#I)VyFLMA_@b$g9u9U|i0298yy z7Nf`$PdTy$h3YT_P%>Jgi%y(ifb#cq_B83`?0?I2*UrD_cDniQZgLBlKY`nFp`5W9 z=<UsxpuW{&X~T+xcE#i=1~Uz5y_a8Ckk9!o)sj3@a3T`z#axh<%9!XaIZB)|%xS%c znaX$4O(B{|SFcRu{J(@mS2^^I$P)oqrO1eFH733BnA9xo7m1`Kf`@TL|8~=H$al}M zS~GOD13igZw9j*<@;)R;3Pvr(MS#Wg2g*)zDvK#X7>Uekk=Mrj50g>D7&V?n=G&R# zIkCE`n|2Uo1Ln*~x-iFp3N0`cBOxA4MseEC*9>iN7?$?}GC+}aM%%H0$s7qFRYaf0 zfWt8o@Df_RnWZbp_t7GplwPFkVSs%7ncKnpfWR`0wcrN?zJtoe9=^+y<@A|e3%++n zy6^fo(qHlg8bm@`N|#BzYlR<n3m{U+QZ%wE7ED5Qv6KX*2kjg^`F)+3@C}LZNymw3 zy5vUk#pt?hKg$pJDQ5e~hp!>Dp$ey>1CSH3We1K8=kRnd_OHngSw-5td=?g7_FFru z7IbVGx6M0DGPj?#O5{}s-iOlB)U=n*K>d2>3|x)b68&-nR@>p{z6=sO{@@gIOWz1V zoy7J}CRk}^2C?ujabhAR7=R_565x(KM4M`aw*X@$+0o?t386a13cJg#_0gmq;Jx3+ zQ>%$En|g95UdSnL+a1`QMcxm8j=a6|+RethD2jX+MUkuUQ%C_b+C&AWlM~G_TGi)| z(;Lw3n9)jW;D^H#f+bHDqT)Htw+OXW)sl62RUDQ(m+J7xBZHuwrvgbjIh7v}&_`8_ zc7~%RkeOc&5iM)yH@K5}(Iy(z3G$QKLtnv9I;z+<oXdi*m(+;xd=1%&s*0X}4sIF| z_QXX+CI0}^)(q?N#yP6mz7Sk;;}u;19`kzz?e<Z06A?PxiU!kH;?;)B@G74(Xq#OD zujUsBBu%AexkszaCAkfh>Y7|7ySA<Ud#Z{|%o*dSe;A=Z+&Pae4YTierdt8=yMP~R z5<UO$DDJiUF;#BTX(>#VCwZz|se<4gbdvY2`F7OFLrsynrWOj_#N%bPNivf~-!Iq- zMHz}{>Am(bxxf9gWZAm?1V8A6%E_O;@WxjKxeaIfB&<7mR2M^7A~{zq5lnSI=>~Co zTu2tqg|=|^lUot=JDiC^d1sbG;qwUI&LR|}I=1XTGf^O@r}4P^-&`_^ss9aU`j7u@ H=|BD__b^KV diff --git a/client/resources/hardnested_tables/bitflip_1_09a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_09a_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..261c672decd1c0af1edca2bec1d7856ed299c23e GIT binary patch literal 2287 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 J@^Z%Xe*q-8`6>Va literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_09a_states.bin.z b/client/resources/hardnested_tables/bitflip_1_09a_states.bin.z deleted file mode 100644 index c4d76b453de4d148fe96326bab772f248ad21862..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17264 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 diff --git a/client/resources/hardnested_tables/bitflip_1_09e_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_09e_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..bddf5c91fbf6453d992e5e485f396dea0d410a7e GIT binary patch literal 1236 zcmV;_1S|VOT4*^jL0KkKSv(S5R{#aufB*ZFx$^<N6`g<;0l@<h0T_Uh0TDqE5FcR> z6+i%0%oyMZ{{R30000000042LCPop61`|PmO$LFJCXAU3ATh>_nHWYO7)=HNG#Um> znlfZCfX5m#WMLS9VKf*7&}bPlXvvVm0~~0{k%VFagwS9UL7-&Gqb5TL3~{3-MiGbx z6G4DY27!|%jF}7|Fj7)P2&UBZq2VW~>NchmMu1{y&<CVxu`s8p_NhvrHY%t-@_H%e z58+q3or|KdpCF%%bVH)Mmx6Gw1j+t|!;6Cx`^SKtmC$_a3ov6VEE#0RBg8V#zBrk2 zTv+ZW#8xa>T@P7M_{Y3b;#9q0?xrSA>fomnD!4c}5rzYa@(hk9Js0U;QvJ#6KT`b% zl79IfY3)pzFuE~46Dszfk@hkDM`ZCVn8{^fc#nM_l~{T!9T`5S3*2$<spNbMEI6z< ztGX|p?0G-Q)2FPLa#)ApAD#Kngnnn<U)<@Q)6rwiaKiVW#Q)R$A4~qv`921D4>JoV z@G9axMpktGXT;<2KDT#)JWIICiNk|9vx7b&m*FXXAx~(ZjKyMODUbCy%Ynk|C&Wf6 zVpZT2%B*87tcFGx-z(fOze)Oz9~hI=97o7yFBHcL!HI!z%PeHYd5m!}7_69?F*0Ig zuw<q(GWI7FVUXcv9*ADGcN2)Z9ggQ07AyHvfq#m)bQwj!$&-Vnaa>N55&92s{3Y3C zmRQ3ocUen|7Z{9W^&Bo9209KNCQHb~>|$lyKV!kzos+=H!?P~TU6vThahFG9xsHsB zgyQUXP92V!nM}tSF^OWx?65el#uUMx1;xZp45x$9+;q<qIL06Rot`H`#$AZ>J2(?C zyhc}<hswH7m}k!HqmQhA;ozTv#~-nmfb8|2fz#ONdfvsw-FGn0Y2Cqowb<@EyDp4n z(!K%mjw|<`MZ&^+%CAx4Ttl+U+GSp|E{{_l`^hI2`9>U9a(dO$;$@V~vx|<B@n16W zJDrm!f^e=Y5&KsTCuNS8+&H_LSUnl!b~v$@qVQZVCy3&Btn&YkDD1lr75d*A?($zU z^Iz=yr?{Vx$7SF=SJ2N}Gu;=sE-R(<92cnQeGbdzdMC=hqr1#~#q2m&n7TbqlZ%6; z!#Y*)laJ&WTroZa*gd8X1>|MZ^Eg*A^tr|Jvx)XEHF05M?0(hrA5iwE()Z3hU)X<I zz0&m}#y%0lq0tT*FLhz~*&+8y(&D>}!z{Wk8u!|8?CCzm`<G)6rQo_{=y1FTk>u`n zSnRT8#l?%EoMh<4?8h8%ba9R|rvthP^=e9wttv`2K@05CRaJedt1U{UEA3KKGD}g1 z4oIadNr_2T2NETgN=23wv3<G3s>>iO#Z{J6rI^SWSY=A9C00dcgqT?|iem(p6BaCt zrc)SJ1~nN}#bGT;V;GYvWh)|?SPaEeBO!vZRfdU^BL<aLXsl{eBO?<5mRVtAD%F*! z%Bu@1vm!Fc%vM-qA~MRdvMgejScR5VF^saQV=;uwDl;U8SraUv%(BWcl+0B#3}quQ yvjky+vngW+SPU{*VVOwAQJGUQSY<02RLmJ+Gb1n-7zKy_i@744C`cX&E~|hz3PEH5 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_09e_states.bin.z b/client/resources/hardnested_tables/bitflip_1_09e_states.bin.z deleted file mode 100644 index dd57c590eaad1ca7d50b45674b23f2cebeefe374..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8388 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 Gq5lO}htfCz diff --git a/client/resources/hardnested_tables/bitflip_1_0a0_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0a0_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..fe09d19cb3fef2a5e9d30bf4b82242deb4a9636e GIT binary patch literal 1303 zcmX}qTWnGX0LF1_TIAMP=%J--Nn0og2dXUtW1X4;1>tbIl+$ytCAt;{3!quDd3V!M zfvjAdg%+g5OG^O{mrf<8$zsf68D_M}l2XgIEHm-JEZc)yqFpjI%cfhh<a_)-d=EdB z+0oal92E|aelYn~d);o|!}qEkO(Y7biPTSG_mfCo5{cv%J=)rS4(iGZkgO5~jJ$-+ zYPA9n_|45tnOROe?vq!_<#IDJlX%0JaU;k??rfv_uOZF0he+L6Zm4y|L?=hq3c$>w zSQDX!+Yq`Q8&BFrYv!~GxnP@c^E(ZI-Z*z_7)%%&g%OWFAX?7RJ63&mNk>J|Z<ohn z=0ROT=jhf9ibtS=hX&6(LWUtidm%IH%+bM0III@s#j;wrzQ;BzjTxk}QEQJafe?6X zzzHr=;Q@or=#p_Im@O>JQ-+7y$Ww8TGJtU=7;bLb)Ziwfy(rsBF=3tNNeNqN;;D+c zs1(818~ASh9~0ZJP!+&0q72*A6`Lcb(EBY=43p{6o6x+jTGtnl8m*~P5HLed?%=LQ zEVb^OI7;Jix?VEgVXc2A&J}CMH%H{NWCNL18U6|1ILK_{eHrqd%$*lpu6}4=*(bP+ zKLwr%nLhE;Xm9<mXsxLdnp|xO%Z<sfoXxuX>XMEbNo#r0oyXbgfvIUCYQlO_>wvSF z)}qYPPKr_cu#aBOqYDwCr=zBvw2n$M5^>a8bu5{JEtG=Uc=qa_H-tNCJ)X`}$t$=i zclEM5T{$7WW7uXR<i9KW_;=%PdrJ73=`Pt#i;%g;qnvVr1P6H1W!XwwbNUasH(QnW zzL?m!w&g^Z6WpB4?f(?3zm6encc-gk5tw|5>&A+#&KVHBM6I6&10ALQ?bfK)M=DdS z5FzCikyQ~f0*|VS38*JCZ-K=*bC4VumnWPGVWW_YXXk3&NQr?HLRL}z!Y~!BSl~cN zFH`GwV2~BY3tc5x|M!1n)8xlvTaF$>Ew9No{ma$;8Y_AK3);LcO(W4Hz&+Ccqh=8j zw?QD{Udt>T19|Nf<T_N7Ew-epR4p15O@lH4taIUUeOjTWQvD2E3&woBi{dFFgJVG! z7VHn@(F}MCDc!~bi@IIOYVv{H#TT12ei*Nk=Ss1N#T*LKmJN!yI2=`jT1a6SG5e!d z>;0hY_WN4QKW}Cw*nS4EM1_Z98DTV6M!yyy6?rckw`2ipstuD2aJm~J8I{0+n;O_z zR*@+YFh{bYjetTVdPF-D-RI4ExtiV<#7kteLe0!Tex0(wVy+lE<-VyUec*l&bGeSF z7Ra>oj6-SfN0x%eWjsX4mdG(IC#S#a%94TI+T`ihCyM8NM*=Sg&%L|+ai*CvW*f=w z(ImB~T?@Iiep_<1-uN6u6p&hkT4|RY0|j2>Ftt(OO+>h1Zw5;>FN@n+sXI}*aaEfK z*Fsu}L@1q=uS_!%4nCay#P(eu2aE27u6W1q9{%PO^T+RxSAUKl`SynB8NBzi)PXy8 z#^<HDzGg1u5mUbIbjos&junPB_tWQ>4{t>`ThWWqSD>c-@zB+phFd?(3P<ppKg{hU z<~#zG=xG{(eE<hlofhyhkb!!b96Q@Tq9cm4<FP@VMV@J<Cf9G(;Ko6hvu9&DIgKT& q785n>xCk9<Wu?o71t2tIZBsoG2W*(HCnGNXrn^C7ZL3>@JN^L)h582o literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0a0_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0a0_states.bin.z deleted file mode 100644 index 32880a5cd5d1204fdc347982692afdc30a34eb3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15177 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 BGFSir diff --git a/client/resources/hardnested_tables/bitflip_1_0a2_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0a2_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..8aa9c25424b23905035281b997996390c11fdba6 GIT binary patch literal 7248 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0a2_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0a2_states.bin.z deleted file mode 100644 index 25d53d5f62e264caae4631add5ec72e8f3739c16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32901 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 diff --git a/client/resources/hardnested_tables/bitflip_1_0a6_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0a6_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..aa6ec2408583ef23ee00150ebf0b2f9143fe6f47 GIT binary patch literal 2013 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 O)ujoyIa)g=R{jTN+*{26 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0a6_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0a6_states.bin.z deleted file mode 100644 index ca1f5f93e12837994483cf6bdc6b365f23f73ee0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17054 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 diff --git a/client/resources/hardnested_tables/bitflip_1_0a8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0a8_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..6d8970c2e61e9921d84a83088563daa592586a06 GIT binary patch literal 6270 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 WzVT>QbnV;3rjqxoy5IbGhW9^y`RADc literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0a8_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0a8_states.bin.z deleted file mode 100644 index c7d501ca457ecf90074fd48bf46cb2a2f7acdec7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27841 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 PA6>e#=40Se!D{C}z=bP$ diff --git a/client/resources/hardnested_tables/bitflip_1_0aa_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0aa_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..e238085533decf38dc99ee561e6470a9776fe466 GIT binary patch literal 8940 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 K4*Z>V`F{ZjJA%6a literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0aa_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0aa_states.bin.z deleted file mode 100644 index 5c194d179bd4c0fd1ff9b4c289beb63399c5ce6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37384 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 diff --git a/client/resources/hardnested_tables/bitflip_1_0ae_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0ae_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..bfc6848dd694f730360c4e4797d7630d80c53fef GIT binary patch literal 2675 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 aXr-$3>E0qq&$e>%uqo%%zKn#4)_(&rc*g($ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0ae_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0ae_states.bin.z deleted file mode 100644 index 2ce45b017e20982b8e76584594399870197be758..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19385 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�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 diff --git a/client/resources/hardnested_tables/bitflip_1_0b2_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0b2_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..05a4d0fd58f8fb0fe07ca8f744e84f0a3fbe4d00 GIT binary patch literal 2723 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 H;_?3gc{00L literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0b2_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0b2_states.bin.z deleted file mode 100644 index d81106d055ce2bfd05729e12dced63412331132a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20919 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 T>)@^UB}P|#QKCKnVE+FEG=`41 diff --git a/client/resources/hardnested_tables/bitflip_1_0b6_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0b6_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..34fd067ec122fd5cfed8dd889b55754c1a5cd948 GIT binary patch literal 1541 zcmV+g2KxCzT4*^jL0KkKS;ZEfwg3PGfBn^2gO~xHiyFe4fPes)09XJS;D7)LD1ZnU z1Uv4D;0u2M0DS-e000000000Sz?hm0CQO+!FqkHqWMW_lU^#&?G#E^oGGt*eO*F{F zz!1Q50%B+|nKER^!eE+dk%@pIfaV0m&|xxU$&rM?G}9v!07C$jsh}D(85uOt10Wgz z8Z-a^q@;y3)XHptjWT4Oqtj8EPf?~#3{OIBN2&M^;gljy_*AdzrBec*f{>V%?io~J zFhkV1%)^EjUsC-FTu}I)N`7SgXGT5qIDSTFA0s$3-(Yd@9fwKK`3IrW^fQJdxsQzS zcRZbs3&?OjM@|mxXZ?)hKIO+5aP^(brTfmu1I=Q}$(CNFmlGKIN1#*Y3)XS#RpC8P z-1*<J`(6i<n6mf}C3{cre^vaKv3{l5Jqod4!w+fcPf6xDoKHi|mOatyW8FCZhlgR0 zW8FRjA7Jx*E200-wf3IFhnk;g^L&O`=0B49haU^ce>LqNrPASHpBVX`w;X2+7~tW2 z$E@rh2*b13aeM<S<2}>kUcuzQ>3;?8FXFr&58nPs_nzr`-{8wI`WG4PGo(-TJ>!SY zUgCdc^*H*UobY4j3>duK8G)X+sN<r`F_n4h&TtX2BOc0uSSNsz#2gVoY()h6C!k~p z<$Z4_=rKLO_m8A}CuG0TKPdDsd5=k+$E4p|eQ!zGdy5=6JxSB#eQt+FF2)`Y)+g3p z!x<eGLD4v}ONBA^E}4BMSCccO;!fv>&L&PS6^u{l`%KRc2i#!14(jk-*O_)*Ct{3o zGL~dx3D~;^S#&y3@?kK^@h9mLs%20Y?kQxcWh{(~0R5s&t{8Y!c``k0UT40U94p{g zne0bJcN5e<h@An^UJJp(^d>9NzB3ra#ly^c1mdrKJF9`kg_ttQjJ$>;C(1aPaa>sL z7qm>ShorpKSiFPM@M9)%*&*0hg)mrR$%4a!!nzdcGL+)Jk&(pnUqbiS=TA}k*U)+s z-dDUwntmmIBZ_du#K?CsJxPh}KZ^Qa$n2hi!u`T|tLb~J_>T$kD~Q7@ioIyRJMVs{ z`#9<9CEX@hw86y0KI7<qQTm_Qe9QT}Gu}MbKIhVYH}ii--haXQ8SPh@k(1$7!uJeJ z>E`)deNWi#@J~T^8F4spXBKd0=o95BVi)%jFrSeYDPmR8QpH$bne)DLILAk%;Xbx@ zF*7b1c3C@<1G6(bGqUM%bYkeshfXZ9#&F8B9Uadh(Kxy|osq?yG2GyBl*Gk2?6|uJ zXAaD=Vc2Cm851XhoKbNy$&&II;$pJADTRrN#LBoZa4Rn9jw6F4;bk63UBt+~_vvHo zGP4gN;<%F*E*x=>u<W>T!r<w4a58bmQxnv8L!jxE#f}z7q)sb@S!I(ZPAe;k(*DJk z3}YM-(!%Lt;}P6Ek0R-L45ww%Jq5(>?mLHL3FtdG6VRuH(~F}gOQ%86I!npfaI&YR zRI*MM7-ZpGPAtYISteHjWVkZR6B8w1##}~Kk;Rrr7-KA~Ws#E%usuh(yv$rCcswh> zOjm;8ipEUN#p`;<gQ78laa=AU#whNc$;Wqb#g-UnQtS<8W@cO*E-s98x?C*GadBbB z8OH;LGp9yljOacG-=a{X@HHhWpMw)HtgA6%Wg^U#i;ERhrwagKl$DswWrV=RVA6$D z|I#d77?nzJM7VtT{1o|2l*N#kh{9r)6vQl1lvv8KmMbePs}n0GWMO1saPXp&x)iJz z901PCv4$*+nPp_jRxqay#f&I+QB~M>F^ep*GP4sh%OK1w$(e>b4#FLg6yX%?ld`aO zNjn8m*+&&{sl$tkrNZKqi87UnQI(Z(Qw4#+ICF}Q3Y?)k7{h@$%0?1hI3tl$D%6U} zFdSSi6>cj?<1CSJoMeX=7X^k6IF1Tf#8|}^SyaiDD-4zyDvYpB99#j05yi&@xG<%{ r!7#$CFqp!t7>vPYM+O1I6>*hugBVO;mKX(x|BJaIoG3_Qi%(ksu|MG7 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0b6_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0b6_states.bin.z deleted file mode 100644 index e8c99c170a5f279b69f1853dce5e5951e11e028d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10867 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 XFS5i$9rD4Ogyh<FGHr6@>Eizj3BJ_n diff --git a/client/resources/hardnested_tables/bitflip_1_0b8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0b8_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..f638e4e1bc1b2cff3d02a10b5594d2fc107d141b GIT binary patch literal 1630 zcmZ9IUrZbK0msi68~?cmu<y)m@}M?g?DGlk*N2HoDP(a<YWo!a7|gF5g}Wbp=-%u- zAw;P0Kky&XvIKIIBGM+5CdQ&?tq)X66Z^O$i}u2%K2%d5Y^x6}swyvHTbg9ec;5Hr zD}AJ|^wIa?Z{GhE`1L!k&^yY`^e;62Up^C_v}XSvPh!njlL5o9n4#MK>a71SV;J_{ zpWPVt#(M;Y{p<}BhT(tIVVIta?OdOD&2#d%_Z9wb;)Qbi;XkitcuLxY(w!>%77M0= z+V(2|l~9TQ5rlFURT%zL%hSaV`d$vT#`}(`;J-n?^VTP0%YniHeXDnkEro43&iJ!x z*tumYmnERpw<&j(619a>aYfA*W;a9Gg4Ep<!~{3XyxwWj8hhoKyt(L@zP-7O(X%>_ z^SRI)h+fjIz5PH3yhJ5I#`%z~*VpoOwHm49UABH&r65DibysiprOxEkRM=}l(v4kn zW2vjW+)^1bP9IZupNsco&C_15=~|Mvc};M2r@~h9Q>k??!AiL&Lxx(d3!97YL>;Y$ zaL*pWS{OJrs=HWb^_pjGvV6o!j%PaO!&#!^IIx_v6LaH}%C095;XKYT0;(*ndt{O2 z&|oD;X3}gO6|ep!{v+t5_SuGb-)v2o)2=SZ)j;)HtkazPF502hVr2!Ob!vpMLkJ~y z9iJP|HaKs4^@HZf0{n`BFdyzVsnz@a_}qk2N0pV#V%L05R{zBe8By!#^Js5FV9VR@ zs`=4x9$x<DLGZ63V@}(;5_#aOR2Qc8-inZ;=AyG7Uf#voC2RAGG`*D5H9%K&#y%cb z(b%nvp5;pek4NY`1TU4ikkxEliSO&WkNu1EfQ~-hwc#9RP&qncI^VWM&dgf&4ci#< zEP7kChJ(SuAkIz2C1nQqtmkkJmAZI!^znZN=~Et|hq`jTj-GXNBr4O7^XNcaH9uXx zeDaeSznXn%eKJ%-H-2DzE2;A)j+-3vk%!6p#;Q3}J(&BF>v@@bI%s`v_-~5q9sYgb zg|YklN$?h&d=VS|{JV`nL^pggar>wEAEZxbJdP=4^rYw%sQ`}(CC;D9ssfM1jg^Gf zf>aiq0pPOQ*h3BOvnZkn0sx0&+eUlX36a8w$W)fc{cC%~$93`TDB8%v>q=>IUu(7! zQz-xsaWKC2k$Al^0mzxa!c>l&Co4kA<*tKFwzi`1;CF$8>vo!<-8Fi)DI04X+~#n& z+wQ`tJ!7`~Ns2`!!?5f@2Hww4mUp7oHQ?kG22zklj2}ui#%C!Z4niDq6tGB8D*7`* z9<VkSO|hGZGaKU+XQO}+B*93}mdz=OPyoq-0?QH%z!3|$B$p7ok!VwdOqf;#w%=u? zu361ClY)eJH<f0nA`DwiLWZ+!5h@<i6N(zt(?~v|^X{}mKw(x=bLU>4io^uZT+OrA zn1tra1+=q3ZySOYe~jwcHifb`R)WN4j4g;Q?dCG$#zW;wu1Q_vkNWBQp+-@*&VI(J zeV3OM0ASTT#UE1Q!PYr46M1CAr&ELbc37fZxT}LWZ^qH(<Yx2=V;|7!s-Gp#JJuo) zXQL=074<!8Uuxx1x|3*t!%EJIL*YY18LZ*}#H;oD_F1aYXCoFI%z)Vhg?_Rpa>ZS) zrP)TqF2GWr6{-`XIxSYQ(<K)si%wyppA2cHZ7z2SlNU@OauDV@I6~|?IKZ+l9DeFc z(eeSC&=Vp|enx6)-Aw{#l8O_V3@UavFIn6Ay$QQR{fGBB@5qY9NqJYtORKAQGzsE} zRTw1kYATawe*1F?Zs}cgp)!Vw7IlPBQF1#!jua#x8cOh9T5q2w`1Nzlh^>Q^#a+`) zC>{Y9mA2^;WJIpY>pcou_cjHSy=A-SuzlVjt4M|LY;JB(LRKttR^kh_$iQnjpziU~ zE7f{jh|mijcF)@Ea({H{Ui6v7&g@>(>A(e^`rNO)NzZ?~$f_I=SZTlT+7Z)vGg|n{ kaiXc!^79=Udo<!2Jbkm{<Ie5PSL(MLSBM_qAs=1%ALJ`+F#rGn literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0b8_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0b8_states.bin.z deleted file mode 100644 index 25e777872ff06ad2c1166f2b06fab3fb3f98192d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20353 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 O9B<g<zxkEup8pH-A|7`D diff --git a/client/resources/hardnested_tables/bitflip_1_0ba_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0ba_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..7be7169f4659fb3768a359244bcddb3d2adef943 GIT binary patch literal 3614 zcmWNTYgAJQqJ?8A!NeoVBjKb?K_di`9O0aUtuO@?5D-W~2ni=0CXz#f*4uR#q|<5Y z6M;lX&hW?slS)-UULm7Nw0EgjEJ;X64w+V~uF<aAivhgUx*TkMmU?^rv)BHy_rJaN z`U*bWn~mg4xgsg>exZgEUioA3R_&{*s$J`MnbuP%EtHn^j7aI5uPw#XJ+~?G#V-13 zimB!_C5^&2X{yp_JK`z3QZ`Ud^HxWuy$(?*918ul##7#u4~(?DMOjOs1opz$Zfsvm zp|(&ITfn^^ou;-#Y^R`a0b90Qi`c&EG=;TxRoSi$9O}_r?$ExEde-KMZqiFjX%Q)j zUwmY`cI`%G)#+6)s%oxYJY(y1t(=P-yk75l4(YB)#D!^xsJn5u#z>XG^04=gI>|Pf z>Uy3n&^?#yNN3ZzpK4Ay)2472WK34D$)TDmJvE)FXI#Fookjykn)idMg|B-LpJP<E zx_^?OhlhWk(LHe>OSOFICmCN=_BP!w89Y9C{HE)wvniM(k<<xYu1i^mxs5c^yY7Cj z!2NC9^KN<gQ0ddWO4WS)?3`**snLI@9u)veb&f2xEjy<oXAj_nAEQ}|zLz7x2h6oM z6nDpN+4g-QpxIPca;V&_7nK)Q`uh(JW%nCJwKcMZVR?Z(s;K0RNrSH<`CgN4p+97| zN{vWk=C-H&113xSG_r2}l}34MDCBS~R?9fAX1}wMp8sV*m}5~|q?y&oVWNvYQp_HW zE;p$38-t*v%Jg{s#ZfKhvX7+b`A(Dtj0bBLj6W;OfdMNM9g%A#n6eGh^Nf54Ss!T3 z1Ywt#$<5axkXG5i>dU=V`Pt<?L*46dzI)`owQHDb|7oeeJGLyo-1ODj8-cD5Y8IRe z*%n!8Sk`Sn>;<w9<`vg{O^r^>nxVUGH-D+T=Q*;;@P2pG%d-uaz4gx~|Fi5f?tMKo zcTeXh@Z(BG_^Uqy6@Goe)We7Od8z*>#fD9UC<ctU{iS!620<``J*8b%5G;viSsF~E z8$4hgTaay)3PVWq-06>7ey!fh>nyoAwCYit4yni`f1`>Z3`KpU%-vbbn3I#HBe9d+ z$}Ti(dYZ)MmgD!YUZDpFYTSld(B2SrM(-=nFaVGvkkon+^^3chVsp?7D*VFZ*}ogT zjDvdCEaXyk*N@LVLkMZHaMEhgMu4v#nE8{;cts$DbTq7=Wq>}Om0{$Jk&1v~mdV7( z;L5I{p5dUdnuJahxUje^b3@3YaLRkNED^^lftY-cJ@rm$-qO?rlaG5gy{_2Gd6-i# z0A~Ry($mKuS;O&}xl|!xBNcMI4<~WV$ik#7W?XVWK@9XLu(p^M2}d~A$3sdrT)F|T zq#Hd*9~ywC9ezmgB1JbuKQ}nwOV2m2S=Eua8YP5UZaKBERozz;oNl^;sHM4@<R=45 zu<z(@y7_l;Ldx8c(&}@!HDe+%j9tusXEnZt%E?Rc+_67n$Wjtba2ZsDrLlw8E(-=j zN<3s$Ha4)Njp}pFPg!PVBO?1Lb-f$LVB5*=FH&BJ1*?rq`lWFbs*T%dLLtmGYbfO7 znw6@RH3^pvtf_tmVDE`f`!<*3f8MNF<_^9fiU%Hm`ks4x`<c`UDh$6IeXwO~PT3D1 zl-nwF^$XX3+k9-}W#7_UXG_|b9p3)qKU`^6wyld9P`%xsq8&O$zYy1c0%C&wzNc_@ z8=ASz{`>!^ZrVP5r#Skjzn@@Rgdo26*489R_$9$)0$>*S;rq<iyR~opQMxayZd>uO z2%tXi<C$O}{IWZVZVB$k6TmBl3r6Fqq6*n;+;34^D*xkqC)PFWd7JqVfG{bl$b6ig zMAJPc9ETRI&o0%~`_)bsTHBTYI!J{xDRNoXD$jv-7x+qsU)i|Qa@`P3o{^u+;#Qf_ zi6o>U{Xk+y8%w`XJNVm;s2|RM_x0Yu%S`meo++<CbDcX+@B7nP{a-)+uMfLM1krJ~ z_f7t6c<4jGf0RynYlqJlQZq_Aec?)=V$b3JZs64T%JJ*_hO7_ZCx6PVOc;hIHyej8 zJ{Z{)5m)rrzZA}?ns~SWplUm>-@V)PWfv1<e}9!b-0GR~Cw8&>9eL}RmDAx#ZBmc# zfWv19Id!3oxF`UdZ~GZlE9btonzgJwb6yr3-QNHt(UV%c*Ao+T@(^%lzp(n`V|b%m zGWfa8mceAgeOQBlwG$ymkdAtvQb03HL~y(x!h?teA0r8C!NiN$@rpR@1|=%Rt*Cw4 z+h!OyIh&^c_?VY279=YaBamOfCxdb>SVod#a@a;#HJB1YVT&Hv;lYFv$&y%)Fd}wa zf%$1)<1V)utyq%bxhYsNZG0cdj1Tcw+8&~p%FVrQr8sct-;<wQ3;21@9hnfB$<A$c z`v}P1W`1O4LFamtI70a9QIRjdr9N>{BFX!OJhHXZO$bA9ULi5cfa|prbCbb4pO4<U z#9qCGoo&T8m)3uE@L$#M?(z#wUKR*W`B7J0h^zA){`YyMO%&(6{o+)@*bjH)=TAKQ z{Jos0)?@gg+w$-w_PlvM1Guto;AkHeMOS73g0Qc1=H58=dNMr1ZWXH&H-rwSB)HmG ziRQevO$qT<q?Qo~rpKs?YmEJ0Z|L4JmC4!9SxmieJB&NaBMlz8!fh=CB$8sTSny!y zkq(QO$1E}f8Z))D<5^W+**v#|;c4zAfw5N!KXw%|Q-5?caABpXk+sLE=SHy_;+Wg= zD|^o5DV8%H!DoJrX?2Ko7X*<)BSRwkKPGrGx{_H5G^!=pY85#H$!FO8(iz0B>`El7 zf71!*cEdsPY*D+z$`9(q2WNR^vmvB}{fL%ZtE=TrD{$CXr!lZmGa=|~zfy3WgIm6A zpMIITaP^~?=YBltUM7lRzwi`&0V<CrCy9R4g)646|Lv`aUv^LYy0y0V^2PU02#W3; zi0(F8UtW6Wn=u0ZAffO_bw-rv=-)p5^xz39fZW-8p&s|?KRZ#<Te`m$te&9DZrW6) z1^UbGKoD~kKBv~)JK8K29W_7`oyTMPpuiKx!w%f|OY+s}HL(kTL~Q6oOfs4>Az9to z*N6nm=VEOu)v1rSy9hzrslhQ4wd*xGY@$MBRgKF!%YWu6G=rwMH*Vbt+qUM{qp0+a z$5lSGX^M2Q`_IPL4hVVc7=I~@1$hIj;9t{6l9wInMLK^1qt&HQwlAU~HX_aJ@MbkY zPP1R-4ET{*i)v<*(O_&709^1AFagLdF4T^6701D&0zPDSk_&avK+sT8cBow}N8??# zW(cD4EfZWJx-g8JuCC7;EZ&h-tgtAS+ZNJSk6zw6c@3epli4)0qU}0kX<bozQ4l4j zNdFo^=91TZEHxUOCz?a!BBa14iDU1MFgMNj%rhDw(s{HERJg2-Qe$+qV0sy!Wz+}z z8fZO1BcLRM?P_%<dmKj-8Pm<x^8mW6Msnm~%f)+*mGQGv^~(*>NFQD|q0P)>VohXo zzvALd2D3s2N&8vR%3ilm#*zlDhzbQoImJcl9F;$F6Bm^eaDB*4;Af>3O>^Pb$JyKk zxRmT{zbwWtfE1__>FmRhqh?IuP~2nIc6!v^QJq@AGU2P$1@N$ol?c>!_6dt6Vq+9n zWEA+YU>jE=v<j`T1y_-B(e0Q=T9(uz7utq?Q23?L2p9FT>H}6Z*lA2ANvV>+LN!5+ zo?2$S%}CUMd|aQV;HI4|Gk7LaQq-FwgWQ^v9m=YCK(0p}`17JiGnYddpU%_5C2^6K z1G%>w8yhQ|AC+AG_A{;up1(Vvm<mavYoW~ClfiGnCz*YstV`c)*^)HXGX6AnIO$NJ zV1-eg|Ga9~x!+AYipLD%b%W!4hwUW&%x9|<CK<;j7a0^g14EoSE#xyH^3tBE<!V{l z$z+ckwN214KHkUELGAtsT0K}!S+-SsVwL>+APL$-VvAdw4Ss?)E$a0IS9&~(qY|bj zV`uJT&EzOAfHw5@6C;?tF3Uk8Rzyf}7F;fJHpWc2X5v+6EXP^3Kx#)%L~LbjiH^yW za4hsKV!^Ay!}m8RE&ej1W|qpVfiVK9_pnRnWE~EV1Dbd<r>wi6JEqKW57D=<1$<XI zAT98w!It3;XE{yhWhMs!E>ES=*@vZkNfA6~EfR_%+pAh(GlKCIm*iGGM1-Vft?(Ok zv8&D()J9k{Sr%_s(;lX(s~lo@*XY?U#k^LO?8DzsO8By#q19EmS!NYLgG$nlHkYJw zyr~Qk;q-*fAjeuZ+L@57=VP(`thk6ZydJj(vtW!lE&n)81O$8pn4i_fA7xg3l1gh? zG|fg5p<ydZa#<oO3sZO#BKl#evPxS;z6N?dly9|4&DIp+d<yQafa|Q&K7VzHAkW9K zw6s1+qg?o!xcu3BsKSO!j#b;(h+rW(ecPLoF>?d`tIazu@E<D^6KV6Y!*dHWl)Awu z43!uO8X<vcv{`C+*ND1&>WaE$275Ss=7}x{=FbheTgQBJ+tq|ICR}s;*l?9+LR(#= zlb3^L{k7A$dR6zE>GbK^R-(#$Pub+M1C>Qn;fqar&+-V2{3J$Xk#MbUgck-&wW+kF zz!Qc0UKZ$$&2px5`B|2Gx;kN+pMr<O72s-LXHFvQn}@E@{2V_gd|}&*|2FVE?Je@} H*=hd|G%Y!- literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0ba_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0ba_states.bin.z deleted file mode 100644 index 240130a6cf61216647b8106c293300706e35fea7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27768 zcmeIbeSB2qoj2^R&%Hj~?k;^(S`nr#wTK8)i-^30)2>^iAkHdEBndgI6eC2KLI{C` z<g#~nZ&V<&3SksTj%^GPLoy<SF$u}lR$zcg#v~*I3CU?0CWpynGS2In^LG87-$~GI z?|trlKF{9&?aiDI{K3oQ%yq8o_ws%D&9?sV;IjP#3qO26c;J^iua__X{iEl~muHV{ zd(N|e?8>s8Su@|TF8;x7yCe3uJDzy+yI=dscfa;a4`^TjcwHP18{rd&2u5jhUZZ>Y zm`vG4BKu`8bx6Dz^UE<Y5+p`xdHX{~)?uw9*g<tqC%Cv3%uWAL4k6JfY3{oKM#&G1 zfF8-<2CZIrGvVz19*IR(gE3>LK-}F_6w2jzB(Bv_V&v=xA1##Vv*5cQnsj0eG{TBS zSC>L*si9`M4a*Z`0hD^ZG)wcbCZgnnRf0xWIjdr^9q=ZL$$aD99s32c<9s&j=oUDR za->?94Dsia76WXq8i1zj;z5J+LY{F@h91$`VOQVkXmY9Wna~sOkS%KQD&mbq+9+k5 z6>3%2O2t(f*`(ZnAnaG^lh7#$qCjX=VBA))vFl#23_|fkhHrj2gU%*FM`e2&7KEWD zDtICiGm=qXc%_xa4(x4{+)4XV=DudDRmr}zctDRQZP^MpdQgfDz5&VAP|^bfDd}oC zC&qQoJrIp9+pfsJ21f;?DD(v6E0Sn|Z^F0W=O8bHKrg$$3A7K%(zv+L=#DxSG7Rfr z7|!&NE`#dCyfzu6Xq4&-l$|C`Bt_F4IP?xOnszAsF$vxxuK*uPa)0aNRsq$(S5T#h z#%1V(RgiB8NphAOrk>Z~L%0Ih#;*kIXJj|OL}2;DBo1$qQ)y1KX*1yQ7=^O8yt#RW z+WHqa7BhWOTRxKmlHF}c%X)ydDuxmdiSAG9_bjlHW@hmcBjG;#-;DEI3FDrFWroO= zTbh@&=QDWLaL)#nK_EhMml<#*P?<Fp^0hF>7Q;CLZxg69z%wFl(sr^QaPK2QReDB| zYk`l`EEpMq@)1sRuw9GU>+e8zD!(yfpoK*`UKn5xRFZXS$m=Cg9p%@7=rAnDAyQ{J zj=)k4ybh=daelhQAZt~*EDr7ve*`kY1=5$-zY@g>4@ZSlN@lG}g|zKkhK;FE!UP|6 z?aA+a2jXd5tbUrZT!f2Y*9%X>HYTmOQrhlIT*Rkms~|KC4Ff_Ny2`J=Uw&~moJzP= z2$%0=wk{|%Dn%F$iY1~Ke06$!gcxyashx{#B%}24IG2Vqpm5iDR^x?>yWl+yN~>UU z8FQuiQ6{Rs%W=9J{<{JVPzRUccX2y&C}b3$)Cv6cDfq{)9`L*azcvb>pS+iXLw-G; zS&;!HS?ct|G}W3^X%!1(&o5JK7s21QUE<2-7y;bhq`B`&NM`N5$Ja@&JSFI!x9}0> z1flq%z^QsR<BDjX?#ngAkiyFl5qQ2{ vB{lX<ZoWZNi=7X9zw^ZUzjKR`4)eUDs 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 MXOp)7nBMpQ0Prjg9smFU diff --git a/client/resources/hardnested_tables/bitflip_1_0be_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0be_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..91e544e4c3ff6c63ff616062f8a7d8c18a0622d4 GIT binary patch literal 1951 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 MouYrgel@)MKbnArH2?qr literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0be_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0be_states.bin.z deleted file mode 100644 index 05aca3b6c2d5a21bee579edc66d516e968c56ead..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14338 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 ^8SF;H<(%n6h64u4W( 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 IV*K;}1NRHIy8r+H diff --git a/client/resources/hardnested_tables/bitflip_1_0c0_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0c0_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..87d8693df1453a2c5d4ad7917b0252b1228fc130 GIT binary patch literal 415 zcmV;Q0bu?@T4*^jL0KkKSrY>VjQ{`uTtU$Q5C8xGkN_1x06+)`zybU@P@w<-2mk;k zr9=UsDJdzFBhkJj5>Nb)Njk|DRCP%wVM!)ZNveQVsU*@sNzy?i=P4xAl4?mcNhYL| zAQ>g1StYbfB(W@#(pX7s2^F$SB(g-Ox^<-DnKVkB0KpQ#d8(4)N-ki1q_mG*lO{}> znocUN$udsKJgO_oOo?_0IFJuX1e4l9B*_Gm`5=;FK_tLQ&calH;wqIAxss_Rpou|= zP?da1l9Dha#F<f8Nrae_>52-;GMdSn562J%$Y$aOhyZ{900e*lssKPn01fVxP#_ur zAQ}J@QmAOjpeZR+Pf&iN+7PO_B%KK)$t2Q%jFMQ8DS3z_w32d3G?HYJX(YfcNs?(M zq|#)WOrWKtu_RoLEVS8Byg<UG%!;@NfTt9x^n?7SQzzurrkJ>cr81o<;wte>sdN<L zlpMqoT|^REAd>qKl46xfFcj!efMlvwBZ^fd$V5XFN>%MlqN4(srbSp&3SyrH+>uTc JBn46Y{s4xXro{jN literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0c0_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0c0_states.bin.z deleted file mode 100644 index d3f655b0414dcb31d9c59c1909c9d628065cb463..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9771 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 diff --git a/client/resources/hardnested_tables/bitflip_1_0c2_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0c2_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..05f424f307c39bde53668f05871775c7c08e39ba GIT binary patch literal 13885 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 J%{hDF{{SNuKuQ1r literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0c2_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0c2_states.bin.z deleted file mode 100644 index cbbb637016394a65730ecfa0600555cc54868afc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43691 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 diff --git a/client/resources/hardnested_tables/bitflip_1_0c6_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0c6_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..c104fb1de56c9bf4b40acecc9280d508fc571ccb GIT binary patch literal 3025 zcmWlb`%fDOf`FZ-aSDt=z}U=GK4=0qevI(Ucz?jVZfHp$0ndhjvEw=Uz#csAo>Xah zR6V?<6yjpX%qV~#gDtsi8wv!lQtaMI^bX~~FYGaD8tpI5YIPTb-KMMVDkj-G+DmiS z`xm}XpY*l;{ckkrn}k$P^q4oF@S>kgOg%U|b@tT56KAKYcxQPx=XkuEkLo8bG)`7u zx;-h8oquU^?&CgQ`J{{|e}h-UyVl9;>Gkq>pS*GD)9G^F%rAby<DKYmP4alMufF2( zPQCgnkH?eCr9Szc<lm&f{`6F%*Z*MsHzz)R{g-OVn4LO_T@?)$pB?<Gh5Kw*`A6l< ztWvGS>_jjD!D+kIZWns+6(j5{wset^Hv@AFv#yeedd>cU=Pv~^6R)(MeIiq}pBwnA zT-f{u?;X{2_d_z*n3_j+iapQQjOE3K9GoTQHsi$}NBIYe==|(oj(&V+e=C;%>7(Xp zTEf`4ZE?%*pPY^@EK6nFZ2RQ9OEod2B2t-=4V+V~zxdVP1qaXP;80s?E=2`s5Tob{ zehrthTA6g)4#)Iau@C_mah)O=1>@H5tO4)Z!XMB*zU_tSx~RK*Rrn7u&_2+%HggO# z9tD+fN7LhkW|*MrSCeA{p4JEQ5oJo+Yl=a{6s;iFKl0j^Z&1A?Au&#*WcU^XX~}f0 z>cLMiHCtENq<J1Jx=ao_EqJ~-M9~PAa{GNQz^ppiT$!E!`o3c6dm-}fJFC^)@Z%v( zG4ag$&1L5ga{5>?lvnck^8CBM8dLAKmS4`d%$^{}Z^Y*3ub`LXSti^!<puA&m|5$w z+>;lO5au7`qw^GE+DRGP2c-~2*;c?1w#>filQURf{3i~Ryg#q3cu2Vj!r(fe8IPI4 zFud{LsK5H%<-(Fj7XxFF;C?2<nXEW|XV<@Iz6y(N2f15+y6kfc2O5rB=&a3w45hEV z?gB98x};^PLeiBX&+Z*HHF(Fd)(-85|K&|?xgb5?2qRXfK<EPMfiPNH0J?#p&mQG9 z*R~=UA(^?ydCa|wZ7V>Bd}e!QyR+`%GrjDHL}@T+8<=83Z0D#%L-mpIbomx{Qe+rK zpQ}To&kBoB>)Tt|pIZOTbCAhaZuWeCZf7-?QS#vm2#XJ%1nDvlwiaM9CuHnYd9S`g z#u_cAHVShGfJxh@ob$tt>Vm85>J>|Ay1y)-OCcGn5llB`(#W`it3RKH38~Q9^x??G z%0D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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0c6_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0c6_states.bin.z deleted file mode 100644 index 95d162000dcf5778a1996f34054607f37fd6fbf7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24543 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 VMGT46lx77=9^T=OQ}ULxKLLUTI=lb? diff --git a/client/resources/hardnested_tables/bitflip_1_0c8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0c8_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..6548e5270c3e85ef190a45a504ea181390f5e11a GIT binary patch literal 3523 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0c8_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0c8_states.bin.z deleted file mode 100644 index 5eca50e2e24516bbe0ec2848cd7e173c128e26af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22541 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 diff --git a/client/resources/hardnested_tables/bitflip_1_0ca_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0ca_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..8ceab191af1e27ff21fac695a3c814ccc072f571 GIT binary patch literal 7147 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 bD@lyuL0m06^8X&Z%xjw&6{b(ky!ZbA%ZmH1 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0ca_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0ca_states.bin.z deleted file mode 100644 index 500be7d66bec974a1ae641471de252e82f5eb072..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32059 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 S{Qq+1+^GTFa5T&J^#20S@Wv?s diff --git a/client/resources/hardnested_tables/bitflip_1_0ce_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0ce_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..26fc3dcd4eb5a2050245bb37d385960bb2675764 GIT binary patch literal 1663 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 B!W{qr literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0ce_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0ce_states.bin.z deleted file mode 100644 index 583dc35e1df12d4c37aaebeeb375af2fde977a7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15142 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 Hz=Qu2rP1B* diff --git a/client/resources/hardnested_tables/bitflip_1_0d2_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0d2_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..9d6eaefdd50b33e49229cc244d6585d6cd128e0d GIT binary patch literal 4937 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0d2_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0d2_states.bin.z deleted file mode 100644 index a2395d9d70b34e87d9c74eea50cdd0462f267dff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29524 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 diff --git a/client/resources/hardnested_tables/bitflip_1_0d6_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0d6_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..d6b2059730a6fd116687dc3b57a7c93b8859772c GIT binary patch literal 2083 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0d6_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0d6_states.bin.z deleted file mode 100644 index b2cc698ad1f1ae1d7c5177307f59e48d1410ba89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16085 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 QM})ln6i<EXo7QLk4+Q+ys{jB1 diff --git a/client/resources/hardnested_tables/bitflip_1_0d8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0d8_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..3a4e9b14c33d0b78b81f887c38400578c72d2918 GIT binary patch literal 1270 zcmYk5?N1YT0DxPeM|-_MU+&6nK~M@f+8g|S#wFd%WKb>Ao{ALf&kgYIYL@w}af@R^ zCT}gJB`5>68f1*k@?wMSH)e2ak2}P~EU3#u%;LZ;TeA>@@nya{KJNJso+o*#KK$fe zSb3ntec<Wiv0=rTkG?vV)=stsN7M@S2Z~Jf*!bw^28AN1P~c0%?~4C3Yu>eGUOdE| z%fQ}v^KjH*G-oc*VE)#w&EPCu(v}K1&K>UWnon)Ph|ODWvArb@%?Ka|`wbr#SJdC; z3W@m_uMdrv9)mTSMf3EeG<<W$mGzvkll*(+iXPP2=VMUdq8sQvmxAHn0LrgivSoLV zG~JvoU0i_y6T`S^7ae6h<@R=Oa)?2f33DR&ED~c;{OS%{eLCKlt!(ZB&|xYR+=-*K zhuJ-w-qv}&HS5T*vMc%H#;zsVYsxR)N;DOx9+&@cl&QXc+??%CmoFXU|FyJq_ZOVJ zQtf~UR8)#X^h!fUMrQi5dE~RKi5Azwl?&<J;X4gm&&)i^FTO`U*fc%Z5+=PSqsB|N zl$T|u6LjRKr_aB6@+Gyn?|wxV-ZVCI^~l5Alfp{Dx|QSh)nk2kR}OY2U*?>B_I1;a z2f6>0<!W=cf7<q|$ppPrSi6*qi=(Z6w`!Bht*U*c9$%&0II2fZkB+bm{MC3ZNE?l> zup$9EG=96jV@NNIsenb;zfNqhQYmB;5+K5sV00v4H6+?(f51%jbqvJ2cqd;3>Mu@b z-BX4-)oz_6Bp3%k1Db_75dU6GMlC(T`&RYxPC1oV6svu5VzX_lRuz(~XJiCefFcp@ z-i~Hvi?cs@A&;s{q5+*OoEIYl1{su3_@?wir2EJ+>Q>V6@$|OT-2&aCoc_=8Rm&CU zW860>Fhm{XA==*)T1FR5g|aXqCJHvDTdRLLzN!8FJ-SQa>G>0jucPbNQ!n!J&5Nx+ z_x*84^RQy!3svfduaA~H3G}jUiUgAa)#D5><Tkzry+z~l&Iegqwa5{63ZN*MC0Q>m zh<w;cc!&}ZnJeT&DDE~I#EFmyYJ#!)M5hUcjTmHHR8J`3!cSY3?Lk;)v)C0DDOSoj zrwma%HH(25G`I5}vkDmUo1G&C3)O#uNhwOZ?x&o28(E#qiILhg&gD@qJc(kAOYfAy zNmLx7XEgy(W7haPWVo+Q_F!7ARxNP^u{|kW;Dn20R3GF{h2#)x0umxJFp3AgE?vsc z8x2y-QzS{JONwR<GSBg_mu0~m3=<ZKp^=>ypdcn3v?R&`w^X$+=UTlFQ+x25E-OCK zflIYXD7f`{zne0vN~j`;P(W)mnN=YefPObAbCM*X7~(rKM`8F|TpH7?r4pps%miPi z(yB3CuYs)-Q=A}sb#kC^jv)~1cpG~sl=5P0Ry_e)4nUDy#v970BuZ3@+(aiiK%mH} z0GSZzl$U_LrGSfpxcHrxSi6Fr2;hK&f*j5;X(_5AzS~dRw)<!lW7%S>e*v>;tnK!7 zr+j^(2BVhrO@)SvS+|B|tb_~84kiR-)T+-L_(mgDt*WlF(daZixU9S(`UWMq7q02) qdyvzs492OjA=QPFj6gt^wiA1k(v-=JVL7Xf*U056``@>RoBsn!RO$r) literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0d8_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0d8_states.bin.z deleted file mode 100644 index 4188dbd10d566cb057c2349a6c415e9e9ad53004..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15061 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 V@wGqk{lELfcalEz^9Po;{s%h&G3o#S diff --git a/client/resources/hardnested_tables/bitflip_1_0da_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0da_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..f59ffec93c62099d44b48d2da86e76bfc82a7797 GIT binary patch literal 2316 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0da_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0da_states.bin.z deleted file mode 100644 index f4115044a29e12f1cf6dbcb825f2e78d7e39f6c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16636 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 diff --git a/client/resources/hardnested_tables/bitflip_1_0de_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0de_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..62759b5d1c89d1c7aea59c532353842e47e63a60 GIT binary patch literal 1273 zcmbu6Ygdv70Dv_YW+Gk)dn0TWPNhhBPaIBYT1rw7=#rzpX-+O%2T~fkW>mIRgb5_n z)FWkPP018YDD0@mE(ln1mI0ZSbLPBundYUL=2@-}`v-eIKcAi_E{#tHV-JR~4*Dh) zc)9t#TV7sz8d2rm;_Yu<S8&kH&kb;27mtefN9|b&_yHyBx?6`<WxD+bf<uHAIBQoq zxI}BW{7NSgUhwVxapZ2k51LR4!!j6}i*W4jhcL$f6LI_M90A$bxC;#}#Aqh$qT54< zgBVRoq}7+tKMf{#pG7H*E`Eowmac0P@c^eXj(w-k7QJ<4W<DbsYQCvu(GE<AljqAk zwSS3XW~OQ;Z@uPWAo4(c`t+B$*-L9pg1+BpchTk$wMC1bLqY2Ed0?$C*gMXB1Bz3% zc{Rrt5)br>2U!D91R>fovt!rv7)O1K$6$AbA`1m4&yp%n3{3KZ9ve*aL{8mM`{S^o z*6?lk+~x!C$<N}d55sW-g8m55^(v|+>Sb=s@hxo+?sJYu{t;4oFFg_WF2a8I$B9F% zy4RT3@2k*J88>P-R2C|!sxH+Ca|052y<K&jTu+lrm4^`(y>H3N1!AP9U`e)BpMT_m z{Z$6GlW-<yDP#3N2`!(VL31RNhA<U9(i2)Bi0T)pOJ=Lbdv2ZM&sC4BU<laSSW#}< zAxyW{DA9{jo|afT`j;hrcf9xaEvC{J)to;wLAw}f%maVgj`{#R@F)@woQ2G0f$GWn z(^9pE)j3W=i_5OMI6Z9?m*#ZV+nl{1In!%&*AF8(p-qE_bXJ4)(nP~aI8W$#{eG)z zRs^*%ykSHmsa2-7^8Bq%xpkZ{tkK%_o0R9dHo#<HUX$)T>a&wtJsA$`BP?avc^GDU z3MmK?x*hT1`<c0D73D&VOx++(jkGM@;0<C@rKixuHrDjzx9_9Mr+ocP-^A~fxfVSK zGGl+cyJXC#{N0hTXCde@C?5^Vil0cN=r4a9CHugc;bUg!;3I_8nggQqLn`0p`ntVv z3>)pQVk(=|vt!}8qr`>s;+aO@qrq#N1C(;9<jTh~|2hFwGkpS4oWDYpdc_imh2dF( zyao=W?HS_1p?Yg`&uQ8x-=<R;d+Fg7V+0G58lvorRJ=iYBMnU(z#TfT9oUyX*YE@e zL8HNVpKIOP*)cMb*wCLBzGoEDfM@zN^X+P2UOjk^E=p)QRrI;h)k4`ecp4A5Q<R+W zFiAUU|D~bV$dLrXQ($<nfRm_X?k4EERf?s9w2j@E=Rbc+8s^FZ(U8*HJr|X1s<;)) zHY<eLW~p4uu3E)@4j3T~B}-sPr#=zDD$)d{l6Y!2L?UH3HA0QT&v&%i6x>Zbm;#W5 zxWYOC6EG{dR-3et|3a$t@Rxy5Cl47Yp=;_aNAw{QdKFXWapbnN*i;tgif<8eIa00> zWOw1Au5DI;&9(^{Y_<VvG#G3IuAaqzwB~tBn2QbPP^IV6usFyNY&GNgkg0S%m(OK4 z>9BrwJ%OeKY?|*By1*?)iNAtEfdg^8HAG{WO;L*XpnQ=AZZ>g}+1B)IM-|ACQ{hP# z4*+#-v!hcF>49=S2hG^>1ht<L%<lvoE*)c^v)JMTrg6Wz-M@k;_|;ipS{|O-SHC*I K{ms|z8~+8ECrj`E literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0de_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0de_states.bin.z deleted file mode 100644 index 42dfcc794f65d0f8d0aa7f8c62c1f7034fcee162..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7526 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 diff --git a/client/resources/hardnested_tables/bitflip_1_0e0_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0e0_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..904ba404c80c001f9b3561dbbd4f1d8b3f886279 GIT binary patch literal 1292 zcmYMy?N1s90D$qsR#wh)RSHT-;}ikmkkm5h>bk8SA{7M7aU9iaYk<fC?2C3bS-ZYi zQHr1z6c~`XDFuX6H_J5Xx@4<Z6HC8Thh5TaOKZ9;8rQUG(=2;Wvt&!2f8a@ea>7=> zA8F@f?XvDOFDQFY=TEOvN`Ml8*#H1H0bnNp^wJ)@^4j?VL!vqE--QAo+umE?ikg7Q zWEc?Glfce=LUW~=1*%cWr{n>~?@aZTvkJAiio+sDA5)4p+#-3pmWBq@$6$K-#g1Q{ zo771=D1r2tKJM_W3^$+;5@?_5pc6?EkP|}!*@3+OFWNTiZPoT(sKR+^!_)C-C~@>5 z-fvX5fm@{QIw3CeqPF?vfI~CJ4_JaSsqXQ3cex{?$ei?u3v+Pyt4o_K=`&e9FF(G+ zbN%D7v4xXA*KDLd7~{T4I~W@;ZK~i_wX2X5yG*e#PM~yKqoMCIQ|`}|GsGN6-x^-l zcWWXSv|!B|cc-%Xv#kaC!=@O#wr+&jMU}Trb}>0;ojA@cxw(j6u#aI{+=<ke-ZykJ zw#y^ZXRX?LJU?F3J2hB0lE(V=Ti{>^I5ADB{6>ctql{$1Q9u2hQ^?4Lk{A*qLPSxM zmRl@T`4VpRD#nG>(`vn?8Yy#DW~*TwYH*F#sV-R=w~Jw2reV<_X3BKh!WP7irhIFG zFsZQChM<sg)Z|D;P0I?Z!mMB$v=k1Z){r*O%8-v0YM7ONTNRTkC!+DF6S1glwP{{j znhE->B3^Z6R=*gCh#62Q1xZ|(KGO!;@J>;QeXwqZHKuaR@>_WAmi%lrH3sJ5qGtJm zpg)fga;Doi%dI>GPd0D+RFYI|_W(Si=+!t8pPA}}ix3heMWD3>hbGNhrm`?T4Qhk~ zvKF54<#-aKDKUzX>M^aEq(dyWCa$b(1cUq1^@3wSW|li2w3l|#Et=E}H>*+o{jbvF z9}aUV;Ex9L|4Msb3Z))Cmm;|(q%UX?U;yx6{CLXMTgVeuL@@gse}ekY0~1bQ>U&zb zM=>i%n@|EdA|R*27j-Mwcm&%Wl}lS-Y5d5lVAc@0!Rl<YSzRIeCz}<tCv|^J-F&e0 zr0cZcYrVwqi_s&imLDpr;cFuMCGSR)SNGK7X<leYZuOKI!}4i=*XU2X(RIleKYX-j z^(?u0^5Bi92hO~IzjR%4+1$!&eT26xgTs2yNW+{ujHKkzl+9D^=8T{{UizH3NoChE z$VH?4RtTIIDc<oXTGipW)!Ep{$+M%-G<8m0XKgyaRV=*+?XO{+jddHI@9X*Q%R477 z2cGs6k><DjUFkyz;|#2q847-r^Q`nD9KGNXJ-5RICa#suL=sZ3!quOIL+W6>&3C() zrj^eL$=uweUuTK4gO1p`w#ve$d+EkL;b@qVfhDzrY2Dqxih<RZiAKXoNc<kuq_ZlS zRVn_iv{*eX9AGnJuB$Z7JzI8eX3$Da5E!p4kn=mF*=zVfXCsqPWM=qc4!OiBW|Qj{ zhmGlH52jvc+%<a~1nZh*=8pbuZh>Q@D0Qi2gNW`Aa55+}2ID<_v<?QT^2MCb10$d( zG3j!p%n8GiAj<1snTG;dhkMb1_lGrnudq$y)k@5bd~k-Hb|tA-A$EkvO2b+G;n;>h f8#Tr|r}ZtpNul4!$cCq$d^IY}_Fo#h^P=G&oW}r- literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0e0_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0e0_states.bin.z deleted file mode 100644 index 4af74d9a0cfd8470ba60189fcc0540524ff5eb82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15173 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 diff --git a/client/resources/hardnested_tables/bitflip_1_0e8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0e8_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..e969ed97c342339ef592226b4f52b10d8770ba8f GIT binary patch literal 4522 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0e8_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0e8_states.bin.z deleted file mode 100644 index 4ff8482ffb199eaaaf9729c89188480985a5afce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26952 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 EUry_jO#lD@ diff --git a/client/resources/hardnested_tables/bitflip_1_0f8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0f8_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..ebb53232e1a0b00cea7b09fbea4c89e7b4a7e721 GIT binary patch literal 1589 zcmZ9HUrZW#0>@DcQka#01N_o(u;RZ86P#&$;Bx+Hb)glxb1kCNJJ&KpFWX0WBmUbW zjLJaI)<2cq^m^Tz)f$O1_e7K04#SMwUN*aKx|{4J=Av{T%%*A3qt&i<dwsrdK5w6w z&$sQ*SAUP4yHxABbpD^8UJ^b0%jl=SSl9k_|DIGN6P1c&W2rHzNc5g-U|aD{^ndd^ zuZy1E_<r))*=J>^8m~&+;|b>%k|g+k;p~|!jb!6yBfD|^RLM-`f@(3mC~3U934Q(n zxZd~yD(mP_F3tQAE^eOsVsOf%sjb#>bEIqPH=%lcjGv?1)iYw;?Ts!J>iY`PKPmHs zH>42bHf`%xcS+0J9(B+>o3;Fos@bot`;Yy${t0F-B&U;eul0L|mIb+r_K``H83fGG zl=#=#Lg!X}v$_w4`q<l8^Vbjh?%e__MTwF6%s2YgezSDAUC)r1=T*6Q&luaUiffzd z^qL8+kc-8#!qGQ=S%wsj<odgz{=Qe%V?}Uuf?Zo~5glselKOZ=9@k46*a7W<nkyLN zQU2Ytz2-sPdYQ&BeDW1!3Jw@>`}1F{Z&aP)I`(GFDkZ#xN49nrm;(}-UfX0;Vwk~z zcr+Rn$5c+{gARJtdX2#P^(wAOIWO(hIzB6L+1J{#WWob;-86Qws6z;wUI$W0g?Lc8 z^rbfH$VRq?%EN~`uny<hkdbayd^A#8n0kmeNJq+K!xC&FliNxTKsfjH52kPWO_e4U zzOFBt{0H+7M)L<C@W{ai>;?^2$bk84+buPLsq%X}c1Gc>#ajRHt>q!;dU8CmJJPv1 zdt_SXFQ0jHtHJT#mc15X_fcK3rFw+T##OQHLB);7nM32xqkqLf3cp;M&u8N=4Cgaz zVH2Ye3oi$rZ+S;Vpf6oSP0FI4Un9EOUZd%>UuTtWRJ}y;gF5jJ$pnL@Go&!(SLO6~ zdCc8YNDow)SFN(h*5j}%a4}^0#}CupFFypLM^}#7w^VeA^@y=5t$n35QOTu)5e>`{ z2|P)}V!I#S$yT#aJ=(LfZCTkZp=Wt9%`-h+(!;rE@PfeEr<wNMmS~`eyia%(j(}Q# zxZUWGYGC_vX4zm~pnB4}Y5}AMIHZIARbKiwF3$o_87xd5*sRKJCt_(*@U1Ue&K<WO z&8L?hc=sC)6*rcmZV1w11cuLS2m8HoHOV-#hx4kp6F<Ex-v@<*y8I9oe1(p*@3#gg zo*Ws4!>O0U-z5*4Cw{t2C^B99U98<^3hssmKu-U&8Ty!8p6snxGlcjJRYSr|H+6C{ z(UbUSNLK|mlq)3^K`vtLDw^e!nA;*mBnU3V$QfO|j~Q1H?u&S;N{!-QMpKTs1hQ&< zJmxRcVKgt`UquB1PfqhJ$)LQC@Ui5E`ftib?FGgvbHjmE#D^|K^LCy{yw_|#H*N(v zApAC5ZRvS;V(jq~B_=~Gk2mk9%V-;d8PL_6oL-r}YoEjMje07KR>(T#axFOr7S(cf z>cR%_O*>(ZM<gd$0VB{fzNo9_eGmk*oQoBDEgkgD7>2Y<pl)X+-HYbRxLMco9z0b< zPNzw8Hs(s549CV1Kw)0sMBFu0tkxo+_;N&2Nn=n?7IoI6H7FIbESAQp-clB%ROph3 z3y)3v7HFgwIh(%is3^&{<?XY=i9j^twJ(D*+Li6p+TcZz&+DaXmA5Q*Mp6Zm8-RfD z4Jhc_iR*xWET4WJWymbIZL5q1rt`^Fxh58ioDj$yWT-gJGgV4~2uB5Tuk?95`WjxL z?<3ys7x*;44Y2+iqt+3$Ovq(E2J^i?D$!N1i7;2D4X;FfSsP?ufdgy~PBVTuCnI9x z(zGvu;K?+Z74V?D*OI{efW&;atXggBzg-+G>^h9Gcp`MVf^JgZq1>t;v+eA~Rk^6S zw3E)v(K|9i__%ml05-%!`PMbjwUfIpA>irgFZ1fa9V$c?1EGdC^1QBw7tU+SA$g1f mEY#oMkt+dA9kuJ%N7&nBgVS7CZ9V?vDZJBm&iM52SN;e2w~5pM literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0f8_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0f8_states.bin.z deleted file mode 100644 index 11466136fba4fb758564212a8ca8616e4d468b67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19601 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 W#${_(##%W_UQ@}aw=djw`~L#x5b!eq diff --git a/client/resources/hardnested_tables/bitflip_1_108_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_108_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..2b87ca8f29cea5c6c95f1c9805c1934ee622f802 GIT binary patch literal 3508 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 Y6fiZvXVunUTW+LZB$WKCS0X(9f8Hq(2LJ#7 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_108_states.bin.z b/client/resources/hardnested_tables/bitflip_1_108_states.bin.z deleted file mode 100644 index 31234583d6b242bb7cdca056f95a2cc0a5066435..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22550 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 E3Db?fIsgCw diff --git a/client/resources/hardnested_tables/bitflip_1_111_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_111_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_111_states.bin.z b/client/resources/hardnested_tables/bitflip_1_111_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_113_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_113_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_113_states.bin.z b/client/resources/hardnested_tables/bitflip_1_113_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_115_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_115_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_115_states.bin.z b/client/resources/hardnested_tables/bitflip_1_115_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_117_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_117_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_117_states.bin.z b/client/resources/hardnested_tables/bitflip_1_117_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_118_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_118_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..2b2bf5915736e8fe27d85618b0f31a90c0777bcd GIT binary patch literal 1261 zcmYMyUrZBs00;21rKR*P2rbwCTvYy47?exBV=iN$n*$NW(`gUzT%6wh>cf2N5;Bbc z*3v(=y;_A%>=K=pe_Cv2`_@I=+Us4*{ybpZgAZn_y0FFv$dYY36kXr^K7R9k`6i#P zPd<B}`sh#-a|l^o{%K9e{+Fvobk^a!u0b>ig7}`?oS3LXG#FBbAiE0K@1^cda(mm< zdoh=Z)@0XhnP0c14LeVouw(b@jxEf$ZAk~IFzpO?*UjHokZ-2xsi})I@GbgX`p33y zAMbei+TknTF?)j_@Ne@BkFVV>Q9Jd~eHndC-#3lCpjT0dI6T^}j1G`r#p{4ooDgH3 zs!oZG{np}SbV+-}>7?4hs80q>IM%CzR}6Y5Z@~lUY=v8rDE3lNO%N1_57k_Co3u<t zz26)vY}^iRk{$|(JQ+8jI?fURIYZ;x<Lq>%C$rvymuok6&xa~yIQ^7lBUB&(`4EZ^ zYdX_+r*{>sA#IE!cKcuw-w+V*loeWpvPZP;v=a4@7URNJWwDl9{W;Y-H+81(U#)$X z-%}yrfh1(o2`+7qw`5g|r!RaL{L=JvI6QaGK^-V^x5-zPPZp1MPe#xDVn4B#U)`|b z+?-z8+Vxt#XAfaEHNpPpJY3JlKy<_k?sko(`l60_!|jHYNkQRG03tNqT184TO|2NP zp}0><k^s1HlhRP_mKjwb*sThZQmfhoc#`*mBq`<eAcN6+K*rDa7h)K4OP82Rnp1s| zR@X?<OYKf4ZdH#&4t$Ck%6%s)mC=9DU%%B3F-ZZ%c#kJ&`oo@56Rp6$Y{BR+2%~SQ zMI=D)PSYgr7Yrbe%qakvM5{ZE-CEiI;8gzR-?h~bnK?3Id_Z0SahOft;DwE<3)bTI z^(QZ^ki{d9&Wf+f7h;dM`c_nbnXV6Em6#28DIau{uenE4V&Py<@ksCWXP0{xk1C$8 zx5!Ht|BCih&myf_x#n_T{u%}$$8$EUCfB@t_u<=x7uP;tJP0pGmo_g@r$WJDW6!<Q zq5S-#;o5hWKFB-n7z?YrH`kvO9$Sp)#CvPvHWURx_GndV5Z6D$>6$AzU3WYG=ZoT0 zL+xn)51VE*K}OM^<{`g{OGxw}nZ+<gNgfXaX^~OtCY2>>0|6LT>XnMLEEt-Bm#{|6 z5HflV%(yBbI}Rd)1R#`Hf0~PoYceH+VUY3gFhTN87e;wOjv&26y~k^g05-|PEU+1x zGhTv~WYG*6Cm?4f-govyb7j>`1v`$ZYdSQ2(bci5s!j3%2Q&xGGnz~8X~<Nob(q;q z(Ry4!E1X_(mQ5tMWD~(92FV;{y_nzLm_gD5T#Vu}C7TJF=+6jRkrFWCIF!#bdH`82 z<14)Yc?~lXV@JJ2qoB*Gpm>;Qki<dE8p3^Xb}H;LG&S>Xn)Q-w7PFNlc#KSl0$P)! zTo?hHz@%D<qSZo;7<;7{YA$qfJWNv5fCXPrw<EWl-R?rj6R@{i<)Qv!4~*;*rG#7} zYAp(7Qj$TDVi>phJ?n9>&kcDlAy-y`4oYOI<Q*~u#Lh;(C8%yl4-$LS)ixyQBW04u Ys9vQm#RdWR@cEsw7SZh}Up~A4f1A?lH2?qr literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_118_states.bin.z b/client/resources/hardnested_tables/bitflip_1_118_states.bin.z deleted file mode 100644 index 10afd75a4225d11d849cbe468a20a160fb5752ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15035 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 bF<u}T_weHGcTX6_Rq(??)O22Y;>rIHFA;2L diff --git a/client/resources/hardnested_tables/bitflip_1_11a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_11a_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..f7e2d1674d4fce897625e0221dabbd6710bbdf9b GIT binary patch literal 1788 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_11a_states.bin.z b/client/resources/hardnested_tables/bitflip_1_11a_states.bin.z deleted file mode 100644 index e0e985fcf10bb10d009012d4875c141d69b68936..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11330 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 Wm@V)=E|r@KZ+7Xic`yB<_rCz82jY?d diff --git a/client/resources/hardnested_tables/bitflip_1_11b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_11b_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_11b_states.bin.z b/client/resources/hardnested_tables/bitflip_1_11b_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_120_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_120_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..fed958a7f4de03b7261571d2688c23a283ca5ee3 GIT binary patch literal 1301 zcmX}qUu+Tw0LO7`TI642p+`&E5?fjj4yr8yW1X4;1>vAex!z$*>?{{p0Dal~@1~;y zvHWosT9A^eErs*=)2ZZ|EXFLBVTMhXlv=iBnTZdJ*&f^y?UJckHs_KhzsK*x@8P4i zI{SK6qoU!_x!$MCb$k4e;c8P8g+^(j^i#O~6pD}H;XT>9{XEo_6~b8+0+<C!JBDGv zqt52$CVZBcNca_%a=F|L&m`Y5;~p5E$enA{{57QA_86`^k{fD$Xkk*LYXx9tNurI? zBW*C#fR3je;x%i=0$;RGcse_bfWbU}dl*cb8%0sCAt+wSG22)D4rzNu+3!%q<JLia zQt#~64oXI#f|p@haE6UTr0ya<>&h{~N+hBY=Oyx5x1q;AD~lUt@=>hEo`gvvKHvhE z=%xXq-t3n1rKmk3&(ns7+Ne_ruPTW0CRiSR#?s&+W4#F1MYEtC)=4Q>Wf7>0xtI(l z)*CuKhCe2D%+Zy=FJhc)>59*jQ^<oBD2~bv$Sr6=U#;s4%FI~06auV}i$A!#5lyeV zCXO+9ysp=*_c`mAB)MYE{O*WimTIJOD#Je!8;96!f-l4VQ@IPmtJRMj5BCeN63>Ab zBDP=hJl0$PD^hE!geO;9A_{XVqTq7wy}6`kM>9G>Y}W~{W?*WXj9Jj0^g7^bX0)iX zj8hWCG3;lS^T=XU<ZZ91Cb3Z&E|tWvs&m;AYM~XZ=5yEnyeZmQ>+yD+PR$XP+_kHk zOy#8Pu5p{4RQ#^&>%5nE&s!qSPIt*~*+lHUUe%NfBzeHIF56bdnk#V7v)QV;|HZ_{ z^(`m6T;S$p?!aeg{S6f6dOF<gOTgr7LVu*l>6ihLEA;wlFxXz|-+{$+eoC2!L8MGj zgjdDnh-p+^OhP^Qg3Tn!Swqy|xFYFNiW)^!B0FE}hD$7h6mg20SH`JW#byeI4RVcs zCkkOEqR>?`8UFqctjsm0+j8tU@)m5<Tdbacu~HAbVl3!03<^UE+^76MdKRYe8-!y1 zb$szSDA-PeZ$LHqQcJo@*C8SCG$<FE^ll<y$S5^*dVodfz_?#<Su#c91RCO?q5g0l z!NJ>b=?)rP((g`HQ;!txPKiYuFcDSid?_BaS;Ha5icy)6L}D6H2Puss)<6uy9)#p~ zKGdOs1uG}X4X}V^x@jnmi(<Jl^0g4ID0;bsEel}jHdH#m>u!kRYN3;`G;p(=B3mkC zk7UIgL8VyygmE^u-<S3AwY@E{kIZI8+L?j;I&G1|erW7a_@|Z)!3QDK?LMkrq%tnB z4rhEH+X`N{`7kM8rpD2ng88N^O9%GoQfFG9DPQ&-4Za>c|G~;9cr)#YeI&bAo6;c; z9pu&p?5WXu^Ggs`LK-oGF|IfV3WDeuy;0~(M)?sRj;5PeByFwqU5LWGs>_3GVVzVe zlFcd}PP3BEPE+<%`*(djG`0_#^Nrsd`{p$J$L~*6pC*oedsF<vwC_^-;9Upn^HRc4 zvljBOC0}<YZ9Bw73qzX+m<uaoTanFH<TCUXsNMea(6ySDUq8%=M2TBJ%<m%Sy+XD4 zc?LH50Un}0BkV*$7UE^|9NfT&o-EFe#|QN`1>Q_gt>3Ph8VB93o{g2%G@7c~EcA%; lGIYF^lPMP#f$$90rhXy`+EITGE-C${zsca#O~4KF{{WX(`aS>v literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_120_states.bin.z b/client/resources/hardnested_tables/bitflip_1_120_states.bin.z deleted file mode 100644 index 750af05d710c3657081a6b9ff4a9e26283bc3759..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15177 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 CIWi3Z diff --git a/client/resources/hardnested_tables/bitflip_1_122_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_122_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..0e406a01950d17b502e7f64c8e7f804e77cc0190 GIT binary patch literal 7248 zcmW-lX;hO3*2e)0Bb$nnn55c@kO(2s<VnISc2TxqHiT>>j~is0<cYjfx3=2N4N6FY zKo*mzQ_1p}6-h{#(HT1;Bm)6D5R!~yXQpbgYIj?wotd`tdfs!t+;i?d_sjp>d;Y&$ z3o5J0HDVl3ykUFmql~k-WbMx<P#LI<7e9F}Ba!zB;e}V5n+JE4Z_IFi7`E@=_V7<+ zWMtQ8XP5O|%5oQ%^(|jzbP5E5mYsZWhRa{xoQ*%x++5t;<18+}laa9s)@LX)vTW4M zOBs2}xttRjt6V%>Mn)zLTV~z0Gh>01HNY+M@{;YDkAHKsoB!dh!IoVy7xtaUdAZ{z z5o~Ub2*{PiiMkdc9LQr23tU2h@rI%0g&ROqNfQ&<Y-3QnvTh|Cn&eo8l|pP+6J+2# z`;;tAI|JDbPz?~srB39R_{(o36b=q3Np(eqJ5b)lv#IsZrHf$#LgT0v?L=27H+rL_ zmV9<jB-?YzHkn?AG+KLT+Cm1bmEhXzh(Zxt78{;OyQ)t5c&njFmD3-Bf)2h)2966o zA$CaaIgRynDx>}OMeBgXFSg9Gy8wkvnT&}8Lb8p*&Z;tX)W=H9C5l3k*u(-)Ns;<O z`wb~KM6!`M{Z^a}Yr8E}AyMj_MRuh~y;~6As)$u`eZTF1*fUD4x}`vAR@hmBI;O|C z)Gdn>!VH~gKCn97;wyBj03Nc0l;+S*5ix_bff?qa7-3T|F`?N~PzTZms1QLGcAzC` zvYsPt58YAD`UqxVcvdS(#tNV@GgU4{pD*z#P}qhE%qjfu>0$4Lkp6tOnLQ9ryCgoI z$Vc^`Si~Ut{%lw6q&KP4bV@MpsZODZ+-xh*xn+8WD^rODcYrR9NfyH3q}(}Wnl1p# zCoyHwZDoEVl2OX{P;0B}ua*zBptN2okYh{?o#HgVn-ernc^IaGmcF?phw&!U-27=M zrYMf<@gZsg*qm2$5`W0iLgSRUA)JXU1P52t<Gl9Aj=Z*Eo5?QjX)PXjxz=Lu^y1qP zc4LSu*?F(8wY#_|>%u}j_Wg;28@~AMa}($OrFp`*`^Aq3zj%uO2|U{=Kipt#w~Cdw z<*tBer0DbYE)^WrHNLtX_qCyJ>>I<!n`Q#45jrXyQAloM9}R`gK`V_)+xzz0pFcS| zwshsh+r|Gf`@3)&DdD_q{KZe=3JvVt8dhnDRIvT{E3R*b-WDBeJva6h^WQ~ZGwc`e zKW=V#*`^EGh(u+23Z{_tIECtYbevO-Q9>ygCP*e`IMkF>X&G}*B<~He#tdS#OUgpM ziLy}8^cNUEEnmMu#)|8)NAoKXm+0O1CVAWo&gu#hbHW}UY$FuUMGDUy6dYnIS8!#; zTXR*6M!vab1=Gwow3IT|tX8Q^6}sw^i}Z+<2!Vi{bS)%a_Yq^Zw4gw0i5#{s47Fk& z7?+GQH`}L$kbblHU?oZ<OQSJspJ#WObOB)NbQi92-NALkciI+-12Icf-m|bFZ6#yo zraa29Su|3LomLb45lM$wN>r#MVlU6UNe(RFc0NKi88|rt(&N@L(mJ_N0$T-|-qrW~ zPD8%;su_R@7rK?zAGOlxz1!B)+U;AvqB-yL4;r`19(kn&%0^Ud1x;v*dZ93ndcT+S zslWXGhKKO_9N^>>pEt0*@$tKV+V`SxljD^aw7Rz%UwC0<(VO4@^Rvs2C)$m>Ub0_& z;q#@J{_qbgwDs%OQN_-gErN%4lE=93rd%r-J%9f5pAJ8HD&_s{MU$@pGv?rKmE8OK z-Jb>9F}yp?lXI7ce|oWWY3WDF_s6gB-x55bd2jw3Y8A2l72kY+{N+nO(-{98e6?b$ zc9}P>Vy|7%)zu4v<iB!}23KPtYF<lJbDFF}>ZZXMd#rc(VX#v#YUk-Op*>Saw_aV3 zIr`B>ncRSSZ~x+pKh<G-!ehURkonUU@%IF;mCt+677ZE`FC+RIO{Ol8R)5WdPC#w3 z3mjCwZz9Q?xWPLm3F(`qr`GaInJoM_@kA1;D{nOd+!bqXeu{eR{u~Ct2w8cQI(3MS z_$luf<v6cG&~r1yrgP_U-axKB#9kdIz1;WDa5w?M%%I2$;FPg0Q(qJy;vsr2M7XXw z(j3RR3H>J`s}s&o8|*Q(m<<FkW=;4~$2oEjDS)g*;t2X2B#wEn<|~v<U~)c{8*=x5 zEKB}}_wyf{|EX_&@3H9pt7wV(t`2yi;dm4CEa|w$6KjadKPB%gIio;PXbw``@aeeU z)P+f=VGH&6W&^w;LJ*UWz4PV%rys2KzM|Xr?OVw|F2k+N+aIc4rbp@pDiqm3ZcD~P zZvtd*ROM;+AuTQ|Z1pwvv#)BmAO*AdL|Z(uEr3#D{22cfWG%(4IENX>E6>%d{Ars~ z&!I^`D;tOhj&nE77K7zb|Cvu#PHjK%C-s-<>t#P}S<(4@@JDogjQ<X~(NXsHd%M;O zSHk=EMZXEkjr;4gr@mCay?tf>-Qzv))NNWj9}5t{pwid*r1QJ_PG{|V<+ko$xQBZ7 zcrT|kI=?Ka-MkimmEE=co2^52s9^uyS86LOin?V{wl7y>dbccq#~=pW>+rqa)^&7J zHN&`haKH(fUYn{bz?y5i#6%iKIa^oY59(&9o|J$KX}?8b#=3@+COy^14oaYv8!n8< z_2$9;BVBG0heNINm<ulG^re{YC2yAt;_aE72F5{?^)y?Tm|<5I45%vz%63qeW>1Mk zRxwqqaZ+LG^m40g#x`9u3R7crTVd60DbBKhoUsKO;0nJvK?ub~v1ue%DGd4WxYOKW zOkW~;x&k0;q&$qdp|FsnE^L#9B2-ox<Zp-KqH)xtgAS^+xh*b>0>dZe>s;>m1!!*t z30W2hUT#i(``E3$E@=KBtFC<4(c&AwHM^Y2zK2MkHcPc)<DMeB$S!R08pq^H!+;Xh z4J?_dYa7-xHoFPWJ%YT)yYh1!XzZ~AYVylS<}t2nbFklgu8<(v`C5cE5Uj*P%`ea` zVOyG9^l5wwCZZx}R;|O4Q_0BBTH@Y_<PQW<Aag=2X(O17oQ-Xf97KFCj~XKD+;8^y z*WFxDg8_D$vblC?ItPfzUEWy`1Ucw-ji=_#LIiOK)c0EfjjdfCVVmKd0{cGqmgByX zlWnKVhb4k;3&=KXwDHQ<2*4?D`5aie6KoC-^Wy|&s6mb#L~c|u2H^h6hQTcvuk^en zAOqD1FDTadWmD#!LO#TBfdY@Q9n`(@+|!yq3s%mI<9f_}fLyG+(Y|jVp~&8pCEIi6 zEyfqD9G6%WDw4OMaJ4cyb5F6pcAQEEX+-EeMU6h+uwS%i%C=uhU*PO|^}p-hd+For z_wVj8<Tnqw&V1;=wu%U1j%PR`ja8vL*a5T(R@k(xoZ;JNHzs>ErKn>Lk5U%qJ|rns zLU$s1Xpe=JdB_|%-R2Le`Bsd!ZXE;hj*887xi3xZNR@w>YSb_~JzI(a?osLj+r052 z3oJ0b3Qd>%=ZDx=AG~4zLD=BYfRMHOqCY;Q&~JL=kj%dF(?6dc_kNgme-K7tW!E3^ zjLdt1qBvWyhH(AJ!PhS%U7cRX*~pq7YbrC&{inFj$h?@n=8FRf5xdwwFedZ>12S{@ zQfYB-j~we>S+3_EGUN^zuxLKel41_;t=lNWFdze#&MG=q`|m85s4^>pRpOkY!OG^- z<uZZ?<Brc0x@CixHjDvS534>@G*B$Bp;i=@{A#K7uBdLxB-AqwIZCu^o5ZO@sebq} zduuz`69*CL=VnU*t8LgSX9P<<f<YLzK=a$6xrd*maC=)B(MxkFiSlmk5y%317j}Fa zpuxk*u&U5zwb4-0`h|+i6jZttW4>`%@OlSNQhm8>ZjVnAge8h859vz^|9-u=#*SOy zP|%o#8rTx?(IjL^%;L95M4{OtSY;1T<%4FIO)LlLWT7P-w^g>E$LJeS0an>WyNbFN z+zeV>v%u2fbE}5r@-w8EqN!eTcW3Ikyi;s_WhIV-Gn9BO6`dFgzaxlWyN<lhk8~OO z6%<TFOCe9C7BJgBqaBQYl9X;!e(t?08gk0nXaY$Rs2sRRUoSr|Hrr>Ca(9|Q;1OwV zTgWyc?GVXkd>moBtv!H_)?Jz=3`?;?7g}lCHix6pzvk->iiRq*qshcoDM8AJ!KAyr zPPKp(dmTr(vu^8`Lh9DUG)meP)S_ZEHQ}IL!&$Qm5=6muaP{6_lmE6EvU+D;qTf;V zzQOUqD$&Bwtn9Gy^`SRdO&7lOs~ekspI-M_<EBFN+|`2)A!g52&mS%{rQ&aF{qlLW zng=UB6Z+gw+*sx}=T1C32WO^nXgW<VG_j4#5Ts#cIz{Ex`|~6)p3T9jK(<%P;guo? z-E%4vbUIr`6mbOSiDm#oQzvpy0B5LdhL*w+T5i@ZVEnezC7`?xWsmXM3h+$3n@sXU zF{8pRlg0QmUU|u&pe;<60xbk(0R+oY;*I1pHX9UGIF+*d+;Ntkz}`F>+O~IvSz{<I z-b)V6uEFGMdVa4I&P|iM6e$WtD9@aHh~yp_1h7s{!=-jI;CDY-gYR4@vjPrp@5$GM z?n&|L5K^NqRuHMgx(ez%z*-LV)D50Ud*wZW+9@_^nnpd1=*L@Nw!Y%hcs|P3H#0fk z!oqYBk>X}E0hOxzyK}8(r*mIL(S$&fgJqRAr?Qp(gB5bFaD%YkvHbn)ifCh5fN$di zOnrH*bTtA<$!tK>0P>hfn;bHVBnTL-iwgZTmv@{HAzKuoK#P2!`2u2RW2FV=w-YpS z2NJmkH2WHamqd=`5#6}36z8LW7x@i0>IO^%ZphVU!z-ywAs?a4^>F1C63wYZ`1AqW zELFtN5)1jvNS?S^$0wZO73(&1n&iqbsKbwEdQO_`LMsHh!y-f{Ae&HHso@|#<)*Uh zm2|e1Sc&Uu$Jx|iT%?3Gr$#UetEG8d2y^Am(p5n;8s$US(L$QMN96`pz~nR+Owron z>0r=NAb~SYVnjQu!gwM<@X=4>oG_6q#oH&EWtpn_DB@BQQh8t)<FT^CgwVWH6qW!} zRGaBi)HrMM<`_1l<a97yoA#1PbrsJDXhY5Net;bx!Nf=X^Wj_RTrp6{AQXy)ECxwO zz{h8*%sL<y>3`;3BEx`4jhaS9b-*x(O>FV#Y@!$d(v_$Ps1gzt1S#3DGv#g@7osE- zq&G%QRsqrin%v`2(-l)ecLfTHxvB&dv{&bsq6bAOeihdyp)ewa!5%;bbLduRp<x+X z2r$gd1(nerj>)CX@QmCdnh+}#kb{CFcNNHeG*U`uG`B14oEF~d9B;pI0Mk9T^1ot% zXd=`78uqo(LbrI(LOW?8JLy7VDKo5u{fPA~$c<Au-QkArKYdq>7?9IU7dy|8a&M;U zx7^A+@hpDH*pZttl)3b^W>fNf86{I79IM01GL|*)PanuKaYps!$Qu)*%^B3e8nb)O z!Os#jFlyjrDj;vjShi!T?^&h5n*IN2*;8&`Mn)FItiQBSqq*!Z9_VYxBQHz-gO<&I zS60SaingUBaB&JGBThv5>46B2J?yey-v}Hknn0FAyp~I&A#PK&lBPFM4`??AI@mRw zQ%IeC)PsbRehfvJj*Ya1oIwr(&10H&XGn{5alph|#_Rzk%|hjYe83c5B$9|88a=4) zzzrmgRzhwFnB~q2!<0%PSScHY4}b&xvczqVJ0aZ7qU@${a1gVvYb;0v;V7~#)oHB= zWX+0A&+t&p4$%f~D{!{1jxH6qq01F!S1G)^#Tr>Nx1Cx%Fgoh9=3b)hoSN~W3sMC! zHS~O?XfYrbl9>&8cX+gjUO!5#veN=PMWLAvSjdGu*wvh(hHSRc=xpIQ69cL;0U6uC z{N>=TjiLUAB_2s;6;=tXA`V-~@t?XaqOt1b<w=6aLn4C?6mrnW5~6wef=g={6|VA> zND?*B1DFE<aapD_bS+Qfm3Sb082@|i$vxh-qtE<jQ%|7i`-qjo5Mcx^Nxbck-GR*( zT7jO|)Pp_IxU4}E_gjbv1GQz(a}w7Cgt4K4fNQI%;-0syNYx@=oj7v?7`W%Y+&@Bk zZ`aeGwpCvl`L_Cl_P4W_zWVXn569sz`HGkvZDs_nZLXS`QMBIq?8@s`UabFt@g43~ zOf(zmV5JS=Sl}6|e|`PW=RbM7?g2Gwc(w)|X3EdhfOo6PZ(IyWp1!qx)4KmWId|>V zHOsv3T&s(5lry@Gf@<iHLm_1mG^5rqg(}_Cy0V}{sIuPeLXAxRf~a(h3{$RcxJ(t+ z+2lL5REMV)xrsaHNy^1=AwtZu&*86a95x=&*IyI}v%*HnpjQke9i$G<NF_*}#=V5Y zG?8BST})M*Mv;eiH~6fR5xpgGHPSz5QR4u`0`>V8Wpe5~ML8Pd291jyRWTavsuApZ zrfOl|wZxa0Tk&hCy)=*M*DY~NqnLdNWjXV>nt$^V9I??QS9`+>kHXPNqn*6KhP6&H z)4TM}JCvs%=zc!<#XDWjSN3mt<BhkzJ$#+9bpJP-Oz(1--?yLr&AVTJII>Iqr9U<; zy71tKuTxw6tt0&FSFU{U^1r7SQjcHxutRxk#`Q03b?dUVVj6ng5#{_ei@xn)*AV|8 ztkQKv7Ow8@HLIlfYIt&?cRg+K*2wk;|GgLE$XN-Q*l_NLLu-WEF~99fcFz_ZdqmZe zc%K(&BBBhJ_08YN)^ta^_>bMgf;QpHqBLxx3hvVIt)<bM51;o>li|&jR=(;N>Cebe zl7rFn7=r^AF^-jw5cywb{Y@9`NdiIXGU_ZxG8u)~n1U-u#P|rJ8$_1Pa|G-95;H+l zl34rwbr3^Z;7}KG&T)5j00)lCJ~*b|J~i=_!~O5g_;nWW_uINF<=<DAf4A0aJG|E1 zSc;#rh9y_t`~oINsv_nHb?k9+n*7->SC6R|-&%<WN#AaoI^qi;eS~(iCAdVyoyT$v z4DT7u|C$J2`~`iOuA{Xd3Z=T|%_B&74RzaL1!paP0Wb#~N&dUbNyufTH_t8p^4*hP z{&T!Fb>IE7_-X&ka`9KwpTD^8{YSdVcUNqEN%`Y1|JbBWtxQ6Xz6+3#ytjILPc99= z@*xND^QQ94d4B(&=%U`^UPG2xD6`5G`)ia!{CwWglA8ez=6ymo^gbG)^H>QZ$Ox_9 zv&}x}{ZO}?9Feocowfz`*;UulQ?xOO9!WtQdTq(&ZxkVY4R4^IbrXlvVz|9umy>{z z!Jw5*u*4kPdD~3HgU8L?21F?m+ZMD~Jsp*D4zz&5n7ll!mOl)VyUIel83vU=HBw73 z&LWBI*>>wiv<HalnT3r-={=fDVMB-1_?N6k<IcBgM4sb#5V531{i=B6ndq0Bw+))S zee)8egY7*cLWA#fq|8IT8xQ6S@Jnr5m|+4&Co?St{S)7|zfj|T9Z0RC22b>Yn|Zm$ zInS{wYI^461BzHp6xlN8Pgip3j48HZ=Mo@GkkMTw#yHC4>5+VTO<`3`>_d>g02jsd z2dTq)SQf7jnG7HlDm%u@mKZh~qV3)}QcB-Kxa`_A83Nc034Q03bIeFXb1`tpwkkmt zI+ZL|2>`dW!E0Iyv-@eK*&s3d6V~FsM<%Tav~@s}FdZLs`3a!);V!OU(<5RdTmml- z6`D6rJo(kY-UjGM=NCWFyXxqXdgX+LtuYN~?L2&d3z=-^#pjj%#(rPx=lNC&>j|}k zn*8p&AMgMB?@M35h!`{1Or&-_2;|OsJF3X4(4%sv+?v^Mqi`bktUO~S>e!GTfHu(y zp%B^UgHLm}Vs0OB0E@mtLf~la%B388LAk|4<eptznTw{a#8RF2DKu5fI3zo3oB7~_ z5C7-L&woFASfEF?hZ|`xsax*`bPNCZ%Wqn}XBShO?qM{J$L}-Gaat>!TFPJdynX?S ztvP$^+&9IR+V`+)OsgK3Z$D%K`jTNnmy?P)muXthL#P^!v^_fAGOUEqAJ?;bk~Eyg zC1O?PPraJSk1J7Z;~10?uTR>#Oenn^K;l))Ay6Q(5e7n;@{B1yt$e@wk-XKA>0lm0 zk$W$EG^8?1ZATJOrL5W`c3Bk9p4UYoZKqs8;XoJFjoW1EbL&Mxz3@W$HX7Ro+gd9| zZ#zJEmOV>D#eD4W11V-g%DuG$8k+SUXrz9U*g9HpV7iL4>BtEGftO6&vDiV$>zWJ7 zLuPhpAnY;-c^z0_q+CygJ81g0WQQVv4~5&t*|H(Y=fc$D$6qaNQcTD%{%vUH@q@%2 zY3^?J2q7FE4hJhMq+;SIqqMi}{u=t8Kvnf$6@TzA#d?2tbdT(@7&T>eZ0=baQcFd< zY0?AS&>{yjLd3*aSaACJCIOZ5KSyb=|9O4de+_*7)_5eKUZMOfKPU~!&;R;)_h;+H z*7JGG>~hRtT)9NP`fHkWM}n$0IX}Kv5mtPDakS&;$G2^V9$YNA&#@hS<FNL3n^mKC zntr$Kqb=FZmGONwKsrQ0o4mf}1}7BQeSjnaG?$V%-FbqAo%Zo+AhZxtvf+N$=x9Vw zP%jr3oe_G@OoKFQ17;Qt`MK#5+W^_y-ft6V(LKZ9s&S@$ak0xUw5TBe(#-RurV)iw zVSk`moVkUac3bx%#5vw@SceLlj^>nKl<3-y?EO`R10f>_Gzv78QptqOct)&C0_Ys5 z7?eP_^8qr9s}#cdBBz!^l(;`NaeJS;$`@(tg*LEn9)l3_(R{cbUGmz_dqdgYK;9&) zd2+)nK%J37fOjUH7oOCmXHu4hEd1kB-faiTKtY;(S}pWO)^H~}=;@EV%un*W1#&dD zZ=OSAl50bQ<mO32{p7r7xAeextqLa8pzFisNyH#RDeNg%%gsbVpv0_gNBcu{xHEBu z92((>kl{dq8!DIqDb4DRpeSKO^9cA@cv9gZXigV|Y$5ZEHGqX!SOcVo#Z|MmSleW1 zQjA08$!MYkA%cT)2i(as!`clAWh(Ftq!J)Ug>&*Mv6hK=$`ycXV_G7vldqOB;L{zn z3W%<|ZKbk<=&As9G~Dv+X$=N=#L9x0%4iWyxy61{#cmvpW=TuSV*xLPhe=1gQJo}c zwS~I<;n|$H)gI#pPO11deHc3`wkj5I3cR>W=ATU8W`J}4n<{ujTpp^cWtTX!d%~3u xl3-W^?qO`*oijJWlg(JWRWMs93&^umSQVyUrt5dU7ks0P*O{AX`^~Xc{|E1by0!oS literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_122_states.bin.z b/client/resources/hardnested_tables/bitflip_1_122_states.bin.z deleted file mode 100644 index 6d04a3c0521f40c49329665b81155f5a26de4717..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32904 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 DW}?JU diff --git a/client/resources/hardnested_tables/bitflip_1_128_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_128_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..e02d0729ae55fe61b4c4435644cad4731c825ac5 GIT binary patch literal 6269 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 X7(V!C|F7=9D)waN?s_?Tz5Txc9Vytx literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_128_states.bin.z b/client/resources/hardnested_tables/bitflip_1_128_states.bin.z deleted file mode 100644 index 18d333145161edae31460957c3e36bcda2fad7ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27841 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 QA6>e#_9NiduZc|k16+P7r~m)} diff --git a/client/resources/hardnested_tables/bitflip_1_131_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_131_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_131_states.bin.z b/client/resources/hardnested_tables/bitflip_1_131_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_135_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_135_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_135_states.bin.z b/client/resources/hardnested_tables/bitflip_1_135_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_138_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_138_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..c12c2219ad3af5f9cc7b2d7bb00e7706f9bc3c4e GIT binary patch literal 1656 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 MHkiz_%fH|FFJzo{(*OVf literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_138_states.bin.z b/client/resources/hardnested_tables/bitflip_1_138_states.bin.z deleted file mode 100644 index bc154b4f79977594a08477b99b02f60f9918aa53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20356 zcmeHvZEzIlm9A5%z22MLT`Jc}SbxqYTo-m^Jc}KN1&lg-ZBQ1nRxkz`3Dn-m_82QL zUJD_EKHhAyUWZ_L>|mi_Ecz}gS++r%fRM%rG_T`;1|(2hd}xq_Xv}ET5+l)>8O=ve zcfaSJcSgcETb11(`y+L)riU&{)$~li?>WzTp649#%D}|XL``7Pf%nJ0a%I`ybbsl- zUvvr8U-`%X{rdxpjrS`bDCoO&!_U6HH{n`S(D1K+{^l+J{mEg_2~#9vf)V{FFz}CM zTXJdj7-5WtWU6@f!g{@~B67-AOBUZtzOoDMgTAPzC)gqwK0~4e3Il7!ZXlMfv(|2* znK>JWVf7|ZyJ^hq(*|f<I$~wfun($O+nb3B_!fL9J8W=<<~lVY1+9}x0g$z<UQ_Z( z>0UAZyX)0j;x<^JkRMt*z$7+CTcHMSgNJ=2?jSmh>q6wzT)_!+Gi%(;?jL~K9-$^h zqGSYyAqdrY92S@h<|rv!h)hBZTFHcx5~2_x5ptC#-BvN+7qi3PW$VK^2k0Rd`Y=TL zg)(MO8PcdG9a6zn7&;A!bC9saXN`m<X?X8bb43tAF{w_Xa8&>qa1}Cd|8GD$7gGuI zNrb|&4uZ?Me+li3=thsK8s#zDJmDy7IS*&eu=BIn`(XS8QaZF~bODGT()N`7Zenwi zoS<Eyu_WDM1>m^!1HIJB+hA^wgF7e~tZA~*3KP?&mk#HM^&u#xk*A?$FOyG+q-rA3 z9-!L-@+c!cNhQ~?orCITs9<u^Et_H%6f9tGkC5XeEVAk2=X_gt!$J=mH6jIP;Mp*Y z+gUd~33zW9AaT=U((r3Bdnf6G-LL?hOf*#}GRbL^no?5Q$|S2_WQr;1!#ky|mUcv! z&gzX-eej$J#mru2)<P}JXHko4Febv{9Tg#R0M3Dj<r*F)^SkgPDLJgy;(S+j4}j?v zUh5-2w1<SYy^^*wH(R$(Nl%=TeijtEFr>~Osfat^&y5^O@UCHN62(oVX+I>RG`?39 zSHMcu+0+X4!K{w>8mJ$H`<QdH<w%ee4DWP<8>Dk^4KS<(u!E0{%lv)&gsp~*$ExDy zV_Pi82hb1|S|jR8R_4@QUbtLr*P$fp42G#+7s8?`zY80dkf8z)x=k9-0aGm0`TDdl zIVFVP06YxR0+!eX#X(YhLON^KCvjCFb9i2dXw{cwf0K1<A#4iiP0Fdck{OSLQj*pU z>zL-EFLpaf+;x~tvd8l7hxb$NJ+Qctjar_=WI`x0<ie_eD-mfCTU-zyajl45DhA@z z_r>zIRcDj;{7Esz>PPuTl}|#G>E_G3kYSW|LlnI9uO-|Axf#AwN5(c<VmwCsAow(> zMqb#L05AC2s0f1zh{J<xVN0Ec*;6u^PM`!_P48C{pKdCDaC3(DK>u7tx99QT0SAaW zF(CL3c))o84uPA;MhF9H&yD!ec^aqR;2cn@h}Ik@r<>sc|5@{&##l+O;r>Ytj2qe+ z$kFhI+QpO)whM7+fjwD}1H-O1D4k^eN<SIYg>oNJ?jXw&FafrHHUUn6?=gG1sXYSz zF6jHE;P6S9@pjy9e%QVSU%CZfAIG-$2sz#I6GNKQcaCgk2i@_+N7tjX2dQ04Ou+K) zT(|<orv*=hVoo^TfN^P%;XnKvcIQ9A-v{6!Bc~3&w?*%kZJ)BFz-IBgreCeUVC;Cx zzjs6cW|b=y`u?gW$o?K&Gia7Bq;5@L^nF>k8*q?3XgS<as*=ub!8Q+6vwX~SnL<(s zQ$=?gbp2K)f{VSifE7UPVmvu4u{qorBUd00A#s=uCy0(m*p~V1*zV|Rc<#R?n&F+o zKC*F%plJV)Z3v->U$e%~V&WQ>V-0Srx^|c?hQ=rKF`Ef`(iSBB7}R$`zu>WOasC>Y z$!R*x+G0~`wR(ljo$=iK_>e{WBuOK?G^6%D!|pDJs?C;At5)#4dX)mpwF&$YGMQP7 zpL$<n_Zp5q5>IKSR1_>@vyvnX?}UWqs#FIH;yO){N!PJ3t%OyUt=J5hN|p~Q0&;t> zkvtm*Ur0O*&ylcDlE#s#mD{D0kod9+O_*m+jy*}-al~Xyvcy9mv;J}Z@qASRBtT!+ zi2~<7e~8ntSAutesc)KNOIcquT6xR^6K`9%Jg`pc@zW-?@re-GY|vjqJ;^-#<PSEp zl?+$s0%S)xI@GHm*U$=<!)%yc!iee7p;yIB8MSRa$Xr%a8Vl&5$T{I51I|t@@ocP3 zL3rz}t@LEDR8yRm_ZZKg#2mT_0!Bor1w&5^MEWIb&V;Q4CRcX}AF|Mh;Hnk2LFI&K z$d_14t&$9MnB)HO0A1*H4%si1xGm@i?&uT8O3wg$(42@`<*jOYH8g0#FWCvgXbvb{ z&;{FJcL1vuMd*`a#_Y(cghejLXultpx}m87ny^guLEqi5K33J1T(xc91zd%!dE#M~ zDW>GGmg|0!t&Aav9)&bmcXM1jg?Hw#fi+eH;TZfqKGUobC>pLcpm2DKCcK)RuaIM~ zaph&za7Fx;EL>ImfC2?6VQ!i^sGymxPl4x?h;s>z8HcPMYAc7BDrti0aL0sp%QXhe z{G<>Z=HGe45~GYf4||rd?O%lQJP&ajxz%m3dXnvF4LbZ}S4w<GVDpYG(_me`_pC`i zVArnE&F1=cNVb_l!*dV#n+a~?ZTC||#cH9KL96LdXwB4f(>Kh~;>{MB$h#**`p&^Z zJtVuW!ZI_@Y2H2r^6g-3fT9%bjY%@x4zb-F_d}hC`>vaDe>?OD|4XV+$wIhySvKxN zl-9wJ--LdP?{GUb@$xrFqoi8c_P4Jc@)XCzQdHCu|3jtAWMT3S&WOIAW<)MVYtoFU z4tf}Zt_+LGTNRNy2%1uTRP2H6?~@+Tw}4;wFT9#NsmFRJ+=nZAQ|CBRxhhn<?`<*} zosGyI=g2OU=m;YM7B`{XOmCzhBIWtAK3o9BR&7ii*9@i53)?MrDgosQd)5WwR={BP zLzcnh1ledx;al}il7bX0wA>cb3?^aaFPeh+AI3e3WPaIFo77%)_EJMR8<m!;B((@m zG36@VZ@Mhy&}k?plN-&QdEOY(jkO4M693C?kY_{r8EB2r)~j-Vxbdb%%{iXQ(3dKk z55eSGeVovo>#zt>IboaFZ&{X+$gZ3R7)Pp6Y0$Hnk4e~K<klKuoI__^ev#kcB-Z9T z@p$eusQ4XjK>1HYJy^!raWgMBs^m;Sa&Z*$evOO}$zTQ<Ub=UmEN$N<vm-I7gZa-0 zLUVEOt|dU%^t9-h?4E{3IpV`lML?eod5hrDy{ulgrT1Z0<#~u(xiNAeEURIJku9dY zfE_5PO65Ec<QQ9;{*p*~Ih6esIL?r_a=kiyq)Vf$mf5hJ2hV^*hNUhDy+OSc{skG7 z_(7U$A63ch$X-nt7GpXh#o#^)70?TI+&2pfJ~KRL#UZucZ5@ZR3EL`8WtG>!86-hC z4yVIuQYT`dq%oo`jS;(%fCm9FRnW<Vi^b@}-5%yk2^I;#Vf=F%*YH#t3%2%=7dX3? zKCooXD0#v1O&(%JAzepY*ok2<_O^Nd)2!YskaO$OOy@V?>65j}swT7Px<4QC^I$?I z;$BgJ?2ZmdJgKaRk*o)}>iGEtyr3_4cU*wcxbRE3b3G=H#HI*_I!RL*Qr-;*Gqjv6 zGjf8q@(yVUyty9MUL#{>Zj-t7Z5S#*y+IQLD;Qid3$~hCDa$oy!^0}cm&HUM$PXdF z^$JkSgK-2Y-4wUO0I5c_g?wGf4>x`n+2sz1OdazAa7_F-T3QVM?59`{LuIH^XouO( z)C{->+@FK{r&Hh#Z*Xv*_wT{ILk~Q;BryO=f%gTgrm$X?#vWm{Ubrtc8+5qGB3Y0H zbJN5`W)U!{W<NPsNhvKMx?B~vAzi4n+%dAS4|KNL408hBDx~}vanzzK`sjMqAQs$( zu*OrJ6QsF#JA69aIk(jfoOh3q_^C41z1rm5u^;l7!pM;kWLkHI=s12nUcxhe1kND4 z!>>iS9LT(352n0wbiZY52?^b;-zDqXVcjIlD&RV%JPN%A-f(dn3zMrZ3&vrj3wi~; zeuCWHLE>d`WebxphZRq!)N3J~%xS~ZAkb>)zUM#2f_+iBH`1~yVGM>RZFOXPzqO>< zFi*s_?$1Hsj;P#Z+KnCQny9u3n9i@mvP<M_lAdNORa(8CMWVN+3*VPBsea2X-=DXS z3I|zhqb{TDy}UqVABrLBIzv-TTh3f8O)PKuw1jmtGA^xv{ty|`rEo;f>4t?+xCrLJ zEDSTPj14kp-d^w{!5FRvq~CAgX)Pe(+F;p|@R2E52u>NHW=^r5%8`l-WcP17Li9ZZ z<N{evl<$<8ylwG&u;CS}wgy%L%B4k3&;uW=s!H7oB%9^v9Oe)~;_}9uaV~fVI5ysl zb6G3Pz|BEY3L5O*F4i5oOl|8y4lWe=UA077O0}9cE3+8?$Nnxk#ddSdTMX*cdL4Wj zl_4ETxz6ei6{;(lo7t>6$RZVZ3Ve6K-$J4*EGWsAO-MR-TM$moo|s~toD=<{DLn#9 zG2kFDLiQPAieOc%T>zN3vzIXUVwPg;HVjPC5O<rMHVr+AljUA`lUz_y1Z~>EP+{f( zeF{3_;Cxk6mXlJ+<&A&QM97p(z8YvEV7bHWR1(nN2hWS(z<sF&{N^y6Nt2!j6!Z=N z1r(fPoN1=>gJ;NE_%|%n1LVE9KsEW_VzzVLDHrEX!#i`UNThL9r12Tug)~MeeGqd& z_=G9>0!`?x5l_2VY!$D!JOWg1t+GsGGR~A0mG%qJ^czG&<uBX*v~_Db53Zz68-Mm7 zXa1o?(7HVAXxzj$JZf?Ak}7)?zPTRi6SnI2)}+NnIAxpO<|%RUj9EKo+#09KoCMr) z)btO*oE642&&Cf}w_UaB8S18x=G=kilZ0YJse;9E(l$8XfWL6VsO3Z6(2C`J*XIO% z=_Fefr(GLKOjuJjWJUw+YkGR4NW>o910o{@+fomZN3EY@4J!|mhNv7E!$KnX>5~Za z+)>$gjTo#kCG;iLXfoHdEoSPSq;H;J&1nIl5cXLasGw+AaHzmn^NLA*XAgb-gziq1 zk3_{L*q=^2u%f==>B>EocYlTHzeut?J#Nu3dT+?EP}zhF0#i%^Z~3F;lZm-~wDU>S z^C2pyapjKBab->%ir{ogE`&O$IABUq@Tp`Nev9<G{xlhciTo&}_0-c)duIq<_F+}N z_O`^{>IbRm3tF+>mu5tnfJM75_qP#SP}#=%($>l=5KU;P<z5{eoN@Jj0|WYPQB6Rr zvPb%8Bs$TfjIOTAxI}tD`J}ihTIQ{ROi^n{?cWb)!-;Ub>?szp3S3a^7Z6#tzb*Pn zO{eq%Kt5~X@HAipAG{^zR82n8&S*T#6%#^Z@U9tC{Z$Be`xmg+uY>wJSchT0rHrOz z6<&wbX-<Mm1GyVm4w4lPoasY2i4M}Qb*Uue^4jSIGxwXQg3+qkVN$%e+j7VR`7L=G zerzJA=GNs1mKP>;f{(K{)P*Ww*$!eE=T(2VANKBn`|HRxG#k(!8sVXYfN2W|obyY_ z{aQ}`mvKKbsRxRK&QjW!^0%j40u*a{taZ{>%KGvR0R>yJGp+uva`m?b8mCDI$_z%6 zGH_2f<Km4=y=<lKE7Tma@N8Q5ErL~9<enfwD{j=#I^w?qVF9c`22qDVZ~{*2QeV{H z5rdYr^pGJ~<HYq5xP_PIdr{aLKxd7vVV*VS{b!JI;;Lp2(w!8v*}tzC8X#9<TH9VF z#XWMT9VMjhHRT|%<o-5pRQ|xo(S*%45!Z*%uG2u!b(yR%{On;5j0YF6SL}lEh>>(U z*+);wSiBOu?D?d@KN@vx`=bJ0Grk%*<zb2Ol>4k+dpYB`TH+fq;w9f86`&azl3s~^ znD(of)32kCB;<gIA6*I4s(ovKhet8;SA+tuE>)t0eEAy~JltBULFpqlb2G0qg;rG; z#)cPFH@y)*5=^;xc=3DIL?UthMevQM<d^52vDID|W_Li>8eK;J)I=u}uX&@1pvo@7 zT%kwMBg$nj7-EhlS#_4D4qD30L{r$Y859O@P2dR&c>oUipfF0BOlMQFWQ%$KO=SCP zQ;yd<Y1Aw^Y>uC|*p^4F9MxvLNL-<8a?mm&RSI(-HYaB>+G&<#K{vZfMv^GiCb+;0 z(61$=?=pJ}Ij=j5YN=^{=?~C&$EcQjfJ|&)QB9$VGqv=ZKcy8#-Cj8QtIsRXyXbM+ z4D~FUTw)n>95bW65z<3zd*CGSdSlc<8w}P=nL_~@BS-iNN#7kLA8uvBgJ^Lg*F*YI ziyS(`A%7$-6l3D^FKH?F*mIU2T`H`!EzolLjWKdZAv_l(=QBPPjS>#=zXiz!D_O0D zL5=FIWYC6B$aP64bdn>Tuy$~ox#7>REI&VlvL4$t4&6((AA(4GLd)?($=0;{r5b5@ zMdqQ^idW-n^sB0Ph&<1o${tv_rb>mM;x~04VfC9?zfOuI*pJtqyc1nx;Q}1&6ndcJ z<v*fjGk1M<H+BK;En^Dr%Ww(tbH3we(3`(X>`@q(&TzZ+O<a`)Yys=$vRjy<pZN2S zO-<KjT_b;aN-7*ivZeUS4dsb`zC3blENw`l&6(qY{mC1itLt&q7KD;P(bDFCxCkEJ z#$cV^JzYhMddMEIRc0L5*&(=yUyWlyR#ut^*sC*3oFV46+jl2+tSd|~s}FSrFQq~x z6c@a9DAB1z-19j1JIi{FT(QBdzeYE)=qq}CLP2{4PEQEsdbM!5Tdq2j&GrP0KI>+! z=QlO&6D3=rdF9?e?&hzh<XcjO0_u9$Q)!8lDJ4IppcCt~oI_z{wdU9%H29yiay)2# zEDhxv0Z0mw9D_}MCum!Z%I%1e7V1aLDPy0*28W0k{LYZ@nb<Q-SXOlew54cRp?#+p zjMm32pP_s+Scy`U45>EF(;2a71C&Jk+!<!jBTmcp0%{-BOygieBur<&Bk_FRkoh%l z$fz;WX&b&1#vlZaIPDKeUxac}Y9!j>JR-zWjjk=Yx!_JRxgnT!25PUlo7oDV(qOop z-J+L-!ek=dD0mBdDekk$+a^HlCUL7^Z0fl~CtcoUe(+ZX4>HFROWH}9IiQvLNQ|pY zcsER?xbPk~6?C+-L@AB?n-KTm7dPSlo}^|z7C~8D8x?=d-Oa@?s4JCcKpFzR!-m4G zk0aJ%@F(kEE4i=y=<_zDf3Yh0C00CXKIRV7Nh_z9m#)Mp6zC$lZi=p93F9I@IvYia zE@GN3;%442QmQFA6QqvR&0&vAqHTyR@1ETxq><`m8GHGMdX7L=f`DxoUQ}v1jO;|z zY4K$?GTKTM;muqxHhIWeIKjLy5j3QWnp6R_3=TbMB~siO`1T;4D!|_fx05%WW@DyL zHUK%;MB-8j6%&8U&l1BrC45RQZ@Z_mYUN>=w*)@G9;`bmjl(>4v<oi6ylxYFVoIm5 zHORXaX$vpy<>^p?4YYJ8GK;-?H@Uf(K0c*#{pxp&T&YH8iSl9QMpQ=A$~&MalxXMt z5x_2|SMfj=@^S<V4{Scdy91)>fCF)q$v@?_IZVT1r%Alnm&@P`o<F*75<|;9O=91L z%Ja-c9|rO&?+fVDZJWGrr_9|i=;KmBTDAXY1cZ<>=co7K(;RDB=2qN;Y^vywv@l)^ zlRk4c@0q#w!1n883=UFL#0nWV#mOYSo(vgAF1lw>Ge9GEl4Iqp>|2`79%HK|Ih!4w zmonsp%>vxF0ifUTk}T^&Wp-*H*R)r{{Ft3Zp)v_;SRRs2-q7KsE(k~u5hEN093zn4 zpsyeyrtZvi`WClT{Fk+4NwH;KR{dSdwW_9=yELXSGZEBdQSIEILF}=PDSw|VzQ|m= z+>-<8eo=jrJLf|P1sQ@tp1^X#p9FW)Hq~5r941e(gMOnwI;%e>H88BM=ewjFUFir4 zDOT?87zUI}HOLlJzz(-i!Wv^{sndc7qA*~yq9h%R)9qR0b|$%;R0^282AaM>mPcJT zbqJM*m~8ynqoOBnd&N51q<X4w`67ee?hwg<yTCrY0q(QbPl3CZ2KTf74%`R#2oK)W zqIm?vtS~^v4A(vqmO$$T>@VU-LYkPQoqU7+tRm6`OOCSrn^}V=M*97b54A<;Ig2N3 zoPdj{mwChu!qI1~!BT9!fZUtzzbIHd(-RK(beRzc-hAEZWDe{*&~+yOn?I68g6QDY z7NeO*5295?Is4<Cao$U#*h-Yp2bps5B#Umql<zn?0P}HpVcm+TufdQJk`Jv$9YYrY zwyE%%qL2-pk&8$ioz3VG?Gy%>zt?aO2W(Vf{BEc$=8X~$kY^1KPzwf=bo@WYg1L*} zu6e@ZQcCa6g<jo<KoDq`#h-xp*bNYH&xcE0aEPWm++>r1_SDBo=W%N;I)&q?AqFo7 z?E?9Jy71kAgY(}`8MlSR@^`>A5?W<6=uWjV<D$7=gXUov<=hEhOH}kYeeB32H}>n` zb~{uYM$xTd`!51l&?m1_=>%*E>ckRKIhT`8OT3OJ1iT}iQXl*?xVUF3P6@RWBy-pE zj-EWL_V!ChS@E{D&>Ax<=mLEl4tR=E(!cu2THO|NhV&24@s8;t?1KIt)Bt&VstM|V zOJBgbW<--O;N1T#O+Y?^B&_vn;=XZu?7D@11FYK{<#*Mq(o#z7hUunm>Jz<oTw05m zheYy?8buebpe`zIhWqNs7N%TOaaN*Nh;&Z(DO^$Fz6+w<FdoSFpKB?-c74ajL|I zOfxF-fD<;cx$V$^>lYzgqtG8Ey#Z(sxHV1S?pfZ8(B(A4*LCI9W2!Mr&#TNfl3LrS zCMaYQR>YKIfHg^+cgaiWqs0O*nZEPslKI(G$;6g079`G@=U{eLg0#_c#<^90obY+3 zWNs!+w9}YN2U#v4mHT`Gh$r0Mm<<axisKg{YOuTVVSdK}xQN^d74UFkE?IPA)@hZR zZpn^AQ!H98iCJX7(b`A*E)XNC)T(}&&oM#A`NWf!@)bVwH1W)zwr<U|x0>Z+;uX&P zJyqgm?H{VPTpN)(&jE^;X5x!Fdt<^j=zZbE8ZItuZkXQYX>rj>c6-S)U@UnV+y}eK zkR=>CJk7H)(m$?w<+5-Mb(4p&wqzy79*T{L1T6x`(Ysqf`F#p?@Bw#J9P~i(=R*<V z<C^ds?7tMxgQDPnuAAoC1tnHi3}GI8@U0J-M<X9XQ8meSVTv9M5O3Hqlxf2UV)lV4 zsNkbG87KQn`{R-@W_CaQE^MQYY`Bo3nY2>`a;)tS@(%m4?r1*=nW<K8k59=kPnG|R z10W5L6Y^uL_<`0qDjefd8dpC199Mn}LR>xo<1s~-eO<^6$&EpRF4JQv&5s}$qn_G< zNOF+RP<fb}&uXA;-k-WzE6(3$az>O1SlF_hef<GcC{3y}(^g9e1X#xf@uLn4I5!uM znt^NlGBFq@UNoGYRx{=zww#e^n40SR>Q*Ed5qGL09#+!kbUlbG0R53#US*qNd8+=L zFn&2%^#=)Qh)61?6H?xr&d6vSR;UE$JoZ`GbX)ZSEZ`nHVuX^!<je>Wo|$M#q^au- ziybw7Ixo?cuyIv&Je3uq&FzRXB`RPWb30@Amope`?J<d9A%|PqmL_t!3~?ZaBN)6F zwID+vGEG1{lfN+Bb;5jL(Krj3+l#Z6>t=P~&C>yWi-=k<Gmd9U{FoWXn;FNO8ONI$ z$D0|)n;FNO8ONI$$0IZ2cr)X8GvjzO<9IXUcr)X8Gvj!FBELqKHk4<^@iM;p%sAfv zC%<GnGmbYijyE%oH#3emGmbYij+dTz!~r1QdY&1_n;FNO8ONI$$Ag)1yy^cTWo8_2 lW*l#39B*bEZ)P0tPx;r#X2$W@{~P0Yz3;*-JNeP2{|kI47Z(5k diff --git a/client/resources/hardnested_tables/bitflip_1_145_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_145_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_145_states.bin.z b/client/resources/hardnested_tables/bitflip_1_145_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 zcmeHMe{dAneP4}cs>w`^CdRfL)A-1E5}Xo`AQ%KjX32P5(%P+tI*h;+R*jv?gp$L> zSYU*nX52|kW%=rHY`}mHLsEeS90Xzk0zEmlBz{SYL!|?Ry!Z}jK_}@rR;#`J@!q%J zcY89jr}jVXbkZ4CGj}@O?%TKTeZQYyT6cM<_tJ}lM<+<<H_!QK!``RwoAHgsUC$mZ zo1^R9zi$8Kk6xSn<l066m4a)X_)c>=))<oS)2H93!>GQ8It?_vFsAKTa9Hn%hTVkQ zK~k*+il?SFQl|v?J{KA^a?dedLfD8&9jl1P5|9{nufP)64+9b238sHZQYFXxm6H%Y z0K@EcJLz_5X}8L>m=jLNn!sJZTsKK4d|aSZ>iE7L=D=Z?n)0GvBQyg3HPx!!rzPlr zDlFb5du~ZFJlh1+NnSE$-Qb!F%^f5OGkC0~u$fUt6D4>>fxN7e;iW@>m(8e^&qqHq zJ{wI!&2o}@FNmXp)WX81=Hy?8d!3-gSFsA-zy}KFRkLs!-?l(3x7t)H-Msl=c?w%b z@R`Kdys+7+$?vDGEFI)E`8%No{~q-4p&DeVS`UwgW6$v>p6FJ+yz^u~4kJldJ&i>S zB1wZVM2vQ2<F}8i)1Vg;@)kHiQqyt8MgdRbDw8E~RO|As0?o{m%3vx<kv5A549%Mu zh$o!_@gi0xPkQb5VAx8m2ev^!`D3br=asR|G<`sfVbNQgX(~^WT;dXmDg0IuPM_G5 za2ArZntzW-Dw)RdBrgY-LT;0v<w5d>T@N|p1W8)QAI_XANveDeAM<oTN`$?f5t)^; zJ{$-i3+HJBvm=U6;`omgFEGhZLJRl(B7Rey4kP{pt>!<#S(I?8jJ+k#e}~t@1H?Y7 z@XR%xa$o*cTW-TiZpPEA-GD#3B-N2!d=K?%{XsfuUl3<|5T0ZU#gqI4?2!k83?Fhe zWTu1bR;U{C%n7|=+VKD=T5`@qQuW3+S;clY;1XOyv3j1$KXSCVQv`iMo&ZrdoHoIN zO}LSPL$IAY1AH&2cE!uyrH$8ac+}l+h4DoOc{B{4xZ#v2$zHewO<dG$$|PoFCRfx) z2H_krOG)()bgef@erE-(fT#|F&s+iJEN=w<z@mC!G3<c%Db^4^9`q1@;?Gy|coIgc zcz+Tk>CqlIqjCH(3rT7j>7>_!tPzU}=erHRzUp1D1DTZ*buzZi(uiU&h3UA_nJrw+ zKdMhzcBCc}Z-{IoPT<iYm<N}fAS)$USdy;X5BJ!V&FK$w{3wn(GW|s_**xL+<wWaA zyt!CxJXZ5ZZtq<+Zr%IT!wSIi#}$jcY8TFv7L$o>jYJxO?JR1C(>o#oT!>W8AbgB( zA9|T~bH<tnFG6&Yq*bG2Is7I6b-E$)gj;FQn0I!$Y}`E`evf@6Y72I#;g|dRJk7xU zcZo`O^};^q@ge9S26jq6={Kers-xJR`*UwQL>EJeB^$Uh+wpvHT(!^Ecqe(0mEOPt zQZ=GO#jdX^gk0%2mx$x3@46%mD{-CgYSU~PA%Mr4M44WJGYW6R!Lf%SX9TMkJ02Ip zU!)d$o0n4zAEvRUZ{c!U@N|F>Se05^X|6R&vgIk=^cMOhk86D@FdyEMrEb~Iy-u8n zlf4perEA!%V*X>t({WZf0DB(Xy|}mSv+#5L2FZML)my?P2b;3RnSy1<N?@kn&@EhZ z5RwAt#A@uLZ^n9L$swIQ;gxuu(U1UlX_SavDC2&C7T{zG6xNE{)umKQ)w5hVLhjXg zk5>e5y+Q5#@yODN72JgQb5P(jtn|8~@40_&XpHh#Z2?dQ-W_lUzjPejs*-15in(QU z{j#nD&?vWi7a(&^i+xxii;akj5V6Dw^Od5)#!z7VIIXrf!~d+3Yj}^VSiCG?E?|B6 zh@^=7FL-Yj^L4iQFg^$~<y47E4;@pAYhl#-As~fSrsQ^u-8BqV%o<FEK7hdKwxD%% z$Z>AijaeSk-H0J4h;AyZOS7pV<G?iNT~Nv2S@6jTsMyFWe*WNGsNfO4-qH>a2RdY? zrV&Wed8&4TtJnjv8Uz|UY{)wK+fLXez(GK<8^E#1Qm~vzKU3I#_$D2;qgxqVAT>j9 z5`wB{aXF47A+Glz#)v5=LU^OSZS;(R7-mx^*g&bA^P9(ExC-7nNtyrwzLMoi31p>& zyb}tBDd)#b&5nF=tMjF9k{Sv~Of!gC!S-foUUH~Uc*DqvV@=vXQ>7#x!78jHm&wbU zh?m?WSf)Ky0e6kBg|}5`fA7S0*ns;`21&d0h#Ou+>lw9!{1~)*Y9)W3FM+9HqSS^B zcpw2ccsb9-?#_ZvF-dt(RbpGwLGsbp5ncEW(cK|B!2@@Q?!O_r8eKu9Sq49YNwb<Q z*aH3G^!+4CGcQPdvNV4m3#)LC#x)<)kyI1ZYpq~N@<-uqUu9iH%*nkDLR6GyC{D<e zYNN=`UB_Qdp;+ug%pFFR@yRXXt~n>OEX=nU3$kdvj(^8j3yVR>#v4?q&a=pycx)#~ zn!e!4e3quwT67PD;Zp_;eRSZlX6N{r0<AX61u-I-3fcKP)Sb~Rxw<4FW;YEH6*b6T z{aX;E>o7+^c51F7qfC$GUWBYPY34aX#S45iv;3ALT^@uJe3AG4RH^c-QM;eC+M7>S z^?$dTuVe*cqB_hC%R^_*+EhoP9fdmbWD_hgH(VA%JM5Bka857j51aIsZFQyRK;#e) z50ie`f2MJ-=l@kDKLHs|x=?T$F6yDJsKYYf&nEB4)qIM0fYX7=Pa*o(`l4#w)&8$L zXNSq3Wq!SChlC)z0@6;{EoAYBrl5%$DEAJ{4jr0}jJkj!>9vOLhT-CO9}hP3D~cB6 zf|g?B4K!ZFvC4ZvVSM)~lQ@a`2y{`3dKQ!lP3Nkw4UyEqzl87$Ghu+iOROSUevW7n z-lka%G#N#+rZG)59*e*lJ_Sdgi|@LiJEm;XX+IS{3};rzKS(c!-=eIJ@Xs_7v!j<8 zbP=_#@vklT6s%Qz1NeG+2u0O0BBXfw1{%p&O%Uq&0F-%*ePi;FU1713QN9XtkgJ?L zWHF0$llf41g)p`zK@H`LauY=lWHb-eVIb)|BV>6BHJi{j!gt-Si44iLDcA$Wa0Ko_ z>0&A$RQ2QDd|nH~WCzN(G6=#pnGYn+Z~Ud5<O+P~Rj`_njlvw2kYthJtZ^!aH+>7{ zDs~Ob__|)a`%kbJcfa!bPuEWR)omyE)qRLXxtf0;eWWlQ86SzYdCISERJs#|C>v)X z;`yk+3kO0DVnEzkfEF%+9fM}iuk&KEz7F=jc%6Hzy3^oPso%<x25Sas{0dwYeJ7Ai zC!>LGcrZ%sLSiVHY`}zGCjU*PSqiT)eI#0Hl`!;6hvVw-LnS)&YVlz!@-FPQz0jxd zx~Rz{SJB#tqOFNQ1KFQ~SAOx2P|h2ull%OfuTfO<pv6ggrPyJpR&IJ4pOl&S<hT(a zP;VJU1Pfv3C0@!$(aj$qc1_Y*!@rAQWeOjM<`e5g4|hWLd9hA1#`YrQ?nJxigb-eB z0jJeQU|ua%$+F6CD;s-JBkx=RmaTT<NDgKU(roxcy8aXl-FDYFotjN?Vy!*jwY+fH z#GB({XGRK+!%&3KtaV43jc^z^hfUGqY@621a0dDy#SkW0$uRt>$uEN`e$3&w+gS5t zFf>nk;V>9ZX{!EXOfoL(+u&YZ8FjX9mYj&dTEuxsR`MfL3w5Z&uDFQe@ZKR_-j!Sd zXkf8Zro)V|yp?pr8C@%l>mF@$$Z^<;D|6MioESPN%daI(daPYb;GfZR(TTlZQ3wHP zatFVllkO|vdJ3*{a2lphIs3qmP|zZjiu6Ou^e|Eq8ZGR2^cVgjb!yizeaIh6AC5w~ zlXl(U=e}7iByNfx621<Po8A+?>k`mCACbE&n_J*_v*Ddg=#n{6yp%nVBnx4Id4KD` ztO@WJpF2Tay_I(!2{L2<p1*<qFH5eY&@FU#8OPNqW3@=vIp<-`sG^ftMROH~S*>{o zVWN05vXVdT3wYcv!F<w@OR%0bq(`-WYKLF)I>>mIU(1siMPW{r0ca&2X`awqz6FNC z#9~0Pum$gq0_)31bw?%N=E!^7kEn_FU&d>1hX$SDK0h4Vhg5y)k1(RdZ}a^Z#(B6? z5Bu5DI{uKjhb1F#V}esiRx<(oKZ=L0rP|L%GC@oPHj!6&Z3m03@EYl6+h@8t&B@?u zuoAR9M2;}{@vN$*_Epg+db})=$r_^d5||tDBgh@F2`}6j4_EOu$05{@>7YTMF)pH~ zBc|E}b!*`Tbkl9<3R~rMy#LEV<jQ~H1wTV@5LT=QUc<3^92zAvlYqHXD7{vtor4hO zOaB>?jBMzq7JN&XP{ehS-5|y+B_qTvnaLN`A%=A#_bp{(jOK<1Sr5y*4zWZ)T8yl; z1acT%4W^~;hfb`jFKo348#6+u4jM4x%<w!`kTC4XM2I}-?0kk}wbYp;BA%Px1%CJ` zFHRQpqT-wT26cnuYhiySmnZzs(v|<uqVo>XeN}XDhv>3q;s1!}is9}6`r1NQJD56& zkx3DJ+@8kZN4yAKoFn~o2r7AfdK6WV!1NuEvl#jcn-fU#EiB?^keK;#q$AW}*#Cm! za7<)kdOFZz1YW0^#1?b%P%88e^xV!6G2oHUWKNY@jC@}$h&U0$dRT<UEgR8a^_FHw z%wl@=iW3;agJ%tc@(3)7rn;h-f%$H5yL=XBg4w39fdBqm^nh7%y$DMIXZNa&2~f3J z^!J(nuBev~vNvhAvyh-BY2jni#LO2e9?fVBbIO6te_f>W{{*@jiIr@k&SOW^BAD7q z2hACUIU`C!B+AIYn(eJ9UET?gqh>#d|GAlZnW^t<7c!>z3OvWl=aC=6K6qQDkv7#P pwI;j-GjNH&bX0$@lJ9oFPWA%*F>jwo&i(IZmEUA}y9S;(_Fo_fJi7n@ diff --git a/client/resources/hardnested_tables/bitflip_1_147_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_147_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_147_states.bin.z b/client/resources/hardnested_tables/bitflip_1_147_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_148_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_148_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..f9760f6b2ac9557a226725b6d04a38d33b103590 GIT binary patch literal 3546 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_148_states.bin.z b/client/resources/hardnested_tables/bitflip_1_148_states.bin.z deleted file mode 100644 index ec5b774c7a3afd255a821a092c9a2cc6b797b59d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22543 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 G{C@+z)Fop8 diff --git a/client/resources/hardnested_tables/bitflip_1_158_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_158_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..ceb8298d87e5e8a14ca8c7e0e36695c0e11db33d GIT binary patch literal 1263 zcmYk4UrZBs0LKfqUH@E!LVNsXQ0!{UpI-2OhKEkWM35qQ8ilqw7a(`Pnka9Vg-p#B zr9f-1Z7daBPU93YB4C5pmxV35+_iULmL<dZ!h^|Rb6I1I0Y!$x;CS5k{gZq?$+z*# zv!BC5r(7MU`syC=ni1W_)x3GCFFI<_7_=I#Mic#WVr*=;L8CD(V!vztzntS(-IMHT z=EgStr#pJay`>KAJRqMuJGPI!4qSb5#CxMBHTXoX(_{PUo>2*x*EmXAN3QnlS-G<h zPMw)L{jPqp{!-Rw{aLW`&;8`d^RfGUgv_epSg<5m5VyrwJ@~;!F4J3XTu?3u5M{`@ zW{)o~c3~d8lF7b;`*$rrYFoS`MM`aqGVVM8R5Yzh9-0G{ib&?Kgyt*ITG_&5^ZUx? z4`oG#t6v0_$78onuU$>{BwVI%_MS7})v8fN-MGDc=}f9yx7hgp_HcM_Y8gI%6n>3$ z4dlC$(#N?M%Vp@p_rJ|=Ca*h}%N{*GisQA>zl~`iikSpmJGjKK{r@H>){D+=6cxS( z1RTJ2mTEV1rZ=^5OZYjO`)clGcjKF~p^fBFZecICmRdId;oAs5rAI0suKG)7Cd85S zZs4zc*|2#CB9xS<8jzqsDk>j0WIFl<8+3<QF5SMEE{C*0xk|TTRFjRTC6vusVsnin zuSzJZU<(w4eRBKsUne~+Jl$gQ)*6<a=(4b$k{4(qP*Xo!BlolYijw;zWXtO|V=3ug zxvgEIhl^EotAJ|dkx-W6rY%Ug9OBYVeF@svTXABgX!P4$zPq67mxrlt`M8a04#m8L z%WYbLoo*Xa=(OJxaQu2<*TDS6?JwT%vUe}PJy4NZC-eD-Yux!Ho9{he)K__ZrHJd? zS!P&D(4?AN@O2u&$OMuqX7n|fooceglnjs&)gfi2aa>29*w8tdQO0d^nC=fHTp9&- z=;F8&MhF+kkSZhPFk{4tg2sM9@W)F8uMyf}-;rn*B4*afqYMmGv+XKFLVZn(?g*o! zuZ5kwKkJh_Js?XeS9D=IVO5To+?k(JZliVEKUkBM?J|9B5UyT3M^GnG!Qkt|r9WsJ z>W@sl!|W^$hTmrW<#wuA5gB+wqSM4tOPfj#(aspi86#w?LzA6E6oFR{GNe~;#!GSB z5|sepLwuX02C6AXvFz3p?Mx<uZ!?KZI%we`(WEzIT~3}(xAHtewMLw=tQ^6xAP!It z3j$I}H_G9`t!`QrMd$^J9LEB#{niGr>GEWCG@6~{56jKrJ%G$$I7TOMV*<u9G=va$ z<A9N?5=d#6U=?XD5vme8udT!6M^iZ)WW5C8Fk9L9_V5-iT3JM3bQ%Fs3hF{}V;s;u zaO>jCtQq9=q{v1{q>HvMnYhN8W=@Q_3prtuk%n<2%{Ji<90#eGyydJxN)RXlGmaY> zl^!R6hy>_Uk^P`FUN{|N8AVa8+)UM6fwR|2TOSPO?+x^G^xZJ)oL8gS2WD-~%E&R{ zCost~!nN4lG0OfFwk=Mm^CHWVvu2&Ap_jYqgqV*C*!vX}C=nz?=#V0^IB5n0Sckqi ZXXT(f9F;=@ALBoMcC+e8!w$dF_a8p+0U7`R literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_158_states.bin.z b/client/resources/hardnested_tables/bitflip_1_158_states.bin.z deleted file mode 100644 index 631b39af05e59a7f7b2eb6084d71521ec9d2edde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15061 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 diff --git a/client/resources/hardnested_tables/bitflip_1_160_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_160_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..6264a1abb57b3e7d7bc2b28e66bbd36d36f706b0 GIT binary patch literal 1300 zcmX}q?QaqX0D$ppZM%ZhQOY50TqYDKP@t7SqQ*?2K;a6Ompj&CorOSh#Vv6rF3z{K zQd*!j@>04&)D+|>T&t@M-3OO#(9}qAX3(C?K5U6Gx-`bw=-iu2w)ttv^AG%zM`=U% z?NRjeEd6(j3j@Ha6n?)_O$Dd`c<2x?Tmt~Zz%cpYTkoE)f-!9>RBr;vLm|K4XVFjU z^~$)@;c(D5TAP}v1_=I*GI^;=2a%S$WW-+}boq=5>NrVb1+tQ_0oK_{EsAhwqs=Pp zlZ^J*`SQ8lgqWpK1Rytj$<*JNAs?XQow_zED&MXMx>4zj@pkxN;$W5Md2jwi=lSt% z_vznoCb3?v9FqC*%&YB!lFKG$Br8J`d?LncF$G|v(sldP>QUUm4R0pP1Ian+<~hvM zo6W9CQk%Pw)yG$^;#>O;2*+d6uGvUHuo>WQvB)Ke{7`){U`K{jx<rGSybB?B^9PJM ze~J;#<QUvKcpfycq^wXg`%9caRwh&khA%K>3`ID<egql3cjyaYFke7UZ}8Ib`MQfI zTXUI5f*(4vve$FGEBMpHk)q|>nQl0{Li?pwb@Pc484eyBL>f%=xh){_JG=LUiybo) zB~*IPd{2R9QzMu_O20+237sQ;WC+r$P<GkLRJovpkGifQb&8TP76vi2OrbZK#!0hT zR4kO!TFenpJBfu0;o`c!0p8FvGsDG6z6bKpa(Z;SsG+gHF}#gd1k-V+OyeV(;D`|w z>BO~B&N6S>yhOpADJK)^lSa77k?@16F=NSX?Wr=57rc&!Jv`7u8xkX_HRrs@7EKKj zihkHTRBy$oabLSud5Z?7Mt7)T!8_|D9zs_<!%W2>DTqobyUQ*GDu?81yFTkqOo;@^ zOg<O2>%5)mtP@{(11Cy$erZscujpI!bs^6--IQ;&-fqTTv~kG~8Axh6e1k2i*6X6+ z=#0*P@MnHIr*wS3a%_B-b)*!q?N$QSKy?Oq^DMP$0Jysq1yvV8GY$8W2Z8^qA)?eW zkiuFwgdg$#O+d)YDe55o?-BM3Z4?7V<aRCp2?+oC_S0qtXTHnSq}BLcnknCFE{KOe z>!M6FP!`u$EI+jt-m80e>d#%w3p;jTJ4+hqDqhi~&~Cf)@mhq(({I3p!xdQOEagA7 zN%TVZnW$7k8%R9epSGS|dUU1(IodwA^8?;@lC#SFY2!1&YWBxK_H@F8n@mLp$x<(` zw;&CTs*h_-B}vF(ZA7zTK{DDWEcS&9RxdifF3YZ2=#z^m>a=+*is<0?Bn>6=`B#c` zyfDUjbQwM@yykr#|6||r;LB^0kyHA%umo&F*_XMH1|L4ARV^eHZoH$SzHo`#1G%uV z<%ldDLWAY0JLWZWZi3d#N(eI6T6w>fE)`N>kNE~{%cewKN|OUBtEHCeX|+Zjk_%gC zF|ubn!(y?}3*H-cA5O`vq~tXPkefAOo!6B)BViZB?=!7nNHj~#L(b%S%q-T-ScQuV zKF7Rv8X3KlLi(JF>xgZ^V5nYdHOcE7ampS;PZvXk#N4)KYYNKqOCS^XI?U2hE5y#J zp_@TP`$|+Nr5i7VLj@C@>nuN@$nY6glWH->7zxi9OiVGf7$J>TT<xULP+HG-77!28 vN#qH;$HKV|a{Hj}R|Dp~7KoUPx^*Y$ccj9V84LZNohQ|MjlrYd4@dt4HB<{( literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_160_states.bin.z b/client/resources/hardnested_tables/bitflip_1_160_states.bin.z deleted file mode 100644 index 32fb4f59a20bc16f4c3d7d77478123bc933cea6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15178 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 E1|JeIp8x;= diff --git a/client/resources/hardnested_tables/bitflip_1_161_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_161_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_161_states.bin.z b/client/resources/hardnested_tables/bitflip_1_161_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_163_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_163_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_163_states.bin.z b/client/resources/hardnested_tables/bitflip_1_163_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_165_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_165_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_165_states.bin.z b/client/resources/hardnested_tables/bitflip_1_165_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 zcmeHMe{dAneP4}cs>w`^CdRfL)A-1E5}Xo`AQ%KjX32P5(%P+tI*h;+R*jv?gp$L> zSYU*nX52|kW%=rHY`}mHLsEeS90Xzk0zEmlBz{SYL!|?Ry!Z}jK_}@rR;#`J@!q%J zcY89jr}jVXbkZ4CGj}@O?%TKTeZQYyT6cM<_tJ}lM<+<<H_!QK!``RwoAHgsUC$mZ zo1^R9zi$8Kk6xSn<l066m4a)X_)c>=))<oS)2H93!>GQ8It?_vFsAKTa9Hn%hTVkQ zK~k*+il?SFQl|v?J{KA^a?dedLfD8&9jl1P5|9{nufP)64+9b238sHZQYFXxm6H%Y z0K@EcJLz_5X}8L>m=jLNn!sJZTsKK4d|aSZ>iE7L=D=Z?n)0GvBQyg3HPx!!rzPlr zDlFb5du~ZFJlh1+NnSE$-Qb!F%^f5OGkC0~u$fUt6D4>>fxN7e;iW@>m(8e^&qqHq zJ{wI!&2o}@FNmXp)WX81=Hy?8d!3-gSFsA-zy}KFRkLs!-?l(3x7t)H-Msl=c?w%b z@R`Kdys+7+$?vDGEFI)E`8%No{~q-4p&DeVS`UwgW6$v>p6FJ+yz^u~4kJldJ&i>S zB1wZVM2vQ2<F}8i)1Vg;@)kHiQqyt8MgdRbDw8E~RO|As0?o{m%3vx<kv5A549%Mu zh$o!_@gi0xPkQb5VAx8m2ev^!`D3br=asR|G<`sfVbNQgX(~^WT;dXmDg0IuPM_G5 za2ArZntzW-Dw)RdBrgY-LT;0v<w5d>T@N|p1W8)QAI_XANveDeAM<oTN`$?f5t)^; zJ{$-i3+HJBvm=U6;`omgFEGhZLJRl(B7Rey4kP{pt>!<#S(I?8jJ+k#e}~t@1H?Y7 z@XR%xa$o*cTW-TiZpPEA-GD#3B-N2!d=K?%{XsfuUl3<|5T0ZU#gqI4?2!k83?Fhe zWTu1bR;U{C%n7|=+VKD=T5`@qQuW3+S;clY;1XOyv3j1$KXSCVQv`iMo&ZrdoHoIN zO}LSPL$IAY1AH&2cE!uyrH$8ac+}l+h4DoOc{B{4xZ#v2$zHewO<dG$$|PoFCRfx) z2H_krOG)()bgef@erE-(fT#|F&s+iJEN=w<z@mC!G3<c%Db^4^9`q1@;?Gy|coIgc zcz+Tk>CqlIqjCH(3rT7j>7>_!tPzU}=erHRzUp1D1DTZ*buzZi(uiU&h3UA_nJrw+ zKdMhzcBCc}Z-{IoPT<iYm<N}fAS)$USdy;X5BJ!V&FK$w{3wn(GW|s_**xL+<wWaA zyt!CxJXZ5ZZtq<+Zr%IT!wSIi#}$jcY8TFv7L$o>jYJxO?JR1C(>o#oT!>W8AbgB( zA9|T~bH<tnFG6&Yq*bG2Is7I6b-E$)gj;FQn0I!$Y}`E`evf@6Y72I#;g|dRJk7xU zcZo`O^};^q@ge9S26jq6={Kers-xJR`*UwQL>EJeB^$Uh+wpvHT(!^Ecqe(0mEOPt zQZ=GO#jdX^gk0%2mx$x3@46%mD{-CgYSU~PA%Mr4M44WJGYW6R!Lf%SX9TMkJ02Ip zU!)d$o0n4zAEvRUZ{c!U@N|F>Se05^X|6R&vgIk=^cMOhk86D@FdyEMrEb~Iy-u8n zlf4perEA!%V*X>t({WZf0DB(Xy|}mSv+#5L2FZML)my?P2b;3RnSy1<N?@kn&@EhZ z5RwAt#A@uLZ^n9L$swIQ;gxuu(U1UlX_SavDC2&C7T{zG6xNE{)umKQ)w5hVLhjXg zk5>e5y+Q5#@yODN72JgQb5P(jtn|8~@40_&XpHh#Z2?dQ-W_lUzjPejs*-15in(QU z{j#nD&?vWi7a(&^i+xxii;akj5V6Dw^Od5)#!z7VIIXrf!~d+3Yj}^VSiCG?E?|B6 zh@^=7FL-Yj^L4iQFg^$~<y47E4;@pAYhl#-As~fSrsQ^u-8BqV%o<FEK7hdKwxD%% z$Z>AijaeSk-H0J4h;AyZOS7pV<G?iNT~Nv2S@6jTsMyFWe*WNGsNfO4-qH>a2RdY? zrV&Wed8&4TtJnjv8Uz|UY{)wK+fLXez(GK<8^E#1Qm~vzKU3I#_$D2;qgxqVAT>j9 z5`wB{aXF47A+Glz#)v5=LU^OSZS;(R7-mx^*g&bA^P9(ExC-7nNtyrwzLMoi31p>& zyb}tBDd)#b&5nF=tMjF9k{Sv~Of!gC!S-foUUH~Uc*DqvV@=vXQ>7#x!78jHm&wbU zh?m?WSf)Ky0e6kBg|}5`fA7S0*ns;`21&d0h#Ou+>lw9!{1~)*Y9)W3FM+9HqSS^B zcpw2ccsb9-?#_ZvF-dt(RbpGwLGsbp5ncEW(cK|B!2@@Q?!O_r8eKu9Sq49YNwb<Q z*aH3G^!+4CGcQPdvNV4m3#)LC#x)<)kyI1ZYpq~N@<-uqUu9iH%*nkDLR6GyC{D<e zYNN=`UB_Qdp;+ug%pFFR@yRXXt~n>OEX=nU3$kdvj(^8j3yVR>#v4?q&a=pycx)#~ zn!e!4e3quwT67PD;Zp_;eRSZlX6N{r0<AX61u-I-3fcKP)Sb~Rxw<4FW;YEH6*b6T z{aX;E>o7+^c51F7qfC$GUWBYPY34aX#S45iv;3ALT^@uJe3AG4RH^c-QM;eC+M7>S z^?$dTuVe*cqB_hC%R^_*+EhoP9fdmbWD_hgH(VA%JM5Bka857j51aIsZFQyRK;#e) z50ie`f2MJ-=l@kDKLHs|x=?T$F6yDJsKYYf&nEB4)qIM0fYX7=Pa*o(`l4#w)&8$L zXNSq3Wq!SChlC)z0@6;{EoAYBrl5%$DEAJ{4jr0}jJkj!>9vOLhT-CO9}hP3D~cB6 zf|g?B4K!ZFvC4ZvVSM)~lQ@a`2y{`3dKQ!lP3Nkw4UyEqzl87$Ghu+iOROSUevW7n z-lka%G#N#+rZG)59*e*lJ_Sdgi|@LiJEm;XX+IS{3};rzKS(c!-=eIJ@Xs_7v!j<8 zbP=_#@vklT6s%Qz1NeG+2u0O0BBXfw1{%p&O%Uq&0F-%*ePi;FU1713QN9XtkgJ?L zWHF0$llf41g)p`zK@H`LauY=lWHb-eVIb)|BV>6BHJi{j!gt-Si44iLDcA$Wa0Ko_ z>0&A$RQ2QDd|nH~WCzN(G6=#pnGYn+Z~Ud5<O+P~Rj`_njlvw2kYthJtZ^!aH+>7{ zDs~Ob__|)a`%kbJcfa!bPuEWR)omyE)qRLXxtf0;eWWlQ86SzYdCISERJs#|C>v)X z;`yk+3kO0DVnEzkfEF%+9fM}iuk&KEz7F=jc%6Hzy3^oPso%<x25Sas{0dwYeJ7Ai zC!>LGcrZ%sLSiVHY`}zGCjU*PSqiT)eI#0Hl`!;6hvVw-LnS)&YVlz!@-FPQz0jxd zx~Rz{SJB#tqOFNQ1KFQ~SAOx2P|h2ull%OfuTfO<pv6ggrPyJpR&IJ4pOl&S<hT(a zP;VJU1Pfv3C0@!$(aj$qc1_Y*!@rAQWeOjM<`e5g4|hWLd9hA1#`YrQ?nJxigb-eB z0jJeQU|ua%$+F6CD;s-JBkx=RmaTT<NDgKU(roxcy8aXl-FDYFotjN?Vy!*jwY+fH z#GB({XGRK+!%&3KtaV43jc^z^hfUGqY@621a0dDy#SkW0$uRt>$uEN`e$3&w+gS5t zFf>nk;V>9ZX{!EXOfoL(+u&YZ8FjX9mYj&dTEuxsR`MfL3w5Z&uDFQe@ZKR_-j!Sd zXkf8Zro)V|yp?pr8C@%l>mF@$$Z^<;D|6MioESPN%daI(daPYb;GfZR(TTlZQ3wHP zatFVllkO|vdJ3*{a2lphIs3qmP|zZjiu6Ou^e|Eq8ZGR2^cVgjb!yizeaIh6AC5w~ zlXl(U=e}7iByNfx621<Po8A+?>k`mCACbE&n_J*_v*Ddg=#n{6yp%nVBnx4Id4KD` ztO@WJpF2Tay_I(!2{L2<p1*<qFH5eY&@FU#8OPNqW3@=vIp<-`sG^ftMROH~S*>{o zVWN05vXVdT3wYcv!F<w@OR%0bq(`-WYKLF)I>>mIU(1siMPW{r0ca&2X`awqz6FNC z#9~0Pum$gq0_)31bw?%N=E!^7kEn_FU&d>1hX$SDK0h4Vhg5y)k1(RdZ}a^Z#(B6? z5Bu5DI{uKjhb1F#V}esiRx<(oKZ=L0rP|L%GC@oPHj!6&Z3m03@EYl6+h@8t&B@?u zuoAR9M2;}{@vN$*_Epg+db})=$r_^d5||tDBgh@F2`}6j4_EOu$05{@>7YTMF)pH~ zBc|E}b!*`Tbkl9<3R~rMy#LEV<jQ~H1wTV@5LT=QUc<3^92zAvlYqHXD7{vtor4hO zOaB>?jBMzq7JN&XP{ehS-5|y+B_qTvnaLN`A%=A#_bp{(jOK<1Sr5y*4zWZ)T8yl; z1acT%4W^~;hfb`jFKo348#6+u4jM4x%<w!`kTC4XM2I}-?0kk}wbYp;BA%Px1%CJ` zFHRQpqT-wT26cnuYhiySmnZzs(v|<uqVo>XeN}XDhv>3q;s1!}is9}6`r1NQJD56& zkx3DJ+@8kZN4yAKoFn~o2r7AfdK6WV!1NuEvl#jcn-fU#EiB?^keK;#q$AW}*#Cm! za7<)kdOFZz1YW0^#1?b%P%88e^xV!6G2oHUWKNY@jC@}$h&U0$dRT<UEgR8a^_FHw z%wl@=iW3;agJ%tc@(3)7rn;h-f%$H5yL=XBg4w39fdBqm^nh7%y$DMIXZNa&2~f3J z^!J(nuBev~vNvhAvyh-BY2jni#LO2e9?fVBbIO6te_f>W{{*@jiIr@k&SOW^BAD7q z2hACUIU`C!B+AIYn(eJ9UET?gqh>#d|GAlZnW^t<7c!>z3OvWl=aC=6K6qQDkv7#P pwI;j-GjNH&bX0$@lJ9oFPWA%*F>jwo&i(IZmEUA}y9S;(_Fo_fJi7n@ diff --git a/client/resources/hardnested_tables/bitflip_1_168_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_168_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..e4ee8cdbbe7d5d5be27a0654872136031243fd04 GIT binary patch literal 4419 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_168_states.bin.z b/client/resources/hardnested_tables/bitflip_1_168_states.bin.z deleted file mode 100644 index af6bf431ed5cabe3862053eeaf13b8834b309554..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26952 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 diff --git a/client/resources/hardnested_tables/bitflip_1_178_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_178_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..ce03d40d3bd8b851971a3d6656797907a1a6ed74 GIT binary patch literal 1617 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 DWJ`(3 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_178_states.bin.z b/client/resources/hardnested_tables/bitflip_1_178_states.bin.z deleted file mode 100644 index 17eec3aa50a8041155dab564df8c59813ca906a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19601 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 bFNW~`3Dz+-1#Ze%D`DG3-L`Gb(To2JqCE{; diff --git a/client/resources/hardnested_tables/bitflip_1_180_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_180_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..87d8693df1453a2c5d4ad7917b0252b1228fc130 GIT binary patch literal 415 zcmV;Q0bu?@T4*^jL0KkKSrY>VjQ{`uTtU$Q5C8xGkN_1x06+)`zybU@P@w<-2mk;k zr9=UsDJdzFBhkJj5>Nb)Njk|DRCP%wVM!)ZNveQVsU*@sNzy?i=P4xAl4?mcNhYL| zAQ>g1StYbfB(W@#(pX7s2^F$SB(g-Ox^<-DnKVkB0KpQ#d8(4)N-ki1q_mG*lO{}> znocUN$udsKJgO_oOo?_0IFJuX1e4l9B*_Gm`5=;FK_tLQ&calH;wqIAxss_Rpou|= zP?da1l9Dha#F<f8Nrae_>52-;GMdSn562J%$Y$aOhyZ{900e*lssKPn01fVxP#_ur zAQ}J@QmAOjpeZR+Pf&iN+7PO_B%KK)$t2Q%jFMQ8DS3z_w32d3G?HYJX(YfcNs?(M zq|#)WOrWKtu_RoLEVS8Byg<UG%!;@NfTt9x^n?7SQzzurrkJ>cr81o<;wte>sdN<L zlpMqoT|^REAd>qKl46xfFcj!efMlvwBZ^fd$V5XFN>%MlqN4(srbSp&3SyrH+>uTc JBn46Y{s4xXro{jN literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_180_states.bin.z b/client/resources/hardnested_tables/bitflip_1_180_states.bin.z deleted file mode 100644 index d3f655b0414dcb31d9c59c1909c9d628065cb463..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9771 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 diff --git a/client/resources/hardnested_tables/bitflip_1_188_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_188_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..e6392a033af47ff223ec5fe7e854e9827ca09e33 GIT binary patch literal 5993 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 Pe=!ioTN;0Rz%2P+De^o? literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_188_states.bin.z b/client/resources/hardnested_tables/bitflip_1_188_states.bin.z deleted file mode 100644 index d5012b1d5b22f8e3237c089c15d2dbc0442baf7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27588 zcmeIbe{@vkwKx9WS})7Xt+}^UV^NsaAB~pkXq6&_<kTXjEtM%!NF{_*i!?}(Q6Yqo zA5WFiR3nUvm?|VkjSwItql7R*NKOSpfJlZAk|7D<Kqg_5OoqwK<jl-DbI!Bh{Y(M| zu&(>hUF*BvZ&zH)EZQ~9%z2)@Kl}4zyQbaK>B(?Td-LBf3_Vum@xJhfv1ezm$Z9*D z|9r}OzleY9+o#v$Y_xp0`LQQ|{(p|e-a9Blh%-YCghC!W@tVElJVd+_{$@5C1R8Sb z9=j_IYIMcx9SWsIguZP2b6sC<mW6hR3_vKL%1;k9C2?=lWKmIn)#J<*CFs-=s`y;* zQnlPiYEwd76@N4!_y0Lj*+jUYt3-Ml#N;7p^mq$`^Wl9egp8`>F;1bru(*c8L&Z`@ z=tO9BE5zdqm^&T)xwfM-ppQJFPswvzs_8hwt^G-dwNG3I{cbS`0oNRwITb_|l0)Qf z2zta%t);fiE+`3cKLLdV#hW7JV|_jNV6)CCn>fut^ApwHLIK7&xr^bs`*h1u;k6*I znY0)h12$@-C1k)5$*<M9Ap9M+Kr>OzAcQ&m-|Ha&LjuJ=iGiORa)*jw9~5ZExqvn+ zsJvg)DE+P;gwHSE1>VKfs|f+p2wy-scgjW|h1lqi3))D~K$B><iT$�X*3g<t#mf zpWC}Akz`k=Lm;gu+t>>Bkjr3oi-kH&KTDPgR9IAV+S&+r+sXI1ys?W?g4X+>#0R_t z>%!z+5(&V5IrDe0V90yEA;PWE$xxu4`ndOpGOPINu&_Kr;wk>0f29q7KKjs5rM1lt za)!G`uBlPrPL-3TaE?Qkirw}Bh0FwL6SXXbr(EQTNSf|=fM&j<cS`W>K?4;a9}dGs z7$o5_YHx{f8)Ur%O-)11UEIt8P6@zZY*<t{y%g$v=CCN|>&8|Rgx8?}e*!Q--qTG5 z_zGb-;UoSy5*EW8z7D?{yyh;h`iL;C4U%)g8W!-SNZ2CdzZ=0RDw*X02*O!Nqh>JZ zHZbAy90Tj{@!lLHr-*8Tv3(%ME8a@UqZ1p1+NdHO1gB>^{YP?k8JtOk@8Vx1-K4i1 zIFe%B?49tmIGL757SwoK*L=5k6Q{(T;Hqg@4cpT#t^BmVLYpj3wDN{a<Q2U<LnnXC zDW^@6DT`Lh<gUn+X;9X|xnqXP;Y&CP>Fts~K&YUn!9_CsguD4!^mur&;A!#Y_iNUG zmgMA~)26r4pVdQIglHdZ1Y4JR3h{a&@+N)^jV#ezN5UC}0hs0^YCg1b8GRj)27-=X zU>o}-Or8MgKAKsqZ%~DY=`s95@jGHCo9qK2@bibPDb{jtm1;{&!ZT_rHB@m)&E^fz zD?6HojtkmKk7+eM{6#(YI2@M6E>$Rk4YV2dsAjFzP&QP?msw%r5lczV<<-<s1DnFJ z;-4Hs-x)~qk~=7Sdig=PH!>ESFews!dR)Y--K_R@K%_wDFNS9oMqrm0s=%%g7heRK zRKj1tCu!BK3Q@##0j5A92($sb8oO6x@TK@xcGFCFsCr8*wPA~D?1#6=%bJPu3h9AO zkj#F$2(5<R6nH;+kfKM4i^RY^>|OZdz|jCk5H!nXh3_6;XDLx!(~g1P878?9<AUQS zAr3NSP10&Ki(hOx3A13ZLoIzspB*4+F3!3LTo+~O33mEL4gA1f4ct~xk3eGs7-a4V zEgxLN$DY%;=jbE8;M&=HyOlk;ijAsn?s;g-n;p#EXSy>;p5rXr$&jAbjPJ~QH1Bya z$pC-W_~{}Mi#z(-S4htSq54giv7EpO{Oao*F@3(m=hYSmnWGuUlVimY=d`5uNy8U( zKD2s+e}Ipjh9c0o2-&CGHv*QMFr21>R?uLeMmp}2z~03&=#3vwp6y;%yvVHxq!wD} zBu|4l!&z`zdL-|*9`ZYyKb<5=Bp4{%1x}YReU%RWARhaaeYD46_>k4VQWB%jy(AbP zqd!#4lwU(l(BKw*hv5Pl<fynEN?9dzoFT4K*@2HYA`Zaa@S2NM+J&K2)Y_#$b=c|B z)ZCT&!&Tl@^Z{KHSwWl%E=`cv(N=N^zv5$X55$0-R>B|`eTKwu{WE^?aj<wYjU_a5 z18CnOmyKZegj2$i3ZL+8ji+WTK!q@ePVtcdr^Rv)9>f>0Q!WAn5dFmmAG^g(KC#vh zNxJDj@sTORHzWqI=hchx`_IWeMo)WH@={Cf#;ecC^e$OVKWnPzra_5PcF1XJ6lY@d zc|kWO()IwDp6tH~)@E1NS%0RQJh57!tfqx5^KM8~q}IUxGuCHGd5-Y}{0<`j2&dSk z+xhu@yK{<nlQubRj{v>lBo~M8($xmbBPqFhJ+>_9=AWg5;P)Buy%fG^ui)Q#k(BsK zAI|l0J`V4+q)MuVentj_)e$lPkKo0@FJ7XYkAw}H1y5ritFl9qHkatK_aD?S8+s%5 z?buy}AHg4}H4=!sQ+Ea8>^*$EqBUGrN{Zj*-=$W+lv`hJw%Y7+PmRCken|1QhJWFW z_)IUW89JXuZx>fOV0-RPXtR@jRNSiH`2olSf+9vA+<FHYFhZI(F#7h5_b0<MdXmh$ z6QLh=KnXQ<s+=aOmbb%!Mj57k3hUkQ0hY!p*&_2R^uFR^culspKo3;!<hTR+okei7 zN09lS(!%8=GsrzM`o0<RJ`$;FNC4A5zK@EZ>v4n{=reZ=e<cR`qSggL@o(51;_xmQ zsU43(+F7XW0vS&%uL+v_gaKQ8Gf(t7?3}_H?ST&J=zvMog;mHv7wcoNR2kr;;11fL zo^k;afnHH3U3fU7-?nuXEudJX_*np*$9pP_<ON4X%`dWtG9J@QyxbOsaz4-kZVNdl zrJd{F2S;^0Co1nLr*k6-<YRaKj-1nOfjG)xf1W-RI+Ld?`aA5DZSOhvk9X|KtC&tw za`tEGgIWCnp&XnYVw1vm(DxyoAqZ<VEn7j#BHVQiW-Qo`8Y+Fz9uTp^P_3SI7_NmT zK1^??hBx68CwvrcyVVV6!UnKIYzWH3p<NR?j8u3L%IdLi4e~jAD|Fj+SLij$-3AT& z#Ft@QE;c6i6~$oR7cPS<=j{e}Yq~qToR-_0k_>utUy{oZZ8A$WeW{AAZ+|c@9^?y7 z!&bPc!OOb69Da#c>A5J5o2Rx|vCeHG>3frua~_Rb3voVUUgxJmz%@3qf3J9v7OBvy z#~dd3S-q#I@I1Llur&gn>lo~TV+Hb*A=d?Em!Z5CjM-q`ia;p66V9vv@7#d2$Fp9u z_Xps}<P)%5FW6|@LWV5*VmM{+Ykgr>LoXqoXof>7pQDXD+)Nrpc34{y;Yn<qV?KlY zX6`I4jaKk_nlrSef}FRTg-cUbMo6Z|;gk?O>#5<)BHrum)D3mOH%q--GX&^NI0SWw z74ffck!nu3TgJmL;Ie8QGV6hDbde6-I)pADdQDA)HkI4WPCni)d5p@+;w8Y#RgcGa zfYU4*c5M6y>qO@zVf=kCZ#6wx(wpoeZ@aiR4C2k!3Ekw@4aPShNwIMtq!6z_wD)Ld zb{34Wf+dfh<!EVx2I6P`izraGoI<Q2OD*Jw1gk)b?tRn=F_*c{C!o?nuu;TTkTPnO zlVUQC#aHiw-8B7G)v82drpeG0G5nRaH0dLqJ5CQln8*@-;EOOIss+6zR$8cXtenjK zgj!Tboo-sKtJgf!Wb&+T4v+v*O<?+x^D65QbzdMFd^r3>`MFR;5Uxjv2lgOdF9Odc z%@kBh`(0pY<ZnMu&bb&q*$OMEUAcnhdf;tH!UA&*n1fxuOa;2h?l0kP$F2QbS_drE zOaGvi+EkOD1fastoq+lGV6%(@i`=UXiTyGTjGt5YIEXg_IRoGJ;cH)k(eQ2HeCBt& zIpj`1?>Av7HynVwlTQpSu*04&g;&0HwY<ayo!(@zPj%_tL2Oj_LWy^REXtAmbF2?+ zMg%|B4)u0!LJ8hMg|F1jd9<l<$lIJ)Yi_si%zY!~ToXH_-Y@CpMEa2ut&%QitP=4; zY9tG9*!muJ&HJn(?E+ue^ca2jMJ$)4JM>um2<s5Fm*Y>bAyQBK%wW+uc3|-lcVOL( zi9&HL+L8q7#+Ojz;YEnWy69I5;}9C$2D|b}XT4bZxUAll)sr266zl?`xp;&H25fgv z5H}YfzUa?&-~GpayH$MmH$*)zr_K7HA(-5c*s@N5`)SS$P!HsobI$MKA5<o60Q1Jh zaT<8^CumjpU<?S0xFp%TQ{pbrN`VVnz&>E8fZJrQvkg|dElv1Gdb3#ILPXcr5-{W@ z^%M@C&(N_@y6m99LY>^lkp9?q&MiK#8LMfamd5=R2EVF_hebU9db1A4eFB0<#h@I9 z{w^GT#330jyREqa6AmYEIxPB9$ZlES_#yr@X`#^~s1N?WA?Q}fThQ5vb1V5Sto8`G zp5qK}KN-c_#_RF67Lz;FGzE+{u&IazI6S9znu5o^&p@{j$2Rs{u#g0y30v3^?6|DP zF|f_B0?d;^D$02iJf0x7zJE7(R?c5HwsxuoqIgCix8RF=U!_lXcFoeeWXFln#_iI0 zXw5A@pP4@W7B)hR>mgrKr9NV{z`@{BU0xg}f7C->S8!h*o_S?_5A=J@Ez*MTgX6&S z)$nv=4{d#qa*x!`hhA^#bXM~=vYOX|-Tq3=o9r<w3Ij-^vEY61y!M$r*dLyeK^<8X zyY|C*#mmVSC$#8X-qZDv;<IfLLm|jLiiLxUKcy@Gs2ylfNKu&64->a=V8}BJ35Tzu zNfSQ=?{^{IPM^|EcaU!Q3K({PJ?jUBj&et9Xn~$0lvong(q>D$P|{~RN`_STSAFf` za9>k->}!qi6!x`eNB6auuKGENnekvbkJEMmU+K25>Su(+f8t*j6lX-pJEI8+LC>V$ z%Eh;-*HP<B+O`Irw1l7??}He?c|RT>n;3wwnWnlmQIo3d$VoJS2|*Kr6&#(|@N0Ar z<G?|Jgbc4G>9I07CO%H%z^aLUI1ZE8FN0)cQmq5_gKtLA^Wkkqizu7G-Gi9gMC(sz z##c6U)i-G?v9l;IYho?r2cY{Bj$qYmshKXKNs82e3AT~&i~8Kcyi!H13<$|q2n?#; z59PF=##5r;+baZ+9VEAlxO%{%3O}HS;p(I+JPdzdlbsN^z@O7rtEI4lw+EJUagoH1 z((gpXPlcprPNkK7_|7sHb9<x`3;8)U7E2;;_pEx+=G_e((0>b=@T*^<PoZ7z{Gsry zpX$g7-A`jTaL?OeldryF$g3WZ&#Q~dh&wa;Q_|$KG!iT-TnA07C%c?j?_R)9T!-~8 z7H$bd%Wf4Jny^9q$t#mhR#~%i5-fww!5--&-^@Pm9pW2)?#D2rSVXWFQD(J(FJPK@ zfRe0;kO~i`fZrW+YPgu>(+2|f*zxd|hPQM&V)h=a%p=#3Zyug>)BD9hv+BmjtMftf zHu)kTwz*7er$Mq$gH+A8GEcAFpZE9n%xUm$9*)r5NQ)Y&kqRE(x3N&CA*B>HM4ut2 zB>w}y_)YNHcqrhY`Y6eJl?xSuYqj>Emg@+czD11)m+g3d?uRYN&=_ceaQmWRT45Bw z(1aa0%<~FD_-pH&U<0RAwD7X(FI??upR_lL|LQp*aS{(_dl|TD(&k<C#kr)9VMyFd zV-3WkK-}H(tE8r;vn%;dy)-zMDlO;xxvJ1pf@XFr3;P|r#rd_dJ!BW;{y{5unG1|% ztL7(~TEzkNQ5->5X(a&xKWbnAC*Sf~>SW}J-})00CQ8_X@1<d1n!|W}pV$<h`}f+g zfN<SF&AM4ng0o!ERQ-))o|*2%MwR&oh$+1?v70uLhryvMn>NsZvdQJQ7Uj?-A#IN7 zgz?vqtaxjktu{x8OZ6{O7QGAQndvznh4gUg<N5(=olXj*{ch4+dj<wvTng}w^gAbE zZP2dqthvD<Hy12~NApJCKJp!<jO?T(sx?C(GQxv7P`W}lP+qV9rIzJV$%M0TNG1r? z#dft`HQMMZlbw8_I{Lv6oo56?C*9BpuLbR@@%u1qpBNtz?ihXFV&E5y3kpG8J=x=e zO9WwbSpme>!)XUpTgBi>?g{9FSxz`=)<0_{G^dID3g$(Ud3c)2hZjHCVRgY1^h#0d zs3O6tI6!vjzoQ7E<}7R)FlrXC4nP#U4RTnBBuzX=rGD0d!X(T^%s60`5?09yqwMPY z&;d!{K~#}HjM%WwA&_W><Q5>A{zs_I))5f`cjoN1Kl`1B!k4B~E0V@LbLoBf;^G)} zN=AWEE^zRZr1%f=(zTRO)mo|Cckd}=Tukr6BN3OuD<;xFdx`9@T!hzUNfbIdRM`Wr z^mn056z7rjB^vL3$3v%h8q|~&6^?`#=p~}y*V5eZc+k9xCfmpe;j{%Dd&M3X_WXz) zzu99^RDN81Ps2i!*iq(;X;FBWVmV3<g|qhPFK%SheR%Q&FxN>d=y?f3-$#;5ffHf- z>pu5GF39MDp%^G9{iko7yTn<VcY5Sb8RxjS;VR(-%fZ{zGcS~p#=jTb-<0>&%-Qdr zW;@;PY7h&Ru_ZbZO&2u2J9J=e;*`PsC3M&46lbsA2)2H44=pqh*|BiUA79QLij><6 zJvB|%S~|ANG>4Yj;ZCPHfjp-@m<sO%gwhW2!U$)P)(+1{QYPXjn1$EQ_z*$D*8Zy2 zT#=gX@H8jxY$)E*Q*4a{w}>Ua!q&3MwHL~!(q7%xJ4T7UY<L$g+NGwDplLn*L=MEX zc#vkXF4s3f$v%2fR9^Ne#ILO!V&ypiClJW<i=e=ArMWH9qp(HN$SI{12`(Y+nu`jl zbcZExisGyw;60bvQ+S|(vo(=M4ke5Nx>fk`6zF^<ry-JEk?>>je%;mK4Va(K+CwX9 zlUc!WcaG<Kiv+T}Qnkjpp`lIuNa5``bGyxY8WLZ6J@u2L*P@ai!jLw%#3hceAsLLN zDhUU^qr2Vy8ei60>N*;pQvcaF3PJh<Sdeo*A52yuvyr0#ui+)6QxG^q=_QCcDjcSz z@r;#k4cN-`(qY!EHGr*gpkJ}nmiT9_@gATB5gZdiBNbG9=bH%<Ucbj^v^KiQ4tS=T zj#bK_oQ6KvV(h$A6{=|oKK@tq6q%%pr`?vg=45zQcN~)W=8)l&uY1zz4iX3L{(J=I zJ1jd=t5tr4)G5b#jCbsVh68d+MnBoH(tu@~COphOM_u8(X_JKJXcMfUHdPuK4r1Qr z&IcG)`2xc5#P9<Zx6|ybtf^pzLY?pC2Q~9r+SDB|wb&sk0QDh5nu|myGS>G3{yj*6 z6ta;F5!<!MCA|xaU`yUS7xB5ob*jBhAs@@aYd)cScq-FKs+L4;T~W3$w5$3CvhX#x zxKJ~4Y%Du6Xc#q?{hN-wK9(H)JpCBq;Oj$T;C4vuHZHOYuL!R2OIKAcV?bQ>b1Vs> zArffvZU<TG_nxB(=9*HmiEIaU5;G$W8_0A7G0-<vuT~c+=Nna$^p*P1%jw4Lto*+0 zAYI-h%aX`sJ=w$O>JCci^b>$JBN?Edn!2T0JvJy01!rqyi01b&%#6*;v{z)z>>j}K z$J7}%k@y4f2QBU{a$+A~V?0F*P=fgakVJ>p5kiC!U51h2`AQ{5ARVPbkc>AlGCm+7 zJmHkIVsbo@t87-b^oL=bqsR%lUqaFF(2N?-Fplp6_H%8KBrhrER^jg)f5!6rR$)yG zEp6cj-p#|SgNQ!tOBp;cLob?fos<>2RhIHTA)!U*;R`pEMCZ0&l|xmj-d+dKcR+^^ zRBGxnAggnh8_N7h$UT`yt=1H8xz}?Nq*JgHj=HKVAh?kH$qtiLC>|nDULE6R`@~HH zUP|Nse9aigu`g|R*uE}e*|=S}9Uk~2wll~V|A8bK60OFK1gBqafP98W$fWW3!$3*p z09k-=0}0)YfPnQdVrxc<?THXF4%+UcXO2^`KSJv87~_K>yYb&qo>5FMg0CkUji16g z%815aGNO?P`U)>p>!LkqhfBJ_JVhQ;+n$0jN-1P-cw(=$^}h3K%X6Z#>xgQ)i5*97 z4sDa`9ra{U_Fj7W5zSr!@)})z7&f`h<!%_~OqVS*??jYrJj=+&PWmkQkQF}U{F~`} z0-)S8n&VyIHyt%ZmRmP+zjKiy7dIYmak`ENZBr@V2~Ni<O}vd%E7=63G(-a~nB?T* zj#{g?g5z~)<}@4KIZGPF(=%u=R)vRrVqn002L9qp8g=<9b=W%Qm8{OSFXmcXM0qOe zc4V5qL!Zi;eUeq&7-hNB$)14W)<pV+!e)903}|M=5QQzoX`{d2#_J1m_0SLU?&?`- z3m~H?91+8ltLbk_DRPd72ien$-wSbVeAobd+wjwCBQE2qB#BD=0Q^Tif8bnHiquiN zh=+bQi?LrUa7n6aL?E3S(L^Q}4e^v<t0vJ&8}<y}pcr5hTpc+>=0Lty;3R%HfwP#v zhO!ed7UkxjODf{Rt4C=RlouDVF=~Wsx<Bu(lbquT?B4a@j*!Q}w1RSqScXu}+d~k6 zuAsb{FEOz&^8<*Fhb&p;VytlM0(Sb@EQW7S0i?biaWr!gMLzA8E>7c6d>K}9ZwXjl zw>egRd>=xB22pnK@WY5bxN?uTGPnIx7#qp@3T;dY-V;es!(+OkOVK0px!I1@kwz7w z?G3;B<W}M|*5>`vBHr7K(4wG=G=*mbHSYUl;MY(Qy`ZQ~=Gn$XVkbbahKe{;A|TL8 zr{N7M3_>@*kPZ?Y^kE3!#hgfz)D&*GJ2}9(FfE{4gZv9ToiH9njE%ms`=P|obt~~W zD+=Q8bOQ(7AGx8>hO(`+M>dM||3vG9p4}__6mmZD#T-Y3acCG}Y`6k2CSUDG@m#q` z8xfW+LCz|6I&8_MpOgm3ZFZ3A44lj1-Qv#QnOhn#^|`K8J{RmZ3^98CYkL#98K+@R zF_ihla6nAgT(RMmL?J8cr9%>GTlZc7MjPT>kAmduIM`nl!!KNvg{!j|`{i|rO@*R2 zLEa2pKlx)A^)f8)QSlwJA{_l^O2o%nWx%o_kv1uYll*NH$t(0h)daKL#OHGq1G)Pd zL)g*L@nBw66Imu+5TYtYwt46{>?^i!%R8y2_hcg|RHZRTrL}Zlc+aoXdIHbu4Heub zT}xsb84?Jbou+k2{cdbL2T-&-ft{z&0!vX9S)RRGe`k5*&JEo9z8l)k-VRs{79`3T zvSXi+>56z7ah_*?a!F9#Rx&0CFR3U~{wx=z-N%$M0n#aOZM~epWjzG#$6fqtyFva$ z`*?_KhRg9Qa<gl4D~#UF-kFND)^;>@tz;o@G+W&WC~e`QYQ*@nbbB7^_RupRozkpn z*xF_G;EV_9Vxn-)YX)h@TcTRn&+UQ*Atf0_M1xHFTk%V8A#WZLGAqFGs%~5e4h_es za;)gDxJ{uUEp|64#|c|{T34DpQm<xQ3cKMQpZI*Fx)NT$IQqT~j@4xc^eSYJ{_7Cb zd7`F?!b9QVuVm2djK$V4Q>$l6ANygn#bFw{4XpX#!w%ccC*v&%3y6n})UW}LI8ALq z@jT^yTy$VCxVbQvDjc>J+C(<}-Y{&DZ2>+yZ7op2JNu!`TxC}EYR_%$CDxKYLoT#2 zp0BxE;ECp>iO%^peadA#C#PT;GXQy&ajD#sJ)0JRR=q;E%kEOKG}sV2q?yXas=Mqh zpU;<9_9z`)4JY0C_PGLzFb0WDsO@YDu9gLbbjo~2B&8ES%(V?BOnyfHz5(!rBA%07 z+(hg!urnBX)n^-IU}gfu)Y(`69!iG^zt3^N5|ce=^L(hP@(I|t@}a9F!y{gQg@#~f znBS*whzPv}@YPJU3OHB6!bP@4DN?#@&fSRKAYnG1?Z=}{#_3IB>W{sOYg4Ra*j$A^ z0*jlh(39{gjYUBm>D<%SJY*!cXelKLCtNFBC}?o66QBF9`c{rVYu~1SC*=J`?*t## z9#wnefzJT5tdq6~acZD0a??`Oe1#9-y%&w$WWE4#6?15sn_rdFrj1y5-g24h4Ol~` zAf7;tr4_oI*G|${TZWW4Y@FQRbZ#sCBFGh8bz-g319^Fo$HezLpgLWg2$yxy>pdj8 zwY9{18A)~cfIc<i(28ZKwbVL?TIuC^i>$5TST)l@K0<ocD2MtX&I{rg5IC=2vA4o= z?BwI^+CA)hngVHfxvrz~Px!q*gERLl);$69#F^qWD3}g&wD5y#JU@VyOLOLE+zC-v z;GCKbn$vcjqbc<gz=r=t6j(<7f~TMiDsYC{B&t$B5xx)PCFr|V6>6em)JtrPD(BYj zm~p;so}MQ2W6zM25;?V#QN9mHTiUH2_*F2LqR9tl4{Me!JgSPa$f%tpUAP-b9`T{e zWRKf%%`>f48~Vu>>;#DZ$RBBz-7w;h86!jVwtk>`wVRmNCOtYfc{TGC7ujRy=5YWo z(LICInP^9Rf+h>*wirQkMzCm{AEE9wcP)8?7<F1Kp|Sf{{}!fp&?Gl^vy($t!#ns6 zGB=~e!Zx0{kfOlidKc0cGB1RstSC$Px6v><E)1`eO*yVe$6N3Y!BP&V^w|B+Y<H}s zg-htW<9e@@m-x>NL{y)4aNanZB@vw_hFtFsD3`cyihaPk8;+v!gv+CScjWr*C*cDR z2?Q*ww-X`g%Wck^?U|c%VIw=Fd1=ASkT2$Bv`WT9X2mc?*uc07qzE~UQM<8VsV5)% zN|#3r8@QPs@dlERe51nxp%XK@m?I)mKb!30^ep;`HJqHFxf5wZ-A;$=*d(dr5ggSJ z%Sj3r;S10jqyAH?QtW1ur*C^+Z4Om%DW@0i6Q4nBX{1_`&vmEjaP(w51Mlg}j(eAC zWaVA)7s2d}@muR$xnUSmr|u#q9ocU|*FGZ}`4haPTX#TTBNbA}o0OSFXzFw%wCxqe zXa)MQ_?J+HTl^e2Lhaz{he>S=>7Sy{!hKHkrU)VVI-><$&#K^MFl_`R(oe!M15J(v z<3`wKg-o7!wvg9oGZY?$4U)RJ95m%)c!!n+5$tWz-1+qj_VIRDr+G)*W43e{NH;OO zeUG2v?d;F4!`l}L8!{ELUl&pMcpW>!APGup3`G?cEn^Smvgh(BwnGcOqA?<iKt`-D z)?EOXyBBL_vn|BAri7OYmE#u<p3KsQT^HIceDS=PA#?xje1EJJN#@MQ^wzNLa=Kib z;{4Tz%qVj|EDqYa^CVYuRVBHthQlz<EfUUVlijEZIqrvKg6ehaiLlsuUx#jPFO+Tj zhTwHym6}Aj9#->S9$+<Z#aA`Y`T}V{?eH3&f;_08qbqk`a=l?!Kx_<P*Zzwy@O-4> zF0ft(U-~pEy&-mLH6nN)#ljJQ%|2nA(~;T;?jwN0UJ9H+VQ(}x?1GzhQiyjjIHezX z$9qNr!!}A9Z`yxwMa{liN57=rg_0guly`>S#r%#X4&?2x^tG7bzUF{8+(^q!!M@he zKdP@~{};E>zrRC4s=?I7YagVN?Q<FN`&^hw#}nGGBYp?OKx}V`8N9|IS?@HaUWT$- za8SGtMaY#&OlL2GdJ^z1aN$@|kxL~e7pX=-urgxAAkPltz<gj5To>0b?tmGz&c`ty z;ASu}A7Brxhm_$-m3e)J-97`{S9S?}L5=vi`IpGs>EGivUJ~3tfCh^bWbA_wHw8y9 zsRe0|P*ku-jYdCgW@2IdNhm6UgKKpm-$BNdbCoU__5tFAhidjeQSbkv)F0_^Pi=a~ z)qq+ND|m0|X_2XIp|->q&%%0r`Ue#0&!-tbbZ6vkePXV5lb`rBs;^y9nqHlorh^iS z`JCWaKM5g4EYE#X&%e`$-1|(QxK#ULHWl9FR&OH?M|mi!O^O}s(9}X!F>x5$f?PbE zI{`*>v!=gC%kB=e4J_4`yj_;Hw%kRiLX#uby+%O0$gfF#c;34(M?pi(1O$6_eiyX} z#D7YLh7K4|&24HSPyReyOcI7n?~~e7;rwn99hivOjaE3yq<%)`eK0)fGLwbS%H!i5 zHd%}<hLefpbh9G9;R0`$MF_Y<C*{LuYMYhPAvQuseSiTnQX?DS9@e6+<&8upR|%S> zCCqDzG?@m*YWqcvvpLNdy{K({caY!&K`74z$s<^&26=7opgP(I$oPeV3YdKq)Dz6W zd5xhA4(bLh9j`bF#l7i{MIR-o)2==zMw}@1Pcd+1xn%th3pW*R*GplWEQZ7BcHsVd zXN>0dcy1Tld$}rp&>j^gYNn{&B*pG}M*Ndr#Y}Z`b?;4#QBTQvc3Y(%Ip-w~;dmY` z88LARNF901vTOh(Pd1Sy$Q(7)6ZT&AB~<7A3c>18;m}YWeufKJ65YhjsrC3o+CA_Y z)N7K)NV+TXKJq5W@3TJ%n6ObX+xz2JO(P#@>lE>_U06OO*oEnZ#M2!xR=X@~pUIn} ziYG{Df~~gZe4?Wet@j^m=9(1e*cxv=SJ&r|Nsp4EHKxLr;5M4Zp>7Ya1kFpSqY~W( zDr;`Bi{LX+6MWa0mC}##`YhSdLdqjr8H$J&mCJA=Lg?q7>axc>!2J(21VK7N^_Ety zmF$;Gv)9tGt>SzfqP^Rx*2|=q*uA8cpbWW3?`*r4mL-TkkqbHi+*G<L0R_!_NSII6 zQ133RrBbe5Wu~{_UE;?B3k_7!fUAJcQmyTxs+#>)!^HHqyab5xiz7u%s?aN~2@0}9 zmSY5gs<-Yszga$fgoWr5^aNqPgf5qQI1Fw0G@=%RfR|YeJ_EZZQBKABjBsPv(OfkA zM8sVbsyA7DVom3H*eYEp$!%Qr(ic-)K2n9QAy2@_UOeHHxHBbZCx4JGP|i0Er8uPn z)|SYM4RNnBy#BFfY2#oG$Uea_v0TjiPcZEUs-HXGYBdALmuS4Mm#Zn0oUov9c}RSL zZ<X3lL)=kEzd_gEWg2AtXQU(`9?&a?2`5Ptx9bmbfaD7q6-TJ*#zGTpTQq^}XoP8Y z@)#X=)V|4MUa8@9UvKRTlSy=SAVjHX4;!%ABp)TS-{diWVI3D0_RtPcd*j@diVlD_ z2?-}B-teo0Q(A<eT5-S{AKA0lz9IP4%sH2L?BCp)$kUoH`8zxu5=}0+TXeJp_P@&g zB#>MuLlUwAj3(GDi(0r$yfp2<3fv`<Ik$GXcSD{m^Z!Lqr^n862XQN7o#sBZa4Ssj zq&HvTEShOthvdgkz+?9!FEhfH+}bUmid?-y2>vQH_~e73oKBmhP1qprT~zM7nLp`E z@`^LLW8zEjp%z2v##-oh8Iz$*AUjq-Wq>Sk3!0%yj)9Yw0`wlZ&^?0Xc?%>LLo@hC zxeTv3H7>!rMvl>J)33d#UVl>VQ1x*`rXC@#-~-~BRJwlyT}k(IUVg}>{cgYFeb1S4 zURvpyqs;8%q&$J7pV%a4%A;Jonzp#8g(N)tKUJPfUBdVTXzA6<0?1Ms>I8Ey&lh?( z*qZ~~l%wL*jYWfC3yo16U4cZ6tkn;$q&|VbpCd@8oaHDt8OX!*t{}5hb@*(>VycH5 zX5A`_;V(*BvK>7YoB2c84w*j(0y}jpW!TIh(>D+#{f4Zptc*o4LoaNXc`PVqS*-6N zYv_0foRbag@w=s6kP_Lvh)jRKR<-www^zUiweW+lebUu5UU9s~AvjOUebUq30?!PS zI?Gyc9y_p4=UdCAU2|bZQ3T7j>_xVrSbVT{_vvSqt<fg9S{7U2XTx4&@}cG{=Fnmg zL+c@?AEKPqWLauxK;zL>BYbnf@*{!l%A?!|z}3Rz@v!Bp|GlsfDG+RB%m9BFVbo~k zG7gKNHCTo-F$WXQkj6$BR}SBM6Yh0Hr!p6~yEwmin<dH?CU@RQ7A}OIE~4CM-iYbN z*bFN<p<pb+LDMHtWD9%mCcd@w-N^L%e3lUjbRIx~{e9SW6EpGZX9ZMNb*n2G&!RWW zouF@^kLv6siXHq4&56X6X0rE5E&u<@Y>`TO1c#oyBYWtPvLIJZpDP{0t8)ymjzxOS zF`?gk*BgN9l;H@JXdMFB%f-wc5WGjP4*6-!A`C9Exy`gpw<dTT4`DH)(nfGF<6qQO z`H?tQA4m@dNN(p^bFSG;;jh%BPf3(Abel_kG@J5G5c&k}X}>bYWxN4J&y!Gy`!{V= zKE*&^#W60ej!Zm9Rz0Tg4V(TuVxow#Zbp)f8K+*>?nH~sb5OvJ&{f?|SOU$=@J_{7 zGz6?HSAzYix3Ci;Tf+8-e5JF4Fi#p~nrA*W#xpW|+Se0}uj+;<b@2;EG}6dGW;RG3 z$lXWi6fdl)-pLI{y+C%6@h+jCld6Y&tw=sIKRI#N&i7VNF8($<j<5Ue6<qDGqoZ)+ zMY3AA*1H|~im;HRr-E<?Uq*&PbBh_-SkK7Deze2fl*|020r((j(=;}Ij#5}0?~tF; zvuW8G+DFsCJsl-d(;b{?pLo)TGOIz{?nI+}$4My?fkY?4*2RAxraqF_*`tZG5qn(} zWmBp;lF1tGdU2FL1(~lyQ5r$#)SGy{@#{9wsB0cwC)3}$!8Px(vu4k&)iWMrEce35 zrXqN0&==FlX8O-5D&S1E-%aln<@z7%{SGv^jqy3}7pjZU9SZl-IxB`trhScx8ctv= z2%nyv#uGdTL7;zx<j3jho~RV*LDg1LlG!Yl$%Zmy5GyheNPF8|h@*QDxcHGnx&rYF zhp8tL&FC3v2`x~$ZvHOxnXyb3bmLHlzkH(v3^E&|FxA7jrl)+)rF8$Teo=dzB@z!S z<dpz=6jKq(5hGq1b4CD8bJ{)>3&mzlYE$fG4#--gXP#oGpG|i7_8Rbpxy3|O4x<^L z|3YpajRC`7H;zBQIapIX?!m0u<vc}6M~!JC`-Dxof~WbfI+C(qp^fU#3~gRCQvU#A z?Ow_1T76(&M`kNT+uN{V=1$_1XROukd!Ipz??J&)0~)9>(wD4eMlUGSCaV+9idXVI z7^<jraxFf*L8vT3SJXlA7o`;6g{7TSHy-70-~T}=a$zpPORC`45x@6T_~W6>H~E>0 zVKe+NYL(HoZT%2d;$l)kJgB2=`(8Ow<T1mpYiS0&tGLE)AiqR}5j%`9%vWLz*1oI# zNO?h*@$ph4a#rF6MH&diB@{u~8qC?!@KiBRTFCvz6JJDr&7sFs7;a8!`iJ5_?M;(V zuEGcP`wh%?o$BPoe+ZEVSQ(EwliGAG?%%L;ZNcu&1j(myK8b-k(^xBxsH4JJCQa;B zz0Ye_tA>qt++l)dgW(%;80;P3`)5kTxE`U1EN2!WSW0&dhBpPwO+@7vpif8)YB26? z^&jH-^DBI18!&2fGiXtjA{$NcHaX`ZIlUE4Vg-J#1uztI)us~X=2z?QqepKVYGjPf z$O@u0bUu#^REv&YN`wnyj+TU~$dZmqcj5CL(o*e#-|*K*g-biBAwpRG6M?{$NGf{0 zh#Hl%rob8G4&y&%X_663Yw2<B@8G7|@uxu1j;~Z4vlC%YHr)}|6T1z{v`pz`cZb`v zGB?Z0@?@>mlWR{!^0c{I^HLE|ign&|GGhFG%<l>1U`&I*ULpyRG-_oJj$D)t_)NZk ztxN5%T8sEQn4>!m*u{}Fg$>J+l`g)Q9$cx5w+@hts(6Wn`4{!YdSMDVQ0fx@pr^}3 zfffCB%Ze*0;KDcIz7DDAx=dX@-;3l(5&~aO@&PcefT(HWdq;=Al6-Qf7#4M77dI*a z4Brom)-XxXEa<(Bg9A~^%8-L6K3J;7O=ON0IS6mS)abzQd!!now2|w8{`JGwq#{7K zDJBw6qjm6={q6?7y(-;$YGUq$r$+_iG}UPcg}!e);1OSjxsmlWnhDOc3%%+Oe=H2C zE-AxJDtJy$sN!p5FOg+>dC!`PqgA_vNi5H|ViA{9tTJ<8m`$jTeK-ZTv*@q80(PMc zN-ftlm_tzMt6#3+3AJKUm}7B@JHS*W#=I%6X90AasP50(cUa{nBa#e2osI)m&9eGn z0bsJEe>mM}C{KqQJ?y4B*yAyugD3e>GgWB>rt;nX19E%R^SlymlCVl`QtG2kW<23O zVAEuUe!P(+gmJDy9|2j25eV)yUZvkh>D<kEa=I)_-O_l^Xb=080hgv6%6rIT{+xWH zcLEN%1ay8Xuq#5!ywGqS?sOrxS%8}WFdlqHvn|j5Ayldw_woim&ZQqa8!nAlcrcSX zjiTRBR1i-LiJ#I~!*!GN7AUoI%vtlq09+i3*#~`0ql|pU8T9RLAr$B+RZgPeG&LfJ zGrf>YVri<&5y{SkBp*12rl|HII7pgAG#6-G?gl@RGp+u$RY%2BBHHEj6v){rCIgoR zkPrqftB?gBW765l$J?d9TFc6!!r|q*PO?mXkJyybr;d}&MI>;)iayY8#nM%8{vv&h zB4Fya3uP1!GViStI#R`L*IJtTehOe7_}@c;XbNPJ06i0DC_!sMGh5`#FszH1GEc!k zbc|Zh#;A0?X~qP9V?{q#1`9r<>6EUUjT;1L{zZ<t%a(#^kBFEMUx%gjxrmkC%_OpI zjN0jk@9jjAC*x(<lqx1(^GsX#`Otx#0C_1G7qDkjmL3ipfZH+5jj;T%fq8BC=-5PD zq<SiB%B4G11w#jg>qCZ67UC1`it~LK&3&!&U0kN6GN;8P1mac91Q_HNzyo(cUpd`` z??5bL7K@g@0lJVFut2hAR5%M=NEQDq=KTday|#46OVVGpLaiA~dH!Yb*yf+sv<AeV z1WLF5{7QL|Uf08s7V`m`#qG}>LZ=DzW+$Noo&NA@OyN*~B?jtyH<1<8u^hGtWbdPT zWUs}$CAe~#&~;O0^pM6^iq#gflt#&2MO-;T5uQh`;yL6hE)pb|#V}e4$8F%2U;s^f zU>Q2jt|JN6Z+2L)m!OTL17@QBkwbfq2jX(;#QuwX$me}vc1>au+7mbWnDewN%GHhm zTiz+@pIVi6VCdC&U$an~skgmzX^*~H#ekv@1B#q<O00cIx>K+XB+trAa>5qp*;{~Q zlefr&iQdCd>afqzv-^?#Mz6d@cfzBQd^ee?n=*r_{w|J&Hix`j3L?7IvX&&xQSLjK znTmxHlmMYzGVsSo8Q&W!;Gp$-qlGbA1%bSx#bx8<lSBu_17RF~jJdiPQPU-D9JUSd zG0L_dr0XtwtX??8R}oeOd2V{^9(^q}bdxLYvD8Q!pY3O%#kUdMN2G$0(Bc)m9RoAa z@pTd!JS>@N!uFPrz@n85qKXQaB(}?8F<>FV%Y{cUn&M_GLj17gLFVa@8E0_f9*`QC zDt?g^+1hg9HFKkL*mdFJnTtRBLo(MEenwowNM;sJ5;OR+Q0I8lx7Y~rq++Nf)JNS; z&YG}*=yy=z_n=4i*Oc=TCACi}q8dq&ZS#*p)kAHUF{Q9utl9>qH?1w48hL=#Jj-HM z^D@4wdF1IxN*-kZX%tV9ew;%`S7psK`r9JNC}v&zO#ykeOJR}$7QWdB^EJ;UudWlp z$00jyeG|6cAzprk@^MjN5BDzQj=F)-cw{eB<En*95rN@R12X$pfng9<PCV9=;jWTv za1nwFB|X|VR1$QtH8X}9I_;~z_IR|feNK}XA}uE}h&X?AUt1S``Ca>!m|d3x!zD%E z7&I;tqrp+~8BDs1^t}SStcyVeC0?y;*azs<IEsn8X<&p*PXO3XgJz;2SQ#;5K!ZAr z12uedO|gi1XX*w&YN^ASEHZ2eG-C2`xVBw&`=sGT$C;P?18Z5F3R68lg@T18;g=tS zg<}*x4`o9yhO4>#Yy?B8cZ<k&BG?Wnq|cDY#6sx>>K)KrEpC{8kj5|7-%mh*&NCli z51^X;&(!-bxgVWhWPkm=>HIz;proVc4{#m!<F)qS3x}z3z|}NlsfFciAn!bD83<wG z=Pf93g}jcH@u?l2csJNZ@(-Q4SD%FqVp#oQ0)6K<$h~7md8RX_Ex;mull1D^6*ab~ zHrY9GfWMOOvG0R6pU{sjViY%fC|Y)tJebUM8VeSlY)(&rfITF(lWn<5CfY^R_@h?j z$WOpqE^jYmC7+Rrrftfv0RB8pbC8BsQB!XkDJCD06Ix*XQH;)>gt2zyL9#HrH$vt) zh8Tuy24=F@%d)FqdDDZ+rs77JHyubU(YErUxx%nLSk%aE6L5sa*f48Rl_NEhdDOdc zAiaiMzYXOoKs)DA=&}PYvfwY+^&Z$ifs7@nZEa#(FHRx`WP;?6uuh?ksT9{NT+c78 z(ldWb9m&kVd99($<$-W!Tw!&swk@?f_#d7oT=sJ1IU#Y<$o))3a77*?^VVp`6&rJ# zmqT4WpH1QQU*=xmQ9lp2JcU;G*GOJen5b!rgO0U{h3aHC?#Y>{2>rys7<Dvt{kUke zeUpqq*xv*LhASq{=@H>YQf7rPk|%;T2{)4PiL?aY%N|dgJPX0<WAuC5jWmvq!Ml-y zKf}4(72g;k-a`7ZQB61thevtR3|~S9q0g5<4(;BrrN;@RErFcb<S#f4^JumAbJ-&Y z_tzf$D&CRH(FbOW6@VbVEAz4{?KR4n-$UKLu#(IOh{gJ&;9$*798@j%Ox_gqQMZqu zLHqe#u!E*|x_IUTJOevZ@FOI{Bi|+G_fvjMP<%<}1Ds~vM?a$t<y>cTfd7<MsiH=v z$gU(ClU_bV>1EbYc*o;yye?Dsuk7&u6WL*mvb5xOwiRy6U9s2j)y%0LXe{3wRQ%p0 z^w3g3qUmvT7S~i1+rOhd_rCb!3gAv7D}clSx}AFJd400u)!#2P=y~qI67=HYb$Ts4 z_g&}<z)@T&!{0$>ImB+w)fY5AKEheNALQETd)F=kTKNM&75RKdWUr}zPu#NoE_bbd z37r7j<YgO-;bj}qi}RrR1YI8)(?i06%ppCFBl}fe*Jflygd&)ff(>OyISHHd7Uoc4 zI^30u@k_+eegyJ`j;~yXWW=d41q`bw%TVHOo6#4Q6mtEz@{NA(mLT3{Qnp?8+g}_K z0(LzMKIUAdCr%REU6P*`r(0OAQVB-1l)1&b#j;T@UYE<@-c8-d|EJ0`mjGva73))8 z{<`G=#l^7y5qk3Ffxm!Q!yOZE7eW`I+3hL{SU`)6Ifrx#?n{H63as<FK4o?)X`?7> zo@LM%-E|<yTHKdh^;%lu-JyN=JVr~pD0-hb5X!*%{5KOM$#ATpp)8;p`o%L9@C({c z${^t(I2>?%PF)p%#n`$K=Ic_sbx3s{A8H}<q3R{wF{F?A+9%zP`CM@yuE;=h%stB- z6<1eel(7{VRp`K2q0cYEzwKO-BJ3i_HptqGz9pL*Pq?B@a4(C7+1NCzm%>dwmXO94 zX5f5Bemjgqtvg}SqD7;P@WtdYMVl)JFxv}0y}nJ6M%HDx;NZdCNP&F)zKjpTSOlwh zoQXBX`ypMqnhMc{8FBlgQyB+*EW8cnYocsnO@GA=WZ?zX7z+*d8_XNz=fDL-T)!mR zMCS0iTlXHUBe6<>BT#zIH8pW7W<&&UEAHQE(2NsUB-G1RxK#I%1W}E*5qpZa4}&6o zfF}_;=_^iy1wjm1I~!Oo&{j#MrmO11L?rSG`j{u`oGgSRO^e&|o*vG|R-v4UV`YN^ zEr1gFIK^g$^|=W(HRGZdsVJ$4&1;<JhHR{;Y1|!fOTDnigEIT~_Cgow!XW`kbP=cW zXr}3#Z649ZdtS|k(K!=+-^K5-+Xq(B?b9e6$#8{<AwY(Q<`~p?hPeyOY>Htv&R4?K zWm|@Ybc-B!$sQ};^PU{Hs0v<?W8$~r)tOlg_vdN1AH4iq;`*(I3=aH&8hRwEq4&9F zhHf+TNi~HbGKlDz&28ivH}Sk6uJ&<lL0GNf&VWtfX!JTpPwh?PD+O@7TeIES*#Vd` zM9^QRpd~TEAs`xjgNkvwq3OyPXPv8g?~PQ8aLWa56ty)NgJT>wi3Tpvl9ImCI`YO@ z;zt{|agbn|1D}smV(See{BAr#<F4#lgr7t(#l;-+o1K8)6H-5HLxMO!CFuxR{W_Pi z2dwI7)BGrV+Se0}V+Y_v1`=Z#(dd`b#EuBy(xFN{AZ9^*$J6?&*M^kKGG4bW`r3pt z>Q}xIN5`uFgi1F_SR^KX3EgUn`~Uk%WX|>K4X*iRB)TZ1$&CpD%)z<Zg#j&porSza zai*`6xp=q}>&+6}giy}S?@JbuX;1i@Ve|&5lNDU^*O{o3F&4z0UQklT4mIIg$JmH? z$XEDKh)I#@xbzSj#c9KfGOn(P^b<!Sn5hvsy$~eSh73`?UfexQJsoBly<DF`=Fh+n zp(`v5XR<~%W*mZVTH9%5V-z>cHBElQkQA_IyoKGHB@zvduxSf=6utdeUb7WL4=LLM zh4iA0iG@YDb*hmps-gD7ZgE{Jp8n`8#$F8^JjkdV7P5@bYvEBDA96@r+~twCE<GMt z67ieS+(nMjN`31<WV!IO0XUR5@haMoHt5Il&`AAnint~Z@)B&#Rh_k!*rl+&u~NSo zzxo2J;k46uoI#6^!~A3PEnKK})KGm|9KN8q(M$4tL1&J5WiV7BOn{vm@dj-}NhG$A zLk9)6LG~`r(5B4C=$>OO(~%3~AP36y<n}_6e>8TRxLEt~3D}{<WHGDEfXg_K?Ig<T zRiOu?Ub=0$-eBc^4s108OjJw1<oKo948Mc`Jc=;Ll^6qg`f5LFG$Cb$%RfmQa#lCn z;ZFkB*QfDy0m$^#+Z8!-Nquga)Thl=naA|XE~ha%qvyZ2H}OoaGST{F8rrVC<3YKZ zp5v*24wk_XYFoEp=aR4hMFq(&KyAdBw_ptp2Er(ZQy0v{l(duNMmL;XvvGl(r<Q-J zMBI-t#l=yJP*NayeZ8=i;9fa6&3r;tE)f29W(<{ss|$DpOYO$6E2>hQzcbe_mb+H& z<SWr6hFd3gQWlE2VpEy^EbMXHpXcDpmJ@p=T0?EBic1+T!*OvB!i63uhpLFNqc~N( zw}U?AG(D%@&~`j*z3O5dKvBFBuk5}9JF*&BW&6Zv0$+L+U9?v$t=!Y}3ylxCOg~fY zE>m%XxEfbIbq10W9>BCc-y=pgrbvs-g1aG`<;iU4%YEz5hnzy!kXuDS`CuO6pQj_w z0JezbI++@o@))?=xB!VhI8+bM^3)!_W{{rTZKc~(OTXBfOPPBI(-a3}f@{MJ_xM~z zZpiopjCH_dG}bJ08{FbKwK*XHZg%r!IALebC3&l^rhsvoQyaZJaBZfJ(|&>E2)C9B z%f-_=d3o40vF+jEuY}V&!gb&w{|%oZyT{`XGZolBh1@!D<BmEp%qfn|9IF0I@GXEO zC+A~ZhOIV8*6dM*x*o0VQQC-ec)os76W^!B;&mMo-(%LnhE$%O#!U<BgT1(e=&L}S z%VB`eMf>M1F9N2T+KoeEdkSWPv+0wLm^sQP4h||(V5P41d3WmmnulSo+x%et%E=Y; z^o3cN=X)ifUJRUxnggQ~>OM9FufXUppQ$Hz()l5Bog4RdDs15X<b*00K|H4`7^gTC zCcAW8*zzC)Gry{b8NSL1t*|pn_!%$bawhM*_<g*Fs%rAEUn#saHG&?=YpxJ_*ndn5 zUnEW%r*^?r5ufYC{jqo7u#c&c8*Va)!<hOLU1sYZUS_KRE;>koxA7_+8okW+N6@;| zGRnh#;5iOy-r&j?$YDMH8@&^;iSTBk+6c*=kdh00kV=n(SnEKKR40{6FNsS!#wtRK z3tq>CB5i8y1pa3*Y~jI7YO{~kQ1p{yzgf?G!`E)%!rGEcUq{1B%pci0i%)e^DN=os zMOS*Kq{2Z#N<3-46okv|)_O4;ypifb?=<neR2|{o0C77qo5NcL)+1_#zUV%a?9Gm{ z$#gyKl=)ssb<NUiR5%_1?-#hntU8A+EdD(^`FOjoE-Y^2ua_*bPE?=dCjXk24QN}E zns5Qtm4(ys$KbB<Xn?Tz&4h9`dY*&ugV$M_3KbxW{})kUzk!)$`^7Sxp|A?zeu=cB zU^qt(tfOgGHb!A4bH2{IEff3S%3M8<ZMgWB%m+e-uU){^FGkb)ZA6Y`5}9#i@6Iog z<gpe+gaK8)=9yaQo~!#Tguj#XfgAT(#KWJN*QOm<emEXFPAbAcbfE>eRs6|8_}o6) z`98eJ_-mc-Fwg0YIxXIZnH9_gi2EB<(-&bAW-q&uWKNA{zMsNoISeeWX9;n3{3kJQ zO1h+bC58U1TkIAvJj$)Yzv11!s$y93KG*Z@tL0_(K)qzmYnJVi;~s2Ozobc0d_QrA zV)nB>5REAm111Kh;R2_X0r5`}Nz+P-`lQm_9BHpGH}XBh=OyfrO7H8Px!R0Cv`RKY zQTi}N=tqihEK-D5*0DN$0_s>8Ky#YrL~bMrrEhdtIFO@8qe}-hqW*!_c2hCeH;K-R zfddv|dbwYo>c^GxZ!+g;>@Zi0Q`YbT;;XK=Q7e65W{<#=2i~VcHE#QRj}>~XXAoPW z8FP-N{FTZX%K7lYCE@~q{CJS=s-GQ(j>tMK-IrycTut7_erYaaztcEe=K?|-w-6@v zlLM8g{u-j8%~BF;M?_ay=0Ypb3FE~Yw~B=lS0Lj0b`^d-+W5X&cjaDhv>@#Kqs+g_ z$su?QaA=!osl(xi^tqwa!AC9$IGn&XUv&F{n<KTo;wP|6N3i!JP%nP=p2rb@A3*hp zd(6|$McOy9(Bj`Tw1UH;fsxSS6}%lbpwS*zL9B=-Q@gMuXo7B|>i|_$w2YyOYKS1d z@<0h(NpT~KAPrkzpsb&*V!s1AIy|~v`A%ZHYxlp$=B%6u*KT6pa-gnItz#tfgd3N! z!{7CQCBz#b%hRN~>j&Y8>Xq!C7j?X5f#`ZwX_r{_Q)<mPz8X^sOZ4&w|Fxu@Nyq<M z(oWC~_^&1HXo>pQlJ<WsX}|KHNci7g(*CdP@c#?hVT`hrU3NFt{=~Dg1oydLnK{om zGFEJ>vKJC#Aoi&U5=~zy;xTWAoU`IWOoKM>WgTa)rV+Q3k)!?A{kI<JLQ8*&VC={) z!Bu9lM}&_xlK@lLN|{69lmqlW7iY4OFGe=A+V=u3lbTMiSp;;GQi>{aMMr7wGldCr z8WQ-BX9__lKzVX{&KJomwWf%<DaLO+$K4Ny1-6=1Q5ssH-(}c^Nmh+-Q{y1%Mg1@d zIJ<C<t>TKVD7^%mT{vJL9OW_`acYPPd>GA8a`tQgYYNrc9D}~XU!Mw8+Mj#Em{CYp zl)zSU*&d12r*iXF(CVJ>d!f+6?B8Lo(r%Mn(g*(M_0-(2T)god{2tdunEuDga~~QD z?PT)W8<qnMY4#1i8~0p$w-U|u)uL<DNie+0<wxyQtJzxB<cMjQb=&<v-FAH=K_aS2 zC=L}l;J2`CwI1t_?t6b(F%*kOWiAspuJ(~0)z%NKdD|QY({?Mx&5G;Y;&w0h%ddOV z4$SA$s^|{hIfgmatFNxeSin|fRJ;g<8E#wu8ThR$5&zp7diJRGu){kOQ&}|ZBu?6> zq8jce2VE?F$+jY|8@Aq%r}dEE{|f!e2tTBi9Cr!31h8BJi<fI`giD$*63*&bf)vQt z@5^u;K_;<G-_?i?4l+g-Dg*FjbYaHv;i*i417VA1u5&WB&^s^l2D0#G2iYIy^KLY6 N++u|>f2&Hg|6lU0@#g>l diff --git a/client/resources/hardnested_tables/bitflip_1_191_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_191_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_191_states.bin.z b/client/resources/hardnested_tables/bitflip_1_191_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_198_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_198_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..f8e066f8211a4bf44eaed3a51d945912ad5f8082 GIT binary patch literal 1605 zcmZ9KO-vhi0>uY^jP3CVf1By5TH1n*KSs;^dsul_8?lg@5IiCTV>7L+WajTmTlHk$ ztf<?7Kfs=`XlNGdm8#t?A45XC4RfjwX*)BXA<eC+TB(OhHKd1hwTcjOqm-nfoco^i zq<4CH(r@gIxBdi1Uk@f<|J_~nk3Hg_k01We&hy22D`G+rWZqys4Qr_5`u?>2Mjs)_ zy=&75^5z#I1bOvMFM_=ADuy8VKYPxH*3D;L7!~W*g<qic>cO#F23$mfOEL^oAk@U; zF`Ym4(zp7H%=PC)tm(M_<I|D9-8*u;Upj)B_{hriyOTSu^5xtvC8D7QRkC~GE|aS8 zsy<qSfF!6&ji*yH-JK6-&oAHs)Lb?yf8_>S)5Of}*CO4S+p;+!Z^h?aiH>ii*dU`` zozjV-sxMTg%mY8TFY&i0hZ8o%Bjes-?3OCJPA4=?59P{toNIxE(TE1BaFH0=@G=dC z+9(<AsN)9Q?wky59un~Lc$<IP*mG&>zi{TWxF8pX4*TVw`~Lsn=l+?`O~;O1=H|!> z%;15}rlzj-=VLTcEHF^-+#xRCr)QrDN3pGUu#?gLm89*${XhYGPa1Hio$8Ld{r%&K ztq}yj*uzd-s{Q1cZ>zid{uF7kc)98`^Zpe^d57;VeMfC?5bYnh=eFuIyZPbhL#ZB8 z)qNtLCkHTHu=6UnOxleYMa^xLbqHuClgThrp?~a*??<9JWbgCim&Xob1YkAoN$(%} z?p-Y{DdgOjlB0y}4SkYNEqacw27Vg0UMM}v_kFSRZ*E#jl%HC9(Voub_ggaslH=Gt zGHvSyNv5NHNVEW+G_+lUz2B_otH%Ucm>Rz3h^G;DgI6cj#tuk_Nv3($0N9mMM}@gu zjBWS1;kaYr@B(%RHRyt`_-U*qMh$=&diaau`lJ5AC)nTd*<-8a>&dir+p3{aJJO}H z=30@x>#M%Ea(K=$KP<hgrH-t^S3X!4ac}=eQG^Q2JU_XOgij2seUH7Xl}P6lg~z5| z_m=E1|0UW3o1|M-7K#AMYJ+KrQLl(%EW0l2<oKYfbCgK6F+eDgS;UE#*s3Zk5KQZU zkN}{d#y0k-!*gzJ8As7b?m?ZnS^Y8{?!)%wSkfd@nN$hOPc;4$6TPzB_5-3BAet#i z&r<VwN=gR+N+wNGxV+@|GM?h~q8)?dRNKYZZ4>I+%e1wCc`bbvHwz`&MkmpTHla2E zv-!c}I2qb7Bn+Z?z`d%eBnimZbOF;Kl|=o1oJa|HK(K*Ck6>yvUy&(7ic|2ci@R73 zdYoG0W?A7%eis+urKFd8WshLNWYZt0d#rK;qQL>DDnTlufs0keXgGjbx5O}dRo>Mn z=`i1<=?PY+pi*O~8&Kl_2{;^zqz`==Hqr$BM)o4)^qB<K^dmZ#G*_bTe?Y+}ILV-M zl}l0A_7QnhU6(VVUgrnylzP1!P|hoZN@Uk>T9q>l35){PVs?po!lh+B#6c`~mnaE@ zvWy1t=pxB*%g%$=10wrkvc?|hvDIo$d`XoA6lYM9)j&Qb#nwC}l%zn`Rz8qYZJ(xz zLmpm-5VDY~wOxA2s^>EC{Mq_!ek{qyf_}i{m1R$FOw;R757Xf(m*BB+(3IO^KE|h; zB&O5`;W+L-MFiwFnIsl<gYy+Ob%u0GV9u%r1N>byS{v=0bAzN6inayjmREtIy~^sK z4(zx;AY>WQ4*;l>IGsvWdKLm5i#1VfdqEj;6z7lP<7Cq4v7i1BNkZb_TI0W*V3Md^ ziN?n%ovZO+w$rYG7;Kwm>73mk^^;61Q2}&HRkGeT#?=<XG?6AGijpb4&eZ_i)VZmM zLe9c1RuQacPrMh#ZgwJtFm=mg3Wn$AyR%yEM#hiG_+YPPeMkN@)NNR{2-@@2w(pUp y*e2+dVE$(GySM9CvWvqLSCGObVh_mUv6koeOH1orBi}tacr>w%xsA+|arsyCa%v0! literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_198_states.bin.z b/client/resources/hardnested_tables/bitflip_1_198_states.bin.z deleted file mode 100644 index ca490c4fc778b4efac585fd7a9775ac24b090472..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20107 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 diff --git a/client/resources/hardnested_tables/bitflip_1_199_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_199_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_199_states.bin.z b/client/resources/hardnested_tables/bitflip_1_199_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_19d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_19d_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_19d_states.bin.z b/client/resources/hardnested_tables/bitflip_1_19d_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_19f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_19f_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_19f_states.bin.z b/client/resources/hardnested_tables/bitflip_1_19f_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 zcmeHMe{dAneP4}cs>w`^CdRfL)A-1E5}Xo`AQ%KjX32P5(%P+tI*h;+R*jv?gp$L> zSYU*nX52|kW%=rHY`}mHLsEeS90Xzk0zEmlBz{SYL!|?Ry!Z}jK_}@rR;#`J@!q%J zcY89jr}jVXbkZ4CGj}@O?%TKTeZQYyT6cM<_tJ}lM<+<<H_!QK!``RwoAHgsUC$mZ zo1^R9zi$8Kk6xSn<l066m4a)X_)c>=))<oS)2H93!>GQ8It?_vFsAKTa9Hn%hTVkQ zK~k*+il?SFQl|v?J{KA^a?dedLfD8&9jl1P5|9{nufP)64+9b238sHZQYFXxm6H%Y z0K@EcJLz_5X}8L>m=jLNn!sJZTsKK4d|aSZ>iE7L=D=Z?n)0GvBQyg3HPx!!rzPlr zDlFb5du~ZFJlh1+NnSE$-Qb!F%^f5OGkC0~u$fUt6D4>>fxN7e;iW@>m(8e^&qqHq zJ{wI!&2o}@FNmXp)WX81=Hy?8d!3-gSFsA-zy}KFRkLs!-?l(3x7t)H-Msl=c?w%b z@R`Kdys+7+$?vDGEFI)E`8%No{~q-4p&DeVS`UwgW6$v>p6FJ+yz^u~4kJldJ&i>S zB1wZVM2vQ2<F}8i)1Vg;@)kHiQqyt8MgdRbDw8E~RO|As0?o{m%3vx<kv5A549%Mu zh$o!_@gi0xPkQb5VAx8m2ev^!`D3br=asR|G<`sfVbNQgX(~^WT;dXmDg0IuPM_G5 za2ArZntzW-Dw)RdBrgY-LT;0v<w5d>T@N|p1W8)QAI_XANveDeAM<oTN`$?f5t)^; zJ{$-i3+HJBvm=U6;`omgFEGhZLJRl(B7Rey4kP{pt>!<#S(I?8jJ+k#e}~t@1H?Y7 z@XR%xa$o*cTW-TiZpPEA-GD#3B-N2!d=K?%{XsfuUl3<|5T0ZU#gqI4?2!k83?Fhe zWTu1bR;U{C%n7|=+VKD=T5`@qQuW3+S;clY;1XOyv3j1$KXSCVQv`iMo&ZrdoHoIN zO}LSPL$IAY1AH&2cE!uyrH$8ac+}l+h4DoOc{B{4xZ#v2$zHewO<dG$$|PoFCRfx) z2H_krOG)()bgef@erE-(fT#|F&s+iJEN=w<z@mC!G3<c%Db^4^9`q1@;?Gy|coIgc zcz+Tk>CqlIqjCH(3rT7j>7>_!tPzU}=erHRzUp1D1DTZ*buzZi(uiU&h3UA_nJrw+ zKdMhzcBCc}Z-{IoPT<iYm<N}fAS)$USdy;X5BJ!V&FK$w{3wn(GW|s_**xL+<wWaA zyt!CxJXZ5ZZtq<+Zr%IT!wSIi#}$jcY8TFv7L$o>jYJxO?JR1C(>o#oT!>W8AbgB( zA9|T~bH<tnFG6&Yq*bG2Is7I6b-E$)gj;FQn0I!$Y}`E`evf@6Y72I#;g|dRJk7xU zcZo`O^};^q@ge9S26jq6={Kers-xJR`*UwQL>EJeB^$Uh+wpvHT(!^Ecqe(0mEOPt zQZ=GO#jdX^gk0%2mx$x3@46%mD{-CgYSU~PA%Mr4M44WJGYW6R!Lf%SX9TMkJ02Ip zU!)d$o0n4zAEvRUZ{c!U@N|F>Se05^X|6R&vgIk=^cMOhk86D@FdyEMrEb~Iy-u8n zlf4perEA!%V*X>t({WZf0DB(Xy|}mSv+#5L2FZML)my?P2b;3RnSy1<N?@kn&@EhZ z5RwAt#A@uLZ^n9L$swIQ;gxuu(U1UlX_SavDC2&C7T{zG6xNE{)umKQ)w5hVLhjXg zk5>e5y+Q5#@yODN72JgQb5P(jtn|8~@40_&XpHh#Z2?dQ-W_lUzjPejs*-15in(QU z{j#nD&?vWi7a(&^i+xxii;akj5V6Dw^Od5)#!z7VIIXrf!~d+3Yj}^VSiCG?E?|B6 zh@^=7FL-Yj^L4iQFg^$~<y47E4;@pAYhl#-As~fSrsQ^u-8BqV%o<FEK7hdKwxD%% z$Z>AijaeSk-H0J4h;AyZOS7pV<G?iNT~Nv2S@6jTsMyFWe*WNGsNfO4-qH>a2RdY? zrV&Wed8&4TtJnjv8Uz|UY{)wK+fLXez(GK<8^E#1Qm~vzKU3I#_$D2;qgxqVAT>j9 z5`wB{aXF47A+Glz#)v5=LU^OSZS;(R7-mx^*g&bA^P9(ExC-7nNtyrwzLMoi31p>& zyb}tBDd)#b&5nF=tMjF9k{Sv~Of!gC!S-foUUH~Uc*DqvV@=vXQ>7#x!78jHm&wbU zh?m?WSf)Ky0e6kBg|}5`fA7S0*ns;`21&d0h#Ou+>lw9!{1~)*Y9)W3FM+9HqSS^B zcpw2ccsb9-?#_ZvF-dt(RbpGwLGsbp5ncEW(cK|B!2@@Q?!O_r8eKu9Sq49YNwb<Q z*aH3G^!+4CGcQPdvNV4m3#)LC#x)<)kyI1ZYpq~N@<-uqUu9iH%*nkDLR6GyC{D<e zYNN=`UB_Qdp;+ug%pFFR@yRXXt~n>OEX=nU3$kdvj(^8j3yVR>#v4?q&a=pycx)#~ zn!e!4e3quwT67PD;Zp_;eRSZlX6N{r0<AX61u-I-3fcKP)Sb~Rxw<4FW;YEH6*b6T z{aX;E>o7+^c51F7qfC$GUWBYPY34aX#S45iv;3ALT^@uJe3AG4RH^c-QM;eC+M7>S z^?$dTuVe*cqB_hC%R^_*+EhoP9fdmbWD_hgH(VA%JM5Bka857j51aIsZFQyRK;#e) z50ie`f2MJ-=l@kDKLHs|x=?T$F6yDJsKYYf&nEB4)qIM0fYX7=Pa*o(`l4#w)&8$L zXNSq3Wq!SChlC)z0@6;{EoAYBrl5%$DEAJ{4jr0}jJkj!>9vOLhT-CO9}hP3D~cB6 zf|g?B4K!ZFvC4ZvVSM)~lQ@a`2y{`3dKQ!lP3Nkw4UyEqzl87$Ghu+iOROSUevW7n z-lka%G#N#+rZG)59*e*lJ_Sdgi|@LiJEm;XX+IS{3};rzKS(c!-=eIJ@Xs_7v!j<8 zbP=_#@vklT6s%Qz1NeG+2u0O0BBXfw1{%p&O%Uq&0F-%*ePi;FU1713QN9XtkgJ?L zWHF0$llf41g)p`zK@H`LauY=lWHb-eVIb)|BV>6BHJi{j!gt-Si44iLDcA$Wa0Ko_ z>0&A$RQ2QDd|nH~WCzN(G6=#pnGYn+Z~Ud5<O+P~Rj`_njlvw2kYthJtZ^!aH+>7{ zDs~Ob__|)a`%kbJcfa!bPuEWR)omyE)qRLXxtf0;eWWlQ86SzYdCISERJs#|C>v)X z;`yk+3kO0DVnEzkfEF%+9fM}iuk&KEz7F=jc%6Hzy3^oPso%<x25Sas{0dwYeJ7Ai zC!>LGcrZ%sLSiVHY`}zGCjU*PSqiT)eI#0Hl`!;6hvVw-LnS)&YVlz!@-FPQz0jxd zx~Rz{SJB#tqOFNQ1KFQ~SAOx2P|h2ull%OfuTfO<pv6ggrPyJpR&IJ4pOl&S<hT(a zP;VJU1Pfv3C0@!$(aj$qc1_Y*!@rAQWeOjM<`e5g4|hWLd9hA1#`YrQ?nJxigb-eB z0jJeQU|ua%$+F6CD;s-JBkx=RmaTT<NDgKU(roxcy8aXl-FDYFotjN?Vy!*jwY+fH z#GB({XGRK+!%&3KtaV43jc^z^hfUGqY@621a0dDy#SkW0$uRt>$uEN`e$3&w+gS5t zFf>nk;V>9ZX{!EXOfoL(+u&YZ8FjX9mYj&dTEuxsR`MfL3w5Z&uDFQe@ZKR_-j!Sd zXkf8Zro)V|yp?pr8C@%l>mF@$$Z^<;D|6MioESPN%daI(daPYb;GfZR(TTlZQ3wHP zatFVllkO|vdJ3*{a2lphIs3qmP|zZjiu6Ou^e|Eq8ZGR2^cVgjb!yizeaIh6AC5w~ zlXl(U=e}7iByNfx621<Po8A+?>k`mCACbE&n_J*_v*Ddg=#n{6yp%nVBnx4Id4KD` ztO@WJpF2Tay_I(!2{L2<p1*<qFH5eY&@FU#8OPNqW3@=vIp<-`sG^ftMROH~S*>{o zVWN05vXVdT3wYcv!F<w@OR%0bq(`-WYKLF)I>>mIU(1siMPW{r0ca&2X`awqz6FNC z#9~0Pum$gq0_)31bw?%N=E!^7kEn_FU&d>1hX$SDK0h4Vhg5y)k1(RdZ}a^Z#(B6? z5Bu5DI{uKjhb1F#V}esiRx<(oKZ=L0rP|L%GC@oPHj!6&Z3m03@EYl6+h@8t&B@?u zuoAR9M2;}{@vN$*_Epg+db})=$r_^d5||tDBgh@F2`}6j4_EOu$05{@>7YTMF)pH~ zBc|E}b!*`Tbkl9<3R~rMy#LEV<jQ~H1wTV@5LT=QUc<3^92zAvlYqHXD7{vtor4hO zOaB>?jBMzq7JN&XP{ehS-5|y+B_qTvnaLN`A%=A#_bp{(jOK<1Sr5y*4zWZ)T8yl; z1acT%4W^~;hfb`jFKo348#6+u4jM4x%<w!`kTC4XM2I}-?0kk}wbYp;BA%Px1%CJ` zFHRQpqT-wT26cnuYhiySmnZzs(v|<uqVo>XeN}XDhv>3q;s1!}is9}6`r1NQJD56& zkx3DJ+@8kZN4yAKoFn~o2r7AfdK6WV!1NuEvl#jcn-fU#EiB?^keK;#q$AW}*#Cm! za7<)kdOFZz1YW0^#1?b%P%88e^xV!6G2oHUWKNY@jC@}$h&U0$dRT<UEgR8a^_FHw z%wl@=iW3;agJ%tc@(3)7rn;h-f%$H5yL=XBg4w39fdBqm^nh7%y$DMIXZNa&2~f3J z^!J(nuBev~vNvhAvyh-BY2jni#LO2e9?fVBbIO6te_f>W{{*@jiIr@k&SOW^BAD7q z2hACUIU`C!B+AIYn(eJ9UET?gqh>#d|GAlZnW^t<7c!>z3OvWl=aC=6K6qQDkv7#P pwI;j-GjNH&bX0$@lJ9oFPWA%*F>jwo&i(IZmEUA}y9S;(_Fo_fJi7n@ diff --git a/client/resources/hardnested_tables/bitflip_1_1a0_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1a0_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..da20250ec847167654be230c07844676f1e998a3 GIT binary patch literal 1541 zcma)+YfMuI6vu0!*j_5o$Hfa#p+HM}TeWR4VTn9i%A*fvY43$X4D?<hsU%A<aS7Rs z(9*KDpyPEF$)@E|M@xm<L=%>|*<PumWZA&MX0m;NO^t5R5Mp4u8CJJ_^UHFQ^XZ)A zpOfG3sGDr>C{&FibEEh1=UvIi&#zVg)R93`(8_5CyUP>3oTg%0nPq#nXf*x+O-y6@ zRwh*g+5GGxn=(n=Q*|Mw+-9_`_!jpiuljTM(P$<eY^x}b4{y1EmVxO|uGRON<t5BK zx+^ln>YU&g4{mg(Knl#!5$mw7|GM8jRS*M0s7A&$#WhnKEMrV9UP3OhB(3ThF-!)2 ztl=yT-gj5xAor$UHIk@l58CxW5EUjimUTh7R?j6`=yT)vox9Loh`wpzSo)!8KQx-j zarLFLW%c})#hJZKEG?5!EM>m1pigt=Po;-17Cuny<ftdt6<E42NI^np^)~#f&n5lt zffmcsR`4$vTSXIf^}x_cF6Dz5-4#F<JaN&8c6^z-lFm9VaN!mM6s=}F=@(FGle(8z zUz8LPi}4eu;J(4hDjjwZJ&TiL=Bg`DV^*u}3UrmZaY%<j)x=(8M$+DVt?uLK*O8uO zYR(SH;Es#HLocNiP)eS*s4wq%zu^;)hmaZkL1P*aGb0D}rn*3DAtztb?w#d1AMxyH z{j{-t@b&M@+{}!Lb~LYzJNE;C9`T|$6&XeDah&oX6`Y7#V3yMgV~~_#b+o~HW?buR zRoR<RvryGQiYFiQAy~?vvKqs}9Y*S75L_2G@Bf(xz6(&rA;_Y@<Yn}Q^)S|8cVU=m z!#d06ygXh!8deyDCA{TkVACSMHogUJ@xEVf5m+)A+ew}S8I$y=3ai><X>iI%pYkPL zbmnXr$@T`r0J6k2r_d~NgA5L(0%jmWhUB9J8-gGg29;BCnIw^#ypfWHT<0ZU0@nDH z(oK>nfaS2xJ%jYH@}d@2D%3AaVJET~bi!jO4{@xDIDy<Xq}FK@Ni<kqEaQsaw92wK z1wA8rR;Ieud#fffm)s{%ipJU-vz2Cjrn}1TRatu&^=|Em7l$>EG`s&=z)F{vGTwi- zrha1q=RXVH7?6|nwA`5BpHCC=_Z2CX_}iToK(myXg3TZDN``BT-mAVJ96##&M}b{u zOc(Ij)$6G9wl42L&F1YSHbh2?@p*a2nZB52P$AKCaxDe^kqHkqGO!@5iHn;8dA6F` zT#*YQiG}Ijf$1uQIBfI>`C%@@QFqLwiEyN7K`jb5d%x0yuN3`??xPGl=uV&?_1H1U zLXuPrt9%WR9laSFR<ncrxYE@;xWmT&P%QkFQns=UmsVtE{0W2v4vVG>pPQdI-5C`A zMoe+M!KK<HK|u&Cm>0Ur<*Bq@zS1p-qk7kqW_PD{gDvG!)_XwlQ4N-saW-7mC%tRB zIwStDG5JyZ+K7DCwdSSpv0KDA5eik+7dna?M&u#s;^j)&u=d$b_W5s1HHUh^bM7c+ zc6KyKGC73Q)rJNP<J0G^51WThA48|&$~x2f4UO%xcB(>4G=Sic&GGQlLhf1kQbqui zs`y_Z1hPt(2~>%LU{(Wsib+8zhSpg_U@|2K<^7<8R4H`<XB)@aW+J6^`C`wJ;84Z7 zSdP?7Y9iyf{spi<f;4oGceeNpXyP~gLSojKGqTI@L~&{^37{xH6+H>%Z+D(i;P|NS zgF@eJaGk_TKZ?xROG+4<QhMYL?M%LdZ?%YJ;)oR3?ByNsc}oXsh}~R~*yA0^850)@ zb;JLIc{7_}i|C_LjUm5aIF)AgJMIg>3F%wN7bV-K#*9>v<7Q<Rii7o_C~qKMG=@N+ zFJCAEMQEc==FdWPYwD&H;G4MZo;QqB)A4rGa54n95@uxRv_y4o^#uOB<}-ksG^#Jo F{Tn>jNl^d* literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1a0_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1a0_states.bin.z deleted file mode 100644 index d6041407c..000000000 --- a/client/resources/hardnested_tables/bitflip_1_1a0_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xMr,Inྚn<լ%HռE/hih03?_}~]_}M}߬O?=ǷϿ/o???/oӧO?SOOS~}WS>}?__>}gWN>zf~׏?+.wE>?ӧOT?}m/o''wӧO_G9__g7??O_'''[y=7ȧ??sϟz~ռ?g?99y|Z?wZ_O}"}???_%4v nn?޿jo₩_?rrr3?ɭɭoOOO???\/g?iڱ??N2zhmoM4M6m_o_4O~y?n}.Oo?7?>}i%ם4_M3O?ӧOU?Ow?????'͟O_?Xo??7?_>}?SOOC~}WSԏӟ?9m?ݿj[O??ǟU>$m'rINN'???>}y?}c/???/_H8~{//ww{/OOo???}????ӧoO>}OOOzS?~#''oONO?yo?wr????rrV~2e4D.>??JiZoKۏO/՘{_M3?g[o?[oߟo??ӧcO{؏o?_,z]g?7__?>}<ߥ7p]?ӧ_7;??9/?//i?ß_q'<;{_OM5/[c?[g_?i?}sOOCii_/'7?}wgI?Oy~f}????[ϴ_/}??O>}_EO/O_/gg;ϟOE~4w \;ꧯ_?_N4??7?_>}gO_Gӷ_???'y<7rrO?SOϯ?{7/'7?'''oO'WNOO\OO/WW䚦}nߍ|_W 4????ONNng/?99Z/?99/''/??5M;p_Oiiڦߺ7?Ɵ?o?oc?/|~Ͽ??OѧO5d;wg/o''wk_??ӧO]ag\Jiih/>}???ד<99y|s?}?zW _?痤4D.>??ҧO?o~LO~]u<?3gwo~e>};Z/OOo=WQ/''/7~o'g??}5??ӧoW?_Oxo ~_5-nw_On'g?ONN*O㯬֟WSc'99_/'W5Mmi1i¿?/i?ß_3_rrrr_o?[?}oi?Oy~f}????OѧO?~^gK?~~_?}K/|{_49/wg[Q~8~?=5O??;?qD4🜜5ww/;i4????5MNiih4M/4MSSFOn?_?a?>~||{wu3Ϗ7~o'g?KO>Z֟Z??_O_/'ӧ˿/?oSӿߏWY.R|?_WuO>R ߿^_O>}?ӧO_S>}'Wߟo??$~FNN O>j{Ugw??id>ii~??\/}?\Ӵޖӿ/_x1?f'g??5?%'''_????#''WQq?rrgi<:t5_4M۴W[>}9mGZ?o@O??{)_߻]w~Ҵ~5}S|?_O>VL>?_N7>}2 XcYg@O??wK?Oi?? E_/ҧO_OO/WWzS?~#''oONO?tyo?wr????rrVy֟WSc'99_/'O~{؏I￴;o?7?}w!}ro?ӧOTu_?>}????/WOӗ?}W3O????IOA>9}ϟ??}oϞɍ??/[|_$''WS*i-m??m_w߿p{Uc}5O??kYKnONNn}/O?m?a?>~||{wu3Ϗ7~o'g?~)_O+u)ϟ/?|O~~_/OO_k/8l?Ͽǯcw_?rrr9?cȳ>[Ow???'5M3/o?[of'g?ii?? i???߈߭'K=ǷϿ/o???/oӧO?SOOS~}WS>}?__>}g?>}ʟ2ߥ7p]?ӧ_7;??ӧ_OO_//o@O??k?}?ӧO?<ԏӟ?9Om?=j[O??ǟU>_Y;?>Orrr??___Okcq7 _5z7^_ӌ??/?99g[[k'''[??_GN.??4O?=_i/?/_ҧO?gH_~|?>_'?7__?{?E>k{״y޿O֯?uӧߪ?ߧ;߿^ӧo_?_?N>wq)mWSc_??~_Oxo ~Ƕ_5v-nw_On'g?ONN*O__$''WS_I>?ϟ?1?v^??/?O_qM;k????oӧO_G7__g7??O_'''[y=7ȧ??sϟz~ռ?g?99y|Z?wZ_O}"}???_%4v nn?޿jo₩_?rrr3?ɭɭoOOOӿ~=ǷϿ/o???/_?E>izR.wEZ/O_MӜmGu4????ONN/8?WyV~rr?/'俦ieOӌ??/W4ms>9mWS4_4MOO/WW>}u<?3g-?}{igZJiij/>}???ӧO/"'?ӧ/??ÿOѧO_~?~^_fK?~~_}?}K/|{?}?_?O>}3O/#[g_}ד<99y|s?}?W= _?ʧ+k'rINN'???UrMz[~L~>n?/Okg'''7?񟜜[_\G???cx/4K4m^^_OOoKOk{?ߏkx~f}????ӧ_?wIO?~~߻?}[37;??wy5/[c?[g}????ӧ.3?4}K>}??___OIOA>9}ϟ??oɍ??/[KwZ_O}"}????ӧ?a?']Ү|:?go@O??;?q7O>R}ם-o''??7?_>}gO_Gӷ_???'y<7rrO?SOϯ?{7/'7?'''oO'WNOO\OO/WW䚦}nߍ|_W 4????ONNng/?99Z/?>}7u<?3gӧϿ?Mϳ]jץN?c_k>}k{?????qi;-(?r?f'g??ɝ8}"oONN;o?^4_?Xo?igm?4&k?#ӧO~v/z?~X;o?7?ÿ%O~o?LOi??ME_/ҧO_OO/WWWQ?_?)_tO+ˬu)ϟ/:|O~~_/OO/OOs???}????ӧoO>}OOOzS?~#''oONO?yo?wr????rrV~2e4D.>??JiZoKۏO/՘{_M3?g[o?[oߟo??89_??_Ӵc ?eߚf/im߫߿?iI>?|?{6#}m\~-Ϗ7~o'g??}]Kvy;?iZ)gϟ/{?O~~&||{N?O3~o'g?;}%֟_O/~ӧ'???=7ȧ??sռ?g?99y<}~INOO\OO/WW'}O?=t_z]g?7__?;>}9?q7f^ӧ_?__O>}?ӧO_S>}'Wߟo??$~FNN O>j{Ugw??id>ii~??\/}?\Ӵޖӿ/_x1?f'g??5?%'''_????ӧOYz?~X;o?7?}_}/yֿKoOk?ӧOT?}m/o''w/5Ms__1?^;Wӌ??/?99\OYyM[w-w'k_?M3?_]Ӵ֟_OOM4??___Oo%[˷^??i)mWSc_?O>}??_//O_??vן?E>izR.wE_Z/O_WQi/''/7~o'g??}5??ӧoW?_Oxo ~_5-nw_On'g?ONN*O㯬֟WSc'99_/'W5Mmi1i¿?/i?ß_3_rrrr_o?[?rrr_OO_/#'?kvlL_[e/MӴM_{{o???uo/?ӧg~_~?۟˯??/O5?kZ<u'MW?wE:oğ_/OO7/o?[o??/WOϸ_/}??'y<7rrO?cO?7/'7?'''o/Iii~??\/}?/O~OtKOy~f}????ҧ/8?l_?}K]w^z7?ӧ_OO_//o@O??k?}?ӧO?<ԏӟ?9Om?=j[O??ǟU>_Y;?>Orrr??___Okcq7 _5z7^_ӌ??/?99g[[k'''[X??[˷^??/OE?~4?w \;zꧯ_?_Nir_϶q:zjg'''w?<+Oi?99yk^w{??w_42 XcYi?k9Oi_i'???O>~||b|:?go@O??>}3?4}K>}??___OӧO_G_?ߎӧ/?M/]jץN?c>_k>}k{?????>}????/WOӗ?}W3O????IOA>9}ϟ??}oϞɍ??/[|_$''WS*i-m??m_w߿p{Uc}5O??kYKnONNn}/GNN}???oMӎ1ytzCkokiik~//'''}s؏ ws<?3gSӿfwM/ijN?c_g>}};o<}egXןZ??_O_/'$~FNN Ol{Ugw??%i;?>Orrr??___Oş?iWwu3Ϗ7~o'g?C8{O~ο7[?}z?_?O>}3O/#[g_}ד<99y|s?}?W= _?ʧ+k'rINN'???UrMz[~L~>n?/Okg'''7?񟜜[_O>g~||b|:?go@O??SӿhߏW~Y.R|?_WO>R ߿^84_q 9_O{_M3?rs>g7?'''o}Nkf_?4O??wM6Z??M5M??! \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_1_1a8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1a8_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..034c96abd830555113bf0df7fc5f848cf7fbae90 GIT binary patch literal 3543 zcmYk8`&W_)!pBj|ykKd92~(zmCKpo}Xv()*Zy?v?_HcQ&OavTwoSApKxW{U`n&bsb zR7kB&K_Ga<QiM6x)|S^%)U%>!r{0}?&1`n+%*EPfwtMgV_@3`MpMT)<!{?h1YIjib z6zO8cgV>gm(8kA-;n#@7-xnLQX%Ufo>J%bkF}`y%ht=9;wG*9|Ttq}OLST{DIB24a zh3JZm5QNmu@v$gG8EuYPgGg+o1uVJYI6h6AZgbY{DxSR%)SnUw8MHaIg!b)gV#d{9 zjf}#TqK|QQxuHYkkbGELuBk+JdD~;u<0G5$602(9*{P`x+AYq^4=r&2Mvg3nltwz$ z5WA6hp8Y)iv{PUBH*H!O>jm4!6lhZe(IQT;K)5!v?E)Uc0@jhkkWLZ$hG4J1)BSSx z!~BOGo#=uG#S=2oe!<YXyyHEbyQlt~wMs{N=JcOatp#ZlEnIFojwD8ABEBA5n;Ft8 z^-Q$R@64+UZo-NS(u`G|T=Mk_>s!VC%9Z%#vRy!uB?mZKEHt)EgXyw8WRl>9Lxz+D zsGMhQkX9`5`x82ZKUjX|sIT@HWF$5qt{-$&vAm2w*<SP0fR>c{Hcj@Z*={R{$QJwS zH%Zon_5%BWt<oC3^(LC$;;bxeut)nDYX#lby5@#&Yz{7+=I`P0hDjl##3zN6^wYd1 zHxHiDH}L^N^NuFbyR_`MdUs^k2x~cb<~d-NYU*4L@brHHN`ANz9YnU;o4KfLw_I1> zL$-9SUrFeCb|zROTf+BoT}q?F<5Pg`<em(Lu({7OQ`R1n?0Ozs_dQTln;>D&Gq6TY zbiN3(-cDtF4QvSu7YzBttTsbR53>=&!<5a@0_>wc`?*XZZI+^Q`%I4J6SIDdylvv} z+t2^Uu=w`#rXy`o!^4um1ot;$M^w>^>o@<c85yip?m^w#!?~y9wVcw0o$W=Q)0CX; zXBugIZlTbm5vZ#PxYP;8PM7E+YynQ4)0&Jam4)`9x_JVL*c*Fioa=3-rqFDTTEavm z?vbR<6-pE62uLS!0!yt%5*!vf*(z;hU}wveNU%bbPD}4F*V0XLOw<D0HrgmO3<$w- zj1DKx7z4`8ZdC%ZjN&pIW~O}bw4x`GBj$KY`K8hUMVir$Y^N)dwIgIjLZcL0vA%<n zE{B7|8J_|Mz<4Imq@Xj+OrQqj$BqvLed0o$xq&GMXNLh3n5|J7P4Hy6cc|P4YljDk z2hDLxd5xy5evC^Tl^bZmLFb%=*NBAM+OS$qz|a$Jg6gUXQmM%ux<KrxK%NZ-;wkMa z$&S^y<b(4uoS=8Shk3di1<6fTpTgO%bkI9!VkQ}+@(HjxEMI8{jG(yyPj{PrR0XqX zP&@9YZo&7|Z{)6acO$cvHD!t8Q#38)9l!z3!Rkz&uf0d2Dv+z8fr4Ziu$~GZZk-XT zqlQuXd@#Qq-v_JLrI8jd3vLvJ#p5e8{w#(Uqw9*}$q68h>hbhb$cim&lWavZKeV_n zJsb-^-OkH?GCnjJ!vm$l(e2k_)?VoT>9>=N>l>C2-j93#@Lk@^4ZrXUM8D!BpxJu& zdFgqBu=Eyh`&y(!jMgZMRH)Zkf#Vy3CpB;I?-~24Uw17#U&ly%ZbSW*(bVIvRLCM! za*9Kbaft@AzF;bgG<Bc~hx)5FI|z9Jixa9kqCIl>R(Z$x<m$mkvij@=@_D_t3S7Ba zm~C<D?cAv=Se><`oJ-oZu3+}bkMH)R{AY7@Nm0jbWYWF&uCD`{n(nOVM<?$8bRsMD zeS&!QX4KR)&F`OML)t*OlsC+oGff=q&rvJtPn@i{+77#4%(eay98M6Y-M@M@ZhUF` zuUV~!Z{+0c;uHsE_vRBWl#SoodRgiy?`(I`!K~P4mqF@P+{H^vzuma=?bPva=NAtj z-6S)<gg@YBJz2KU>wl7HI8s|_^ou=(9kc|3);T*nG(MqZ`-wMt9D2gYlH9k~xqLZc zYjj@jyQ&D=5(7LV^W}pgTx--*;+9Bs4m)&a%R6f~(McfyqxjD4>^C2U9P}Fki$}!M zli>m%3jk*KFvRH7`Z{Ob8MqHC(#R9#Ivd>l1AwecFs6>M4mYH_n&|`#H9RaOo;VM< zsZw}253DJr6B;raBy+^W>&>epN8`?PP=g+t%Lvlb<#Hbx<SCeng1B%ruOU?|7O!qq z)0^i>;hdpS3~!YtyNA#WYdyWv7?h_?J1Q092n`aqA|XwqX;vimhehLXF^Of9OsqdJ zlxHJgQbpZQ@@q$`mrNo4T!VnbSd$TzGKyHPld?=YfpnD^Ro8_>7q+u;9FA7fp28i? zkkzg#12pkC{5@R(Bb)(jVg0BO6R?@6j!cv;Je+OEM2DrcpqUNA0%9T-DaL!TCcUAZ zNY#@2!_7b@ln8b3XmcdOdYUO5P4p`rXEjQuL*n(++0_HIVHy+UYo%~NNu&4D<q%U& z^?!vheh?jGZ|$0n7~=$*|C+WPxVION5z$&KX#uj8YC0ejZneyw{62$(_gByltPeRA zxiP2hWO5iH41qx4ZX*z}v51h3As>IS@7A+LPSkpsg+d7sA(tWx5s~?>0Y(@fX=tnY ze>{UG_>#KjawA;?@vNZ}K8ip!Hy8drU+}W?M;5wj^DC?w>0@W#)eIKnIArZZo%2Wv zWl28yWe@pgy4aMIzE-kHNbOoe*KA@vUL2X=qmNoh_=`@rlb%v5h52}pVcQ#7y-1^H z^1_<f<m9zYO5<m;<=vfCo~8P~Eq!1QooLA`S$^#+eo!Kwfr@VOEKklacqXOpK96>R z%(*+c7Shj^gKf6~+tT^pO-o6W&!%1<zSIBn9sDaP@DukzR>rX_4|PxFpYQcRGU9!H zIMaSWXRtJYt<%C6+-Jtt<B@7|ck1pk+1cI{zj)CPsKPn^QIi?+3jB6!i4(pNcd!~g z@)xbgN2&$C6$Vod<K{ziBv)3oNBx^YzJzg=H#)pmS+{DC-7JGdLEeV8!u?V6TOi`~ zX%eCglU6^!`cPysq3uD7m|g=c8@NK}>7||wz{o3zMpmE(GW^D!)v=2_w(JRNq$HiX zFv;^ym|EM(4vec>GH%};Ybt3fj#bAkb!i>K(llsGP1rp8pp<8^Y3b47s5xn`0_5v1 zQ3=P&!JMIv`Rs*hvrqhvi}w#>vetcb{O0A|4_4MS#DqP~vQ?&i2!&3a_~qiGYkJd| zby=}`6v__FQ?>vUdsT5Iwjp%Tbhew&%FLhO;xdXxTx)!S9+7KFjF3f~%e~CPaz({3 zq3Wy_UB*yKuAwD=$Y`2%Vqx$!2BjA*h*Yb4Q8R%wRq{7<IvSofrMuDX(iCrp+4zOY zpyFaW#A<~L)Tq+znG}OumEfIJ^n9x8C~q6((8+y{p-;AnCNng>nB)bbiqM<5Fv?dd z>S@EN)08@MjN0J!&T)eBL7l55t)|=uPW@3z(}2Td^(0g2tGlGDNUGhJjxM8cCTcS2 zkXDB+r?q{G^6?x_ZwJ!vYT@(KnX$8wsgVQ~K;7GVQzt{d;2S2f1#pOIpPi!YFq%b^ zg~J^G*vK4jZkvMH->8ASQdhMUKjZOg|ET+ts)5{@8ly3%#=nE?m^SLORnc+o0qlIY zR6WN`EN>s6&8nnhd`wUBmE@k}m2L^UiC5Y~<ckdTr9Ai*;Y1N(`weB&bD-+#rpO$^ zWAOJgXjUlehjD|gcgw3DR}VH|v(_M0w}vSWI`!s`13iO3zCGUg@}GAvezpI*carz) zw-os?Zk&G2dx}htA6ZdV8`>!fMUuR;d*#@!|D9WrE!p2(pZ$yIeN6Nh9^=c@&AJTT zs>YCF{0FI>uJ*s`e)RlMploMw%%J|gt^aagxp}C3GW)>OlI~A1Rom`-c9qp<HfmdD zZ%>UMg%<vk^!U5`FFtH7`tF_rY3a-TD%w)wj0>Uk&jh-wlMhAg`56sb)5{Vfl;p8V z{-N`lO1=N?^bzR4>A@!kReEvKKmT!S`Cqp_Za9~el=O6S{r(nq#d80S9f8JyS0iJ^ z@gv`Ra(=n+_sP!Bp1ryAX6NqW4TC>rJ$$VwhTsiBPVagLCn$Qo9aHa1h%-RmG2vd( z!Mz^ZzKvw<)5-&?1_`iL(CTM9Iq#yljJS~^hUg#=Z3Pm-R%*aVdP+{(hTmZ0<_991 z5<wGKH^s4K8P5a(+Z+yMi0B86#_EJmiS--n3q-=!Rvl-n&{ZHQZBPI;tvC|<3$@ZA z7zMd;4r}6oaJ*^8wa0`Mx&vl-+-GT1G3hEC)tyqxGnlZtI+Mwxm8<(p)q_$VDP7da z>&*@t+7{AU$ZY{i>phL8RbxQw6)O2y#V45uh$FQ#Fk%1t6sc_&9=?_bKoWA~IAUY% zwJv5CQ)KnC!87huh>*}^V7UpIX!c81R+nI&ZSAE&+4A^YR|!xBW=4(H@#IW<sUI>l z07kQgP7SYv+;o0CvJsplU?AQQT|?5UND1y~8cRwLHZ#dSJ9!-J>!omc5_T>nGoyKx zEi#j*r(yK!M^Sel?1UReFtA(gYkpB(zqq|RPrei8+WNYqZf<WmJ@Ik$AI3c>d^q%_ HJNN$pIaCu7 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1a8_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1a8_states.bin.z deleted file mode 100644 index 10dd5e6b1e37d1b0a9bd14756b8f12ef84d524ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22553 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%0AM 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1b3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1b3_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1b3_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1b3_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1b5_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1b5_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1b5_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1b5_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1b7_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1b7_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1b7_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1b7_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 zcmeHMe{dAneP4}cs>w`^CdRfL)A-1E5}Xo`AQ%KjX32P5(%P+tI*h;+R*jv?gp$L> zSYU*nX52|kW%=rHY`}mHLsEeS90Xzk0zEmlBz{SYL!|?Ry!Z}jK_}@rR;#`J@!q%J zcY89jr}jVXbkZ4CGj}@O?%TKTeZQYyT6cM<_tJ}lM<+<<H_!QK!``RwoAHgsUC$mZ zo1^R9zi$8Kk6xSn<l066m4a)X_)c>=))<oS)2H93!>GQ8It?_vFsAKTa9Hn%hTVkQ zK~k*+il?SFQl|v?J{KA^a?dedLfD8&9jl1P5|9{nufP)64+9b238sHZQYFXxm6H%Y z0K@EcJLz_5X}8L>m=jLNn!sJZTsKK4d|aSZ>iE7L=D=Z?n)0GvBQyg3HPx!!rzPlr zDlFb5du~ZFJlh1+NnSE$-Qb!F%^f5OGkC0~u$fUt6D4>>fxN7e;iW@>m(8e^&qqHq zJ{wI!&2o}@FNmXp)WX81=Hy?8d!3-gSFsA-zy}KFRkLs!-?l(3x7t)H-Msl=c?w%b z@R`Kdys+7+$?vDGEFI)E`8%No{~q-4p&DeVS`UwgW6$v>p6FJ+yz^u~4kJldJ&i>S zB1wZVM2vQ2<F}8i)1Vg;@)kHiQqyt8MgdRbDw8E~RO|As0?o{m%3vx<kv5A549%Mu zh$o!_@gi0xPkQb5VAx8m2ev^!`D3br=asR|G<`sfVbNQgX(~^WT;dXmDg0IuPM_G5 za2ArZntzW-Dw)RdBrgY-LT;0v<w5d>T@N|p1W8)QAI_XANveDeAM<oTN`$?f5t)^; zJ{$-i3+HJBvm=U6;`omgFEGhZLJRl(B7Rey4kP{pt>!<#S(I?8jJ+k#e}~t@1H?Y7 z@XR%xa$o*cTW-TiZpPEA-GD#3B-N2!d=K?%{XsfuUl3<|5T0ZU#gqI4?2!k83?Fhe zWTu1bR;U{C%n7|=+VKD=T5`@qQuW3+S;clY;1XOyv3j1$KXSCVQv`iMo&ZrdoHoIN zO}LSPL$IAY1AH&2cE!uyrH$8ac+}l+h4DoOc{B{4xZ#v2$zHewO<dG$$|PoFCRfx) z2H_krOG)()bgef@erE-(fT#|F&s+iJEN=w<z@mC!G3<c%Db^4^9`q1@;?Gy|coIgc zcz+Tk>CqlIqjCH(3rT7j>7>_!tPzU}=erHRzUp1D1DTZ*buzZi(uiU&h3UA_nJrw+ zKdMhzcBCc}Z-{IoPT<iYm<N}fAS)$USdy;X5BJ!V&FK$w{3wn(GW|s_**xL+<wWaA zyt!CxJXZ5ZZtq<+Zr%IT!wSIi#}$jcY8TFv7L$o>jYJxO?JR1C(>o#oT!>W8AbgB( zA9|T~bH<tnFG6&Yq*bG2Is7I6b-E$)gj;FQn0I!$Y}`E`evf@6Y72I#;g|dRJk7xU zcZo`O^};^q@ge9S26jq6={Kers-xJR`*UwQL>EJeB^$Uh+wpvHT(!^Ecqe(0mEOPt zQZ=GO#jdX^gk0%2mx$x3@46%mD{-CgYSU~PA%Mr4M44WJGYW6R!Lf%SX9TMkJ02Ip zU!)d$o0n4zAEvRUZ{c!U@N|F>Se05^X|6R&vgIk=^cMOhk86D@FdyEMrEb~Iy-u8n zlf4perEA!%V*X>t({WZf0DB(Xy|}mSv+#5L2FZML)my?P2b;3RnSy1<N?@kn&@EhZ z5RwAt#A@uLZ^n9L$swIQ;gxuu(U1UlX_SavDC2&C7T{zG6xNE{)umKQ)w5hVLhjXg zk5>e5y+Q5#@yODN72JgQb5P(jtn|8~@40_&XpHh#Z2?dQ-W_lUzjPejs*-15in(QU z{j#nD&?vWi7a(&^i+xxii;akj5V6Dw^Od5)#!z7VIIXrf!~d+3Yj}^VSiCG?E?|B6 zh@^=7FL-Yj^L4iQFg^$~<y47E4;@pAYhl#-As~fSrsQ^u-8BqV%o<FEK7hdKwxD%% z$Z>AijaeSk-H0J4h;AyZOS7pV<G?iNT~Nv2S@6jTsMyFWe*WNGsNfO4-qH>a2RdY? zrV&Wed8&4TtJnjv8Uz|UY{)wK+fLXez(GK<8^E#1Qm~vzKU3I#_$D2;qgxqVAT>j9 z5`wB{aXF47A+Glz#)v5=LU^OSZS;(R7-mx^*g&bA^P9(ExC-7nNtyrwzLMoi31p>& zyb}tBDd)#b&5nF=tMjF9k{Sv~Of!gC!S-foUUH~Uc*DqvV@=vXQ>7#x!78jHm&wbU zh?m?WSf)Ky0e6kBg|}5`fA7S0*ns;`21&d0h#Ou+>lw9!{1~)*Y9)W3FM+9HqSS^B zcpw2ccsb9-?#_ZvF-dt(RbpGwLGsbp5ncEW(cK|B!2@@Q?!O_r8eKu9Sq49YNwb<Q z*aH3G^!+4CGcQPdvNV4m3#)LC#x)<)kyI1ZYpq~N@<-uqUu9iH%*nkDLR6GyC{D<e zYNN=`UB_Qdp;+ug%pFFR@yRXXt~n>OEX=nU3$kdvj(^8j3yVR>#v4?q&a=pycx)#~ zn!e!4e3quwT67PD;Zp_;eRSZlX6N{r0<AX61u-I-3fcKP)Sb~Rxw<4FW;YEH6*b6T z{aX;E>o7+^c51F7qfC$GUWBYPY34aX#S45iv;3ALT^@uJe3AG4RH^c-QM;eC+M7>S z^?$dTuVe*cqB_hC%R^_*+EhoP9fdmbWD_hgH(VA%JM5Bka857j51aIsZFQyRK;#e) z50ie`f2MJ-=l@kDKLHs|x=?T$F6yDJsKYYf&nEB4)qIM0fYX7=Pa*o(`l4#w)&8$L zXNSq3Wq!SChlC)z0@6;{EoAYBrl5%$DEAJ{4jr0}jJkj!>9vOLhT-CO9}hP3D~cB6 zf|g?B4K!ZFvC4ZvVSM)~lQ@a`2y{`3dKQ!lP3Nkw4UyEqzl87$Ghu+iOROSUevW7n z-lka%G#N#+rZG)59*e*lJ_Sdgi|@LiJEm;XX+IS{3};rzKS(c!-=eIJ@Xs_7v!j<8 zbP=_#@vklT6s%Qz1NeG+2u0O0BBXfw1{%p&O%Uq&0F-%*ePi;FU1713QN9XtkgJ?L zWHF0$llf41g)p`zK@H`LauY=lWHb-eVIb)|BV>6BHJi{j!gt-Si44iLDcA$Wa0Ko_ z>0&A$RQ2QDd|nH~WCzN(G6=#pnGYn+Z~Ud5<O+P~Rj`_njlvw2kYthJtZ^!aH+>7{ zDs~Ob__|)a`%kbJcfa!bPuEWR)omyE)qRLXxtf0;eWWlQ86SzYdCISERJs#|C>v)X z;`yk+3kO0DVnEzkfEF%+9fM}iuk&KEz7F=jc%6Hzy3^oPso%<x25Sas{0dwYeJ7Ai zC!>LGcrZ%sLSiVHY`}zGCjU*PSqiT)eI#0Hl`!;6hvVw-LnS)&YVlz!@-FPQz0jxd zx~Rz{SJB#tqOFNQ1KFQ~SAOx2P|h2ull%OfuTfO<pv6ggrPyJpR&IJ4pOl&S<hT(a zP;VJU1Pfv3C0@!$(aj$qc1_Y*!@rAQWeOjM<`e5g4|hWLd9hA1#`YrQ?nJxigb-eB z0jJeQU|ua%$+F6CD;s-JBkx=RmaTT<NDgKU(roxcy8aXl-FDYFotjN?Vy!*jwY+fH z#GB({XGRK+!%&3KtaV43jc^z^hfUGqY@621a0dDy#SkW0$uRt>$uEN`e$3&w+gS5t zFf>nk;V>9ZX{!EXOfoL(+u&YZ8FjX9mYj&dTEuxsR`MfL3w5Z&uDFQe@ZKR_-j!Sd zXkf8Zro)V|yp?pr8C@%l>mF@$$Z^<;D|6MioESPN%daI(daPYb;GfZR(TTlZQ3wHP zatFVllkO|vdJ3*{a2lphIs3qmP|zZjiu6Ou^e|Eq8ZGR2^cVgjb!yizeaIh6AC5w~ zlXl(U=e}7iByNfx621<Po8A+?>k`mCACbE&n_J*_v*Ddg=#n{6yp%nVBnx4Id4KD` ztO@WJpF2Tay_I(!2{L2<p1*<qFH5eY&@FU#8OPNqW3@=vIp<-`sG^ftMROH~S*>{o zVWN05vXVdT3wYcv!F<w@OR%0bq(`-WYKLF)I>>mIU(1siMPW{r0ca&2X`awqz6FNC z#9~0Pum$gq0_)31bw?%N=E!^7kEn_FU&d>1hX$SDK0h4Vhg5y)k1(RdZ}a^Z#(B6? z5Bu5DI{uKjhb1F#V}esiRx<(oKZ=L0rP|L%GC@oPHj!6&Z3m03@EYl6+h@8t&B@?u zuoAR9M2;}{@vN$*_Epg+db})=$r_^d5||tDBgh@F2`}6j4_EOu$05{@>7YTMF)pH~ zBc|E}b!*`Tbkl9<3R~rMy#LEV<jQ~H1wTV@5LT=QUc<3^92zAvlYqHXD7{vtor4hO zOaB>?jBMzq7JN&XP{ehS-5|y+B_qTvnaLN`A%=A#_bp{(jOK<1Sr5y*4zWZ)T8yl; z1acT%4W^~;hfb`jFKo348#6+u4jM4x%<w!`kTC4XM2I}-?0kk}wbYp;BA%Px1%CJ` zFHRQpqT-wT26cnuYhiySmnZzs(v|<uqVo>XeN}XDhv>3q;s1!}is9}6`r1NQJD56& zkx3DJ+@8kZN4yAKoFn~o2r7AfdK6WV!1NuEvl#jcn-fU#EiB?^keK;#q$AW}*#Cm! za7<)kdOFZz1YW0^#1?b%P%88e^xV!6G2oHUWKNY@jC@}$h&U0$dRT<UEgR8a^_FHw z%wl@=iW3;agJ%tc@(3)7rn;h-f%$H5yL=XBg4w39fdBqm^nh7%y$DMIXZNa&2~f3J z^!J(nuBev~vNvhAvyh-BY2jni#LO2e9?fVBbIO6te_f>W{{*@jiIr@k&SOW^BAD7q z2hACUIU`C!B+AIYn(eJ9UET?gqh>#d|GAlZnW^t<7c!>z3OvWl=aC=6K6qQDkv7#P pwI;j-GjNH&bX0$@lJ9oFPWA%*F>jwo&i(IZmEUA}y9S;(_Fo_fJi7n@ diff --git a/client/resources/hardnested_tables/bitflip_1_1b8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1b8_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..c57b7929b0dcac0147dcc327847d542aa5d335a4 GIT binary patch literal 1284 zcmYL}UrZBs0LNR}9{qC@DBN*d6o&ny^e*^2=0hDQ!;T_Q9a=2sf~@yrS=`f_#fWqM zDdn!xyRI8U+38%uq!h%)UEj>+7JBp=vWErZ3lBaNVvHeV3Tkv>aO`Q{r%%3*pXB@9 z|M7`Ebn`K%|Co1A-?HYy>DMnFS*F87V@ADEqtzJ4r><Xr*Qn8G!eNcM@K*IE{U0!Q z?_fQ+LO8?OsQ2pU!`xhUH-gshzUPZOy{0k14yUeu%GQH}+ClW2-S=#!;m8Tp;IK!2 z^o|^S`*Ks;)Mt~)*KY>8rhn<F*mt_3A=01*>}zCBK08~g5{LK(y-(kIyPqF;u<fFD z{;4H*%Y3Q<WqHw3k+<e+MNBM&sQwXNtZe2^(N!t39H;2Jhp_jlN>8{~i=v15A?eb} z@hB#i%g?LE=guUSep=*a{utm2Y9C%@Xh3@n*$r{wH{3RV!Lx;bxa&dh>`K>K)moGG z>_solfTm{U8nM!&)9D}mY8yLQJomf$uy^U{j+WKBZR+Yi&&(ZupMK3z)gsWMiOUF$ zUtB0U$;5r1Jlpu_W#gYKu2<EA{I20u`hG8b5v|Lv|IoKyJ-FO&$(-Nv^x58$D~`vz zn$N1rB7Bqxy`w033TD{zi=nh@hddoj7N*Z}WSHp^OH-87_KHLqsa7alj)<kK-{AH+ zVv4KL(4~xGxb-rpGbf+dtwBVeTaVfy?KSb9vdFbEIB5Vb*j=RbkXV*+!wisoPK1!6 zq%{*(`KS#`L`GzeZD;ME>*gKZ-&$eN=r7H|4CMvPh-p3#<fJl_a>a&LN#o)HHM`ZG z?tJxay}Q9;5Y*OXm?oSA<@165vg3u`rDUkK)zBs5_8iSjhWu8@qzo%PB*&y`?)Q+T z1sjfSD_&^SEmzBDDns309bLzkYLy#9GJQbhRJIo(d6;HIOqew1&Xl~j@O8<`;~jHP z%rA>?ENqnge6h9V++QWyrE`hI;;R06Q|AjldpDFI)IpTl(A=s3(-4cbN2!XvMc>Pv z0279v6kCi+5cObyNrBl4UmpP#RxC#Ys1r!}?X1Aa{&K5wLr_55P`WEKh|^*@LQ@@B zOvrSYM@j9#5Pih$@@QPSbS>3>%bGH0XAzL5Z3Aq;W&oE;^4bH{FKuhYQRqh<{}d*+ zl%|YOW_>&5X(mvlvXBu1wOk}ib>;~l9cd$c6kaQ&5tj@YhVj}oLFhyrqz+>yK-{BG z2dE>#OmzE9kN`JL9Au&>X_Q7CFynOEGqjT!B`rEr96~lq#~C(I6I2vpwoJq^0py)H zSzf$<Y<jCJp~;%FZGdNwf@Ve_5UL$+-_(-~CY5BAw3KEc%mp)Ekl!q&G$Bcwi$X#0 zl9y)9xs;t1O`DdiDkpc!Vb++ns}zMJRDebqNWmGE%fb0RCXE9&4kU?<GkwNXO^0a! zs)*Ap(QQDD#Td2&uZiPemQY3z^Q;AR0Xa{zv>*k?5gkr3G9Anu_P^E_#*2*!odt`< zxQWnhZK9~X&^a^FW8>>gyx{IOUvv2UCLcwj9SGVYT4yBY!$l{iz^TGiA%WnIsKfn1 zXwlsci76@VF%0F>4mzA;%xWyCP(hqVh!k2A-C2O$ma;)z@tevoTil)B{r7tR0;qTN AKL7v# literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1b8_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1b8_states.bin.z deleted file mode 100644 index add474d02f6375a08b84837dec9fe2fe8c734e6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15087 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 E0O}T0)Bpeg diff --git a/client/resources/hardnested_tables/bitflip_1_1b9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1b9_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1b9_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1b9_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1bd_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1bd_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1bd_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1bd_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1c1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1c1_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1c1_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1c1_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1c3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1c3_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1c3_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1c3_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1c8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1c8_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..6ced4a199173788446d3e52c7584babdcbcff971 GIT binary patch literal 4359 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 F`X9sAPvQUo literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1c8_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1c8_states.bin.z deleted file mode 100644 index 3a748e8d0defedf86d6f01ff085bfd0f468a90e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26711 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1c9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1c9_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1c9_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1c9_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1cd_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1cd_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1cd_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1cd_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1cf_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1cf_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1cf_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1cf_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1d8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1d8_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..bbc7f1d82fd114e16c54b66b5d41131ce295fa1f GIT binary patch literal 1561 zcmY+DZA=^Y0me;?ZS1>Z@cHFG1c-!UYJ4*H&-maqZ^XQH#&c`H_H{Ci?@u@J(VHyR zkhH<ZM~u%UAuY|VO2SKofy8P|)DI{nsqeU>sTOIV<^!2F$xKmXZ7dC1mgQxO#@9X1 z_urT2_qcvJ_%nF?eQWRg-q$Wd@y9=$-uavTMrv^mD0HO?MJk?+D@Mvn6=enew~GHy z$){B<N^4tZ{V$Xrd~kE-CkLxw)nHY4pz~A3_vbg0KeYa!tZErld&bh8U#fYqdA0T6 zhb^dOqa|;%87kf&dOOqU(XI<<`gHs3#ys6%iDv_)$Sv<re*Q08@UIp8B~!4q=#Lkc z{!@9t_7b^=pBkqg)d9tw<L{oVHyv9JsKC{VLPi;vy6#=p6>G4{Ff#@@0*COBabe^F z;{!dY^$O}a+7az3%oQdqx=~ioznByr&`W0~<C2i}j}mx<zAp5At7slvIuQ#OlR?)t z8Z)4DKvl@v^WJ@Y&TAAJAA*oA7FlI?^{xMH+tok)z;)%r#^-w1vsAQQ{DLssO-NeU z$emJ_Y|_1B*uziSUZ1<SN(lNobhQ}1kvx4)bN}{tUl%{f939;{@?G&{t!DA;;+_4w z*kjsLbME9ul)f_)s00_XevhqAV1uhA;+0O4gkxqib;}li2`17(eazW!R$4G)A%hb+ z>6AxJ2CQIN?7pj16a=)x99BD0-(Y_VYCFVzGNR8ZcEAM4I+P>Z)s7M|{0$i*ozB|% zSJUum^T;ZvER%;Z_K{Qd<FSFn#jn=^@t2RbqiA?~@m1~ogW3-E-Jkxs`8TJy`?uS7 zZtEWp69pWAi^sQyv3sxdOXciP*Xm*MDR~0PY*L0Gi*{BV-0aqYVvZ_?ECczW8Z+M5 zeoBr%IaI?_!auCq*K67+WFA}cwQV;K$De6tyZHX8q~_l`w`>ABX{p~NfXZ<krm{4J zvbe`;HF1Q2=d-ZejDxHv0H}4d-MCD`7z=5+gwqLON}@7`9LVLeO>!)i1q1-;dNmHy zFfQd-&PcDr1EGqH>78Y}&SQ-D#B5kxY1EX8Yo@fdo;{1h@$`Th6nv3MH*@@9tyUaz zdMmwz;bKf+S<Z0B^=zWFm;q0mmUy(;bqTv`J8TH5{ExaYbG=RwVF<&68qN74U)x5^ z@Zsr|W9N^`JBLgk$KwBNJ}Aeyd(MzWIm)tQX8cG(&eu#>v|=Q(Qf|?5_vuTHvt@{> z%|LE$+V|ozx9e;^csubD+qiMk5fhG#h_4qm{=S?YBE3ZQ(f!4){M#_HQtkXi>Up7R z{QY~fiRsmGH$(Or;8BSgiwd<>j*nt2l|v|!?kj9J6+%thz&qj-w2Xg4U3N(!`%XOR znXvr2LO=_@0$IB%h4_rB+JTwXSiBJ#cRJ2IHn~&Nk&o~8>gcHv;O{o@4JpQr<{{&8 zhxgD^cpvIC$^$rjYmyB#$#9(N)=9aHj-*a}G=WtN0D9izE;k@Z({nlM^Src}7t*9Z z#RSx9bwha17!SEOqyXt$jt2vVbhm0e0M>1Gl|PAS5>a8fM}k&r4V(RW^d0+59WsV& z?bj|7&&?!A(S1UU%1wEI&(9_$Ie~nL)Cmkum>>;tUy|xH#cXWHUfr~dcJVGcAznj$ zqosL@N6U6on1K!Sb!~#4O4FPfj^Z?rvXqQd(mH11bTE8Pyny>SHS9IjiPv>xNkW{8 ziy4CtNwT>Pc-f|Hzba`<ef7QgS)zbsK{@NbW%DKHS@&0CMt<44cU&emo}lD06+{C- z;u(^})FqqM4l_xUbYaB<Lik(TfqE7#s92BLYD<NgaFb{#X!a4$58SHAG-@A2q~6(9 z#`arfymc+7QBZWB!#~vUwu$O0EtYJ(x#AZC_PBA4eXr<CQ6Y!6|FgLTRn#kGgZsX8 z7vAWjQREPOP|j}glba}HZE|`-fJ=z!u-akKI;l#|5Ou<>weomG>gTzeD`$3p_hv7v KE&cJ~e(Hb3NM_mq literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1d8_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1d8_states.bin.z deleted file mode 100644 index 806157d21596651e53b779a0670b3d58a76f4d9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19459 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 bkW;<rR4@K7tN#BVR4<-2d{>_?_~w5CUfH1d diff --git a/client/resources/hardnested_tables/bitflip_1_1e0_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1e0_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..d701fc28569656e2e6c0dc994a11fe21af1282cf GIT binary patch literal 1535 zcmZ9LeM}n#7{-s5cE{0e?dX-WK?V9DcdhOqETX{;+R~MyAT4b<7KV3SmvpEJ8jZ$@ z7P#YU-K0>kESo8m5;!U;%Sfgn3wNUvnrL9MWQjAOi%SSGk@yieTr$zWjBoP1dEY<Z z_xU}hQ~p;<t6TI<EzC}zJj=Iy+WbSuIsgEneO(Ozzz_gHTi^+x6P)>Hfuc&_pjcmB z1+16({xjyx5`l66a1yoZdRbri+;4lB!oB@jG!irfJW48>G|FQjPjVf-#+M|^$prR5 zNKvUCxJRWryu46Bo($a3<mO7jD@Fz1KY#S+Z<O9In9T8$6Ky%$kHz;wPeklrlA80( z)DnhL;W6!Xt@|UJ`|wW^F4m~xJPuc~8uvf~4&%Y>8J;9Kp_H{3v7REDF18N3skrme zuIp1$_r9%Xe$*B*4RjT~JJrrgA#O46`jr8`di8R6G+xK7IDV|-4q*`kT2*1U&wBmi zt@_c>yXaJc5z2}lDTWP_j!W>dqsm2Mv0A9GhJ{K+DC6_{+MiMTQ+T9a&F!AlmHSuI zliO<zR$}Spwa1y)W(3)D41Ni!I7%btdw<C~zpGT7mr8!tfFHBMZm$s`@kmm*o&R<B z+>hAgB_$40Dj496uy)CUE#;sen0)$~Qd^optcvC?b2n**5=VGa`A8+t$dpN8zi=aB zY|2HdNwTZ67ZLWxuqAlg&2J^=HlE7_kIUXUE`EM{Z}j=96#Ga1eYY^0!O&;1VLgbR z-tUtx_v7@yUXAUG9ajr6%r|8tQ>yr+;<|4-c(Ja&JR+3kWnXYRj@im;T5^~RC1czq z<%!nUq27MGmW(TgE=Q;1VsNv`)qU4xR}vH@@I6^<|LsyrYlN9l`;dQXqAZMGblBm* zSe~0WgQRHE1Cs<rTIG09jz?%x1v5<|ffIO~lJtm-WDLQ1b}%N7kW)fT(tWYkId@jx zjva)nqusF~G;h;6SA$(EK6s??t*~i@@v!+1G3Z)tRg#(U&T6`e7F20(<OFdEdk7j_ zDU3u7zq`9kTW)4S)0cHYMhRC+Tak*2)YC{bF@h%8^2FV&?a#T1w{O@0aG(8#WdNv> zbcmk@I)TYR6mSNHpmN_qwa@Q}75cx|m@YmewvMZn{#AAP>UuqKIVufg)neLIW$bly z@dP*=|4_4Tx5CQ?2yY}+po5_j?h3OiU$nJ<`a85Y>E#Fc3%LhY|4l%vf@OQM8&u%d zN^}0d39w|2e-moU{<X7f+xA$Jdml60)1hf)y=&l@mItqfEuTL;f*X$L!8IFM7%@m_ z1d3QiE-ImO(}*xF7v|*2WJu#e_xaB#IOPp))~=OA9TkKCzX-(#D%aLtE&NK48L;^g zTknYJJ?Elhs_|;AFIieve_HRENUOu?IVe5)s|Hm;nF8!wrFNsva-$jA#OGaK7L@xp zW;P-#i%mImrd>n$SbKW)1yAF{vrYV;?>CRr(!(O;q@*A}gqXkGQ=c#RQ1OvevaJC- zCBm**B{L#+l0K9Bgy7oJg?$i`jpsrEY781~WtfLf%kqxY>6H?38mVa$^<^h}VN%zf zM1MCH2?$EFEXz<NPEM=v?&N~#PvlJQ=7M{xIn;chi*6o%tq18u9&}1iWOiJi^r-S@ zZc19wwjC~fQ$(Cn_J5omUeFe?M}K16Cq}j7I@dqM_t)!PhLZO5oi|$$p^W35esBX0 zPwqcpM5hk~p*zt#zQ~{%8j*9?VrY$zxoaqDv5W<R|HqxHwZ{=l=#;6ww}0OieV)#& zzO9E@+RaQ$7+MVS;+$T%izaJuBbG4cNdXcs-b|^fTT&GkG|}D>D5!$UM-TiFE_t>_ zdq;H6X_>Ef&3*t4u$J|qaSS%pI%LW>78Sa1F-H?NFLo#gJ&O%R!f{4Q6c@nopu<`M kJ;9bIIxv9@-3p|7ak>GSmlYIvpQi4I8kAb#7x=;Q-?`;f+W-In literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1e0_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1e0_states.bin.z deleted file mode 100644 index b7f699728..000000000 --- a/client/resources/hardnested_tables/bitflip_1_1e0_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xmn4In`@WM|$ـCwGCʎbǓBCUeE$?>_?7ҧOo?z?~X;o?7?ÿ%O~o?LOi??ME_/ҧO_OO/WWWQ?_?_;}WOO_?>oOO>R ߿^_O>}?ӧO_S>}'Wߟo??$~FNN O>j{Ugw??id>ii~??\/}?\Ӵޖӿ/_x1?f'g??5?%'''_????#''WQq?rrgi<:t5_4M۴W[>}9mGZ?o@O??{)_߻]w~Ҵ~5}S|?_O>VL>?_N7>}2 XcYg@O??wK?Oi?? E_/ҧO_OO/WWzS?~#''oONO?tyo?wr????rrVy֟WSc'99_/'O~{؏I￴;o?7?}w!}ro?ӧOTu_?>}????/WOӗ?}W3O????IOA>9}ϟ??}oϞɍ??/[|_$''WS*i-m??m_w߿p{Uc}5O??kYKnONNn}/O?m?a?>~x|{wu3Ϗ7~o'g?~)_O+u)ϟ/?|O~~_/OO_k/8l?Ͽǯcw_?rrr9?cȳ>[Ow???'5M3/o?[of'g?ii?? i???߈߭'K=Ͽ/o???/oӧO?SOOS~}WS>}?__>}g?>}ʟ2ߥ7p]?ӧ_7;??ӧ_OO_//o@O??k?}?ӧO?<ԏӟ?9Om?=j[O??ǟU>_Y;?>Orrr??___Okcq7 _5z7^_ӌ??/?99g[[k'''[??_GN.??4O?=_i/?/_ҧO?gH_~~?>_'?7__?{?E>k{״y޿O֯?uӧߪ?ߧ;߿^ӧo_?_?N>wq)mWSc_??~_Oxo ~Ƕ_5v-nw_On'g?ONN*O__$''WS_I>?ϟ?1?v^??/?O_qM;k????oӧO_G7__g7??O_'''[y=7ȧ??sϟz~ռ?g?99y|Z?wZ_O}"}???_%4v nn?޿jo₩_?rrr3?ɭɭoOOOӿ~=Ͽ/o???/_?E>izR.wEZ/O_MӜmGu4????ONN/8?WyV~rr?/'俦ieOӌ??/W4ms>9mWS4_4MOO/WW>}u<?3g-?}{igZJiij/>}???ӧO/"'?ӧ/??ÿOѧO_~?~^_fK?~~_}?}K/|{?}?_?O>}3O/#[g_}ד<99y|s?}?W= _?ʧ+k'rINN'???UrMz[~L~>n?/Okg'''7?񟜜[_\G???cx/4K4m^^_OOoKOk{?kx~f}????ӧ_?wIO?~~߻?}[37;??wy5/[c?[g}????ӧ.3?4}K>}??___OIOA>9}ϟ??oɍ??/[KwZ_O}"}????ӧ?a?']Ү|:?go@O??;?q7O>R}ם-o''??7?_>}gO_Gӷ_???'y<7rrO?SOϯ?{7/'7?'''oO'WNOO\OO/WW䚦}nߍ|_W 4????ONNng/?99Z/?>}7u<?3gӧϿ?Mϳ]jץN?c_k>}k{?????qi;-(?r?f'g??ɝ8}"oONN;o?^4_?Xo?igm?4&k?#ӧO~v/z?~X;o?7?ÿ%O~o?LOi??ME_/ҧO_OO/WWWQ?_?)_tO+ˬu)ϟ/:|O~~_/OO/OOs???}????ӧoO>}OOOzS?~#''oONO?yo?wr????rrV~2e4D.>??JiZoKۏO/՘{_M3?g[o?[oߟo??89_??_Ӵc ?eߚf/im߫߿?iI>?|?{6#}m\~-Ϗ7~o'g??}]Kvy;?iZ)gϟ/{?O~~&||{N?O3~o'g?;}%֟_O/~ӧ'???=7ȧ??sռ?g?99y<}~INOO\OO/WW'}O?=t_z]g?7__?;>}9?q7f^ӧ_?__O>}?ӧO_S>}'Wߟo??$~FNN O>j{Ugw??id>ii~??\/}?\Ӵޖӿ/_x1?f'g??5?%'''_????ӧOYz?~X;o?7?}_}/yֿKoOk?ӧOT?}m/o''w/5Ms__1?^;Wӌ??/?99\OYyM[w-w'k_?M3?_]Ӵ֟_OOM4??___Oo%[ߏ˷^??i)mWSc_?O>}??_//O_??vן?E>izR.wE_Z/O_WQi/''/7~o'g??}5??ӧoW?_Oxo ~_5-nw_On'g?ONN*O㯬֟WSc'99_/'W5Mmi1i¿?/i?ß_3_rrrr_o?[?rrr_OO_/#'?kvlL_[e/MӴM_{{o???uo/?ӧg~_~?۟˯??/O5?kZ<u'MW?wE:oğ_/OO7/o?[o??/WOϸ_/}??'y<7rrO?cO?7/'7?'''o/Iii~??\/}?/O~OtKOy~f}????ҧ/8?l_?}K]w^z7?ӧ_OO_//o@O??k?}?ӧO?<ԏӟ?9Om?=j[O??ǟU>_Y;?>Orrr??___Okcq7 _5z7^_ӌ??/?99g[[k'''[X??[ߏ˷^??/OE?~4?w \;zꧯ_?_Nir_϶q:zjg'''w?<+Oi?99yk^w{??w_42 XcYi?k9Oi_i'???O>~|~b|:?go@O??>}3?4}K>}??___OӧO_G_?ߎӧ/?M/]jץN?c>_k>}k{?????>}????/WOӗ?}W3O????IOA>9}ϟ??}oϞɍ??/[|_$''WS*i-m??m_w߿p{Uc}5O??kYKnONNn}/GNN}???oMӎ1ytzCkokiik~//'''}s؏ ws<?3gSӿfwM/ijN?c_g>}};o<}egXןZ??_O_/'$~FNN Ol{Ugw??%i;?>Orrr??___Oş?iWwu3Ϗ7~o'g?C8{O~ο7[?}z?_?O>}3O/#[g_}ד<99y|s?}?W= _?ʧ+k'rINN'???UrMz[~L~>n?/Okg'''7?񟜜[_O>g~|~b|:?go@O??SӿhߏW~Y.R|?_WO>R ߿^84_q 9_O{_M3?rs>g7?'''o}Nkf_?4O??wM6Z??M5M??ӧ[?Oz{؏o?^,z]g?7__?ӧO7֟_O/~ӧ'????}/??}???_}/:?eֿKoOk?ӧOT?}m/o''wӧO_G9__g7??O_'''[y=7ȧ??sϟz~ռ?g?99y|Z?wZ_O}"}???_%4v nn?޿jo₩_?rrr3?ɭɭoOOO???\/g?iڱ??N2zhmoM4M6m_o_4O~y?n}.Oo?7?>}i%ם4_M3O?ӧOU?Ow?????'͟O_?Xo??7?_>}?SOOC~}WSԏӟ?9m?ݿj[O??ǟU>$m'rINN'???>}y?}c/???/_H8~{//ww{/OOo???}????ӧoO>}OOOzS?~#''oONO?yo?wr????rrV~2e4D.>??JiZoKۏO/՘{_M3?g[o?[oߟo??ӧcO{؏o?^,z]g?7__?>}<ߥ7p]?ӧ_7;??9/?//i?ß_q'<;{_OM5/[c?[g_?i?}sOOCii_/'7?}wgI?NjOy~f}????[ϴ_/}??O>}_EO/O_/gg;ϟOE~4w \;ꧯ_?_N4??7?_>}gO_Gӷ_???'y<7rrO?SOϯ?{7/'7?'''oO'WNOO\OO/WW䚦}nߍ|_W 4????ONNng/?99Z/?99/''/??5M;p_Oiiڦߺ7?Ɵ?o?oc?/|~Ͽ??OѧO5d;wg/o''wk_??ӧO]ag\Jiih/>}???ד<99y|s?}?zW _?痤4D.>??ҧO?o~LO~]u<?3gwo~e>};Z/OOo=WQ/''/7~o'g??}5??ӧoW?_Oxo ~_5-nw_On'g?ONN*O㯬֟WSc'99_/'W5Mmi1i¿?/i?ß_3_rrrr_o?[?}oi?NjOy~f}????OѧO?~^gK?~~_?}K/|{_49/wg[Q~8~?=5O??;?qD4🜜5ww/;i4????5MNiih4M/4MSS{+ \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_1_1e1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1e1_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1e1_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1e1_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1e5_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1e5_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1e5_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1e5_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1e7_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1e7_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1e7_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1e7_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1e8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1e8_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..19bb1cdac7517c798af3c1c8b80e156d096f18eb GIT binary patch literal 3479 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1e8_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1e8_states.bin.z deleted file mode 100644 index a68398e450ebcc0e850e05e09f1f10f85a80a8ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22539 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ν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 Ij>MP#2hk!VF#rGn diff --git a/client/resources/hardnested_tables/bitflip_1_1e9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1e9_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1e9_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1e9_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1eb_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1eb_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1eb_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1eb_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1ed_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1ed_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..64619890057767ddd63990d313622510438ecc5f GIT binary patch literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5<D_%uHflMi+2!u`c7_JxBE(;rb5(^a}DUd_dy;!`iZ^L$lPgERHISUJHR< z4$o2D$MzZYvd)>=#~H%G$6?aw^0P8<kLodSqyLA@IvDxMj5<G}b}#aM<E7x?*smnQ zdxi0-#!s|<<m2NXu`rlCBD^lle9Yq^=*cj}j5=KoEWW|S$-|6erdY?+bh>&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY<D&9k#J=KqQ>1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>w<n#KFy$&aj^71*l-+H_7AK*jA#CvzPPbXYhr zF^Pi{^f7S5qlc<We!ug91ixKUiaP@;5~iVoltvK$1Sx@pn6WC#OrSE1MOHFaG>EK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW<z%apyiHumnu)`QqVTnv)$Nd*_ML1B9C>1OLJq>&c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1ed_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1ed_states.bin.z deleted file mode 100644 index 9840a5ebe098159ffa63ba9cd5b13a914ff0662f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7078 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1f8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1f8_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b3ff4701705a8847135aaf38bba721bf3faa1bf8 GIT binary patch literal 1274 zcmYLIT})GF0Ie-8{kcI}XnSW+!P-L0jeK|Uf&KVb6b4)o=ubWuF!z4=pl^4JQ*ml) zOMki3QAI1!2^cD3gSW{Zn18#sy|=n#4<wSz2SZw)h;hV#an8&+-gchO)5$p}=eWN< z@)^13pu=<Uj~`$86oHX5CzcE|f!MgVOsgnUXm3tWPS$D_3Pm8G&=s+dYwUk8Bk8fj z%%@=gx)Aom_NO-8Nbm@TA3mDCic?(GZaQz<zx_$>Fg>Qye6rzay0ywyHjnE&y1)8q ztg39qBZGxEH}1Z1jrvx^mZ!=n<LsAIdgz6|`j}^7i+muKR#P2Pg%U|}jV|0`jE78Q zjXA->E_FDU?Nnios;WvE`2o)J63Wi^UU#<#FDhpQFq2A7e@K)%=O&Bit@==SJ^j`w zE@Zq9HHIn;>BlHiM6<c|to4=myt<({b6F{+B8|qLg-qjgmomk7Rg3iknDZ!0gVDfX z^x3Y`as6`d&Z$#!vky!S$q5-|oka-fW`A`lxUw_)ys&Fz=|ugvn-p@}GJUu9pN$u; zp6QD2Ig7C;*B|__vEt@)-HT0iXFDg@^VooffPbIstAoi*cP@#+@_Ch6Q<=8ml*1ep z5v6_>!gF%>s=lM-iYWQSgG7<jO8zn$F(k<B&YM!H3}86IZ!<{(jj(pVaY**46I_di z*ove9%z=Tt#ewtrYMhC44m(HZGO$PNtx@>muosT@*(tLqk`dBdgua;ArT6u#{aaU? zzBzO*hPcM@Tix-nce&%ZnW{cC;g!<P1vwl6xm>}x+T5qI*znm+D@EyXuQ*sCH#<XR zOXzc)L|IVSrj9Rwdt6sYYEsTMuysQ+B%QIB72^^sGi*({w!~Ig%x?&6hhg#i@+bGK z@zcY<m%eLqFCFN<6??Q-IJCOLCRa!R=mE@ie{s>;QuXpo+q*&Yv-|oRzx>$*(cA0T ziEZKeM{S<>&HWdC`)l)n(BHXoy1j`RG+3W!nPWC~Oyp25CkL164Jyp~`pd_2r=qD> z{dsi+Frf)>;5C@F#$bPe_~MH2@WneraYwntytMKsN0tqX-hY)#{@Tq<FX2wPd5b|8 zEoRAmiQ;H*xRUXxn<;yIX#6az-~CZEzIUE;(I5+w03t^t&O|g@+{j}>B!rVZxFkr^ zg2)lR1mo8@G<F)vakN&j><p$Ib`nGg99*`?nRo(;K>>&XktFIuCIl!%i#W_U3<e86 zfCCBVBNluHrT8p9fFT*rP`J-u#~Ac^_4`sovpZ!+98NVHGpoCcmu5|=7?@!?=t*G$ zPwNtLcu2_OdjQQ-P+a>;0ozwwScg1nV{9sbe4YB+VHY1@dgvsh737e{wKi^s=5RjK z3gFM&hBO8Xcz#{T0(d!8Nw_aJ44WPJ9ZU6^FoQUfz8#MPx@TBNK^X=3oP}s52omuZ zF^CLn<_lzkBQe4mQV&}+1O>CyT9jYsyQ)Xov<0ImeTnUf3+;UhVG1^|*Nh@cP35k+ z?u0BheG1;hIx!$7Qpvm$!EB>xu07GF8)Chv&*HGyFq)5Qu^KYxsg(E12q#+YjFZ!B k5&T4_#yFtJ#()eMjBHbx<{*dTyWZVTI&(vj2T?TrA6B~l761SM literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1f8_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1f8_states.bin.z deleted file mode 100644 index dc0f16fc4cc08b0fd65511d674592b823d03e35b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15065 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 SgKp_lHpt_{Qb)nA8~+=iC{J(z diff --git a/client/resources/hardnested_tables/bitflip_1_208_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_208_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b01f02208ef4ca4c78fc6566fd6e0c556e11ab30 GIT binary patch literal 5424 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 I|Eu`_01i(LZ~y=R literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_208_states.bin.z b/client/resources/hardnested_tables/bitflip_1_208_states.bin.z deleted file mode 100644 index c8a8cf4a0..000000000 --- a/client/resources/hardnested_tables/bitflip_1_208_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xOu3io%VkLSMd9E bJ!HHK{| us~~ןO?y}\כ7t{G{s6~W.כ{vw?~>߻oϿ^珟ϝ8_uܿ?}/~]?|כ>'{߿>kO1W}|p?~==|kymo7ogߏߎ_??6ÿ?_;~o\??G??y/^yXopaߧ{tWMkQ|Xկ|G7___5~9_/ߟkϷ;/? /7?j?4[<ֽ{okOkoG7}g?W˿?o<?cϏv?:v|j?}OG_FwƯ??j񏎿vƯikۿz=}]?3n_}4^]V?O_V_/dU{uSƯn[wo]}߻u?????_?yyOkC1xwouw Ͽ7:coooo_uھ//ko;?7QW^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>} \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_1_220_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_220_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..fe85775bfe7cdafa269bb9b1c2202af269e763c7 GIT binary patch literal 1680 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 N^*D=5@4XlI{2wZ5kZb?| literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_220_states.bin.z b/client/resources/hardnested_tables/bitflip_1_220_states.bin.z deleted file mode 100644 index 479bacb03..000000000 --- a/client/resources/hardnested_tables/bitflip_1_220_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xMnFaWtщ|5o}4Lg ObOjzߟ1$_K߿rK->ɷޥ/~}K?kxzI,t_~[?~O}־}~;nnr|_O?鷷>ޯ_OCe9w}{}zǏa<㯿KŷwKIߧn;7I?鏗O/???O/O{??O_o/_?w_w_w?_?_?oO_w_Ow_?oO_w_OwO_o/_?w_w_w?_??O_o/_?w_w_w?_??_w?_??O_o/_?w_w_Ow_?oO_wO_o/_?w_w_w?_???oO_w_Ow_w?_??O_o/_?w_w__Ow_?oO_w?oO_w_Ow_w?_??O_o/_?w_w__Ow_?oO_wO_o/_?w_w_w?_??OO_ӿO??O??ӿ/?{g{gO??o??_'{???ӿ/???oO_w_Ow_??_oO????O/o?o??Oӿo????/?o?Oӿ/?O??w?_??O_o/_?w_w__o/_?w_w_w?_??O_o/_?w_w_w?_??OoO_w_Ow_?oO_w_Ow_?_oO????O/o?o??Oӿo????/?o?Oӿ/?O???_oO????O/o?o??Oӿo????/?o?Oӿ/?O?????_'{???ӿ/???OO_ӿO??O??ӿ/?{g{gO??o??_'{???ӿ/???OO_ӿO??O??ӿ/?{g{gO??oOw_?oO_w_Ow_?oO_w_O_w_Ow_?o???O/o?o??Oӿo????/?o?Oӿ/?O???_oO?_??O_o/_?w_w_w?_'{???ӿ/???OO_ӿO??O??ӿ/?{g{gO??o??????/?o?Oӿ/?O???_oO????O/o?o??Oӿow_w_w?_??O_o/_?_w_Ow_?oOw_w_w?_??O_o/_?_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_O_w_w?_??O_o/_?w_w_Ow_?oO_??O_o/_?w_w_w?_w_w?_??O_o/_?w_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_O_w_w?_??O_o/_?w_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_O_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_Ow_w?_??O_o/_?w_w_Ow_?oO_w_Ow_?oO_??O_o/_?w_w_w?__?oO_w_Ow_w?_??O_o/_?w_w_Ow_?oO_w_?oO_w_Ow_?oO_w_Ow[ \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_1_24a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_24a_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..15195d21385b0eede73fd2ebfdf61354647a4812 GIT binary patch literal 12468 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 GUjI)zux=Cp literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_24a_states.bin.z b/client/resources/hardnested_tables/bitflip_1_24a_states.bin.z deleted file mode 100644 index a4cc5d58c54c0b63b9a7a73ca28792535b688a30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77058 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 diff --git a/client/resources/hardnested_tables/bitflip_1_24e_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_24e_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..18a6d49871207a91671b9bbecd09e0a98f45fb6b GIT binary patch literal 2268 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 G%zpu4Rqjmy literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_24e_states.bin.z b/client/resources/hardnested_tables/bitflip_1_24e_states.bin.z deleted file mode 100644 index f7bb63eb7878e931d723a7a353d2af818d2cc96b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44320 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 diff --git a/client/resources/hardnested_tables/bitflip_1_25a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_25a_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..fa1be58fd4b26d23f8c0a258942ba3c6ae602cf8 GIT binary patch literal 4981 zcmaJ@|5K9rzV{obJXj&}fSit{fXM^u6N59ZvssFu5Efsa2azd#9+&1KKh;jn^u?_J zQ9*6dpe4^~6BLC<-6cn7+Ge)^>s(~!-a)V2)9mctv2J_Dx}81dDYv$^F8c@E`}yJX z!{<Ho{`PvkU!QlQ!SvDohW2u8yY&3$PqY47w7L1As`g+0K*_iq$;imf-kUS9{>Mx8 zEr<{DKmmn{kT)JuWmHfmAx%);=q_r>7(pR!Kz*npBP$5);%Bpzt>nD>BG~&$zGFPf z>XXr__<k{qvnw9Mhsw)sIbFppC0(OwZLN5fQCyt4m?`HMn!6@stz+7i1Cq5@2R)M4 zE7|WdyzZNiLwX-OR9Wbuav+*6Yt0oK-0QID$|mQD(QxyBg@oi_AJcP$=*zg7N37=N zZR#tLh+aQ7?V3r9bOdr@vm8_mC559puGgBdl>w=WTig{EYVRPts9!w(NJq0in+lry zQ31(r9ep-seHKd2?7fpyKR!QsCunL}9}4;`rz(C@y--E&a8P)LvZy85^|H}+`B^aU zZSM(rPsN{7je13mD$$p<4HCKN4&v|@aDTE`v3V?5O|miz_0X@W`m#D8CJ!LtfKNvo zU({*@6+;f~Gr!q=A$UT9z%!9yZQ~q+?MwS6ZhDU~^V4Ar)0Q*Z=fY}I>~ZioDrlOr z>l-dUGBW`rRa0~xAlSYXwVc3piYi)iMp{+6(HS`U{q*Yet@F%ROkhi0?<^nr2zknz zJc87PEGN;e1{3;3{uAn)1}L}nnqRb(j$J9<gWb?(vu9UIJUPwRd-OuiWIc4r*E9G% z`txXyYUW`eRtJoSXU1m+t}rlp?4v`Ebi@<@O<BxS+%bk}Sc@dGHGMQ|Y)&(*hCAB} z7$1k6ZO%T|Z7>wbjT;)ya8m-P1h5}(@p4Fh-vi|R<#6*4of`yRZIwSq|4v(B13sOr zZq(p6d#tg;Er$W?8r0KJ?>WHlApKKIB2GvE;*YAI3ep((;v+x%64QJXXNP)mom`a8 zB-BCLCO&i5$38B+pr}4o^57V+lCl8MV108u_@?5s*vsn1_1je-=@*(ujbrJEe&PjM zqix#ru=Dvb2;Bxr&qms5gl|(=RaT6o8ZIjK<t55NV3)|_);SHK_gN`;u~mC$XG53I zzEK7IsQvY%y(e#3GY1v##lm_S2m%0*7n{gh_5EFyn1;MUVvdxC`OrcdtD~mR1KMrw zm&gWceQDR`TmYE~;;jFKAbOT*-N`-5IGX0(diZvACf;V9Q|}}RfxOjRho%;=oMY7L zWwdQtEB6b_2_yywah6aB0;M~DMBa=VLhpdQE$jNd7Bqo&W_D?obs()5yX*E?Q<8yc zv_?WqwY2?0`_20GzsvdO)dy0f-zH&;-6KJjA-(WWN>moBL28gS#xFFxJxx3iso@SI zk>Be{m!oE0_J3B&H-}<%A^Y>3_lvFk24BUNoPRPuLJ$0Y?`wkI08g6j*(<6T!|qo4 zaaKDL#fGZ8YK21L)6jZzR@B@_n0-6kUeIEao2Nz@{;NFb94hifF+EUZ%e+83Z2bx- zl+j*D3tu#?FP537(s|1(RcriM6f=Y@-8{QB)vAiY?FuEx(2eSagjWbs!um=rsTW&- zQp&Vh6Pfq*;+PEC56a<icmcH&CVizURnS<BL>U%Llb8bXmXYfu14mJyN)8uxX;z9! z#NnK7C~7j0>;!K18UmPGw^F#~zYmZIUC=xg#AGPnngV-GU}$^+q!C`3%4?VcL%n7% zO5m){8<L!!K?Dwrf5ShS9uMM1W}=^eT(w#b@Q*R`(u_I!mKG{{>0u}v1t_f5OaT9M zE-E?i?5TsN*waZ_FYzXC8$cq9MGMY$h$W+We(&Jqyw5#R;gyl>z1VQptvn;YcM$5M zg|Z=X2uaTHa$h<-yPPkwHUnVeoI<f`lU9-(JWp%k5J>oX)0weL|A2@C*nA%Y*HPFs zLgxY1uuwRD0`g9V-6tev9$1Koe9op>PG0PR>et>Al66{&${{tsM?a=LW0*$_eA6(= zKy)h-A*;xl<~K;PM(*Jkt?z&bEw6UzY4zr|{{)aZl0Bw<P?7M5^?D)jH{v?fzXs-D z;q>(S&w>ESMS5P1n?3g9r5#o{+^)Izkol~7t%LN87z@>7hUxp9%#$<79CTfE1$fT< zK5$O;mh>7u8m|JjN$*Ho#7&Ctm8M-2KE`<lJ-V3iJ>|Epp>HVnO50q_E#d+#rL`Xe ztnihh@X@u-pMg#0yR5(qBwzcZ=I*+|kDuW6o>BB$VHwz@&B64QjGaF)#6e8)4!R+) zlvfshUNn&v6E)qmltApzh74pDeSP_^&pf?|9>{tb>>;gR$$CwSUdX{&1fK3ehesJW zIg=HGuaK-)N!F*0ZAraQ=>Gb&!{3?}n^m+^76y{l|L_AZ-@c}FDm=vDd|Ba8&O)%u z8AdlbkRvjTTr2YuG8AraN`#J%52^QQ3X_IVMYwE*%HgB!a-0(Fa>uTbI7m`&O>z@c zLA)D*7x&6C4Hf8fp4NZOHA0L96)T5xLOxONbw$GBQKkWwi^0*syi{3u3K2Wp()!15 zQ7vCD4B$GXM)H9;3nUGrLqr!D$n(A9fA-*c2c)>`EZTP;?7imHE1C<71WnwV|EA0d zhexuJ8lLnl_x<Dd=9{NV6x>Z1B)m{;PT}bABVLM^M&!LNqQrj98KW_8=?45C@51z; z#Y}s~H}^w-29a6d;dek{deXn@UsaqRsPc=fC!5UKicq3WUPU^Bz<M+mi<&ie^3EuJ z7aArhC22C1Jz`rvl{-UGobss47fZB3UX3R$Nu#6dw`EKyq;;xeu~=dXNe_28Jnsnx z&I5&2K-z(j=$9f1q*k*oaccp<Vn*grWj-tf0}_&3Yh9L~(JCgfk<JF)p`%>-!$l3{ zHF3Skw=Qd$3K@dJ;B|`H?w|Blau*e`6jj5p&VmdH)TiPUO^_y)AgTmI^2v$(8cAL( zMkG9LCFoH1noyi215|z-KcR|*hg|zLi$&(Xfns$HuTl$;0s=&wb%Dn+j2r>d6Oxt_ zFO;g&v@0H4>=tanrx*H9DQb{)p@wG_AwwK{0zG*Jq}h9M96#+7kO;;x&P$Nc73x7o zcTpG(F+AB>B1$AYj4ByE_7tHe#(bA=Q9&SYPTSI5z%zRY-RMvuEB%cmdPP%&P^ekh zwOSU{0i>WLD^ac)3TV^%0%{5LG&jzaf{oXJiW|~1tw^jc-;KuRvQmPafT<mN)O7^} zeWn>wPzVw@j-~&+tn@l`+vV#(#WK6TQeC4=w*){|$-!>LG7^h+3)Bo&Wy@&nL4)34 z^<axFHj>>w8BCXxw&GnHS!ShNt#(c}#ReYnPr40<#ARCnZcWpg)S7TuQ!Voj>+Co^ zB-d*QJ=ux|g@u9SFj@=ps<Fi~@xc8+yoz~fvEmz2f`KijS0u{4H%`j3Xe`n3G8(7; zHQV0*=G0Q{Lsd>rMlCBNr#U0~I^+L1e^Iu=V_jIemukHKANf<|S>2cazo)EG4L6Cf z{-k~R<>af9tG_jUofH&(y;jaO(1<3X(7_+?a`@*OWY$%_fw21yy5`7E@3|e;NZX=3 zbcAUm_hnPz7fkCH0fpF5P95C4HYjH|5LeZ?{uz03`Ji+|++L2{00(m=QvZgM)umXE zpWZ#V_X+TfI<R2~-WCq%cWa(h)38sK>`Jhp036hanl0A1_K`jL9sYib0hC_eW*2Q7 z&wI182wDDk_rO_L;uKZ8wy(OjS`q>Od?mfqR<ziZu)I>NRG%^$Dw!^?vArT@3NP&W zp|%#qV)&EV`WF-Nji=}_fGeupb?Mu#I<aZ>i}8(x;~<q?skpPRZ236T_qO@<=aUyo z`d{v@4|O)pDW24ggpLi`8j^R7#Y{&DxpXOiDeo6nvlTziUpYsQ(y5BC<W42)_~FL~ zx9UH6{6(~RzIxy*NBmQERpV2-KRIJxK0-efbs1UWkrAU8_fL)BSj=?I8Ql&LB{J>{ zaC`$!T>V>d!-L{->H4EOMHEW`0|(bx)sYWI_`Bsjv>x?G<&qKOw45zyirU$3czu<4 zP23%Mw$JiUme{C2eVobjM>f7uUl?@##P?$>V#7#KR6visUHbWpA37-8Xb<=GVDD@i znORn6Sts{i=EnKmyLZC}v*NO1;IU)$%S;>hruRL^A9_8U>%Zpjs<!lNrX-Dfkgq_+ z5*adH7x1tT@RE#WWNhpQOKi4>xcYf})0o{oMP=!68x;;;Bm2%vT~A<RF}06s+q;x| zXJ6zZzhsBh_pBH0_{*NA5}xtPo!QZ&{EpJ~rCjpvlI;BTG3YEO8_;}N@kM52%eMpo z&!I)`*<vzC!?7hYmADz(BOc!Q1V7i1e6K#ExX?GcSkBVx>wCSTD(DWo%EoX0h50J~ ztwwWzccJ&-oDjlY3&nIYWJ>gb)?~N(HORu@aC~9JgkiBIGOJq>QT&S1#vh%Aw<+&k zYiNz8L!+r>MB3ENS+^OfvY!6<x4Z*1T-~Qw*6WQh7T&I+igx!~PP4=Y7IdR2X)I=7 ziS!PtDrp!wiDCO8?11%3e$*+fb~JvhSYOrkNu(imC3G8$BqM7>u*nn-8$GuC8V<R^ zM$Wg9hYRSEvS<*-BJprIGB1=(npP%w6V#zJ`#s7&3Jh~fZ9v5gG$r?x)60y*JmZ*+ zlDvLc!r8mhHzdZ*Y8|v-@!9>!70i%nla7d}qT&KN8B~N<`dIDo7##l1pS&vr74b6y z|C6d64e@XGNke+kksaWW_|nFL=e#PIR$P-3G5yAy0N(XCZ&vPUF#CF9Jq>-f!g*%` z1VIT8?~+MJ+XX;2H7%1vsFDc#T;T<Ge5yrUsW|$h;06EOp)Ji^;{&OuToE^oxKcdZ zq3~?^Aj%7R#jW6Aqtapb=oFD9o~XgW(!}S-;r*c0krRt8?YbK^c4piW3JX7MoTIM_ z`Nr9+rN$ci-l%bgOr=s;dwd^0+4{KYe2ciKXYg4cDA~a{I~p&i!dOov0X(My<jm+~ zo5e;(vmah4py#hmB=uPQ=GM+1F8+7qRd!R)_|o^~mKEGsOgs76(m&|&yN}*9yxOrd zdC>KyVbi|d68F}2;<XoD-!YEPb_VaM&su)7J>Hk?->9QEZOrBVd~p0=>4!rTj|($@ zrf-s+OI-YP<ECCH3h0GYw(n8~+kW|`yRKzb7OF1Pv)bjIBWDLC$?%e+KKnVlBzYiv zwfgervD`@Q0c-3&9JTFiG5)!n3^KDxdicz)n+-Oq|H9~E8q#ioYTn`8_uBg1AY}zC z3UgGqxX}YZ=`o;jKRR$tLRQ3cZ*{di_84K!Tt+-RFBi!eto;(HsSJ0mQr)wCg9Q!v zq}3$g0c#Z>2`cDhiqPYel#Y5vjoMP{idiP%>m2q<P#S9Iw>|s}GkQhJa;g9QCz107 z+<8{WMqz&7y!m`!E7++RnE1Y!VVo=6Coj7;$+#4Z4Ar!_SGu8zXy?OA!HcAy3cqEO z$#(w(q+=9{Pys13;vA~C7=rz`YUI*K^6{jR<#;LpT<dXf$-nxZ9Drtt#g_9ewO5fH zc?+T7?yI5Qnei}Qi`!amphp}Q8?a+X{-`Op>HZ&E?(b$HC+{B<9g*bIsc?d0v-g)~ zJE~Z?D;{2=!pma+d8%rC6UO3I!Q#@BSF)bWP;1$ZCKkhDYtf6)sJo4fs(rkdgQ|&y zW?SsMc!rm|TA)a8hKhyOJfjYk;{*>|8>Sb4Jhc^zfsM<J_pcQwqAqMjpwa6F0V+3s zT|f>U2GDX4EPw=55l99#UPqu33@M$f>Io{_;ZGrVDf(_`{ZVWdHeq9R1IxAUrEIc) zs94~r%*}MrtO=fdY4iw_DulyJJN$IA^Q!%ALB4f?E%Yx4H7UO3gxX>s$Bjx@ZOb1w zg|XN$`&u9*Zl!DV5XQpdgwdqjUrtN~sC04x<SiC(=Nm?Fyr1$ZNA(f3CLk-G9vP-q z5%Wx`3pc5a=HqPbgp9-U4VbW%2?<qP430nLYBoj6L9%mY0LE5At)Tw|nN?Hn)<oR{ zORC_K!U3C{UU*5<0*7r>R#$JBHaT*5SJ{HPj(1uyZx?ammlt$y*r+SWGtSa^{L>Co w;BbQx*p+lXQSPwGJ6rZQCCW$d*d|<EGr>Ba35(BHe_(zptyQ_Ag8u*cU-)1DiU0rr literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_25a_states.bin.z b/client/resources/hardnested_tables/bitflip_1_25a_states.bin.z deleted file mode 100644 index 4e5b2ff279cebc2f552d994ff58cf344c8e4323f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46813 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 YcrbzoBX}@^$Nv|>1E!zF|8dy=0=RtV761SM diff --git a/client/resources/hardnested_tables/bitflip_1_25e_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_25e_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b6c1eb54c9a47adde8f344c3c51fa06cddd1c782 GIT binary patch literal 1135 zcmYL{Z%k8H7{<>zx3{<4)_aQudL<ODVK@;2N5Y4e6};6AW>%pNmAXuJlKBCWeP|3g z;vk$`NED|Ar!LjFtQ#A{LEQb~LS~&u;|vnFbcSu+vgn;_93s=sKO1qNtDp9MdXx8; zC(oPbS^rvxZ*5@vs@Cl%Hcv#r#@zm;r%!J$mM_tL-6x$#)4;Y`0~&x65G-F0_Jbi) zyaE27TgO*8Vk<{-qP5?TIBTyQreJUF)YQ%k%ama5=s`sv4ITg%-)Q58Rkn_c<X~;b zrDZic30V1UP0b3tq0wdO9BEWLkCXx^bsiqR5-r5B(oKbHx!`dH*z%4!hiY0j1rOAy z$z<oy;h~Y4+QOapTM~IK=d~l((EG@a!nRX-7<~54(j;F*`I~%us#5HweW2I$p*my; zr^N@5xqHg!xp*;dQtP0;bq^yiGQ)mZG#pTW9a4sse9B1B#@?kb&_vwFC8WS^E?!P& z?LS-annSFmE1xuLk1o`qtv=2WLO%Xa)TX(nh0F4kL!yTu2`l+YH|XYu!vz+z2t5J) zs)u!PllEC5)XUx;NO*M81PY)|HfN$sYFhRx_Qe72I~kXdhGY-yw%i9D&pp=v5b{H_ zRtswnwZ!Bf;l1b=RHCOLu0ATqO1!wlkRQsA?Fq?j&N!@A_!~#tfZ{^EB$C6F935jt zaSaz6MLH{^h9WzQ;M~9^3C!o*gRH_>Ga*bn1daHzPmgmqIJ#v?YY(+&+`tQGWSeWO zdW#egLJHbtW8)_DgOfV;=soOfAO+T$>y(Bhu8Mc@Gy|EG*_zQG4#fTDKQJZ7Jz&nt zKVfxfLGP#Ssggl=#I0dmWxo0soTm|S5;5#RtTiFOCBa?xu~mF8F>@b*wAe>To0>ID zngjTG)hJ`tO<=EjPQ5ig+&aT8M7`)dE{dK8i}7M->rcE+!Uep^-+{jiWCy${0E~Uy z7*-_evv|3y_N#*W`5e415WnhIKTNuZC7Pgq?Odo{YlyVRE2iytxXF@V-K32wN`6`Z zZ-g7n2CXmdrym4TZX!YE@803#uS+ymAb@@|BLB_51G@O@LQ0B1M49Nna5tYSj(gDq zNQyX+7QPfd@nnIN41B^b(r~GPEAH|$p1@QUHL5@avSQk&?t$}YR)~1mS$#_GD9%*H zyM<8mnKsjkX1Ou1pjAqgcmf1tOMRWV&(C7+udLa!l1eL3oCL2qAbzB0cbrSNLGnsA zz(x*@BSYcPgoT}=`-zgTJ4B-r#l&O<`e8FsT-vEpNb<-_w>fa^lDHAe5m9lbUGU{J zQu69mvU<+?tO!td-=M8VDf*aH+Smv%9LUSlPlFD=6)|Sm7%rnMY}c~hD#bI~cuKbM yq?CJhtAP65h{epMM&USMEUYYNF$V`pBbvxclPu2&Ubk@ez4D8LgVzqeN&f>&!H^vQ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_25e_states.bin.z b/client/resources/hardnested_tables/bitflip_1_25e_states.bin.z deleted file mode 100644 index f8686dba6fe9851da2a7484b5352f4521b575ab0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23650 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 diff --git a/client/resources/hardnested_tables/bitflip_1_262_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_262_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..15195d21385b0eede73fd2ebfdf61354647a4812 GIT binary patch literal 12468 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 GUjI)zux=Cp literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_262_states.bin.z b/client/resources/hardnested_tables/bitflip_1_262_states.bin.z deleted file mode 100644 index a4cc5d58c54c0b63b9a7a73ca28792535b688a30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77058 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 diff --git a/client/resources/hardnested_tables/bitflip_1_266_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_266_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..18a6d49871207a91671b9bbecd09e0a98f45fb6b GIT binary patch literal 2268 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 G%zpu4Rqjmy literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_266_states.bin.z b/client/resources/hardnested_tables/bitflip_1_266_states.bin.z deleted file mode 100644 index f7bb63eb7878e931d723a7a353d2af818d2cc96b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44320 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 diff --git a/client/resources/hardnested_tables/bitflip_1_272_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_272_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..fa1be58fd4b26d23f8c0a258942ba3c6ae602cf8 GIT binary patch literal 4981 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_272_states.bin.z b/client/resources/hardnested_tables/bitflip_1_272_states.bin.z deleted file mode 100644 index 4e5b2ff279cebc2f552d994ff58cf344c8e4323f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46813 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 YcrbzoBX}@^$Nv|>1E!zF|8dy=0=RtV761SM diff --git a/client/resources/hardnested_tables/bitflip_1_276_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_276_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b6c1eb54c9a47adde8f344c3c51fa06cddd1c782 GIT binary patch literal 1135 zcmYL{Z%k8H7{<>zx3{<4)_aQudL<ODVK@;2N5Y4e6};6AW>%pNmAXuJlKBCWeP|3g z;vk$`NED|Ar!LjFtQ#A{LEQb~LS~&u;|vnFbcSu+vgn;_93s=sKO1qNtDp9MdXx8; zC(oPbS^rvxZ*5@vs@Cl%Hcv#r#@zm;r%!J$mM_tL-6x$#)4;Y`0~&x65G-F0_Jbi) zyaE27TgO*8Vk<{-qP5?TIBTyQreJUF)YQ%k%ama5=s`sv4ITg%-)Q58Rkn_c<X~;b zrDZic30V1UP0b3tq0wdO9BEWLkCXx^bsiqR5-r5B(oKbHx!`dH*z%4!hiY0j1rOAy z$z<oy;h~Y4+QOapTM~IK=d~l((EG@a!nRX-7<~54(j;F*`I~%us#5HweW2I$p*my; zr^N@5xqHg!xp*;dQtP0;bq^yiGQ)mZG#pTW9a4sse9B1B#@?kb&_vwFC8WS^E?!P& z?LS-annSFmE1xuLk1o`qtv=2WLO%Xa)TX(nh0F4kL!yTu2`l+YH|XYu!vz+z2t5J) zs)u!PllEC5)XUx;NO*M81PY)|HfN$sYFhRx_Qe72I~kXdhGY-yw%i9D&pp=v5b{H_ zRtswnwZ!Bf;l1b=RHCOLu0ATqO1!wlkRQsA?Fq?j&N!@A_!~#tfZ{^EB$C6F935jt zaSaz6MLH{^h9WzQ;M~9^3C!o*gRH_>Ga*bn1daHzPmgmqIJ#v?YY(+&+`tQGWSeWO zdW#egLJHbtW8)_DgOfV;=soOfAO+T$>y(Bhu8Mc@Gy|EG*_zQG4#fTDKQJZ7Jz&nt zKVfxfLGP#Ssggl=#I0dmWxo0soTm|S5;5#RtTiFOCBa?xu~mF8F>@b*wAe>To0>ID zngjTG)hJ`tO<=EjPQ5ig+&aT8M7`)dE{dK8i}7M->rcE+!Uep^-+{jiWCy${0E~Uy z7*-_evv|3y_N#*W`5e415WnhIKTNuZC7Pgq?Odo{YlyVRE2iytxXF@V-K32wN`6`Z zZ-g7n2CXmdrym4TZX!YE@803#uS+ymAb@@|BLB_51G@O@LQ0B1M49Nna5tYSj(gDq zNQyX+7QPfd@nnIN41B^b(r~GPEAH|$p1@QUHL5@avSQk&?t$}YR)~1mS$#_GD9%*H zyM<8mnKsjkX1Ou1pjAqgcmf1tOMRWV&(C7+udLa!l1eL3oCL2qAbzB0cbrSNLGnsA zz(x*@BSYcPgoT}=`-zgTJ4B-r#l&O<`e8FsT-vEpNb<-_w>fa^lDHAe5m9lbUGU{J zQu69mvU<+?tO!td-=M8VDf*aH+Smv%9LUSlPlFD=6)|Sm7%rnMY}c~hD#bI~cuKbM yq?CJhtAP65h{epMM&USMEUYYNF$V`pBbvxclPu2&Ubk@ez4D8LgVzqeN&f>&!H^vQ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_276_states.bin.z b/client/resources/hardnested_tables/bitflip_1_276_states.bin.z deleted file mode 100644 index f8686dba6fe9851da2a7484b5352f4521b575ab0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23650 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 diff --git a/client/resources/hardnested_tables/bitflip_1_280_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_280_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..6d1908e79244a241457aee82c5587bd1f30ef123 GIT binary patch literal 369 zcmZ>Y%CIzaj8qGb{2#f!mZ4-zEaMdh76t|u76umv4h9B>1B`b{7!=r87!LRbHLEpx zdP=2y@Cub+)cDM@xItA)H7I;u!;}J+#SC610m^%X`kMlkmupRo6m(MwR|(@X)i~+4 zs4vu2zA3O}@r5b1LQ~z7R!kG>QP6kw3T_bU(b853v`bm+DyeZ~v8t5D>xQYE7rYDt zLwZytR3*F&ybM6Js)Wjt2b^w<fia942UO)9m;xVgYFaQY+CO8#n#r1Lo*QkHVywu? zYk0-L#K6GB1SEkTU`SxN$H2rhqX~=}mMoRZ^>-E25pmhTrK6!`#njEP=zvH>z|w<` zfiD6plzIZI7M;=oqQC-?SfGksB5_<w@huvOuC1Z5f}#aX-5iSrL-kkbEIKL{m?_4} z6~m<?)DjVxu;@@Xs~D>omySq;rsxM&F-DOBAmREbB*^`)q6@o2koE(P#XojW(md4C J*tQ|90ssyfbqxRj literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_280_states.bin.z b/client/resources/hardnested_tables/bitflip_1_280_states.bin.z deleted file mode 100644 index e4f4b6ac6..000000000 --- a/client/resources/hardnested_tables/bitflip_1_280_states.bin.z +++ /dev/null @@ -1,2 +0,0 @@ -xAP ,Ձ;w!щG -! {4܆.R-W/OOo??_=?ϟݿ_??{o???o??{??_w??㏿_?w?_?ǟ?_??ǟ_??㏿??g???{??_w??㏿_?w???{o???ow??㏿_?w???{o???o??{??_?㏿??g_?ǟ?_??ǟ_??ǟ?_??ǟ_??㏿??g_㏿??g_?ǟ?_??ǟ_???w???{o???o??{??_w??㏿_??{??_w??㏿_?w???{o???o??㏿_?w???{o???o??{??_w?{o???o??{??_w??㏿_?w???㏿_?w???{o???o??{??_w???㏿_?w???{o???o??{??_w?w???{o???o??{??_w??㏿_??g_?ǟ?_??ǟ_??㏿??ǟ_??㏿??g_?ǟ?_?g_?ǟ?_??ǟ_??㏿?????o??{??_w??㏿_?w???{o?㏿_?w???{o???o??{??_w????{o???o??{??_w??㏿_?w?{??_w??㏿_?w???{o???o???{o???o??{??_w??㏿_?w????{o???o??{??_w??㏿_?w??o??{??_w??㏿_?w???{o???_w??㏿_?w???{o???o??{᏿_?w???{o???o??{??_w??㏿㏿??g_?ǟ?_??ǟ_????{o???o??{??_w??㏿_?w??_?ǟ?_??ǟ_??㏿??g?ǟ_??㏿??g_?ǟ?_??㏿??g_?ǟ?_??ǟ_᏿??g_?ǟ?_??ǟ_??㏿??{o???o??{??_w??㏿_?w?_?ǟ?_??ǟ_??㏿??g???{??_w??㏿_?w???{o???ow??㏿_?w???{o???o??{??_?㏿??g_?ǟ?_??ǟ_??ǟ?_??ǟ_??㏿??g_㏿??g_?ǟ?_??ǟ_???w???{o???o??{??_w??㏿_??{??_w??㏿_?w???{o???o??㏿_?w???{o???o??{??_w?{o???o??{??_w??㏿_?w???㏿_?w???{o???o??{??_w???㏿_?w???{o???o??{??_w?w???{o???o??{??_w??㏿_??g_?ǟ?_??ǟ_??㏿??ǟ_??㏿??g_?ǟ?_?g_?ǟ?_??ǟ_??㏿?????o??{??_w??㏿_?w???{o?㏿_?w???{o???o??{??_w????{o???o??{??_w??㏿_?w?{??_w??㏿_?w???{o???o???{o???o??{??_w??㏿_?w????{o???o??{??_w??㏿_?w??o??{??_w??㏿_?w???{o???_w??㏿_?w???{o???o??{᏿_?w???{o???o??{??_w??㏿㏿??g_?ǟ?_??ǟ_????{o???o??{??_w??㏿_?w??_?ǟ?_??ǟ_??㏿??g?ǟ_??㏿??g_?ǟ?_??㏿??g_?ǟ?_??ǟ_᏿??g_?ǟ?;m \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_1_2a8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_2a8_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b01f02208ef4ca4c78fc6566fd6e0c556e11ab30 GIT binary patch literal 5424 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 I|Eu`_01i(LZ~y=R literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_2a8_states.bin.z b/client/resources/hardnested_tables/bitflip_1_2a8_states.bin.z deleted file mode 100644 index c8a8cf4a0..000000000 --- a/client/resources/hardnested_tables/bitflip_1_2a8_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xOu3io%VkLSMd9E bJ!HHK{| us~~ןO?y}\כ7t{G{s6~W.כ{vw?~>߻oϿ^珟ϝ8_uܿ?}/~]?|כ>'{߿>kO1W}|p?~==|kymo7ogߏߎ_??6ÿ?_;~o\??G??y/^yXopaߧ{tWMkQ|Xկ|G7___5~9_/ߟkϷ;/? /7?j?4[<ֽ{okOkoG7}g?W˿?o<?cϏv?:v|j?}OG_FwƯ??j񏎿vƯikۿz=}]?3n_}4^]V?O_V_/dU{uSƯn[wo]}߻u?????_?yyOkC1xwouw Ͽ7:coooo_uھ//ko;?7QW^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>} \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_1_2c2_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_2c2_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..15195d21385b0eede73fd2ebfdf61354647a4812 GIT binary patch literal 12468 zcmY+K3s6&O+UHRO1rj1iLdYnXK#(LLAtqC3aS;wd2+-zsa$5z0Nq0!^?1wb&hX|-# z5=fvWAwghl<%9%tLoN-wwu=`C*a7XCfQjFXJM%5r*o}<s2#t8xJ-xNHmlRdhse<I> zyzldW{{P?eW=j+YQ?kVIJh49%ld+|;_k;T57w1%dS$CL+{kCmu+P1@QhhJgQxq!u# z`Z_=KUcUrW!#T2z$TIZV{epL99q#k%3krycARh+({I;Isf=u?#29V3{W3wZ;`Uo_k zIib%l$d6@?GnokNZ71S;{Nq(wx`A!dwq6;cH!3i<J4{6@@1QAUQMl4v?CikdS*Sx+ zejXcdHuo0l%S~mp?jlrSAD5Mr|NE<EKcxTRv&*bc3Adktr;vHKt7yr;BGS~22&(JD z_EFo%Bc@eNnvJ-jPs%!(fFsJo7di=EdgjhItl}ltvhj6HF!%Nks0KldKM`GJ7~8pF zr?ckz*)PDda~o#+TVk#Lx>N<fqA=Lnudx*?Qmgd2Y7hMG%eAP4v-oG#X;|5@LpWTF zr#iLnYw~5om6kf!D)bSrMr16hQMzBlZ$REdTxC@Lg8dT9Gd$PqSt-wX`dO<yuWWD! z>SjR6EGFBTLdhE?4=s@vzR59e=8Oo(3jRveUxJP$JSn-Dy(g}id4$k(iz(ospCA&N zt06<>g4J=w-U%4Aa-JMiumUzsfWLl3dxk1(i8%PgoUqz`)?zicx_$6>}L~v0yn{ zRkEm5L56N=$3hYk1uvP)Y=I1T>mZUVu?w&YB@=>lN?dcR1cTGK#}dt60b~_pR1l<4 zNN^aY)yeWq4`#cNTO9<CH_=iQCKJQYfm5=co&P-SjCv|50%4YCnTzrk&f7@RxDPYD zO~Ykt&G|_7(kk-}uC*j09f|rMh}5$?6!mK_(os6~bovGR(0uqS(j@xMg>Ay~$zi9F zp(@Bl*i0DuE|P2b04eIFvH*o7-#QqQr);{d1o9#u^}Wi0noG*T{EW#r>R;7=@qCP3 z;I2lqKezzT2KiQysJRvy3c13s8@+VHO+?0aKn)<Y><!kFc%sxb`7V@Loe|L!NlYS4 zlHTcid9S>Cg#4JTgX}j^7^Y{Fp6UM@b^dj<;gS{zg*2?|isQ^G>eF~zQV4q-tsW;Y z6y`&x(90QWzR)0up)=<r0f6n6Mxyws)$|OhoORO$gx6*-sXA6E)<KTw6cUkdb#hoA zcW#>3qi4nWkV<XxUvxayUv3dvMEzXQKv(IN6aeq>DFXDpWM*p-EBh@=(sJv`zVLA* z+b85k&NaO0<2}khbGVj;%ZFCa*Tn36w<m60Wp?~6DWZ1jb;rV<pfvt0!nS%XqB?Gk zXQbN9(0be({^P4RaLucc(@7!L66%|dmm%zzNCe#`<__ZZP7BQ$S4dWnevP|TI*x9Y zv^HjYZb^A-M$|v@rgNkm`T(dI$@ayK`je9Oj#^zvvICKC*%dsxQ(lzgPquqTZSmn_ zNoaafNcMbuvkud2a3Js+IuM}<<a^uk5QX2>3@Itu3pjY+L#c{9-`-a_gd03NqG5!5 zN6>7B?*o~q?DL^*xsW~{Ydq&{q3LwWK_C!nBvCD`qE7at9f#0@GKnKh(aA?9Ob@iu z&zH3|3lPl4-~mXcLWa+E`;*JJ&d2j@*4(^a%<qs1PAz!m!`_(L;4$i3wfloq{aoGn zn0)zrJM?kNF{xh7*siyJSQ%#>JrSx#hVEt%lh1o;`*A9D%k_#E70V)-NJiddO*`pk z_XuTL0v7>fJ=<sZn%}XpN={$!RF|q5QmF`@IjmiQZc1KFZ%3q1fKcWO)*EQ$G`kn0 z)<uR__|P5RG`-YwV-G4g4V=ODqss;Sc?{E#apXM`^(^Ci0JX3?wH82R<`stmtNBp9 zR0TZW!-RMI<2@l^70Y6j`~8$#A*PV0u=<5d%xY7Ot<XV=36QY+$;hxhdA>k&nbRzn z5N({7e5}Ra1HMxvn+!N&Uz8x?YL00XOg?YeeuLu+dLB>>eS)4whTnt)W@8<oQ&f;j zD&E&3SnJ$60C);)b?^o1(fukl004MR40R4G&wGuQ9x)X>kElqf)184jR-?@sd1DOL z&6b-kjsH2J5npW+HVB&}YPPp;wN*oz%x#>)*{|jWyt{k8kZKfY25?5u!0LhwDTKKo zd2E7!B@f{j1t7La_A;2I7Dx#Oyh1%bnD1GsL|3KCj&U6TWN>6p?YA7guU$5JEbjUp zBa!zrI-cyaN(;i|p=#izx?`objd1ZLWLK%s5*$+nts$&eO-UenE((Lg;V=NaTsj%e zBEb=>v;f<iW`-qNo%bDJpsVvvp*tQ6kpz!tEKv(&`_QK3`(S!bagZ3LytM5Vc}C>m zCvuv=%nrN9_$eaQs1Cj$qvR!;7aG^e<K$gdqk&W0D#5Q*X*<?U!a4pK!uueR_9gc! zI+SS^apxoNu<E7yWHkAMOQXNd2w{P5G!oX8?@$%%z#ZMD`LZEnl`_Mu-?<PSR)=4R z#;@UL$+r`d?VvFw*H}$14$jbwIvwPbxrE*4?(8ySTc4n75X}v%4ma?V={uBx7Q@f{ z_2Z{%`$v-lAWRZ`EINZfxQ*&U&{KlF{UmxK%QKq9EYk+jTVJ_@K4uA*9mE1|Vt5jg z%#nu+4!0v1Tis-d#^dq$&`kw+$Slbo?qBP>9h^(beo`Dh+8I7-chac~MFejrz{M&Q zQpmtyFSSZ+7`WN!6lLg_sJ{|ZveYAX_?nd4fiVn{v5w$IC?93a$@I(oh7+<zZmr*H zA4GsO>i|27V5{HiSjC{3hxBRoUF;Q!O~_2b-{CKd(MFm-n!!9p>iC)mc?y0~|09eZ zyqQ`q$(|9>n(f)sj({lgOjs4zbTEQu$Efng5vEQvH~B5gUh-@3k-vNhRGWnFP^+o+ z!=FU8AOMgU0AVAwDjmU^a=;e|ZTM&+J%wTtlG_PSBiCYfdR#vClHpRSar)ZsL(w~j z_!%aB#&W{xyfvYnr^7HIm1#VL1GhYTS({CNjdh*V9JMC|!F-2;UZF-@YHKY=V!G*q zH7&ByI;0p&N1gB<jGRt~#WAlg`yI53RYr0om^}zJM^t+O*id)8Lfv^A1E9$2cPP7x zSf?LLJ&mx#yBprWTNbArdE=pw`v#6EJH}e_GJx<=?ww47R)tlR37}RnrdgoI3!8cC z8Qa}&W7td3lQ_@P>lhL*d#;eyneE+`?WJ`RhD+bDj*+YObFb;EI)g>V7MXwpH;|=G z<H7tl&}-&o<e0$RZPXP*?(47%V4!5jG@H!TJ%pR;>&MZ;@6e5pD26T-Vz<Wa)OZDW z&y-_5ngG{`**%ERc*YOAM=){TqP(U2YWvYYMd(_Sn|OD~b5RjDb>#rxfh0`B`)N$w zu`E(jg2fRNgpH2l<m`7U5Yuvt&~JrK6S`QM+J!<p<*xu#&@w@o3UO<h2=>Pci`RVF zw(oJo&9JjAXLWiW**-!6$hgBkf{M>|I*6HNv2XB+Ep*dhP&}AD?c6#ZJc!U{d)o91 z@#o~RTqkH@#OBa*6hK})R;nK`b(zMI*%E^nwBTAwd90KG1+g(ljJ9j02T7WgToygw zf+G)?$0M*R{Qy%TM(f0AgFvNfZW&9oh|<_s4JnkTu{*8?I!K@KXLjp7^OR=69snRL z;C+E+WyrPx(0<<9%Mot7#ym-BIfdXlH4A|V?y;@oIjhY5SS@stl07}hl>KI;o+b?a z#9Al{2|qHYBITb32*c&uhVlzcNdSj|*xkZ=XZm!SUxpxzLWO#w49L%^u|;z)2M8C< z(%c9IKok>O9NZK^!c=>niaaCXF{3cBhchTO(_)0VAP@<bPWPf4vyzBK%+eL@TugX0 znOg&pNOq1DYLx(ZtCBxy?&S9FToX1p9lqG6Uc8YZM6;K>bW|XGJpUx1CJCU%h9MGX zl^2Gk_WSrkQ#4dCn=r(R$}gRRWDaH^YdFv_&0|kCOlPcuM`eS|M2;0bn(b3G+jWKl zbk2gaV>qu&z)8v*)3T?cLh{=22DpM6B<E7H<V6I-8cUj=d(LUeWp?-^nxo32GT8AV z;eE@oDnv$20f2;Gaqdy06x0<z#u?Uiqy;-I`@#mX<ljMTv(%hr$Ce3<<Vn^%S*ArC z?y`U~Fc*h|{Tc*WSf2S@NVP>{_jviR1~L%TX_1^eMxAyVaDCHV5n__w)(TpsDxE~d zp65V{5_>TJW5q}6TUN<kUA5M&IL%6f9i6ojeRh^&tw2LBv@e({^;Soilrm4TDsf?! zbUfv+0^K29^Dz}ucba$%P3sJ3@S&dqaO0zvK0!4klPPmJ6%z1my<t40Vyc)Ob0DN- zT4jkim9^9t;?4BRj#-Ll8Tqvr-ojn<NaG^+4Ulj~pB~szcFp`9=o3+^ZHvam>S)gK z?K@W^H`EJ>nck}868{(Bw<9{2YjjF1oFeQv71plAI(!K|JIlUKSallUe-xve2ARru z1P)+drzbaOAKGbb&gmg72_j^UN6_4EW<x(|pADEnwE|vFa^7esUl0<w_YC)vC4FwJ zd3gYVGk9&8B;hM#ZEyxU(v;l7-PE#uBDz{{wQQybJGJ~S^<u?if%#ZwmYP$%r6l%U zXf$3)*@$5sy%TD>oi}mrbTEx$=N(Q7d+(VuR%xyE+dJ0DR~A%|3R=Zr>8<u*X~Xmo z9*!8{>niJM*pU;KD0ufEe{sTmiMfoWp3YeTeWg@ba~~IwWR^8l#beuPPD$UJWy&&+ z$0{wIR1OOe*bLy&0BXx(F<2cPRs-1!^6I#sCDbHTGpCE^>)Jy&CHiD#{)$aNn2a0` zlUZtgrDM$-hRH_m&=Xdg{(>*GHG>qfjx$G_ulVEb<ARvKa4XO)!>5o)rV`5l?W0(R zz&<&TY1B!fMqg0+UjJF%N8&-IGCIPDE{}|$lM`tHR;NWAJeIA5GXEKT!-+3zPw2+m zVM}4rZD$?*6@gded5KmLSrS}^HYJi27W*!AY_@f7luZZFa{eem#sJvUPS~Zu8UdMU z{9M?i(6u=dW`~!CBg`44T&J}i0Jy3SFVq3|;C%9E6oBt=%UPpX2rAFg5B%>yHtZGf z9e4|p;L4|Kft<nce?13EO-aa*>?zi0;*Jpt38cYSEb<t98zL~UFQ|bRC+7D9B!6^J zIf6XA0NW*I3sh(0d0sM4##KDsw?m>L_uK6^Fi;g6RC6TIl&*~BZD*HV)6s#xJs{6M z>QCMmE(R%~rZH_Gq#~A+=Zavv&i0IH@o-RX87H_UsywBdy?~{b2gxL+ae)R)tSH-0 zRLBHYC02zbtjHwIus2jA3}f`vL@oYUs`8qB6$c<emE8qO?ZZ>^k=wVkQn9-+fk6u` zRgT8(ER6Y-0OugM#}TcQ-c%gVU;i~|EOmfoNdR;*GO)qP;5!X7$846}I9?-*S~{s| zLts;Pb1UTN$#Vj@z)uAt0X)?3UFaUTG@axdI29a@ttT;2%u@m+*l0f13EF)pj|7Gq z7JU^sUZ7!eiMZm}#>1NmSzav?$PrOJN=jhI4694045ooLX0kFaq26!?Qel7V<&XuG zqxJ2~V$>rQE-HL1c?ro>z~+epl?^ntv!n%FMwZPjrQp4EM)qlrWan!ut#1wk+H*l$ z(T=jg2r0=HMbeBFkY@|6j4TZt!L@q@dMO6rNV4=rIqp)!hQGH1&f%1B`)K|Vd?+}_ z<730TSJ9Q=M#oTJe}ey#fcp)35@9?U{6v)RrE84SA_kHyP_cwR0O7+PZ)doYBabCA zawcPm;(~~7_`XeJ5#Ge#5$w~0u(#qQg>YlyC_gdHG+a&!g}sodGVs)mY!@++HD3@W zg?>x4HVKdg$qwdBKuv?N;G!X`BYapPfiZ~=wk$0p07n4i4do04vPb(rb@w?tNzT8^ zSH5eA{f}vPJ{`CN`0ZUJG;Gb@8XtdW>kI6aTYX#kegRt!`=Oa({BxjRKtSFW!ntrT zI6Q%1I_$?z2-pG=n*HosS$#y18Q}+I?e*JX*xDTA=jRu&EjtS#O`&6Bce<yfZSnDq z+sdM_g(*$bp3*iTHb_P7?nQ*P$fVSw{Jgw{qHR-u<n*P%^r&NwH+BAebO$nXRrhZ0 ztfo;jLV5{WGOMJ^X;`T$=0yhj=w^B(pYzy!(MIq_hMzaV4UR-h0)RD?*|NSnqqXGx zFD&6Z=$R4r!FFLp*Uoezjw#IrX35^eFg$v%ztwt->Vnf0LW{^yBT}oVUg{elRE3pp zq+dul%X#sC;L+dyA9(aD`xD!xim7m^J#Sl&{cm_QWj{$FxJZ!zWZ7joM1%me>|Cuk z_62_-7PMe(`o=d?E5||hhv^<vW#=QN{+lqE9Z9ToU8SKap<vNIN0@*#Ekb=%c)^^C zbs3p+jH>T8y26LOY0Vz5u$5IY&pp)PRX3XUoA_RpAGr8JYLykUjIOOiA5EVCJ_BKP zA%VOx>S?a&*deZnX2xkIO<f=bL6wIDB15vwu#b|$n1(RjtMQa$nj7)DQui>dZ>CX7 zAhR5UEhh<>jd|l}sy5q8bs?E&eL49rbhYX+3IG4+Mw+W@|CbwWGQw|qHt3nvQr8;* zcoqFUv_XA^YTQ(>anCT_)+gKv%>}~6mI*kuvX^wV5yHP|Ev&N<qRhOpEHUg@1xy1Y zyW}o=E@0D|{v?9xcm~E@k<~*Vq%i2|-Z0!y8#2#%HqwKKss!hY@2c@G&T(cXF5)I4 z{cCk7tY&}@4Syq-y75h@X(D>LCo)*VY|_39la>6Pb-mJ9%l4t*ta%*O2)xMb-pur0 z=+r5s9x3q{ZNKRTwyKkvsLdOppo}m!GP`eR)?;*2zhNUjb80^VhXlC$qpcM$O5ZXq z<kwhQ=cD~tc_{G|y2*J65tZL6F<Z{2)^bmynw-B;BMT^;i%HNf7;2ErQu|yK5Dv=` z<e8fe;r5W2cHUOadvBL1`Ff|-sp^<Lo>$C@?1*?}y*T0jH>j0bv-c*d;@xiZx~f?? zE#}t|HX*|yO)+80LD)ECn$Q%-JuPI(^G<Wp<|=uA!!e&mj)^1lZb2K+Qw+3<!z##g zMmYk~Cn3-Uagv-{eV4htIt{&mywJ<L&#HR@Y?>9;cH%CUT;#|}0*QTCPDc`p>OzAm zZh26%D33nS;m^0}l*V{Ck{M~Rvbehpvm^^u<=9cyhSxB*Sm*@_Wt#Z{f_sEQ@WE}O zs^bzPoVxuwnd80=N;yVE!)PMYNcJqK*i<8ojLh*ctE3!`;wwZlIt_>I43=o-3RQ65 zq$ko7Q!petc{JBnXp#nK7&}U*C0HX}%fjJU3q9~>otN+8GcB=sg<60hXjcE?_t6SM z>Yrk^{}YkflotKi_BPtCevK|hWS)F>ntb80mT!JdU8(Raxwza-*yOp`p0&u(=+NC- zxWJoBf<#7@p$9{(*22x4&Op6JOAJ@!{zw-6@L<FkEeVe27!`Yl#}@3o{VW5C_+Px} zneipyStH0qFrzRpH4Osz<<3y%<m40d;>p~EIXK)<RfaotC>R&Li8%qOe+k{4?m}eB zibJ6{dRa-Iiw*NknW%Gaw-&}l67@>GP6<bZM!qAbCz5+1{Gy%Nm=EJ3yFmejABiX@ zFW?ZS;j+Sj`e{|e`Df^QdZZ<fUa*%o$mR9*Ed+0-9Dc((M5yf>ipX?tXj@BmI<k%R zQukPD#L)0YW`t0)Z<$&zW8@3MhieIolaq~skOgHeN6<~T*iy<u{+saYge$U=z1~A8 z5M@e?V%_2<pZD#pYM8Ku%&;b`Lp#Ry1RB(=!q#GPJ20oR?ze6I7@MaBTm5%P2K~yx zAk7%4;U$ooqrj*TVo}7fsdw)nD=>V7B$E(fShVsREUF-{RJd=n(5~61aJ>A_`fe$c zO+rqAwSLE#b|sU3Fn<+CD#utWD(aV(Q!`W~;->@{6cR;@5ajk@ucn6JC044MRS5V| z!4$+jjtq9fE+8Zjz(2`en(SMROsG^@D`EGeCR|ryV6W<d7my<+e8|3PXFk?=(@m>k z&q0d>v?g-Q`1&AZaK`#IgYvuVTYHNRkMH86=E*boLmY81#fP?_fEHM05`N7piMR^o zS~7eAQ|fGQB1xwGJK+i><xS&XIy5bB^gZl)eHZcQ60mrhy>7m6-TV^2Nj#l1G=pTn z(EbY8quH<6i}u_3yiK-y9Bn<#zRVXcQcD*uar)GI8LR?b5h=|kw3fpZdySvbbPak5 zu-{L<4-mpTF$zNpA@m1=lpL7ZBN1Q{i?J(Wp`8RXC#yJT>ZoDIm1Xo<i<nTx;}ARx z77SlM+@z2iFnKnZOanlUQwMiGehOcD<Q4nYXnQu(S4_eYTP2_Xhb=22%*U(vRFB66 zcM2F3iCSP|iq!&S%S+V12g|e6FvHcj!gI}bX}pm_nAy1!fQlp5*d1>@#`Iu)jn$v* z#aIYlP-F{Qg=aJJY@XrB`CVD=5!QD>&BvJ`aKvXR0(ElEv<O{MaVn^e{h_I_;Z`UP zXQX3gHY2$l*ye;fn6rYGO4v^ifX#)VoqvoJ@u4s0-GaI9!e10MrrXy)`KzDD{3YFl zW$fDNxf!}UTE#2_8#y%C11m(O?rXZ^5z5H0v-sy&>IU2iQY$ICW2qIVSr^TjGLvvQ zd?=_G@M>ZG8HQUO!7G3_#%~?wAYc+$ov;ir->aAFT+b?&R?_Dsrdxqb11)(wrzA{K z6SLh~nOw1v0*Zlk?Q?aXEANKJJ-nja!-UNM>QOYXoaw)w8H?JMdHubYf!<_!mKGK4 zbxy0mK8->vRAkwq(B?^lpxG-7h4BsAUO)st?0{!eu*HN8n4C3SX)6xC0zIpPiLpzi z*2Sw~=wvC>hD%#%NqIdOAiPYVQhPdEj+1=b<Gv#r1g3G=5gJ<~|5CSbHN3v#efAT= zYnHc@BQmZWisUnp_`cW7>7l0LMw8H8%e<43Gl*)s#uCx#sm4~3(K^UpoCDvgTSgPL z@LMBT?$JKa2u3fDH{H-2CFZ}(GnW%zuqN2KSq&GblJewa7kdOY1BuXLRU!l3ocJ3f z>N_45@{Hc9&^|I$nv?fhAZCUwK3nkGTE<<CY!dZNw2WEhz{j8hGq)x`bDL$A`4Ref zw?XXZZF3L?{pQG^k%Wi}c{_LXAK4N=d7exoCi5a>!Sk#!dZISLncvjA#neWgbJ{eF zEUOMegfS$80#*-KjJC>%En`rth&&QL?MxWVmf#4}&hT*{+l%cd;d0=>BNvk($R5Rl zsactTSOyDTDGb4wFpg_6uOl??P2;TnZFDAFiVH~yQxyO%48jO^$Fhp4uvwXn;r%2k z>pJly#d^(Ji6xIv$Ven{e}};EO;&-5uzXD89;LvTkf}0VPZ)ZpSt!(kVK4D^^Tif; zq1ddK+~Z*~S|=WIGc(_6-_PfwC1e^@l%pR8z-?#v!lvScm>H&&!WZz{(Xy`a!Gr}T zr^%@YJK%9af@c)l$;`DnnH>uz35>*Xu$RC!jgaA5HYM-egq9*McX%xf7A-+0V8fY{ ztdPe|i@8JovxsQxHH`=!x9smb!WHEkFbNC$vadOsQUsvKac9>fcv{I|*08`;XvHu= zM6UwOBm}7lZ$GaeJS;Cv7<0rD=3*+rqXt1=x6vGAp9u+wiW?^+s)&VgIE{}Z#lZ7d zm^gFkDl5Dln#TIdvt*+1WI`gyq6bKWAQ^SRmXV*qfk7gY;4bHMzz^7LX+&VDWkn(U zffi-%YyBm|3r*yMZTp(+43_TW^wsxS5}l~@{BM+q3_`I444NUaaTNjfEb1ie&fq6t zj}kPDIY2973uOO|649{I7Ugg(*;m$nn5qhwN4UjXeIPv0oTuRJSiVdgX|<8hD$eHB z^Dl0&Cz_Y(L)(N+S0l=<HDo;5ePr(-N^yIesC0=ng5eZfuK{>Fg|P8^@{ut{{wcKi zATp5u0zV(ZmGI!$=T(Qoxf5E5cEjy&r&}RQ-z(%^#Y0j^iL;0?VKO+n<IQwBb2VmB zcAPt;DT=tI{(xe|0F%#2b?mtq^bxDlC_9+%J%p7$P9|LJScf4IVBbUd_~QMP>wPHm zSv^_vKJLnPUkF|WgqI^!II@fuZQaEQOnCe?sFye$@a85eDI_|brqaPP@`|v9h&Cu+ z8QG%L%tb#9?RcDM%jF*BtM$=OQ5;gbkwI+6@xYGgwaA=e&pgj9lD3Qlon1q{ht^HE za*A7SPF-}15p=p*!zp-HqjzeVNvJzZUO`yJ2h|?t>8-caZ+55Ylt&hZjKr1mGcl~8 zov3h~p`FOsVxp`W6|B`r{OjoLO|}mnx71q0RH@9}3aL&eJl~jo2QGnVJUn2lFv25L z!g6uMH-vSSO5Jpfy=0YIo!Y5FE&t;1>)qKC;kTttLmi&6Bm^yy)`_6LPA9nBFw(0| zBfN$5UF`SfOV%2Gn(kzzyW|AHD_qe&*4L21mQh_T36ni!l}U`5JBM8fXS<Ed{Q8y3 z{O6pb{`|)IeIqb0jQOecAecn(EK|z_zoj@8jN~hs)~ZCRYd+%U-tGG2Ps~FJGsWn= zkp7$CQK$$WcO^{WcFdDxO;dvcHayxbAR)sOqawx=GQH+c6>}k+*svtRT+Ra1#%V1y zmG2_QHwg9$5LUa7>{bRZG<j1HDyAH^CC%{sN@dScMj=#?Ov@gJf7vj6#}-hdvnpip zI1Tog=E*)#83m&w1`=kt7KC;OjqhT~3po~e=`{4;>a1gUp(q<}8-~k!?Js27K&Gyo zFc`8eQ8R7tg>B6ayL*i59?NzR0?Ig29x2!}v)7xS#9jbZY>#_1iO~Ftc=Wdfq;s_% z+UhCawhA88=H196yR3s*9>P3p2G=ojEY7$6@FDUg$6lK0RGb$rg%1uWWK^%fCWwQj zB?_SpQ(~o%LJNB{yb+0a%VFA!PYU4+a0yB{BWbNptkKLsvOV7Y$dJ4-z6<XPmf&`4 zv!{fi*otL39GHLmfqQ*w#VQ4Y++!(}7VuOkw$ezWz-uDG0QrY@tAT9Kig6NZf^9Yc zFF3$5s%$W1K8PV!c&;nqpgK<h5QlbitLUs1S@866?lt&3Dsfn&yJATvH8>jK+R1jG z#Ngn+cLCPpAqeVYA>vRZ;t=c<o7JuR%rpxI(iAbJm?&hJLTZJ@G@;B=z#a(_1I+L< z5Lt8kQU+dy(|A=X01cW1Ml4vJX++SeEcfkhII1CVrtdI18FvI@=r*>(GliT%pl?RX zeUaeHT4R?1oI)J26qez^!0=(FbuimqRu~l$;UEdZ$_fe7Xmbw%wgwgiR~`?Y=Xp?h z&1HhV-UJ+(b4LwU8oa88gQS_`=$gJEFc$QCZC~JN#_-L@SgCaG3KgWZjM1a`PAs}E z0ajLIxICUy#1V%ullVphEfGF{z{RRyR^AFkC=D~>oL*k|P{Ka_fMz5rhk@>ZXW(|j z(xO{xFW`u{)1uO8m;<5V10_0HYWNzGBce{Wil}z404Cp)jU0HADH~vl0C;>nazr!M zY>Rn66Cmp;`eMC0pl!?f*q^q)xx5v-W&4(ho#8vfQhx6jd9Lz(T>#8;$mh`f0Io5M z9I%DS?(^G13`nr+brCFUP{20gw)5a&eaGEhyRsTm5N+|;sWJsM7q4q_VGD}_cTCf$ z-6w)t`zEof++Ewe2L8;B`ToOxeq2`e;g;Np8kvfb`RvNmvvaA^`ny9L|ALC@x$^w= z#kVz;`&x!Zy9$~Sg*MGSMBN2T#_qRAzkSsI0aZRU-f~h9w^;<*PfQww7U21n{QLJ$ zM0I`fpyy8q5U&rk-G6(gI`fY|e&2TQ(uo+~k5|;hrzIy|)VV$(eyT_O{9xr9VJHQ0 z&32G}zyIr$&yEfHBMG<no@GFTf-cUR{l_%*gzq0+IF(YhKa@(lnEf=OHkY3k#Zv2M zfjd)cO+OK7U&SldPpVr#E7R(yer=uWBtqbiccmB4{bc`S`P7D$f3BQquO{t&%rJD} z+&*!y_e+Vq6L|nhpHYeF4+j|oV-FAvRpEW|JuxG`zewDpeq+!+IpTUWgDA}9#j~e+ z&~FP~qgQJ16+fHaQ!jr%koncY_l5QU{FkExXEHL6ybz9i_uJPZTh^*iv>m)SeRQ&t z_qwS5a|7M$DoWh-nrOOmBmG?Iht-JspO-&=v2<a1<0@+Vv+u8(&$M%X`TCk-Wp%3N zi~qX&N1AUnb?l3@vyn$GRNiaVGBYi-kI<h`#?rU)i!s=DnVtXr*~T@|pTw-6E~Wk{ zv7M&)v$1UEDhl=Apv6D;UPRx25VilNV<_>BI0iBE{44s6RK*ubW%Fj#a;;E3J=6BR zT{yYE&z>w9L`J13zuhC57LBmV=`HW(o8E`?3k2T~e+_vO{4QYg$X~j@^(7bo*=1Rr zyHynFeU-F7cGmvjLF4r4LuKW{g^a8FZp^Np>8-4b;l8A9oS@PMlak`;0LNShtSIJf zgY>tYj}d1L-dIl531q%rBFJsEeXbO1BPI=lRE@V+X>dQtALx~qo67C?vC83@a%}-9 zD<5d5jh>v`FUM$J@tOB5(i8?IQGy%mF2sry;{GtRbKsAH6AZd@u<-MC+F$>WSlERt zLgu)*<DKGy0#Xmnb1!Gq$%GV=6aGbS@$bDSGJgL4`4`WsHw)G`P|q$zy}LO<{umNa z`^E0>4>qS?m)}o${Bzn@UGknI)3e>q(duCr*7ae&xjsnTtjX=iok;175-0W(K0Wv` zsx#`|qdL^lgt33qocxN}cDktY=QPLnp#4FVbincSBlgpOfAM4Hk%Q0fe>l3Qr1HV~ z!;Dvy#Nyp!H=bUYdXJ&q6VZAqCOW;n)2~zTecnAdr*n*<P540492plr?_6!n&2`$U zjPiZ|g;*O&c-=p9_FpZtYq?;_S6v7F*J|q2`nq50o*Lxhwf$clNNN35%&=!*)b=aY zRixKPwZdf9+d|h;vYNP?yslr5Ca;StXZQ2`C*{k-m+VIur^IHbmO+WjjgrJS$jT)2 z-ZrulNEk%)7jgD2e)@v)b?Vm#FS14+ItoA2u9q<9kJS}K-g|y1-6=>s_~)4?U;Q*s zd4ugym4A8k+pwB$HKp+3nD1^%*I=Ohc;ekO%fHc|R#hpURQOyyjDg-0g}9@$M_JXl zn}3S^yV7TH<z4;Nk@b<HIu$uZD=M_S5wsjrwWQ}pUgbGvP*BOPUl3QWALl;pjLm<} zfB)zLy8ch+-go-{8gKq^L9Kh-`A`1KjF-jeI$YYtzg12QDIX8bU9pv`hPJ-QcsPC) z$$C7NKkcn99>o6KaSQUjl-&Bq=8?@@8hl1^+&)rp;6M~2sfhZZkk*5{aD)A6G3G-` zVPeBw@&FfWIl+kMx23en%8EoTzP!X!GT^ixTbIyB4@B9tr1pZ8w!04h9(pJJ^MRC@ zBmX36zWp(<%`J}b(QzX@X#0KAOY#S+<s~}VMr`ZCmkI2^Gt`8);qhg1Z>4*Atcv)6 zS44@AjJN;e8fPPuFFEpkid{a|%_H_LczG84BE7Xe7fYHmoHaln(UD7UPk7G?H@|vy z+wxphHhb~E9^3RO?u+h$U0;TVYWMM8-|YP}=PTZ&)UUodz1{wS9aCdpOH1cj%AKxw z+=D{;!qZCXmjkko$^Y#|{qCO~f0<l=P;hj2Mq*8E&A~J2jHKj=_b7pEY2c(oRhOQ5 zMD2R^?$)#Q<kfeo3sWa9OLncMNERkaXB`(m8>6rMj1;uzQa;%3|Dd>++l#D>CcQaR zm+{Z<?pF^S+^pk2z?3}*7;uWdEa6vulbU*c97i9XG}R~1e3tw}-PNEMQiaR+z@q9Z z*`=O-Sy6lIGs_Fci%P~|1)MByOum_rlxvaF0b6+|j~7a=?%!nNu1-&Y<z*T11z-<N zI&kq~p({4*aZS$BuC;RP<)u?Wi*231+O6;S?hMW9*GKd1M}wNnZvT6~=Bnvkb4|(S z?Uy<keOx9hvpena^7^X!vQf&GCP~h`Jqm26d%W(sG5Y9(Tm%5m^arJ7PUY}mq9973 zQ=K<_xeFQC)h%s|Mc`%z%gYPtE(G;UiR?k(1gm=ZUE8j2^B;sJDk{DZjJXdD;s)X# za?9>K6@qiiKLVisbI6Cdy6vldpW&pc-p}{2&t_?h2yeSc$w)yt`6k770&~C|`62na zHkL45l$Gc}3(eJ+`M2BXRJlYnlE{!Y`uQA%UA-d;iKC!U|1G0?q?Zz;x_(*sT{Wvl z(%RsQcf_Zd?rRHx?{$|Qy2hfa?L3ZN;jK930>3%ZTI~ECcn0up2%8+<xo^Xi%J#x` z+Q8t6$R%!Vdq^(-09QekB;4aFEd9Z=Wp^<Gvv*SB)M><l-S)J2JqCZiyvu!sxPBm4 z<}=?FiyVxe?ok&~I3=1e2uY&tZ|!Gq;0i<l_+>%Zd3&N@jIR`!6Ccv<VSS=`<$VY1 zE~%&6*VD-m9LPmO244{_o>KHB`EDC8@peQ|{f!UCSNR{kr_)jvCqBbg#yn0viQT+4 z+q>-SPCp`Wwx>tjeAwSlaTKKqgS1h~A>Or=p4rWd#$xRK8uIETxpPD%PLzL6|1x&| zL(i#_kl3dmi!B>#&o9_vy_2MPpZ+jW%v$?#?nY(hS>8VnygPKJuJ0ZH_1hw`1A~2t zNm(_Tl{c;_|KkHh8-p>J_)Yoq@TF{Dj%<Cn{7ivm_PqRP{^{iMnw*;M;S;i(ovpu= zr~Oej8}qSb{nqxWnxnGX-v2Uknuv1w#Ih65e$MT@GElLue(>(QW$D|xd%sZBt82oR z(&-sx^2+G7{TV~i0q^dA39ddY{|^iY_#<t$I4X_Nb)53q0mtO2G|9i|X1@9zGHsyu z!oS|@SdVd*;L86fcKqR2@4u%_Osr+7`V0Qa(`*P0%WpD~)c03sj^>N0SAu9m4$0L= zf6%`3EtcGPnr=xO7TV98_`_NHaj@)92Pjd41Aq7?{`i4^$xA;x6#MZWq&9-&nVGV9 zS+{Z&7qVlr2ZJr*x_cKG+)q=t=NsmdcEyKTXoUm)`8p*c@4imOppd&~+XZd+5=T12 z3s2z0Nr@+LNl3i4cTiN=lS}WhW9QpW#A3UBi38;W*z#_<WJGcRQ>2hqXZ@HzNWUYu zBneF7&qcYSUS+VS*;16-GTt({L$3U`04KNYS|dGOsVw;BGxI(6^=mz;<Zo5`Ba}%| zqEpy|!k~wgFdrkZV%GU3C3m3vzFdoYDCsJo;EHz3?t29iM|skA@gasvfRoHV>|qr8 z?iZeDPx<PPH%31H;g7%nlJj@p{eRGxgu?%num1c&k>t?oPd$?l>5^H;)qSF<W|{9n z=!5Y;jDGu{s*Wp8wJ07x{XE6-**E|BKY(B1?uu4^2z~f(`wH)`{PN)2_TT?;vZho( z9UYb2we&tfmdl{dz2!<<y1glr{F>n$%ypK@#f3vL)1Rl{&Qg$HO7_rXQM4Y~w+@b@ zYq&UY`?Op#Fpirw${Ta$I|WG!_;5(~Sa)t>k*G|nRJt#Byxci!D02{Y+yBvOY}DG9 z-&)^-tucs;SbEh}`n7Jr(kuJCe|0dbZ6Jy7p10m9FK_Ng_s7kin>XJ@%k8zs+I#V| zcmabUKa!^WA-6rZ@L^k&Kp>G%otEH!P&{mN-izuLi)LDF?a_{V#0wwyFKa3wJnDD1 GUjI)zux=Cp literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_2c2_states.bin.z b/client/resources/hardnested_tables/bitflip_1_2c2_states.bin.z deleted file mode 100644 index a4cc5d58c54c0b63b9a7a73ca28792535b688a30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77058 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 diff --git a/client/resources/hardnested_tables/bitflip_1_2c6_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_2c6_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..18a6d49871207a91671b9bbecd09e0a98f45fb6b GIT binary patch literal 2268 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 G%zpu4Rqjmy literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_2c6_states.bin.z b/client/resources/hardnested_tables/bitflip_1_2c6_states.bin.z deleted file mode 100644 index f7bb63eb7878e931d723a7a353d2af818d2cc96b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44320 zcmeHweN<HC+V`pKXjx$&$}!W)JVs_Vl_@F6&Nzx`hTo_tb4&{pJ#&;05tuu*q9mQn z56TaAhKPtTDj+EzJ2e~?W&8j}K-tFE00V4ihM7J4>%QK5@O0kyeb(Dr&$FKXc;EHz zHGi-dvlnacd*9b}{jT5j<F_}|bsbo=cXUu{p5<ChaP&I~-=F_7^~{&k_1gGH-+g}5 zM0;lXQhR*e^?t+qZ1%%801kqn?Jeq(D7+#^iKV=|fvevb++Yb$)++XKnnI+%itHN- ztyu<JIa4RlaY|7-%n|r>Sd15$G<mQA&vQ~8t_kh#T+itYSJ_XZye$gpl9jdli=YA$ z;m%+wDIE;{j~2-a6C_-Lde=!lb$ft|YZ5!XA?DbY_~v*GQ{)Ke4eeZL$QN9IBVuoX zMe66$?9d*#X1lO6jjfUfU0Svv-Q{BIE=jxKQypa%T#1<1SKFFIW$mCOl%8gx7@7k| z?XRMde`J(9xr5)z&7jf#?Uslu#-(5?#U@dTRidrNR9xiXjvqr`QJF6N9drxK-7vI= zUAw-Dxq(NPn)a0Rpj<h^1w1>SvB2e!EV;kJXLayV)+`n(cd$k%z!8`?@mKD^#e3Xq z`z_Y1;l&%StVF_h!MHhj*tf+YyUaOBtyYM+`b$fojNR-EoZJ`?XV(p5-iN9@<cAlz zP47b{$LD1<JIJ4P?4PKlZKM+5%;otqm)pa{%g3jICQv+{QW27Jc*PaGtIVi`yxA3Q zvTK_jQ8wAVyF6fy?s5(7<eQG!VE8wy@Q7e)L@0Sw^-3r+dL4ja5RX=%aS{%{<4ihO zM8DLmEeVm6H!%Il4c_#^UU&Y-*b=9k$pzjRJ5CIWgOY87SXW6SOoW#hkOa+QIO#F8 zE9{G$8{7VZj?}PbfLDPH0rmtoU!r%TJ@%!YjNd~eKSE_?;q_X*t@faThduCaI<nTX zjoy(`?RlK<v^1iJJ@G5>d<Q+h3ufUTJ<JO@euwQHNw*a)Idysn9Wr-{;k{3o>}`~B z`t-6Av=Lq^Eqe*yPDQiwU0>8Vp8sg@=7~FApfcicSi3U(;>?B_En}}}$6TeBCd)hI zrXStZ5SZA;H0_UsZI!U)2fYVPXXxChcl7wjk@sMDzq+{)dd=yeAC%d>P5S4cy`0(V zpi|ATWY~w_p?)vmaGCZ}60Gw)-6wfBqqRkcy?eko##R(-_>((hT~f+8!}3yiz1C|! z1~>SaT<BoYcqJkpL_za1+=a8S1^R;i%Lv~O-4%2XDlL2?<%Vpa*5f0<IyQE|TnHTH zR|VSC5xENirXp}*xJ-fYJP*PzS+`4{>f-$p+qzs9OIEVe<?`TiYhRi?amTnc$0*4^ zI9<~i_L)t`X`GfC-Q>Fz{_O*YF}ZdYC&(dKd1P8KP)O4WMbDxlhU!qtIfU?z+o0#% z;Vff_XDWY!;$P4!l5revTnI7K<V!J-SAxTy|5#zC#zM>75Ur<0;!Q|rZy9caOR=jJ zP?QOEv+y=g(OZT~h9_#`yulwU`-JFf=3AU7hCPDXv*CuD>uv)1j!n^7j8fQOC7_fp zKo2|pE3H$~OWf!stHr(eW%xKTghB5#Q=UnPKA^b^J0P9!3x1Q^P`?gsr*A1U8@ans z-%7tS3+9Ncw}ppQYR`$OdtGVY+VkE1K|Rc#^nV5SB#7yf=@?vNo3QsVq>O=z3)EcY zPZJDt#zT!f)(IC{A?_M7*Up9oRq?}?LeX@bBZLD}DuG~2Jh0PNQFLJl-%7WL^H?d3 zge{YeN@Kuv#;rB#vd}6k(-)435n13AkRY4+-{Lje0*QCDm|q~WVR*Eg@{%Xs3_Bql zQvx~Q(!dDJY0%TaErh0K%Vny<{i=s9M9CY{ht_dNu`TZYQhJWVF*)C>+oTNr9?h4d z=S$Qs=7?hY5|%cfzJ}8p(Mj1_4+8{U6=ab=UbftcE<wr<?;Z(-7)}bEl`rc)SKgWr zVndU$S>vAzwO;FF7;3vM>OaAnKFRseq?86yKf?&{!hp|07EWf~zSiT=+=EkIKQEjn z*A8Cc8Q%@u1rzfS&{b)7;k@MA$n4Ab9ZbGI>6%VXcYI2I<%cygkh53vF5Q!w<smSp z9md|3=N{E83xPGaq3;XWZ}I@gze9=~odYwZ_=0e&ZRQGTN{lt$$qTrtqABZOd5f;w z_-d_DqqJmlBNX!thbzyi9|}UuQuqj8JqT~O((DwBeFs_^sP9ZQA}WySL@PA>D(iw8 z>g02EHqA~4J2A>657mbZO*KK3ICC^KxO5eiNrdxmjfL)zv)#5@=h+zR{M_`AiCk)q zg>7^5)z;#>RE#6$E>y<8A?uozd5*)MJD6;K%(v%{1>0;);m)+H%%6as;P+7PU6Xa# z=ILFf)Q~N}z~eH?aYf&Qu14y9{QGqmJ&kpjp{56pbyMHBv4cHO)uWBjp~2y0x)qxg z-Az<=-r&zz+}gM{II|8c$F<P~5Iq$y5t+r_EC-CUN8glbd)eLw{h{bpJ@FklVaS*= zTS7U+;n@b@UDQ-JjK7@7V>U`Q16vP87KlFvYn{<8bjwD6$x_FJ1Y4fyik}aziBjZq z%nB;;7FvK8$)=z2_AAWGIRB`kxvZ<g5x>Bz&Lt~hhJ%`o&-#V#UVF2~t^3FX!@D%1 zeMk*jri|Z5Zg)VRk6mMBC)L`C9$)hcm+3scQF+wv9U+*f*wJ|Gi>?Vpc*p_hJDKf- zT?Q($^s@$e%8a`ZI-np6r~J^;L{&jiIXVJV5hh#sGaNv&Et)I9w~A)-DG!hA;)opA zi57W%rQZ*RdE2?;7xc$?>ct`Ojhnm0+zEqf23CuvZtQkZ^YHyt>xbC^razMh!+b~f z?E#uAN4^A$I_25GG`W4jqMtMD2<QfdEk1#nYb2Ar;?8<TiughqYf}94l@aCk&vEJ; zm=On?BPesYJZ%}UqhYl&un%s6-#+>d$Oq`6&0G^pe_9}ci$9A|jw4=@G8%L;=53lw z3V5QRN3qBA_OB&ohHO3w3!Ajt-OLxi&?O%3vK{sLwg%R`$?HN|Tp#Gl5QuzX)G((= z2b*hvW$BE^TiBH-wJELB_V=YJmYp@s_h^AKx}C{FyY8i>i`u2o9fB=vas#;KpU|%B z=!P_fH-#r8q%r?2d)3*T3!$eCdDb~Xc)d$do_+yNaDvn+{|SsTUqW(Izjq*X7Fy<u zUhP0c;(9!+*d(Uih>l5`xX$oojjn1xvug>R%iKB$g*|f9CrM==7&--Aj188!ib5>c z-&Cm8f^IzizN7C&$Ig>NQ7gRz0>^`C3l6H>E*AY*=4um}`A*$cBtq96uu!ahf3U7> zT*FU+@QO7{Y+#zlGI*w9Un<eoT$CVBROS}rNnTPw2>7u;g^emRQVKTOs@kbU%-RhO zrsxKQICa^*wKV`}89Ct+1OQ@WB*Rq&Nis5vngHMK&Wk?*#}xZ{SLZcDgqt$uGv$sM zp8OPrghe?#+R0s%a~i3fIyfj#=|WRv?gh)|9_AU?*}^p7l#B2qCZ+lkKXfO|z*L`^ z?+g`niL7Sx-WGVd)0{0@`C;g<@Y71ga)Eh5<leH?pbQs0-?mTDa9pYI0M-a3#XaA1 z_EGWS&4-Qfsc*mk43=DS?Pg2X&%NLPDMP(*sH_iY8Z<IVCJP+?PV#-)fr!mew5>1s zRc~@3XNMNku+{q)m!N+a=m%`{9Hk#QZo-r=uWtU51eOCe!Y}X@Ir3qE&q(#06|8@u zUc0!sY$s#kHM(Kc<6~Zhb?B2z2DweEP1dwiQCsQw-N^2>=<H&kOaFwD_C2!%1o}x) z%j2_2g*A}T0=J7X|AY<d95t=}H6ifb*HGiw*urgawJ%Ik_#67g_ZxtOYPjD4*urxu z%O1a|;=EPvp6dy^CCPZIi7}NmJPeCcbq_&&`p#eB1ukoA;FzyrW~qM1b04)#pdj}^ z$!h$t7p^4y<^Elt1${y9D(QL#%b@7*LgWEz3+Vmff!^ec{>dD;2Xk=IVTg`{OMipP z<B)Y2ofgH44Nm2S{++NFXAJWcdz14}b|_ePOX!Q_2^k7C)@i!|)#s>fU|K}&YlS6z zb&p}hq`4W)T;5W@(lN<08k<~3r^L|k`cWvF-B8Sfr;)<YfSF{>ELV&>snKK)7vDlP z*!^q5`jt$MNdKn+?pIDf!(Wbmz3)^WypgE*eGJ!h>~Y-RUQ{b@AzNnJKKj=*cs&|o zRxVG_?zU9hBNm!9m#9}4L%yRox=y><Hks-tegs)PQf<e`o>uMR2SKy>he>X#&ln9H z#LO5Rs`v`I8;18#zOAwEGNg6FfPz8>BCVQ5|3@I3atxVqSBPlBO7u+>$D3$4==4?h z-hKGRhH<_JQ!e)fPEOL|xj>7s+-4MEsEOooH`?iZTY-~r-Pr1e&oRj)*;M8&=8aA| zp^N#hOEW4;+oRhh>W)hOCE^4_W7wk-L<!M$)ARQ<@Y@HGKdOKpf(;tLeGc6Ln(^~M z<Tj?B)wppZ&rmR}8;W=_i_<a1y6D@mw2|7Qn4d*!kHNUV;^smW5d|Z@DZu)S)8HIM z`%6wmvN9&O^BXHPPdJ4E<LB1A1XJ%9!oK#2N$Cans+`}Udlx1t8J{sdRj6Hz=N$-l zyRgY-Rx-ZEI~%lTQ1a!9V)=7d+>QV}DVOfp(mj_^UAl#%2MESw3ma|g>qX6sO*u<K zP}FP|`v;NbLfPIRFPstr`d2Z#LL!@P?r^0Z$3M2pna$#ArThuSlxfpsHMs`5mRn$P z5ZLxI?u6}!+hJJ+oOD>`QEzXjcU@)1!Phc#LO}m&Ob5CTgjpf?TUdo}5)6+K7NTs; zf-~1~p;U-I9a7EXk+k5}cj&k}DEWs{(PV9>>)hN~DhF4$Gf7w%0*++4okzi0??bH% zqWDxO-HrJjFkR_=;6B9qFX$?@kkY5`hI$(W)xcW<Y2VhBrYg~0I!$_Xil_J}Bpgu2 zY}cKnCw2P50!REEg|+Gi!lG*I*P>koqZ^Tb!m9<4>7`!*w}<*0_V+bG;bq)+vd#&^ zS3cEo4eBI3pz0NfSVp~H&6M%K2PQTk?yBECxJXi5pM!o2u4xCnnJo8}$$ozbqkoWV zrwkzv_wHD*b3a3Xd!!fcVILSP+RA+6!v>utPsz-h;NSW)ikw}i$PvGozq6njB0TmM z?CJ<3$3uA7<jbpnlQks2J`FyEqS<^8957raDYr4<=~~0}I`;uNxeUBc@5d|G3TaZt z3{O)SN@$m+fn$zbk|Rf&5ngO1#XGi*xgxiS7Wn!aI?emF<`iPh7_c?CnfSNBy1i&T zbKE1CSI9-%t)r27U%0u^&ZHS`US@dN>a^rw_@`oaWlcn@l!Q}B_v+&2=VTcxrN$0d z;6^3c?S9p3Su8*6WnB9o1OEhSe#ytnWPL|+YV&KOErOu$YW~or{TZSw&)+XRei&sa zy(Q;I%U$5mL%?>(gJo1q@PBW~*&=m)25C-aoI>SD;V+8uUntZ#rJ~xZyReh<U-Wmd z_GsM4*>WycnK4vk@@~V}&WgcZ@cj-d4Vwnxk7aaKtbG$~XH19rA?@Eks~k9k8m6Xl z2~iGo0PSKyk&UwzW}CC26pH-Gs`4J_a=}nL+Al96d$^$-=X*?kmi$m@X*HBo;z4F@ zt!0>p-i-#q=;O=?muV{;TLmdj|3Vn(U{Ztq>tK!?z6;$uKkLKW1#wDRtsPC1Qn2`i zTepz8+DdM>&*VD!F-A5{kaVF#DiX7k@}ih?6Y(^>_PR)K>y56;T$pNu$=3oUDwDM= z&>jp#*PkL?QlGADvQq`GpBvUVG#$P|o(+BnNx^*@*m;;)K^m}JMPbk2iycX;Col(G z4;|6$ZVEc)7-Cn9mo88%lpv3uzmD7-wGZbMBSrSx-MiF2@EZ6_j_-%Im1J6*Ezv<T zYZYjMP!(_+Ci#M8->$wLkXF89!7<SGkW4Z|8C8yVFM}&FP`(<bIW``IAFE)_9p-Me z#ql&X=N9mnsYvwjCLpcczdrj!=maF$9Fmt0c)kmRoO~SERq`E-kMRBsC_>me(gs_p zWDxHt6Pqyi6rAX!YP_k-71MA>fJrHKikeM_+-S&EB`sVixs}GT3{K8XODVwtmJ@E^ zdE3fRA+WBO>6x(5`m5`ZTi;60hv_2Mt{Ew3X5krDrq~Fsc$!C(sBX=NJ#>%Zx?-Oj z)zG5dZ%PeLu*0l8+Fm#h-}EFI;IoUUGZBXb^){=MIFg$-UxNWvx?8^Gno-V@xV}m) z`T=M5)ILjZ->>`3?LW?@9chiWYuC4-F_Yk}p|t5cO(M3|36xdNwZy(T6Z|4^+BS4p zd|;h?Xf@6iqMKpcRj~g6+w(JU?h!8d4A$=^lpl>zA`dPLKQX|Prr#FWeU-HA*=4*| zxMCueYNM63?EjI&YjF`?z{oX)Gte|4PPC*0e@53!;Th$Kj@}3EL#*_D=*ntI=|i#q zkwK$kK)e?mRKU(xEcQ<QTKQY0a~Y7Za4-)_L2tlOujQx*y@X~<x+kIdV(dXhTMjD( zQxObzGDjd>LC$1zGki-x;Lceo*xJCS{P2;$JSwd{iruBZ2PVu?qTcW+gkh56`XwLV zY}oWedlPA7$$q~Fv37Fp4%a9jC2$sWs4u3nwPzv4$J1bDzWljNzW>m+o1ETsAD>ZP zAZK6ewlOb+Tu8!^Hz4|FA!{CWE(zEF1b)7}`g|jh{7QR!5z2ti2tnfaD@nP}SoU4? zq}Jqd&74ayr<ub;Q!AL;nx!W-lvpu?4HJ!NjkcvN>_qIco*~71UnqRos<k2<{TZ$( zMX%{{-LO)i_&g{*FEHy%3Wd)LE!2xmOk7En5Y&(~agYv5d-g5Br8Z^{igH7Wol2*w zg}HW1e#;hXUe4l4$)7a%N6^f5JC|dMKZ|M_tv|y7+X^ppQOa(d*}n<R<s$!@vM8a_ zf?@)+`_KcJiXHan-=NZvuHIGhPyRC?7(#Hpjbzz+AO81ID4N^)0GZhZx$Us%4tnD{ zGqw}5+jV(m_>J@==Hi1Aa~O`KD6bl5yN*=GxE4$=(^akn%h&Sh9#nWQya{4zEQiT{ zP99gvPP0_CaaD?I{Nf~wYb)603>kAa^mPZU*~ND&OsSX9PDOtR?ewF(Mf1hWO^0*s z%#|nzt)qIZfydySxMn=L-QoRiv_^Yd(3M(vwr(L|V`JUoz#2!G)0kQVt7Ttw#r{JH zoCtoK%W7eiVmP(&ky0Ub&(8$%t_)ZFCRdmVAD~Z#SwIRo*~0x49{~%8oiI|O`mE{V zpvE1xz_z?X=-RJ&TRHL^yKEb~kVEf{$HVRH2~=#vIS6WdbaxcH4ILp^`aU(q43B!8 zJQ(yk*|$Lyn@Tck7KU3w21aH(fguWeD0mhyuWT>)KtTr~vu9C9_$ZI*F)2Dq(tad` zZMF7S{4;S{2Y%RO*iL(QoWo26t`$f3BXrAeAGQjj0qQ9uYi6hiKIXy3ZBbxB6X)T> zN*S-hS*UL%=qknSl9lVW4(3ss*Z3ivxS)H^jvoJtO6X#DTcO`ybD@4^H<NVPR$i6_ z*v-Y11~<E@gzdS&FjUx(%gpurh4Ac|C+L7&G}gyN-az5-(y!V{ZrvGtCt0Q$sRZo8 zT6ie~4)LkoI@;-c75$pDwE0pbq^whxm@=L8DVs|Q_#0l%y7=1OW|d1I@jKu%LeAiG zPmtx(y^Np0%o=>@LAN&3Qse!kS$^Rdb7TS<bvh&xoghqOyI^kjCY8&#Tue<RoNm=8 zr)PXDqFYX8wLG@k@0+H84_*4J)Ckb8#=5>r{QjYC{gh<ebvMdsX7)l4)E5Jd%B&L- z%93JA*6K;i9_}thm!b{IKG9n2p-hqB^u~!<>y^ZNmZK<6)Y6b<K}i}UDjG}nP2`ao ztI~+{nULJf%;}A-@cU$|54wUu059y5z$3tRH}yUyr0Npx16U+kQ+#8Iybcr<-Al1V z`$>e2O@)EC*d0PdIa*K%p+agMX}H-b>HWLVC>&6MN)^8yFhwDh(oQbuMMxtcaPMam zdl*j{)n{A<%)e!v>o#$deh*AEu!*jRWXefW+~l?`1AF@SnW-U-EZOg$0v$=N-AIRT z>fNy*2Hk^qlOMs9kEgi@xsBRp^1U|5)CcrK{)NxZ0y#TnJw>3;>#Z*KTTDGvNo9&p zlH&^s^5xY&Pm;j8PYFCtjtD`5`uTdq4Gn)gr7KvU9Drz!DhoC|yLbt1!EN6v-s`$3 zG2{j+d4}R%COtmQ)R5xMJ|}9&qSM$#jp)&JD_ewBxe!(Xr{fiFXeAUj<zCeuOUADc zhTJCiW!BMp^MqIAGT8zrHwg-5*HNIBfJ4r%q!**~F`AO~ORGED|Ch;NX@8tQi1{<- zf&<ROl!owu`o({NeH+;qCS183Yrv5~3AJ+nd+@#Mwflu<3$QDDSBYsG>jjDZ8Hy&N zKLh(J!T$u{dEu@h=vT;;^)tcJfp>m|4=jW5nXu07PIEL%QwH6FaZ1>v&UlBk1m>h* z(`X(Zlh#d@&_~UdOvw2hJqx;g!}zOkx;v*`nY!`tRFu_C7hP{mOplOtHcbnUC|EuZ z^cf}b9CVc<8A|^U+Ue;Qjr`iY!GUX*!iOGFa|0h_%9bhqHTrykq_N50jHk|PVR<FC zUc2CodYR6#nvQR$zC}w4aCB2|bj8}4>jE0ka}|fT^ZC^?+OFyf`j9SZa$*PSw>X6G z0Vq;V5q*Wc147$+*`mPRpsgjaHU>da9(8h}CbCj*lmFBa*5Z94M!v8SmY;O^ErRVz zeR7XZkt~OyqgzKoD7n_&t$7z7cdYU~m{fs~uYwRI`-lKAS8Ci46h(4)2fWy_NrVsA z9vWze{tC$?bI|k?=)+r-s}8+hPt7TbYGYn<GxK=u26wFdi}4u`l>R?6%F=xT;;yuK zp})=kLU@Bn?Xuf8j@b<blW3M2?$k)>jHS}otRf2;oe(aN>f`ob?^~`pj`(}9#uYy3 z2pW}q>O$5CoBuLp%2i>;C3mfuN|?qO7V3SoZFH+S9SYZD%Q$3rJvZ|voZkZ<HqqIJ zPoJYk?L#qmuz;4kdZ(P7N6_ewAY&dxj)ZDC3)lt)WLIhBC09#i)3!vHWnJ=7PMHzn zva?l8Lm?#G5!1}3n^d8l-9m`voSS5nMR<WG$$OK74euYo`8Fu+_J_pL3O53Fi@gv0 zKG{n9petWNN*{as51BPA!uBrorL6Ul^>h;Zy1+D($?RXN2=UA-!;dV&rgMh<M^Q5O zdtkzW8}@0))X<mW-q9TULHGPh(bvdE5@rBylWRwE(xdlxtd-pa;T<#X!LNj;A!On} zG#tqHwFx7=sD8u0n`3fzfh3r|G`>#5o*o$dPduvH_!<r4yWt^UUj5Qbk^JhT1PFNT z^D7}pLVZ1Ax$DJ~%8!NiAVEq3M~ma;wMM6w4@>Jb8?o~SzXLaAdJ`gqqU|6T=8@vv zdJTOqRJdsvd=S=gnkx}83bhzpO6`dICpHb$uQ4p^av3jq^+Qb&czYndz1)hl%HiFJ z6HG01gaSm~U<;4KRibOPaJSHYbV0c00AF5h)Axu{hkfZiy3jlB9<ogsjI~a~(G54x zdH*-{L`AFaQ?Tq$xnFoRGNHwK<9Z5x7FhT*W~v2}W!L-gzYq2I<?9~-Z3~JK(E^@+ zuZMd~LaW5I924_(0INOuGd8tT9m|+h)+VM+>_JOUL-eh*v2`$Z1bS7`jrq@M3^GJC zq@^?w^jb1=;ky11+UX^@n{x2-PaoSwZN3%0@%Sn3$L-8<!@jHJcKdBE5C$6rO{|Cc zV*DO{j<BTE@Oj*SNkc&Rfci$N%2&weg65rGwus4=(IqnYjFcoMPT5f{+*)S{vh|%s zy=;zO*c4bJX?AWy7sdEawmaj$FCEaekxa5joV!&SeI9>r#i_M;N2B{4n34^dXVBRk zx+%bL=s0k@(JB1sgM@DR?GxyRS^$rwiFa_}Z`UaxNPh>W+FPtBvpKB+B$u(7w817M zVt26=cR^uC;^npIn8V*J>OvdCqonv2H}&AVb{M}`($da^6Izx*inLhkm!O2FFSi57 zS+0NK)ED&5Ut*8vowvPfXRi<@a(54VlbY_G5w4`=p?D2}%pn|XG~A{xw^8lNkCHX3 zq@+Ukmd-!HSpx@`P}Z1iIjc*M@gqCn7B45S?`>8S8%S>Ia}b6fVUGJCf7(`t#PvRO z@@-{Cd;YkPp%a*XcI~Q4-Sj*nk?6bzi#Ou66GL>bQy$q==t6lyByC%{7i&(*+9B|s z`=Ms<yR~wp%W@Hh>;vE2JUUE?oXsYDqOdOurdEo~_PW7Fb8+vdYuRV@xAzgz%iLs6 z=lotrL>KNn(z4eu!G;4kdnpX_5z7Z~g$-I<8rDo3z#QArLr(%Oj`6aQ?MNe-s(NGV z-#USv!05;X2U`D-S;KuXO*5M9BkP-`?U!IA0f8?bB*b$m=QsJP6Akn<%~R}&#@_)G zMxJlzof?u9H$eRR!^(q`Z<<LXOZNL+u+@-jZ?et3Po^^X2^r1NZ3aIdPeVrG-u?pl zzM^vUS*X8oAD<CCOU^!c$AYFLeJ#jEhrsfwD?Hoq8981H8ed+W{0j^xKkv`8h7-&R znsX%OzLXxgqsu>cDSL^vNk*-a{$fxXI!&EfK^c0|(#niI8g03y_%ahG+e~pphZ2~A zE3WABK(_Q#(h}kCWsB`_-HE!FLSl*wb!~`o^^c*^dl!hJt<)J`B7E{n8BS~u%#{-@ zXbhBefS(lwqob~@8ale7uW4yS;YP8oM4K0aGOTQbj@t~!%1xUf$a3i(+QH8)-#6$2 z9BwF@_C&sOKMghSM~#OEWz-t{*l$oNu#Tiqg5$-<$Pgls;QC6EWs7|H-`A&7Ke6w7 z(I|+#3HfJW#g8cZ7R<fLEJ;>A3>FMK9`>M_FxyXBDu-AZQW@=+73zH1{_B_?EX20M zs$b~~U_D09B>P!fwUOD8o_(FomTYSZyy>=qU=_jyg|)z6s-gZR?v8{K9fWq${~@%~ z--N!@WAiV}jI^TfOL0m8YBT8<!sqV#)nqImI^fV%%e@NtE+57foG3}VZ0m53KK6U6 zl)0j^+Wpi<m;abe1oB=>CsUL?M#2ZMgUCpW6mqhK2Z%nl2xhjx3=is8SI0uG-FU3h zyvJ2Pf%;UOJ)!LUv&@MG_-?fvTEi@d^%^AtaDF>;MzUI9mJdt!_6aDo<XK<4@B!We z@rE*g-#kKr6Rt1?wp)FZE#}>XA23?<+{fi2yaObYRMB%fb%Q;Y5|8eR$M}rNU(`-l zwAD)gDCIfIG2(LtndE$T!~jCK{Ptn8!GfU(4P%T5J$R!VENov1axbu5oN*&^NGy&1 z%0qpka+5c)cT8iu;Z=vG0x#djyj26wK82ih%xDulIc+f%UB8WlU6#~j0V{Uax-sFR z9XX$i1ccD`@w*6@-#dTV5;rs?d@)hU5H;Z;NXN6!={9ySpD4wWmqL63SY1tc_EdP6 z^S{G{w6rY6=Y%sCcNUQ;jd(h0MhmsZV&lWVl+9%}F2A=~WnI`u>=1HB`Fto@E@qxQ zR7Umk&WAg6)9GAC`$b{OLNq%T&smpz3V%SD#v3l<O^2{mIAKG%2O#z;D+Y(%?1AGg zsMZ^ORP($!{BkS17fr?NExC7Y9@N2Z6)Q9Bu;3CJ2klT44-_PsVx37s&4#81(z4SX ziSVsO76aX;_%0Mxgj*c;p71V_ze|Yajvg|~BD{b%1ouc(`rIt&6p%?Ohlc4OT|}AK z_rU4jbOJP)BRfgy3*`ThS;HRKC~01RR3BL%z{bCawE_%y^O3kV)Rm0-t=a=Q$2D0U zIyUk5z(fhdxB8}rB*ksM)^~K9f4{vUq>&~2{Q;jchERnR{b28o1$X>i*eO0GqYWg5 zl2LfM?jp$>y7f_yV0Qel`}k}N_|EP!;L(lCuh^K83i|VYG~GRd9B-50ZIV}ss?m?+ zSKrVgfE@WI14J&+XR@Q@tJTcPF7bUF!lI-E`OSi#<O=2bNXe1Gl=LJYf(@e#4fAns z6NPd~@n$CU=sv>h6dRh_#@v?rx~dn0aSz0DA{(?HV$6~IbPFYU`5QRWY~Rf^UCmnV zAevX^;}$j%#|XChfPTVF!rTK?Ar6iV+0b?7X!Xr7Tk=}BFr*Zhi5vap=rM-JWj5jc zFCevqez~FGH5}+Jo3ie^-8NY+TJJn5_}_)Gwq?If@dz!}TXL=w@fFW(0(~5Q3^Pj! z{_n-JXO;EmV1~f%#dNh2@U#+i9@BeqO9#=;UgA?<ISw(RapNtnkw1+ypHOrW-7whG z^0f!9T%>0}M1Ob_Gao6d_d@KQh?~;3p7*xl_wP{pjB-BM<Yg+U%N!W6`3PpGCU6Z< zpGsCW@sFXME>qrRN8b2H-5Ffb>81`Tp(y#hs6EDh<RZ7b`S~@5FLc<vUojor)>1kz zB*LUyHuQH?DfA64Iw$SgK4#@3zVW4}if93ne0%_r{JDLFyb4mT^$JMzFN5wRX~1eQ z)-OdX;zCaCXDfvVs*IN%Lu<U-+}OOLNplhpm5QV`M&#+4P<@9n;1qJLy<77v3~8+P zJs5wNMrK^DQg67A2rwR?Iv~Cz-4`q~FF)jlipFW9YrtP5nIseM`T#B;N3DhM!6|fT zL+Ld%y8~r+>+W^fykBWXbwXkbks@vW8Tn|e-Ve-FkOvsW<xQ5Qr@vVb2#4GP{W$y& zgsP-e7O*_xG--qFbQw~*4F}dj{8zBhqluBrPhjge-knywG(j=GeM4lnwc?7bq^Qmc zp3^~DO+{!F?6lnyL6Tw%4$4Eidgm|C9kbs{xIt7hgozxf@IA(-@Qt~UX=m@4K`6FJ zOuB|Qz9EKhWZJNMl$KK^uByaUmAI-BS5@MwN?cWmt159-C9bN(wO8hfREeu9aaAR* zs>D^5xT+FYRpP2jTvdsyDsfdMuByaUmAI-B*ZcD<RpP2jT>md|Yf&Yxs>D^5xT+FY z-@m-75?58?s!Ci{iK{AcRVA*f#8s8JsuEXK;`-nJ&uUfTs!Ci{7gyEARdsPyU0m;5 zwx}+ys*9`Y;;Op1sxGdoi>vD5s=BzUF0QJJtLoyay11$?uBwZx>f-v}etD4U;;Op1 zsxGdoi>vD5s=B!T%d$mvaaCPh|GRIDQ(atD7uWy!rdZX*^*3v>|H=zsRTo#)#r5}J ziLAP~sxGdoi>vD5s=BzUF0QJJtLoyay11$?u0!}%x<#DFN@+>0Rwf&j#(?XLTWi#1 zp;cC<ukZC>S>%O;<n1nI-jT(EWB)`Y+5(Apw3uHYvSE0%yO#s{_uF2ZflDI>=FI6o z<c)DBWotbQ5Ols*uBj4NRpP2jTvdtd4QUE*3Rfkrs>D^5xT+FYRpP2jTvdsyDsfdM zuByaUmAI-BS5@MwN?cWmD+Ez&DtS>>7KU3w21aJP@BM`Aq2O7-yt2LE0|gy~%$`LZ z;iEjJ$E4^eN&Ar$w$<8S@z2C*9r$6BDsfdMuByaUmAI-BS5@K~P^!APsxGdoi>vD5 ss=By7_^usP7gyEARdsPyU0hWcSJlN;b#eXw&c)Sl55PlR$7Sw+0J6!+^8f$< diff --git a/client/resources/hardnested_tables/bitflip_1_2d2_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_2d2_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..fa1be58fd4b26d23f8c0a258942ba3c6ae602cf8 GIT binary patch literal 4981 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_2d2_states.bin.z b/client/resources/hardnested_tables/bitflip_1_2d2_states.bin.z deleted file mode 100644 index 4e5b2ff279cebc2f552d994ff58cf344c8e4323f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46813 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 YcrbzoBX}@^$Nv|>1E!zF|8dy=0=RtV761SM diff --git a/client/resources/hardnested_tables/bitflip_1_2d6_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_2d6_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b6c1eb54c9a47adde8f344c3c51fa06cddd1c782 GIT binary patch literal 1135 zcmYL{Z%k8H7{<>zx3{<4)_aQudL<ODVK@;2N5Y4e6};6AW>%pNmAXuJlKBCWeP|3g z;vk$`NED|Ar!LjFtQ#A{LEQb~LS~&u;|vnFbcSu+vgn;_93s=sKO1qNtDp9MdXx8; zC(oPbS^rvxZ*5@vs@Cl%Hcv#r#@zm;r%!J$mM_tL-6x$#)4;Y`0~&x65G-F0_Jbi) zyaE27TgO*8Vk<{-qP5?TIBTyQreJUF)YQ%k%ama5=s`sv4ITg%-)Q58Rkn_c<X~;b zrDZic30V1UP0b3tq0wdO9BEWLkCXx^bsiqR5-r5B(oKbHx!`dH*z%4!hiY0j1rOAy z$z<oy;h~Y4+QOapTM~IK=d~l((EG@a!nRX-7<~54(j;F*`I~%us#5HweW2I$p*my; zr^N@5xqHg!xp*;dQtP0;bq^yiGQ)mZG#pTW9a4sse9B1B#@?kb&_vwFC8WS^E?!P& z?LS-annSFmE1xuLk1o`qtv=2WLO%Xa)TX(nh0F4kL!yTu2`l+YH|XYu!vz+z2t5J) zs)u!PllEC5)XUx;NO*M81PY)|HfN$sYFhRx_Qe72I~kXdhGY-yw%i9D&pp=v5b{H_ zRtswnwZ!Bf;l1b=RHCOLu0ATqO1!wlkRQsA?Fq?j&N!@A_!~#tfZ{^EB$C6F935jt zaSaz6MLH{^h9WzQ;M~9^3C!o*gRH_>Ga*bn1daHzPmgmqIJ#v?YY(+&+`tQGWSeWO zdW#egLJHbtW8)_DgOfV;=soOfAO+T$>y(Bhu8Mc@Gy|EG*_zQG4#fTDKQJZ7Jz&nt zKVfxfLGP#Ssggl=#I0dmWxo0soTm|S5;5#RtTiFOCBa?xu~mF8F>@b*wAe>To0>ID zngjTG)hJ`tO<=EjPQ5ig+&aT8M7`)dE{dK8i}7M->rcE+!Uep^-+{jiWCy${0E~Uy z7*-_evv|3y_N#*W`5e415WnhIKTNuZC7Pgq?Odo{YlyVRE2iytxXF@V-K32wN`6`Z zZ-g7n2CXmdrym4TZX!YE@803#uS+ymAb@@|BLB_51G@O@LQ0B1M49Nna5tYSj(gDq zNQyX+7QPfd@nnIN41B^b(r~GPEAH|$p1@QUHL5@avSQk&?t$}YR)~1mS$#_GD9%*H zyM<8mnKsjkX1Ou1pjAqgcmf1tOMRWV&(C7+udLa!l1eL3oCL2qAbzB0cbrSNLGnsA zz(x*@BSYcPgoT}=`-zgTJ4B-r#l&O<`e8FsT-vEpNb<-_w>fa^lDHAe5m9lbUGU{J zQu69mvU<+?tO!td-=M8VDf*aH+Smv%9LUSlPlFD=6)|Sm7%rnMY}c~hD#bI~cuKbM yq?CJhtAP65h{epMM&USMEUYYNF$V`pBbvxclPu2&Ubk@ez4D8LgVzqeN&f>&!H^vQ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_2d6_states.bin.z b/client/resources/hardnested_tables/bitflip_1_2d6_states.bin.z deleted file mode 100644 index f8686dba6fe9851da2a7484b5352f4521b575ab0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23650 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 diff --git a/client/resources/hardnested_tables/bitflip_1_328_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_328_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b01f02208ef4ca4c78fc6566fd6e0c556e11ab30 GIT binary patch literal 5424 zcmY+HdsNz2w#U`@1XMJD%0(lH5q_XiFRq(+1pFDm7a%`SmQO}nr1OVyC25i-O`?MO zGi?CD*G*GEFg(<#qjxk-Ql&UcX=er*?6g^JuVFBgIH@&h(&o{0F8%Yav-bJpoVCwh z>zuv!=X+RE#eo85?cVBI?<$SF>+g{-Klt}sm%73ti=)6WRXF-maaio7u&51e<N1<^ zOMC!`iYVq=F#?X`GU-y7F-$9RAdEs=!Iiyx%Oe-Veizr<AD$nU>XNlAmWM^>4-Mz< z4htL6cU1%L_fw)Tox9BCCSRw{rB(@M@fF)8pFWY?>Ii5x60Mm1obNx_&G$3<IJ1ny zCdl-vyKT#km_5Sx3B6n0#FewuBm8YmRZH1Y@|xu2m>qM1$tXS)i{~`;IVi#6$NV}0 z3h+c(>a^fXQ;R`~qteMM{Xeiakt$#iq8^H@vooK<MXXICq%GA|y><&c;dueOp(H1^ zy|=EHH;0%+dxNY&65bd*z@LY8Yl%C=dQg}O*dB5!1vC@ql@^iCx&b!yRuxFxyw~0> z2cfs#Q$@5$6EvT&d)gf-3MJ=EDg!j?0(f!|^x#BdQ#%SzTEk@yiuO@XByi+d&5EMG zq~3B(@6_kAwJD-wiqpDxS?kDEC{GA2E*V#pB$venRT+wvl$Vx4N`5=w^b2o(QN;FT zbn<8Qa^4K=E<#4Lr?Q`rUI^3erM7q3;WTPIB=Y+8X-Tb=eN#d|_>*3O_$@Fg0KCVq zvZGD9j}7R4c*^Rq6(LJTOv+TX!*$6!Djc%g%SFCjC1T?hxaYPgdD0wpOpkaE_z`#p z{JYsh=yniHLG-Kch1kH&8epCJ27AcRmiftNfbD&NCNfT)NWeH_lFPd>MWD=(a=Ft1 zZ}j!F9n7w@0*}~9ZR&(*RI1w4<X5waCVc@e>70H@mCMdXc>5@9W4{omlNyxlmmLxk z`qSCN>}Zs($&-cxb&&pm=!Vf6(6y!jWH)>cQK#0*>@_?;om{R4(?G6LWwall#JSDm z#dop~A@=jc{51ZINjYw>0P9#4%*+c!DCLWzCbQ&0w@k8Q`ZhkH({glIj2?cN?~sCW zB-)>M-;+YAk0$Ey<`#o2Rh`@v;LQLEbpl7Bgo8&{&XOJ<U~MLl2nl>w9z~kInl)vA zrefW)=TRli$!><_6O%%1tBntx)QMh4^2!`3r=ZG*?{(k8n-)j6GVHv&OUqcBT~|qb z+&Amgv)uw?m+Ok<Hj1s?E0VylyDp+mRf%@dK`XGH6_qMbr3puzP*aT>CA?`*AP<Kw zA`OK%&%(YgA5DYU0>qA}Gcdzmy<xe%(hqlJAj(Ml5Cm0T(ka$@#Fj~6g7@&POWZ@f zM_hv^_x;HE6pK;nD$x2S<hQ(;iOdnW$w!MT;`JxVa-$Ja6ljm9jGL!%ogAG@G!bo$ zwus~6g;KqT=*SiA?Tiw6Xqhy=qA1#q0()jt4X0TAM`BDgMk$J6jfpCgrI4Xmo?L)w zrb7Awct${DTKdUxN^2TV3`}EoYj%UXnY}>Y|32vcu3Ka%C&V$Ff`nqnGt0griBESb zsT!g_?QQ|rg|*}$p>z8`%(;o2X386Xp|Dyc2Fvj#CC+jj#;a^K`G#*m``%7&b(dW) zHZ^%q0!|gMiNxmHbvFT+K*D%5%dyw3NKwpJqRnViyKa&)!e5Aqtl6*fi>?+Mo~pK0 z+vYjslk7??upy6Ut=EJ+5io&#RCbd|eWsg4ud`wOg_6dt^v}F!^aG?9CR?4hfqack zw8_CHtLY)5uy<eVl+az*vyjx*$27Vs^<qK2W)s;})7N#_bkcl_w3c!zBA{<4typ`e zaeB$06CT!?&IlT(`u*Kju*qEuw(@51Dl2aqM|#{fEt)`YvbKpXf=LN8bf?e{yH6x6 zf#2XY9vc5Fe<A5?bn>ZalE?PxnPcd4f(A!QO9MB@jtqcaK>&iU>GwSm1MTP^u+UTX zJ;xxc65gZe!yKfv^#S&GqlJ!#=DRy>*1F_&@I3o3pG^a=mwJUOHSm%xziB7G#c-0% z8Rxs}m7Uhz#5VIn%&r*pyr2%H(o1^I^QX>x?~?oHtu=j^Bg^qjIE{Qqn6csC(?PQc zp2uLSfXm)@Nw-m{$C9BsOCF_Z$+)DMY6^nJVCq3#Sx@5v>-ev4F8<)pCcc-Hh=6oZ zmL_=!P-B$UyeXj%Pa4uTd7F82k;EQ35~9||vlgR!i;|s53dgu*M&}(Z;Vff4rB+Dt zm0A?FhD+9JMp?EwjEqfz;539|8O2|Y2g+Cjn9-7&zOawYMD}eW_AH6ZE)fkr;=cqd z(0x#nDqORhhqLD<mtl&8Lrf(+q;`}6(WaI{b$o=wp9}6ruORs|P(07tHKeUTrLm(i zjNXFGCCwaff{$nBk3up-Q=wW=L>WzL#=-r-Y~*UT3g4r2h`GEaxSDBPvhGIEh)s65 zI+`>WZ5$xE%0UM&Ul}DfdYgRYag{aOxW=23(Np`F4nR?ei>F*OcXXF<Dd*OX|LJna zfUfH6#D57PjSnAQqgCX~Spj${VH4u|VB3B4Iw%gMl#%xnJQAO|E+x%G;hiKr9M4)Z zu3<alBzD9(gw#OeC>W;BC_3MzQ}jh;Xoa;2lnK_7na&Qa`MblRdLMKz1;rP0^<SRp z#jBZrq-Hc-{Mtwi3rB|wiiyRn%&_n?QIgJJSa`89M0sm+9EER0Xp4<WVHj*IaJi(5 z5*8NP3{8lTh4DicUPO)C+wVEoU;f{Mk;`0;aU{$e_Uq>EADM6TH)6-_89Rz&417YT z(c3~-b;f86O}}(EuXC(T&!f5Ybmrp58S}YLH{AHV<e6EPL6k=ktO5ft8H|oqsMdx1 zi%*;Ll2DK$N;7Zn`-!w3DjD;DWte-EGY>8oPufeqFR9~ne+MwYCBy_4pRBO0Mbu-) zsKouI6*y=GyoM9(7^1LFUqoCCg3D00HPLOz(})U6ayYDZ(k+MeA{UE26??1mKJvTH zhwzI|hw(o4UhhUrF58}>IFTR%@8RJLHd{n58APw<04cFE=IIoQLaB0uXkOC5bRQr( zXhhBGUR%BU8dVZIOR&{5pQgJ%(kl8EvCF)L_;@zap|Wvds7iNfo%2#ZNE#tvp)I}h zVNs0b2s=qm@f(z|C$*1F{5JBA_s()caFidaT-c@N&{Mnc{26qkOy^UDSe}eG$&vg8 z#P!9L01v~kzlln2cY<k=1vqX<Zg^4)gbok9QqxD2(P1aI6iZ|ER?Q%~nXE>$dEerN zjhCG-6PSz7V={NbcQRJ2ZO1ODlis&9FqeSqY@Y1`WgLU+MhC4@LT@2~s2BGN&c-L` zC6RS(%@+0`RZ>!fgz*HmTFrM$@tT#Ed>OviQT->XB3UkuDpge=Ag|DCH&?Ly-P?Le zEb$^SfXCy>UUwm0<uJ$y!W$0D?UG@nUMEu>fwC7@e#_c%(8$%S3G6^wiPUV_6vlZ- z6PXQ`dfQ~=6~LK1mR&&us<{$GZ*OeI9H(r1Pk7JGdkI0wqnNg)t#slK@rgv5tu?Bd zMy_QiohFd(r|><gCb&Z6q{wmPnaRik)`}Adl%mY@ds+^&wh5#l0U&f|y7I_1hnVU1 zDnWRCavfN|&iABYJ|X$kJu~=FLu6AFeWbyVL`!LVFJ>0sskgmI6fhq+J3gS)a@(Px zXd4I+|A}d0DMq>b!aM|Sq51Z2I<KQHyOPq3Gsz5ctQ8wVgEUE@kkL&hEAT=S<ZAqM z{)$45?HVWMACKK_OLFk8Mj^b0BfhdV$~6t~ALJ=jfDP+5k!Jd(TRpRy)kGEdgdnFi zXO{ff{)+c8mNg};#egjxzj#uMB4*g^IH^vF8Bv7<2$!yAt)T?9U<+MsPhKy%r!Qr5 zMloU$J6S4PN6g?Z4WkfaTB%j&ON%F3)GR+;-E)cu)<>J5kQ2|bMe^u2`iZ7+3ukeZ z&zm4m$MbnBO0%-3tYnm2s#!%?mqas|mO@qXgWh9`qfPgDW8D!0Y#!u^J@2}4C$Wp` z&n~xCojk<K>lo-gz}6paUPo%4sS#Hns#$suO;F7aHR{N#u`)VnvPe!L<BCv8C-_sN z!eKG+s5pcvl3Pmh?I{H7EULmDd1TeBNgn=6cnzMTuCNW+9XB!qs?MHzD(9JA@*VgX zd>kr9uV}+srzZBy7T`3`$<Q+M8F1$b@*8vzQc1|#C;U%$PG^_`uvGO!G-<;S<c6{l zWt*VVGfbV4Wp28#7HJ3#JzdR?J1CHXr%kRrVoM(74CsR&AvyI9M>}snAmhSAcI|Pq z^Hxgi?YPDX@^j)NK}{h}P@7$g0`-QLT-IZe6cAI|N!$EDckEm?-u4kMo$@Z_U5NC3 zJlaF!oK0$HJwcHlp;QLJ`{-9}Km0uDv}#juB=(N?R$QZ^AcbQ8B^tBIIU|a(K*5NU z+*8>NvN7GH#i=TfI1TkAIJ7?)PN45+uNbz|*%rfjlg_Th32KU>QR(V<k<*IGZc!uZ zdW(=|I7mPdOl{_QysBr?`!mV=TKnGm?uG1HB>9L%ZCpj^8q66hvOOgdkzl8rRFxFN z-!_LpeiU{r#LlzX(d=kb(~?JJ45S_eLLl!IWWA1sKYmJ;@bF#PZLDetz*CkhfE5}? zj*zpw{sQ56SC1T}RUl?k`$W6QLpmpa$}z5M=?7>e-IOh$rX*qt_<6Qkp-D3uo9)n= z;v>g3E=bI2QFB@a46=_jWrv3&E|N{`S9*a&SEA3?^#20f_TacYIkm=y3NK)}2Us+6 zp@9+M1LP>o99l+K6HPEM4(iSFcs?C8W)+JqBXQ;URJB@|Y8l}(7=3Y}9|4mgFtlQ2 zc($k_bCjr5T^cheJDRNKD?JLk)XH1x80%zqMh<hvRUKnsc^arhMb06G6|6O0z6>!z zG%ndJ6RhQIjmw}=;^J8=t=LdU>!jvTF0;)g`Xfs1PLI+u#og)t0r-vK2BAk~Q^>$o ztQ~loS!OXxNCsIrJS2LeJ+5UfOD*zR(u}DTvZ;+~(vqzeRJ0h*aYD^8qy>pKg<4Ie zYu4k6SU$lch}&{NP}3LUkIB~06$>XLV%oafZ~U?x)iPWm|6`0>5gw>`5c6gv0v(nV zhQ&l+B1vIkDVGXgK97sT^zwQ-Ad!J`8G?8Mv_0xKYX5(R@3oSB700)#1f!)_iY*pD zv-)0taoC06r;OL|#>$-sACI*DZEU!<_9ORSKmW|3e|y+a>;K1x!JqCFU$h@t?ejM| z4PxDOgsi!qtvbwF*j*jFw#xqbgR;_2uI~NgSt{s$PDy*mYyC=4=Nqb^8g_ZE2y&3{ zJXM~Dn}_OfIRvpMXmVV*?2GVbuVWSx^cOq29zp(RH_x3<^zGz9UmuYcK0P=;pXH2r z{!W&NAg#>O8We#qOG`OtGX_(T(15i3!&Oh+mHDeFn_nMF%Wz!FNgEq6=q5^Telynn zB-`^g;%x7Z|Hs2KGxQ2^F8=eGJ%VQ`@`6*%Vx+Jr^zzw>hT25kJpF@sf_5kC7m-N* zJ|-qrW;f`3v;HqNGvkcrQJ}R#xG4A$uy1I7P40eq_wRvU|DJI8FO{C_*FF1xb&N<J zPyQ1l`F+QWG;Zyx>+R&f=|78;{QhCPBqts5@S|#)YEt@TF5dNdu53-aUCtb^N=Grb zJ4LO9b5+)aDB9NcTP=U6E-#|j*?x|(jO^!Xu5WCPg34JXcR=rF`DXPC5p{9B4ba93 zkzYD0dM8Qc#%EW*v;%K4hTi{i@y*-4A052@cso5m-#1ryd;cVDY|O56`~9nL$ElRV zp0@~hCARNZ0vmPnGy6X{O|$)KK%C8q`f6O7@F!epjr8zzi{kKyzJqu7sqF5C>$3CL zQpIKcUpG))=hflrvj4e}?A=bQ<IU6bzM1KK?`QG6FFgJ)szd>)TsiVqYBT-7E^8X| z9$k2c`%|Y*_w(K???O!0ivMa-hwBY<DW~N{=iJ4ayJV?lisHWc=W^H7oWmy@Eyc^F z&1UzS<MYhby*1@l&FqkpUbuHS$!cND_`GwqwTfH(j|xDCtIw@Cu(!s%hF5c|v+eMe zS+NBV+H>htg3TwE79TtHVgd7xMs9EK_{H|B(Q+M&AANN4xTbY~`}uEaSO1gqsYiiT zV@L1|`@>nqmrk2c?$}R5jsMMjEeC6`D$l#xHOk!B3!v=d$CK5^scnUm1XN&$`q;UB z6#KaFZd7{?ez?|P59Y)@yYYp@+&*%H++e-<*TlR{vE;UA<NLe{hIi@u@7E+IL$kY` z@BzbrW+HDet1}_R_M`!oZfmdZS(h@DjqgmaJahik|Mh#&kX$jdW|>-B7u%apq^BUY zy@gk!?w_o`^w=YBdG=w9T^saxFATb#UYDP7&fm=Xww}GoXdiubZ~s0~qx=bUHmBod znP}?<_Hsb>5&OY>Wwz_p*)vtE9qWDhU;L|RA2Pn04Nv>7O-k>t9{3%!{v7}Msx=*n z+IMNnwRX1eYx(&yQ^O$kwCGXb&>xO{kb-TS8+mK|FIj});EkNGbdBd6*f;L25!L~r zx?@gS=$TfOm(F;kW+bi@l#jB8=@!p&VQp?axwR74a|cJwD8)>RZRJkkT1}1F<yx|e zAth*)H(gkcd%?^4X-(Kj7D~JJyl8|{lXOF7k5kmjFsK|wSwMlJ2w6HZ+%a6E^Sj5# zJG?DZSN>eSUcr@($(w7&ET0us)2icHLkb1HxwbSEK&l!R7mPTg2H3j_nk|f0hLSo2 z_NVCvCdw+niL}vj>_Cw%c)8Lc$oVm`XBI#D<YEzhS`PJmE;YE_+gJ%VhNKu18y<8| zP2_*k2cg_+d#`+sths*w$dY+lt{QhDnT18iXQ4r0ZTw2D7+0;y^KJb*u+6!FNKS{Q I|Eu`_01i(LZ~y=R literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_328_states.bin.z b/client/resources/hardnested_tables/bitflip_1_328_states.bin.z deleted file mode 100644 index c8a8cf4a0..000000000 --- a/client/resources/hardnested_tables/bitflip_1_328_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xOu3io%VkLSMd9E bJ!HHK{| us~~ןO?y}\כ7t{G{s6~W.כ{vw?~>߻oϿ^珟ϝ8_uܿ?}/~]?|כ>'{߿>kO1W}|p?~==|kymo7ogߏߎ_??6ÿ?_;~o\??G??y/^yXopaߧ{tWMkQ|Xկ|G7___5~9_/ߟkϷ;/? /7?j?4[<ֽ{okOkoG7}g?W˿?o<?cϏv?:v|j?}OG_FwƯ??j񏎿vƯikۿz=}]?3n_}4^]V?O_V_/dU{uSƯn[wo]}߻u?????_?yyOkC1xwouw Ͽ7:coooo_uھ//ko;?7QW^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>} \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_1_388_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_388_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b01f02208ef4ca4c78fc6566fd6e0c556e11ab30 GIT binary patch literal 5424 zcmY+HdsNz2w#U`@1XMJD%0(lH5q_XiFRq(+1pFDm7a%`SmQO}nr1OVyC25i-O`?MO zGi?CD*G*GEFg(<#qjxk-Ql&UcX=er*?6g^JuVFBgIH@&h(&o{0F8%Yav-bJpoVCwh z>zuv!=X+RE#eo85?cVBI?<$SF>+g{-Klt}sm%73ti=)6WRXF-maaio7u&51e<N1<^ zOMC!`iYVq=F#?X`GU-y7F-$9RAdEs=!Iiyx%Oe-Veizr<AD$nU>XNlAmWM^>4-Mz< z4htL6cU1%L_fw)Tox9BCCSRw{rB(@M@fF)8pFWY?>Ii5x60Mm1obNx_&G$3<IJ1ny zCdl-vyKT#km_5Sx3B6n0#FewuBm8YmRZH1Y@|xu2m>qM1$tXS)i{~`;IVi#6$NV}0 z3h+c(>a^fXQ;R`~qteMM{Xeiakt$#iq8^H@vooK<MXXICq%GA|y><&c;dueOp(H1^ zy|=EHH;0%+dxNY&65bd*z@LY8Yl%C=dQg}O*dB5!1vC@ql@^iCx&b!yRuxFxyw~0> z2cfs#Q$@5$6EvT&d)gf-3MJ=EDg!j?0(f!|^x#BdQ#%SzTEk@yiuO@XByi+d&5EMG zq~3B(@6_kAwJD-wiqpDxS?kDEC{GA2E*V#pB$venRT+wvl$Vx4N`5=w^b2o(QN;FT zbn<8Qa^4K=E<#4Lr?Q`rUI^3erM7q3;WTPIB=Y+8X-Tb=eN#d|_>*3O_$@Fg0KCVq zvZGD9j}7R4c*^Rq6(LJTOv+TX!*$6!Djc%g%SFCjC1T?hxaYPgdD0wpOpkaE_z`#p z{JYsh=yniHLG-Kch1kH&8epCJ27AcRmiftNfbD&NCNfT)NWeH_lFPd>MWD=(a=Ft1 zZ}j!F9n7w@0*}~9ZR&(*RI1w4<X5waCVc@e>70H@mCMdXc>5@9W4{omlNyxlmmLxk z`qSCN>}Zs($&-cxb&&pm=!Vf6(6y!jWH)>cQK#0*>@_?;om{R4(?G6LWwall#JSDm z#dop~A@=jc{51ZINjYw>0P9#4%*+c!DCLWzCbQ&0w@k8Q`ZhkH({glIj2?cN?~sCW zB-)>M-;+YAk0$Ey<`#o2Rh`@v;LQLEbpl7Bgo8&{&XOJ<U~MLl2nl>w9z~kInl)vA zrefW)=TRli$!><_6O%%1tBntx)QMh4^2!`3r=ZG*?{(k8n-)j6GVHv&OUqcBT~|qb z+&Amgv)uw?m+Ok<Hj1s?E0VylyDp+mRf%@dK`XGH6_qMbr3puzP*aT>CA?`*AP<Kw zA`OK%&%(YgA5DYU0>qA}Gcdzmy<xe%(hqlJAj(Ml5Cm0T(ka$@#Fj~6g7@&POWZ@f zM_hv^_x;HE6pK;nD$x2S<hQ(;iOdnW$w!MT;`JxVa-$Ja6ljm9jGL!%ogAG@G!bo$ zwus~6g;KqT=*SiA?Tiw6Xqhy=qA1#q0()jt4X0TAM`BDgMk$J6jfpCgrI4Xmo?L)w zrb7Awct${DTKdUxN^2TV3`}EoYj%UXnY}>Y|32vcu3Ka%C&V$Ff`nqnGt0griBESb zsT!g_?QQ|rg|*}$p>z8`%(;o2X386Xp|Dyc2Fvj#CC+jj#;a^K`G#*m``%7&b(dW) zHZ^%q0!|gMiNxmHbvFT+K*D%5%dyw3NKwpJqRnViyKa&)!e5Aqtl6*fi>?+Mo~pK0 z+vYjslk7??upy6Ut=EJ+5io&#RCbd|eWsg4ud`wOg_6dt^v}F!^aG?9CR?4hfqack zw8_CHtLY)5uy<eVl+az*vyjx*$27Vs^<qK2W)s;})7N#_bkcl_w3c!zBA{<4typ`e zaeB$06CT!?&IlT(`u*Kju*qEuw(@51Dl2aqM|#{fEt)`YvbKpXf=LN8bf?e{yH6x6 zf#2XY9vc5Fe<A5?bn>ZalE?PxnPcd4f(A!QO9MB@jtqcaK>&iU>GwSm1MTP^u+UTX zJ;xxc65gZe!yKfv^#S&GqlJ!#=DRy>*1F_&@I3o3pG^a=mwJUOHSm%xziB7G#c-0% z8Rxs}m7Uhz#5VIn%&r*pyr2%H(o1^I^QX>x?~?oHtu=j^Bg^qjIE{Qqn6csC(?PQc zp2uLSfXm)@Nw-m{$C9BsOCF_Z$+)DMY6^nJVCq3#Sx@5v>-ev4F8<)pCcc-Hh=6oZ zmL_=!P-B$UyeXj%Pa4uTd7F82k;EQ35~9||vlgR!i;|s53dgu*M&}(Z;Vff4rB+Dt zm0A?FhD+9JMp?EwjEqfz;539|8O2|Y2g+Cjn9-7&zOawYMD}eW_AH6ZE)fkr;=cqd z(0x#nDqORhhqLD<mtl&8Lrf(+q;`}6(WaI{b$o=wp9}6ruORs|P(07tHKeUTrLm(i zjNXFGCCwaff{$nBk3up-Q=wW=L>WzL#=-r-Y~*UT3g4r2h`GEaxSDBPvhGIEh)s65 zI+`>WZ5$xE%0UM&Ul}DfdYgRYag{aOxW=23(Np`F4nR?ei>F*OcXXF<Dd*OX|LJna zfUfH6#D57PjSnAQqgCX~Spj${VH4u|VB3B4Iw%gMl#%xnJQAO|E+x%G;hiKr9M4)Z zu3<alBzD9(gw#OeC>W;BC_3MzQ}jh;Xoa;2lnK_7na&Qa`MblRdLMKz1;rP0^<SRp z#jBZrq-Hc-{Mtwi3rB|wiiyRn%&_n?QIgJJSa`89M0sm+9EER0Xp4<WVHj*IaJi(5 z5*8NP3{8lTh4DicUPO)C+wVEoU;f{Mk;`0;aU{$e_Uq>EADM6TH)6-_89Rz&417YT z(c3~-b;f86O}}(EuXC(T&!f5Ybmrp58S}YLH{AHV<e6EPL6k=ktO5ft8H|oqsMdx1 zi%*;Ll2DK$N;7Zn`-!w3DjD;DWte-EGY>8oPufeqFR9~ne+MwYCBy_4pRBO0Mbu-) zsKouI6*y=GyoM9(7^1LFUqoCCg3D00HPLOz(})U6ayYDZ(k+MeA{UE26??1mKJvTH zhwzI|hw(o4UhhUrF58}>IFTR%@8RJLHd{n58APw<04cFE=IIoQLaB0uXkOC5bRQr( zXhhBGUR%BU8dVZIOR&{5pQgJ%(kl8EvCF)L_;@zap|Wvds7iNfo%2#ZNE#tvp)I}h zVNs0b2s=qm@f(z|C$*1F{5JBA_s()caFidaT-c@N&{Mnc{26qkOy^UDSe}eG$&vg8 z#P!9L01v~kzlln2cY<k=1vqX<Zg^4)gbok9QqxD2(P1aI6iZ|ER?Q%~nXE>$dEerN zjhCG-6PSz7V={NbcQRJ2ZO1ODlis&9FqeSqY@Y1`WgLU+MhC4@LT@2~s2BGN&c-L` zC6RS(%@+0`RZ>!fgz*HmTFrM$@tT#Ed>OviQT->XB3UkuDpge=Ag|DCH&?Ly-P?Le zEb$^SfXCy>UUwm0<uJ$y!W$0D?UG@nUMEu>fwC7@e#_c%(8$%S3G6^wiPUV_6vlZ- z6PXQ`dfQ~=6~LK1mR&&us<{$GZ*OeI9H(r1Pk7JGdkI0wqnNg)t#slK@rgv5tu?Bd zMy_QiohFd(r|><gCb&Z6q{wmPnaRik)`}Adl%mY@ds+^&wh5#l0U&f|y7I_1hnVU1 zDnWRCavfN|&iABYJ|X$kJu~=FLu6AFeWbyVL`!LVFJ>0sskgmI6fhq+J3gS)a@(Px zXd4I+|A}d0DMq>b!aM|Sq51Z2I<KQHyOPq3Gsz5ctQ8wVgEUE@kkL&hEAT=S<ZAqM z{)$45?HVWMACKK_OLFk8Mj^b0BfhdV$~6t~ALJ=jfDP+5k!Jd(TRpRy)kGEdgdnFi zXO{ff{)+c8mNg};#egjxzj#uMB4*g^IH^vF8Bv7<2$!yAt)T?9U<+MsPhKy%r!Qr5 zMloU$J6S4PN6g?Z4WkfaTB%j&ON%F3)GR+;-E)cu)<>J5kQ2|bMe^u2`iZ7+3ukeZ z&zm4m$MbnBO0%-3tYnm2s#!%?mqas|mO@qXgWh9`qfPgDW8D!0Y#!u^J@2}4C$Wp` z&n~xCojk<K>lo-gz}6paUPo%4sS#Hns#$suO;F7aHR{N#u`)VnvPe!L<BCv8C-_sN z!eKG+s5pcvl3Pmh?I{H7EULmDd1TeBNgn=6cnzMTuCNW+9XB!qs?MHzD(9JA@*VgX zd>kr9uV}+srzZBy7T`3`$<Q+M8F1$b@*8vzQc1|#C;U%$PG^_`uvGO!G-<;S<c6{l zWt*VVGfbV4Wp28#7HJ3#JzdR?J1CHXr%kRrVoM(74CsR&AvyI9M>}snAmhSAcI|Pq z^Hxgi?YPDX@^j)NK}{h}P@7$g0`-QLT-IZe6cAI|N!$EDckEm?-u4kMo$@Z_U5NC3 zJlaF!oK0$HJwcHlp;QLJ`{-9}Km0uDv}#juB=(N?R$QZ^AcbQ8B^tBIIU|a(K*5NU z+*8>NvN7GH#i=TfI1TkAIJ7?)PN45+uNbz|*%rfjlg_Th32KU>QR(V<k<*IGZc!uZ zdW(=|I7mPdOl{_QysBr?`!mV=TKnGm?uG1HB>9L%ZCpj^8q66hvOOgdkzl8rRFxFN z-!_LpeiU{r#LlzX(d=kb(~?JJ45S_eLLl!IWWA1sKYmJ;@bF#PZLDetz*CkhfE5}? zj*zpw{sQ56SC1T}RUl?k`$W6QLpmpa$}z5M=?7>e-IOh$rX*qt_<6Qkp-D3uo9)n= z;v>g3E=bI2QFB@a46=_jWrv3&E|N{`S9*a&SEA3?^#20f_TacYIkm=y3NK)}2Us+6 zp@9+M1LP>o99l+K6HPEM4(iSFcs?C8W)+JqBXQ;URJB@|Y8l}(7=3Y}9|4mgFtlQ2 zc($k_bCjr5T^cheJDRNKD?JLk)XH1x80%zqMh<hvRUKnsc^arhMb06G6|6O0z6>!z zG%ndJ6RhQIjmw}=;^J8=t=LdU>!jvTF0;)g`Xfs1PLI+u#og)t0r-vK2BAk~Q^>$o ztQ~loS!OXxNCsIrJS2LeJ+5UfOD*zR(u}DTvZ;+~(vqzeRJ0h*aYD^8qy>pKg<4Ie zYu4k6SU$lch}&{NP}3LUkIB~06$>XLV%oafZ~U?x)iPWm|6`0>5gw>`5c6gv0v(nV zhQ&l+B1vIkDVGXgK97sT^zwQ-Ad!J`8G?8Mv_0xKYX5(R@3oSB700)#1f!)_iY*pD zv-)0taoC06r;OL|#>$-sACI*DZEU!<_9ORSKmW|3e|y+a>;K1x!JqCFU$h@t?ejM| z4PxDOgsi!qtvbwF*j*jFw#xqbgR;_2uI~NgSt{s$PDy*mYyC=4=Nqb^8g_ZE2y&3{ zJXM~Dn}_OfIRvpMXmVV*?2GVbuVWSx^cOq29zp(RH_x3<^zGz9UmuYcK0P=;pXH2r z{!W&NAg#>O8We#qOG`OtGX_(T(15i3!&Oh+mHDeFn_nMF%Wz!FNgEq6=q5^Telynn zB-`^g;%x7Z|Hs2KGxQ2^F8=eGJ%VQ`@`6*%Vx+Jr^zzw>hT25kJpF@sf_5kC7m-N* zJ|-qrW;f`3v;HqNGvkcrQJ}R#xG4A$uy1I7P40eq_wRvU|DJI8FO{C_*FF1xb&N<J zPyQ1l`F+QWG;Zyx>+R&f=|78;{QhCPBqts5@S|#)YEt@TF5dNdu53-aUCtb^N=Grb zJ4LO9b5+)aDB9NcTP=U6E-#|j*?x|(jO^!Xu5WCPg34JXcR=rF`DXPC5p{9B4ba93 zkzYD0dM8Qc#%EW*v;%K4hTi{i@y*-4A052@cso5m-#1ryd;cVDY|O56`~9nL$ElRV zp0@~hCARNZ0vmPnGy6X{O|$)KK%C8q`f6O7@F!epjr8zzi{kKyzJqu7sqF5C>$3CL zQpIKcUpG))=hflrvj4e}?A=bQ<IU6bzM1KK?`QG6FFgJ)szd>)TsiVqYBT-7E^8X| z9$k2c`%|Y*_w(K???O!0ivMa-hwBY<DW~N{=iJ4ayJV?lisHWc=W^H7oWmy@Eyc^F z&1UzS<MYhby*1@l&FqkpUbuHS$!cND_`GwqwTfH(j|xDCtIw@Cu(!s%hF5c|v+eMe zS+NBV+H>htg3TwE79TtHVgd7xMs9EK_{H|B(Q+M&AANN4xTbY~`}uEaSO1gqsYiiT zV@L1|`@>nqmrk2c?$}R5jsMMjEeC6`D$l#xHOk!B3!v=d$CK5^scnUm1XN&$`q;UB z6#KaFZd7{?ez?|P59Y)@yYYp@+&*%H++e-<*TlR{vE;UA<NLe{hIi@u@7E+IL$kY` z@BzbrW+HDet1}_R_M`!oZfmdZS(h@DjqgmaJahik|Mh#&kX$jdW|>-B7u%apq^BUY zy@gk!?w_o`^w=YBdG=w9T^saxFATb#UYDP7&fm=Xww}GoXdiubZ~s0~qx=bUHmBod znP}?<_Hsb>5&OY>Wwz_p*)vtE9qWDhU;L|RA2Pn04Nv>7O-k>t9{3%!{v7}Msx=*n z+IMNnwRX1eYx(&yQ^O$kwCGXb&>xO{kb-TS8+mK|FIj});EkNGbdBd6*f;L25!L~r zx?@gS=$TfOm(F;kW+bi@l#jB8=@!p&VQp?axwR74a|cJwD8)>RZRJkkT1}1F<yx|e zAth*)H(gkcd%?^4X-(Kj7D~JJyl8|{lXOF7k5kmjFsK|wSwMlJ2w6HZ+%a6E^Sj5# zJG?DZSN>eSUcr@($(w7&ET0us)2icHLkb1HxwbSEK&l!R7mPTg2H3j_nk|f0hLSo2 z_NVCvCdw+niL}vj>_Cw%c)8Lc$oVm`XBI#D<YEzhS`PJmE;YE_+gJ%VhNKu18y<8| zP2_*k2cg_+d#`+sths*w$dY+lt{QhDnT18iXQ4r0ZTw2D7+0;y^KJb*u+6!FNKS{Q I|Eu`_01i(LZ~y=R literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_388_states.bin.z b/client/resources/hardnested_tables/bitflip_1_388_states.bin.z deleted file mode 100644 index c8a8cf4a0..000000000 --- a/client/resources/hardnested_tables/bitflip_1_388_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xOu3io%VkLSMd9E bJ!HHK{| us~~ןO?y}\כ7t{G{s6~W.כ{vw?~>߻oϿ^珟ϝ8_uܿ?}/~]?|כ>'{߿>kO1W}|p?~==|kymo7ogߏߎ_??6ÿ?_;~o\??G??y/^yXopaߧ{tWMkQ|Xկ|G7___5~9_/ߟkϷ;/? /7?j?4[<ֽ{okOkoG7}g?W˿?o<?cϏv?:v|j?}OG_FwƯ??j񏎿vƯikۿz=}]?3n_}4^]V?O_V_/dU{uSƯn[wo]}߻u?????_?yyOkC1xwouw Ͽ7:coooo_uھ//ko;?7QW^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן<meu//O_W?evwfZUߟm?[o/??OU/O}m>5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>} \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_1_3a0_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_3a0_states.bin.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..fe85775bfe7cdafa269bb9b1c2202af269e763c7 GIT binary patch literal 1680 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 N^*D=5@4XlI{2wZ5kZb?| literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_3a0_states.bin.z b/client/resources/hardnested_tables/bitflip_1_3a0_states.bin.z deleted file mode 100644 index 479bacb03..000000000 --- a/client/resources/hardnested_tables/bitflip_1_3a0_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xMnFaWtщ|5o}4Lg ObOjzߟ1$_K߿rK->ɷޥ/~}K?kxzI,t_~[?~O}־}~;nnr|_O?鷷>ޯ_OCe9w}{}zǏa<㯿KŷwKIߧn;7I?鏗O/???O/O{??O_o/_?w_w_w?_?_?oO_w_Ow_?oO_w_OwO_o/_?w_w_w?_??O_o/_?w_w_w?_??_w?_??O_o/_?w_w_Ow_?oO_wO_o/_?w_w_w?_???oO_w_Ow_w?_??O_o/_?w_w__Ow_?oO_w?oO_w_Ow_w?_??O_o/_?w_w__Ow_?oO_wO_o/_?w_w_w?_??OO_ӿO??O??ӿ/?{g{gO??o??_'{???ӿ/???oO_w_Ow_??_oO????O/o?o??Oӿo????/?o?Oӿ/?O??w?_??O_o/_?w_w__o/_?w_w_w?_??O_o/_?w_w_w?_??OoO_w_Ow_?oO_w_Ow_?_oO????O/o?o??Oӿo????/?o?Oӿ/?O???_oO????O/o?o??Oӿo????/?o?Oӿ/?O?????_'{???ӿ/???OO_ӿO??O??ӿ/?{g{gO??o??_'{???ӿ/???OO_ӿO??O??ӿ/?{g{gO??oOw_?oO_w_Ow_?oO_w_O_w_Ow_?o???O/o?o??Oӿo????/?o?Oӿ/?O???_oO?_??O_o/_?w_w_w?_'{???ӿ/???OO_ӿO??O??ӿ/?{g{gO??o??????/?o?Oӿ/?O???_oO????O/o?o??Oӿow_w_w?_??O_o/_?_w_Ow_?oOw_w_w?_??O_o/_?_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_O_w_w?_??O_o/_?w_w_Ow_?oO_??O_o/_?w_w_w?_w_w?_??O_o/_?w_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_O_w_w?_??O_o/_?w_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_O_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_Ow_w?_??O_o/_?w_w_Ow_?oO_w_Ow_?oO_??O_o/_?w_w_w?__?oO_w_Ow_w?_??O_o/_?w_w_Ow_?oO_w_?oO_w_Ow_?oO_w_Ow[ \ No newline at end of file diff --git a/client/src/cmdhfmfhard.c b/client/src/cmdhfmfhard.c index ade910002..15eb15ab0 100644 --- a/client/src/cmdhfmfhard.c +++ b/client/src/cmdhfmfhard.c @@ -23,6 +23,7 @@ #include <locale.h> #include <math.h> #include <time.h> // MingW +#include <bzlib.h> #include "commonutil.h" // ARRAYLEN #include "comms.h" @@ -35,7 +36,6 @@ #include "hardnested_bruteforce.h" #include "hardnested_bf_core.h" #include "hardnested_bitarray_core.h" -#include "zlib.h" #include "fileutils.h" #define NUM_CHECK_BITFLIPS_THREADS (num_CPUs()) @@ -44,7 +44,7 @@ #define IGNORE_BITFLIP_THRESHOLD 0.99 // ignore bitflip arrays which have nearly only valid states #define STATE_FILES_DIRECTORY "hardnested_tables/" -#define STATE_FILE_TEMPLATE "bitflip_%d_%03" PRIx16 "_states.bin.z" +#define STATE_FILE_TEMPLATE "bitflip_%d_%03" PRIx16 "_states.bin.bz2" #define DEBUG_KEY_ELIMINATION // #define DEBUG_REDUCTION @@ -207,32 +207,23 @@ static int compare_count_bitflip_bitarrays(const void *b1, const void *b2) { } -static voidpf inflate_malloc(voidpf opaque, uInt items, uInt size) { - return calloc(items * size, sizeof(uint8_t)); -} - - -static void inflate_free(voidpf opaque, voidpf address) { - free(address); -} - #define OUTPUT_BUFFER_LEN 80 #define INPUT_BUFFER_LEN 80 //---------------------------------------------------------------------------- // Initialize decompression of the respective bitflip_bitarray stream //---------------------------------------------------------------------------- -static void init_inflate(z_streamp compressed_stream, uint8_t *input_buffer, uint32_t insize, uint8_t *output_buffer, uint32_t outsize) { +static void init_bunzip2(bz_stream *compressed_stream, char *input_buffer, uint32_t insize, char *output_buffer, uint32_t outsize) { - // initialize z_stream structure for inflate: + // initialize bz_stream structure for bunzip2: compressed_stream->next_in = input_buffer; compressed_stream->avail_in = insize; compressed_stream->next_out = output_buffer; compressed_stream->avail_out = outsize; - compressed_stream->zalloc = &inflate_malloc; - compressed_stream->zfree = &inflate_free; + compressed_stream->bzalloc = NULL; + compressed_stream->bzfree = NULL; - inflateInit2(compressed_stream, 0); + BZ2_bzDecompressInit(compressed_stream, 0, 0); } @@ -242,7 +233,7 @@ static void init_bitflip_bitarrays(void) { uint8_t line = 0; #endif - z_stream compressed_stream; + bz_stream compressed_stream; char state_files_path[strlen(get_my_executable_directory()) + strlen(STATE_FILES_DIRECTORY) + strlen(STATE_FILE_TEMPLATE) + 1]; char state_file_name[strlen(STATE_FILE_TEMPLATE) + 1]; @@ -276,36 +267,36 @@ static void init_bitflip_bitarrays(void) { } uint32_t filesize = (uint32_t)fsize; rewind(statesfile); - uint8_t input_buffer[filesize]; + char input_buffer[filesize]; size_t bytesread = fread(input_buffer, 1, filesize, statesfile); if (bytesread != filesize) { PrintAndLogEx(ERR, "File read error with %s. Aborting...\n", state_file_name); fclose(statesfile); - //inflateEnd(&compressed_stream); + //BZ2_bzDecompressEnd(&compressed_stream); exit(5); } fclose(statesfile); uint32_t count = 0; - init_inflate(&compressed_stream, input_buffer, filesize, (uint8_t *)&count, sizeof(count)); - int res = inflate(&compressed_stream, Z_SYNC_FLUSH); - if (res != Z_OK) { - PrintAndLogEx(ERR, "Inflate error. Aborting...\n"); - inflateEnd(&compressed_stream); + init_bunzip2(&compressed_stream, input_buffer, filesize, (char *)&count, sizeof(count)); + int res = BZ2_bzDecompress(&compressed_stream); + if (res != BZ_OK) { + PrintAndLogEx(ERR, "Bunzip2 error. Aborting...\n"); + BZ2_bzDecompressEnd(&compressed_stream); exit(4); } if ((float)count / (1 << 24) < IGNORE_BITFLIP_THRESHOLD) { uint32_t *bitset = (uint32_t *)malloc_bitarray(sizeof(uint32_t) * (1 << 19)); if (bitset == NULL) { PrintAndLogEx(ERR, "Out of memory error in init_bitflip_statelists(). Aborting...\n"); - inflateEnd(&compressed_stream); + BZ2_bzDecompressEnd(&compressed_stream); exit(4); } - compressed_stream.next_out = (uint8_t *)bitset; + compressed_stream.next_out = (char *)bitset; compressed_stream.avail_out = sizeof(uint32_t) * (1 << 19); - res = inflate(&compressed_stream, Z_SYNC_FLUSH); - if (res != Z_OK && res != Z_STREAM_END) { - PrintAndLogEx(ERR, "Inflate error. Aborting...\n"); - inflateEnd(&compressed_stream); + res = BZ2_bzDecompress(&compressed_stream); + if (res != BZ_OK && res != BZ_STREAM_END) { + PrintAndLogEx(ERR, "Bunzip2 error. Aborting...\n"); + BZ2_bzDecompressEnd(&compressed_stream); exit(4); } effective_bitflip[odd_even][num_effective_bitflips[odd_even]++] = bitflip; @@ -320,7 +311,7 @@ static void init_bitflip_bitarrays(void) { } #endif } - inflateEnd(&compressed_stream); + BZ2_bzDecompressEnd(&compressed_stream); } } effective_bitflip[odd_even][num_effective_bitflips[odd_even]] = 0x400; // EndOfList marker diff --git a/doc/md/Development/Maintainers.md b/doc/md/Development/Maintainers.md index 293fd3999..66c736235 100644 --- a/doc/md/Development/Maintainers.md +++ b/doc/md/Development/Maintainers.md @@ -65,7 +65,6 @@ It's also possible to skip parts even if libraries are present in the compilatio * `make client SKIPLUASYSTEM=1` to skip system Lua lib even if liblua5.2 is present, use embedded Lua lib instead * `make client SKIPJANSSONSYSTEM=1` to skip system Jansson lib even if libjansson is present, use embedded Jansson lib instead * `make client SKIPWHEREAMISYSTEM=1` to skip system Whereami lib even if libwhereami is present, use embedded whereami lib instead -* `make client SKIPZLIBSYSTEM=1` to skip system Zlib even if libz is present, use embedded Zlib instead If you're cross-compiling, these ones might be useful: diff --git a/doc/md/Installation_Instructions/Linux-Installation-Instructions.md b/doc/md/Installation_Instructions/Linux-Installation-Instructions.md index 8cb6b47ff..578bb429d 100644 --- a/doc/md/Installation_Instructions/Linux-Installation-Instructions.md +++ b/doc/md/Installation_Instructions/Linux-Installation-Instructions.md @@ -25,7 +25,7 @@ Install the requirements ```sh sudo apt-get install --no-install-recommends git ca-certificates build-essential pkg-config \ -libreadline-dev gcc-arm-none-eabi libnewlib-dev qtbase5-dev libbluetooth-dev +libreadline-dev gcc-arm-none-eabi libnewlib-dev qtbase5-dev libbz2-dev libbluetooth-dev ``` If you don't need the native Bluetooth support in the client, you can skip the installation of `libbluetooth-dev`. diff --git a/doc/md/Installation_Instructions/Windows-Installation-Instructions.md b/doc/md/Installation_Instructions/Windows-Installation-Instructions.md index 9d94490f5..2741850d5 100644 --- a/doc/md/Installation_Instructions/Windows-Installation-Instructions.md +++ b/doc/md/Installation_Instructions/Windows-Installation-Instructions.md @@ -77,7 +77,7 @@ Enter WSL prompt (`wsl`) and from there, follow the [Linux Installation Instruct ```sh sudo apt-get update sudo apt-get install --no-install-recommends git ca-certificates build-essential pkg-config \ -libreadline-dev gcc-arm-none-eabi libnewlib-dev qtbase5-dev +libreadline-dev gcc-arm-none-eabi libnewlib-dev libbz2-dev qtbase5-dev ``` If you don't need the graphical components of the Proxmark3 client, you can skip the installation of `qtbase5-dev`. diff --git a/tools/pm3_tests.sh b/tools/pm3_tests.sh index 07e777fae..00af93ba5 100755 --- a/tools/pm3_tests.sh +++ b/tools/pm3_tests.sh @@ -220,7 +220,7 @@ echo "" while true; do if $TESTALL || $TESTCOMMON; then echo -e "\n${C_BLUE}Testing common:${C_NC}" - if ! CheckFileExist "hardnested tables exists" "./client/resources/hardnested_tables/bitflip_0_001_states.bin.z"; then break; fi + if ! CheckFileExist "hardnested tables exists" "./client/resources/hardnested_tables/bitflip_0_001_states.bin.bz2"; then break; fi if ! CheckFileExist "simmodule fw file exists" "./tools/simmodule/sim011.bin"; then break; fi echo -e "\n${C_BLUE}Testing tools:${C_NC}" if ! CheckExecute "xorcheck test" "tools/xorcheck.py 04 00 80 64 ba" "final LRC XOR byte value: 5A"; then break; fi From fa0b658436dfa216182e1e9a5394603f7f6d53c1 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Mon, 8 Jun 2020 02:45:09 +0200 Subject: [PATCH 545/632] Remove zlib entirely, no need for fpga_compress anymore to compress hardnested tables, now to be compressed with bzip2 --- CHANGELOG.md | 5 +- common/zlib/ChangeLog | 1515 ----------- common/zlib/FAQ | 368 --- common/zlib/Makefile | 10 - common/zlib/README | 115 - common/zlib/README_proxmark3 | 63 - common/zlib/adler32.c | 187 -- common/zlib/deflate.c | 2257 ----------------- common/zlib/deflate.h | 350 --- common/zlib/inffast.c | 315 --- common/zlib/inffast.h | 12 - common/zlib/inffixed.h | 95 - common/zlib/inflate.c | 1561 ------------ common/zlib/inflate.h | 130 - common/zlib/inftrees.c | 306 --- common/zlib/inftrees.h | 63 - common/zlib/trees.c | 1222 --------- common/zlib/trees.h | 129 - common/zlib/zconf.h | 535 ---- common/zlib/zlib.h | 1924 -------------- common/zlib/zutil.c | 344 --- common/zlib/zutil.h | 272 -- .../Linux-Installation-Instructions.md | 6 +- tools/fpga_compress/fpga_compress.c | 42 +- 24 files changed, 15 insertions(+), 11811 deletions(-) delete mode 100644 common/zlib/ChangeLog delete mode 100644 common/zlib/FAQ delete mode 100644 common/zlib/Makefile delete mode 100644 common/zlib/README delete mode 100644 common/zlib/README_proxmark3 delete mode 100644 common/zlib/adler32.c delete mode 100644 common/zlib/deflate.c delete mode 100644 common/zlib/deflate.h delete mode 100644 common/zlib/inffast.c delete mode 100644 common/zlib/inffast.h delete mode 100644 common/zlib/inffixed.h delete mode 100644 common/zlib/inflate.c delete mode 100644 common/zlib/inflate.h delete mode 100644 common/zlib/inftrees.c delete mode 100644 common/zlib/inftrees.h delete mode 100644 common/zlib/trees.c delete mode 100644 common/zlib/trees.h delete mode 100644 common/zlib/zconf.h delete mode 100644 common/zlib/zlib.h delete mode 100644 common/zlib/zutil.c delete mode 100644 common/zlib/zutil.h diff --git a/CHANGELOG.md b/CHANGELOG.md index f0f70916b..fe1ee7560 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,8 +3,9 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] - - Change pushed some ARM source to compile with THUMB. Saves a lot of space of ARM flash memory @slurdge - - Change from using ZLIB compression of FPGA images in ARM to LZ4. 15%+ speedups when swapping between HF & LF now @slurdge + - Change use system Bzip2 library instead of Zlib for hardnested tables, tables are now 7x smaller (@doegox) + - Change pushed some ARM source to compile with THUMB. Saves a lot of space of ARM flash memory (@slurdge) + - Change from using ZLIB compression of FPGA images in ARM to LZ4. 15%+ speedups when swapping between HF & LF now (@slurdge) - Fix `emv scan -w` - hash mismatch, solution similar to below (@iceman1001) - Fix 'emv roca' - hash mismatch, merged from offical repo (@pwpiwi) - Fix 'lf ti demod' - now calculates correct crc (@iceman1001) diff --git a/common/zlib/ChangeLog b/common/zlib/ChangeLog deleted file mode 100644 index 30199a65a..000000000 --- a/common/zlib/ChangeLog +++ /dev/null @@ -1,1515 +0,0 @@ - - ChangeLog file for zlib - -Changes in 1.2.11 (15 Jan 2017) -- Fix deflate stored bug when pulling last block from window -- Permit immediate deflateParams changes before any deflate input - -Changes in 1.2.10 (2 Jan 2017) -- Avoid warnings on snprintf() return value -- Fix bug in deflate_stored() for zero-length input -- Fix bug in gzwrite.c that produced corrupt gzip files -- Remove files to be installed before copying them in Makefile.in -- Add warnings when compiling with assembler code - -Changes in 1.2.9 (31 Dec 2016) -- Fix contrib/minizip to permit unzipping with desktop API [Zouzou] -- Improve contrib/blast to return unused bytes -- Assure that gzoffset() is correct when appending -- Improve compress() and uncompress() to support large lengths -- Fix bug in test/example.c where error code not saved -- Remedy Coverity warning [Randers-Pehrson] -- Improve speed of gzprintf() in transparent mode -- Fix inflateInit2() bug when windowBits is 16 or 32 -- Change DEBUG macro to ZLIB_DEBUG -- Avoid uninitialized access by gzclose_w() -- Allow building zlib outside of the source directory -- Fix bug that accepted invalid zlib header when windowBits is zero -- Fix gzseek() problem on MinGW due to buggy _lseeki64 there -- Loop on write() calls in gzwrite.c in case of non-blocking I/O -- Add --warn (-w) option to ./configure for more compiler warnings -- Reject a window size of 256 bytes if not using the zlib wrapper -- Fix bug when level 0 used with Z_HUFFMAN or Z_RLE -- Add --debug (-d) option to ./configure to define ZLIB_DEBUG -- Fix bugs in creating a very large gzip header -- Add uncompress2() function, which returns the input size used -- Assure that deflateParams() will not switch functions mid-block -- Dramatically speed up deflation for level 0 (storing) -- Add gzfread(), duplicating the interface of fread() -- Add gzfwrite(), duplicating the interface of fwrite() -- Add deflateGetDictionary() function -- Use snprintf() for later versions of Microsoft C -- Fix *Init macros to use z_ prefix when requested -- Replace as400 with os400 for OS/400 support [Monnerat] -- Add crc32_z() and adler32_z() functions with size_t lengths -- Update Visual Studio project files [AraHaan] - -Changes in 1.2.8 (28 Apr 2013) -- Update contrib/minizip/iowin32.c for Windows RT [Vollant] -- Do not force Z_CONST for C++ -- Clean up contrib/vstudio [Roß] -- Correct spelling error in zlib.h -- Fix mixed line endings in contrib/vstudio - -Changes in 1.2.7.3 (13 Apr 2013) -- Fix version numbers and DLL names in contrib/vstudio/*/zlib.rc - -Changes in 1.2.7.2 (13 Apr 2013) -- Change check for a four-byte type back to hexadecimal -- Fix typo in win32/Makefile.msc -- Add casts in gzwrite.c for pointer differences - -Changes in 1.2.7.1 (24 Mar 2013) -- Replace use of unsafe string functions with snprintf if available -- Avoid including stddef.h on Windows for Z_SOLO compile [Niessink] -- Fix gzgetc undefine when Z_PREFIX set [Turk] -- Eliminate use of mktemp in Makefile (not always available) -- Fix bug in 'F' mode for gzopen() -- Add inflateGetDictionary() function -- Correct comment in deflate.h -- Use _snprintf for snprintf in Microsoft C -- On Darwin, only use /usr/bin/libtool if libtool is not Apple -- Delete "--version" file if created by "ar --version" [Richard G.] -- Fix configure check for veracity of compiler error return codes -- Fix CMake compilation of static lib for MSVC2010 x64 -- Remove unused variable in infback9.c -- Fix argument checks in gzlog_compress() and gzlog_write() -- Clean up the usage of z_const and respect const usage within zlib -- Clean up examples/gzlog.[ch] comparisons of different types -- Avoid shift equal to bits in type (caused endless loop) -- Fix uninitialized value bug in gzputc() introduced by const patches -- Fix memory allocation error in examples/zran.c [Nor] -- Fix bug where gzopen(), gzclose() would write an empty file -- Fix bug in gzclose() when gzwrite() runs out of memory -- Check for input buffer malloc failure in examples/gzappend.c -- Add note to contrib/blast to use binary mode in stdio -- Fix comparisons of differently signed integers in contrib/blast -- Check for invalid code length codes in contrib/puff -- Fix serious but very rare decompression bug in inftrees.c -- Update inflateBack() comments, since inflate() can be faster -- Use underscored I/O function names for WINAPI_FAMILY -- Add _tr_flush_bits to the external symbols prefixed by --zprefix -- Add contrib/vstudio/vc10 pre-build step for static only -- Quote --version-script argument in CMakeLists.txt -- Don't specify --version-script on Apple platforms in CMakeLists.txt -- Fix casting error in contrib/testzlib/testzlib.c -- Fix types in contrib/minizip to match result of get_crc_table() -- Simplify contrib/vstudio/vc10 with 'd' suffix -- Add TOP support to win32/Makefile.msc -- Suport i686 and amd64 assembler builds in CMakeLists.txt -- Fix typos in the use of _LARGEFILE64_SOURCE in zconf.h -- Add vc11 and vc12 build files to contrib/vstudio -- Add gzvprintf() as an undocumented function in zlib -- Fix configure for Sun shell -- Remove runtime check in configure for four-byte integer type -- Add casts and consts to ease user conversion to C++ -- Add man pages for minizip and miniunzip -- In Makefile uninstall, don't rm if preceding cd fails -- Do not return Z_BUF_ERROR if deflateParam() has nothing to write - -Changes in 1.2.7 (2 May 2012) -- Replace use of memmove() with a simple copy for portability -- Test for existence of strerror -- Restore gzgetc_ for backward compatibility with 1.2.6 -- Fix build with non-GNU make on Solaris -- Require gcc 4.0 or later on Mac OS X to use the hidden attribute -- Include unistd.h for Watcom C -- Use __WATCOMC__ instead of __WATCOM__ -- Do not use the visibility attribute if NO_VIZ defined -- Improve the detection of no hidden visibility attribute -- Avoid using __int64 for gcc or solo compilation -- Cast to char * in gzprintf to avoid warnings [Zinser] -- Fix make_vms.com for VAX [Zinser] -- Don't use library or built-in byte swaps -- Simplify test and use of gcc hidden attribute -- Fix bug in gzclose_w() when gzwrite() fails to allocate memory -- Add "x" (O_EXCL) and "e" (O_CLOEXEC) modes support to gzopen() -- Fix bug in test/minigzip.c for configure --solo -- Fix contrib/vstudio project link errors [Mohanathas] -- Add ability to choose the builder in make_vms.com [Schweda] -- Add DESTDIR support to mingw32 win32/Makefile.gcc -- Fix comments in win32/Makefile.gcc for proper usage -- Allow overriding the default install locations for cmake -- Generate and install the pkg-config file with cmake -- Build both a static and a shared version of zlib with cmake -- Include version symbols for cmake builds -- If using cmake with MSVC, add the source directory to the includes -- Remove unneeded EXTRA_CFLAGS from win32/Makefile.gcc [Truta] -- Move obsolete emx makefile to old [Truta] -- Allow the use of -Wundef when compiling or using zlib -- Avoid the use of the -u option with mktemp -- Improve inflate() documentation on the use of Z_FINISH -- Recognize clang as gcc -- Add gzopen_w() in Windows for wide character path names -- Rename zconf.h in CMakeLists.txt to move it out of the way -- Add source directory in CMakeLists.txt for building examples -- Look in build directory for zlib.pc in CMakeLists.txt -- Remove gzflags from zlibvc.def in vc9 and vc10 -- Fix contrib/minizip compilation in the MinGW environment -- Update ./configure for Solaris, support --64 [Mooney] -- Remove -R. from Solaris shared build (possible security issue) -- Avoid race condition for parallel make (-j) running example -- Fix type mismatch between get_crc_table() and crc_table -- Fix parsing of version with "-" in CMakeLists.txt [Snider, Ziegler] -- Fix the path to zlib.map in CMakeLists.txt -- Force the native libtool in Mac OS X to avoid GNU libtool [Beebe] -- Add instructions to win32/Makefile.gcc for shared install [Torri] - -Changes in 1.2.6.1 (12 Feb 2012) -- Avoid the use of the Objective-C reserved name "id" -- Include io.h in gzguts.h for Microsoft compilers -- Fix problem with ./configure --prefix and gzgetc macro -- Include gz_header definition when compiling zlib solo -- Put gzflags() functionality back in zutil.c -- Avoid library header include in crc32.c for Z_SOLO -- Use name in GCC_CLASSIC as C compiler for coverage testing, if set -- Minor cleanup in contrib/minizip/zip.c [Vollant] -- Update make_vms.com [Zinser] -- Remove unnecessary gzgetc_ function -- Use optimized byte swap operations for Microsoft and GNU [Snyder] -- Fix minor typo in zlib.h comments [Rzesniowiecki] - -Changes in 1.2.6 (29 Jan 2012) -- Update the Pascal interface in contrib/pascal -- Fix function numbers for gzgetc_ in zlibvc.def files -- Fix configure.ac for contrib/minizip [Schiffer] -- Fix large-entry detection in minizip on 64-bit systems [Schiffer] -- Have ./configure use the compiler return code for error indication -- Fix CMakeLists.txt for cross compilation [McClure] -- Fix contrib/minizip/zip.c for 64-bit architectures [Dalsnes] -- Fix compilation of contrib/minizip on FreeBSD [Marquez] -- Correct suggested usages in win32/Makefile.msc [Shachar, Horvath] -- Include io.h for Turbo C / Borland C on all platforms [Truta] -- Make version explicit in contrib/minizip/configure.ac [Bosmans] -- Avoid warning for no encryption in contrib/minizip/zip.c [Vollant] -- Minor cleanup up contrib/minizip/unzip.c [Vollant] -- Fix bug when compiling minizip with C++ [Vollant] -- Protect for long name and extra fields in contrib/minizip [Vollant] -- Avoid some warnings in contrib/minizip [Vollant] -- Add -I../.. -L../.. to CFLAGS for minizip and miniunzip -- Add missing libs to minizip linker command -- Add support for VPATH builds in contrib/minizip -- Add an --enable-demos option to contrib/minizip/configure -- Add the generation of configure.log by ./configure -- Exit when required parameters not provided to win32/Makefile.gcc -- Have gzputc return the character written instead of the argument -- Use the -m option on ldconfig for BSD systems [Tobias] -- Correct in zlib.map when deflateResetKeep was added - -Changes in 1.2.5.3 (15 Jan 2012) -- Restore gzgetc function for binary compatibility -- Do not use _lseeki64 under Borland C++ [Truta] -- Update win32/Makefile.msc to build test/*.c [Truta] -- Remove old/visualc6 given CMakefile and other alternatives -- Update AS400 build files and documentation [Monnerat] -- Update win32/Makefile.gcc to build test/*.c [Truta] -- Permit stronger flushes after Z_BLOCK flushes -- Avoid extraneous empty blocks when doing empty flushes -- Permit Z_NULL arguments to deflatePending -- Allow deflatePrime() to insert bits in the middle of a stream -- Remove second empty static block for Z_PARTIAL_FLUSH -- Write out all of the available bits when using Z_BLOCK -- Insert the first two strings in the hash table after a flush - -Changes in 1.2.5.2 (17 Dec 2011) -- fix ld error: unable to find version dependency 'ZLIB_1.2.5' -- use relative symlinks for shared libs -- Avoid searching past window for Z_RLE strategy -- Assure that high-water mark initialization is always applied in deflate -- Add assertions to fill_window() in deflate.c to match comments -- Update python link in README -- Correct spelling error in gzread.c -- Fix bug in gzgets() for a concatenated empty gzip stream -- Correct error in comment for gz_make() -- Change gzread() and related to ignore junk after gzip streams -- Allow gzread() and related to continue after gzclearerr() -- Allow gzrewind() and gzseek() after a premature end-of-file -- Simplify gzseek() now that raw after gzip is ignored -- Change gzgetc() to a macro for speed (~40% speedup in testing) -- Fix gzclose() to return the actual error last encountered -- Always add large file support for windows -- Include zconf.h for windows large file support -- Include zconf.h.cmakein for windows large file support -- Update zconf.h.cmakein on make distclean -- Merge vestigial vsnprintf determination from zutil.h to gzguts.h -- Clarify how gzopen() appends in zlib.h comments -- Correct documentation of gzdirect() since junk at end now ignored -- Add a transparent write mode to gzopen() when 'T' is in the mode -- Update python link in zlib man page -- Get inffixed.h and MAKEFIXED result to match -- Add a ./config --solo option to make zlib subset with no library use -- Add undocumented inflateResetKeep() function for CAB file decoding -- Add --cover option to ./configure for gcc coverage testing -- Add #define ZLIB_CONST option to use const in the z_stream interface -- Add comment to gzdopen() in zlib.h to use dup() when using fileno() -- Note behavior of uncompress() to provide as much data as it can -- Add files in contrib/minizip to aid in building libminizip -- Split off AR options in Makefile.in and configure -- Change ON macro to Z_ARG to avoid application conflicts -- Facilitate compilation with Borland C++ for pragmas and vsnprintf -- Include io.h for Turbo C / Borland C++ -- Move example.c and minigzip.c to test/ -- Simplify incomplete code table filling in inflate_table() -- Remove code from inflate.c and infback.c that is impossible to execute -- Test the inflate code with full coverage -- Allow deflateSetDictionary, inflateSetDictionary at any time (in raw) -- Add deflateResetKeep and fix inflateResetKeep to retain dictionary -- Fix gzwrite.c to accommodate reduced memory zlib compilation -- Have inflate() with Z_FINISH avoid the allocation of a window -- Do not set strm->adler when doing raw inflate -- Fix gzeof() to behave just like feof() when read is not past end of file -- Fix bug in gzread.c when end-of-file is reached -- Avoid use of Z_BUF_ERROR in gz* functions except for premature EOF -- Document gzread() capability to read concurrently written files -- Remove hard-coding of resource compiler in CMakeLists.txt [Blammo] - -Changes in 1.2.5.1 (10 Sep 2011) -- Update FAQ entry on shared builds (#13) -- Avoid symbolic argument to chmod in Makefile.in -- Fix bug and add consts in contrib/puff [Oberhumer] -- Update contrib/puff/zeros.raw test file to have all block types -- Add full coverage test for puff in contrib/puff/Makefile -- Fix static-only-build install in Makefile.in -- Fix bug in unzGetCurrentFileInfo() in contrib/minizip [Kuno] -- Add libz.a dependency to shared in Makefile.in for parallel builds -- Spell out "number" (instead of "nb") in zlib.h for total_in, total_out -- Replace $(...) with `...` in configure for non-bash sh [Bowler] -- Add darwin* to Darwin* and solaris* to SunOS\ 5* in configure [Groffen] -- Add solaris* to Linux* in configure to allow gcc use [Groffen] -- Add *bsd* to Linux* case in configure [Bar-Lev] -- Add inffast.obj to dependencies in win32/Makefile.msc -- Correct spelling error in deflate.h [Kohler] -- Change libzdll.a again to libz.dll.a (!) in win32/Makefile.gcc -- Add test to configure for GNU C looking for gcc in output of $cc -v -- Add zlib.pc generation to win32/Makefile.gcc [Weigelt] -- Fix bug in zlib.h for _FILE_OFFSET_BITS set and _LARGEFILE64_SOURCE not -- Add comment in zlib.h that adler32_combine with len2 < 0 makes no sense -- Make NO_DIVIDE option in adler32.c much faster (thanks to John Reiser) -- Make stronger test in zconf.h to include unistd.h for LFS -- Apply Darwin patches for 64-bit file offsets to contrib/minizip [Slack] -- Fix zlib.h LFS support when Z_PREFIX used -- Add updated as400 support (removed from old) [Monnerat] -- Avoid deflate sensitivity to volatile input data -- Avoid division in adler32_combine for NO_DIVIDE -- Clarify the use of Z_FINISH with deflateBound() amount of space -- Set binary for output file in puff.c -- Use u4 type for crc_table to avoid conversion warnings -- Apply casts in zlib.h to avoid conversion warnings -- Add OF to prototypes for adler32_combine_ and crc32_combine_ [Miller] -- Improve inflateSync() documentation to note indeterminancy -- Add deflatePending() function to return the amount of pending output -- Correct the spelling of "specification" in FAQ [Randers-Pehrson] -- Add a check in configure for stdarg.h, use for gzprintf() -- Check that pointers fit in ints when gzprint() compiled old style -- Add dummy name before $(SHAREDLIBV) in Makefile [Bar-Lev, Bowler] -- Delete line in configure that adds -L. libz.a to LDFLAGS [Weigelt] -- Add debug records in assmebler code [Londer] -- Update RFC references to use http://tools.ietf.org/html/... [Li] -- Add --archs option, use of libtool to configure for Mac OS X [Borstel] - -Changes in 1.2.5 (19 Apr 2010) -- Disable visibility attribute in win32/Makefile.gcc [Bar-Lev] -- Default to libdir as sharedlibdir in configure [Nieder] -- Update copyright dates on modified source files -- Update trees.c to be able to generate modified trees.h -- Exit configure for MinGW, suggesting win32/Makefile.gcc -- Check for NULL path in gz_open [Homurlu] - -Changes in 1.2.4.5 (18 Apr 2010) -- Set sharedlibdir in configure [Torok] -- Set LDFLAGS in Makefile.in [Bar-Lev] -- Avoid mkdir objs race condition in Makefile.in [Bowler] -- Add ZLIB_INTERNAL in front of internal inter-module functions and arrays -- Define ZLIB_INTERNAL to hide internal functions and arrays for GNU C -- Don't use hidden attribute when it is a warning generator (e.g. Solaris) - -Changes in 1.2.4.4 (18 Apr 2010) -- Fix CROSS_PREFIX executable testing, CHOST extract, mingw* [Torok] -- Undefine _LARGEFILE64_SOURCE in zconf.h if it is zero, but not if empty -- Try to use bash or ksh regardless of functionality of /bin/sh -- Fix configure incompatibility with NetBSD sh -- Remove attempt to run under bash or ksh since have better NetBSD fix -- Fix win32/Makefile.gcc for MinGW [Bar-Lev] -- Add diagnostic messages when using CROSS_PREFIX in configure -- Added --sharedlibdir option to configure [Weigelt] -- Use hidden visibility attribute when available [Frysinger] - -Changes in 1.2.4.3 (10 Apr 2010) -- Only use CROSS_PREFIX in configure for ar and ranlib if they exist -- Use CROSS_PREFIX for nm [Bar-Lev] -- Assume _LARGEFILE64_SOURCE defined is equivalent to true -- Avoid use of undefined symbols in #if with && and || -- Make *64 prototypes in gzguts.h consistent with functions -- Add -shared load option for MinGW in configure [Bowler] -- Move z_off64_t to public interface, use instead of off64_t -- Remove ! from shell test in configure (not portable to Solaris) -- Change +0 macro tests to -0 for possibly increased portability - -Changes in 1.2.4.2 (9 Apr 2010) -- Add consistent carriage returns to readme.txt's in masmx86 and masmx64 -- Really provide prototypes for *64 functions when building without LFS -- Only define unlink() in minigzip.c if unistd.h not included -- Update README to point to contrib/vstudio project files -- Move projects/vc6 to old/ and remove projects/ -- Include stdlib.h in minigzip.c for setmode() definition under WinCE -- Clean up assembler builds in win32/Makefile.msc [Rowe] -- Include sys/types.h for Microsoft for off_t definition -- Fix memory leak on error in gz_open() -- Symbolize nm as $NM in configure [Weigelt] -- Use TEST_LDSHARED instead of LDSHARED to link test programs [Weigelt] -- Add +0 to _FILE_OFFSET_BITS and _LFS64_LARGEFILE in case not defined -- Fix bug in gzeof() to take into account unused input data -- Avoid initialization of structures with variables in puff.c -- Updated win32/README-WIN32.txt [Rowe] - -Changes in 1.2.4.1 (28 Mar 2010) -- Remove the use of [a-z] constructs for sed in configure [gentoo 310225] -- Remove $(SHAREDLIB) from LIBS in Makefile.in [Creech] -- Restore "for debugging" comment on sprintf() in gzlib.c -- Remove fdopen for MVS from gzguts.h -- Put new README-WIN32.txt in win32 [Rowe] -- Add check for shell to configure and invoke another shell if needed -- Fix big fat stinking bug in gzseek() on uncompressed files -- Remove vestigial F_OPEN64 define in zutil.h -- Set and check the value of _LARGEFILE_SOURCE and _LARGEFILE64_SOURCE -- Avoid errors on non-LFS systems when applications define LFS macros -- Set EXE to ".exe" in configure for MINGW [Kahle] -- Match crc32() in crc32.c exactly to the prototype in zlib.h [Sherrill] -- Add prefix for cross-compilation in win32/makefile.gcc [Bar-Lev] -- Add DLL install in win32/makefile.gcc [Bar-Lev] -- Allow Linux* or linux* from uname in configure [Bar-Lev] -- Allow ldconfig to be redefined in configure and Makefile.in [Bar-Lev] -- Add cross-compilation prefixes to configure [Bar-Lev] -- Match type exactly in gz_load() invocation in gzread.c -- Match type exactly of zcalloc() in zutil.c to zlib.h alloc_func -- Provide prototypes for *64 functions when building zlib without LFS -- Don't use -lc when linking shared library on MinGW -- Remove errno.h check in configure and vestigial errno code in zutil.h - -Changes in 1.2.4 (14 Mar 2010) -- Fix VER3 extraction in configure for no fourth subversion -- Update zlib.3, add docs to Makefile.in to make .pdf out of it -- Add zlib.3.pdf to distribution -- Don't set error code in gzerror() if passed pointer is NULL -- Apply destination directory fixes to CMakeLists.txt [Lowman] -- Move #cmakedefine's to a new zconf.in.cmakein -- Restore zconf.h for builds that don't use configure or cmake -- Add distclean to dummy Makefile for convenience -- Update and improve INDEX, README, and FAQ -- Update CMakeLists.txt for the return of zconf.h [Lowman] -- Update contrib/vstudio/vc9 and vc10 [Vollant] -- Change libz.dll.a back to libzdll.a in win32/Makefile.gcc -- Apply license and readme changes to contrib/asm686 [Raiter] -- Check file name lengths and add -c option in minigzip.c [Li] -- Update contrib/amd64 and contrib/masmx86/ [Vollant] -- Avoid use of "eof" parameter in trees.c to not shadow library variable -- Update make_vms.com for removal of zlibdefs.h [Zinser] -- Update assembler code and vstudio projects in contrib [Vollant] -- Remove outdated assembler code contrib/masm686 and contrib/asm586 -- Remove old vc7 and vc8 from contrib/vstudio -- Update win32/Makefile.msc, add ZLIB_VER_SUBREVISION [Rowe] -- Fix memory leaks in gzclose_r() and gzclose_w(), file leak in gz_open() -- Add contrib/gcc_gvmat64 for longest_match and inflate_fast [Vollant] -- Remove *64 functions from win32/zlib.def (they're not 64-bit yet) -- Fix bug in void-returning vsprintf() case in gzwrite.c -- Fix name change from inflate.h in contrib/inflate86/inffas86.c -- Check if temporary file exists before removing in make_vms.com [Zinser] -- Fix make install and uninstall for --static option -- Fix usage of _MSC_VER in gzguts.h and zutil.h [Truta] -- Update readme.txt in contrib/masmx64 and masmx86 to assemble - -Changes in 1.2.3.9 (21 Feb 2010) -- Expunge gzio.c -- Move as400 build information to old -- Fix updates in contrib/minizip and contrib/vstudio -- Add const to vsnprintf test in configure to avoid warnings [Weigelt] -- Delete zconf.h (made by configure) [Weigelt] -- Change zconf.in.h to zconf.h.in per convention [Weigelt] -- Check for NULL buf in gzgets() -- Return empty string for gzgets() with len == 1 (like fgets()) -- Fix description of gzgets() in zlib.h for end-of-file, NULL return -- Update minizip to 1.1 [Vollant] -- Avoid MSVC loss of data warnings in gzread.c, gzwrite.c -- Note in zlib.h that gzerror() should be used to distinguish from EOF -- Remove use of snprintf() from gzlib.c -- Fix bug in gzseek() -- Update contrib/vstudio, adding vc9 and vc10 [Kuno, Vollant] -- Fix zconf.h generation in CMakeLists.txt [Lowman] -- Improve comments in zconf.h where modified by configure - -Changes in 1.2.3.8 (13 Feb 2010) -- Clean up text files (tabs, trailing whitespace, etc.) [Oberhumer] -- Use z_off64_t in gz_zero() and gz_skip() to match state->skip -- Avoid comparison problem when sizeof(int) == sizeof(z_off64_t) -- Revert to Makefile.in from 1.2.3.6 (live with the clutter) -- Fix missing error return in gzflush(), add zlib.h note -- Add *64 functions to zlib.map [Levin] -- Fix signed/unsigned comparison in gz_comp() -- Use SFLAGS when testing shared linking in configure -- Add --64 option to ./configure to use -m64 with gcc -- Fix ./configure --help to correctly name options -- Have make fail if a test fails [Levin] -- Avoid buffer overrun in contrib/masmx64/gvmat64.asm [Simpson] -- Remove assembler object files from contrib - -Changes in 1.2.3.7 (24 Jan 2010) -- Always gzopen() with O_LARGEFILE if available -- Fix gzdirect() to work immediately after gzopen() or gzdopen() -- Make gzdirect() more precise when the state changes while reading -- Improve zlib.h documentation in many places -- Catch memory allocation failure in gz_open() -- Complete close operation if seek forward in gzclose_w() fails -- Return Z_ERRNO from gzclose_r() if close() fails -- Return Z_STREAM_ERROR instead of EOF for gzclose() being passed NULL -- Return zero for gzwrite() errors to match zlib.h description -- Return -1 on gzputs() error to match zlib.h description -- Add zconf.in.h to allow recovery from configure modification [Weigelt] -- Fix static library permissions in Makefile.in [Weigelt] -- Avoid warnings in configure tests that hide functionality [Weigelt] -- Add *BSD and DragonFly to Linux case in configure [gentoo 123571] -- Change libzdll.a to libz.dll.a in win32/Makefile.gcc [gentoo 288212] -- Avoid access of uninitialized data for first inflateReset2 call [Gomes] -- Keep object files in subdirectories to reduce the clutter somewhat -- Remove default Makefile and zlibdefs.h, add dummy Makefile -- Add new external functions to Z_PREFIX, remove duplicates, z_z_ -> z_ -- Remove zlibdefs.h completely -- modify zconf.h instead - -Changes in 1.2.3.6 (17 Jan 2010) -- Avoid void * arithmetic in gzread.c and gzwrite.c -- Make compilers happier with const char * for gz_error message -- Avoid unused parameter warning in inflate.c -- Avoid signed-unsigned comparison warning in inflate.c -- Indent #pragma's for traditional C -- Fix usage of strwinerror() in glib.c, change to gz_strwinerror() -- Correct email address in configure for system options -- Update make_vms.com and add make_vms.com to contrib/minizip [Zinser] -- Update zlib.map [Brown] -- Fix Makefile.in for Solaris 10 make of example64 and minizip64 [Torok] -- Apply various fixes to CMakeLists.txt [Lowman] -- Add checks on len in gzread() and gzwrite() -- Add error message for no more room for gzungetc() -- Remove zlib version check in gzwrite() -- Defer compression of gzprintf() result until need to -- Use snprintf() in gzdopen() if available -- Remove USE_MMAP configuration determination (only used by minigzip) -- Remove examples/pigz.c (available separately) -- Update examples/gun.c to 1.6 - -Changes in 1.2.3.5 (8 Jan 2010) -- Add space after #if in zutil.h for some compilers -- Fix relatively harmless bug in deflate_fast() [Exarevsky] -- Fix same problem in deflate_slow() -- Add $(SHAREDLIBV) to LIBS in Makefile.in [Brown] -- Add deflate_rle() for faster Z_RLE strategy run-length encoding -- Add deflate_huff() for faster Z_HUFFMAN_ONLY encoding -- Change name of "write" variable in inffast.c to avoid library collisions -- Fix premature EOF from gzread() in gzio.c [Brown] -- Use zlib header window size if windowBits is 0 in inflateInit2() -- Remove compressBound() call in deflate.c to avoid linking compress.o -- Replace use of errno in gz* with functions, support WinCE [Alves] -- Provide alternative to perror() in minigzip.c for WinCE [Alves] -- Don't use _vsnprintf on later versions of MSVC [Lowman] -- Add CMake build script and input file [Lowman] -- Update contrib/minizip to 1.1 [Svensson, Vollant] -- Moved nintendods directory from contrib to . -- Replace gzio.c with a new set of routines with the same functionality -- Add gzbuffer(), gzoffset(), gzclose_r(), gzclose_w() as part of above -- Update contrib/minizip to 1.1b -- Change gzeof() to return 0 on error instead of -1 to agree with zlib.h - -Changes in 1.2.3.4 (21 Dec 2009) -- Use old school .SUFFIXES in Makefile.in for FreeBSD compatibility -- Update comments in configure and Makefile.in for default --shared -- Fix test -z's in configure [Marquess] -- Build examplesh and minigzipsh when not testing -- Change NULL's to Z_NULL's in deflate.c and in comments in zlib.h -- Import LDFLAGS from the environment in configure -- Fix configure to populate SFLAGS with discovered CFLAGS options -- Adapt make_vms.com to the new Makefile.in [Zinser] -- Add zlib2ansi script for C++ compilation [Marquess] -- Add _FILE_OFFSET_BITS=64 test to make test (when applicable) -- Add AMD64 assembler code for longest match to contrib [Teterin] -- Include options from $SFLAGS when doing $LDSHARED -- Simplify 64-bit file support by introducing z_off64_t type -- Make shared object files in objs directory to work around old Sun cc -- Use only three-part version number for Darwin shared compiles -- Add rc option to ar in Makefile.in for when ./configure not run -- Add -WI,-rpath,. to LDFLAGS for OSF 1 V4* -- Set LD_LIBRARYN32_PATH for SGI IRIX shared compile -- Protect against _FILE_OFFSET_BITS being defined when compiling zlib -- Rename Makefile.in targets allstatic to static and allshared to shared -- Fix static and shared Makefile.in targets to be independent -- Correct error return bug in gz_open() by setting state [Brown] -- Put spaces before ;;'s in configure for better sh compatibility -- Add pigz.c (parallel implementation of gzip) to examples/ -- Correct constant in crc32.c to UL [Leventhal] -- Reject negative lengths in crc32_combine() -- Add inflateReset2() function to work like inflateEnd()/inflateInit2() -- Include sys/types.h for _LARGEFILE64_SOURCE [Brown] -- Correct typo in doc/algorithm.txt [Janik] -- Fix bug in adler32_combine() [Zhu] -- Catch missing-end-of-block-code error in all inflates and in puff - Assures that random input to inflate eventually results in an error -- Added enough.c (calculation of ENOUGH for inftrees.h) to examples/ -- Update ENOUGH and its usage to reflect discovered bounds -- Fix gzerror() error report on empty input file [Brown] -- Add ush casts in trees.c to avoid pedantic runtime errors -- Fix typo in zlib.h uncompress() description [Reiss] -- Correct inflate() comments with regard to automatic header detection -- Remove deprecation comment on Z_PARTIAL_FLUSH (it stays) -- Put new version of gzlog (2.0) in examples with interruption recovery -- Add puff compile option to permit invalid distance-too-far streams -- Add puff TEST command options, ability to read piped input -- Prototype the *64 functions in zlib.h when _FILE_OFFSET_BITS == 64, but - _LARGEFILE64_SOURCE not defined -- Fix Z_FULL_FLUSH to truly erase the past by resetting s->strstart -- Fix deflateSetDictionary() to use all 32K for output consistency -- Remove extraneous #define MIN_LOOKAHEAD in deflate.c (in deflate.h) -- Clear bytes after deflate lookahead to avoid use of uninitialized data -- Change a limit in inftrees.c to be more transparent to Coverity Prevent -- Update win32/zlib.def with exported symbols from zlib.h -- Correct spelling errors in zlib.h [Willem, Sobrado] -- Allow Z_BLOCK for deflate() to force a new block -- Allow negative bits in inflatePrime() to delete existing bit buffer -- Add Z_TREES flush option to inflate() to return at end of trees -- Add inflateMark() to return current state information for random access -- Add Makefile for NintendoDS to contrib [Costa] -- Add -w in configure compile tests to avoid spurious warnings [Beucler] -- Fix typos in zlib.h comments for deflateSetDictionary() -- Fix EOF detection in transparent gzread() [Maier] - -Changes in 1.2.3.3 (2 October 2006) -- Make --shared the default for configure, add a --static option -- Add compile option to permit invalid distance-too-far streams -- Add inflateUndermine() function which is required to enable above -- Remove use of "this" variable name for C++ compatibility [Marquess] -- Add testing of shared library in make test, if shared library built -- Use ftello() and fseeko() if available instead of ftell() and fseek() -- Provide two versions of all functions that use the z_off_t type for - binary compatibility -- a normal version and a 64-bit offset version, - per the Large File Support Extension when _LARGEFILE64_SOURCE is - defined; use the 64-bit versions by default when _FILE_OFFSET_BITS - is defined to be 64 -- Add a --uname= option to configure to perhaps help with cross-compiling - -Changes in 1.2.3.2 (3 September 2006) -- Turn off silly Borland warnings [Hay] -- Use off64_t and define _LARGEFILE64_SOURCE when present -- Fix missing dependency on inffixed.h in Makefile.in -- Rig configure --shared to build both shared and static [Teredesai, Truta] -- Remove zconf.in.h and instead create a new zlibdefs.h file -- Fix contrib/minizip/unzip.c non-encrypted after encrypted [Vollant] -- Add treebuild.xml (see http://treebuild.metux.de/) [Weigelt] - -Changes in 1.2.3.1 (16 August 2006) -- Add watcom directory with OpenWatcom make files [Daniel] -- Remove #undef of FAR in zconf.in.h for MVS [Fedtke] -- Update make_vms.com [Zinser] -- Use -fPIC for shared build in configure [Teredesai, Nicholson] -- Use only major version number for libz.so on IRIX and OSF1 [Reinholdtsen] -- Use fdopen() (not _fdopen()) for Interix in zutil.h [Bäck] -- Add some FAQ entries about the contrib directory -- Update the MVS question in the FAQ -- Avoid extraneous reads after EOF in gzio.c [Brown] -- Correct spelling of "successfully" in gzio.c [Randers-Pehrson] -- Add comments to zlib.h about gzerror() usage [Brown] -- Set extra flags in gzip header in gzopen() like deflate() does -- Make configure options more compatible with double-dash conventions - [Weigelt] -- Clean up compilation under Solaris SunStudio cc [Rowe, Reinholdtsen] -- Fix uninstall target in Makefile.in [Truta] -- Add pkgconfig support [Weigelt] -- Use $(DESTDIR) macro in Makefile.in [Reinholdtsen, Weigelt] -- Replace set_data_type() with a more accurate detect_data_type() in - trees.c, according to the txtvsbin.txt document [Truta] -- Swap the order of #include <stdio.h> and #include "zlib.h" in - gzio.c, example.c and minigzip.c [Truta] -- Shut up annoying VS2005 warnings about standard C deprecation [Rowe, - Truta] (where?) -- Fix target "clean" from win32/Makefile.bor [Truta] -- Create .pdb and .manifest files in win32/makefile.msc [Ziegler, Rowe] -- Update zlib www home address in win32/DLL_FAQ.txt [Truta] -- Update contrib/masmx86/inffas32.asm for VS2005 [Vollant, Van Wassenhove] -- Enable browse info in the "Debug" and "ASM Debug" configurations in - the Visual C++ 6 project, and set (non-ASM) "Debug" as default [Truta] -- Add pkgconfig support [Weigelt] -- Add ZLIB_VER_MAJOR, ZLIB_VER_MINOR and ZLIB_VER_REVISION in zlib.h, - for use in win32/zlib1.rc [Polushin, Rowe, Truta] -- Add a document that explains the new text detection scheme to - doc/txtvsbin.txt [Truta] -- Add rfc1950.txt, rfc1951.txt and rfc1952.txt to doc/ [Truta] -- Move algorithm.txt into doc/ [Truta] -- Synchronize FAQ with website -- Fix compressBound(), was low for some pathological cases [Fearnley] -- Take into account wrapper variations in deflateBound() -- Set examples/zpipe.c input and output to binary mode for Windows -- Update examples/zlib_how.html with new zpipe.c (also web site) -- Fix some warnings in examples/gzlog.c and examples/zran.c (it seems - that gcc became pickier in 4.0) -- Add zlib.map for Linux: "All symbols from zlib-1.1.4 remain - un-versioned, the patch adds versioning only for symbols introduced in - zlib-1.2.0 or later. It also declares as local those symbols which are - not designed to be exported." [Levin] -- Update Z_PREFIX list in zconf.in.h, add --zprefix option to configure -- Do not initialize global static by default in trees.c, add a response - NO_INIT_GLOBAL_POINTERS to initialize them if needed [Marquess] -- Don't use strerror() in gzio.c under WinCE [Yakimov] -- Don't use errno.h in zutil.h under WinCE [Yakimov] -- Move arguments for AR to its usage to allow replacing ar [Marot] -- Add HAVE_VISIBILITY_PRAGMA in zconf.in.h for Mozilla [Randers-Pehrson] -- Improve inflateInit() and inflateInit2() documentation -- Fix structure size comment in inflate.h -- Change configure help option from --h* to --help [Santos] - -Changes in 1.2.3 (18 July 2005) -- Apply security vulnerability fixes to contrib/infback9 as well -- Clean up some text files (carriage returns, trailing space) -- Update testzlib, vstudio, masmx64, and masmx86 in contrib [Vollant] - -Changes in 1.2.2.4 (11 July 2005) -- Add inflatePrime() function for starting inflation at bit boundary -- Avoid some Visual C warnings in deflate.c -- Avoid more silly Visual C warnings in inflate.c and inftrees.c for 64-bit - compile -- Fix some spelling errors in comments [Betts] -- Correct inflateInit2() error return documentation in zlib.h -- Add zran.c example of compressed data random access to examples - directory, shows use of inflatePrime() -- Fix cast for assignments to strm->state in inflate.c and infback.c -- Fix zlibCompileFlags() in zutil.c to use 1L for long shifts [Oberhumer] -- Move declarations of gf2 functions to right place in crc32.c [Oberhumer] -- Add cast in trees.c t avoid a warning [Oberhumer] -- Avoid some warnings in fitblk.c, gun.c, gzjoin.c in examples [Oberhumer] -- Update make_vms.com [Zinser] -- Initialize state->write in inflateReset() since copied in inflate_fast() -- Be more strict on incomplete code sets in inflate_table() and increase - ENOUGH and MAXD -- this repairs a possible security vulnerability for - invalid inflate input. Thanks to Tavis Ormandy and Markus Oberhumer for - discovering the vulnerability and providing test cases. -- Add ia64 support to configure for HP-UX [Smith] -- Add error return to gzread() for format or i/o error [Levin] -- Use malloc.h for OS/2 [Necasek] - -Changes in 1.2.2.3 (27 May 2005) -- Replace 1U constants in inflate.c and inftrees.c for 64-bit compile -- Typecast fread() return values in gzio.c [Vollant] -- Remove trailing space in minigzip.c outmode (VC++ can't deal with it) -- Fix crc check bug in gzread() after gzungetc() [Heiner] -- Add the deflateTune() function to adjust internal compression parameters -- Add a fast gzip decompressor, gun.c, to examples (use of inflateBack) -- Remove an incorrect assertion in examples/zpipe.c -- Add C++ wrapper in infback9.h [Donais] -- Fix bug in inflateCopy() when decoding fixed codes -- Note in zlib.h how much deflateSetDictionary() actually uses -- Remove USE_DICT_HEAD in deflate.c (would mess up inflate if used) -- Add _WIN32_WCE to define WIN32 in zconf.in.h [Spencer] -- Don't include stderr.h or errno.h for _WIN32_WCE in zutil.h [Spencer] -- Add gzdirect() function to indicate transparent reads -- Update contrib/minizip [Vollant] -- Fix compilation of deflate.c when both ASMV and FASTEST [Oberhumer] -- Add casts in crc32.c to avoid warnings [Oberhumer] -- Add contrib/masmx64 [Vollant] -- Update contrib/asm586, asm686, masmx86, testzlib, vstudio [Vollant] - -Changes in 1.2.2.2 (30 December 2004) -- Replace structure assignments in deflate.c and inflate.c with zmemcpy to - avoid implicit memcpy calls (portability for no-library compilation) -- Increase sprintf() buffer size in gzdopen() to allow for large numbers -- Add INFLATE_STRICT to check distances against zlib header -- Improve WinCE errno handling and comments [Chang] -- Remove comment about no gzip header processing in FAQ -- Add Z_FIXED strategy option to deflateInit2() to force fixed trees -- Add updated make_vms.com [Coghlan], update README -- Create a new "examples" directory, move gzappend.c there, add zpipe.c, - fitblk.c, gzlog.[ch], gzjoin.c, and zlib_how.html. -- Add FAQ entry and comments in deflate.c on uninitialized memory access -- Add Solaris 9 make options in configure [Gilbert] -- Allow strerror() usage in gzio.c for STDC -- Fix DecompressBuf in contrib/delphi/ZLib.pas [ManChesTer] -- Update contrib/masmx86/inffas32.asm and gvmat32.asm [Vollant] -- Use z_off_t for adler32_combine() and crc32_combine() lengths -- Make adler32() much faster for small len -- Use OS_CODE in deflate() default gzip header - -Changes in 1.2.2.1 (31 October 2004) -- Allow inflateSetDictionary() call for raw inflate -- Fix inflate header crc check bug for file names and comments -- Add deflateSetHeader() and gz_header structure for custom gzip headers -- Add inflateGetheader() to retrieve gzip headers -- Add crc32_combine() and adler32_combine() functions -- Add alloc_func, free_func, in_func, out_func to Z_PREFIX list -- Use zstreamp consistently in zlib.h (inflate_back functions) -- Remove GUNZIP condition from definition of inflate_mode in inflate.h - and in contrib/inflate86/inffast.S [Truta, Anderson] -- Add support for AMD64 in contrib/inflate86/inffas86.c [Anderson] -- Update projects/README.projects and projects/visualc6 [Truta] -- Update win32/DLL_FAQ.txt [Truta] -- Avoid warning under NO_GZCOMPRESS in gzio.c; fix typo [Truta] -- Deprecate Z_ASCII; use Z_TEXT instead [Truta] -- Use a new algorithm for setting strm->data_type in trees.c [Truta] -- Do not define an exit() prototype in zutil.c unless DEBUG defined -- Remove prototype of exit() from zutil.c, example.c, minigzip.c [Truta] -- Add comment in zlib.h for Z_NO_FLUSH parameter to deflate() -- Fix Darwin build version identification [Peterson] - -Changes in 1.2.2 (3 October 2004) -- Update zlib.h comments on gzip in-memory processing -- Set adler to 1 in inflateReset() to support Java test suite [Walles] -- Add contrib/dotzlib [Ravn] -- Update win32/DLL_FAQ.txt [Truta] -- Update contrib/minizip [Vollant] -- Move contrib/visual-basic.txt to old/ [Truta] -- Fix assembler builds in projects/visualc6/ [Truta] - -Changes in 1.2.1.2 (9 September 2004) -- Update INDEX file -- Fix trees.c to update strm->data_type (no one ever noticed!) -- Fix bug in error case in inflate.c, infback.c, and infback9.c [Brown] -- Add "volatile" to crc table flag declaration (for DYNAMIC_CRC_TABLE) -- Add limited multitasking protection to DYNAMIC_CRC_TABLE -- Add NO_vsnprintf for VMS in zutil.h [Mozilla] -- Don't declare strerror() under VMS [Mozilla] -- Add comment to DYNAMIC_CRC_TABLE to use get_crc_table() to initialize -- Update contrib/ada [Anisimkov] -- Update contrib/minizip [Vollant] -- Fix configure to not hardcode directories for Darwin [Peterson] -- Fix gzio.c to not return error on empty files [Brown] -- Fix indentation; update version in contrib/delphi/ZLib.pas and - contrib/pascal/zlibpas.pas [Truta] -- Update mkasm.bat in contrib/masmx86 [Truta] -- Update contrib/untgz [Truta] -- Add projects/README.projects [Truta] -- Add project for MS Visual C++ 6.0 in projects/visualc6 [Cadieux, Truta] -- Update win32/DLL_FAQ.txt [Truta] -- Update list of Z_PREFIX symbols in zconf.h [Randers-Pehrson, Truta] -- Remove an unnecessary assignment to curr in inftrees.c [Truta] -- Add OS/2 to exe builds in configure [Poltorak] -- Remove err dummy parameter in zlib.h [Kientzle] - -Changes in 1.2.1.1 (9 January 2004) -- Update email address in README -- Several FAQ updates -- Fix a big fat bug in inftrees.c that prevented decoding valid - dynamic blocks with only literals and no distance codes -- - Thanks to "Hot Emu" for the bug report and sample file -- Add a note to puff.c on no distance codes case. - -Changes in 1.2.1 (17 November 2003) -- Remove a tab in contrib/gzappend/gzappend.c -- Update some interfaces in contrib for new zlib functions -- Update zlib version number in some contrib entries -- Add Windows CE definition for ptrdiff_t in zutil.h [Mai, Truta] -- Support shared libraries on Hurd and KFreeBSD [Brown] -- Fix error in NO_DIVIDE option of adler32.c - -Changes in 1.2.0.8 (4 November 2003) -- Update version in contrib/delphi/ZLib.pas and contrib/pascal/zlibpas.pas -- Add experimental NO_DIVIDE #define in adler32.c - - Possibly faster on some processors (let me know if it is) -- Correct Z_BLOCK to not return on first inflate call if no wrap -- Fix strm->data_type on inflate() return to correctly indicate EOB -- Add deflatePrime() function for appending in the middle of a byte -- Add contrib/gzappend for an example of appending to a stream -- Update win32/DLL_FAQ.txt [Truta] -- Delete Turbo C comment in README [Truta] -- Improve some indentation in zconf.h [Truta] -- Fix infinite loop on bad input in configure script [Church] -- Fix gzeof() for concatenated gzip files [Johnson] -- Add example to contrib/visual-basic.txt [Michael B.] -- Add -p to mkdir's in Makefile.in [vda] -- Fix configure to properly detect presence or lack of printf functions -- Add AS400 support [Monnerat] -- Add a little Cygwin support [Wilson] - -Changes in 1.2.0.7 (21 September 2003) -- Correct some debug formats in contrib/infback9 -- Cast a type in a debug statement in trees.c -- Change search and replace delimiter in configure from % to # [Beebe] -- Update contrib/untgz to 0.2 with various fixes [Truta] -- Add build support for Amiga [Nikl] -- Remove some directories in old that have been updated to 1.2 -- Add dylib building for Mac OS X in configure and Makefile.in -- Remove old distribution stuff from Makefile -- Update README to point to DLL_FAQ.txt, and add comment on Mac OS X -- Update links in README - -Changes in 1.2.0.6 (13 September 2003) -- Minor FAQ updates -- Update contrib/minizip to 1.00 [Vollant] -- Remove test of gz functions in example.c when GZ_COMPRESS defined [Truta] -- Update POSTINC comment for 68060 [Nikl] -- Add contrib/infback9 with deflate64 decoding (unsupported) -- For MVS define NO_vsnprintf and undefine FAR [van Burik] -- Add pragma for fdopen on MVS [van Burik] - -Changes in 1.2.0.5 (8 September 2003) -- Add OF to inflateBackEnd() declaration in zlib.h -- Remember start when using gzdopen in the middle of a file -- Use internal off_t counters in gz* functions to properly handle seeks -- Perform more rigorous check for distance-too-far in inffast.c -- Add Z_BLOCK flush option to return from inflate at block boundary -- Set strm->data_type on return from inflate - - Indicate bits unused, if at block boundary, and if in last block -- Replace size_t with ptrdiff_t in crc32.c, and check for correct size -- Add condition so old NO_DEFLATE define still works for compatibility -- FAQ update regarding the Windows DLL [Truta] -- INDEX update: add qnx entry, remove aix entry [Truta] -- Install zlib.3 into mandir [Wilson] -- Move contrib/zlib_dll_FAQ.txt to win32/DLL_FAQ.txt; update [Truta] -- Adapt the zlib interface to the new DLL convention guidelines [Truta] -- Introduce ZLIB_WINAPI macro to allow the export of functions using - the WINAPI calling convention, for Visual Basic [Vollant, Truta] -- Update msdos and win32 scripts and makefiles [Truta] -- Export symbols by name, not by ordinal, in win32/zlib.def [Truta] -- Add contrib/ada [Anisimkov] -- Move asm files from contrib/vstudio/vc70_32 to contrib/asm386 [Truta] -- Rename contrib/asm386 to contrib/masmx86 [Truta, Vollant] -- Add contrib/masm686 [Truta] -- Fix offsets in contrib/inflate86 and contrib/masmx86/inffas32.asm - [Truta, Vollant] -- Update contrib/delphi; rename to contrib/pascal; add example [Truta] -- Remove contrib/delphi2; add a new contrib/delphi [Truta] -- Avoid inclusion of the nonstandard <memory.h> in contrib/iostream, - and fix some method prototypes [Truta] -- Fix the ZCR_SEED2 constant to avoid warnings in contrib/minizip - [Truta] -- Avoid the use of backslash (\) in contrib/minizip [Vollant] -- Fix file time handling in contrib/untgz; update makefiles [Truta] -- Update contrib/vstudio/vc70_32 to comply with the new DLL guidelines - [Vollant] -- Remove contrib/vstudio/vc15_16 [Vollant] -- Rename contrib/vstudio/vc70_32 to contrib/vstudio/vc7 [Truta] -- Update README.contrib [Truta] -- Invert the assignment order of match_head and s->prev[...] in - INSERT_STRING [Truta] -- Compare TOO_FAR with 32767 instead of 32768, to avoid 16-bit warnings - [Truta] -- Compare function pointers with 0, not with NULL or Z_NULL [Truta] -- Fix prototype of syncsearch in inflate.c [Truta] -- Introduce ASMINF macro to be enabled when using an ASM implementation - of inflate_fast [Truta] -- Change NO_DEFLATE to NO_GZCOMPRESS [Truta] -- Modify test_gzio in example.c to take a single file name as a - parameter [Truta] -- Exit the example.c program if gzopen fails [Truta] -- Add type casts around strlen in example.c [Truta] -- Remove casting to sizeof in minigzip.c; give a proper type - to the variable compared with SUFFIX_LEN [Truta] -- Update definitions of STDC and STDC99 in zconf.h [Truta] -- Synchronize zconf.h with the new Windows DLL interface [Truta] -- Use SYS16BIT instead of __32BIT__ to distinguish between - 16- and 32-bit platforms [Truta] -- Use far memory allocators in small 16-bit memory models for - Turbo C [Truta] -- Add info about the use of ASMV, ASMINF and ZLIB_WINAPI in - zlibCompileFlags [Truta] -- Cygwin has vsnprintf [Wilson] -- In Windows16, OS_CODE is 0, as in MSDOS [Truta] -- In Cygwin, OS_CODE is 3 (Unix), not 11 (Windows32) [Wilson] - -Changes in 1.2.0.4 (10 August 2003) -- Minor FAQ updates -- Be more strict when checking inflateInit2's windowBits parameter -- Change NO_GUNZIP compile option to NO_GZIP to cover deflate as well -- Add gzip wrapper option to deflateInit2 using windowBits -- Add updated QNX rule in configure and qnx directory [Bonnefoy] -- Make inflate distance-too-far checks more rigorous -- Clean up FAR usage in inflate -- Add casting to sizeof() in gzio.c and minigzip.c - -Changes in 1.2.0.3 (19 July 2003) -- Fix silly error in gzungetc() implementation [Vollant] -- Update contrib/minizip and contrib/vstudio [Vollant] -- Fix printf format in example.c -- Correct cdecl support in zconf.in.h [Anisimkov] -- Minor FAQ updates - -Changes in 1.2.0.2 (13 July 2003) -- Add ZLIB_VERNUM in zlib.h for numerical preprocessor comparisons -- Attempt to avoid warnings in crc32.c for pointer-int conversion -- Add AIX to configure, remove aix directory [Bakker] -- Add some casts to minigzip.c -- Improve checking after insecure sprintf() or vsprintf() calls -- Remove #elif's from crc32.c -- Change leave label to inf_leave in inflate.c and infback.c to avoid - library conflicts -- Remove inflate gzip decoding by default--only enable gzip decoding by - special request for stricter backward compatibility -- Add zlibCompileFlags() function to return compilation information -- More typecasting in deflate.c to avoid warnings -- Remove leading underscore from _Capital #defines [Truta] -- Fix configure to link shared library when testing -- Add some Windows CE target adjustments [Mai] -- Remove #define ZLIB_DLL in zconf.h [Vollant] -- Add zlib.3 [Rodgers] -- Update RFC URL in deflate.c and algorithm.txt [Mai] -- Add zlib_dll_FAQ.txt to contrib [Truta] -- Add UL to some constants [Truta] -- Update minizip and vstudio [Vollant] -- Remove vestigial NEED_DUMMY_RETURN from zconf.in.h -- Expand use of NO_DUMMY_DECL to avoid all dummy structures -- Added iostream3 to contrib [Schwardt] -- Replace rewind() with fseek() for WinCE [Truta] -- Improve setting of zlib format compression level flags - - Report 0 for huffman and rle strategies and for level == 0 or 1 - - Report 2 only for level == 6 -- Only deal with 64K limit when necessary at compile time [Truta] -- Allow TOO_FAR check to be turned off at compile time [Truta] -- Add gzclearerr() function [Souza] -- Add gzungetc() function - -Changes in 1.2.0.1 (17 March 2003) -- Add Z_RLE strategy for run-length encoding [Truta] - - When Z_RLE requested, restrict matches to distance one - - Update zlib.h, minigzip.c, gzopen(), gzdopen() for Z_RLE -- Correct FASTEST compilation to allow level == 0 -- Clean up what gets compiled for FASTEST -- Incorporate changes to zconf.in.h [Vollant] - - Refine detection of Turbo C need for dummy returns - - Refine ZLIB_DLL compilation - - Include additional header file on VMS for off_t typedef -- Try to use _vsnprintf where it supplants vsprintf [Vollant] -- Add some casts in inffast.c -- Enchance comments in zlib.h on what happens if gzprintf() tries to - write more than 4095 bytes before compression -- Remove unused state from inflateBackEnd() -- Remove exit(0) from minigzip.c, example.c -- Get rid of all those darn tabs -- Add "check" target to Makefile.in that does the same thing as "test" -- Add "mostlyclean" and "maintainer-clean" targets to Makefile.in -- Update contrib/inflate86 [Anderson] -- Update contrib/testzlib, contrib/vstudio, contrib/minizip [Vollant] -- Add msdos and win32 directories with makefiles [Truta] -- More additions and improvements to the FAQ - -Changes in 1.2.0 (9 March 2003) -- New and improved inflate code - - About 20% faster - - Does not allocate 32K window unless and until needed - - Automatically detects and decompresses gzip streams - - Raw inflate no longer needs an extra dummy byte at end - - Added inflateBack functions using a callback interface--even faster - than inflate, useful for file utilities (gzip, zip) - - Added inflateCopy() function to record state for random access on - externally generated deflate streams (e.g. in gzip files) - - More readable code (I hope) -- New and improved crc32() - - About 50% faster, thanks to suggestions from Rodney Brown -- Add deflateBound() and compressBound() functions -- Fix memory leak in deflateInit2() -- Permit setting dictionary for raw deflate (for parallel deflate) -- Fix const declaration for gzwrite() -- Check for some malloc() failures in gzio.c -- Fix bug in gzopen() on single-byte file 0x1f -- Fix bug in gzread() on concatenated file with 0x1f at end of buffer - and next buffer doesn't start with 0x8b -- Fix uncompress() to return Z_DATA_ERROR on truncated input -- Free memory at end of example.c -- Remove MAX #define in trees.c (conflicted with some libraries) -- Fix static const's in deflate.c, gzio.c, and zutil.[ch] -- Declare malloc() and free() in gzio.c if STDC not defined -- Use malloc() instead of calloc() in zutil.c if int big enough -- Define STDC for AIX -- Add aix/ with approach for compiling shared library on AIX -- Add HP-UX support for shared libraries in configure -- Add OpenUNIX support for shared libraries in configure -- Use $cc instead of gcc to build shared library -- Make prefix directory if needed when installing -- Correct Macintosh avoidance of typedef Byte in zconf.h -- Correct Turbo C memory allocation when under Linux -- Use libz.a instead of -lz in Makefile (assure use of compiled library) -- Update configure to check for snprintf or vsnprintf functions and their - return value, warn during make if using an insecure function -- Fix configure problem with compile-time knowledge of HAVE_UNISTD_H that - is lost when library is used--resolution is to build new zconf.h -- Documentation improvements (in zlib.h): - - Document raw deflate and inflate - - Update RFCs URL - - Point out that zlib and gzip formats are different - - Note that Z_BUF_ERROR is not fatal - - Document string limit for gzprintf() and possible buffer overflow - - Note requirement on avail_out when flushing - - Note permitted values of flush parameter of inflate() -- Add some FAQs (and even answers) to the FAQ -- Add contrib/inflate86/ for x86 faster inflate -- Add contrib/blast/ for PKWare Data Compression Library decompression -- Add contrib/puff/ simple inflate for deflate format description - -Changes in 1.1.4 (11 March 2002) -- ZFREE was repeated on same allocation on some error conditions. - This creates a security problem described in - http://www.zlib.org/advisory-2002-03-11.txt -- Returned incorrect error (Z_MEM_ERROR) on some invalid data -- Avoid accesses before window for invalid distances with inflate window - less than 32K. -- force windowBits > 8 to avoid a bug in the encoder for a window size - of 256 bytes. (A complete fix will be available in 1.1.5). - -Changes in 1.1.3 (9 July 1998) -- fix "an inflate input buffer bug that shows up on rare but persistent - occasions" (Mark) -- fix gzread and gztell for concatenated .gz files (Didier Le Botlan) -- fix gzseek(..., SEEK_SET) in write mode -- fix crc check after a gzeek (Frank Faubert) -- fix miniunzip when the last entry in a zip file is itself a zip file - (J Lillge) -- add contrib/asm586 and contrib/asm686 (Brian Raiter) - See http://www.muppetlabs.com/~breadbox/software/assembly.html -- add support for Delphi 3 in contrib/delphi (Bob Dellaca) -- add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti) -- do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren) -- use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks) -- added a FAQ file - -- Support gzdopen on Mac with Metrowerks (Jason Linhart) -- Do not redefine Byte on Mac (Brad Pettit & Jason Linhart) -- define SEEK_END too if SEEK_SET is not defined (Albert Chin-A-Young) -- avoid some warnings with Borland C (Tom Tanner) -- fix a problem in contrib/minizip/zip.c for 16-bit MSDOS (Gilles Vollant) -- emulate utime() for WIN32 in contrib/untgz (Gilles Vollant) -- allow several arguments to configure (Tim Mooney, Frodo Looijaard) -- use libdir and includedir in Makefile.in (Tim Mooney) -- support shared libraries on OSF1 V4 (Tim Mooney) -- remove so_locations in "make clean" (Tim Mooney) -- fix maketree.c compilation error (Glenn, Mark) -- Python interface to zlib now in Python 1.5 (Jeremy Hylton) -- new Makefile.riscos (Rich Walker) -- initialize static descriptors in trees.c for embedded targets (Nick Smith) -- use "foo-gz" in example.c for RISCOS and VMS (Nick Smith) -- add the OS/2 files in Makefile.in too (Andrew Zabolotny) -- fix fdopen and halloc macros for Microsoft C 6.0 (Tom Lane) -- fix maketree.c to allow clean compilation of inffixed.h (Mark) -- fix parameter check in deflateCopy (Gunther Nikl) -- cleanup trees.c, use compressed_len only in debug mode (Christian Spieler) -- Many portability patches by Christian Spieler: - . zutil.c, zutil.h: added "const" for zmem* - . Make_vms.com: fixed some typos - . Make_vms.com: msdos/Makefile.*: removed zutil.h from some dependency lists - . msdos/Makefile.msc: remove "default rtl link library" info from obj files - . msdos/Makefile.*: use model-dependent name for the built zlib library - . msdos/Makefile.emx, nt/Makefile.emx, nt/Makefile.gcc: - new makefiles, for emx (DOS/OS2), emx&rsxnt and mingw32 (Windows 9x / NT) -- use define instead of typedef for Bytef also for MSC small/medium (Tom Lane) -- replace __far with _far for better portability (Christian Spieler, Tom Lane) -- fix test for errno.h in configure (Tim Newsham) - -Changes in 1.1.2 (19 March 98) -- added contrib/minzip, mini zip and unzip based on zlib (Gilles Vollant) - See http://www.winimage.com/zLibDll/unzip.html -- preinitialize the inflate tables for fixed codes, to make the code - completely thread safe (Mark) -- some simplifications and slight speed-up to the inflate code (Mark) -- fix gzeof on non-compressed files (Allan Schrum) -- add -std1 option in configure for OSF1 to fix gzprintf (Martin Mokrejs) -- use default value of 4K for Z_BUFSIZE for 16-bit MSDOS (Tim Wegner + Glenn) -- added os2/Makefile.def and os2/zlib.def (Andrew Zabolotny) -- add shared lib support for UNIX_SV4.2MP (MATSUURA Takanori) -- do not wrap extern "C" around system includes (Tom Lane) -- mention zlib binding for TCL in README (Andreas Kupries) -- added amiga/Makefile.pup for Amiga powerUP SAS/C PPC (Andreas Kleinert) -- allow "make install prefix=..." even after configure (Glenn Randers-Pehrson) -- allow "configure --prefix $HOME" (Tim Mooney) -- remove warnings in example.c and gzio.c (Glenn Randers-Pehrson) -- move Makefile.sas to amiga/Makefile.sas - -Changes in 1.1.1 (27 Feb 98) -- fix macros _tr_tally_* in deflate.h for debug mode (Glenn Randers-Pehrson) -- remove block truncation heuristic which had very marginal effect for zlib - (smaller lit_bufsize than in gzip 1.2.4) and degraded a little the - compression ratio on some files. This also allows inlining _tr_tally for - matches in deflate_slow. -- added msdos/Makefile.w32 for WIN32 Microsoft Visual C++ (Bob Frazier) - -Changes in 1.1.0 (24 Feb 98) -- do not return STREAM_END prematurely in inflate (John Bowler) -- revert to the zlib 1.0.8 inflate to avoid the gcc 2.8.0 bug (Jeremy Buhler) -- compile with -DFASTEST to get compression code optimized for speed only -- in minigzip, try mmap'ing the input file first (Miguel Albrecht) -- increase size of I/O buffers in minigzip.c and gzio.c (not a big gain - on Sun but significant on HP) - -- add a pointer to experimental unzip library in README (Gilles Vollant) -- initialize variable gcc in configure (Chris Herborth) - -Changes in 1.0.9 (17 Feb 1998) -- added gzputs and gzgets functions -- do not clear eof flag in gzseek (Mark Diekhans) -- fix gzseek for files in transparent mode (Mark Diekhans) -- do not assume that vsprintf returns the number of bytes written (Jens Krinke) -- replace EXPORT with ZEXPORT to avoid conflict with other programs -- added compress2 in zconf.h, zlib.def, zlib.dnt -- new asm code from Gilles Vollant in contrib/asm386 -- simplify the inflate code (Mark): - . Replace ZALLOC's in huft_build() with single ZALLOC in inflate_blocks_new() - . ZALLOC the length list in inflate_trees_fixed() instead of using stack - . ZALLOC the value area for huft_build() instead of using stack - . Simplify Z_FINISH check in inflate() - -- Avoid gcc 2.8.0 comparison bug a little differently than zlib 1.0.8 -- in inftrees.c, avoid cc -O bug on HP (Farshid Elahi) -- in zconf.h move the ZLIB_DLL stuff earlier to avoid problems with - the declaration of FAR (Gilles VOllant) -- install libz.so* with mode 755 (executable) instead of 644 (Marc Lehmann) -- read_buf buf parameter of type Bytef* instead of charf* -- zmemcpy parameters are of type Bytef*, not charf* (Joseph Strout) -- do not redeclare unlink in minigzip.c for WIN32 (John Bowler) -- fix check for presence of directories in "make install" (Ian Willis) - -Changes in 1.0.8 (27 Jan 1998) -- fixed offsets in contrib/asm386/gvmat32.asm (Gilles Vollant) -- fix gzgetc and gzputc for big endian systems (Markus Oberhumer) -- added compress2() to allow setting the compression level -- include sys/types.h to get off_t on some systems (Marc Lehmann & QingLong) -- use constant arrays for the static trees in trees.c instead of computing - them at run time (thanks to Ken Raeburn for this suggestion). To create - trees.h, compile with GEN_TREES_H and run "make test". -- check return code of example in "make test" and display result -- pass minigzip command line options to file_compress -- simplifying code of inflateSync to avoid gcc 2.8 bug - -- support CC="gcc -Wall" in configure -s (QingLong) -- avoid a flush caused by ftell in gzopen for write mode (Ken Raeburn) -- fix test for shared library support to avoid compiler warnings -- zlib.lib -> zlib.dll in msdos/zlib.rc (Gilles Vollant) -- check for TARGET_OS_MAC in addition to MACOS (Brad Pettit) -- do not use fdopen for Metrowerks on Mac (Brad Pettit)) -- add checks for gzputc and gzputc in example.c -- avoid warnings in gzio.c and deflate.c (Andreas Kleinert) -- use const for the CRC table (Ken Raeburn) -- fixed "make uninstall" for shared libraries -- use Tracev instead of Trace in infblock.c -- in example.c use correct compressed length for test_sync -- suppress +vnocompatwarnings in configure for HPUX (not always supported) - -Changes in 1.0.7 (20 Jan 1998) -- fix gzseek which was broken in write mode -- return error for gzseek to negative absolute position -- fix configure for Linux (Chun-Chung Chen) -- increase stack space for MSC (Tim Wegner) -- get_crc_table and inflateSyncPoint are EXPORTed (Gilles Vollant) -- define EXPORTVA for gzprintf (Gilles Vollant) -- added man page zlib.3 (Rick Rodgers) -- for contrib/untgz, fix makedir() and improve Makefile - -- check gzseek in write mode in example.c -- allocate extra buffer for seeks only if gzseek is actually called -- avoid signed/unsigned comparisons (Tim Wegner, Gilles Vollant) -- add inflateSyncPoint in zconf.h -- fix list of exported functions in nt/zlib.dnt and mdsos/zlib.def - -Changes in 1.0.6 (19 Jan 1998) -- add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and - gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code) -- Fix a deflate bug occurring only with compression level 0 (thanks to - Andy Buckler for finding this one). -- In minigzip, pass transparently also the first byte for .Z files. -- return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress() -- check Z_FINISH in inflate (thanks to Marc Schluper) -- Implement deflateCopy (thanks to Adam Costello) -- make static libraries by default in configure, add --shared option. -- move MSDOS or Windows specific files to directory msdos -- suppress the notion of partial flush to simplify the interface - (but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4) -- suppress history buffer provided by application to simplify the interface - (this feature was not implemented anyway in 1.0.4) -- next_in and avail_in must be initialized before calling inflateInit or - inflateInit2 -- add EXPORT in all exported functions (for Windows DLL) -- added Makefile.nt (thanks to Stephen Williams) -- added the unsupported "contrib" directory: - contrib/asm386/ by Gilles Vollant <info@winimage.com> - 386 asm code replacing longest_match(). - contrib/iostream/ by Kevin Ruland <kevin@rodin.wustl.edu> - A C++ I/O streams interface to the zlib gz* functions - contrib/iostream2/ by Tyge Løvset <Tyge.Lovset@cmr.no> - Another C++ I/O streams interface - contrib/untgz/ by "Pedro A. Aranda Guti\irrez" <paag@tid.es> - A very simple tar.gz file extractor using zlib - contrib/visual-basic.txt by Carlos Rios <c_rios@sonda.cl> - How to use compress(), uncompress() and the gz* functions from VB. -- pass params -f (filtered data), -h (huffman only), -1 to -9 (compression - level) in minigzip (thanks to Tom Lane) - -- use const for rommable constants in deflate -- added test for gzseek and gztell in example.c -- add undocumented function inflateSyncPoint() (hack for Paul Mackerras) -- add undocumented function zError to convert error code to string - (for Tim Smithers) -- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code. -- Use default memcpy for Symantec MSDOS compiler. -- Add EXPORT keyword for check_func (needed for Windows DLL) -- add current directory to LD_LIBRARY_PATH for "make test" -- create also a link for libz.so.1 -- added support for FUJITSU UXP/DS (thanks to Toshiaki Nomura) -- use $(SHAREDLIB) instead of libz.so in Makefile.in (for HPUX) -- added -soname for Linux in configure (Chun-Chung Chen, -- assign numbers to the exported functions in zlib.def (for Windows DLL) -- add advice in zlib.h for best usage of deflateSetDictionary -- work around compiler bug on Atari (cast Z_NULL in call of s->checkfn) -- allow compilation with ANSI keywords only enabled for TurboC in large model -- avoid "versionString"[0] (Borland bug) -- add NEED_DUMMY_RETURN for Borland -- use variable z_verbose for tracing in debug mode (L. Peter Deutsch). -- allow compilation with CC -- defined STDC for OS/2 (David Charlap) -- limit external names to 8 chars for MVS (Thomas Lund) -- in minigzip.c, use static buffers only for 16-bit systems -- fix suffix check for "minigzip -d foo.gz" -- do not return an error for the 2nd of two consecutive gzflush() (Felix Lee) -- use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau) -- added makelcc.bat for lcc-win32 (Tom St Denis) -- in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe) -- Avoid expanded $Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion. -- check for unistd.h in configure (for off_t) -- remove useless check parameter in inflate_blocks_free -- avoid useless assignment of s->check to itself in inflate_blocks_new -- do not flush twice in gzclose (thanks to Ken Raeburn) -- rename FOPEN as F_OPEN to avoid clash with /usr/include/sys/file.h -- use NO_ERRNO_H instead of enumeration of operating systems with errno.h -- work around buggy fclose on pipes for HP/UX -- support zlib DLL with BORLAND C++ 5.0 (thanks to Glenn Randers-Pehrson) -- fix configure if CC is already equal to gcc - -Changes in 1.0.5 (3 Jan 98) -- Fix inflate to terminate gracefully when fed corrupted or invalid data -- Use const for rommable constants in inflate -- Eliminate memory leaks on error conditions in inflate -- Removed some vestigial code in inflate -- Update web address in README - -Changes in 1.0.4 (24 Jul 96) -- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF - bit, so the decompressor could decompress all the correct data but went - on to attempt decompressing extra garbage data. This affected minigzip too. -- zlibVersion and gzerror return const char* (needed for DLL) -- port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno) -- use z_error only for DEBUG (avoid problem with DLLs) - -Changes in 1.0.3 (2 Jul 96) -- use z_streamp instead of z_stream *, which is now a far pointer in MSDOS - small and medium models; this makes the library incompatible with previous - versions for these models. (No effect in large model or on other systems.) -- return OK instead of BUF_ERROR if previous deflate call returned with - avail_out as zero but there is nothing to do -- added memcmp for non STDC compilers -- define NO_DUMMY_DECL for more Mac compilers (.h files merged incorrectly) -- define __32BIT__ if __386__ or i386 is defined (pb. with Watcom and SCO) -- better check for 16-bit mode MSC (avoids problem with Symantec) - -Changes in 1.0.2 (23 May 96) -- added Windows DLL support -- added a function zlibVersion (for the DLL support) -- fixed declarations using Bytef in infutil.c (pb with MSDOS medium model) -- Bytef is define's instead of typedef'd only for Borland C -- avoid reading uninitialized memory in example.c -- mention in README that the zlib format is now RFC1950 -- updated Makefile.dj2 -- added algorithm.doc - -Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion] -- fix array overlay in deflate.c which sometimes caused bad compressed data -- fix inflate bug with empty stored block -- fix MSDOS medium model which was broken in 0.99 -- fix deflateParams() which could generate bad compressed data. -- Bytef is define'd instead of typedef'ed (work around Borland bug) -- added an INDEX file -- new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32), - Watcom (Makefile.wat), Amiga SAS/C (Makefile.sas) -- speed up adler32 for modern machines without auto-increment -- added -ansi for IRIX in configure -- static_init_done in trees.c is an int -- define unlink as delete for VMS -- fix configure for QNX -- add configure branch for SCO and HPUX -- avoid many warnings (unused variables, dead assignments, etc...) -- no fdopen for BeOS -- fix the Watcom fix for 32 bit mode (define FAR as empty) -- removed redefinition of Byte for MKWERKS -- work around an MWKERKS bug (incorrect merge of all .h files) - -Changes in 0.99 (27 Jan 96) -- allow preset dictionary shared between compressor and decompressor -- allow compression level 0 (no compression) -- add deflateParams in zlib.h: allow dynamic change of compression level - and compression strategy. -- test large buffers and deflateParams in example.c -- add optional "configure" to build zlib as a shared library -- suppress Makefile.qnx, use configure instead -- fixed deflate for 64-bit systems (detected on Cray) -- fixed inflate_blocks for 64-bit systems (detected on Alpha) -- declare Z_DEFLATED in zlib.h (possible parameter for deflateInit2) -- always return Z_BUF_ERROR when deflate() has nothing to do -- deflateInit and inflateInit are now macros to allow version checking -- prefix all global functions and types with z_ with -DZ_PREFIX -- make falloc completely reentrant (inftrees.c) -- fixed very unlikely race condition in ct_static_init -- free in reverse order of allocation to help memory manager -- use zlib-1.0/* instead of zlib/* inside the tar.gz -- make zlib warning-free with "gcc -O3 -Wall -Wwrite-strings -Wpointer-arith - -Wconversion -Wstrict-prototypes -Wmissing-prototypes" -- allow gzread on concatenated .gz files -- deflateEnd now returns Z_DATA_ERROR if it was premature -- deflate is finally (?) fully deterministic (no matches beyond end of input) -- Document Z_SYNC_FLUSH -- add uninstall in Makefile -- Check for __cpluplus in zlib.h -- Better test in ct_align for partial flush -- avoid harmless warnings for Borland C++ -- initialize hash_head in deflate.c -- avoid warning on fdopen (gzio.c) for HP cc -Aa -- include stdlib.h for STDC compilers -- include errno.h for Cray -- ignore error if ranlib doesn't exist -- call ranlib twice for NeXTSTEP -- use exec_prefix instead of prefix for libz.a -- renamed ct_* as _tr_* to avoid conflict with applications -- clear z->msg in inflateInit2 before any error return -- initialize opaque in example.c, gzio.c, deflate.c and inflate.c -- fixed typo in zconf.h (_GNUC__ => __GNUC__) -- check for WIN32 in zconf.h and zutil.c (avoid farmalloc in 32-bit mode) -- fix typo in Make_vms.com (f$trnlnm -> f$getsyi) -- in fcalloc, normalize pointer if size > 65520 bytes -- don't use special fcalloc for 32 bit Borland C++ -- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc... -- use Z_BINARY instead of BINARY -- document that gzclose after gzdopen will close the file -- allow "a" as mode in gzopen. -- fix error checking in gzread -- allow skipping .gz extra-field on pipes -- added reference to Perl interface in README -- put the crc table in FAR data (I dislike more and more the medium model :) -- added get_crc_table -- added a dimension to all arrays (Borland C can't count). -- workaround Borland C bug in declaration of inflate_codes_new & inflate_fast -- guard against multiple inclusion of *.h (for precompiled header on Mac) -- Watcom C pretends to be Microsoft C small model even in 32 bit mode. -- don't use unsized arrays to avoid silly warnings by Visual C++: - warning C4746: 'inflate_mask' : unsized array treated as '__far' - (what's wrong with far data in far model?). -- define enum out of inflate_blocks_state to allow compilation with C++ - -Changes in 0.95 (16 Aug 95) -- fix MSDOS small and medium model (now easier to adapt to any compiler) -- inlined send_bits -- fix the final (:-) bug for deflate with flush (output was correct but - not completely flushed in rare occasions). -- default window size is same for compression and decompression - (it's now sufficient to set MAX_WBITS in zconf.h). -- voidp -> voidpf and voidnp -> voidp (for consistency with other - typedefs and because voidnp was not near in large model). - -Changes in 0.94 (13 Aug 95) -- support MSDOS medium model -- fix deflate with flush (could sometimes generate bad output) -- fix deflateReset (zlib header was incorrectly suppressed) -- added support for VMS -- allow a compression level in gzopen() -- gzflush now calls fflush -- For deflate with flush, flush even if no more input is provided. -- rename libgz.a as libz.a -- avoid complex expression in infcodes.c triggering Turbo C bug -- work around a problem with gcc on Alpha (in INSERT_STRING) -- don't use inline functions (problem with some gcc versions) -- allow renaming of Byte, uInt, etc... with #define. -- avoid warning about (unused) pointer before start of array in deflate.c -- avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c -- avoid reserved word 'new' in trees.c - -Changes in 0.93 (25 June 95) -- temporarily disable inline functions -- make deflate deterministic -- give enough lookahead for PARTIAL_FLUSH -- Set binary mode for stdin/stdout in minigzip.c for OS/2 -- don't even use signed char in inflate (not portable enough) -- fix inflate memory leak for segmented architectures - -Changes in 0.92 (3 May 95) -- don't assume that char is signed (problem on SGI) -- Clear bit buffer when starting a stored block -- no memcpy on Pyramid -- suppressed inftest.c -- optimized fill_window, put longest_match inline for gcc -- optimized inflate on stored blocks. -- untabify all sources to simplify patches - -Changes in 0.91 (2 May 95) -- Default MEM_LEVEL is 8 (not 9 for Unix) as documented in zlib.h -- Document the memory requirements in zconf.h -- added "make install" -- fix sync search logic in inflateSync -- deflate(Z_FULL_FLUSH) now works even if output buffer too short -- after inflateSync, don't scare people with just "lo world" -- added support for DJGPP - -Changes in 0.9 (1 May 95) -- don't assume that zalloc clears the allocated memory (the TurboC bug - was Mark's bug after all :) -- let again gzread copy uncompressed data unchanged (was working in 0.71) -- deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented -- added a test of inflateSync in example.c -- moved MAX_WBITS to zconf.h because users might want to change that. -- document explicitly that zalloc(64K) on MSDOS must return a normalized - pointer (zero offset) -- added Makefiles for Microsoft C, Turbo C, Borland C++ -- faster crc32() - -Changes in 0.8 (29 April 95) -- added fast inflate (inffast.c) -- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this - is incompatible with previous versions of zlib which returned Z_OK. -- work around a TurboC compiler bug (bad code for b << 0, see infutil.h) - (actually that was not a compiler bug, see 0.81 above) -- gzread no longer reads one extra byte in certain cases -- In gzio destroy(), don't reference a freed structure -- avoid many warnings for MSDOS -- avoid the ERROR symbol which is used by MS Windows - -Changes in 0.71 (14 April 95) -- Fixed more MSDOS compilation problems :( There is still a bug with - TurboC large model. - -Changes in 0.7 (14 April 95) -- Added full inflate support. -- Simplified the crc32() interface. The pre- and post-conditioning - (one's complement) is now done inside crc32(). WARNING: this is - incompatible with previous versions; see zlib.h for the new usage. - -Changes in 0.61 (12 April 95) -- workaround for a bug in TurboC. example and minigzip now work on MSDOS. - -Changes in 0.6 (11 April 95) -- added minigzip.c -- added gzdopen to reopen a file descriptor as gzFile -- added transparent reading of non-gziped files in gzread. -- fixed bug in gzread (don't read crc as data) -- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose). -- don't allocate big arrays in the stack (for MSDOS) -- fix some MSDOS compilation problems - -Changes in 0.5: -- do real compression in deflate.c. Z_PARTIAL_FLUSH is supported but - not yet Z_FULL_FLUSH. -- support decompression but only in a single step (forced Z_FINISH) -- added opaque object for zalloc and zfree. -- added deflateReset and inflateReset -- added a variable zlib_version for consistency checking. -- renamed the 'filter' parameter of deflateInit2 as 'strategy'. - Added Z_FILTERED and Z_HUFFMAN_ONLY constants. - -Changes in 0.4: -- avoid "zip" everywhere, use zlib instead of ziplib. -- suppress Z_BLOCK_FLUSH, interpret Z_PARTIAL_FLUSH as block flush - if compression method == 8. -- added adler32 and crc32 -- renamed deflateOptions as deflateInit2, call one or the other but not both -- added the method parameter for deflateInit2. -- added inflateInit2 -- simplied considerably deflateInit and inflateInit by not supporting - user-provided history buffer. This is supported only in deflateInit2 - and inflateInit2. - -Changes in 0.3: -- prefix all macro names with Z_ -- use Z_FINISH instead of deflateEnd to finish compression. -- added Z_HUFFMAN_ONLY -- added gzerror() diff --git a/common/zlib/FAQ b/common/zlib/FAQ deleted file mode 100644 index 99b7cf92e..000000000 --- a/common/zlib/FAQ +++ /dev/null @@ -1,368 +0,0 @@ - - Frequently Asked Questions about zlib - - -If your question is not there, please check the zlib home page -http://zlib.net/ which may have more recent information. -The lastest zlib FAQ is at http://zlib.net/zlib_faq.html - - - 1. Is zlib Y2K-compliant? - - Yes. zlib doesn't handle dates. - - 2. Where can I get a Windows DLL version? - - The zlib sources can be compiled without change to produce a DLL. See the - file win32/DLL_FAQ.txt in the zlib distribution. Pointers to the - precompiled DLL are found in the zlib web site at http://zlib.net/ . - - 3. Where can I get a Visual Basic interface to zlib? - - See - * http://marknelson.us/1997/01/01/zlib-engine/ - * win32/DLL_FAQ.txt in the zlib distribution - - 4. compress() returns Z_BUF_ERROR. - - Make sure that before the call of compress(), the length of the compressed - buffer is equal to the available size of the compressed buffer and not - zero. For Visual Basic, check that this parameter is passed by reference - ("as any"), not by value ("as long"). - - 5. deflate() or inflate() returns Z_BUF_ERROR. - - Before making the call, make sure that avail_in and avail_out are not zero. - When setting the parameter flush equal to Z_FINISH, also make sure that - avail_out is big enough to allow processing all pending input. Note that a - Z_BUF_ERROR is not fatal--another call to deflate() or inflate() can be - made with more input or output space. A Z_BUF_ERROR may in fact be - unavoidable depending on how the functions are used, since it is not - possible to tell whether or not there is more output pending when - strm.avail_out returns with zero. See http://zlib.net/zlib_how.html for a - heavily annotated example. - - 6. Where's the zlib documentation (man pages, etc.)? - - It's in zlib.h . Examples of zlib usage are in the files test/example.c - and test/minigzip.c, with more in examples/ . - - 7. Why don't you use GNU autoconf or libtool or ...? - - Because we would like to keep zlib as a very small and simple package. - zlib is rather portable and doesn't need much configuration. - - 8. I found a bug in zlib. - - Most of the time, such problems are due to an incorrect usage of zlib. - Please try to reproduce the problem with a small program and send the - corresponding source to us at zlib@gzip.org . Do not send multi-megabyte - data files without prior agreement. - - 9. Why do I get "undefined reference to gzputc"? - - If "make test" produces something like - - example.o(.text+0x154): undefined reference to `gzputc' - - check that you don't have old files libz.* in /usr/lib, /usr/local/lib or - /usr/X11R6/lib. Remove any old versions, then do "make install". - -10. I need a Delphi interface to zlib. - - See the contrib/delphi directory in the zlib distribution. - -11. Can zlib handle .zip archives? - - Not by itself, no. See the directory contrib/minizip in the zlib - distribution. - -12. Can zlib handle .Z files? - - No, sorry. You have to spawn an uncompress or gunzip subprocess, or adapt - the code of uncompress on your own. - -13. How can I make a Unix shared library? - - By default a shared (and a static) library is built for Unix. So: - - make distclean - ./configure - make - -14. How do I install a shared zlib library on Unix? - - After the above, then: - - make install - - However, many flavors of Unix come with a shared zlib already installed. - Before going to the trouble of compiling a shared version of zlib and - trying to install it, you may want to check if it's already there! If you - can #include <zlib.h>, it's there. The -lz option will probably link to - it. You can check the version at the top of zlib.h or with the - ZLIB_VERSION symbol defined in zlib.h . - -15. I have a question about OttoPDF. - - We are not the authors of OttoPDF. The real author is on the OttoPDF web - site: Joel Hainley, jhainley@myndkryme.com. - -16. Can zlib decode Flate data in an Adobe PDF file? - - Yes. See http://www.pdflib.com/ . To modify PDF forms, see - http://sourceforge.net/projects/acroformtool/ . - -17. Why am I getting this "register_frame_info not found" error on Solaris? - - After installing zlib 1.1.4 on Solaris 2.6, running applications using zlib - generates an error such as: - - ld.so.1: rpm: fatal: relocation error: file /usr/local/lib/libz.so: - symbol __register_frame_info: referenced symbol not found - - The symbol __register_frame_info is not part of zlib, it is generated by - the C compiler (cc or gcc). You must recompile applications using zlib - which have this problem. This problem is specific to Solaris. See - http://www.sunfreeware.com for Solaris versions of zlib and applications - using zlib. - -18. Why does gzip give an error on a file I make with compress/deflate? - - The compress and deflate functions produce data in the zlib format, which - is different and incompatible with the gzip format. The gz* functions in - zlib on the other hand use the gzip format. Both the zlib and gzip formats - use the same compressed data format internally, but have different headers - and trailers around the compressed data. - -19. Ok, so why are there two different formats? - - The gzip format was designed to retain the directory information about a - single file, such as the name and last modification date. The zlib format - on the other hand was designed for in-memory and communication channel - applications, and has a much more compact header and trailer and uses a - faster integrity check than gzip. - -20. Well that's nice, but how do I make a gzip file in memory? - - You can request that deflate write the gzip format instead of the zlib - format using deflateInit2(). You can also request that inflate decode the - gzip format using inflateInit2(). Read zlib.h for more details. - -21. Is zlib thread-safe? - - Yes. However any library routines that zlib uses and any application- - provided memory allocation routines must also be thread-safe. zlib's gz* - functions use stdio library routines, and most of zlib's functions use the - library memory allocation routines by default. zlib's *Init* functions - allow for the application to provide custom memory allocation routines. - - Of course, you should only operate on any given zlib or gzip stream from a - single thread at a time. - -22. Can I use zlib in my commercial application? - - Yes. Please read the license in zlib.h. - -23. Is zlib under the GNU license? - - No. Please read the license in zlib.h. - -24. The license says that altered source versions must be "plainly marked". So - what exactly do I need to do to meet that requirement? - - You need to change the ZLIB_VERSION and ZLIB_VERNUM #defines in zlib.h. In - particular, the final version number needs to be changed to "f", and an - identification string should be appended to ZLIB_VERSION. Version numbers - x.x.x.f are reserved for modifications to zlib by others than the zlib - maintainers. For example, if the version of the base zlib you are altering - is "1.2.3.4", then in zlib.h you should change ZLIB_VERNUM to 0x123f, and - ZLIB_VERSION to something like "1.2.3.f-zachary-mods-v3". You can also - update the version strings in deflate.c and inftrees.c. - - For altered source distributions, you should also note the origin and - nature of the changes in zlib.h, as well as in ChangeLog and README, along - with the dates of the alterations. The origin should include at least your - name (or your company's name), and an email address to contact for help or - issues with the library. - - Note that distributing a compiled zlib library along with zlib.h and - zconf.h is also a source distribution, and so you should change - ZLIB_VERSION and ZLIB_VERNUM and note the origin and nature of the changes - in zlib.h as you would for a full source distribution. - -25. Will zlib work on a big-endian or little-endian architecture, and can I - exchange compressed data between them? - - Yes and yes. - -26. Will zlib work on a 64-bit machine? - - Yes. It has been tested on 64-bit machines, and has no dependence on any - data types being limited to 32-bits in length. If you have any - difficulties, please provide a complete problem report to zlib@gzip.org - -27. Will zlib decompress data from the PKWare Data Compression Library? - - No. The PKWare DCL uses a completely different compressed data format than - does PKZIP and zlib. However, you can look in zlib's contrib/blast - directory for a possible solution to your problem. - -28. Can I access data randomly in a compressed stream? - - No, not without some preparation. If when compressing you periodically use - Z_FULL_FLUSH, carefully write all the pending data at those points, and - keep an index of those locations, then you can start decompression at those - points. You have to be careful to not use Z_FULL_FLUSH too often, since it - can significantly degrade compression. Alternatively, you can scan a - deflate stream once to generate an index, and then use that index for - random access. See examples/zran.c . - -29. Does zlib work on MVS, OS/390, CICS, etc.? - - It has in the past, but we have not heard of any recent evidence. There - were working ports of zlib 1.1.4 to MVS, but those links no longer work. - If you know of recent, successful applications of zlib on these operating - systems, please let us know. Thanks. - -30. Is there some simpler, easier to read version of inflate I can look at to - understand the deflate format? - - First off, you should read RFC 1951. Second, yes. Look in zlib's - contrib/puff directory. - -31. Does zlib infringe on any patents? - - As far as we know, no. In fact, that was originally the whole point behind - zlib. Look here for some more information: - - http://www.gzip.org/#faq11 - -32. Can zlib work with greater than 4 GB of data? - - Yes. inflate() and deflate() will process any amount of data correctly. - Each call of inflate() or deflate() is limited to input and output chunks - of the maximum value that can be stored in the compiler's "unsigned int" - type, but there is no limit to the number of chunks. Note however that the - strm.total_in and strm_total_out counters may be limited to 4 GB. These - counters are provided as a convenience and are not used internally by - inflate() or deflate(). The application can easily set up its own counters - updated after each call of inflate() or deflate() to count beyond 4 GB. - compress() and uncompress() may be limited to 4 GB, since they operate in a - single call. gzseek() and gztell() may be limited to 4 GB depending on how - zlib is compiled. See the zlibCompileFlags() function in zlib.h. - - The word "may" appears several times above since there is a 4 GB limit only - if the compiler's "long" type is 32 bits. If the compiler's "long" type is - 64 bits, then the limit is 16 exabytes. - -33. Does zlib have any security vulnerabilities? - - The only one that we are aware of is potentially in gzprintf(). If zlib is - compiled to use sprintf() or vsprintf(), then there is no protection - against a buffer overflow of an 8K string space (or other value as set by - gzbuffer()), other than the caller of gzprintf() assuring that the output - will not exceed 8K. On the other hand, if zlib is compiled to use - snprintf() or vsnprintf(), which should normally be the case, then there is - no vulnerability. The ./configure script will display warnings if an - insecure variation of sprintf() will be used by gzprintf(). Also the - zlibCompileFlags() function will return information on what variant of - sprintf() is used by gzprintf(). - - If you don't have snprintf() or vsnprintf() and would like one, you can - find a portable implementation here: - - http://www.ijs.si/software/snprintf/ - - Note that you should be using the most recent version of zlib. Versions - 1.1.3 and before were subject to a double-free vulnerability, and versions - 1.2.1 and 1.2.2 were subject to an access exception when decompressing - invalid compressed data. - -34. Is there a Java version of zlib? - - Probably what you want is to use zlib in Java. zlib is already included - as part of the Java SDK in the java.util.zip package. If you really want - a version of zlib written in the Java language, look on the zlib home - page for links: http://zlib.net/ . - -35. I get this or that compiler or source-code scanner warning when I crank it - up to maximally-pedantic. Can't you guys write proper code? - - Many years ago, we gave up attempting to avoid warnings on every compiler - in the universe. It just got to be a waste of time, and some compilers - were downright silly as well as contradicted each other. So now, we simply - make sure that the code always works. - -36. Valgrind (or some similar memory access checker) says that deflate is - performing a conditional jump that depends on an uninitialized value. - Isn't that a bug? - - No. That is intentional for performance reasons, and the output of deflate - is not affected. This only started showing up recently since zlib 1.2.x - uses malloc() by default for allocations, whereas earlier versions used - calloc(), which zeros out the allocated memory. Even though the code was - correct, versions 1.2.4 and later was changed to not stimulate these - checkers. - -37. Will zlib read the (insert any ancient or arcane format here) compressed - data format? - - Probably not. Look in the comp.compression FAQ for pointers to various - formats and associated software. - -38. How can I encrypt/decrypt zip files with zlib? - - zlib doesn't support encryption. The original PKZIP encryption is very - weak and can be broken with freely available programs. To get strong - encryption, use GnuPG, http://www.gnupg.org/ , which already includes zlib - compression. For PKZIP compatible "encryption", look at - http://www.info-zip.org/ - -39. What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings? - - "gzip" is the gzip format, and "deflate" is the zlib format. They should - probably have called the second one "zlib" instead to avoid confusion with - the raw deflate compressed data format. While the HTTP 1.1 RFC 2616 - correctly points to the zlib specification in RFC 1950 for the "deflate" - transfer encoding, there have been reports of servers and browsers that - incorrectly produce or expect raw deflate data per the deflate - specification in RFC 1951, most notably Microsoft. So even though the - "deflate" transfer encoding using the zlib format would be the more - efficient approach (and in fact exactly what the zlib format was designed - for), using the "gzip" transfer encoding is probably more reliable due to - an unfortunate choice of name on the part of the HTTP 1.1 authors. - - Bottom line: use the gzip format for HTTP 1.1 encoding. - -40. Does zlib support the new "Deflate64" format introduced by PKWare? - - No. PKWare has apparently decided to keep that format proprietary, since - they have not documented it as they have previous compression formats. In - any case, the compression improvements are so modest compared to other more - modern approaches, that it's not worth the effort to implement. - -41. I'm having a problem with the zip functions in zlib, can you help? - - There are no zip functions in zlib. You are probably using minizip by - Giles Vollant, which is found in the contrib directory of zlib. It is not - part of zlib. In fact none of the stuff in contrib is part of zlib. The - files in there are not supported by the zlib authors. You need to contact - the authors of the respective contribution for help. - -42. The match.asm code in contrib is under the GNU General Public License. - Since it's part of zlib, doesn't that mean that all of zlib falls under the - GNU GPL? - - No. The files in contrib are not part of zlib. They were contributed by - other authors and are provided as a convenience to the user within the zlib - distribution. Each item in contrib has its own license. - -43. Is zlib subject to export controls? What is its ECCN? - - zlib is not subject to export controls, and so is classified as EAR99. - -44. Can you please sign these lengthy legal documents and fax them back to us - so that we can use your software in our product? - - No. Go away. Shoo. diff --git a/common/zlib/Makefile b/common/zlib/Makefile deleted file mode 100644 index 2f68e0ea2..000000000 --- a/common/zlib/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -MYSRCPATHS = ../../common/zlib -MYSRCS = deflate.c adler32.c trees.c zutil.c inflate.c inffast.c inftrees.c -MYINCLUDES = -I../../common/zlib -MYCFLAGS = -Wno-strict-prototypes -Wno-missing-prototypes -Wno-missing-declarations -Wno-old-style-definition -Wno-implicit-fallthrough -MYDEFS = -DZ_SOLO -DNO_GZIP -DZLIB_PM3_TUNED -#-DDEBUG -Dverbose=1 - -LIB_A = libz.a - -include ../../Makefile.host diff --git a/common/zlib/README b/common/zlib/README deleted file mode 100644 index 51106de47..000000000 --- a/common/zlib/README +++ /dev/null @@ -1,115 +0,0 @@ -ZLIB DATA COMPRESSION LIBRARY - -zlib 1.2.11 is a general purpose data compression library. All the code is -thread safe. The data format used by the zlib library is described by RFCs -(Request for Comments) 1950 to 1952 in the files -http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and -rfc1952 (gzip format). - -All functions of the compression library are documented in the file zlib.h -(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example -of the library is given in the file test/example.c which also tests that -the library is working correctly. Another example is given in the file -test/minigzip.c. The compression library itself is composed of all source -files in the root directory. - -To compile all files and run the test program, follow the instructions given at -the top of Makefile.in. In short "./configure; make test", and if that goes -well, "make install" should work for most flavors of Unix. For Windows, use -one of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use -make_vms.com. - -Questions about zlib should be sent to <zlib@gzip.org>, or to Gilles Vollant -<info@winimage.com> for the Windows DLL version. The zlib home page is -http://zlib.net/ . Before reporting a problem, please check this site to -verify that you have the latest version of zlib; otherwise get the latest -version and check whether the problem still exists or not. - -PLEASE read the zlib FAQ http://zlib.net/zlib_faq.html before asking for help. - -Mark Nelson <markn@ieee.org> wrote an article about zlib for the Jan. 1997 -issue of Dr. Dobb's Journal; a copy of the article is available at -http://marknelson.us/1997/01/01/zlib-engine/ . - -The changes made in version 1.2.11 are documented in the file ChangeLog. - -Unsupported third party contributions are provided in directory contrib/ . - -zlib is available in Java using the java.util.zip package, documented at -http://java.sun.com/developer/technicalArticles/Programming/compression/ . - -A Perl interface to zlib written by Paul Marquess <pmqs@cpan.org> is available -at CPAN (Comprehensive Perl Archive Network) sites, including -http://search.cpan.org/~pmqs/IO-Compress-Zlib/ . - -A Python interface to zlib written by A.M. Kuchling <amk@amk.ca> is -available in Python 1.5 and later versions, see -http://docs.python.org/library/zlib.html . - -zlib is built into tcl: http://wiki.tcl.tk/4610 . - -An experimental package to read and write files in .zip format, written on top -of zlib by Gilles Vollant <info@winimage.com>, is available in the -contrib/minizip directory of zlib. - - -Notes for some targets: - -- For Windows DLL versions, please see win32/DLL_FAQ.txt - -- For 64-bit Irix, deflate.c must be compiled without any optimization. With - -O, one libpng test fails. The test works in 32 bit mode (with the -n32 - compiler flag). The compiler bug has been reported to SGI. - -- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works - when compiled with cc. - -- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is - necessary to get gzprintf working correctly. This is done by configure. - -- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with - other compilers. Use "make test" to check your compiler. - -- gzdopen is not supported on RISCOS or BEOS. - -- For PalmOs, see http://palmzlib.sourceforge.net/ - - -Acknowledgments: - - The deflate format used by zlib was defined by Phil Katz. The deflate and - zlib specifications were written by L. Peter Deutsch. Thanks to all the - people who reported problems and suggested various improvements in zlib; they - are too numerous to cite here. - -Copyright notice: - - (C) 1995-2017 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - -If you use the zlib library in a product, we would appreciate *not* receiving -lengthy legal documents to sign. The sources are provided for free but without -warranty of any kind. The library has been entirely written by Jean-loup -Gailly and Mark Adler; it does not include third-party code. - -If you redistribute modified sources, we would appreciate that you include in -the file ChangeLog history information documenting your changes. Please read -the FAQ for more information on the distribution of modified source versions. diff --git a/common/zlib/README_proxmark3 b/common/zlib/README_proxmark3 deleted file mode 100644 index 0c7babf57..000000000 --- a/common/zlib/README_proxmark3 +++ /dev/null @@ -1,63 +0,0 @@ -This version of zlib is modified for use within the Proxmark3 project. -Files from the original distribution which are not required for this -purpose are not included. All modifications can easily be found -by searching for #ifdef ZLIB_PM3_TUNED and #ifndef ZLIB_PM3_TUNED. - -Current zlib base version is 1.2.11 - -ChangeLog for Proxmark3 project only ------------------------------------- - -Changes in 1.2.11.f-Proxmark3 (26 May 2015) -- port 1.2.11 upstream changes to 1.2.8.f-Proxmark3 - -Changes in 1.2.8.f-Proxmark3 (26 May 2015) -- disable decoding of fixed code blocks in deflate (eliminates the need - to store the fixed tree in RAM or ROM) -- disable generating fixed code blocks in inflate -- look harder for local optimum of consecutive matches and single literals - in inflate. -- stripped down version - unnecessary files from original distribution - are not included - -Notes on porting 1.2.11 upstream changes to 1.2.8.f-Proxmark3 -------------------------------------------------------------- - -mkdir zlib-1.2.8-stripped -for f in adler32.c ChangeLog deflate.c deflate.h FAQ inffast.c inffast.h inffixed.h inflate.c inflate.h inftrees.c inftrees.h README trees.c trees.h zconf.h zlib.h zutil.c zutil.h; do - cp zlib-1.2.8/$f zlib-1.2.8-stripped -done -# make style -find zlib-1.2.8-stripped -name "*.[ch]" \ - -exec perl -pi -e 's/[ \t]+$$//' {} \; \ - -exec sh -c "tail -c1 {} | xxd -p | tail -1 | grep -q -v 0a$$" \; \ - -exec sh -c "echo >> {}" \; \ - -exec astyle --formatted --mode=c --suffix=none \ - --indent=spaces=4 --indent-switches \ - --keep-one-line-blocks --max-instatement-indent=60 \ - --style=google --pad-oper --unpad-paren --pad-header \ - --align-pointer=name {} \; -diff -Naur zlib-1.2.8-stripped zlib > zlib-1.2.8-pm3.diff - -mkdir zlib-1.2.11-stripped -for f in adler32.c ChangeLog deflate.c deflate.h FAQ inffast.c inffast.h inffixed.h inflate.c inflate.h inftrees.c inftrees.h README trees.c trees.h zconf.h zlib.h zutil.c zutil.h; do - cp zlib-1.2.11/$f zlib-1.2.11-stripped -done -# make style -find zlib-1.2.11-stripped -name "*.[ch]" \ - -exec perl -pi -e 's/[ \t]+$$//' {} \; \ - -exec sh -c "tail -c1 {} | xxd -p | tail -1 | grep -q -v 0a$$" \; \ - -exec sh -c "echo >> {}" \; \ - -exec astyle --formatted --mode=c --suffix=none \ - --indent=spaces=4 --indent-switches \ - --keep-one-line-blocks --max-instatement-indent=60 \ - --style=google --pad-oper --unpad-paren --pad-header \ - --align-pointer=name {} \; - -diff -Naur zlib-1.2.8-stripped zlib-1.2.11-stripped > zlib-1.2.8-to-1.2.11.diff - -cd zlib -patch -p1 < ../zlib-1.2.8-to-1.2.11.diff -# fix .rej files manually... - -diff -Naur zlib-1.2.11-stripped zlib > zlib-1.2.11-pm3.diff diff --git a/common/zlib/adler32.c b/common/zlib/adler32.c deleted file mode 100644 index 962e1ee91..000000000 --- a/common/zlib/adler32.c +++ /dev/null @@ -1,187 +0,0 @@ -/* adler32.c -- compute the Adler-32 checksum of a data stream - * Copyright (C) 1995-2011, 2016 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#include "zutil.h" - -local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); - -#define BASE 65521U /* largest prime smaller than 65536 */ -#define NMAX 5552 -/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ - -#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} -#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); -#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); -#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); -#define DO16(buf) DO8(buf,0); DO8(buf,8); - -/* use NO_DIVIDE if your processor does not do division in hardware -- - try it both ways to see which is faster */ -#ifdef NO_DIVIDE -/* note that this assumes BASE is 65521, where 65536 % 65521 == 15 - (thank you to John Reiser for pointing this out) */ -# define CHOP(a) \ - do { \ - unsigned long tmp = a >> 16; \ - a &= 0xffffUL; \ - a += (tmp << 4) - tmp; \ - } while (0) -# define MOD28(a) \ - do { \ - CHOP(a); \ - if (a >= BASE) a -= BASE; \ - } while (0) -# define MOD(a) \ - do { \ - CHOP(a); \ - MOD28(a); \ - } while (0) -# define MOD63(a) \ - do { /* this assumes a is not negative */ \ - z_off64_t tmp = a >> 32; \ - a &= 0xffffffffL; \ - a += (tmp << 8) - (tmp << 5) + tmp; \ - tmp = a >> 16; \ - a &= 0xffffL; \ - a += (tmp << 4) - tmp; \ - tmp = a >> 16; \ - a &= 0xffffL; \ - a += (tmp << 4) - tmp; \ - if (a >= BASE) a -= BASE; \ - } while (0) -#else -# define MOD(a) a %= BASE -# define MOD28(a) a %= BASE -# define MOD63(a) a %= BASE -#endif - -/* ========================================================================= */ -uLong ZEXPORT adler32_z(adler, buf, len) -uLong adler; -const Bytef *buf; -z_size_t len; -{ - unsigned long sum2; - unsigned n; - - /* split Adler-32 into component sums */ - sum2 = (adler >> 16) & 0xffff; - adler &= 0xffff; - - /* in case user likes doing a byte at a time, keep it fast */ - if (len == 1) { - adler += buf[0]; - if (adler >= BASE) - adler -= BASE; - sum2 += adler; - if (sum2 >= BASE) - sum2 -= BASE; - return adler | (sum2 << 16); - } - - /* initial Adler-32 value (deferred check for len == 1 speed) */ - if (buf == Z_NULL) - return 1L; - - /* in case short lengths are provided, keep it somewhat fast */ - if (len < 16) { - while (len--) { - adler += *buf++; - sum2 += adler; - } - if (adler >= BASE) - adler -= BASE; - MOD28(sum2); /* only added so many BASE's */ - return adler | (sum2 << 16); - } - - /* do length NMAX blocks -- requires just one modulo operation */ - while (len >= NMAX) { - len -= NMAX; - n = NMAX / 16; /* NMAX is divisible by 16 */ - do { - DO16(buf); /* 16 sums unrolled */ - buf += 16; - } while (--n); - MOD(adler); - MOD(sum2); - } - - /* do remaining bytes (less than NMAX, still just one modulo) */ - if (len) { /* avoid modulos if none remaining */ - while (len >= 16) { - len -= 16; - DO16(buf); - buf += 16; - } - while (len--) { - adler += *buf++; - sum2 += adler; - } - MOD(adler); - MOD(sum2); - } - - /* return recombined sums */ - return adler | (sum2 << 16); -} - -/* ========================================================================= */ -uLong ZEXPORT adler32(adler, buf, len) -uLong adler; -const Bytef *buf; -uInt len; -{ - return adler32_z(adler, buf, len); -} - -/* ========================================================================= */ -local uLong adler32_combine_(adler1, adler2, len2) -uLong adler1; -uLong adler2; -z_off64_t len2; -{ - unsigned long sum1; - unsigned long sum2; - unsigned rem; - - /* for negative len, return invalid adler32 as a clue for debugging */ - if (len2 < 0) - return 0xffffffffUL; - - /* the derivation of this formula is left as an exercise for the reader */ - MOD63(len2); /* assumes len2 >= 0 */ - rem = (unsigned)len2; - sum1 = adler1 & 0xffff; - sum2 = rem * sum1; - MOD(sum2); - sum1 += (adler2 & 0xffff) + BASE - 1; - sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; - if (sum1 >= BASE) sum1 -= BASE; - if (sum1 >= BASE) sum1 -= BASE; - if (sum2 >= ((unsigned long)BASE << 1)) sum2 -= ((unsigned long)BASE << 1); - if (sum2 >= BASE) sum2 -= BASE; - return sum1 | (sum2 << 16); -} - -/* ========================================================================= */ -uLong ZEXPORT adler32_combine(adler1, adler2, len2) -uLong adler1; -uLong adler2; -z_off_t len2; -{ - return adler32_combine_(adler1, adler2, len2); -} - -uLong ZEXPORT adler32_combine64(adler1, adler2, len2) -uLong adler1; -uLong adler2; -z_off64_t len2; -{ - return adler32_combine_(adler1, adler2, len2); -} - diff --git a/common/zlib/deflate.c b/common/zlib/deflate.c deleted file mode 100644 index f06654f95..000000000 --- a/common/zlib/deflate.c +++ /dev/null @@ -1,2257 +0,0 @@ -/* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * ALGORITHM - * - * The "deflation" process depends on being able to identify portions - * of the input text which are identical to earlier input (within a - * sliding window trailing behind the input currently being processed). - * - * The most straightforward technique turns out to be the fastest for - * most input files: try all possible matches and select the longest. - * The key feature of this algorithm is that insertions into the string - * dictionary are very simple and thus fast, and deletions are avoided - * completely. Insertions are performed at each input character, whereas - * string matches are performed only when the previous match ends. So it - * is preferable to spend more time in matches to allow very fast string - * insertions and avoid deletions. The matching algorithm for small - * strings is inspired from that of Rabin & Karp. A brute force approach - * is used to find longer strings when a small match has been found. - * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze - * (by Leonid Broukhis). - * A previous version of this file used a more sophisticated algorithm - * (by Fiala and Greene) which is guaranteed to run in linear amortized - * time, but has a larger average cost, uses more memory and is patented. - * However the F&G algorithm may be faster for some highly redundant - * files if the parameter max_chain_length (described below) is too large. - * - * ACKNOWLEDGEMENTS - * - * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and - * I found it in 'freeze' written by Leonid Broukhis. - * Thanks to many people for bug reports and testing. - * - * REFERENCES - * - * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". - * Available in http://tools.ietf.org/html/rfc1951 - * - * A description of the Rabin and Karp algorithm is given in the book - * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. - * - * Fiala,E.R., and Greene,D.H. - * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 - * - */ - -/* @(#) $Id$ */ - -#include "deflate.h" - -const char deflate_copyright[] = -#ifdef ZLIB_PM3_TUNED - " deflate 1.2.11.f-Proxmark3 Copyright 1995-2017 Jean-loup Gailly and Mark Adler "; -#else - " deflate 1.2.11 Copyright 1995-2017 Jean-loup Gailly and Mark Adler "; -#endif -/* - If you use the zlib library in a product, an acknowledgment is welcome - in the documentation of your product. If for some reason you cannot - include such an acknowledgment, I would appreciate that you keep this - copyright string in the executable of your product. - */ - -/* =========================================================================== - * Function prototypes. - */ -typedef enum { - need_more, /* block not completed, need more input or more output */ - block_done, /* block flush performed */ - finish_started, /* finish started, need only more output at next deflate */ - finish_done /* finish done, accept no more input or output */ -} block_state; - -typedef block_state(*compress_func) OF((deflate_state *s, int flush)); -/* Compression function. Returns the block state after the call. */ - -local int deflateStateCheck OF((z_streamp strm)); -local void slide_hash OF((deflate_state *s)); -local void fill_window OF((deflate_state *s)); -local block_state deflate_stored OF((deflate_state *s, int flush)); -local block_state deflate_fast OF((deflate_state *s, int flush)); -#ifdef ZLIB_PM3_TUNED -local uInt try_harder OF((deflate_state *s, uInt strstart, uInt lookahead, IPos hash_head)); -#endif -#ifndef FASTEST -local block_state deflate_slow OF((deflate_state *s, int flush)); -#endif -local block_state deflate_rle OF((deflate_state *s, int flush)); -local block_state deflate_huff OF((deflate_state *s, int flush)); -local void lm_init OF((deflate_state *s)); -local void putShortMSB OF((deflate_state *s, uInt b)); -local void flush_pending OF((z_streamp strm)); -local unsigned read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); -#ifdef ASMV -# pragma message("Assembler code may have bugs -- use at your own risk") -void match_init OF((void)); /* asm code initialization */ -uInt longest_match OF((deflate_state *s, IPos cur_match)); -#else -local uInt longest_match OF((deflate_state *s, IPos cur_match)); -#endif - -#ifdef ZLIB_DEBUG -local void check_match OF((deflate_state *s, IPos start, IPos match, - int length)); -#endif - -/* =========================================================================== - * Local data - */ - -#define NIL 0 -/* Tail of hash chains */ - -#ifndef TOO_FAR -# define TOO_FAR 4096 -#endif -/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ - -/* Values for max_lazy_match, good_match and max_chain_length, depending on - * the desired pack level (0..9). The values given below have been tuned to - * exclude worst case performance for pathological files. Better values may be - * found for specific files. - */ -typedef struct config_s { - ush good_length; /* reduce lazy search above this match length */ - ush max_lazy; /* do not perform lazy search above this match length */ - ush nice_length; /* quit search above this match length */ - ush max_chain; - compress_func func; -} config; - -#ifdef FASTEST -local const config configuration_table[2] = { - /* good lazy nice chain */ - /* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ - /* 1 */ {4, 4, 8, 4, deflate_fast} -}; /* max speed, no lazy matches */ -#else -local const config configuration_table[10] = { - /* good lazy nice chain */ - /* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ - /* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ - /* 2 */ {4, 5, 16, 8, deflate_fast}, - /* 3 */ {4, 6, 32, 32, deflate_fast}, - - /* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ - /* 5 */ {8, 16, 32, 32, deflate_slow}, - /* 6 */ {8, 16, 128, 128, deflate_slow}, - /* 7 */ {8, 32, 128, 256, deflate_slow}, - /* 8 */ {32, 128, 258, 1024, deflate_slow}, - /* 9 */ {32, 258, 258, 4096, deflate_slow} -}; /* max compression */ -#endif - -/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 - * For deflate_fast() (levels <= 3) good is ignored and lazy has a different - * meaning. - */ - -/* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */ -#define RANK(f) (((f) * 2) - ((f) > 4 ? 9 : 0)) - -/* =========================================================================== - * Update a hash value with the given input byte - * IN assertion: all calls to UPDATE_HASH are made with consecutive input - * characters, so that a running hash key can be computed from the previous - * key instead of complete recalculation each time. - */ -#define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask) - - -/* =========================================================================== - * Insert string str in the dictionary and set match_head to the previous head - * of the hash chain (the most recent string with same hash key). Return - * the previous length of the hash chain. - * If this file is compiled with -DFASTEST, the compression level is forced - * to 1, and no hash chains are maintained. - * IN assertion: all calls to INSERT_STRING are made with consecutive input - * characters and the first MIN_MATCH bytes of str are valid (except for - * the last MIN_MATCH-1 bytes of the input file). - */ -#ifdef FASTEST -#define INSERT_STRING(s, str, match_head) \ - (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ - match_head = s->head[s->ins_h], \ - s->head[s->ins_h] = (Pos)(str)) -#else -#define INSERT_STRING(s, str, match_head) \ - (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ - match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ - s->head[s->ins_h] = (Pos)(str)) -#endif - -/* =========================================================================== - * Initialize the hash table (avoiding 64K overflow for 16 bit systems). - * prev[] will be initialized on the fly. - */ -#define CLEAR_HASH(s) {\ - s->head[s->hash_size-1] = NIL; \ - zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); \ -} - -/* =========================================================================== - * Slide the hash table when sliding the window down (could be avoided with 32 - * bit values at the expense of memory usage). We slide even when level == 0 to - * keep the hash table consistent if we switch back to level > 0 later. - */ -local void slide_hash(s) -deflate_state *s; -{ - unsigned n, m; - Posf *p; - uInt wsize = s->w_size; - - n = s->hash_size; - p = &s->head[n]; - do { - m = *--p; - *p = (Pos)(m >= wsize ? m - wsize : NIL); - } while (--n); - n = wsize; -#ifndef FASTEST - p = &s->prev[n]; - do { - m = *--p; - *p = (Pos)(m >= wsize ? m - wsize : NIL); - /* If n is not on any hash chain, prev[n] is garbage but - * its value will never be used. - */ - } while (--n); -#endif -} - -/* ========================================================================= */ -int ZEXPORT deflateInit_(strm, level, version, stream_size) -z_streamp strm; -int level; -const char *version; -int stream_size; -{ - return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, - Z_DEFAULT_STRATEGY, version, stream_size); - /* To do: ignore strm->next_in if we use it as window */ -} - -/* ========================================================================= */ -int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, - version, stream_size) -z_streamp strm; -int level; -int method; -int windowBits; -int memLevel; -int strategy; -const char *version; -int stream_size; -{ - deflate_state *s; - int wrap = 1; - static const char my_version[] = ZLIB_VERSION; - - ushf *overlay; - /* We overlay pending_buf and d_buf+l_buf. This works since the average - * output size for (length,distance) codes is <= 24 bits. - */ - - if (version == Z_NULL || version[0] != my_version[0] || - stream_size != sizeof(z_stream)) { - return Z_VERSION_ERROR; - } - if (strm == Z_NULL) return Z_STREAM_ERROR; - - strm->msg = Z_NULL; - if (strm->zalloc == (alloc_func)0) { -#ifdef Z_SOLO - return Z_STREAM_ERROR; -#else - strm->zalloc = zcalloc; - strm->opaque = (voidpf)0; -#endif - } - if (strm->zfree == (free_func)0) -#ifdef Z_SOLO - return Z_STREAM_ERROR; -#else - strm->zfree = zcfree; -#endif - -#ifdef FASTEST - if (level != 0) level = 1; -#else - if (level == Z_DEFAULT_COMPRESSION) level = 6; -#endif - - if (windowBits < 0) { /* suppress zlib wrapper */ - wrap = 0; - windowBits = -windowBits; - } -#ifdef GZIP - else if (windowBits > 15) { - wrap = 2; /* write gzip wrapper instead */ - windowBits -= 16; - } -#endif - if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || - windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || - strategy < 0 || strategy > Z_FIXED || (windowBits == 8 && wrap != 1)) { - return Z_STREAM_ERROR; - } - if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ - s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); - if (s == Z_NULL) return Z_MEM_ERROR; - strm->state = (struct internal_state FAR *)s; - s->strm = strm; - s->status = INIT_STATE; /* to pass state test in deflateReset() */ - - s->wrap = wrap; - s->gzhead = Z_NULL; - s->w_bits = (uInt)windowBits; - s->w_size = 1 << s->w_bits; - s->w_mask = s->w_size - 1; - - s->hash_bits = (uInt)memLevel + 7; - s->hash_size = 1 << s->hash_bits; - s->hash_mask = s->hash_size - 1; - s->hash_shift = ((s->hash_bits + MIN_MATCH - 1) / MIN_MATCH); - - s->window = (Bytef *) ZALLOC(strm, s->w_size, 2 * sizeof(Byte)); - s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); - s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); - - s->high_water = 0; /* nothing written to s->window yet */ - - s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ - - overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush) + 2); - s->pending_buf = (uchf *) overlay; - s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush) + 2L); - - if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || - s->pending_buf == Z_NULL) { - s->status = FINISH_STATE; - strm->msg = ERR_MSG(Z_MEM_ERROR); - deflateEnd(strm); - return Z_MEM_ERROR; - } - s->d_buf = overlay + s->lit_bufsize / sizeof(ush); - s->l_buf = s->pending_buf + (1 + sizeof(ush)) * s->lit_bufsize; - - s->level = level; - s->strategy = strategy; - s->method = (Byte)method; - - return deflateReset(strm); -} - -/* ========================================================================= - * Check for a valid deflate stream state. Return 0 if ok, 1 if not. - */ -local int deflateStateCheck(strm) -z_streamp strm; -{ - deflate_state *s; - if (strm == Z_NULL || - strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) - return 1; - s = strm->state; - if (s == Z_NULL || s->strm != strm || (s->status != INIT_STATE && -#ifdef GZIP - s->status != GZIP_STATE && -#endif - s->status != EXTRA_STATE && - s->status != NAME_STATE && - s->status != COMMENT_STATE && - s->status != HCRC_STATE && - s->status != BUSY_STATE && - s->status != FINISH_STATE)) - return 1; - return 0; -} - -/* ========================================================================= */ -int ZEXPORT deflateSetDictionary(strm, dictionary, dictLength) -z_streamp strm; -const Bytef *dictionary; -uInt dictLength; -{ - deflate_state *s; - uInt str, n; - int wrap; - unsigned avail; - z_const unsigned char *next; - - if (deflateStateCheck(strm) || dictionary == Z_NULL) - return Z_STREAM_ERROR; - s = strm->state; - wrap = s->wrap; - if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead) - return Z_STREAM_ERROR; - - /* when using zlib wrappers, compute Adler-32 for provided dictionary */ - if (wrap == 1) - strm->adler = adler32(strm->adler, dictionary, dictLength); - s->wrap = 0; /* avoid computing Adler-32 in read_buf */ - - /* if dictionary would fill window, just replace the history */ - if (dictLength >= s->w_size) { - if (wrap == 0) { /* already empty otherwise */ - CLEAR_HASH(s); - s->strstart = 0; - s->block_start = 0L; - s->insert = 0; - } - dictionary += dictLength - s->w_size; /* use the tail */ - dictLength = s->w_size; - } - - /* insert dictionary into window and hash */ - avail = strm->avail_in; - next = strm->next_in; - strm->avail_in = dictLength; - strm->next_in = (z_const Bytef *)dictionary; - fill_window(s); - while (s->lookahead >= MIN_MATCH) { - str = s->strstart; - n = s->lookahead - (MIN_MATCH - 1); - do { - UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH - 1]); -#ifndef FASTEST - s->prev[str & s->w_mask] = s->head[s->ins_h]; -#endif - s->head[s->ins_h] = (Pos)str; - str++; - } while (--n); - s->strstart = str; - s->lookahead = MIN_MATCH - 1; - fill_window(s); - } - s->strstart += s->lookahead; - s->block_start = (long)s->strstart; - s->insert = s->lookahead; - s->lookahead = 0; - s->match_length = s->prev_length = MIN_MATCH - 1; - s->match_available = 0; - strm->next_in = next; - strm->avail_in = avail; - s->wrap = wrap; - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateGetDictionary(strm, dictionary, dictLength) -z_streamp strm; -Bytef *dictionary; -uInt *dictLength; -{ - deflate_state *s; - uInt len; - - if (deflateStateCheck(strm)) - return Z_STREAM_ERROR; - s = strm->state; - len = s->strstart + s->lookahead; - if (len > s->w_size) - len = s->w_size; - if (dictionary != Z_NULL && len) - zmemcpy(dictionary, s->window + s->strstart + s->lookahead - len, len); - if (dictLength != Z_NULL) - *dictLength = len; - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateResetKeep(strm) -z_streamp strm; -{ - deflate_state *s; - - if (deflateStateCheck(strm)) { - return Z_STREAM_ERROR; - } - - strm->total_in = strm->total_out = 0; - strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ - strm->data_type = Z_UNKNOWN; - - s = (deflate_state *)strm->state; - s->pending = 0; - s->pending_out = s->pending_buf; - - if (s->wrap < 0) { - s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ - } - s->status = -#ifdef GZIP - s->wrap == 2 ? GZIP_STATE : -#endif - s->wrap ? INIT_STATE : BUSY_STATE; - strm->adler = -#ifdef GZIP - s->wrap == 2 ? crc32(0L, Z_NULL, 0) : -#endif - adler32(0L, Z_NULL, 0); - s->last_flush = Z_NO_FLUSH; - - _tr_init(s); - - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateReset(strm) -z_streamp strm; -{ - int ret; - - ret = deflateResetKeep(strm); - if (ret == Z_OK) - lm_init(strm->state); - return ret; -} - -/* ========================================================================= */ -int ZEXPORT deflateSetHeader(strm, head) -z_streamp strm; -gz_headerp head; -{ - if (deflateStateCheck(strm) || strm->state->wrap != 2) - return Z_STREAM_ERROR; - strm->state->gzhead = head; - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflatePending(strm, pending, bits) -unsigned *pending; -int *bits; -z_streamp strm; -{ - if (deflateStateCheck(strm)) return Z_STREAM_ERROR; - if (pending != Z_NULL) - *pending = strm->state->pending; - if (bits != Z_NULL) - *bits = strm->state->bi_valid; - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflatePrime(strm, bits, value) -z_streamp strm; -int bits; -int value; -{ - deflate_state *s; - int put; - - if (deflateStateCheck(strm)) return Z_STREAM_ERROR; - s = strm->state; - if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) - return Z_BUF_ERROR; - do { - put = Buf_size - s->bi_valid; - if (put > bits) - put = bits; - s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid); - s->bi_valid += put; - _tr_flush_bits(s); - value >>= put; - bits -= put; - } while (bits); - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateParams(strm, level, strategy) -z_streamp strm; -int level; -int strategy; -{ - deflate_state *s; - compress_func func; - - if (deflateStateCheck(strm)) return Z_STREAM_ERROR; - s = strm->state; - -#ifdef FASTEST - if (level != 0) level = 1; -#else - if (level == Z_DEFAULT_COMPRESSION) level = 6; -#endif - if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { - return Z_STREAM_ERROR; - } - func = configuration_table[s->level].func; - - if ((strategy != s->strategy || func != configuration_table[level].func) && - s->high_water) { - /* Flush the last buffer: */ - int err = deflate(strm, Z_BLOCK); - if (err == Z_STREAM_ERROR) - return err; - if (strm->avail_out == 0) - return Z_BUF_ERROR; - } - if (s->level != level) { - if (s->level == 0 && s->matches != 0) { - if (s->matches == 1) - slide_hash(s); - else - CLEAR_HASH(s); - s->matches = 0; - } - s->level = level; - s->max_lazy_match = configuration_table[level].max_lazy; - s->good_match = configuration_table[level].good_length; - s->nice_match = configuration_table[level].nice_length; - s->max_chain_length = configuration_table[level].max_chain; - } - s->strategy = strategy; - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) -z_streamp strm; -int good_length; -int max_lazy; -int nice_length; -int max_chain; -{ - deflate_state *s; - - if (deflateStateCheck(strm)) return Z_STREAM_ERROR; - s = strm->state; - s->good_match = (uInt)good_length; - s->max_lazy_match = (uInt)max_lazy; - s->nice_match = nice_length; - s->max_chain_length = (uInt)max_chain; - return Z_OK; -} - -/* ========================================================================= - * For the default windowBits of 15 and memLevel of 8, this function returns - * a close to exact, as well as small, upper bound on the compressed size. - * They are coded as constants here for a reason--if the #define's are - * changed, then this function needs to be changed as well. The return - * value for 15 and 8 only works for those exact settings. - * - * For any setting other than those defaults for windowBits and memLevel, - * the value returned is a conservative worst case for the maximum expansion - * resulting from using fixed blocks instead of stored blocks, which deflate - * can emit on compressed data for some combinations of the parameters. - * - * This function could be more sophisticated to provide closer upper bounds for - * every combination of windowBits and memLevel. But even the conservative - * upper bound of about 14% expansion does not seem onerous for output buffer - * allocation. - */ -uLong ZEXPORT deflateBound(strm, sourceLen) -z_streamp strm; -uLong sourceLen; -{ - deflate_state *s; - uLong complen, wraplen; - - /* conservative upper bound for compressed data */ - complen = sourceLen + - ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; - - /* if can't get parameters, return conservative bound plus zlib wrapper */ - if (deflateStateCheck(strm)) - return complen + 6; - - /* compute wrapper length */ - s = strm->state; - switch (s->wrap) { - case 0: /* raw deflate */ - wraplen = 0; - break; - case 1: /* zlib wrapper */ - wraplen = 6 + (s->strstart ? 4 : 0); - break; -#ifdef GZIP - case 2: /* gzip wrapper */ - wraplen = 18; - if (s->gzhead != Z_NULL) { /* user-supplied gzip header */ - Bytef *str; - if (s->gzhead->extra != Z_NULL) - wraplen += 2 + s->gzhead->extra_len; - str = s->gzhead->name; - if (str != Z_NULL) - do { - wraplen++; - } while (*str++); - str = s->gzhead->comment; - if (str != Z_NULL) - do { - wraplen++; - } while (*str++); - if (s->gzhead->hcrc) - wraplen += 2; - } - break; -#endif - default: /* for compiler happiness */ - wraplen = 6; - } - - /* if not default parameters, return conservative bound */ - if (s->w_bits != 15 || s->hash_bits != 8 + 7) - return complen + wraplen; - - /* default settings: return tight bound for that case */ - return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + - (sourceLen >> 25) + 13 - 6 + wraplen; -} - -/* ========================================================================= - * Put a short in the pending buffer. The 16-bit value is put in MSB order. - * IN assertion: the stream state is correct and there is enough room in - * pending_buf. - */ -local void putShortMSB(s, b) -deflate_state *s; -uInt b; -{ - put_byte(s, (Byte)(b >> 8)); - put_byte(s, (Byte)(b & 0xff)); -} - -/* ========================================================================= - * Flush as much pending output as possible. All deflate() output, except for - * some deflate_stored() output, goes through this function so some - * applications may wish to modify it to avoid allocating a large - * strm->next_out buffer and copying into it. (See also read_buf()). - */ -local void flush_pending(strm) -z_streamp strm; -{ - unsigned len; - deflate_state *s = strm->state; - - _tr_flush_bits(s); - len = s->pending; - if (len > strm->avail_out) len = strm->avail_out; - if (len == 0) return; - - zmemcpy(strm->next_out, s->pending_out, len); - strm->next_out += len; - s->pending_out += len; - strm->total_out += len; - strm->avail_out -= len; - s->pending -= len; - if (s->pending == 0) { - s->pending_out = s->pending_buf; - } -} - -/* =========================================================================== - * Update the header CRC with the bytes s->pending_buf[beg..s->pending - 1]. - */ -#define HCRC_UPDATE(beg) \ - do { \ - if (s->gzhead->hcrc && s->pending > (beg)) \ - strm->adler = crc32(strm->adler, s->pending_buf + (beg), \ - s->pending - (beg)); \ - } while (0) - -/* ========================================================================= */ -int ZEXPORT deflate(strm, flush) -z_streamp strm; -int flush; -{ - int old_flush; /* value of flush param for previous deflate call */ - deflate_state *s; - - if (deflateStateCheck(strm) || flush > Z_BLOCK || flush < 0) { - return Z_STREAM_ERROR; - } - s = strm->state; - - if (strm->next_out == Z_NULL || - (strm->avail_in != 0 && strm->next_in == Z_NULL) || - (s->status == FINISH_STATE && flush != Z_FINISH)) { - ERR_RETURN(strm, Z_STREAM_ERROR); - } - if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); - - old_flush = s->last_flush; - s->last_flush = flush; - - /* Flush as much pending output as possible */ - if (s->pending != 0) { - flush_pending(strm); - if (strm->avail_out == 0) { - /* Since avail_out is 0, deflate will be called again with - * more output space, but possibly with both pending and - * avail_in equal to zero. There won't be anything to do, - * but this is not an error situation so make sure we - * return OK instead of BUF_ERROR at next call of deflate: - */ - s->last_flush = -1; - return Z_OK; - } - - /* Make sure there is something to do and avoid duplicate consecutive - * flushes. For repeated and useless calls with Z_FINISH, we keep - * returning Z_STREAM_END instead of Z_BUF_ERROR. - */ - } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) && - flush != Z_FINISH) { - ERR_RETURN(strm, Z_BUF_ERROR); - } - - /* User must not provide more input after the first FINISH: */ - if (s->status == FINISH_STATE && strm->avail_in != 0) { - ERR_RETURN(strm, Z_BUF_ERROR); - } - - /* Write the header */ - if (s->status == INIT_STATE) { - /* zlib header */ - uInt header = (Z_DEFLATED + ((s->w_bits - 8) << 4)) << 8; - uInt level_flags; - - if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) - level_flags = 0; - else if (s->level < 6) - level_flags = 1; - else if (s->level == 6) - level_flags = 2; - else - level_flags = 3; - header |= (level_flags << 6); - if (s->strstart != 0) header |= PRESET_DICT; - header += 31 - (header % 31); - - putShortMSB(s, header); - - /* Save the adler32 of the preset dictionary: */ - if (s->strstart != 0) { - putShortMSB(s, (uInt)(strm->adler >> 16)); - putShortMSB(s, (uInt)(strm->adler & 0xffff)); - } - strm->adler = adler32(0L, Z_NULL, 0); - s->status = BUSY_STATE; - - /* Compression must start with an empty pending buffer */ - flush_pending(strm); - if (s->pending != 0) { - s->last_flush = -1; - return Z_OK; - } - } -#ifdef GZIP - if (s->status == GZIP_STATE) { - /* gzip header */ - strm->adler = crc32(0L, Z_NULL, 0); - put_byte(s, 31); - put_byte(s, 139); - put_byte(s, 8); - if (s->gzhead == Z_NULL) { - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, s->level == 9 ? 2 : - (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? - 4 : 0)); - put_byte(s, OS_CODE); - s->status = BUSY_STATE; - - /* Compression must start with an empty pending buffer */ - flush_pending(strm); - if (s->pending != 0) { - s->last_flush = -1; - return Z_OK; - } - } else { - put_byte(s, (s->gzhead->text ? 1 : 0) + - (s->gzhead->hcrc ? 2 : 0) + - (s->gzhead->extra == Z_NULL ? 0 : 4) + - (s->gzhead->name == Z_NULL ? 0 : 8) + - (s->gzhead->comment == Z_NULL ? 0 : 16) - ); - put_byte(s, (Byte)(s->gzhead->time & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); - put_byte(s, s->level == 9 ? 2 : - (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? - 4 : 0)); - put_byte(s, s->gzhead->os & 0xff); - if (s->gzhead->extra != Z_NULL) { - put_byte(s, s->gzhead->extra_len & 0xff); - put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); - } - if (s->gzhead->hcrc) - strm->adler = crc32(strm->adler, s->pending_buf, - s->pending); - s->gzindex = 0; - s->status = EXTRA_STATE; - } - } - if (s->status == EXTRA_STATE) { - if (s->gzhead->extra != Z_NULL) { - ulg beg = s->pending; /* start of bytes to update crc */ - uInt left = (s->gzhead->extra_len & 0xffff) - s->gzindex; - while (s->pending + left > s->pending_buf_size) { - uInt copy = s->pending_buf_size - s->pending; - zmemcpy(s->pending_buf + s->pending, - s->gzhead->extra + s->gzindex, copy); - s->pending = s->pending_buf_size; - HCRC_UPDATE(beg); - s->gzindex += copy; - flush_pending(strm); - if (s->pending != 0) { - s->last_flush = -1; - return Z_OK; - } - beg = 0; - left -= copy; - } - zmemcpy(s->pending_buf + s->pending, - s->gzhead->extra + s->gzindex, left); - s->pending += left; - HCRC_UPDATE(beg); - s->gzindex = 0; - } - s->status = NAME_STATE; - } - if (s->status == NAME_STATE) { - if (s->gzhead->name != Z_NULL) { - ulg beg = s->pending; /* start of bytes to update crc */ - int val; - do { - if (s->pending == s->pending_buf_size) { - HCRC_UPDATE(beg); - flush_pending(strm); - if (s->pending != 0) { - s->last_flush = -1; - return Z_OK; - } - beg = 0; - } - val = s->gzhead->name[s->gzindex++]; - put_byte(s, val); - } while (val != 0); - HCRC_UPDATE(beg); - s->gzindex = 0; - } - s->status = COMMENT_STATE; - } - if (s->status == COMMENT_STATE) { - if (s->gzhead->comment != Z_NULL) { - ulg beg = s->pending; /* start of bytes to update crc */ - int val; - do { - if (s->pending == s->pending_buf_size) { - HCRC_UPDATE(beg); - flush_pending(strm); - if (s->pending != 0) { - s->last_flush = -1; - return Z_OK; - } - beg = 0; - } - val = s->gzhead->comment[s->gzindex++]; - put_byte(s, val); - } while (val != 0); - HCRC_UPDATE(beg); - } - s->status = HCRC_STATE; - } - if (s->status == HCRC_STATE) { - if (s->gzhead->hcrc) { - if (s->pending + 2 > s->pending_buf_size) { - flush_pending(strm); - if (s->pending != 0) { - s->last_flush = -1; - return Z_OK; - } - } - put_byte(s, (Byte)(strm->adler & 0xff)); - put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); - strm->adler = crc32(0L, Z_NULL, 0); - } - s->status = BUSY_STATE; - - /* Compression must start with an empty pending buffer */ - flush_pending(strm); - if (s->pending != 0) { - s->last_flush = -1; - return Z_OK; - } - } -#endif - - /* Start a new block or continue the current one. - */ - if (strm->avail_in != 0 || s->lookahead != 0 || - (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { - block_state bstate; - - bstate = s->level == 0 ? deflate_stored(s, flush) : - s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : - s->strategy == Z_RLE ? deflate_rle(s, flush) : - (*(configuration_table[s->level].func))(s, flush); - - if (bstate == finish_started || bstate == finish_done) { - s->status = FINISH_STATE; - } - if (bstate == need_more || bstate == finish_started) { - if (strm->avail_out == 0) { - s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ - } - return Z_OK; - /* If flush != Z_NO_FLUSH && avail_out == 0, the next call - * of deflate should use the same flush parameter to make sure - * that the flush is complete. So we don't have to output an - * empty block here, this will be done at next call. This also - * ensures that for a very small output buffer, we emit at most - * one empty block. - */ - } - if (bstate == block_done) { - if (flush == Z_PARTIAL_FLUSH) { - _tr_align(s); - } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ - _tr_stored_block(s, (char *)0, 0L, 0); - /* For a full flush, this empty block will be recognized - * as a special marker by inflate_sync(). - */ - if (flush == Z_FULL_FLUSH) { - CLEAR_HASH(s); /* forget history */ - if (s->lookahead == 0) { - s->strstart = 0; - s->block_start = 0L; - s->insert = 0; - } - } - } - flush_pending(strm); - if (strm->avail_out == 0) { - s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ - return Z_OK; - } - } - } - - if (flush != Z_FINISH) return Z_OK; - if (s->wrap <= 0) return Z_STREAM_END; - - /* Write the trailer */ -#ifdef GZIP - if (s->wrap == 2) { - put_byte(s, (Byte)(strm->adler & 0xff)); - put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); - put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); - put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); - put_byte(s, (Byte)(strm->total_in & 0xff)); - put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); - put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); - put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); - } else -#endif - { - putShortMSB(s, (uInt)(strm->adler >> 16)); - putShortMSB(s, (uInt)(strm->adler & 0xffff)); - } - flush_pending(strm); - /* If avail_out is zero, the application will call deflate again - * to flush the rest. - */ - if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ - return s->pending != 0 ? Z_OK : Z_STREAM_END; -} - -/* ========================================================================= */ -int ZEXPORT deflateEnd(strm) -z_streamp strm; -{ - int status; - - if (deflateStateCheck(strm)) return Z_STREAM_ERROR; - - status = strm->state->status; - - /* Deallocate in reverse order of allocations: */ - TRY_FREE(strm, strm->state->pending_buf); - TRY_FREE(strm, strm->state->head); - TRY_FREE(strm, strm->state->prev); - TRY_FREE(strm, strm->state->window); - - ZFREE(strm, strm->state); - strm->state = Z_NULL; - - return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; -} - -/* ========================================================================= - * Copy the source state to the destination state. - * To simplify the source, this is not supported for 16-bit MSDOS (which - * doesn't have enough memory anyway to duplicate compression states). - */ -int ZEXPORT deflateCopy(dest, source) -z_streamp dest; -z_streamp source; -{ -#ifdef MAXSEG_64K - return Z_STREAM_ERROR; -#else - deflate_state *ds; - deflate_state *ss; - ushf *overlay; - - - if (deflateStateCheck(source) || dest == Z_NULL) { - return Z_STREAM_ERROR; - } - - ss = source->state; - - zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); - - ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); - if (ds == Z_NULL) return Z_MEM_ERROR; - dest->state = (struct internal_state FAR *) ds; - zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state)); - ds->strm = dest; - - ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2 * sizeof(Byte)); - ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); - ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); - overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush) + 2); - ds->pending_buf = (uchf *) overlay; - - if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || - ds->pending_buf == Z_NULL) { - deflateEnd(dest); - return Z_MEM_ERROR; - } - /* following zmemcpy do not work for 16-bit MSDOS */ - zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); - zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos)); - zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos)); - zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); - - ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); - ds->d_buf = overlay + ds->lit_bufsize / sizeof(ush); - ds->l_buf = ds->pending_buf + (1 + sizeof(ush)) * ds->lit_bufsize; - - ds->l_desc.dyn_tree = ds->dyn_ltree; - ds->d_desc.dyn_tree = ds->dyn_dtree; - ds->bl_desc.dyn_tree = ds->bl_tree; - - return Z_OK; -#endif /* MAXSEG_64K */ -} - -/* =========================================================================== - * Read a new buffer from the current input stream, update the adler32 - * and total number of bytes read. All deflate() input goes through - * this function so some applications may wish to modify it to avoid - * allocating a large strm->next_in buffer and copying from it. - * (See also flush_pending()). - */ -local unsigned read_buf(strm, buf, size) -z_streamp strm; -Bytef *buf; -unsigned size; -{ - unsigned len = strm->avail_in; - - if (len > size) len = size; - if (len == 0) return 0; - - strm->avail_in -= len; - - zmemcpy(buf, strm->next_in, len); - if (strm->state->wrap == 1) { - strm->adler = adler32(strm->adler, buf, len); - } -#ifdef GZIP - else if (strm->state->wrap == 2) { - strm->adler = crc32(strm->adler, buf, len); - } -#endif - strm->next_in += len; - strm->total_in += len; - - return len; -} - -/* =========================================================================== - * Initialize the "longest match" routines for a new zlib stream - */ -local void lm_init(s) -deflate_state *s; -{ - s->window_size = (ulg)2L * s->w_size; - - CLEAR_HASH(s); - - /* Set the default configuration parameters: - */ - s->max_lazy_match = configuration_table[s->level].max_lazy; - s->good_match = configuration_table[s->level].good_length; - s->nice_match = configuration_table[s->level].nice_length; - s->max_chain_length = configuration_table[s->level].max_chain; - - s->strstart = 0; - s->block_start = 0L; - s->lookahead = 0; - s->insert = 0; - s->match_length = s->prev_length = MIN_MATCH - 1; - s->match_available = 0; - s->ins_h = 0; -#ifndef FASTEST -#ifdef ASMV - match_init(); /* initialize the asm code */ -#endif -#endif -} - -#ifndef FASTEST -/* =========================================================================== - * Set match_start to the longest match starting at the given string and - * return its length. Matches shorter or equal to prev_length are discarded, - * in which case the result is equal to prev_length and match_start is - * garbage. - * IN assertions: cur_match is the head of the hash chain for the current - * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 - * OUT assertion: the match length is not greater than s->lookahead. - */ -#ifndef ASMV -/* For 80x86 and 680x0, an optimized version will be provided in match.asm or - * match.S. The code will be functionally equivalent. - */ -local uInt longest_match(s, cur_match) -deflate_state *s; -IPos cur_match; /* current match */ -{ - unsigned chain_length = s->max_chain_length;/* max hash chain length */ - register Bytef *scan = s->window + s->strstart; /* current string */ - register Bytef *match; /* matched string */ - register int len; /* length of current match */ -#ifdef ZLIB_PM3_TUNED - int best_len = MIN_MATCH - 1; /* lift the restriction on prev-length */ -#else - int best_len = (int)s->prev_length; /* best match length so far */ -#endif - int nice_match = s->nice_match; /* stop if match long enough */ - IPos limit = s->strstart > (IPos)MAX_DIST(s) ? - s->strstart - (IPos)MAX_DIST(s) : NIL; - /* Stop when cur_match becomes <= limit. To simplify the code, - * we prevent matches with the string of window index 0. - */ - Posf *prev = s->prev; - uInt wmask = s->w_mask; - -#ifdef UNALIGNED_OK - /* Compare two bytes at a time. Note: this is not always beneficial. - * Try with and without -DUNALIGNED_OK to check. - */ - register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; - register ush scan_start = *(ushf *)scan; - register ush scan_end = *(ushf *)(scan + best_len - 1); -#else - register Bytef *strend = s->window + s->strstart + MAX_MATCH; - register Byte scan_end1 = scan[best_len - 1]; - register Byte scan_end = scan[best_len]; -#endif - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - /* Do not waste too much time if we already have a good match: */ - if (s->prev_length >= s->good_match) { - chain_length >>= 2; - } - /* Do not look for matches beyond the end of the input. This is necessary - * to make deflate deterministic. - */ - if ((uInt)nice_match > s->lookahead) nice_match = (int)s->lookahead; - - Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, "need lookahead"); - - do { - Assert(cur_match < s->strstart, "no future"); - match = s->window + cur_match; - - /* Skip to next match if the match length cannot increase - * or if the match length is less than 2. Note that the checks below - * for insufficient lookahead only occur occasionally for performance - * reasons. Therefore uninitialized memory will be accessed, and - * conditional jumps will be made that depend on those values. - * However the length of the match is limited to the lookahead, so - * the output of deflate is not affected by the uninitialized values. - */ -#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) - /* This code assumes sizeof(unsigned short) == 2. Do not use - * UNALIGNED_OK if your compiler uses a different size. - */ - if (*(ushf *)(match + best_len - 1) != scan_end || - *(ushf *)match != scan_start) continue; - - /* It is not necessary to compare scan[2] and match[2] since they are - * always equal when the other bytes match, given that the hash keys - * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at - * strstart+3, +5, ... up to strstart+257. We check for insufficient - * lookahead only every 4th comparison; the 128th check will be made - * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is - * necessary to put more guard bytes at the end of the window, or - * to check more often for insufficient lookahead. - */ - Assert(scan[2] == match[2], "scan[2]?"); - scan++, match++; - do { - } while (*(ushf *)(scan += 2) == *(ushf *)(match += 2) && - *(ushf *)(scan += 2) == *(ushf *)(match += 2) && - *(ushf *)(scan += 2) == *(ushf *)(match += 2) && - *(ushf *)(scan += 2) == *(ushf *)(match += 2) && - scan < strend); - /* The funny "do {}" generates better code on most compilers */ - - /* Here, scan <= window+strstart+257 */ - Assert(scan <= s->window + (unsigned)(s->window_size - 1), "wild scan"); - if (*scan == *match) scan++; - - len = (MAX_MATCH - 1) - (int)(strend - scan); - scan = strend - (MAX_MATCH - 1); - -#else /* UNALIGNED_OK */ - - if (match[best_len] != scan_end || - match[best_len - 1] != scan_end1 || - *match != *scan || - *++match != scan[1]) continue; - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2, match++; - Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - } while (*++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - scan < strend); - - Assert(scan <= s->window + (unsigned)(s->window_size - 1), "wild scan"); - - len = MAX_MATCH - (int)(strend - scan); - scan = strend - MAX_MATCH; - -#endif /* UNALIGNED_OK */ - - if (len > best_len) { - s->match_start = cur_match; - best_len = len; - if (len >= nice_match) break; -#ifdef UNALIGNED_OK - scan_end = *(ushf *)(scan + best_len - 1); -#else - scan_end1 = scan[best_len - 1]; - scan_end = scan[best_len]; -#endif - } - } while ((cur_match = prev[cur_match & wmask]) > limit - && --chain_length != 0); - - if ((uInt)best_len <= s->lookahead) return (uInt)best_len; - return s->lookahead; -} -#endif /* ASMV */ - -#else /* FASTEST */ - -/* --------------------------------------------------------------------------- - * Optimized version for FASTEST only - */ -local uInt longest_match(s, cur_match) -deflate_state *s; -IPos cur_match; /* current match */ -{ - register Bytef *scan = s->window + s->strstart; /* current string */ - register Bytef *match; /* matched string */ - register int len; /* length of current match */ - register Bytef *strend = s->window + s->strstart + MAX_MATCH; - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, "need lookahead"); - - Assert(cur_match < s->strstart, "no future"); - - match = s->window + cur_match; - - /* Return failure if the match length is less than 2: - */ - if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH - 1; - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2, match += 2; - Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - } while (*++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - scan < strend); - - Assert(scan <= s->window + (unsigned)(s->window_size - 1), "wild scan"); - - len = MAX_MATCH - (int)(strend - scan); - - if (len < MIN_MATCH) return MIN_MATCH - 1; - - s->match_start = cur_match; - return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; -} - -#endif /* FASTEST */ - -#ifdef ZLIB_DEBUG - -#define EQUAL 0 -/* result of memcmp for equal strings */ - -/* =========================================================================== - * Check that the match at match_start is indeed a match. - */ -local void check_match(s, start, match, length) -deflate_state *s; -IPos start, match; -int length; -{ - /* check that the match is indeed a match */ - if (zmemcmp(s->window + match, - s->window + start, length) != EQUAL) { - fprintf(stderr, " start %u, match %u, length %d\n", - start, match, length); - do { - fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); - } while (--length != 0); - z_error("invalid match"); - } - if (z_verbose > 1) { - fprintf(stderr, "\\[%d,%d]", start - match, length); - do { putc(s->window[start++], stderr); } - while (--length != 0); - } -} -#else -# define check_match(s, start, match, length) -#endif /* ZLIB_DEBUG */ - -/* =========================================================================== - * Fill the window when the lookahead becomes insufficient. - * Updates strstart and lookahead. - * - * IN assertion: lookahead < MIN_LOOKAHEAD - * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - * At least one byte has been read, or avail_in == 0; reads are - * performed for at least two bytes (required for the zip translate_eol - * option -- not supported here). - */ -local void fill_window(s) -deflate_state *s; -{ - unsigned n; - unsigned more; /* Amount of free space at the end of the window. */ - uInt wsize = s->w_size; - - Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); - - do { - more = (unsigned)(s->window_size - (ulg)s->lookahead - (ulg)s->strstart); - - /* Deal with !@#$% 64K limit: */ - if (sizeof(int) <= 2) { - if (more == 0 && s->strstart == 0 && s->lookahead == 0) { - more = wsize; - - } else if (more == (unsigned)(-1)) { - /* Very unlikely, but possible on 16 bit machine if - * strstart == 0 && lookahead == 1 (input done a byte at time) - */ - more--; - } - } - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (s->strstart >= wsize + MAX_DIST(s)) { - - zmemcpy(s->window, s->window + wsize, (unsigned)wsize - more); - s->match_start -= wsize; - s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ - s->block_start -= (long) wsize; - slide_hash(s); - more += wsize; - } - if (s->strm->avail_in == 0) break; - - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - Assert(more >= 2, "more < 2"); - - n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); - s->lookahead += n; - - /* Initialize the hash value now that we have some input: */ - if (s->lookahead + s->insert >= MIN_MATCH) { - uInt str = s->strstart - s->insert; - s->ins_h = s->window[str]; - UPDATE_HASH(s, s->ins_h, s->window[str + 1]); -#if MIN_MATCH != 3 - Call UPDATE_HASH() MIN_MATCH - 3 more times -#endif - while (s->insert) { - UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH - 1]); -#ifndef FASTEST - s->prev[str & s->w_mask] = s->head[s->ins_h]; -#endif - s->head[s->ins_h] = (Pos)str; - str++; - s->insert--; - if (s->lookahead + s->insert < MIN_MATCH) - break; - } - } - /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - * but this is not important since only literal bytes will be emitted. - */ - - } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); - - /* If the WIN_INIT bytes after the end of the current data have never been - * written, then zero those bytes in order to avoid memory check reports of - * the use of uninitialized (or uninitialised as Julian writes) bytes by - * the longest match routines. Update the high water mark for the next - * time through here. WIN_INIT is set to MAX_MATCH since the longest match - * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. - */ - if (s->high_water < s->window_size) { - ulg curr = s->strstart + (ulg)(s->lookahead); - ulg init; - - if (s->high_water < curr) { - /* Previous high water mark below current data -- zero WIN_INIT - * bytes or up to end of window, whichever is less. - */ - init = s->window_size - curr; - if (init > WIN_INIT) - init = WIN_INIT; - zmemzero(s->window + curr, (unsigned)init); - s->high_water = curr + init; - } else if (s->high_water < (ulg)curr + WIN_INIT) { - /* High water mark at or above current data, but below current data - * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up - * to end of window, whichever is less. - */ - init = (ulg)curr + WIN_INIT - s->high_water; - if (init > s->window_size - s->high_water) - init = s->window_size - s->high_water; - zmemzero(s->window + s->high_water, (unsigned)init); - s->high_water += init; - } - } - - Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, - "not enough room for search"); -} - -/* =========================================================================== - * Flush the current block, with given end-of-file flag. - * IN assertion: strstart is set to the end of the current match. - */ -#define FLUSH_BLOCK_ONLY(s, last) { \ - _tr_flush_block(s, (s->block_start >= 0L ? \ - (charf *)&s->window[(unsigned)s->block_start] : \ - (charf *)Z_NULL), \ - (ulg)((long)s->strstart - s->block_start), \ - (last)); \ - s->block_start = s->strstart; \ - flush_pending(s->strm); \ - Tracev((stderr,"[FLUSH]")); \ -} - -/* Same but force premature exit if necessary. */ -#define FLUSH_BLOCK(s, last) { \ - FLUSH_BLOCK_ONLY(s, last); \ - if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \ -} - -/* Maximum stored block length in deflate format (not including header). */ -#define MAX_STORED 65535 - -/* Minimum of a and b. */ -#define MIN(a, b) ((a) > (b) ? (b) : (a)) - -/* =========================================================================== - * Copy without compression as much as possible from the input stream, return - * the current block state. - * - * In case deflateParams() is used to later switch to a non-zero compression - * level, s->matches (otherwise unused when storing) keeps track of the number - * of hash table slides to perform. If s->matches is 1, then one hash table - * slide will be done when switching. If s->matches is 2, the maximum value - * allowed here, then the hash table will be cleared, since two or more slides - * is the same as a clear. - * - * deflate_stored() is written to minimize the number of times an input byte is - * copied. It is most efficient with large input and output buffers, which - * maximizes the opportunites to have a single copy from next_in to next_out. - */ -local block_state deflate_stored(s, flush) -deflate_state *s; -int flush; -{ - /* Smallest worthy block size when not flushing or finishing. By default - * this is 32K. This can be as small as 507 bytes for memLevel == 1. For - * large input and output buffers, the stored block size will be larger. - */ - unsigned min_block = MIN(s->pending_buf_size - 5, s->w_size); - - /* Copy as many min_block or larger stored blocks directly to next_out as - * possible. If flushing, copy the remaining available input to next_out as - * stored blocks, if there is enough space. - */ - unsigned len, left, have, last = 0; - unsigned used = s->strm->avail_in; - do { - /* Set len to the maximum size block that we can copy directly with the - * available input data and output space. Set left to how much of that - * would be copied from what's left in the window. - */ - len = MAX_STORED; /* maximum deflate stored block length */ - have = (s->bi_valid + 42) >> 3; /* number of header bytes */ - if (s->strm->avail_out < have) /* need room for header */ - break; - /* maximum stored block length that will fit in avail_out: */ - have = s->strm->avail_out - have; - left = s->strstart - s->block_start; /* bytes left in window */ - if (len > (ulg)left + s->strm->avail_in) - len = left + s->strm->avail_in; /* limit len to the input */ - if (len > have) - len = have; /* limit len to the output */ - - /* If the stored block would be less than min_block in length, or if - * unable to copy all of the available input when flushing, then try - * copying to the window and the pending buffer instead. Also don't - * write an empty block when flushing -- deflate() does that. - */ - if (len < min_block && ((len == 0 && flush != Z_FINISH) || - flush == Z_NO_FLUSH || - len != left + s->strm->avail_in)) - break; - - /* Make a dummy stored block in pending to get the header bytes, - * including any pending bits. This also updates the debugging counts. - */ - last = flush == Z_FINISH && len == left + s->strm->avail_in ? 1 : 0; - _tr_stored_block(s, (char *)0, 0L, last); - - /* Replace the lengths in the dummy stored block with len. */ - s->pending_buf[s->pending - 4] = len; - s->pending_buf[s->pending - 3] = len >> 8; - s->pending_buf[s->pending - 2] = ~len; - s->pending_buf[s->pending - 1] = ~len >> 8; - - /* Write the stored block header bytes. */ - flush_pending(s->strm); - -#ifdef ZLIB_DEBUG - /* Update debugging counts for the data about to be copied. */ - s->compressed_len += len << 3; - s->bits_sent += len << 3; -#endif - - /* Copy uncompressed bytes from the window to next_out. */ - if (left) { - if (left > len) - left = len; - zmemcpy(s->strm->next_out, s->window + s->block_start, left); - s->strm->next_out += left; - s->strm->avail_out -= left; - s->strm->total_out += left; - s->block_start += left; - len -= left; - } - - /* Copy uncompressed bytes directly from next_in to next_out, updating - * the check value. - */ - if (len) { - read_buf(s->strm, s->strm->next_out, len); - s->strm->next_out += len; - s->strm->avail_out -= len; - s->strm->total_out += len; - } - } while (last == 0); - - /* Update the sliding window with the last s->w_size bytes of the copied - * data, or append all of the copied data to the existing window if less - * than s->w_size bytes were copied. Also update the number of bytes to - * insert in the hash tables, in the event that deflateParams() switches to - * a non-zero compression level. - */ - used -= s->strm->avail_in; /* number of input bytes directly copied */ - if (used) { - /* If any input was used, then no unused input remains in the window, - * therefore s->block_start == s->strstart. - */ - if (used >= s->w_size) { /* supplant the previous history */ - s->matches = 2; /* clear hash */ - zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size); - s->strstart = s->w_size; - } else { - if (s->window_size - s->strstart <= used) { - /* Slide the window down. */ - s->strstart -= s->w_size; - zmemcpy(s->window, s->window + s->w_size, s->strstart); - if (s->matches < 2) - s->matches++; /* add a pending slide_hash() */ - } - zmemcpy(s->window + s->strstart, s->strm->next_in - used, used); - s->strstart += used; - } - s->block_start = s->strstart; - s->insert += MIN(used, s->w_size - s->insert); - } - if (s->high_water < s->strstart) - s->high_water = s->strstart; - - /* If the last block was written to next_out, then done. */ - if (last) - return finish_done; - - /* If flushing and all input has been consumed, then done. */ - if (flush != Z_NO_FLUSH && flush != Z_FINISH && - s->strm->avail_in == 0 && (long)s->strstart == s->block_start) - return block_done; - - /* Fill the window with any remaining input. */ - have = s->window_size - s->strstart - 1; - if (s->strm->avail_in > have && s->block_start >= (long)s->w_size) { - /* Slide the window down. */ - s->block_start -= s->w_size; - s->strstart -= s->w_size; - zmemcpy(s->window, s->window + s->w_size, s->strstart); - if (s->matches < 2) - s->matches++; /* add a pending slide_hash() */ - have += s->w_size; /* more space now */ - } - if (have > s->strm->avail_in) - have = s->strm->avail_in; - if (have) { - read_buf(s->strm, s->window + s->strstart, have); - s->strstart += have; - } - if (s->high_water < s->strstart) - s->high_water = s->strstart; - - /* There was not enough avail_out to write a complete worthy or flushed - * stored block to next_out. Write a stored block to pending instead, if we - * have enough input for a worthy block, or if flushing and there is enough - * room for the remaining input as a stored block in the pending buffer. - */ - have = (s->bi_valid + 42) >> 3; /* number of header bytes */ - /* maximum stored block length that will fit in pending: */ - have = MIN(s->pending_buf_size - have, MAX_STORED); - min_block = MIN(have, s->w_size); - left = s->strstart - s->block_start; - if (left >= min_block || - ((left || flush == Z_FINISH) && flush != Z_NO_FLUSH && - s->strm->avail_in == 0 && left <= have)) { - len = MIN(left, have); - last = flush == Z_FINISH && s->strm->avail_in == 0 && - len == left ? 1 : 0; - _tr_stored_block(s, (charf *)s->window + s->block_start, len, last); - s->block_start += len; - flush_pending(s->strm); - } - - /* We've done all we can with the available input and output. */ - return last ? finish_started : need_more; -} - -/* =========================================================================== - * Compress as much as possible from the input stream, return the current - * block state. - * This function does not perform lazy evaluation of matches and inserts - * new strings in the dictionary only for unmatched strings or for short - * matches. It is used only for the fast compression options. - */ -local block_state deflate_fast(s, flush) -deflate_state *s; -int flush; -{ - IPos hash_head; /* head of the hash chain */ - int bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s->lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { - return need_more; - } - if (s->lookahead == 0) break; /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = NIL; - if (s->lookahead >= MIN_MATCH) { - INSERT_STRING(s, s->strstart, hash_head); - } - - /* Find the longest match, discarding those <= prev_length. - * At this point we have always match_length < MIN_MATCH - */ - if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s->match_length = longest_match(s, hash_head); - /* longest_match() sets match_start */ - } - if (s->match_length >= MIN_MATCH) { - check_match(s, s->strstart, s->match_start, s->match_length); - - _tr_tally_dist(s, s->strstart - s->match_start, - s->match_length - MIN_MATCH, bflush); - - s->lookahead -= s->match_length; - - /* Insert new strings in the hash table only if the match length - * is not too large. This saves time but degrades compression. - */ -#ifndef FASTEST - if (s->match_length <= s->max_insert_length && - s->lookahead >= MIN_MATCH) { - s->match_length--; /* string at strstart already in table */ - do { - s->strstart++; - INSERT_STRING(s, s->strstart, hash_head); - /* strstart never exceeds WSIZE-MAX_MATCH, so there are - * always MIN_MATCH bytes ahead. - */ - } while (--s->match_length != 0); - s->strstart++; - } else -#endif - { - s->strstart += s->match_length; - s->match_length = 0; - s->ins_h = s->window[s->strstart]; - UPDATE_HASH(s, s->ins_h, s->window[s->strstart + 1]); -#if MIN_MATCH != 3 - Call UPDATE_HASH() MIN_MATCH - 3 more times -#endif - /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not - * matter since it will be recomputed at next deflate call. - */ - } - } else { - /* No match, output a literal byte */ - Tracevv((stderr, "%c", s->window[s->strstart])); - _tr_tally_lit(s, s->window[s->strstart], bflush); - s->lookahead--; - s->strstart++; - } - if (bflush) FLUSH_BLOCK(s, 0); - } - s->insert = s->strstart < MIN_MATCH - 1 ? s->strstart : MIN_MATCH - 1; - if (flush == Z_FINISH) { - FLUSH_BLOCK(s, 1); - return finish_done; - } - if (s->last_lit) - FLUSH_BLOCK(s, 0); - return block_done; -} - - -#ifdef ZLIB_PM3_TUNED -local uInt try_harder(s, strstart, lookahead, hash_head) -deflate_state *s; -uInt strstart; -uInt lookahead; -IPos hash_head; -{ - uInt strstart_save = s->strstart; - s->strstart = strstart; - uInt lookahead_save = s->lookahead; - s->lookahead = lookahead; - uInt ins_h_save = s->ins_h; - uInt combined_gain; - uInt best_combined_gain = 0; - uInt match_length; - uInt prev_length = s->prev_length < MIN_MATCH ? 1 : s->prev_length; - uInt best_prev_length = prev_length; - uInt current_match_start = s->match_start; - uInt current_match_length = s->match_length; - - do { - if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { - match_length = longest_match(s, hash_head); - /* longest_match() sets match_start */ - } else { - match_length = MIN_MATCH - 1; - } -#if TOO_FAR <= 32767 - if (match_length == MIN_MATCH && s->strstart - s->match_start > TOO_FAR) { - match_length = MIN_MATCH - 1; - } -#endif - if (s->strstart == strstart) { // store match at current position - current_match_length = match_length; - current_match_start = s->match_start; - } - if (s->strstart - strstart + 1 < MIN_MATCH) { // previous match reduced to one or two literals - combined_gain = 0; // need one literal per byte: no gain (assuming 8 bits per literal) - } else { - combined_gain = s->strstart - strstart + 1 - MIN_MATCH; // (possibly truncated) previous_length - 3 literals - } - if (match_length < MIN_MATCH) { - combined_gain += 0; // no gain - } else { - combined_gain += match_length - MIN_MATCH; // match_length bytes are coded as three literals - } - if (combined_gain >= best_combined_gain) { // in case of a tie we prefer the longer prev_length - best_combined_gain = combined_gain; - best_prev_length = s->strstart - strstart + 1; - } - s->strstart++; - s->lookahead--; - UPDATE_HASH(s, s->ins_h, s->window[(s->strstart) + (MIN_MATCH - 1)]); - hash_head = s->head[s->ins_h]; - } while (s->strstart <= strstart - 1 + prev_length // try to truncate the previous match to 1, 3, ... prev_length - && s->strstart <= s->window_size - MIN_LOOKAHEAD); // watch out for the end of the input - - s->strstart = strstart_save; - s->lookahead = lookahead_save; - s->ins_h = ins_h_save; - s->match_length = current_match_length; - s->match_start = current_match_start; - if (best_prev_length >= MIN_MATCH) { - s->prev_length = best_prev_length; - s->match_length = MIN_MATCH - 1; - } else { - s->prev_length = MIN_MATCH - 1; - } - return best_combined_gain; -} -#endif - - - -#ifndef FASTEST -/* =========================================================================== - * Same as above, but achieves better compression. We use a lazy - * evaluation for matches: a match is finally adopted only if there is - * no better match at the next window position. - */ -local block_state deflate_slow(s, flush) -deflate_state *s; -int flush; -{ - IPos hash_head; /* head of hash chain */ - int bflush; /* set if current block must be flushed */ - - /* Process the input block. */ - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s->lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { - return need_more; - } - if (s->lookahead == 0) break; /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = NIL; - if (s->lookahead >= MIN_MATCH) { - INSERT_STRING(s, s->strstart, hash_head); - } - - /* Find the longest match, discarding those <= prev_length. - */ - s->prev_length = s->match_length, s->prev_match = s->match_start; - s->match_length = MIN_MATCH - 1; - -#ifdef ZLIB_PM3_TUNED - if (s->prev_length < s->max_lazy_match) { - try_harder(s, s->strstart, s->lookahead, hash_head); - } - -#else - if (hash_head != NIL && s->prev_length < s->max_lazy_match && - s->strstart - hash_head <= MAX_DIST(s)) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s->match_length = longest_match(s, hash_head); - /* longest_match() sets match_start */ - - if (s->match_length <= 5 && (s->strategy == Z_FILTERED -#if TOO_FAR <= 32767 - || (s->match_length == MIN_MATCH && - s->strstart - s->match_start > TOO_FAR) -#endif - )) { - - /* If prev_match is also MIN_MATCH, match_start is garbage - * but we will ignore the current match anyway. - */ - s->match_length = MIN_MATCH - 1; - } - } -#endif /* ZLIB_PM3_TUNED */ - /* If there was a match at the previous step and the current - * match is not better, output the previous match: - */ - if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { - uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; - /* Do not insert strings in hash table beyond this. */ - - check_match(s, s->strstart - 1, s->prev_match, s->prev_length); - - _tr_tally_dist(s, s->strstart - 1 - s->prev_match, - s->prev_length - MIN_MATCH, bflush); - - /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. If there is not - * enough lookahead, the last two strings are not inserted in - * the hash table. - */ - s->lookahead -= s->prev_length - 1; - s->prev_length -= 2; - do { - if (++s->strstart <= max_insert) { - INSERT_STRING(s, s->strstart, hash_head); - } - } while (--s->prev_length != 0); - s->match_available = 0; - s->match_length = MIN_MATCH - 1; - s->strstart++; - - if (bflush) FLUSH_BLOCK(s, 0); - - } else if (s->match_available) { - /* If there was no match at the previous position, output a - * single literal. If there was a match but the current match - * is longer, truncate the previous match to a single literal. - */ - Tracevv((stderr, "%c", s->window[s->strstart - 1])); - _tr_tally_lit(s, s->window[s->strstart - 1], bflush); - if (bflush) { - FLUSH_BLOCK_ONLY(s, 0); - } - s->strstart++; - s->lookahead--; - if (s->strm->avail_out == 0) return need_more; - } else { - /* There is no previous match to compare with, wait for - * the next step to decide. - */ - s->match_available = 1; - s->strstart++; - s->lookahead--; - } - } - Assert(flush != Z_NO_FLUSH, "no flush?"); - if (s->match_available) { - Tracevv((stderr, "%c", s->window[s->strstart - 1])); - _tr_tally_lit(s, s->window[s->strstart - 1], bflush); - s->match_available = 0; - } - s->insert = s->strstart < MIN_MATCH - 1 ? s->strstart : MIN_MATCH - 1; - if (flush == Z_FINISH) { - FLUSH_BLOCK(s, 1); - return finish_done; - } - if (s->last_lit) - FLUSH_BLOCK(s, 0); - return block_done; -} -#endif /* FASTEST */ - -/* =========================================================================== - * For Z_RLE, simply look for runs of bytes, generate matches only of distance - * one. Do not maintain a hash table. (It will be regenerated if this run of - * deflate switches away from Z_RLE.) - */ -local block_state deflate_rle(s, flush) -deflate_state *s; -int flush; -{ - int bflush; /* set if current block must be flushed */ - uInt prev; /* byte at distance one to match */ - Bytef *scan, *strend; /* scan goes up to strend for length of run */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the longest run, plus one for the unrolled loop. - */ - if (s->lookahead <= MAX_MATCH) { - fill_window(s); - if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) { - return need_more; - } - if (s->lookahead == 0) break; /* flush the current block */ - } - - /* See how many times the previous byte repeats */ - s->match_length = 0; - if (s->lookahead >= MIN_MATCH && s->strstart > 0) { - scan = s->window + s->strstart - 1; - prev = *scan; - if (prev == *++scan && prev == *++scan && prev == *++scan) { - strend = s->window + s->strstart + MAX_MATCH; - do { - } while (prev == *++scan && prev == *++scan && - prev == *++scan && prev == *++scan && - prev == *++scan && prev == *++scan && - prev == *++scan && prev == *++scan && - scan < strend); - s->match_length = MAX_MATCH - (uInt)(strend - scan); - if (s->match_length > s->lookahead) - s->match_length = s->lookahead; - } - Assert(scan <= s->window + (uInt)(s->window_size - 1), "wild scan"); - } - - /* Emit match if have run of MIN_MATCH or longer, else emit literal */ - if (s->match_length >= MIN_MATCH) { - check_match(s, s->strstart, s->strstart - 1, s->match_length); - - _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush); - - s->lookahead -= s->match_length; - s->strstart += s->match_length; - s->match_length = 0; - } else { - /* No match, output a literal byte */ - Tracevv((stderr, "%c", s->window[s->strstart])); - _tr_tally_lit(s, s->window[s->strstart], bflush); - s->lookahead--; - s->strstart++; - } - if (bflush) FLUSH_BLOCK(s, 0); - } - s->insert = 0; - if (flush == Z_FINISH) { - FLUSH_BLOCK(s, 1); - return finish_done; - } - if (s->last_lit) - FLUSH_BLOCK(s, 0); - return block_done; -} - -/* =========================================================================== - * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. - * (It will be regenerated if this run of deflate switches away from Huffman.) - */ -local block_state deflate_huff(s, flush) -deflate_state *s; -int flush; -{ - int bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we have a literal to write. */ - if (s->lookahead == 0) { - fill_window(s); - if (s->lookahead == 0) { - if (flush == Z_NO_FLUSH) - return need_more; - break; /* flush the current block */ - } - } - - /* Output a literal byte */ - s->match_length = 0; - Tracevv((stderr, "%c", s->window[s->strstart])); - _tr_tally_lit(s, s->window[s->strstart], bflush); - s->lookahead--; - s->strstart++; - if (bflush) FLUSH_BLOCK(s, 0); - } - s->insert = 0; - if (flush == Z_FINISH) { - FLUSH_BLOCK(s, 1); - return finish_done; - } - if (s->last_lit) - FLUSH_BLOCK(s, 0); - return block_done; -} - diff --git a/common/zlib/deflate.h b/common/zlib/deflate.h deleted file mode 100644 index 10956218e..000000000 --- a/common/zlib/deflate.h +++ /dev/null @@ -1,350 +0,0 @@ -/* deflate.h -- internal compression state - * Copyright (C) 1995-2016 Jean-loup Gailly - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* @(#) $Id$ */ - -#ifndef DEFLATE_H -#define DEFLATE_H - -#include "zutil.h" - -/* define NO_GZIP when compiling if you want to disable gzip header and - trailer creation by deflate(). NO_GZIP would be used to avoid linking in - the crc code when it is not needed. For shared libraries, gzip encoding - should be left enabled. */ -#ifndef NO_GZIP -# define GZIP -#endif - -/* =========================================================================== - * Internal compression state. - */ - -#define LENGTH_CODES 29 -/* number of length codes, not counting the special END_BLOCK code */ - -#define LITERALS 256 -/* number of literal bytes 0..255 */ - -#define L_CODES (LITERALS+1+LENGTH_CODES) -/* number of Literal or Length codes, including the END_BLOCK code */ - -#define D_CODES 30 -/* number of distance codes */ - -#define BL_CODES 19 -/* number of codes used to transfer the bit lengths */ - -#define HEAP_SIZE (2*L_CODES+1) -/* maximum heap size */ - -#define MAX_BITS 15 -/* All codes must not exceed MAX_BITS bits */ - -#define Buf_size 16 -/* size of bit buffer in bi_buf */ - -#define INIT_STATE 42 /* zlib header -> BUSY_STATE */ -#ifdef GZIP -# define GZIP_STATE 57 /* gzip header -> BUSY_STATE | EXTRA_STATE */ -#endif -#define EXTRA_STATE 69 /* gzip extra block -> NAME_STATE */ -#define NAME_STATE 73 /* gzip file name -> COMMENT_STATE */ -#define COMMENT_STATE 91 /* gzip comment -> HCRC_STATE */ -#define HCRC_STATE 103 /* gzip header CRC -> BUSY_STATE */ -#define BUSY_STATE 113 /* deflate -> FINISH_STATE */ -#define FINISH_STATE 666 /* stream complete */ -/* Stream status */ - - -/* Data structure describing a single value and its code string. */ -typedef struct ct_data_s { - union { - ush freq; /* frequency count */ - ush code; /* bit string */ - } fc; - union { - ush dad; /* father node in Huffman tree */ - ush len; /* length of bit string */ - } dl; -} FAR ct_data; - -#define Freq fc.freq -#define Code fc.code -#define Dad dl.dad -#define Len dl.len - -typedef struct static_tree_desc_s static_tree_desc; - -typedef struct tree_desc_s { - ct_data *dyn_tree; /* the dynamic tree */ - int max_code; /* largest code with non zero frequency */ - const static_tree_desc *stat_desc; /* the corresponding static tree */ -} FAR tree_desc; - -typedef ush Pos; -typedef Pos FAR Posf; -typedef unsigned IPos; - -/* A Pos is an index in the character window. We use short instead of int to - * save space in the various tables. IPos is used only for parameter passing. - */ - -typedef struct internal_state { - z_streamp strm; /* pointer back to this zlib stream */ - int status; /* as the name implies */ - Bytef *pending_buf; /* output still pending */ - ulg pending_buf_size; /* size of pending_buf */ - Bytef *pending_out; /* next pending byte to output to the stream */ - ulg pending; /* nb of bytes in the pending buffer */ - int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ - gz_headerp gzhead; /* gzip header information to write */ - ulg gzindex; /* where in extra, name, or comment */ - Byte method; /* can only be DEFLATED */ - int last_flush; /* value of flush param for previous deflate call */ - - /* used by deflate.c: */ - - uInt w_size; /* LZ77 window size (32K by default) */ - uInt w_bits; /* log2(w_size) (8..16) */ - uInt w_mask; /* w_size - 1 */ - - Bytef *window; - /* Sliding window. Input bytes are read into the second half of the window, - * and move to the first half later to keep a dictionary of at least wSize - * bytes. With this organization, matches are limited to a distance of - * wSize-MAX_MATCH bytes, but this ensures that IO is always - * performed with a length multiple of the block size. Also, it limits - * the window size to 64K, which is quite useful on MSDOS. - * To do: use the user input buffer as sliding window. - */ - - ulg window_size; - /* Actual size of window: 2*wSize, except when the user input buffer - * is directly used as sliding window. - */ - - Posf *prev; - /* Link to older string with same hash index. To limit the size of this - * array to 64K, this link is maintained only for the last 32K strings. - * An index in this array is thus a window index modulo 32K. - */ - - Posf *head; /* Heads of the hash chains or NIL. */ - - uInt ins_h; /* hash index of string to be inserted */ - uInt hash_size; /* number of elements in hash table */ - uInt hash_bits; /* log2(hash_size) */ - uInt hash_mask; /* hash_size-1 */ - - uInt hash_shift; - /* Number of bits by which ins_h must be shifted at each input - * step. It must be such that after MIN_MATCH steps, the oldest - * byte no longer takes part in the hash key, that is: - * hash_shift * MIN_MATCH >= hash_bits - */ - - long block_start; - /* Window position at the beginning of the current output block. Gets - * negative when the window is moved backwards. - */ - - uInt match_length; /* length of best match */ - IPos prev_match; /* previous match */ - int match_available; /* set if previous match exists */ - uInt strstart; /* start of string to insert */ - uInt match_start; /* start of matching string */ - uInt lookahead; /* number of valid bytes ahead in window */ - - uInt prev_length; - /* Length of the best match at previous step. Matches not greater than this - * are discarded. This is used in the lazy match evaluation. - */ - - uInt max_chain_length; - /* To speed up deflation, hash chains are never searched beyond this - * length. A higher limit improves compression ratio but degrades the - * speed. - */ - - uInt max_lazy_match; - /* Attempt to find a better match only when the current match is strictly - * smaller than this value. This mechanism is used only for compression - * levels >= 4. - */ -# define max_insert_length max_lazy_match - /* Insert new strings in the hash table only if the match length is not - * greater than this length. This saves time but degrades compression. - * max_insert_length is used only for compression levels <= 3. - */ - - int level; /* compression level (1..9) */ - int strategy; /* favor or force Huffman coding*/ - - uInt good_match; - /* Use a faster search when the previous match is longer than this */ - - int nice_match; /* Stop searching when current match exceeds this */ - - /* used by trees.c: */ - /* Didn't use ct_data typedef below to suppress compiler warning */ - struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ - struct ct_data_s dyn_dtree[2 * D_CODES + 1]; /* distance tree */ - struct ct_data_s bl_tree[2 * BL_CODES + 1]; /* Huffman tree for bit lengths */ - - struct tree_desc_s l_desc; /* desc. for literal tree */ - struct tree_desc_s d_desc; /* desc. for distance tree */ - struct tree_desc_s bl_desc; /* desc. for bit length tree */ - - ush bl_count[MAX_BITS + 1]; - /* number of codes at each bit length for an optimal tree */ - - int heap[2 * L_CODES + 1]; /* heap used to build the Huffman trees */ - int heap_len; /* number of elements in the heap */ - int heap_max; /* element of largest frequency */ - /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. - * The same heap array is used to build all trees. - */ - - uch depth[2 * L_CODES + 1]; - /* Depth of each subtree used as tie breaker for trees of equal frequency - */ - - uchf *l_buf; /* buffer for literals or lengths */ - - uInt lit_bufsize; - /* Size of match buffer for literals/lengths. There are 4 reasons for - * limiting lit_bufsize to 64K: - * - frequencies can be kept in 16 bit counters - * - if compression is not successful for the first block, all input - * data is still in the window so we can still emit a stored block even - * when input comes from standard input. (This can also be done for - * all blocks if lit_bufsize is not greater than 32K.) - * - if compression is not successful for a file smaller than 64K, we can - * even emit a stored file instead of a stored block (saving 5 bytes). - * This is applicable only for zip (not gzip or zlib). - * - creating new Huffman trees less frequently may not provide fast - * adaptation to changes in the input data statistics. (Take for - * example a binary file with poorly compressible code followed by - * a highly compressible string table.) Smaller buffer sizes give - * fast adaptation but have of course the overhead of transmitting - * trees more frequently. - * - I can't count above 4 - */ - - uInt last_lit; /* running index in l_buf */ - - ushf *d_buf; - /* Buffer for distances. To simplify the code, d_buf and l_buf have - * the same number of elements. To use different lengths, an extra flag - * array would be necessary. - */ - - ulg opt_len; /* bit length of current block with optimal trees */ - ulg static_len; /* bit length of current block with static trees */ - uInt matches; /* number of string matches in current block */ - uInt insert; /* bytes at end of window left to insert */ - -#ifdef ZLIB_DEBUG - ulg compressed_len; /* total bit length of compressed file mod 2^32 */ - ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ -#endif - - ush bi_buf; - /* Output buffer. bits are inserted starting at the bottom (least - * significant bits). - */ - int bi_valid; - /* Number of valid bits in bi_buf. All bits above the last valid bit - * are always zero. - */ - - ulg high_water; - /* High water mark offset in window for initialized bytes -- bytes above - * this are set to zero in order to avoid memory check warnings when - * longest match routines access bytes past the input. This is then - * updated to the new high water mark. - */ - -} FAR deflate_state; - -/* Output a byte on the stream. - * IN assertion: there is enough room in pending_buf. - */ -#define put_byte(s, c) {s->pending_buf[s->pending++] = (Bytef)(c);} - - -#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) -/* Minimum amount of lookahead, except at the end of the input file. - * See deflate.c for comments about the MIN_MATCH+1. - */ - -#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) -/* In order to simplify the code, particularly on 16 bit machines, match - * distances are limited to MAX_DIST instead of WSIZE. - */ - -#define WIN_INIT MAX_MATCH -/* Number of bytes after end of data in window to initialize in order to avoid - memory checker errors from longest match routines */ - -/* in trees.c */ -void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); -int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); -void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, - ulg stored_len, int last)); -void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); -void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); -void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, - ulg stored_len, int last)); - -#define d_code(dist) \ - ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) -/* Mapping from a distance to a distance code. dist is the distance - 1 and - * must not have side effects. _dist_code[256] and _dist_code[257] are never - * used. - */ - -#ifndef ZLIB_DEBUG -/* Inline versions of _tr_tally for speed: */ - -#if defined(GEN_TREES_H) || !defined(STDC) -extern uch ZLIB_INTERNAL _length_code[]; -extern uch ZLIB_INTERNAL _dist_code[]; -#else -extern const uch ZLIB_INTERNAL _length_code[]; -extern const uch ZLIB_INTERNAL _dist_code[]; -#endif - -# define _tr_tally_lit(s, c, flush) \ - { uch cc = (c); \ - s->d_buf[s->last_lit] = 0; \ - s->l_buf[s->last_lit++] = cc; \ - s->dyn_ltree[cc].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ - } -# define _tr_tally_dist(s, distance, length, flush) \ - { uch len = (uch)(length); \ - ush dist = (ush)(distance); \ - s->d_buf[s->last_lit] = dist; \ - s->l_buf[s->last_lit++] = len; \ - dist--; \ - s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ - s->dyn_dtree[d_code(dist)].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ - } -#else -# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) -# define _tr_tally_dist(s, distance, length, flush) \ - flush = _tr_tally(s, distance, length) -#endif - -#endif /* DEFLATE_H */ - diff --git a/common/zlib/inffast.c b/common/zlib/inffast.c deleted file mode 100644 index 874ecc02c..000000000 --- a/common/zlib/inffast.c +++ /dev/null @@ -1,315 +0,0 @@ -/* inffast.c -- fast decoding - * Copyright (C) 1995-2017 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "inftrees.h" -#include "inflate.h" -#include "inffast.h" - -#ifdef ASMINF -# pragma message("Assembler code may have bugs -- use at your own risk") -#else - -/* - Decode literal, length, and distance codes and write out the resulting - literal and match bytes until either not enough input or output is - available, an end-of-block is encountered, or a data error is encountered. - When large enough input and output buffers are supplied to inflate(), for - example, a 16K input buffer and a 64K output buffer, more than 95% of the - inflate execution time is spent in this routine. - - Entry assumptions: - - state->mode == LEN - strm->avail_in >= 6 - strm->avail_out >= 258 - start >= strm->avail_out - state->bits < 8 - - On return, state->mode is one of: - - LEN -- ran out of enough output space or enough available input - TYPE -- reached end of block code, inflate() to interpret next block - BAD -- error in block data - - Notes: - - - The maximum input bits used by a length/distance pair is 15 bits for the - length code, 5 bits for the length extra, 15 bits for the distance code, - and 13 bits for the distance extra. This totals 48 bits, or six bytes. - Therefore if strm->avail_in >= 6, then there is enough input to avoid - checking for available input while decoding. - - - The maximum bytes that a single length/distance pair can output is 258 - bytes, which is the maximum length that can be coded. inflate_fast() - requires strm->avail_out >= 258 for each loop to avoid checking for - output space. - */ -void ZLIB_INTERNAL inflate_fast(strm, start) -z_streamp strm; -unsigned start; /* inflate()'s starting value for strm->avail_out */ -{ - struct inflate_state FAR *state; - z_const unsigned char FAR *in; /* local strm->next_in */ - z_const unsigned char FAR *last; /* have enough input while in < last */ - unsigned char FAR *out; /* local strm->next_out */ - unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ - unsigned char FAR *end; /* while out < end, enough space available */ -#ifdef INFLATE_STRICT - unsigned dmax; /* maximum distance from zlib header */ -#endif - unsigned wsize; /* window size or zero if not using window */ - unsigned whave; /* valid bytes in the window */ - unsigned wnext; /* window write index */ - unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ - unsigned long hold; /* local strm->hold */ - unsigned bits; /* local strm->bits */ - code const FAR *lcode; /* local strm->lencode */ - code const FAR *dcode; /* local strm->distcode */ - unsigned lmask; /* mask for first level of length codes */ - unsigned dmask; /* mask for first level of distance codes */ - code here; /* retrieved table entry */ - unsigned op; /* code bits, operation, extra bits, or */ - /* window position, window bytes to copy */ - unsigned len; /* match length, unused bytes */ - unsigned dist; /* match distance */ - unsigned char FAR *from; /* where to copy match from */ - - /* copy state to local variables */ - state = (struct inflate_state FAR *)strm->state; - in = strm->next_in; - last = in + (strm->avail_in - 5); - out = strm->next_out; - beg = out - (start - strm->avail_out); - end = out + (strm->avail_out - 257); -#ifdef INFLATE_STRICT - dmax = state->dmax; -#endif - wsize = state->wsize; - whave = state->whave; - wnext = state->wnext; - window = state->window; - hold = state->hold; - bits = state->bits; - lcode = state->lencode; - dcode = state->distcode; - lmask = (1U << state->lenbits) - 1; - dmask = (1U << state->distbits) - 1; - - /* decode literals and length/distances until end-of-block or not enough - input data or output space */ - do { - if (bits < 15) { - hold += (unsigned long)(*in++) << bits; - bits += 8; - hold += (unsigned long)(*in++) << bits; - bits += 8; - } - here = lcode[hold & lmask]; -dolen: - op = (unsigned)(here.bits); - hold >>= op; - bits -= op; - op = (unsigned)(here.op); - if (op == 0) { /* literal */ - Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", here.val)); - *out++ = (unsigned char)(here.val); - } else if (op & 16) { /* length base */ - len = (unsigned)(here.val); - op &= 15; /* number of extra bits */ - if (op) { - if (bits < op) { - hold += (unsigned long)(*in++) << bits; - bits += 8; - } - len += (unsigned)hold & ((1U << op) - 1); - hold >>= op; - bits -= op; - } - Tracevv((stderr, "inflate: length %u\n", len)); - if (bits < 15) { - hold += (unsigned long)(*in++) << bits; - bits += 8; - hold += (unsigned long)(*in++) << bits; - bits += 8; - } - here = dcode[hold & dmask]; -dodist: - op = (unsigned)(here.bits); - hold >>= op; - bits -= op; - op = (unsigned)(here.op); - if (op & 16) { /* distance base */ - dist = (unsigned)(here.val); - op &= 15; /* number of extra bits */ - if (bits < op) { - hold += (unsigned long)(*in++) << bits; - bits += 8; - if (bits < op) { - hold += (unsigned long)(*in++) << bits; - bits += 8; - } - } - dist += (unsigned)hold & ((1U << op) - 1); -#ifdef INFLATE_STRICT - if (dist > dmax) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } -#endif - hold >>= op; - bits -= op; - Tracevv((stderr, "inflate: distance %u\n", dist)); - op = (unsigned)(out - beg); /* max distance in output */ - if (dist > op) { /* see if copy from window */ - op = dist - op; /* distance back in window */ - if (op > whave) { - if (state->sane) { - strm->msg = - (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } -#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR - if (len <= op - whave) { - do { - *out++ = 0; - } while (--len); - continue; - } - len -= op - whave; - do { - *out++ = 0; - } while (--op > whave); - if (op == 0) { - from = out - dist; - do { - *out++ = *from++; - } while (--len); - continue; - } -#endif - } - from = window; - if (wnext == 0) { /* very common case */ - from += wsize - op; - if (op < len) { /* some from window */ - len -= op; - do { - *out++ = *from++; - } while (--op); - from = out - dist; /* rest from output */ - } - } else if (wnext < op) { /* wrap around window */ - from += wsize + wnext - op; - op -= wnext; - if (op < len) { /* some from end of window */ - len -= op; - do { - *out++ = *from++; - } while (--op); - from = window; - if (wnext < len) { /* some from start of window */ - op = wnext; - len -= op; - do { - *out++ = *from++; - } while (--op); - from = out - dist; /* rest from output */ - } - } - } else { /* contiguous in window */ - from += wnext - op; - if (op < len) { /* some from window */ - len -= op; - do { - *out++ = *from++; - } while (--op); - from = out - dist; /* rest from output */ - } - } - while (len > 2) { - *out++ = *from++; - *out++ = *from++; - *out++ = *from++; - len -= 3; - } - if (len) { - *out++ = *from++; - if (len > 1) - *out++ = *from++; - } - } else { - from = out - dist; /* copy direct from output */ - do { /* minimum length is three */ - *out++ = *from++; - *out++ = *from++; - *out++ = *from++; - len -= 3; - } while (len > 2); - if (len) { - *out++ = *from++; - if (len > 1) - *out++ = *from++; - } - } - } else if ((op & 64) == 0) { /* 2nd level distance code */ - here = dcode[here.val + (hold & ((1U << op) - 1))]; - goto dodist; - } else { - strm->msg = (char *)"invalid distance code"; - state->mode = BAD; - break; - } - } else if ((op & 64) == 0) { /* 2nd level length code */ - here = lcode[here.val + (hold & ((1U << op) - 1))]; - goto dolen; - } else if (op & 32) { /* end-of-block */ - Tracevv((stderr, "inflate: end of block\n")); - state->mode = TYPE; - break; - } else { - strm->msg = (char *)"invalid literal/length code"; - state->mode = BAD; - break; - } - } while (in < last && out < end); - - /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ - len = bits >> 3; - in -= len; - bits -= len << 3; - hold &= (1U << bits) - 1; - - /* update state and return */ - strm->next_in = in; - strm->next_out = out; - strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); - strm->avail_out = (unsigned)(out < end ? - 257 + (end - out) : 257 - (out - end)); - state->hold = hold; - state->bits = bits; - return; -} - -/* - inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): - - Using bit fields for code structure - - Different op definition to avoid & for extra bits (do & for table bits) - - Three separate decoding do-loops for direct, window, and wnext == 0 - - Special case for distance > 1 copies to do overlapped load and store copy - - Explicit branch predictions (based on measured branch probabilities) - - Deferring match copy and interspersed it with decoding subsequent codes - - Swapping literal/length else - - Swapping window/direct else - - Larger unrolled copy loops (three is about right) - - Moving len -= 3 statement into middle of loop - */ - -#endif /* !ASMINF */ - diff --git a/common/zlib/inffast.h b/common/zlib/inffast.h deleted file mode 100644 index 131f157a1..000000000 --- a/common/zlib/inffast.h +++ /dev/null @@ -1,12 +0,0 @@ -/* inffast.h -- header to use inffast.c - * Copyright (C) 1995-2003, 2010 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); - diff --git a/common/zlib/inffixed.h b/common/zlib/inffixed.h deleted file mode 100644 index fec0606fd..000000000 --- a/common/zlib/inffixed.h +++ /dev/null @@ -1,95 +0,0 @@ -/* inffixed.h -- table for decoding fixed codes - * Generated automatically by makefixed(). - */ - -/* WARNING: this file should *not* be used by applications. - It is part of the implementation of this library and is - subject to change. Applications should only use zlib.h. - */ - -static const code lenfix[512] = { - {96, 7, 0}, {0, 8, 80}, {0, 8, 16}, {20, 8, 115}, {18, 7, 31}, {0, 8, 112}, {0, 8, 48}, - {0, 9, 192}, {16, 7, 10}, {0, 8, 96}, {0, 8, 32}, {0, 9, 160}, {0, 8, 0}, {0, 8, 128}, - {0, 8, 64}, {0, 9, 224}, {16, 7, 6}, {0, 8, 88}, {0, 8, 24}, {0, 9, 144}, {19, 7, 59}, - {0, 8, 120}, {0, 8, 56}, {0, 9, 208}, {17, 7, 17}, {0, 8, 104}, {0, 8, 40}, {0, 9, 176}, - {0, 8, 8}, {0, 8, 136}, {0, 8, 72}, {0, 9, 240}, {16, 7, 4}, {0, 8, 84}, {0, 8, 20}, - {21, 8, 227}, {19, 7, 43}, {0, 8, 116}, {0, 8, 52}, {0, 9, 200}, {17, 7, 13}, {0, 8, 100}, - {0, 8, 36}, {0, 9, 168}, {0, 8, 4}, {0, 8, 132}, {0, 8, 68}, {0, 9, 232}, {16, 7, 8}, - {0, 8, 92}, {0, 8, 28}, {0, 9, 152}, {20, 7, 83}, {0, 8, 124}, {0, 8, 60}, {0, 9, 216}, - {18, 7, 23}, {0, 8, 108}, {0, 8, 44}, {0, 9, 184}, {0, 8, 12}, {0, 8, 140}, {0, 8, 76}, - {0, 9, 248}, {16, 7, 3}, {0, 8, 82}, {0, 8, 18}, {21, 8, 163}, {19, 7, 35}, {0, 8, 114}, - {0, 8, 50}, {0, 9, 196}, {17, 7, 11}, {0, 8, 98}, {0, 8, 34}, {0, 9, 164}, {0, 8, 2}, - {0, 8, 130}, {0, 8, 66}, {0, 9, 228}, {16, 7, 7}, {0, 8, 90}, {0, 8, 26}, {0, 9, 148}, - {20, 7, 67}, {0, 8, 122}, {0, 8, 58}, {0, 9, 212}, {18, 7, 19}, {0, 8, 106}, {0, 8, 42}, - {0, 9, 180}, {0, 8, 10}, {0, 8, 138}, {0, 8, 74}, {0, 9, 244}, {16, 7, 5}, {0, 8, 86}, - {0, 8, 22}, {64, 8, 0}, {19, 7, 51}, {0, 8, 118}, {0, 8, 54}, {0, 9, 204}, {17, 7, 15}, - {0, 8, 102}, {0, 8, 38}, {0, 9, 172}, {0, 8, 6}, {0, 8, 134}, {0, 8, 70}, {0, 9, 236}, - {16, 7, 9}, {0, 8, 94}, {0, 8, 30}, {0, 9, 156}, {20, 7, 99}, {0, 8, 126}, {0, 8, 62}, - {0, 9, 220}, {18, 7, 27}, {0, 8, 110}, {0, 8, 46}, {0, 9, 188}, {0, 8, 14}, {0, 8, 142}, - {0, 8, 78}, {0, 9, 252}, {96, 7, 0}, {0, 8, 81}, {0, 8, 17}, {21, 8, 131}, {18, 7, 31}, - {0, 8, 113}, {0, 8, 49}, {0, 9, 194}, {16, 7, 10}, {0, 8, 97}, {0, 8, 33}, {0, 9, 162}, - {0, 8, 1}, {0, 8, 129}, {0, 8, 65}, {0, 9, 226}, {16, 7, 6}, {0, 8, 89}, {0, 8, 25}, - {0, 9, 146}, {19, 7, 59}, {0, 8, 121}, {0, 8, 57}, {0, 9, 210}, {17, 7, 17}, {0, 8, 105}, - {0, 8, 41}, {0, 9, 178}, {0, 8, 9}, {0, 8, 137}, {0, 8, 73}, {0, 9, 242}, {16, 7, 4}, - {0, 8, 85}, {0, 8, 21}, {16, 8, 258}, {19, 7, 43}, {0, 8, 117}, {0, 8, 53}, {0, 9, 202}, - {17, 7, 13}, {0, 8, 101}, {0, 8, 37}, {0, 9, 170}, {0, 8, 5}, {0, 8, 133}, {0, 8, 69}, - {0, 9, 234}, {16, 7, 8}, {0, 8, 93}, {0, 8, 29}, {0, 9, 154}, {20, 7, 83}, {0, 8, 125}, - {0, 8, 61}, {0, 9, 218}, {18, 7, 23}, {0, 8, 109}, {0, 8, 45}, {0, 9, 186}, {0, 8, 13}, - {0, 8, 141}, {0, 8, 77}, {0, 9, 250}, {16, 7, 3}, {0, 8, 83}, {0, 8, 19}, {21, 8, 195}, - {19, 7, 35}, {0, 8, 115}, {0, 8, 51}, {0, 9, 198}, {17, 7, 11}, {0, 8, 99}, {0, 8, 35}, - {0, 9, 166}, {0, 8, 3}, {0, 8, 131}, {0, 8, 67}, {0, 9, 230}, {16, 7, 7}, {0, 8, 91}, - {0, 8, 27}, {0, 9, 150}, {20, 7, 67}, {0, 8, 123}, {0, 8, 59}, {0, 9, 214}, {18, 7, 19}, - {0, 8, 107}, {0, 8, 43}, {0, 9, 182}, {0, 8, 11}, {0, 8, 139}, {0, 8, 75}, {0, 9, 246}, - {16, 7, 5}, {0, 8, 87}, {0, 8, 23}, {64, 8, 0}, {19, 7, 51}, {0, 8, 119}, {0, 8, 55}, - {0, 9, 206}, {17, 7, 15}, {0, 8, 103}, {0, 8, 39}, {0, 9, 174}, {0, 8, 7}, {0, 8, 135}, - {0, 8, 71}, {0, 9, 238}, {16, 7, 9}, {0, 8, 95}, {0, 8, 31}, {0, 9, 158}, {20, 7, 99}, - {0, 8, 127}, {0, 8, 63}, {0, 9, 222}, {18, 7, 27}, {0, 8, 111}, {0, 8, 47}, {0, 9, 190}, - {0, 8, 15}, {0, 8, 143}, {0, 8, 79}, {0, 9, 254}, {96, 7, 0}, {0, 8, 80}, {0, 8, 16}, - {20, 8, 115}, {18, 7, 31}, {0, 8, 112}, {0, 8, 48}, {0, 9, 193}, {16, 7, 10}, {0, 8, 96}, - {0, 8, 32}, {0, 9, 161}, {0, 8, 0}, {0, 8, 128}, {0, 8, 64}, {0, 9, 225}, {16, 7, 6}, - {0, 8, 88}, {0, 8, 24}, {0, 9, 145}, {19, 7, 59}, {0, 8, 120}, {0, 8, 56}, {0, 9, 209}, - {17, 7, 17}, {0, 8, 104}, {0, 8, 40}, {0, 9, 177}, {0, 8, 8}, {0, 8, 136}, {0, 8, 72}, - {0, 9, 241}, {16, 7, 4}, {0, 8, 84}, {0, 8, 20}, {21, 8, 227}, {19, 7, 43}, {0, 8, 116}, - {0, 8, 52}, {0, 9, 201}, {17, 7, 13}, {0, 8, 100}, {0, 8, 36}, {0, 9, 169}, {0, 8, 4}, - {0, 8, 132}, {0, 8, 68}, {0, 9, 233}, {16, 7, 8}, {0, 8, 92}, {0, 8, 28}, {0, 9, 153}, - {20, 7, 83}, {0, 8, 124}, {0, 8, 60}, {0, 9, 217}, {18, 7, 23}, {0, 8, 108}, {0, 8, 44}, - {0, 9, 185}, {0, 8, 12}, {0, 8, 140}, {0, 8, 76}, {0, 9, 249}, {16, 7, 3}, {0, 8, 82}, - {0, 8, 18}, {21, 8, 163}, {19, 7, 35}, {0, 8, 114}, {0, 8, 50}, {0, 9, 197}, {17, 7, 11}, - {0, 8, 98}, {0, 8, 34}, {0, 9, 165}, {0, 8, 2}, {0, 8, 130}, {0, 8, 66}, {0, 9, 229}, - {16, 7, 7}, {0, 8, 90}, {0, 8, 26}, {0, 9, 149}, {20, 7, 67}, {0, 8, 122}, {0, 8, 58}, - {0, 9, 213}, {18, 7, 19}, {0, 8, 106}, {0, 8, 42}, {0, 9, 181}, {0, 8, 10}, {0, 8, 138}, - {0, 8, 74}, {0, 9, 245}, {16, 7, 5}, {0, 8, 86}, {0, 8, 22}, {64, 8, 0}, {19, 7, 51}, - {0, 8, 118}, {0, 8, 54}, {0, 9, 205}, {17, 7, 15}, {0, 8, 102}, {0, 8, 38}, {0, 9, 173}, - {0, 8, 6}, {0, 8, 134}, {0, 8, 70}, {0, 9, 237}, {16, 7, 9}, {0, 8, 94}, {0, 8, 30}, - {0, 9, 157}, {20, 7, 99}, {0, 8, 126}, {0, 8, 62}, {0, 9, 221}, {18, 7, 27}, {0, 8, 110}, - {0, 8, 46}, {0, 9, 189}, {0, 8, 14}, {0, 8, 142}, {0, 8, 78}, {0, 9, 253}, {96, 7, 0}, - {0, 8, 81}, {0, 8, 17}, {21, 8, 131}, {18, 7, 31}, {0, 8, 113}, {0, 8, 49}, {0, 9, 195}, - {16, 7, 10}, {0, 8, 97}, {0, 8, 33}, {0, 9, 163}, {0, 8, 1}, {0, 8, 129}, {0, 8, 65}, - {0, 9, 227}, {16, 7, 6}, {0, 8, 89}, {0, 8, 25}, {0, 9, 147}, {19, 7, 59}, {0, 8, 121}, - {0, 8, 57}, {0, 9, 211}, {17, 7, 17}, {0, 8, 105}, {0, 8, 41}, {0, 9, 179}, {0, 8, 9}, - {0, 8, 137}, {0, 8, 73}, {0, 9, 243}, {16, 7, 4}, {0, 8, 85}, {0, 8, 21}, {16, 8, 258}, - {19, 7, 43}, {0, 8, 117}, {0, 8, 53}, {0, 9, 203}, {17, 7, 13}, {0, 8, 101}, {0, 8, 37}, - {0, 9, 171}, {0, 8, 5}, {0, 8, 133}, {0, 8, 69}, {0, 9, 235}, {16, 7, 8}, {0, 8, 93}, - {0, 8, 29}, {0, 9, 155}, {20, 7, 83}, {0, 8, 125}, {0, 8, 61}, {0, 9, 219}, {18, 7, 23}, - {0, 8, 109}, {0, 8, 45}, {0, 9, 187}, {0, 8, 13}, {0, 8, 141}, {0, 8, 77}, {0, 9, 251}, - {16, 7, 3}, {0, 8, 83}, {0, 8, 19}, {21, 8, 195}, {19, 7, 35}, {0, 8, 115}, {0, 8, 51}, - {0, 9, 199}, {17, 7, 11}, {0, 8, 99}, {0, 8, 35}, {0, 9, 167}, {0, 8, 3}, {0, 8, 131}, - {0, 8, 67}, {0, 9, 231}, {16, 7, 7}, {0, 8, 91}, {0, 8, 27}, {0, 9, 151}, {20, 7, 67}, - {0, 8, 123}, {0, 8, 59}, {0, 9, 215}, {18, 7, 19}, {0, 8, 107}, {0, 8, 43}, {0, 9, 183}, - {0, 8, 11}, {0, 8, 139}, {0, 8, 75}, {0, 9, 247}, {16, 7, 5}, {0, 8, 87}, {0, 8, 23}, - {64, 8, 0}, {19, 7, 51}, {0, 8, 119}, {0, 8, 55}, {0, 9, 207}, {17, 7, 15}, {0, 8, 103}, - {0, 8, 39}, {0, 9, 175}, {0, 8, 7}, {0, 8, 135}, {0, 8, 71}, {0, 9, 239}, {16, 7, 9}, - {0, 8, 95}, {0, 8, 31}, {0, 9, 159}, {20, 7, 99}, {0, 8, 127}, {0, 8, 63}, {0, 9, 223}, - {18, 7, 27}, {0, 8, 111}, {0, 8, 47}, {0, 9, 191}, {0, 8, 15}, {0, 8, 143}, {0, 8, 79}, - {0, 9, 255} -}; - -static const code distfix[32] = { - {16, 5, 1}, {23, 5, 257}, {19, 5, 17}, {27, 5, 4097}, {17, 5, 5}, {25, 5, 1025}, - {21, 5, 65}, {29, 5, 16385}, {16, 5, 3}, {24, 5, 513}, {20, 5, 33}, {28, 5, 8193}, - {18, 5, 9}, {26, 5, 2049}, {22, 5, 129}, {64, 5, 0}, {16, 5, 2}, {23, 5, 385}, - {19, 5, 25}, {27, 5, 6145}, {17, 5, 7}, {25, 5, 1537}, {21, 5, 97}, {29, 5, 24577}, - {16, 5, 4}, {24, 5, 769}, {20, 5, 49}, {28, 5, 12289}, {18, 5, 13}, {26, 5, 3073}, - {22, 5, 193}, {64, 5, 0} -}; - diff --git a/common/zlib/inflate.c b/common/zlib/inflate.c deleted file mode 100644 index 753671080..000000000 --- a/common/zlib/inflate.c +++ /dev/null @@ -1,1561 +0,0 @@ -/* inflate.c -- zlib decompression - * Copyright (C) 1995-2016 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * Change history: - * - * 1.2.beta0 24 Nov 2002 - * - First version -- complete rewrite of inflate to simplify code, avoid - * creation of window when not needed, minimize use of window when it is - * needed, make inffast.c even faster, implement gzip decoding, and to - * improve code readability and style over the previous zlib inflate code - * - * 1.2.beta1 25 Nov 2002 - * - Use pointers for available input and output checking in inffast.c - * - Remove input and output counters in inffast.c - * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 - * - Remove unnecessary second byte pull from length extra in inffast.c - * - Unroll direct copy to three copies per loop in inffast.c - * - * 1.2.beta2 4 Dec 2002 - * - Change external routine names to reduce potential conflicts - * - Correct filename to inffixed.h for fixed tables in inflate.c - * - Make hbuf[] unsigned char to match parameter type in inflate.c - * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) - * to avoid negation problem on Alphas (64 bit) in inflate.c - * - * 1.2.beta3 22 Dec 2002 - * - Add comments on state->bits assertion in inffast.c - * - Add comments on op field in inftrees.h - * - Fix bug in reuse of allocated window after inflateReset() - * - Remove bit fields--back to byte structure for speed - * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths - * - Change post-increments to pre-increments in inflate_fast(), PPC biased? - * - Add compile time option, POSTINC, to use post-increments instead (Intel?) - * - Make MATCH copy in inflate() much faster for when inflate_fast() not used - * - Use local copies of stream next and avail values, as well as local bit - * buffer and bit count in inflate()--for speed when inflate_fast() not used - * - * 1.2.beta4 1 Jan 2003 - * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings - * - Move a comment on output buffer sizes from inffast.c to inflate.c - * - Add comments in inffast.c to introduce the inflate_fast() routine - * - Rearrange window copies in inflate_fast() for speed and simplification - * - Unroll last copy for window match in inflate_fast() - * - Use local copies of window variables in inflate_fast() for speed - * - Pull out common wnext == 0 case for speed in inflate_fast() - * - Make op and len in inflate_fast() unsigned for consistency - * - Add FAR to lcode and dcode declarations in inflate_fast() - * - Simplified bad distance check in inflate_fast() - * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new - * source file infback.c to provide a call-back interface to inflate for - * programs like gzip and unzip -- uses window as output buffer to avoid - * window copying - * - * 1.2.beta5 1 Jan 2003 - * - Improved inflateBack() interface to allow the caller to provide initial - * input in strm. - * - Fixed stored blocks bug in inflateBack() - * - * 1.2.beta6 4 Jan 2003 - * - Added comments in inffast.c on effectiveness of POSTINC - * - Typecasting all around to reduce compiler warnings - * - Changed loops from while (1) or do {} while (1) to for (;;), again to - * make compilers happy - * - Changed type of window in inflateBackInit() to unsigned char * - * - * 1.2.beta7 27 Jan 2003 - * - Changed many types to unsigned or unsigned short to avoid warnings - * - Added inflateCopy() function - * - * 1.2.0 9 Mar 2003 - * - Changed inflateBack() interface to provide separate opaque descriptors - * for the in() and out() functions - * - Changed inflateBack() argument and in_func typedef to swap the length - * and buffer address return values for the input function - * - Check next_in and next_out for Z_NULL on entry to inflate() - * - * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. - */ - -#include "zutil.h" -#include "inftrees.h" -#include "inflate.h" -#include "inffast.h" - -#ifdef MAKEFIXED -# ifndef BUILDFIXED -# define BUILDFIXED -# endif -#endif - -/* function prototypes */ -local int inflateStateCheck OF((z_streamp strm)); -#ifdef ZLIB_PM3_TUNED -extern void Dbprintf(const char *fmt, ...); -#else -local void fixedtables OF((struct inflate_state FAR *state)); -#endif -local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, - unsigned copy)); -#ifdef BUILDFIXED -void makefixed OF((void)); -#endif -local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf, - unsigned len)); - -local int inflateStateCheck(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - if (strm == Z_NULL || - strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) - return 1; - state = (struct inflate_state FAR *)strm->state; - if (state == Z_NULL || state->strm != strm || - state->mode < HEAD || state->mode > SYNC) - return 1; - return 0; -} - -int ZEXPORT inflateResetKeep(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - - if (inflateStateCheck(strm)) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - strm->total_in = strm->total_out = state->total = 0; - strm->msg = Z_NULL; - if (state->wrap) /* to support ill-conceived Java test suite */ - strm->adler = state->wrap & 1; - state->mode = HEAD; - state->last = 0; - state->havedict = 0; - state->dmax = 32768U; - state->head = Z_NULL; - state->hold = 0; - state->bits = 0; - state->lencode = state->distcode = state->next = state->codes; - state->sane = 1; - state->back = -1; - Tracev((stderr, "inflate: reset\n")); - return Z_OK; -} - -int ZEXPORT inflateReset(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - - if (inflateStateCheck(strm)) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - state->wsize = 0; - state->whave = 0; - state->wnext = 0; - return inflateResetKeep(strm); -} - -int ZEXPORT inflateReset2(strm, windowBits) -z_streamp strm; -int windowBits; -{ - int wrap; - struct inflate_state FAR *state; - - /* get the state */ - if (inflateStateCheck(strm)) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - - /* extract wrap request from windowBits parameter */ - if (windowBits < 0) { - wrap = 0; - windowBits = -windowBits; - } else { - wrap = (windowBits >> 4) + 5; -#ifdef GUNZIP - if (windowBits < 48) - windowBits &= 15; -#endif - } - - /* set number of window bits, free window if different */ - if (windowBits && (windowBits < 8 || windowBits > 15)) - return Z_STREAM_ERROR; - if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { - ZFREE(strm, state->window); - state->window = Z_NULL; - } - - /* update state and reset the rest of it */ - state->wrap = wrap; - state->wbits = (unsigned)windowBits; - return inflateReset(strm); -} - -int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) -z_streamp strm; -int windowBits; -const char *version; -int stream_size; -{ - int ret; - struct inflate_state FAR *state; - - if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || - stream_size != (int)(sizeof(z_stream))) - return Z_VERSION_ERROR; - if (strm == Z_NULL) return Z_STREAM_ERROR; - strm->msg = Z_NULL; /* in case we return an error */ - if (strm->zalloc == (alloc_func)0) { -#ifdef Z_SOLO - return Z_STREAM_ERROR; -#else - strm->zalloc = zcalloc; - strm->opaque = (voidpf)0; -#endif - } - if (strm->zfree == (free_func)0) -#ifdef Z_SOLO - return Z_STREAM_ERROR; -#else - strm->zfree = zcfree; -#endif - state = (struct inflate_state FAR *) - ZALLOC(strm, 1, sizeof(struct inflate_state)); - if (state == Z_NULL) return Z_MEM_ERROR; - Tracev((stderr, "inflate: allocated\n")); - strm->state = (struct internal_state FAR *)state; - state->strm = strm; - state->window = Z_NULL; - state->mode = HEAD; /* to pass state test in inflateReset2() */ - ret = inflateReset2(strm, windowBits); - if (ret != Z_OK) { - ZFREE(strm, state); - strm->state = Z_NULL; - } - return ret; -} - -int ZEXPORT inflateInit_(strm, version, stream_size) -z_streamp strm; -const char *version; -int stream_size; -{ - return inflateInit2_(strm, DEF_WBITS, version, stream_size); -} - -int ZEXPORT inflatePrime(strm, bits, value) -z_streamp strm; -int bits; -int value; -{ - struct inflate_state FAR *state; - - if (inflateStateCheck(strm)) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (bits < 0) { - state->hold = 0; - state->bits = 0; - return Z_OK; - } - if (bits > 16 || state->bits + (uInt)bits > 32) return Z_STREAM_ERROR; - value &= (1L << bits) - 1; - state->hold += (unsigned)value << state->bits; - state->bits += (uInt)bits; - return Z_OK; -} - -/* - Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. - */ -#ifndef ZLIB_PM3_TUNED -local void fixedtables(state) -struct inflate_state FAR *state; -{ -#ifdef BUILDFIXED - static int virgin = 1; - static code *lenfix, *distfix; - static code fixed[544]; - - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - unsigned sym, bits; - static code *next; - - /* literal/length table */ - sym = 0; - while (sym < 144) state->lens[sym++] = 8; - while (sym < 256) state->lens[sym++] = 9; - while (sym < 280) state->lens[sym++] = 7; - while (sym < 288) state->lens[sym++] = 8; - next = fixed; - lenfix = next; - bits = 9; - inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); - - /* distance table */ - sym = 0; - while (sym < 32) state->lens[sym++] = 5; - distfix = next; - bits = 5; - inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); - - /* do this just once */ - virgin = 0; - } -#else /* !BUILDFIXED */ -# include "inffixed.h" -#endif /* BUILDFIXED */ - state->lencode = lenfix; - state->lenbits = 9; - state->distcode = distfix; - state->distbits = 5; -} - -#ifdef MAKEFIXED -#include <stdio.h> - -/* - Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also - defines BUILDFIXED, so the tables are built on the fly. makefixed() writes - those tables to stdout, which would be piped to inffixed.h. A small program - can simply call makefixed to do this: - - void makefixed(void); - - int main(void) - { - makefixed(); - return 0; - } - - Then that can be linked with zlib built with MAKEFIXED defined and run: - - a.out > inffixed.h - */ -void makefixed() { - unsigned low, size; - struct inflate_state state; - - fixedtables(&state); - puts(" /* inffixed.h -- table for decoding fixed codes"); - puts(" * Generated automatically by makefixed()."); - puts(" */"); - puts(""); - puts(" /* WARNING: this file should *not* be used by applications."); - puts(" It is part of the implementation of this library and is"); - puts(" subject to change. Applications should only use zlib.h."); - puts(" */"); - puts(""); - size = 1U << 9; - printf(" static const code lenfix[%u] = {", size); - low = 0; - for (;;) { - if ((low % 7) == 0) printf("\n "); - printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op, - state.lencode[low].bits, state.lencode[low].val); - if (++low == size) break; - putchar(','); - } - puts("\n };"); - size = 1U << 5; - printf("\n static const code distfix[%u] = {", size); - low = 0; - for (;;) { - if ((low % 6) == 0) printf("\n "); - printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, - state.distcode[low].val); - if (++low == size) break; - putchar(','); - } - puts("\n };"); -} -#endif /* MAKEFIXED */ -#endif /* ZLIB_PM3_TUNED */ -/* - Update the window with the last wsize (normally 32K) bytes written before - returning. If window does not exist yet, create it. This is only called - when a window is already in use, or when output has been written during this - inflate call, but the end of the deflate stream has not been reached yet. - It is also called to create a window for dictionary data when a dictionary - is loaded. - - Providing output buffers larger than 32K to inflate() should provide a speed - advantage, since only the last 32K of output is copied to the sliding window - upon return from inflate(), and since all distances after the first 32K of - output will fall in the output data, making match copies simpler and faster. - The advantage may be dependent on the size of the processor's data caches. - */ -local int updatewindow(strm, end, copy) -z_streamp strm; -const Bytef *end; -unsigned copy; -{ - struct inflate_state FAR *state; - unsigned dist; - - state = (struct inflate_state FAR *)strm->state; - - /* if it hasn't been done already, allocate space for the window */ - if (state->window == Z_NULL) { - state->window = (unsigned char FAR *) - ZALLOC(strm, 1U << state->wbits, - sizeof(unsigned char)); - if (state->window == Z_NULL) return 1; - } - - /* if window not in use yet, initialize */ - if (state->wsize == 0) { - state->wsize = 1U << state->wbits; - state->wnext = 0; - state->whave = 0; - } - - /* copy state->wsize or less output bytes into the circular window */ - if (copy >= state->wsize) { - zmemcpy(state->window, end - state->wsize, state->wsize); - state->wnext = 0; - state->whave = state->wsize; - } else { - dist = state->wsize - state->wnext; - if (dist > copy) dist = copy; - zmemcpy(state->window + state->wnext, end - copy, dist); - copy -= dist; - if (copy) { - zmemcpy(state->window, end - copy, copy); - state->wnext = copy; - state->whave = state->wsize; - } else { - state->wnext += dist; - if (state->wnext == state->wsize) state->wnext = 0; - if (state->whave < state->wsize) state->whave += dist; - } - } - return 0; -} - -/* Macros for inflate(): */ - -/* check function to use adler32() for zlib or crc32() for gzip */ -#ifdef GUNZIP -# define UPDATE(check, buf, len) \ - (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) -#else -# define UPDATE(check, buf, len) adler32(check, buf, len) -#endif - -/* check macros for header crc */ -#ifdef GUNZIP -# define CRC2(check, word) \ - do { \ - hbuf[0] = (unsigned char)(word); \ - hbuf[1] = (unsigned char)((word) >> 8); \ - check = crc32(check, hbuf, 2); \ - } while (0) - -# define CRC4(check, word) \ - do { \ - hbuf[0] = (unsigned char)(word); \ - hbuf[1] = (unsigned char)((word) >> 8); \ - hbuf[2] = (unsigned char)((word) >> 16); \ - hbuf[3] = (unsigned char)((word) >> 24); \ - check = crc32(check, hbuf, 4); \ - } while (0) -#endif - -/* Load registers with state in inflate() for speed */ -#define LOAD() \ - do { \ - put = strm->next_out; \ - left = strm->avail_out; \ - next = strm->next_in; \ - have = strm->avail_in; \ - hold = state->hold; \ - bits = state->bits; \ - } while (0) - -/* Restore state from registers in inflate() */ -#define RESTORE() \ - do { \ - strm->next_out = put; \ - strm->avail_out = left; \ - strm->next_in = next; \ - strm->avail_in = have; \ - state->hold = hold; \ - state->bits = bits; \ - } while (0) - -/* Clear the input bit accumulator */ -#define INITBITS() \ - do { \ - hold = 0; \ - bits = 0; \ - } while (0) - -/* Get a byte of input into the bit accumulator, or return from inflate() - if there is no input available. */ -#define PULLBYTE() \ - do { \ - if (have == 0) goto inf_leave; \ - have--; \ - hold += (unsigned long)(*next++) << bits; \ - bits += 8; \ - } while (0) - -/* Assure that there are at least n bits in the bit accumulator. If there is - not enough available input to do that, then return from inflate(). */ -#define NEEDBITS(n) \ - do { \ - while (bits < (unsigned)(n)) \ - PULLBYTE(); \ - } while (0) - -/* Return the low n bits of the bit accumulator (n < 16) */ -#define BITS(n) \ - ((unsigned)hold & ((1U << (n)) - 1)) - -/* Remove n bits from the bit accumulator */ -#define DROPBITS(n) \ - do { \ - hold >>= (n); \ - bits -= (unsigned)(n); \ - } while (0) - -/* Remove zero to seven bits as needed to go to a byte boundary */ -#define BYTEBITS() \ - do { \ - hold >>= bits & 7; \ - bits -= bits & 7; \ - } while (0) - -/* - inflate() uses a state machine to process as much input data and generate as - much output data as possible before returning. The state machine is - structured roughly as follows: - - for (;;) switch (state) { - ... - case STATEn: - if (not enough input data or output space to make progress) - return; - ... make progress ... - state = STATEm; - break; - ... - } - - so when inflate() is called again, the same case is attempted again, and - if the appropriate resources are provided, the machine proceeds to the - next state. The NEEDBITS() macro is usually the way the state evaluates - whether it can proceed or should return. NEEDBITS() does the return if - the requested bits are not available. The typical use of the BITS macros - is: - - NEEDBITS(n); - ... do something with BITS(n) ... - DROPBITS(n); - - where NEEDBITS(n) either returns from inflate() if there isn't enough - input left to load n bits into the accumulator, or it continues. BITS(n) - gives the low n bits in the accumulator. When done, DROPBITS(n) drops - the low n bits off the accumulator. INITBITS() clears the accumulator - and sets the number of available bits to zero. BYTEBITS() discards just - enough bits to put the accumulator on a byte boundary. After BYTEBITS() - and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. - - NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return - if there is no input available. The decoding of variable length codes uses - PULLBYTE() directly in order to pull just enough bytes to decode the next - code, and no more. - - Some states loop until they get enough input, making sure that enough - state information is maintained to continue the loop where it left off - if NEEDBITS() returns in the loop. For example, want, need, and keep - would all have to actually be part of the saved state in case NEEDBITS() - returns: - - case STATEw: - while (want < need) { - NEEDBITS(n); - keep[want++] = BITS(n); - DROPBITS(n); - } - state = STATEx; - case STATEx: - - As shown above, if the next state is also the next case, then the break - is omitted. - - A state may also return if there is not enough output space available to - complete that state. Those states are copying stored data, writing a - literal byte, and copying a matching string. - - When returning, a "goto inf_leave" is used to update the total counters, - update the check value, and determine whether any progress has been made - during that inflate() call in order to return the proper return code. - Progress is defined as a change in either strm->avail_in or strm->avail_out. - When there is a window, goto inf_leave will update the window with the last - output written. If a goto inf_leave occurs in the middle of decompression - and there is no window currently, goto inf_leave will create one and copy - output to the window for the next call of inflate(). - - In this implementation, the flush parameter of inflate() only affects the - return code (per zlib.h). inflate() always writes as much as possible to - strm->next_out, given the space available and the provided input--the effect - documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers - the allocation of and copying into a sliding window until necessary, which - provides the effect documented in zlib.h for Z_FINISH when the entire input - stream available. So the only thing the flush parameter actually does is: - when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it - will return Z_BUF_ERROR if it has not reached the end of the stream. - */ - -int ZEXPORT inflate(strm, flush) -z_streamp strm; -int flush; -{ - struct inflate_state FAR *state; - z_const unsigned char FAR *next; /* next input */ - unsigned char FAR *put; /* next output */ - unsigned have, left; /* available input and output */ - unsigned long hold; /* bit buffer */ - unsigned bits; /* bits in bit buffer */ - unsigned in, out; /* save starting available input and output */ - unsigned copy; /* number of stored or match bytes to copy */ - unsigned char FAR *from; /* where to copy match bytes from */ - code here; /* current decoding table entry */ - code last; /* parent table entry */ - unsigned len; /* length to copy for repeats, bits to drop */ - int ret; /* return code */ -#ifdef GUNZIP - unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ -#endif - static const unsigned short order[19] = /* permutation of code lengths */ - {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - - if (inflateStateCheck(strm) || strm->next_out == Z_NULL || - (strm->next_in == Z_NULL && strm->avail_in != 0)) - return Z_STREAM_ERROR; - - state = (struct inflate_state FAR *)strm->state; - if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ - LOAD(); - in = have; - out = left; - ret = Z_OK; - for (;;) - switch (state->mode) { - case HEAD: - if (state->wrap == 0) { - state->mode = TYPEDO; - break; - } - NEEDBITS(16); -#ifdef GUNZIP - if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ - if (state->wbits == 0) - state->wbits = 15; - state->check = crc32(0L, Z_NULL, 0); - CRC2(state->check, hold); - INITBITS(); - state->mode = FLAGS; - break; - } - state->flags = 0; /* expect zlib header */ - if (state->head != Z_NULL) - state->head->done = -1; - if (!(state->wrap & 1) || /* check if zlib header allowed */ -#else - if ( -#endif - ((BITS(8) << 8) + (hold >> 8)) % 31) { - strm->msg = (char *)"incorrect header check"; - state->mode = BAD; - break; - } - if (BITS(4) != Z_DEFLATED) { - strm->msg = (char *)"unknown compression method"; - state->mode = BAD; - break; - } - DROPBITS(4); - len = BITS(4) + 8; - if (state->wbits == 0) - state->wbits = len; - if (len > 15 || len > state->wbits) { - strm->msg = (char *)"invalid window size"; - state->mode = BAD; - break; - } - state->dmax = 1U << len; - Tracev((stderr, "inflate: zlib header ok\n")); - strm->adler = state->check = adler32(0L, Z_NULL, 0); - state->mode = hold & 0x200 ? DICTID : TYPE; - INITBITS(); - break; -#ifdef GUNZIP - case FLAGS: - NEEDBITS(16); - state->flags = (int)(hold); - if ((state->flags & 0xff) != Z_DEFLATED) { - strm->msg = (char *)"unknown compression method"; - state->mode = BAD; - break; - } - if (state->flags & 0xe000) { - strm->msg = (char *)"unknown header flags set"; - state->mode = BAD; - break; - } - if (state->head != Z_NULL) - state->head->text = (int)((hold >> 8) & 1); - if ((state->flags & 0x0200) && (state->wrap & 4)) - CRC2(state->check, hold); - INITBITS(); - state->mode = TIME; - case TIME: - NEEDBITS(32); - if (state->head != Z_NULL) - state->head->time = hold; - if ((state->flags & 0x0200) && (state->wrap & 4)) - CRC4(state->check, hold); - INITBITS(); - state->mode = OS; - case OS: - NEEDBITS(16); - if (state->head != Z_NULL) { - state->head->xflags = (int)(hold & 0xff); - state->head->os = (int)(hold >> 8); - } - if ((state->flags & 0x0200) && (state->wrap & 4)) - CRC2(state->check, hold); - INITBITS(); - state->mode = EXLEN; - case EXLEN: - if (state->flags & 0x0400) { - NEEDBITS(16); - state->length = (unsigned)(hold); - if (state->head != Z_NULL) - state->head->extra_len = (unsigned)hold; - if ((state->flags & 0x0200) && (state->wrap & 4)) - CRC2(state->check, hold); - INITBITS(); - } else if (state->head != Z_NULL) - state->head->extra = Z_NULL; - state->mode = EXTRA; - case EXTRA: - if (state->flags & 0x0400) { - copy = state->length; - if (copy > have) copy = have; - if (copy) { - if (state->head != Z_NULL && - state->head->extra != Z_NULL) { - len = state->head->extra_len - state->length; - zmemcpy(state->head->extra + len, next, - len + copy > state->head->extra_max ? - state->head->extra_max - len : copy); - } - if ((state->flags & 0x0200) && (state->wrap & 4)) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - state->length -= copy; - } - if (state->length) goto inf_leave; - } - state->length = 0; - state->mode = NAME; - case NAME: - if (state->flags & 0x0800) { - if (have == 0) goto inf_leave; - copy = 0; - do { - len = (unsigned)(next[copy++]); - if (state->head != Z_NULL && - state->head->name != Z_NULL && - state->length < state->head->name_max) - state->head->name[state->length++] = (Bytef)len; - } while (len && copy < have); - if ((state->flags & 0x0200) && (state->wrap & 4)) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - if (len) goto inf_leave; - } else if (state->head != Z_NULL) - state->head->name = Z_NULL; - state->length = 0; - state->mode = COMMENT; - case COMMENT: - if (state->flags & 0x1000) { - if (have == 0) goto inf_leave; - copy = 0; - do { - len = (unsigned)(next[copy++]); - if (state->head != Z_NULL && - state->head->comment != Z_NULL && - state->length < state->head->comm_max) - state->head->comment[state->length++] = (Bytef)len; - } while (len && copy < have); - if ((state->flags & 0x0200) && (state->wrap & 4)) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - if (len) goto inf_leave; - } else if (state->head != Z_NULL) - state->head->comment = Z_NULL; - state->mode = HCRC; - case HCRC: - if (state->flags & 0x0200) { - NEEDBITS(16); - if ((state->wrap & 4) && hold != (state->check & 0xffff)) { - strm->msg = (char *)"header crc mismatch"; - state->mode = BAD; - break; - } - INITBITS(); - } - if (state->head != Z_NULL) { - state->head->hcrc = (int)((state->flags >> 9) & 1); - state->head->done = 1; - } - strm->adler = state->check = crc32(0L, Z_NULL, 0); - state->mode = TYPE; - break; -#endif - case DICTID: - NEEDBITS(32); - strm->adler = state->check = ZSWAP32(hold); - INITBITS(); - state->mode = DICT; - case DICT: - if (state->havedict == 0) { - RESTORE(); - return Z_NEED_DICT; - } - strm->adler = state->check = adler32(0L, Z_NULL, 0); - state->mode = TYPE; - case TYPE: - if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; - case TYPEDO: - if (state->last) { - BYTEBITS(); - state->mode = CHECK; - break; - } - NEEDBITS(3); - state->last = BITS(1); - DROPBITS(1); - switch (BITS(2)) { - case 0: /* stored block */ - Tracev((stderr, "inflate: stored block%s\n", - state->last ? " (last)" : "")); - state->mode = STORED; - break; - case 1: /* fixed block */ -#ifdef ZLIB_PM3_TUNED - strm->msg = (char *)"fixed block coding not supported"; - state->mode = BAD; -#else - fixedtables(state); - Tracev((stderr, "inflate: fixed codes block%s\n", - state->last ? " (last)" : "")); - state->mode = LEN_; /* decode codes */ - if (flush == Z_TREES) { - DROPBITS(2); - goto inf_leave; - } -#endif - break; - case 2: /* dynamic block */ - Tracev((stderr, "inflate: dynamic codes block%s\n", - state->last ? " (last)" : "")); - state->mode = TABLE; - break; - case 3: - strm->msg = (char *)"invalid block type"; - state->mode = BAD; - } - DROPBITS(2); - break; - case STORED: - BYTEBITS(); /* go to byte boundary */ - NEEDBITS(32); - if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { - strm->msg = (char *)"invalid stored block lengths"; - state->mode = BAD; - break; - } - state->length = (unsigned)hold & 0xffff; - Tracev((stderr, "inflate: stored length %u\n", - state->length)); - INITBITS(); - state->mode = COPY_; - if (flush == Z_TREES) goto inf_leave; - case COPY_: - state->mode = COPY; - case COPY: - copy = state->length; - if (copy) { - if (copy > have) copy = have; - if (copy > left) copy = left; - if (copy == 0) goto inf_leave; - zmemcpy(put, next, copy); - have -= copy; - next += copy; - left -= copy; - put += copy; - state->length -= copy; - break; - } - Tracev((stderr, "inflate: stored end\n")); - state->mode = TYPE; - break; - case TABLE: - NEEDBITS(14); - state->nlen = BITS(5) + 257; - DROPBITS(5); - state->ndist = BITS(5) + 1; - DROPBITS(5); - state->ncode = BITS(4) + 4; - DROPBITS(4); -#ifndef PKZIP_BUG_WORKAROUND - if (state->nlen > 286 || state->ndist > 30) { - strm->msg = (char *)"too many length or distance symbols"; - state->mode = BAD; - break; - } -#endif - Tracev((stderr, "inflate: table sizes ok\n")); - state->have = 0; - state->mode = LENLENS; - case LENLENS: - while (state->have < state->ncode) { - NEEDBITS(3); - state->lens[order[state->have++]] = (unsigned short)BITS(3); - DROPBITS(3); - } - while (state->have < 19) - state->lens[order[state->have++]] = 0; - state->next = state->codes; - state->lencode = (const code FAR *)(state->next); - state->lenbits = 7; - ret = inflate_table(CODES, state->lens, 19, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid code lengths set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: code lengths ok\n")); - state->have = 0; - state->mode = CODELENS; - case CODELENS: - while (state->have < state->nlen + state->ndist) { - for (;;) { - here = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(here.bits) <= bits) break; - PULLBYTE(); - } - if (here.val < 16) { - DROPBITS(here.bits); - state->lens[state->have++] = here.val; - } else { - if (here.val == 16) { - NEEDBITS(here.bits + 2); - DROPBITS(here.bits); - if (state->have == 0) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - len = state->lens[state->have - 1]; - copy = 3 + BITS(2); - DROPBITS(2); - } else if (here.val == 17) { - NEEDBITS(here.bits + 3); - DROPBITS(here.bits); - len = 0; - copy = 3 + BITS(3); - DROPBITS(3); - } else { - NEEDBITS(here.bits + 7); - DROPBITS(here.bits); - len = 0; - copy = 11 + BITS(7); - DROPBITS(7); - } - if (state->have + copy > state->nlen + state->ndist) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - while (copy--) - state->lens[state->have++] = (unsigned short)len; - } - } - - /* handle error breaks in while */ - if (state->mode == BAD) break; - - /* check for end-of-block code (better have one) */ - if (state->lens[256] == 0) { - strm->msg = (char *)"invalid code -- missing end-of-block"; - state->mode = BAD; - break; - } - - /* build code tables -- note: do not change the lenbits or distbits - values here (9 and 6) without reading the comments in inftrees.h - concerning the ENOUGH constants, which depend on those values */ - state->next = state->codes; - state->lencode = (const code FAR *)(state->next); - state->lenbits = 9; - ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid literal/lengths set"; - state->mode = BAD; - break; - } - state->distcode = (const code FAR *)(state->next); - state->distbits = 6; - ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, - &(state->next), &(state->distbits), state->work); - if (ret) { - strm->msg = (char *)"invalid distances set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: codes ok\n")); - state->mode = LEN_; - if (flush == Z_TREES) goto inf_leave; - case LEN_: - state->mode = LEN; - case LEN: - if (have >= 6 && left >= 258) { - RESTORE(); - inflate_fast(strm, out); - LOAD(); - if (state->mode == TYPE) - state->back = -1; - break; - } - state->back = 0; - for (;;) { - here = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(here.bits) <= bits) break; - PULLBYTE(); - } - if (here.op && (here.op & 0xf0) == 0) { - last = here; - for (;;) { - here = state->lencode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + here.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - state->back += last.bits; - } - DROPBITS(here.bits); - state->back += here.bits; - state->length = (unsigned)here.val; - if ((int)(here.op) == 0) { - Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", here.val)); - state->mode = LIT; - break; - } - if (here.op & 32) { - Tracevv((stderr, "inflate: end of block\n")); - state->back = -1; - state->mode = TYPE; - break; - } - if (here.op & 64) { - strm->msg = (char *)"invalid literal/length code"; - state->mode = BAD; - break; - } - state->extra = (unsigned)(here.op) & 15; - state->mode = LENEXT; - case LENEXT: - if (state->extra) { - NEEDBITS(state->extra); - state->length += BITS(state->extra); - DROPBITS(state->extra); - state->back += state->extra; - } - Tracevv((stderr, "inflate: length %u\n", state->length)); - state->was = state->length; - state->mode = DIST; - case DIST: - for (;;) { - here = state->distcode[BITS(state->distbits)]; - if ((unsigned)(here.bits) <= bits) break; - PULLBYTE(); - } - if ((here.op & 0xf0) == 0) { - last = here; - for (;;) { - here = state->distcode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + here.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - state->back += last.bits; - } - DROPBITS(here.bits); - state->back += here.bits; - if (here.op & 64) { - strm->msg = (char *)"invalid distance code"; - state->mode = BAD; - break; - } - state->offset = (unsigned)here.val; - state->extra = (unsigned)(here.op) & 15; - state->mode = DISTEXT; - case DISTEXT: - if (state->extra) { - NEEDBITS(state->extra); - state->offset += BITS(state->extra); - DROPBITS(state->extra); - state->back += state->extra; - } -#ifdef INFLATE_STRICT - if (state->offset > state->dmax) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } -#endif - Tracevv((stderr, "inflate: distance %u\n", state->offset)); - state->mode = MATCH; - case MATCH: - if (left == 0) goto inf_leave; - copy = out - left; - if (state->offset > copy) { /* copy from window */ - copy = state->offset - copy; - if (copy > state->whave) { - if (state->sane) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } -#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR - Trace((stderr, "inflate.c too far\n")); - copy -= state->whave; - if (copy > state->length) copy = state->length; - if (copy > left) copy = left; - left -= copy; - state->length -= copy; - do { - *put++ = 0; - } while (--copy); - if (state->length == 0) state->mode = LEN; - break; -#endif - } - if (copy > state->wnext) { - copy -= state->wnext; - from = state->window + (state->wsize - copy); - } else - from = state->window + (state->wnext - copy); - if (copy > state->length) copy = state->length; - } else { /* copy from output */ - from = put - state->offset; - copy = state->length; - } - if (copy > left) copy = left; - left -= copy; - state->length -= copy; - do { - *put++ = *from++; - } while (--copy); - if (state->length == 0) state->mode = LEN; - break; - case LIT: - if (left == 0) goto inf_leave; - *put++ = (unsigned char)(state->length); - left--; - state->mode = LEN; - break; - case CHECK: - if (state->wrap) { - NEEDBITS(32); - out -= left; - strm->total_out += out; - state->total += out; - if ((state->wrap & 4) && out) - strm->adler = state->check = - UPDATE(state->check, put - out, out); - out = left; - if ((state->wrap & 4) && ( -#ifdef GUNZIP - state->flags ? hold : -#endif - ZSWAP32(hold)) != state->check) { - strm->msg = (char *)"incorrect data check"; - state->mode = BAD; - break; - } - INITBITS(); - Tracev((stderr, "inflate: check matches trailer\n")); - } -#ifdef GUNZIP - state->mode = LENGTH; - case LENGTH: - if (state->wrap && state->flags) { - NEEDBITS(32); - if (hold != (state->total & 0xffffffffUL)) { - strm->msg = (char *)"incorrect length check"; - state->mode = BAD; - break; - } - INITBITS(); - Tracev((stderr, "inflate: length matches trailer\n")); - } -#endif - state->mode = DONE; - case DONE: - ret = Z_STREAM_END; - goto inf_leave; - case BAD: - ret = Z_DATA_ERROR; - goto inf_leave; - case MEM: - return Z_MEM_ERROR; - case SYNC: - default: - return Z_STREAM_ERROR; - } - - /* - Return from inflate(), updating the total counts and the check value. - If there was no progress during the inflate() call, return a buffer - error. Call updatewindow() to create and/or update the window state. - Note: a memory error from inflate() is non-recoverable. - */ -inf_leave: - RESTORE(); - if (state->wsize || (out != strm->avail_out && state->mode < BAD && - (state->mode < CHECK || flush != Z_FINISH))) - if (updatewindow(strm, strm->next_out, out - strm->avail_out)) { - state->mode = MEM; - return Z_MEM_ERROR; - } - in -= strm->avail_in; - out -= strm->avail_out; - strm->total_in += in; - strm->total_out += out; - state->total += out; - if ((state->wrap & 4) && out) - strm->adler = state->check = - UPDATE(state->check, strm->next_out - out, out); - strm->data_type = (int)state->bits + (state->last ? 64 : 0) + - (state->mode == TYPE ? 128 : 0) + - (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); - if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) - ret = Z_BUF_ERROR; - return ret; -} - -int ZEXPORT inflateEnd(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - if (inflateStateCheck(strm)) - return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (state->window != Z_NULL) ZFREE(strm, state->window); - ZFREE(strm, strm->state); - strm->state = Z_NULL; - Tracev((stderr, "inflate: end\n")); - return Z_OK; -} - -int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength) -z_streamp strm; -Bytef *dictionary; -uInt *dictLength; -{ - struct inflate_state FAR *state; - - /* check state */ - if (inflateStateCheck(strm)) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - - /* copy dictionary */ - if (state->whave && dictionary != Z_NULL) { - zmemcpy(dictionary, state->window + state->wnext, - state->whave - state->wnext); - zmemcpy(dictionary + state->whave - state->wnext, - state->window, state->wnext); - } - if (dictLength != Z_NULL) - *dictLength = state->whave; - return Z_OK; -} - -int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) -z_streamp strm; -const Bytef *dictionary; -uInt dictLength; -{ - struct inflate_state FAR *state; - unsigned long dictid; - int ret; - - /* check state */ - if (inflateStateCheck(strm)) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (state->wrap != 0 && state->mode != DICT) - return Z_STREAM_ERROR; - - /* check for correct dictionary identifier */ - if (state->mode == DICT) { - dictid = adler32(0L, Z_NULL, 0); - dictid = adler32(dictid, dictionary, dictLength); - if (dictid != state->check) - return Z_DATA_ERROR; - } - - /* copy dictionary to window using updatewindow(), which will amend the - existing dictionary if appropriate */ - ret = updatewindow(strm, dictionary + dictLength, dictLength); - if (ret) { - state->mode = MEM; - return Z_MEM_ERROR; - } - state->havedict = 1; - Tracev((stderr, "inflate: dictionary set\n")); - return Z_OK; -} - -int ZEXPORT inflateGetHeader(strm, head) -z_streamp strm; -gz_headerp head; -{ - struct inflate_state FAR *state; - - /* check state */ - if (inflateStateCheck(strm)) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; - - /* save header structure */ - state->head = head; - head->done = 0; - return Z_OK; -} - -/* - Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found - or when out of input. When called, *have is the number of pattern bytes - found in order so far, in 0..3. On return *have is updated to the new - state. If on return *have equals four, then the pattern was found and the - return value is how many bytes were read including the last byte of the - pattern. If *have is less than four, then the pattern has not been found - yet and the return value is len. In the latter case, syncsearch() can be - called again with more data and the *have state. *have is initialized to - zero for the first call. - */ -local unsigned syncsearch(have, buf, len) -unsigned FAR *have; -const unsigned char FAR *buf; -unsigned len; -{ - unsigned got; - unsigned next; - - got = *have; - next = 0; - while (next < len && got < 4) { - if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) - got++; - else if (buf[next]) - got = 0; - else - got = 4 - got; - next++; - } - *have = got; - return next; -} - -int ZEXPORT inflateSync(strm) -z_streamp strm; -{ - unsigned len; /* number of bytes to look at or looked at */ - unsigned long in, out; /* temporary to save total_in and total_out */ - unsigned char buf[4]; /* to restore bit buffer to byte string */ - struct inflate_state FAR *state; - - /* check parameters */ - if (inflateStateCheck(strm)) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; - - /* if first time, start search in bit buffer */ - if (state->mode != SYNC) { - state->mode = SYNC; - state->hold <<= state->bits & 7; - state->bits -= state->bits & 7; - len = 0; - while (state->bits >= 8) { - buf[len++] = (unsigned char)(state->hold); - state->hold >>= 8; - state->bits -= 8; - } - state->have = 0; - syncsearch(&(state->have), buf, len); - } - - /* search available input */ - len = syncsearch(&(state->have), strm->next_in, strm->avail_in); - strm->avail_in -= len; - strm->next_in += len; - strm->total_in += len; - - /* return no joy or set up to restart inflate() on a new block */ - if (state->have != 4) return Z_DATA_ERROR; - in = strm->total_in; - out = strm->total_out; - inflateReset(strm); - strm->total_in = in; - strm->total_out = out; - state->mode = TYPE; - return Z_OK; -} - -/* - Returns true if inflate is currently at the end of a block generated by - Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP - implementation to provide an additional safety check. PPP uses - Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored - block. When decompressing, PPP checks that at the end of input packet, - inflate is waiting for these length bytes. - */ -int ZEXPORT inflateSyncPoint(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - - if (inflateStateCheck(strm)) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - return state->mode == STORED && state->bits == 0; -} - -int ZEXPORT inflateCopy(dest, source) -z_streamp dest; -z_streamp source; -{ - struct inflate_state FAR *state; - struct inflate_state FAR *copy; - unsigned char FAR *window; - unsigned wsize; - - /* check input */ - if (inflateStateCheck(source) || dest == Z_NULL) - return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)source->state; - - /* allocate space */ - copy = (struct inflate_state FAR *) - ZALLOC(source, 1, sizeof(struct inflate_state)); - if (copy == Z_NULL) return Z_MEM_ERROR; - window = Z_NULL; - if (state->window != Z_NULL) { - window = (unsigned char FAR *) - ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); - if (window == Z_NULL) { - ZFREE(source, copy); - return Z_MEM_ERROR; - } - } - - /* copy state */ - zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); - zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); - copy->strm = dest; - if (state->lencode >= state->codes && - state->lencode <= state->codes + ENOUGH - 1) { - copy->lencode = copy->codes + (state->lencode - state->codes); - copy->distcode = copy->codes + (state->distcode - state->codes); - } - copy->next = copy->codes + (state->next - state->codes); - if (window != Z_NULL) { - wsize = 1U << state->wbits; - zmemcpy(window, state->window, wsize); - } - copy->window = window; - dest->state = (struct internal_state FAR *)copy; - return Z_OK; -} - -int ZEXPORT inflateUndermine(strm, subvert) -z_streamp strm; -int subvert; -{ - struct inflate_state FAR *state; - - if (inflateStateCheck(strm)) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; -#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR - state->sane = !subvert; - return Z_OK; -#else - (void)subvert; - state->sane = 1; - return Z_DATA_ERROR; -#endif -} - -int ZEXPORT inflateValidate(strm, check) -z_streamp strm; -int check; -{ - struct inflate_state FAR *state; - - if (inflateStateCheck(strm)) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (check) - state->wrap |= 4; - else - state->wrap &= ~4; - return Z_OK; -} - -long ZEXPORT inflateMark(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - - if (inflateStateCheck(strm)) - return -(1L << 16); - state = (struct inflate_state FAR *)strm->state; - return (long)(((unsigned long)((long)state->back)) << 16) + - (state->mode == COPY ? state->length : - (state->mode == MATCH ? state->was - state->length : 0)); -} - -unsigned long ZEXPORT inflateCodesUsed(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - if (inflateStateCheck(strm)) return (unsigned long) - 1; - state = (struct inflate_state FAR *)strm->state; - return (unsigned long)(state->next - state->codes); -} diff --git a/common/zlib/inflate.h b/common/zlib/inflate.h deleted file mode 100644 index f91e0aa78..000000000 --- a/common/zlib/inflate.h +++ /dev/null @@ -1,130 +0,0 @@ -/* inflate.h -- internal inflate state definition - * Copyright (C) 1995-2016 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* define NO_GZIP when compiling if you want to disable gzip header and - trailer decoding by inflate(). NO_GZIP would be used to avoid linking in - the crc code when it is not needed. For shared libraries, gzip decoding - should be left enabled. */ -#ifndef NO_GZIP -# define GUNZIP -#endif - -/* Possible inflate modes between inflate() calls */ -typedef enum { - HEAD = 16180, /* i: waiting for magic header */ -#ifdef GUNZIP - FLAGS, /* i: waiting for method and flags (gzip) */ - TIME, /* i: waiting for modification time (gzip) */ - OS, /* i: waiting for extra flags and operating system (gzip) */ - EXLEN, /* i: waiting for extra length (gzip) */ - EXTRA, /* i: waiting for extra bytes (gzip) */ - NAME, /* i: waiting for end of file name (gzip) */ - COMMENT, /* i: waiting for end of comment (gzip) */ - HCRC, /* i: waiting for header crc (gzip) */ -#endif - DICTID, /* i: waiting for dictionary check value */ - DICT, /* waiting for inflateSetDictionary() call */ - TYPE, /* i: waiting for type bits, including last-flag bit */ - TYPEDO, /* i: same, but skip check to exit inflate on new block */ - STORED, /* i: waiting for stored size (length and complement) */ - COPY_, /* i/o: same as COPY below, but only first time in */ - COPY, /* i/o: waiting for input or output to copy stored block */ - TABLE, /* i: waiting for dynamic block table lengths */ - LENLENS, /* i: waiting for code length code lengths */ - CODELENS, /* i: waiting for length/lit and distance code lengths */ - LEN_, /* i: same as LEN below, but only first time in */ - LEN, /* i: waiting for length/lit/eob code */ - LENEXT, /* i: waiting for length extra bits */ - DIST, /* i: waiting for distance code */ - DISTEXT, /* i: waiting for distance extra bits */ - MATCH, /* o: waiting for output space to copy string */ - LIT, /* o: waiting for output space to write literal */ - CHECK, /* i: waiting for 32-bit check value */ -#ifdef GUNZIP - LENGTH, /* i: waiting for 32-bit length (gzip) */ -#endif - DONE, /* finished check, done -- remain here until reset */ - BAD, /* got a data error -- remain here until reset */ - MEM, /* got an inflate() memory error -- remain here until reset */ - SYNC /* looking for synchronization bytes to restart inflate() */ -} inflate_mode; - -/* - State transitions between above modes - - - (most modes can go to BAD or MEM on error -- not shown for clarity) - - Process header: - HEAD -> (gzip) or (zlib) or (raw) - (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT -> - HCRC -> TYPE - (zlib) -> DICTID or TYPE - DICTID -> DICT -> TYPE - (raw) -> TYPEDO - Read deflate blocks: - TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK - STORED -> COPY_ -> COPY -> TYPE - TABLE -> LENLENS -> CODELENS -> LEN_ - LEN_ -> LEN - Read deflate codes in fixed or dynamic block: - LEN -> LENEXT or LIT or TYPE - LENEXT -> DIST -> DISTEXT -> MATCH -> LEN - LIT -> LEN - Process trailer: - CHECK -> LENGTH -> DONE - */ - -/* State maintained between inflate() calls -- approximately 7K bytes, not - including the allocated sliding window, which is up to 32K bytes. */ -struct inflate_state { - z_streamp strm; /* pointer back to this zlib stream */ - inflate_mode mode; /* current inflate mode */ - int last; /* true if processing last block */ - int wrap; /* bit 0 true for zlib, bit 1 true for gzip, - bit 2 true to validate check value */ - int havedict; /* true if dictionary provided */ - int flags; /* gzip header method and flags (0 if zlib) */ - unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ - unsigned long check; /* protected copy of check value */ - unsigned long total; /* protected copy of output count */ - gz_headerp head; /* where to save gzip header information */ - /* sliding window */ - unsigned wbits; /* log base 2 of requested window size */ - unsigned wsize; /* window size or zero if not using window */ - unsigned whave; /* valid bytes in the window */ - unsigned wnext; /* window write index */ - unsigned char FAR *window; /* allocated sliding window, if needed */ - /* bit accumulator */ - unsigned long hold; /* input bit accumulator */ - unsigned bits; /* number of bits in "in" */ - /* for string and stored block copying */ - unsigned length; /* literal or length of data to copy */ - unsigned offset; /* distance back to copy string from */ - /* for table and code decoding */ - unsigned extra; /* extra bits needed */ - /* fixed and dynamic code tables */ - code const FAR *lencode; /* starting table for length/literal codes */ - code const FAR *distcode; /* starting table for distance codes */ - unsigned lenbits; /* index bits for lencode */ - unsigned distbits; /* index bits for distcode */ - /* dynamic table building */ - unsigned ncode; /* number of code length code lengths */ - unsigned nlen; /* number of length code lengths */ - unsigned ndist; /* number of distance code lengths */ - unsigned have; /* number of code lengths in lens[] */ - code FAR *next; /* next available space in codes[] */ - unsigned short lens[320]; /* temporary storage for code lengths */ - unsigned short work[288]; /* work area for code table building */ - code codes[ENOUGH]; /* space for code tables */ - int sane; /* if false, allow invalid distance too far */ - int back; /* bits back of last unprocessed length/lit */ - unsigned was; /* initial length of match */ -}; - diff --git a/common/zlib/inftrees.c b/common/zlib/inftrees.c deleted file mode 100644 index 3dae7e534..000000000 --- a/common/zlib/inftrees.c +++ /dev/null @@ -1,306 +0,0 @@ -/* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2017 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "inftrees.h" - -#define MAXBITS 15 - -const char inflate_copyright[] = -#ifdef ZLIB_PM3_TUNED - " inflate 1.2.11.f-Proxmark3 Copyright 1995-2017 Mark Adler "; -#else - " inflate 1.2.11 Copyright 1995-2017 Mark Adler "; -#endif -/* - If you use the zlib library in a product, an acknowledgment is welcome - in the documentation of your product. If for some reason you cannot - include such an acknowledgment, I would appreciate that you keep this - copyright string in the executable of your product. - */ - -/* - Build a set of tables to decode the provided canonical Huffman code. - The code lengths are lens[0..codes-1]. The result starts at *table, - whose indices are 0..2^bits-1. work is a writable array of at least - lens shorts, which is used as a work area. type is the type of code - to be generated, CODES, LENS, or DISTS. On return, zero is success, - -1 is an invalid code, and +1 means that ENOUGH isn't enough. table - on return points to the next available entry's address. bits is the - requested root table index bits, and on return it is the actual root - table index bits. It will differ if the request is greater than the - longest code or if it is less than the shortest code. - */ -int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens, - unsigned codes, code FAR *FAR *table, - unsigned FAR *bits, unsigned short FAR *work) { - unsigned len; /* a code's length in bits */ - unsigned sym; /* index of code symbols */ - unsigned min, max; /* minimum and maximum code lengths */ - unsigned root; /* number of index bits for root table */ - unsigned curr; /* number of index bits for current table */ - unsigned drop; /* code bits to drop for sub-table */ - int left; /* number of prefix codes available */ - unsigned used; /* code entries in table used */ - unsigned huff; /* Huffman code */ - unsigned incr; /* for incrementing code, index */ - unsigned fill; /* index for replicating entries */ - unsigned low; /* low bits for current root entry */ - unsigned mask; /* mask for low root bits */ - code here; /* table entry for duplication */ - code FAR *next; /* next available space in table */ - const unsigned short FAR *base; /* base value table to use */ - const unsigned short FAR *extra; /* extra bits table to use */ - unsigned match; /* use base and extra for symbol >= match */ - unsigned short count[MAXBITS + 1]; /* number of codes of each length */ - unsigned short offs[MAXBITS + 1]; /* offsets in table for each length */ - static const unsigned short lbase[31] = { /* Length codes 257..285 base */ - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 - }; - static const unsigned short lext[31] = { /* Length codes 257..285 extra */ - 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 77, 202 - }; - static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577, 0, 0 - }; - static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ - 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, - 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, - 28, 28, 29, 29, 64, 64 - }; - - /* - Process a set of code lengths to create a canonical Huffman code. The - code lengths are lens[0..codes-1]. Each length corresponds to the - symbols 0..codes-1. The Huffman code is generated by first sorting the - symbols by length from short to long, and retaining the symbol order - for codes with equal lengths. Then the code starts with all zero bits - for the first code of the shortest length, and the codes are integer - increments for the same length, and zeros are appended as the length - increases. For the deflate format, these bits are stored backwards - from their more natural integer increment ordering, and so when the - decoding tables are built in the large loop below, the integer codes - are incremented backwards. - - This routine assumes, but does not check, that all of the entries in - lens[] are in the range 0..MAXBITS. The caller must assure this. - 1..MAXBITS is interpreted as that code length. zero means that that - symbol does not occur in this code. - - The codes are sorted by computing a count of codes for each length, - creating from that a table of starting indices for each length in the - sorted table, and then entering the symbols in order in the sorted - table. The sorted table is work[], with that space being provided by - the caller. - - The length counts are used for other purposes as well, i.e. finding - the minimum and maximum length codes, determining if there are any - codes at all, checking for a valid set of lengths, and looking ahead - at length counts to determine sub-table sizes when building the - decoding tables. - */ - - /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ - for (len = 0; len <= MAXBITS; len++) - count[len] = 0; - for (sym = 0; sym < codes; sym++) - count[lens[sym]]++; - - /* bound code lengths, force root to be within code lengths */ - root = *bits; - for (max = MAXBITS; max >= 1; max--) - if (count[max] != 0) break; - if (root > max) root = max; - if (max == 0) { /* no symbols to code at all */ - here.op = (unsigned char)64; /* invalid code marker */ - here.bits = (unsigned char)1; - here.val = (unsigned short)0; - *(*table)++ = here; /* make a table to force an error */ - *(*table)++ = here; - *bits = 1; - return 0; /* no symbols, but wait for decoding to report error */ - } - for (min = 1; min < max; min++) - if (count[min] != 0) break; - if (root < min) root = min; - - /* check for an over-subscribed or incomplete set of lengths */ - left = 1; - for (len = 1; len <= MAXBITS; len++) { - left <<= 1; - left -= count[len]; - if (left < 0) return -1; /* over-subscribed */ - } - if (left > 0 && (type == CODES || max != 1)) - return -1; /* incomplete set */ - - /* generate offsets into symbol table for each length for sorting */ - offs[1] = 0; - for (len = 1; len < MAXBITS; len++) - offs[len + 1] = offs[len] + count[len]; - - /* sort symbols by length, by symbol order within each length */ - for (sym = 0; sym < codes; sym++) - if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; - - /* - Create and fill in decoding tables. In this loop, the table being - filled is at next and has curr index bits. The code being used is huff - with length len. That code is converted to an index by dropping drop - bits off of the bottom. For codes where len is less than drop + curr, - those top drop + curr - len bits are incremented through all values to - fill the table with replicated entries. - - root is the number of index bits for the root table. When len exceeds - root, sub-tables are created pointed to by the root entry with an index - of the low root bits of huff. This is saved in low to check for when a - new sub-table should be started. drop is zero when the root table is - being filled, and drop is root when sub-tables are being filled. - - When a new sub-table is needed, it is necessary to look ahead in the - code lengths to determine what size sub-table is needed. The length - counts are used for this, and so count[] is decremented as codes are - entered in the tables. - - used keeps track of how many table entries have been allocated from the - provided *table space. It is checked for LENS and DIST tables against - the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in - the initial root table size constants. See the comments in inftrees.h - for more information. - - sym increments through all symbols, and the loop terminates when - all codes of length max, i.e. all codes, have been processed. This - routine permits incomplete codes, so another loop after this one fills - in the rest of the decoding tables with invalid code markers. - */ - - /* set up for code type */ - switch (type) { - case CODES: - base = extra = work; /* dummy value--not used */ - match = 20; - break; - case LENS: - base = lbase; - extra = lext; - match = 257; - break; - case DISTS: - default: - base = dbase; - extra = dext; - match = 0; - } - - /* initialize state for loop */ - huff = 0; /* starting code */ - sym = 0; /* starting code symbol */ - len = min; /* starting code length */ - next = *table; /* current table to fill in */ - curr = root; /* current table index bits */ - drop = 0; /* current bits to drop from code for index */ - low = (unsigned)(-1); /* trigger new sub-table when len > root */ - used = 1U << root; /* use root table entries */ - mask = used - 1; /* mask for comparing low */ - - /* check available table space */ - if ((type == LENS && used > ENOUGH_LENS) || - (type == DISTS && used > ENOUGH_DISTS)) - return 1; - - /* process all codes and make table entries */ - for (;;) { - /* create table entry */ - here.bits = (unsigned char)(len - drop); - if (work[sym] + 1U < match) { - here.op = (unsigned char)0; - here.val = work[sym]; - } else if (work[sym] >= match) { - here.op = (unsigned char)(extra[work[sym] - match]); - here.val = base[work[sym] - match]; - } else { - here.op = (unsigned char)(32 + 64); /* end of block */ - here.val = 0; - } - - /* replicate for those indices with low len bits equal to huff */ - incr = 1U << (len - drop); - fill = 1U << curr; - min = fill; /* save offset to next table */ - do { - fill -= incr; - next[(huff >> drop) + fill] = here; - } while (fill != 0); - - /* backwards increment the len-bit code huff */ - incr = 1U << (len - 1); - while (huff & incr) - incr >>= 1; - if (incr != 0) { - huff &= incr - 1; - huff += incr; - } else - huff = 0; - - /* go to next symbol, update count, len */ - sym++; - if (--(count[len]) == 0) { - if (len == max) break; - len = lens[work[sym]]; - } - - /* create new sub-table if needed */ - if (len > root && (huff & mask) != low) { - /* if first time, transition to sub-tables */ - if (drop == 0) - drop = root; - - /* increment past last table */ - next += min; /* here min is 1 << curr */ - - /* determine length of next table */ - curr = len - drop; - left = (int)(1 << curr); - while (curr + drop < max) { - left -= count[curr + drop]; - if (left <= 0) break; - curr++; - left <<= 1; - } - - /* check for enough space */ - used += 1U << curr; - if ((type == LENS && used > ENOUGH_LENS) || - (type == DISTS && used > ENOUGH_DISTS)) - return 1; - - /* point entry in root table to sub-table */ - low = huff & mask; - (*table)[low].op = (unsigned char)curr; - (*table)[low].bits = (unsigned char)root; - (*table)[low].val = (unsigned short)(next - *table); - } - } - - /* fill in remaining table entry if code is incomplete (guaranteed to have - at most one remaining entry, since if the code is incomplete, the - maximum code length that was allowed to get this far is one bit) */ - if (huff != 0) { - here.op = (unsigned char)64; /* invalid code marker */ - here.bits = (unsigned char)(len - drop); - here.val = (unsigned short)0; - next[huff] = here; - } - - /* set return parameters */ - *table += used; - *bits = root; - return 0; -} - diff --git a/common/zlib/inftrees.h b/common/zlib/inftrees.h deleted file mode 100644 index 33584c58d..000000000 --- a/common/zlib/inftrees.h +++ /dev/null @@ -1,63 +0,0 @@ -/* inftrees.h -- header to use inftrees.c - * Copyright (C) 1995-2005, 2010 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* Structure for decoding tables. Each entry provides either the - information needed to do the operation requested by the code that - indexed that table entry, or it provides a pointer to another - table that indexes more bits of the code. op indicates whether - the entry is a pointer to another table, a literal, a length or - distance, an end-of-block, or an invalid code. For a table - pointer, the low four bits of op is the number of index bits of - that table. For a length or distance, the low four bits of op - is the number of extra bits to get after the code. bits is - the number of bits in this code or part of the code to drop off - of the bit buffer. val is the actual byte to output in the case - of a literal, the base length or distance, or the offset from - the current table to the next table. Each entry is four bytes. */ -typedef struct { - unsigned char op; /* operation, extra bits, table bits */ - unsigned char bits; /* bits in this part of the code */ - unsigned short val; /* offset in table or code value */ -} code; - -/* op values as set by inflate_table(): - 00000000 - literal - 0000tttt - table link, tttt != 0 is the number of table index bits - 0001eeee - length or distance, eeee is the number of extra bits - 01100000 - end of block - 01000000 - invalid code - */ - -/* Maximum size of the dynamic table. The maximum number of code structures is - 1444, which is the sum of 852 for literal/length codes and 592 for distance - codes. These values were found by exhaustive searches using the program - examples/enough.c found in the zlib distribtution. The arguments to that - program are the number of symbols, the initial root table size, and the - maximum bit length of a code. "enough 286 9 15" for literal/length codes - returns returns 852, and "enough 30 6 15" for distance codes returns 592. - The initial root table size (9 or 6) is found in the fifth argument of the - inflate_table() calls in inflate.c and infback.c. If the root table size is - changed, then these maximum sizes would be need to be recalculated and - updated. */ -#define ENOUGH_LENS 852 -#define ENOUGH_DISTS 592 -#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) - -/* Type of code to build for inflate_table() */ -typedef enum { - CODES, - LENS, - DISTS -} codetype; - -int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, - unsigned codes, code FAR *FAR *table, - unsigned FAR *bits, unsigned short FAR *work)); - diff --git a/common/zlib/trees.c b/common/zlib/trees.c deleted file mode 100644 index 1ef49d00d..000000000 --- a/common/zlib/trees.c +++ /dev/null @@ -1,1222 +0,0 @@ -/* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1995-2017 Jean-loup Gailly - * detect_data_type() function provided freely by Cosmin Truta, 2006 - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * ALGORITHM - * - * The "deflation" process uses several Huffman trees. The more - * common source values are represented by shorter bit sequences. - * - * Each code tree is stored in a compressed form which is itself - * a Huffman encoding of the lengths of all the code strings (in - * ascending order by source values). The actual code strings are - * reconstructed from the lengths in the inflate process, as described - * in the deflate specification. - * - * REFERENCES - * - * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". - * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc - * - * Storer, James A. - * Data Compression: Methods and Theory, pp. 49-50. - * Computer Science Press, 1988. ISBN 0-7167-8156-5. - * - * Sedgewick, R. - * Algorithms, p290. - * Addison-Wesley, 1983. ISBN 0-201-06672-6. - */ - -/* @(#) $Id$ */ - -/* #define GEN_TREES_H */ - -#include "deflate.h" - -#ifdef ZLIB_DEBUG -# include <ctype.h> -#endif - -/* =========================================================================== - * Constants - */ - -#define MAX_BL_BITS 7 -/* Bit length codes must not exceed MAX_BL_BITS bits */ - -#define END_BLOCK 256 -/* end of block literal code */ - -#define REP_3_6 16 -/* repeat previous bit length 3-6 times (2 bits of repeat count) */ - -#define REPZ_3_10 17 -/* repeat a zero length 3-10 times (3 bits of repeat count) */ - -#define REPZ_11_138 18 -/* repeat a zero length 11-138 times (7 bits of repeat count) */ - -local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ - = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0}; - -local const int extra_dbits[D_CODES] /* extra bits for each distance code */ - = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; - -local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ - = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7}; - -local const uch bl_order[BL_CODES] - = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; -/* The lengths of the bit length codes are sent in order of decreasing - * probability, to avoid transmitting the lengths for unused bit length codes. - */ - -/* =========================================================================== - * Local data. These are initialized only once. - */ - -#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ - -#if defined(GEN_TREES_H) || !defined(STDC) -/* non ANSI compilers may not accept trees.h */ - -local ct_data static_ltree[L_CODES + 2]; -/* The static literal tree. Since the bit lengths are imposed, there is no - * need for the L_CODES extra codes used during heap construction. However - * The codes 286 and 287 are needed to build a canonical tree (see _tr_init - * below). - */ - -local ct_data static_dtree[D_CODES]; -/* The static distance tree. (Actually a trivial tree since all codes use - * 5 bits.) - */ - -uch _dist_code[DIST_CODE_LEN]; -/* Distance codes. The first 256 values correspond to the distances - * 3 .. 258, the last 256 values correspond to the top 8 bits of - * the 15 bit distances. - */ - -uch _length_code[MAX_MATCH - MIN_MATCH + 1]; -/* length code for each normalized match length (0 == MIN_MATCH) */ - -local int base_length[LENGTH_CODES]; -/* First normalized length for each code (0 = MIN_MATCH) */ - -local int base_dist[D_CODES]; -/* First normalized distance for each code (0 = distance of 1) */ - -#else -# include "trees.h" -#endif /* GEN_TREES_H */ - -struct static_tree_desc_s { - const ct_data *static_tree; /* static tree or NULL */ - const intf *extra_bits; /* extra bits for each code or NULL */ - int extra_base; /* base index for extra_bits */ - int elems; /* max number of elements in the tree */ - int max_length; /* max bit length for the codes */ -}; - -local const static_tree_desc static_l_desc = -{static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS}; - -local const static_tree_desc static_d_desc = -{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; - -local const static_tree_desc static_bl_desc = -{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; - -/* =========================================================================== - * Local (static) routines in this file. - */ - -local void tr_static_init OF((void)); -local void init_block OF((deflate_state *s)); -local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); -local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); -local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); -local void build_tree OF((deflate_state *s, tree_desc *desc)); -local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); -local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); -local int build_bl_tree OF((deflate_state *s)); -local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, - int blcodes)); -local void compress_block OF((deflate_state *s, const ct_data *ltree, - const ct_data *dtree)); -local int detect_data_type OF((deflate_state *s)); -local unsigned bi_reverse OF((unsigned value, int length)); -local void bi_windup OF((deflate_state *s)); -local void bi_flush OF((deflate_state *s)); - -#ifdef GEN_TREES_H -local void gen_trees_header OF((void)); -#endif - -#ifndef ZLIB_DEBUG -# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) -/* Send a code of the given tree. c and tree must not have side effects */ - -#else /* !ZLIB_DEBUG */ -# define send_code(s, c, tree) \ - { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ - send_bits(s, tree[c].Code, tree[c].Len); } -#endif - -/* =========================================================================== - * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. - */ -#define put_short(s, w) { \ - put_byte(s, (uch)((w) & 0xff)); \ - put_byte(s, (uch)((ush)(w) >> 8)); \ -} - -/* =========================================================================== - * Send a value on a given number of bits. - * IN assertion: length <= 16 and value fits in length bits. - */ -#ifdef ZLIB_DEBUG -local void send_bits OF((deflate_state *s, int value, int length)); - -local void send_bits(s, value, length) -deflate_state *s; -int value; /* value to send */ -int length; /* number of bits */ -{ - Tracevv((stderr, " l %2d v %4x ", length, value)); - Assert(length > 0 && length <= 15, "invalid length"); - s->bits_sent += (ulg)length; - - /* If not enough room in bi_buf, use (valid) bits from bi_buf and - * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) - * unused bits in value. - */ - if (s->bi_valid > (int)Buf_size - length) { - s->bi_buf |= (ush)value << s->bi_valid; - put_short(s, s->bi_buf); - s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); - s->bi_valid += length - Buf_size; - } else { - s->bi_buf |= (ush)value << s->bi_valid; - s->bi_valid += length; - } -} -#else /* !ZLIB_DEBUG */ - -#define send_bits(s, value, length) \ -{ int len = length;\ - if (s->bi_valid > (int)Buf_size - len) {\ - int val = (int)value;\ - s->bi_buf |= (ush)val << s->bi_valid;\ - put_short(s, s->bi_buf);\ - s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ - s->bi_valid += len - Buf_size;\ - } else {\ - s->bi_buf |= (ush)(value) << s->bi_valid;\ - s->bi_valid += len;\ - }\ -} -#endif /* ZLIB_DEBUG */ - - -/* the arguments must not have side effects */ - -/* =========================================================================== - * Initialize the various 'constant' tables. - */ -local void tr_static_init() { -#if defined(GEN_TREES_H) || !defined(STDC) - static int static_init_done = 0; - int n; /* iterates over tree elements */ - int bits; /* bit counter */ - int length; /* length value */ - int code; /* code value */ - int dist; /* distance index */ - ush bl_count[MAX_BITS + 1]; - /* number of codes at each bit length for an optimal tree */ - - if (static_init_done) return; - - /* For some embedded targets, global variables are not initialized: */ -#ifdef NO_INIT_GLOBAL_POINTERS - static_l_desc.static_tree = static_ltree; - static_l_desc.extra_bits = extra_lbits; - static_d_desc.static_tree = static_dtree; - static_d_desc.extra_bits = extra_dbits; - static_bl_desc.extra_bits = extra_blbits; -#endif - - /* Initialize the mapping length (0..255) -> length code (0..28) */ - length = 0; - for (code = 0; code < LENGTH_CODES - 1; code++) { - base_length[code] = length; - for (n = 0; n < (1 << extra_lbits[code]); n++) { - _length_code[length++] = (uch)code; - } - } - Assert(length == 256, "tr_static_init: length != 256"); - /* Note that the length 255 (match length 258) can be represented - * in two different ways: code 284 + 5 bits or code 285, so we - * overwrite length_code[255] to use the best encoding: - */ - _length_code[length - 1] = (uch)code; - - /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ - dist = 0; - for (code = 0 ; code < 16; code++) { - base_dist[code] = dist; - for (n = 0; n < (1 << extra_dbits[code]); n++) { - _dist_code[dist++] = (uch)code; - } - } - Assert(dist == 256, "tr_static_init: dist != 256"); - dist >>= 7; /* from now on, all distances are divided by 128 */ - for (; code < D_CODES; code++) { - base_dist[code] = dist << 7; - for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) { - _dist_code[256 + dist++] = (uch)code; - } - } - Assert(dist == 256, "tr_static_init: 256+dist != 512"); - - /* Construct the codes of the static literal tree */ - for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; - n = 0; - while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; - while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; - while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; - while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; - /* Codes 286 and 287 do not exist, but we must include them in the - * tree construction to get a canonical Huffman tree (longest code - * all ones) - */ - gen_codes((ct_data *)static_ltree, L_CODES + 1, bl_count); - - /* The static distance tree is trivial: */ - for (n = 0; n < D_CODES; n++) { - static_dtree[n].Len = 5; - static_dtree[n].Code = bi_reverse((unsigned)n, 5); - } - static_init_done = 1; - -# ifdef GEN_TREES_H - gen_trees_header(); -# endif -#endif /* defined(GEN_TREES_H) || !defined(STDC) */ -} - -/* =========================================================================== - * Genererate the file trees.h describing the static trees. - */ -#ifdef GEN_TREES_H -# ifndef ZLIB_DEBUG -# include <stdio.h> -# endif - -# define SEPARATOR(i, last, width) \ - ((i) == (last)? "\n};\n\n" : \ - ((i) % (width) == (width)-1 ? ",\n" : ", ")) - -void gen_trees_header() { - FILE *header = fopen("trees.h", "w"); - int i; - - Assert(header != NULL, "Can't open trees.h"); - fprintf(header, - "/* header created automatically with -DGEN_TREES_H */\n\n"); - - fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); - for (i = 0; i < L_CODES + 2; i++) { - fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, - static_ltree[i].Len, SEPARATOR(i, L_CODES + 1, 5)); - } - - fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); - for (i = 0; i < D_CODES; i++) { - fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, - static_dtree[i].Len, SEPARATOR(i, D_CODES - 1, 5)); - } - - fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n"); - for (i = 0; i < DIST_CODE_LEN; i++) { - fprintf(header, "%2u%s", _dist_code[i], - SEPARATOR(i, DIST_CODE_LEN - 1, 20)); - } - - fprintf(header, - "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); - for (i = 0; i < MAX_MATCH - MIN_MATCH + 1; i++) { - fprintf(header, "%2u%s", _length_code[i], - SEPARATOR(i, MAX_MATCH - MIN_MATCH, 20)); - } - - fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); - for (i = 0; i < LENGTH_CODES; i++) { - fprintf(header, "%1u%s", base_length[i], - SEPARATOR(i, LENGTH_CODES - 1, 20)); - } - - fprintf(header, "local const int base_dist[D_CODES] = {\n"); - for (i = 0; i < D_CODES; i++) { - fprintf(header, "%5u%s", base_dist[i], - SEPARATOR(i, D_CODES - 1, 10)); - } - - fclose(header); -} -#endif /* GEN_TREES_H */ - -/* =========================================================================== - * Initialize the tree data structures for a new zlib stream. - */ -void ZLIB_INTERNAL _tr_init(s) -deflate_state *s; -{ - tr_static_init(); - - s->l_desc.dyn_tree = s->dyn_ltree; - s->l_desc.stat_desc = &static_l_desc; - - s->d_desc.dyn_tree = s->dyn_dtree; - s->d_desc.stat_desc = &static_d_desc; - - s->bl_desc.dyn_tree = s->bl_tree; - s->bl_desc.stat_desc = &static_bl_desc; - - s->bi_buf = 0; - s->bi_valid = 0; -#ifdef ZLIB_DEBUG - s->compressed_len = 0L; - s->bits_sent = 0L; -#endif - - /* Initialize the first block of the first file: */ - init_block(s); -} - -/* =========================================================================== - * Initialize a new block. - */ -local void init_block(s) -deflate_state *s; -{ - int n; /* iterates over tree elements */ - - /* Initialize the trees. */ - for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; - for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; - for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; - - s->dyn_ltree[END_BLOCK].Freq = 1; - s->opt_len = s->static_len = 0L; - s->last_lit = s->matches = 0; -} - -#define SMALLEST 1 -/* Index within the heap array of least frequent node in the Huffman tree */ - - -/* =========================================================================== - * Remove the smallest element from the heap and recreate the heap with - * one less element. Updates heap and heap_len. - */ -#define pqremove(s, tree, top) \ -{\ - top = s->heap[SMALLEST]; \ - s->heap[SMALLEST] = s->heap[s->heap_len--]; \ - pqdownheap(s, tree, SMALLEST); \ -} - -/* =========================================================================== - * Compares to subtrees, using the tree depth as tie breaker when - * the subtrees have equal frequency. This minimizes the worst case length. - */ -#define smaller(tree, n, m, depth) \ - (tree[n].Freq < tree[m].Freq || \ - (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) - -/* =========================================================================== - * Restore the heap property by moving down the tree starting at node k, - * exchanging a node with the smallest of its two sons if necessary, stopping - * when the heap property is re-established (each father smaller than its - * two sons). - */ -local void pqdownheap(s, tree, k) -deflate_state *s; -ct_data *tree; /* the tree to restore */ -int k; /* node to move down */ -{ - int v = s->heap[k]; - int j = k << 1; /* left son of k */ - while (j <= s->heap_len) { - /* Set j to the smallest of the two sons: */ - if (j < s->heap_len && - smaller(tree, s->heap[j + 1], s->heap[j], s->depth)) { - j++; - } - /* Exit if v is smaller than both sons */ - if (smaller(tree, v, s->heap[j], s->depth)) break; - - /* Exchange v with the smallest son */ - s->heap[k] = s->heap[j]; - k = j; - - /* And continue down the tree, setting j to the left son of k */ - j <<= 1; - } - s->heap[k] = v; -} - -/* =========================================================================== - * Compute the optimal bit lengths for a tree and update the total bit length - * for the current block. - * IN assertion: the fields freq and dad are set, heap[heap_max] and - * above are the tree nodes sorted by increasing frequency. - * OUT assertions: the field len is set to the optimal bit length, the - * array bl_count contains the frequencies for each bit length. - * The length opt_len is updated; static_len is also updated if stree is - * not null. - */ -local void gen_bitlen(s, desc) -deflate_state *s; -tree_desc *desc; /* the tree descriptor */ -{ - ct_data *tree = desc->dyn_tree; - int max_code = desc->max_code; - const ct_data *stree = desc->stat_desc->static_tree; - const intf *extra = desc->stat_desc->extra_bits; - int base = desc->stat_desc->extra_base; - int max_length = desc->stat_desc->max_length; - int h; /* heap index */ - int n, m; /* iterate over the tree elements */ - int bits; /* bit length */ - int xbits; /* extra bits */ - ush f; /* frequency */ - int overflow = 0; /* number of elements with bit length too large */ - - for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; - - /* In a first pass, compute the optimal bit lengths (which may - * overflow in the case of the bit length tree). - */ - tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ - - for (h = s->heap_max + 1; h < HEAP_SIZE; h++) { - n = s->heap[h]; - bits = tree[tree[n].Dad].Len + 1; - if (bits > max_length) bits = max_length, overflow++; - tree[n].Len = (ush)bits; - /* We overwrite tree[n].Dad which is no longer needed */ - - if (n > max_code) continue; /* not a leaf node */ - - s->bl_count[bits]++; - xbits = 0; - if (n >= base) xbits = extra[n - base]; - f = tree[n].Freq; - s->opt_len += (ulg)f * (unsigned)(bits + xbits); - if (stree) s->static_len += (ulg)f * (unsigned)(stree[n].Len + xbits); - } - if (overflow == 0) return; - - Tracev((stderr, "\nbit length overflow\n")); - /* This happens for example on obj2 and pic of the Calgary corpus */ - - /* Find the first bit length which could increase: */ - do { - bits = max_length - 1; - while (s->bl_count[bits] == 0) bits--; - s->bl_count[bits]--; /* move one leaf down the tree */ - s->bl_count[bits + 1] += 2; /* move one overflow item as its brother */ - s->bl_count[max_length]--; - /* The brother of the overflow item also moves one step up, - * but this does not affect bl_count[max_length] - */ - overflow -= 2; - } while (overflow > 0); - - /* Now recompute all bit lengths, scanning in increasing frequency. - * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all - * lengths instead of fixing only the wrong ones. This idea is taken - * from 'ar' written by Haruhiko Okumura.) - */ - for (bits = max_length; bits != 0; bits--) { - n = s->bl_count[bits]; - while (n != 0) { - m = s->heap[--h]; - if (m > max_code) continue; - if ((unsigned) tree[m].Len != (unsigned) bits) { - Tracev((stderr, "code %d bits %d->%d\n", m, tree[m].Len, bits)); - s->opt_len += ((ulg)bits - tree[m].Len) * tree[m].Freq; - tree[m].Len = (ush)bits; - } - n--; - } - } -} - -/* =========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. - */ -local void gen_codes(tree, max_code, bl_count) -ct_data *tree; /* the tree to decorate */ -int max_code; /* largest code with non zero frequency */ -ushf *bl_count; /* number of codes at each bit length */ -{ - ush next_code[MAX_BITS + 1]; /* next code value for each bit length */ - unsigned code = 0; /* running code value */ - int bits; /* bit index */ - int n; /* code index */ - - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= MAX_BITS; bits++) { - code = (code + bl_count[bits - 1]) << 1; - next_code[bits] = (ush)code; - } - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. - */ - Assert(code + bl_count[MAX_BITS] - 1 == (1 << MAX_BITS) - 1, - "inconsistent bit counts"); - Tracev((stderr, "\ngen_codes: max_code %d ", max_code)); - - for (n = 0; n <= max_code; n++) { - int len = tree[n].Len; - if (len == 0) continue; - /* Now reverse the bits */ - tree[n].Code = (ush)bi_reverse(next_code[len]++, len); - - Tracecv(tree != static_ltree, (stderr, "\nn %3d %c l %2d c %4x (%x) ", - n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len] - 1)); - } -} - -/* =========================================================================== - * Construct one Huffman tree and assigns the code bit strings and lengths. - * Update the total bit length for the current block. - * IN assertion: the field freq is set for all tree elements. - * OUT assertions: the fields len and code are set to the optimal bit length - * and corresponding code. The length opt_len is updated; static_len is - * also updated if stree is not null. The field max_code is set. - */ -local void build_tree(s, desc) -deflate_state *s; -tree_desc *desc; /* the tree descriptor */ -{ - ct_data *tree = desc->dyn_tree; - const ct_data *stree = desc->stat_desc->static_tree; - int elems = desc->stat_desc->elems; - int n, m; /* iterate over heap elements */ - int max_code = -1; /* largest code with non zero frequency */ - int node; /* new node being created */ - - /* Construct the initial heap, with least frequent element in - * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - * heap[0] is not used. - */ - s->heap_len = 0, s->heap_max = HEAP_SIZE; - - for (n = 0; n < elems; n++) { - if (tree[n].Freq != 0) { - s->heap[++(s->heap_len)] = max_code = n; - s->depth[n] = 0; - } else { - tree[n].Len = 0; - } - } - - /* The pkzip format requires that at least one distance code exists, - * and that at least one bit should be sent even if there is only one - * possible code. So to avoid special checks later on we force at least - * two codes of non zero frequency. - */ - while (s->heap_len < 2) { - node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); - tree[node].Freq = 1; - s->depth[node] = 0; - s->opt_len--; - if (stree) s->static_len -= stree[node].Len; - /* node is 0 or 1 so it does not have extra bits */ - } - desc->max_code = max_code; - - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - * establish sub-heaps of increasing lengths: - */ - for (n = s->heap_len / 2; n >= 1; n--) pqdownheap(s, tree, n); - - /* Construct the Huffman tree by repeatedly combining the least two - * frequent nodes. - */ - node = elems; /* next internal node of the tree */ - do { - pqremove(s, tree, n); /* n = node of least frequency */ - m = s->heap[SMALLEST]; /* m = node of next least frequency */ - - s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ - s->heap[--(s->heap_max)] = m; - - /* Create a new node father of n and m */ - tree[node].Freq = tree[n].Freq + tree[m].Freq; - s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? - s->depth[n] : s->depth[m]) + 1); - tree[n].Dad = tree[m].Dad = (ush)node; -#ifdef DUMP_BL_TREE - if (tree == s->bl_tree) { - fprintf(stderr, "\nnode %d(%d), sons %d(%d) %d(%d)", - node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); - } -#endif - /* and insert the new node in the heap */ - s->heap[SMALLEST] = node++; - pqdownheap(s, tree, SMALLEST); - - } while (s->heap_len >= 2); - - s->heap[--(s->heap_max)] = s->heap[SMALLEST]; - - /* At this point, the fields freq and dad are set. We can now - * generate the bit lengths. - */ - gen_bitlen(s, (tree_desc *)desc); - - /* The field len is now set, we can generate the bit codes */ - gen_codes((ct_data *)tree, max_code, s->bl_count); -} - -/* =========================================================================== - * Scan a literal or distance tree to determine the frequencies of the codes - * in the bit length tree. - */ -local void scan_tree(s, tree, max_code) -deflate_state *s; -ct_data *tree; /* the tree to be scanned */ -int max_code; /* and its largest code of non zero frequency */ -{ - int n; /* iterates over all tree elements */ - int prevlen = -1; /* last emitted length */ - int curlen; /* length of current code */ - int nextlen = tree[0].Len; /* length of next code */ - int count = 0; /* repeat count of the current code */ - int max_count = 7; /* max repeat count */ - int min_count = 4; /* min repeat count */ - - if (nextlen == 0) max_count = 138, min_count = 3; - tree[max_code + 1].Len = (ush)0xffff; /* guard */ - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[n + 1].Len; - if (++count < max_count && curlen == nextlen) { - continue; - } else if (count < min_count) { - s->bl_tree[curlen].Freq += count; - } else if (curlen != 0) { - if (curlen != prevlen) s->bl_tree[curlen].Freq++; - s->bl_tree[REP_3_6].Freq++; - } else if (count <= 10) { - s->bl_tree[REPZ_3_10].Freq++; - } else { - s->bl_tree[REPZ_11_138].Freq++; - } - count = 0; - prevlen = curlen; - if (nextlen == 0) { - max_count = 138, min_count = 3; - } else if (curlen == nextlen) { - max_count = 6, min_count = 3; - } else { - max_count = 7, min_count = 4; - } - } -} - -/* =========================================================================== - * Send a literal or distance tree in compressed form, using the codes in - * bl_tree. - */ -local void send_tree(s, tree, max_code) -deflate_state *s; -ct_data *tree; /* the tree to be scanned */ -int max_code; /* and its largest code of non zero frequency */ -{ - int n; /* iterates over all tree elements */ - int prevlen = -1; /* last emitted length */ - int curlen; /* length of current code */ - int nextlen = tree[0].Len; /* length of next code */ - int count = 0; /* repeat count of the current code */ - int max_count = 7; /* max repeat count */ - int min_count = 4; /* min repeat count */ - - /* tree[max_code+1].Len = -1; */ /* guard already set */ - if (nextlen == 0) max_count = 138, min_count = 3; - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[n + 1].Len; - if (++count < max_count && curlen == nextlen) { - continue; - } else if (count < min_count) { - do { send_code(s, curlen, s->bl_tree); } - while (--count != 0); - - } else if (curlen != 0) { - if (curlen != prevlen) { - send_code(s, curlen, s->bl_tree); - count--; - } - Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s->bl_tree); - send_bits(s, count - 3, 2); - - } else if (count <= 10) { - send_code(s, REPZ_3_10, s->bl_tree); - send_bits(s, count - 3, 3); - - } else { - send_code(s, REPZ_11_138, s->bl_tree); - send_bits(s, count - 11, 7); - } - count = 0; - prevlen = curlen; - if (nextlen == 0) { - max_count = 138, min_count = 3; - } else if (curlen == nextlen) { - max_count = 6, min_count = 3; - } else { - max_count = 7, min_count = 4; - } - } -} - -/* =========================================================================== - * Construct the Huffman tree for the bit lengths and return the index in - * bl_order of the last bit length code to send. - */ -local int build_bl_tree(s) -deflate_state *s; -{ - int max_blindex; /* index of last bit length code of non zero freq */ - - /* Determine the bit length frequencies for literal and distance trees */ - scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); - scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); - - /* Build the bit length tree: */ - build_tree(s, (tree_desc *)(&(s->bl_desc))); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - */ - - /* Determine the number of bit length codes to send. The pkzip format - * requires that at least 4 bit length codes be sent. (appnote.txt says - * 3 but the actual value used is 4.) - */ - for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) { - if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; - } - /* Update opt_len to include the bit length tree and counts */ - s->opt_len += 3 * ((ulg)max_blindex + 1) + 5 + 5 + 4; - Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", - s->opt_len, s->static_len)); - - return max_blindex; -} - -/* =========================================================================== - * Send the header for a block using dynamic Huffman trees: the counts, the - * lengths of the bit length codes, the literal tree and the distance tree. - * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - */ -local void send_all_trees(s, lcodes, dcodes, blcodes) -deflate_state *s; -int lcodes, dcodes, blcodes; /* number of codes for each tree */ -{ - int rank; /* index in bl_order */ - - Assert(lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); - Assert(lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, - "too many codes"); - Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes - 1, 5); - send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ - for (rank = 0; rank < blcodes; rank++) { - Tracev((stderr, "\nbl code %2d ", bl_order[rank])); - send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); - } - Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); - - send_tree(s, (ct_data *)s->dyn_ltree, lcodes - 1); /* literal tree */ - Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); - - send_tree(s, (ct_data *)s->dyn_dtree, dcodes - 1); /* distance tree */ - Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); -} - -/* =========================================================================== - * Send a stored block - */ -void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) -deflate_state *s; -charf *buf; /* input block */ -ulg stored_len; /* length of input block */ -int last; /* one if this is the last block for a file */ -{ - send_bits(s, (STORED_BLOCK << 1) + last, 3); /* send block type */ - bi_windup(s); /* align on byte boundary */ - put_short(s, (ush)stored_len); - put_short(s, (ush)~stored_len); - zmemcpy(s->pending_buf + s->pending, (Bytef *)buf, stored_len); - s->pending += stored_len; -#ifdef ZLIB_DEBUG - s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; - s->compressed_len += (stored_len + 4) << 3; - s->bits_sent += 2 * 16; - s->bits_sent += stored_len << 3; -#endif -} - -/* =========================================================================== - * Flush the bits in the bit buffer to pending output (leaves at most 7 bits) - */ -void ZLIB_INTERNAL _tr_flush_bits(s) -deflate_state *s; -{ - bi_flush(s); -} - -/* =========================================================================== - * Send one empty static block to give enough lookahead for inflate. - * This takes 10 bits, of which 7 may remain in the bit buffer. - */ -void ZLIB_INTERNAL _tr_align(s) -deflate_state *s; -{ - send_bits(s, STATIC_TREES << 1, 3); - send_code(s, END_BLOCK, static_ltree); -#ifdef ZLIB_DEBUG - s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ -#endif - bi_flush(s); -} - -/* =========================================================================== - * Determine the best encoding for the current block: dynamic trees, static - * trees or store, and write out the encoded block. - */ -void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) -deflate_state *s; -charf *buf; /* input block, or NULL if too old */ -ulg stored_len; /* length of input block */ -int last; /* one if this is the last block for a file */ -{ -#ifdef ZLIB_PM3_TUNED - (void) buf; - (void) stored_len; -#endif - int max_blindex = 0; /* index of last bit length code of non zero freq */ -#ifndef ZLIB_PM3_TUNED - ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ - - /* Build the Huffman trees unless a stored block is forced */ - if (s->level > 0) { -#endif - /* Check if the file is binary or text */ - if (s->strm->data_type == Z_UNKNOWN) - s->strm->data_type = detect_data_type(s); - - /* Construct the literal and distance trees */ - build_tree(s, (tree_desc *)(&(s->l_desc))); - Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, - s->static_len)); - - build_tree(s, (tree_desc *)(&(s->d_desc))); - Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, - s->static_len)); - /* At this point, opt_len and static_len are the total bit lengths of - * the compressed block data, excluding the tree representations. - */ - - /* Build the bit length tree for the above two trees, and get the index - * in bl_order of the last bit length code to send. - */ - max_blindex = build_bl_tree(s); - -#ifndef ZLIB_PM3_TUNED - /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = (s->opt_len + 3 + 7) >> 3; - static_lenb = (s->static_len + 3 + 7) >> 3; - - Tracev((stderr, "\nopt %" PRIu32 "(%" PRIu32 ") stat %" PRIu32 "(%" PRIu32 ") stored %" PRIu32 " lit %u ", - opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - s->last_lit)); - - if (static_lenb <= opt_lenb) opt_lenb = static_lenb; - - } else { - Assert(buf != (char *)0, "lost buf"); - opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ - } - -#ifdef FORCE_STORED - if (buf != (char *)0) { /* force stored block */ -#else - if (stored_len + 4 <= opt_lenb && buf != (char *)0) { - /* 4: two words for the lengths */ -#endif - /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - * Otherwise we can't have processed more than WSIZE input bytes since - * the last block flush, because compression would have been - * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - * transform a block into a stored block. - */ - _tr_stored_block(s, buf, stored_len, last); - -#ifdef FORCE_STATIC - } else if (static_lenb >= 0) { /* force static trees */ -#else - } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { -#endif - send_bits(s, (STATIC_TREES << 1) + last, 3); - compress_block(s, (const ct_data *)static_ltree, - (const ct_data *)static_dtree); -#ifdef ZLIB_DEBUG - s->compressed_len += 3 + s->static_len; -#endif - } else { -#endif /* !ZLIB_PM3_TUNED */ - send_bits(s, (DYN_TREES << 1) + last, 3); - send_all_trees(s, s->l_desc.max_code + 1, s->d_desc.max_code + 1, - max_blindex + 1); - compress_block(s, (const ct_data *)s->dyn_ltree, - (const ct_data *)s->dyn_dtree); -#ifdef ZLIB_DEBUG - s->compressed_len += 3 + s->opt_len; -#endif -#ifndef ZLIB_PM3_TUNED - } -#endif - Assert(s->compressed_len == s->bits_sent, "bad compressed size"); - /* The above check is made mod 2^32, for files larger than 512 MB - * and uLong implemented on 32 bits. - */ - init_block(s); - - if (last) { - bi_windup(s); -#ifdef ZLIB_DEBUG - s->compressed_len += 7; /* align on byte boundary */ -#endif - } - Tracev((stderr, "\ncomprlen %lu(%lu) ", s->compressed_len >> 3, - s->compressed_len - 7 * last)); -} - -/* =========================================================================== - * Save the match info and tally the frequency counts. Return true if - * the current block must be flushed. - */ -int ZLIB_INTERNAL _tr_tally(s, dist, lc) -deflate_state *s; -unsigned dist; /* distance of matched string */ -unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ -{ - s->d_buf[s->last_lit] = (ush)dist; - s->l_buf[s->last_lit++] = (uch)lc; - if (dist == 0) { - /* lc is the unmatched char */ - s->dyn_ltree[lc].Freq++; - } else { - s->matches++; - /* Here, lc is the match length - MIN_MATCH */ - dist--; /* dist = match distance - 1 */ - Assert((ush)dist < (ush)MAX_DIST(s) && - (ush)lc <= (ush)(MAX_MATCH - MIN_MATCH) && - (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); - - s->dyn_ltree[_length_code[lc] + LITERALS + 1].Freq++; - s->dyn_dtree[d_code(dist)].Freq++; - } - -#ifdef TRUNCATE_BLOCK - /* Try to guess if it is profitable to stop the current block here */ - if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { - /* Compute an upper bound for the compressed length */ - ulg out_length = (ulg)s->last_lit * 8L; - ulg in_length = (ulg)((long)s->strstart - s->block_start); - int dcode; - for (dcode = 0; dcode < D_CODES; dcode++) { - out_length += (ulg)s->dyn_dtree[dcode].Freq * - (5L + extra_dbits[dcode]); - } - out_length >>= 3; - Tracev((stderr, "\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", - s->last_lit, in_length, out_length, - 100L - out_length * 100L / in_length)); - if (s->matches < s->last_lit / 2 && out_length < in_length / 2) return 1; - } -#endif - return (s->last_lit == s->lit_bufsize - 1); - /* We avoid equality with lit_bufsize because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ -} - -/* =========================================================================== - * Send the block data compressed using the given Huffman trees - */ -local void compress_block(s, ltree, dtree) -deflate_state *s; -const ct_data *ltree; /* literal tree */ -const ct_data *dtree; /* distance tree */ -{ - unsigned dist; /* distance of matched string */ - int lc; /* match length or unmatched char (if dist == 0) */ - unsigned lx = 0; /* running index in l_buf */ - unsigned code; /* the code to send */ - int extra; /* number of extra bits to send */ - - if (s->last_lit != 0) do { - dist = s->d_buf[lx]; - lc = s->l_buf[lx++]; - if (dist == 0) { - send_code(s, lc, ltree); /* send a literal byte */ - Tracecv(isgraph(lc), (stderr, " '%c' ", lc)); - } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code + LITERALS + 1, ltree); /* send the length code */ - extra = extra_lbits[code]; - if (extra != 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - Assert(code < D_CODES, "bad d_code"); - - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra != 0) { - dist -= (unsigned)base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ - } - } /* literal or match pair ? */ - - /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ - Assert((uInt)(s->pending) < s->lit_bufsize + 2 * lx, - "pendingBuf overflow"); - - } while (lx < s->last_lit); - - send_code(s, END_BLOCK, ltree); -} - -/* =========================================================================== - * Check if the data type is TEXT or BINARY, using the following algorithm: - * - TEXT if the two conditions below are satisfied: - * a) There are no non-portable control characters belonging to the - * "black list" (0..6, 14..25, 28..31). - * b) There is at least one printable character belonging to the - * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). - * - BINARY otherwise. - * - The following partially-portable control characters form a - * "gray list" that is ignored in this detection algorithm: - * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). - * IN assertion: the fields Freq of dyn_ltree are set. - */ -local int detect_data_type(s) -deflate_state *s; -{ - /* black_mask is the bit mask of black-listed bytes - * set bits 0..6, 14..25, and 28..31 - * 0xf3ffc07f = binary 11110011111111111100000001111111 - */ - unsigned long black_mask = 0xf3ffc07fUL; - int n; - - /* Check for non-textual ("black-listed") bytes. */ - for (n = 0; n <= 31; n++, black_mask >>= 1) - if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0)) - return Z_BINARY; - - /* Check for textual ("white-listed") bytes. */ - if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 - || s->dyn_ltree[13].Freq != 0) - return Z_TEXT; - for (n = 32; n < LITERALS; n++) - if (s->dyn_ltree[n].Freq != 0) - return Z_TEXT; - - /* There are no "black-listed" or "white-listed" bytes: - * this stream either is empty or has tolerated ("gray-listed") bytes only. - */ - return Z_BINARY; -} - -/* =========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ -local unsigned bi_reverse(code, len) -unsigned code; /* the value to invert */ -int len; /* its bit length */ -{ - register unsigned res = 0; - do { - res |= code & 1; - code >>= 1, res <<= 1; - } while (--len > 0); - return res >> 1; -} - -/* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. - */ -local void bi_flush(s) -deflate_state *s; -{ - if (s->bi_valid == 16) { - put_short(s, s->bi_buf); - s->bi_buf = 0; - s->bi_valid = 0; - } else if (s->bi_valid >= 8) { - put_byte(s, (Byte)s->bi_buf); - s->bi_buf >>= 8; - s->bi_valid -= 8; - } -} - -/* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ -local void bi_windup(s) -deflate_state *s; -{ - if (s->bi_valid > 8) { - put_short(s, s->bi_buf); - } else if (s->bi_valid > 0) { - put_byte(s, (Byte)s->bi_buf); - } - s->bi_buf = 0; - s->bi_valid = 0; -#ifdef ZLIB_DEBUG - s->bits_sent = (s->bits_sent + 7) & ~7; -#endif -} - diff --git a/common/zlib/trees.h b/common/zlib/trees.h deleted file mode 100644 index 74383d7c2..000000000 --- a/common/zlib/trees.h +++ /dev/null @@ -1,129 +0,0 @@ -/* header created automatically with -DGEN_TREES_H */ - -local const ct_data static_ltree[L_CODES + 2] = { - {{ 12}, { 8}}, {{140}, { 8}}, {{ 76}, { 8}}, {{204}, { 8}}, {{ 44}, { 8}}, - {{172}, { 8}}, {{108}, { 8}}, {{236}, { 8}}, {{ 28}, { 8}}, {{156}, { 8}}, - {{ 92}, { 8}}, {{220}, { 8}}, {{ 60}, { 8}}, {{188}, { 8}}, {{124}, { 8}}, - {{252}, { 8}}, {{ 2}, { 8}}, {{130}, { 8}}, {{ 66}, { 8}}, {{194}, { 8}}, - {{ 34}, { 8}}, {{162}, { 8}}, {{ 98}, { 8}}, {{226}, { 8}}, {{ 18}, { 8}}, - {{146}, { 8}}, {{ 82}, { 8}}, {{210}, { 8}}, {{ 50}, { 8}}, {{178}, { 8}}, - {{114}, { 8}}, {{242}, { 8}}, {{ 10}, { 8}}, {{138}, { 8}}, {{ 74}, { 8}}, - {{202}, { 8}}, {{ 42}, { 8}}, {{170}, { 8}}, {{106}, { 8}}, {{234}, { 8}}, - {{ 26}, { 8}}, {{154}, { 8}}, {{ 90}, { 8}}, {{218}, { 8}}, {{ 58}, { 8}}, - {{186}, { 8}}, {{122}, { 8}}, {{250}, { 8}}, {{ 6}, { 8}}, {{134}, { 8}}, - {{ 70}, { 8}}, {{198}, { 8}}, {{ 38}, { 8}}, {{166}, { 8}}, {{102}, { 8}}, - {{230}, { 8}}, {{ 22}, { 8}}, {{150}, { 8}}, {{ 86}, { 8}}, {{214}, { 8}}, - {{ 54}, { 8}}, {{182}, { 8}}, {{118}, { 8}}, {{246}, { 8}}, {{ 14}, { 8}}, - {{142}, { 8}}, {{ 78}, { 8}}, {{206}, { 8}}, {{ 46}, { 8}}, {{174}, { 8}}, - {{110}, { 8}}, {{238}, { 8}}, {{ 30}, { 8}}, {{158}, { 8}}, {{ 94}, { 8}}, - {{222}, { 8}}, {{ 62}, { 8}}, {{190}, { 8}}, {{126}, { 8}}, {{254}, { 8}}, - {{ 1}, { 8}}, {{129}, { 8}}, {{ 65}, { 8}}, {{193}, { 8}}, {{ 33}, { 8}}, - {{161}, { 8}}, {{ 97}, { 8}}, {{225}, { 8}}, {{ 17}, { 8}}, {{145}, { 8}}, - {{ 81}, { 8}}, {{209}, { 8}}, {{ 49}, { 8}}, {{177}, { 8}}, {{113}, { 8}}, - {{241}, { 8}}, {{ 9}, { 8}}, {{137}, { 8}}, {{ 73}, { 8}}, {{201}, { 8}}, - {{ 41}, { 8}}, {{169}, { 8}}, {{105}, { 8}}, {{233}, { 8}}, {{ 25}, { 8}}, - {{153}, { 8}}, {{ 89}, { 8}}, {{217}, { 8}}, {{ 57}, { 8}}, {{185}, { 8}}, - {{121}, { 8}}, {{249}, { 8}}, {{ 5}, { 8}}, {{133}, { 8}}, {{ 69}, { 8}}, - {{197}, { 8}}, {{ 37}, { 8}}, {{165}, { 8}}, {{101}, { 8}}, {{229}, { 8}}, - {{ 21}, { 8}}, {{149}, { 8}}, {{ 85}, { 8}}, {{213}, { 8}}, {{ 53}, { 8}}, - {{181}, { 8}}, {{117}, { 8}}, {{245}, { 8}}, {{ 13}, { 8}}, {{141}, { 8}}, - {{ 77}, { 8}}, {{205}, { 8}}, {{ 45}, { 8}}, {{173}, { 8}}, {{109}, { 8}}, - {{237}, { 8}}, {{ 29}, { 8}}, {{157}, { 8}}, {{ 93}, { 8}}, {{221}, { 8}}, - {{ 61}, { 8}}, {{189}, { 8}}, {{125}, { 8}}, {{253}, { 8}}, {{ 19}, { 9}}, - {{275}, { 9}}, {{147}, { 9}}, {{403}, { 9}}, {{ 83}, { 9}}, {{339}, { 9}}, - {{211}, { 9}}, {{467}, { 9}}, {{ 51}, { 9}}, {{307}, { 9}}, {{179}, { 9}}, - {{435}, { 9}}, {{115}, { 9}}, {{371}, { 9}}, {{243}, { 9}}, {{499}, { 9}}, - {{ 11}, { 9}}, {{267}, { 9}}, {{139}, { 9}}, {{395}, { 9}}, {{ 75}, { 9}}, - {{331}, { 9}}, {{203}, { 9}}, {{459}, { 9}}, {{ 43}, { 9}}, {{299}, { 9}}, - {{171}, { 9}}, {{427}, { 9}}, {{107}, { 9}}, {{363}, { 9}}, {{235}, { 9}}, - {{491}, { 9}}, {{ 27}, { 9}}, {{283}, { 9}}, {{155}, { 9}}, {{411}, { 9}}, - {{ 91}, { 9}}, {{347}, { 9}}, {{219}, { 9}}, {{475}, { 9}}, {{ 59}, { 9}}, - {{315}, { 9}}, {{187}, { 9}}, {{443}, { 9}}, {{123}, { 9}}, {{379}, { 9}}, - {{251}, { 9}}, {{507}, { 9}}, {{ 7}, { 9}}, {{263}, { 9}}, {{135}, { 9}}, - {{391}, { 9}}, {{ 71}, { 9}}, {{327}, { 9}}, {{199}, { 9}}, {{455}, { 9}}, - {{ 39}, { 9}}, {{295}, { 9}}, {{167}, { 9}}, {{423}, { 9}}, {{103}, { 9}}, - {{359}, { 9}}, {{231}, { 9}}, {{487}, { 9}}, {{ 23}, { 9}}, {{279}, { 9}}, - {{151}, { 9}}, {{407}, { 9}}, {{ 87}, { 9}}, {{343}, { 9}}, {{215}, { 9}}, - {{471}, { 9}}, {{ 55}, { 9}}, {{311}, { 9}}, {{183}, { 9}}, {{439}, { 9}}, - {{119}, { 9}}, {{375}, { 9}}, {{247}, { 9}}, {{503}, { 9}}, {{ 15}, { 9}}, - {{271}, { 9}}, {{143}, { 9}}, {{399}, { 9}}, {{ 79}, { 9}}, {{335}, { 9}}, - {{207}, { 9}}, {{463}, { 9}}, {{ 47}, { 9}}, {{303}, { 9}}, {{175}, { 9}}, - {{431}, { 9}}, {{111}, { 9}}, {{367}, { 9}}, {{239}, { 9}}, {{495}, { 9}}, - {{ 31}, { 9}}, {{287}, { 9}}, {{159}, { 9}}, {{415}, { 9}}, {{ 95}, { 9}}, - {{351}, { 9}}, {{223}, { 9}}, {{479}, { 9}}, {{ 63}, { 9}}, {{319}, { 9}}, - {{191}, { 9}}, {{447}, { 9}}, {{127}, { 9}}, {{383}, { 9}}, {{255}, { 9}}, - {{511}, { 9}}, {{ 0}, { 7}}, {{ 64}, { 7}}, {{ 32}, { 7}}, {{ 96}, { 7}}, - {{ 16}, { 7}}, {{ 80}, { 7}}, {{ 48}, { 7}}, {{112}, { 7}}, {{ 8}, { 7}}, - {{ 72}, { 7}}, {{ 40}, { 7}}, {{104}, { 7}}, {{ 24}, { 7}}, {{ 88}, { 7}}, - {{ 56}, { 7}}, {{120}, { 7}}, {{ 4}, { 7}}, {{ 68}, { 7}}, {{ 36}, { 7}}, - {{100}, { 7}}, {{ 20}, { 7}}, {{ 84}, { 7}}, {{ 52}, { 7}}, {{116}, { 7}}, - {{ 3}, { 8}}, {{131}, { 8}}, {{ 67}, { 8}}, {{195}, { 8}}, {{ 35}, { 8}}, - {{163}, { 8}}, {{ 99}, { 8}}, {{227}, { 8}} -}; - -local const ct_data static_dtree[D_CODES] = { - {{ 0}, { 5}}, {{16}, { 5}}, {{ 8}, { 5}}, {{24}, { 5}}, {{ 4}, { 5}}, - {{20}, { 5}}, {{12}, { 5}}, {{28}, { 5}}, {{ 2}, { 5}}, {{18}, { 5}}, - {{10}, { 5}}, {{26}, { 5}}, {{ 6}, { 5}}, {{22}, { 5}}, {{14}, { 5}}, - {{30}, { 5}}, {{ 1}, { 5}}, {{17}, { 5}}, {{ 9}, { 5}}, {{25}, { 5}}, - {{ 5}, { 5}}, {{21}, { 5}}, {{13}, { 5}}, {{29}, { 5}}, {{ 3}, { 5}}, - {{19}, { 5}}, {{11}, { 5}}, {{27}, { 5}}, {{ 7}, { 5}}, {{23}, { 5}} -}; - -const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = { - 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, - 18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, - 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 -}; - -const uch ZLIB_INTERNAL _length_code[MAX_MATCH - MIN_MATCH + 1] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, - 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, - 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, - 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 -}; - -local const int base_length[LENGTH_CODES] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, - 64, 80, 96, 112, 128, 160, 192, 224, 0 -}; - -local const int base_dist[D_CODES] = { - 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, - 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, - 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 -}; - - diff --git a/common/zlib/zconf.h b/common/zlib/zconf.h deleted file mode 100644 index 2cf63398b..000000000 --- a/common/zlib/zconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#ifndef ZCONF_H -#define ZCONF_H - -/* - * If you *really* need a unique prefix for all types and library functions, - * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. - * Even better than compiling with -DZ_PREFIX would be to use configure to set - * this permanently in zconf.h using "./configure --zprefix". - */ -#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ -# define Z_PREFIX_SET - -/* all linked symbols and init macros */ -# define _dist_code z__dist_code -# define _length_code z__length_code -# define _tr_align z__tr_align -# define _tr_flush_bits z__tr_flush_bits -# define _tr_flush_block z__tr_flush_block -# define _tr_init z__tr_init -# define _tr_stored_block z__tr_stored_block -# define _tr_tally z__tr_tally -# define adler32 z_adler32 -# define adler32_combine z_adler32_combine -# define adler32_combine64 z_adler32_combine64 -# define adler32_z z_adler32_z -# ifndef Z_SOLO -# define compress z_compress -# define compress2 z_compress2 -# define compressBound z_compressBound -# endif -# define crc32 z_crc32 -# define crc32_combine z_crc32_combine -# define crc32_combine64 z_crc32_combine64 -# define crc32_z z_crc32_z -# define deflate z_deflate -# define deflateBound z_deflateBound -# define deflateCopy z_deflateCopy -# define deflateEnd z_deflateEnd -# define deflateGetDictionary z_deflateGetDictionary -# define deflateInit z_deflateInit -# define deflateInit2 z_deflateInit2 -# define deflateInit2_ z_deflateInit2_ -# define deflateInit_ z_deflateInit_ -# define deflateParams z_deflateParams -# define deflatePending z_deflatePending -# define deflatePrime z_deflatePrime -# define deflateReset z_deflateReset -# define deflateResetKeep z_deflateResetKeep -# define deflateSetDictionary z_deflateSetDictionary -# define deflateSetHeader z_deflateSetHeader -# define deflateTune z_deflateTune -# define deflate_copyright z_deflate_copyright -# define get_crc_table z_get_crc_table -# ifndef Z_SOLO -# define gz_error z_gz_error -# define gz_intmax z_gz_intmax -# define gz_strwinerror z_gz_strwinerror -# define gzbuffer z_gzbuffer -# define gzclearerr z_gzclearerr -# define gzclose z_gzclose -# define gzclose_r z_gzclose_r -# define gzclose_w z_gzclose_w -# define gzdirect z_gzdirect -# define gzdopen z_gzdopen -# define gzeof z_gzeof -# define gzerror z_gzerror -# define gzflush z_gzflush -# define gzfread z_gzfread -# define gzfwrite z_gzfwrite -# define gzgetc z_gzgetc -# define gzgetc_ z_gzgetc_ -# define gzgets z_gzgets -# define gzoffset z_gzoffset -# define gzoffset64 z_gzoffset64 -# define gzopen z_gzopen -# define gzopen64 z_gzopen64 -# ifdef _WIN32 -# define gzopen_w z_gzopen_w -# endif -# define gzprintf z_gzprintf -# define gzputc z_gzputc -# define gzputs z_gzputs -# define gzread z_gzread -# define gzrewind z_gzrewind -# define gzseek z_gzseek -# define gzseek64 z_gzseek64 -# define gzsetparams z_gzsetparams -# define gztell z_gztell -# define gztell64 z_gztell64 -# define gzungetc z_gzungetc -# define gzvprintf z_gzvprintf -# define gzwrite z_gzwrite -# endif -# define inflate z_inflate -# define inflateBack z_inflateBack -# define inflateBackEnd z_inflateBackEnd -# define inflateBackInit z_inflateBackInit -# define inflateBackInit_ z_inflateBackInit_ -# define inflateCodesUsed z_inflateCodesUsed -# define inflateCopy z_inflateCopy -# define inflateEnd z_inflateEnd -# define inflateGetDictionary z_inflateGetDictionary -# define inflateGetHeader z_inflateGetHeader -# define inflateInit z_inflateInit -# define inflateInit2 z_inflateInit2 -# define inflateInit2_ z_inflateInit2_ -# define inflateInit_ z_inflateInit_ -# define inflateMark z_inflateMark -# define inflatePrime z_inflatePrime -# define inflateReset z_inflateReset -# define inflateReset2 z_inflateReset2 -# define inflateResetKeep z_inflateResetKeep -# define inflateSetDictionary z_inflateSetDictionary -# define inflateSync z_inflateSync -# define inflateSyncPoint z_inflateSyncPoint -# define inflateUndermine z_inflateUndermine -# define inflateValidate z_inflateValidate -# define inflate_copyright z_inflate_copyright -# define inflate_fast z_inflate_fast -# define inflate_table z_inflate_table -# ifndef Z_SOLO -# define uncompress z_uncompress -# define uncompress2 z_uncompress2 -# endif -# define zError z_zError -# ifndef Z_SOLO -# define zcalloc z_zcalloc -# define zcfree z_zcfree -# endif -# define zlibCompileFlags z_zlibCompileFlags -# define zlibVersion z_zlibVersion - -/* all zlib typedefs in zlib.h and zconf.h */ -# define Byte z_Byte -# define Bytef z_Bytef -# define alloc_func z_alloc_func -# define charf z_charf -# define free_func z_free_func -# ifndef Z_SOLO -# define gzFile z_gzFile -# endif -# define gz_header z_gz_header -# define gz_headerp z_gz_headerp -# define in_func z_in_func -# define intf z_intf -# define out_func z_out_func -# define uInt z_uInt -# define uIntf z_uIntf -# define uLong z_uLong -# define uLongf z_uLongf -# define voidp z_voidp -# define voidpc z_voidpc -# define voidpf z_voidpf - -/* all zlib structs in zlib.h and zconf.h */ -# define gz_header_s z_gz_header_s -# define internal_state z_internal_state - -#endif - -#if defined(__MSDOS__) && !defined(MSDOS) -# define MSDOS -#endif -#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) -# define OS2 -#endif -#if defined(_WINDOWS) && !defined(WINDOWS) -# define WINDOWS -#endif -#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) -# ifndef WIN32 -# define WIN32 -# endif -#endif -#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) -# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) -# ifndef SYS16BIT -# define SYS16BIT -# endif -# endif -#endif - -/* - * Compile with -DMAXSEG_64K if the alloc function cannot allocate more - * than 64k bytes at a time (needed on systems with 16-bit int). - */ -#ifdef SYS16BIT -# define MAXSEG_64K -#endif -#ifdef MSDOS -# define UNALIGNED_OK -#endif - -#ifdef __STDC_VERSION__ -# ifndef STDC -# define STDC -# endif -# if __STDC_VERSION__ >= 199901L -# ifndef STDC99 -# define STDC99 -# endif -# endif -#endif -#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) -# define STDC -#endif -#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) -# define STDC -#endif -#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) -# define STDC -#endif -#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) -# define STDC -#endif - -#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ -# define STDC -#endif - -#ifndef STDC -# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ -# define const /* note: need a more gentle solution here */ -# endif -#endif - -#if defined(ZLIB_CONST) && !defined(z_const) -# define z_const const -#else -# define z_const -#endif - -#ifdef Z_SOLO -typedef unsigned long z_size_t; -#else -# define z_longlong long long -# if defined(NO_SIZE_T) -typedef unsigned NO_SIZE_T z_size_t; -# elif defined(STDC) -# include <stddef.h> -typedef size_t z_size_t; -# else -typedef unsigned long z_size_t; -# endif -# undef z_longlong -#endif - -/* Maximum value for memLevel in deflateInit2 */ -#ifndef MAX_MEM_LEVEL -# ifdef MAXSEG_64K -# define MAX_MEM_LEVEL 8 -# else -# define MAX_MEM_LEVEL 9 -# endif -#endif - -/* Maximum value for windowBits in deflateInit2 and inflateInit2. - * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files - * created by gzip. (Files created by minigzip can still be extracted by - * gzip.) - */ -#ifndef MAX_WBITS -# define MAX_WBITS 15 /* 32K LZ77 window */ -#endif - -/* The memory requirements for deflate are (in bytes): - (1 << (windowBits+2)) + (1 << (memLevel+9)) - that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) - plus a few kilobytes for small objects. For example, if you want to reduce - the default memory requirements from 256K to 128K, compile with - make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" - Of course this will generally degrade compression (there's no free lunch). - - The memory requirements for inflate are (in bytes) 1 << windowBits - that is, 32K for windowBits=15 (default value) plus about 7 kilobytes - for small objects. -*/ - -/* Type declarations */ - -#ifndef OF /* function prototypes */ -# ifdef STDC -# define OF(args) args -# else -# define OF(args) () -# endif -#endif - -#ifndef Z_ARG /* function prototypes for stdarg */ -# if defined(STDC) || defined(Z_HAVE_STDARG_H) -# define Z_ARG(args) args -# else -# define Z_ARG(args) () -# endif -#endif - -/* The following definitions for FAR are needed only for MSDOS mixed - * model programming (small or medium model with some far allocations). - * This was tested only with MSC; for other MSDOS compilers you may have - * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, - * just define FAR to be empty. - */ -#ifdef SYS16BIT -# if defined(M_I86SM) || defined(M_I86MM) -/* MSC small or medium model */ -# define SMALL_MEDIUM -# ifdef _MSC_VER -# define FAR _far -# else -# define FAR far -# endif -# endif -# if (defined(__SMALL__) || defined(__MEDIUM__)) -/* Turbo C small or medium model */ -# define SMALL_MEDIUM -# ifdef __BORLANDC__ -# define FAR _far -# else -# define FAR far -# endif -# endif -#endif - -#if defined(WINDOWS) || defined(WIN32) -/* If building or using zlib as a DLL, define ZLIB_DLL. - * This is not mandatory, but it offers a little performance increase. - */ -# ifdef ZLIB_DLL -# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) -# ifdef ZLIB_INTERNAL -# define ZEXTERN extern __declspec(dllexport) -# else -# define ZEXTERN extern __declspec(dllimport) -# endif -# endif -# endif /* ZLIB_DLL */ -/* If building or using zlib with the WINAPI/WINAPIV calling convention, - * define ZLIB_WINAPI. - * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. - */ -# ifdef ZLIB_WINAPI -# ifdef FAR -# undef FAR -# endif -# include <windows.h> -/* No need for _export, use ZLIB.DEF instead. */ -/* For complete Windows compatibility, use WINAPI, not __stdcall. */ -# define ZEXPORT WINAPI -# ifdef WIN32 -# define ZEXPORTVA WINAPIV -# else -# define ZEXPORTVA FAR CDECL -# endif -# endif -#endif - -#if defined (__BEOS__) -# ifdef ZLIB_DLL -# ifdef ZLIB_INTERNAL -# define ZEXPORT __declspec(dllexport) -# define ZEXPORTVA __declspec(dllexport) -# else -# define ZEXPORT __declspec(dllimport) -# define ZEXPORTVA __declspec(dllimport) -# endif -# endif -#endif - -#ifndef ZEXTERN -# define ZEXTERN extern -#endif -#ifndef ZEXPORT -# define ZEXPORT -#endif -#ifndef ZEXPORTVA -# define ZEXPORTVA -#endif - -#ifndef FAR -# define FAR -#endif - -#if !defined(__MACTYPES__) -typedef unsigned char Byte; /* 8 bits */ -#endif -typedef unsigned int uInt; /* 16 bits or more */ -typedef unsigned long uLong; /* 32 bits or more */ - -#ifdef SMALL_MEDIUM -/* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ -# define Bytef Byte FAR -#else -typedef Byte FAR Bytef; -#endif -typedef char FAR charf; -typedef int FAR intf; -typedef uInt FAR uIntf; -typedef uLong FAR uLongf; - -#ifdef STDC -typedef void const *voidpc; -typedef void FAR *voidpf; -typedef void *voidp; -#else -typedef Byte const *voidpc; -typedef Byte FAR *voidpf; -typedef Byte *voidp; -#endif - -#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) -# include <limits.h> -# if (UINT_MAX == 0xffffffffUL) -# define Z_U4 unsigned -# elif (ULONG_MAX == 0xffffffffUL) -# define Z_U4 unsigned long -# elif (USHRT_MAX == 0xffffffffUL) -# define Z_U4 unsigned short -# endif -#endif - -#ifdef Z_U4 -typedef Z_U4 z_crc_t; -#else -typedef unsigned long z_crc_t; -#endif - -#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ -# define Z_HAVE_UNISTD_H -#endif - -#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ -# define Z_HAVE_STDARG_H -#endif - -#ifdef STDC -# ifndef Z_SOLO -# include <sys/types.h> /* for off_t */ -# endif -#endif - -#if defined(STDC) || defined(Z_HAVE_STDARG_H) -# ifndef Z_SOLO -# include <stdarg.h> /* for va_list */ -# endif -#endif - -#ifdef _WIN32 -# ifndef Z_SOLO -# include <stddef.h> /* for wchar_t */ -# endif -#endif - -/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and - * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even - * though the former does not conform to the LFS document), but considering - * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as - * equivalently requesting no 64-bit operations - */ -#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 -# undef _LARGEFILE64_SOURCE -#endif - -#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) -# define Z_HAVE_UNISTD_H -#endif -#ifndef Z_SOLO -# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) -# include <unistd.h> /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ -# ifdef VMS -# include <unixio.h> /* for off_t */ -# endif -# ifndef z_off_t -# define z_off_t off_t -# endif -# endif -#endif - -#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 -# define Z_LFS64 -#endif - -#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) -# define Z_LARGE64 -#endif - -#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) -# define Z_WANT64 -#endif - -#if !defined(SEEK_SET) && !defined(Z_SOLO) -# define SEEK_SET 0 /* Seek from beginning of file. */ -# define SEEK_CUR 1 /* Seek from current position. */ -# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ -#endif - -#ifndef z_off_t -# define z_off_t long -#endif - -#if !defined(_WIN32) && defined(Z_LARGE64) -# define z_off64_t off64_t -#else -# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) -# define z_off64_t __int64 -# else -# define z_off64_t z_off_t -# endif -#endif - -/* MVS linker does not support external names larger than 8 bytes */ -#if defined(__MVS__) -#pragma map(deflateInit_,"DEIN") -#pragma map(deflateInit2_,"DEIN2") -#pragma map(deflateEnd,"DEEND") -#pragma map(deflateBound,"DEBND") -#pragma map(inflateInit_,"ININ") -#pragma map(inflateInit2_,"ININ2") -#pragma map(inflateEnd,"INEND") -#pragma map(inflateSync,"INSY") -#pragma map(inflateSetDictionary,"INSEDI") -#pragma map(compressBound,"CMBND") -#pragma map(inflate_table,"INTABL") -#pragma map(inflate_fast,"INFA") -#pragma map(inflate_copyright,"INCOPY") -#endif - -#endif /* ZCONF_H */ - diff --git a/common/zlib/zlib.h b/common/zlib/zlib.h deleted file mode 100644 index ca35828f0..000000000 --- a/common/zlib/zlib.h +++ /dev/null @@ -1,1924 +0,0 @@ -/* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.11, January 15th, 2017 - - Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 - (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). -*/ - -#ifndef ZLIB_H -#define ZLIB_H - -#include "zconf.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef ZLIB_PM3_TUNED -#define ZLIB_VERSION "1.2.11" -#define ZLIB_VERNUM 0x12b0 -#define ZLIB_VER_MAJOR 1 -#define ZLIB_VER_MINOR 2 -#define ZLIB_VER_REVISION 11 -#define ZLIB_VER_SUBREVISION 0 -#else -#define ZLIB_VERSION "1.2.11.f-Proxmark3" -#define ZLIB_VERNUM 0x12bf -#define ZLIB_VER_MAJOR 1 -#define ZLIB_VER_MINOR 2 -#define ZLIB_VER_REVISION 11 -#define ZLIB_VER_SUBREVISION f -#endif - - - -/* - The 'zlib' compression library provides in-memory compression and - decompression functions, including integrity checks of the uncompressed data. - This version of the library supports only one compression method (deflation) - but other algorithms will be added later and will have the same stream - interface. - - Compression can be done in a single step if the buffers are large enough, - or can be done by repeated calls of the compression function. In the latter - case, the application must provide more input and/or consume the output - (providing more output space) before each call. - - The compressed data format used by default by the in-memory functions is - the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped - around a deflate stream, which is itself documented in RFC 1951. - - The library also supports reading and writing files in gzip (.gz) format - with an interface similar to that of stdio using the functions that start - with "gz". The gzip format is different from the zlib format. gzip is a - gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. - - This library can optionally read and write gzip and raw deflate streams in - memory as well. - - The zlib format was designed to be compact and fast for use in memory - and on communications channels. The gzip format was designed for single- - file compression on file systems, has a larger header than zlib to maintain - directory information, and uses a different, slower check method than zlib. - - The library does not install any signal handler. The decoder checks - the consistency of the compressed data, so the library should never crash - even in the case of corrupted input. -*/ - -typedef voidpf(*alloc_func) OF((voidpf opaque, uInt items, uInt size)); -typedef void (*free_func) OF((voidpf opaque, voidpf address)); - -struct internal_state; - -typedef struct z_stream_s { - z_const Bytef *next_in; /* next input byte */ - uInt avail_in; /* number of bytes available at next_in */ - uLong total_in; /* total number of input bytes read so far */ - - Bytef *next_out; /* next output byte will go here */ - uInt avail_out; /* remaining free space at next_out */ - uLong total_out; /* total number of bytes output so far */ - - z_const char *msg; /* last error message, NULL if no error */ - struct internal_state FAR *state; /* not visible by applications */ - - alloc_func zalloc; /* used to allocate the internal state */ - free_func zfree; /* used to free the internal state */ - voidpf opaque; /* private data object passed to zalloc and zfree */ - - int data_type; /* best guess about the data type: binary or text - for deflate, or the decoding state for inflate */ - uLong adler; /* Adler-32 or CRC-32 value of the uncompressed data */ - uLong reserved; /* reserved for future use */ -} z_stream; - -typedef z_stream FAR *z_streamp; - -/* - gzip header information passed to and from zlib routines. See RFC 1952 - for more details on the meanings of these fields. -*/ -typedef struct gz_header_s { - int text; /* true if compressed data believed to be text */ - uLong time; /* modification time */ - int xflags; /* extra flags (not used when writing a gzip file) */ - int os; /* operating system */ - Bytef *extra; /* pointer to extra field or Z_NULL if none */ - uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ - uInt extra_max; /* space at extra (only when reading header) */ - Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ - uInt name_max; /* space at name (only when reading header) */ - Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ - uInt comm_max; /* space at comment (only when reading header) */ - int hcrc; /* true if there was or will be a header crc */ - int done; /* true when done reading gzip header (not used - when writing a gzip file) */ -} gz_header; - -typedef gz_header FAR *gz_headerp; - -/* - The application must update next_in and avail_in when avail_in has dropped - to zero. It must update next_out and avail_out when avail_out has dropped - to zero. The application must initialize zalloc, zfree and opaque before - calling the init function. All other fields are set by the compression - library and must not be updated by the application. - - The opaque value provided by the application will be passed as the first - parameter for calls of zalloc and zfree. This can be useful for custom - memory management. The compression library attaches no meaning to the - opaque value. - - zalloc must return Z_NULL if there is not enough memory for the object. - If zlib is used in a multi-threaded application, zalloc and zfree must be - thread safe. In that case, zlib is thread-safe. When zalloc and zfree are - Z_NULL on entry to the initialization function, they are set to internal - routines that use the standard library functions malloc() and free(). - - On 16-bit systems, the functions zalloc and zfree must be able to allocate - exactly 65536 bytes, but will not be required to allocate more than this if - the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers - returned by zalloc for objects of exactly 65536 bytes *must* have their - offset normalized to zero. The default allocation function provided by this - library ensures this (see zutil.c). To reduce memory requirements and avoid - any allocation of 64K objects, at the expense of compression ratio, compile - the library with -DMAX_WBITS=14 (see zconf.h). - - The fields total_in and total_out can be used for statistics or progress - reports. After compression, total_in holds the total size of the - uncompressed data and may be saved for use by the decompressor (particularly - if the decompressor wants to decompress everything in a single step). -*/ - -/* constants */ - -#define Z_NO_FLUSH 0 -#define Z_PARTIAL_FLUSH 1 -#define Z_SYNC_FLUSH 2 -#define Z_FULL_FLUSH 3 -#define Z_FINISH 4 -#define Z_BLOCK 5 -#define Z_TREES 6 -/* Allowed flush values; see deflate() and inflate() below for details */ - -#define Z_OK 0 -#define Z_STREAM_END 1 -#define Z_NEED_DICT 2 -#define Z_ERRNO (-1) -#define Z_STREAM_ERROR (-2) -#define Z_DATA_ERROR (-3) -#define Z_MEM_ERROR (-4) -#define Z_BUF_ERROR (-5) -#define Z_VERSION_ERROR (-6) -/* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ - -#define Z_NO_COMPRESSION 0 -#define Z_BEST_SPEED 1 -#define Z_BEST_COMPRESSION 9 -#define Z_DEFAULT_COMPRESSION (-1) -/* compression levels */ - -#define Z_FILTERED 1 -#define Z_HUFFMAN_ONLY 2 -#define Z_RLE 3 -#define Z_FIXED 4 -#define Z_DEFAULT_STRATEGY 0 -/* compression strategy; see deflateInit2() below for details */ - -#define Z_BINARY 0 -#define Z_TEXT 1 -#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ -#define Z_UNKNOWN 2 -/* Possible values of the data_type field for deflate() */ - -#define Z_DEFLATED 8 -/* The deflate compression method (the only one supported in this version) */ - -#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ - -#define zlib_version zlibVersion() -/* for compatibility with versions < 1.0.2 */ - - -/* basic functions */ - -ZEXTERN const char *ZEXPORT zlibVersion OF((void)); -/* The application can compare zlibVersion and ZLIB_VERSION for consistency. - If the first character differs, the library code actually used is not - compatible with the zlib.h header file used by the application. This check - is automatically made by deflateInit and inflateInit. - */ - -/* -ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); - - Initializes the internal stream state for compression. The fields - zalloc, zfree and opaque must be initialized before by the caller. If - zalloc and zfree are set to Z_NULL, deflateInit updates them to use default - allocation functions. - - The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: - 1 gives best speed, 9 gives best compression, 0 gives no compression at all - (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION - requests a default compromise between speed and compression (currently - equivalent to level 6). - - deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if level is not a valid compression level, or - Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible - with the version assumed by the caller (ZLIB_VERSION). msg is set to null - if there is no error message. deflateInit does not perform any compression: - this will be done by deflate(). -*/ - - -ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); -/* - deflate compresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce - some output latency (reading input without producing any output) except when - forced to flush. - - The detailed semantics are as follows. deflate performs one or both of the - following actions: - - - Compress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in and avail_in are updated and - processing will resume at this point for the next call of deflate(). - - - Generate more output starting at next_out and update next_out and avail_out - accordingly. This action is forced if the parameter flush is non zero. - Forcing flush frequently degrades the compression ratio, so this parameter - should be set only when necessary. Some output may be provided even if - flush is zero. - - Before the call of deflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming more - output, and updating avail_in or avail_out accordingly; avail_out should - never be zero before the call. The application can consume the compressed - output when it wants, for example when the output buffer is full (avail_out - == 0), or after each call of deflate(). If deflate returns Z_OK and with - zero avail_out, it must be called again after making room in the output - buffer because there might be more output pending. See deflatePending(), - which can be used if desired to determine whether or not there is more ouput - in that case. - - Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to - decide how much data to accumulate before producing output, in order to - maximize compression. - - If the parameter flush is set to Z_SYNC_FLUSH, all pending output is - flushed to the output buffer and the output is aligned on a byte boundary, so - that the decompressor can get all input data available so far. (In - particular avail_in is zero after the call if enough output space has been - provided before the call.) Flushing may degrade compression for some - compression algorithms and so it should be used only when necessary. This - completes the current deflate block and follows it with an empty stored block - that is three bits plus filler bits to the next byte, followed by four bytes - (00 00 ff ff). - - If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the - output buffer, but the output is not aligned to a byte boundary. All of the - input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. - This completes the current deflate block and follows it with an empty fixed - codes block that is 10 bits long. This assures that enough bytes are output - in order for the decompressor to finish the block before the empty fixed - codes block. - - If flush is set to Z_BLOCK, a deflate block is completed and emitted, as - for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to - seven bits of the current block are held to be written as the next byte after - the next deflate block is completed. In this case, the decompressor may not - be provided enough bits at this point in order to complete decompression of - the data provided so far to the compressor. It may need to wait for the next - block to be emitted. This is for advanced applications that need to control - the emission of deflate blocks. - - If flush is set to Z_FULL_FLUSH, all output is flushed as with - Z_SYNC_FLUSH, and the compression state is reset so that decompression can - restart from this point if previous compressed data has been damaged or if - random access is desired. Using Z_FULL_FLUSH too often can seriously degrade - compression. - - If deflate returns with avail_out == 0, this function must be called again - with the same value of the flush parameter and more output space (updated - avail_out), until the flush is complete (deflate returns with non-zero - avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that - avail_out is greater than six to avoid repeated flush markers due to - avail_out == 0 on return. - - If the parameter flush is set to Z_FINISH, pending input is processed, - pending output is flushed and deflate returns with Z_STREAM_END if there was - enough output space. If deflate returns with Z_OK or Z_BUF_ERROR, this - function must be called again with Z_FINISH and more output space (updated - avail_out) but no more input data, until it returns with Z_STREAM_END or an - error. After deflate has returned Z_STREAM_END, the only possible operations - on the stream are deflateReset or deflateEnd. - - Z_FINISH can be used in the first deflate call after deflateInit if all the - compression is to be done in a single step. In order to complete in one - call, avail_out must be at least the value returned by deflateBound (see - below). Then deflate is guaranteed to return Z_STREAM_END. If not enough - output space is provided, deflate will not return Z_STREAM_END, and it must - be called again as described above. - - deflate() sets strm->adler to the Adler-32 checksum of all input read - so far (that is, total_in bytes). If a gzip stream is being generated, then - strm->adler will be the CRC-32 checksum of the input read so far. (See - deflateInit2 below.) - - deflate() may update strm->data_type if it can make a good guess about - the input data type (Z_BINARY or Z_TEXT). If in doubt, the data is - considered binary. This field is only for information purposes and does not - affect the compression algorithm in any manner. - - deflate() returns Z_OK if some progress has been made (more input - processed or more output produced), Z_STREAM_END if all input has been - consumed and all output has been produced (only when flush is set to - Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example - if next_in or next_out was Z_NULL or the state was inadvertently written over - by the application), or Z_BUF_ERROR if no progress is possible (for example - avail_in or avail_out was zero). Note that Z_BUF_ERROR is not fatal, and - deflate() can be called again with more input and more output space to - continue compressing. -*/ - - -ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any pending - output. - - deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the - stream state was inconsistent, Z_DATA_ERROR if the stream was freed - prematurely (some input or output was discarded). In the error case, msg - may be set but then points to a static string (which must not be - deallocated). -*/ - - -/* -ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); - - Initializes the internal stream state for decompression. The fields - next_in, avail_in, zalloc, zfree and opaque must be initialized before by - the caller. In the current version of inflate, the provided input is not - read or consumed. The allocation of a sliding window will be deferred to - the first call of inflate (if the decompression does not complete on the - first call). If zalloc and zfree are set to Z_NULL, inflateInit updates - them to use default allocation functions. - - inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_VERSION_ERROR if the zlib library version is incompatible with the - version assumed by the caller, or Z_STREAM_ERROR if the parameters are - invalid, such as a null pointer to the structure. msg is set to null if - there is no error message. inflateInit does not perform any decompression. - Actual decompression will be done by inflate(). So next_in, and avail_in, - next_out, and avail_out are unused and unchanged. The current - implementation of inflateInit() does not process any header information -- - that is deferred until inflate() is called. -*/ - - -ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); -/* - inflate decompresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce - some output latency (reading input without producing any output) except when - forced to flush. - - The detailed semantics are as follows. inflate performs one or both of the - following actions: - - - Decompress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), then next_in and avail_in are updated - accordingly, and processing will resume at this point for the next call of - inflate(). - - - Generate more output starting at next_out and update next_out and avail_out - accordingly. inflate() provides as much output as possible, until there is - no more input data or no more space in the output buffer (see below about - the flush parameter). - - Before the call of inflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming more - output, and updating the next_* and avail_* values accordingly. If the - caller of inflate() does not provide both available input and available - output space, it is possible that there will be no progress made. The - application can consume the uncompressed output when it wants, for example - when the output buffer is full (avail_out == 0), or after each call of - inflate(). If inflate returns Z_OK and with zero avail_out, it must be - called again after making room in the output buffer because there might be - more output pending. - - The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, - Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much - output as possible to the output buffer. Z_BLOCK requests that inflate() - stop if and when it gets to the next deflate block boundary. When decoding - the zlib or gzip format, this will cause inflate() to return immediately - after the header and before the first block. When doing a raw inflate, - inflate() will go ahead and process the first block, and will return when it - gets to the end of that block, or when it runs out of data. - - The Z_BLOCK option assists in appending to or combining deflate streams. - To assist in this, on return inflate() always sets strm->data_type to the - number of unused bits in the last byte taken from strm->next_in, plus 64 if - inflate() is currently decoding the last block in the deflate stream, plus - 128 if inflate() returned immediately after decoding an end-of-block code or - decoding the complete header up to just before the first byte of the deflate - stream. The end-of-block will not be indicated until all of the uncompressed - data from that block has been written to strm->next_out. The number of - unused bits may in general be greater than seven, except when bit 7 of - data_type is set, in which case the number of unused bits will be less than - eight. data_type is set as noted here every time inflate() returns for all - flush options, and so can be used to determine the amount of currently - consumed input in bits. - - The Z_TREES option behaves as Z_BLOCK does, but it also returns when the - end of each deflate block header is reached, before any actual data in that - block is decoded. This allows the caller to determine the length of the - deflate block header for later use in random access within a deflate block. - 256 is added to the value of strm->data_type when inflate() returns - immediately after reaching the end of the deflate block header. - - inflate() should normally be called until it returns Z_STREAM_END or an - error. However if all decompression is to be performed in a single step (a - single call of inflate), the parameter flush should be set to Z_FINISH. In - this case all pending input is processed and all pending output is flushed; - avail_out must be large enough to hold all of the uncompressed data for the - operation to complete. (The size of the uncompressed data may have been - saved by the compressor for this purpose.) The use of Z_FINISH is not - required to perform an inflation in one step. However it may be used to - inform inflate that a faster approach can be used for the single inflate() - call. Z_FINISH also informs inflate to not maintain a sliding window if the - stream completes, which reduces inflate's memory footprint. If the stream - does not complete, either because not all of the stream is provided or not - enough output space is provided, then a sliding window will be allocated and - inflate() can be called again to continue the operation as if Z_NO_FLUSH had - been used. - - In this implementation, inflate() always flushes as much output as - possible to the output buffer, and always uses the faster approach on the - first call. So the effects of the flush parameter in this implementation are - on the return value of inflate() as noted below, when inflate() returns early - when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of - memory for a sliding window when Z_FINISH is used. - - If a preset dictionary is needed after this call (see inflateSetDictionary - below), inflate sets strm->adler to the Adler-32 checksum of the dictionary - chosen by the compressor and returns Z_NEED_DICT; otherwise it sets - strm->adler to the Adler-32 checksum of all output produced so far (that is, - total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described - below. At the end of the stream, inflate() checks that its computed Adler-32 - checksum is equal to that saved by the compressor and returns Z_STREAM_END - only if the checksum is correct. - - inflate() can decompress and check either zlib-wrapped or gzip-wrapped - deflate data. The header type is detected automatically, if requested when - initializing with inflateInit2(). Any information contained in the gzip - header is not retained unless inflateGetHeader() is used. When processing - gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output - produced so far. The CRC-32 is checked against the gzip trailer, as is the - uncompressed length, modulo 2^32. - - inflate() returns Z_OK if some progress has been made (more input processed - or more output produced), Z_STREAM_END if the end of the compressed data has - been reached and all uncompressed output has been produced, Z_NEED_DICT if a - preset dictionary is needed at this point, Z_DATA_ERROR if the input data was - corrupted (input stream not conforming to the zlib format or incorrect check - value, in which case strm->msg points to a string with a more specific - error), Z_STREAM_ERROR if the stream structure was inconsistent (for example - next_in or next_out was Z_NULL, or the state was inadvertently written over - by the application), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR - if no progress was possible or if there was not enough room in the output - buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and - inflate() can be called again with more input and more output space to - continue decompressing. If Z_DATA_ERROR is returned, the application may - then call inflateSync() to look for a good compression block if a partial - recovery of the data is to be attempted. -*/ - - -ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any pending - output. - - inflateEnd returns Z_OK if success, or Z_STREAM_ERROR if the stream state - was inconsistent. -*/ - - -/* Advanced functions */ - -/* - The following functions are needed only in some special applications. -*/ - -/* -ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, - int level, - int method, - int windowBits, - int memLevel, - int strategy)); - - This is another version of deflateInit with more compression options. The - fields next_in, zalloc, zfree and opaque must be initialized before by the - caller. - - The method parameter is the compression method. It must be Z_DEFLATED in - this version of the library. - - The windowBits parameter is the base two logarithm of the window size - (the size of the history buffer). It should be in the range 8..15 for this - version of the library. Larger values of this parameter result in better - compression at the expense of memory usage. The default value is 15 if - deflateInit is used instead. - - For the current implementation of deflate(), a windowBits value of 8 (a - window size of 256 bytes) is not supported. As a result, a request for 8 - will result in 9 (a 512-byte window). In that case, providing 8 to - inflateInit2() will result in an error when the zlib header with 9 is - checked against the initialization of inflate(). The remedy is to not use 8 - with deflateInit2() with this initialization, or at least in that case use 9 - with inflateInit2(). - - windowBits can also be -8..-15 for raw deflate. In this case, -windowBits - determines the window size. deflate() will then generate raw deflate data - with no zlib header or trailer, and will not compute a check value. - - windowBits can also be greater than 15 for optional gzip encoding. Add - 16 to windowBits to write a simple gzip header and trailer around the - compressed data instead of a zlib wrapper. The gzip header will have no - file name, no extra data, no comment, no modification time (set to zero), no - header crc, and the operating system will be set to the appropriate value, - if the operating system was determined at compile time. If a gzip stream is - being written, strm->adler is a CRC-32 instead of an Adler-32. - - For raw deflate or gzip encoding, a request for a 256-byte window is - rejected as invalid, since only the zlib header provides a means of - transmitting the window size to the decompressor. - - The memLevel parameter specifies how much memory should be allocated - for the internal compression state. memLevel=1 uses minimum memory but is - slow and reduces compression ratio; memLevel=9 uses maximum memory for - optimal speed. The default value is 8. See zconf.h for total memory usage - as a function of windowBits and memLevel. - - The strategy parameter is used to tune the compression algorithm. Use the - value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a - filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no - string match), or Z_RLE to limit match distances to one (run-length - encoding). Filtered data consists mostly of small values with a somewhat - random distribution. In this case, the compression algorithm is tuned to - compress them better. The effect of Z_FILTERED is to force more Huffman - coding and less string matching; it is somewhat intermediate between - Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as - fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The - strategy parameter only affects the compression ratio but not the - correctness of the compressed output even if it is not set appropriately. - Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler - decoder for special applications. - - deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid - method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is - incompatible with the version assumed by the caller (ZLIB_VERSION). msg is - set to null if there is no error message. deflateInit2 does not perform any - compression: this will be done by deflate(). -*/ - -ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the compression dictionary from the given byte sequence - without producing any compressed output. When using the zlib format, this - function must be called immediately after deflateInit, deflateInit2 or - deflateReset, and before any call of deflate. When doing raw deflate, this - function must be called either before any call of deflate, or immediately - after the completion of a deflate block, i.e. after all input has been - consumed and all output has been delivered when using any of the flush - options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The - compressor and decompressor must use exactly the same dictionary (see - inflateSetDictionary). - - The dictionary should consist of strings (byte sequences) that are likely - to be encountered later in the data to be compressed, with the most commonly - used strings preferably put towards the end of the dictionary. Using a - dictionary is most useful when the data to be compressed is short and can be - predicted with good accuracy; the data can then be compressed better than - with the default empty dictionary. - - Depending on the size of the compression data structures selected by - deflateInit or deflateInit2, a part of the dictionary may in effect be - discarded, for example if the dictionary is larger than the window size - provided in deflateInit or deflateInit2. Thus the strings most likely to be - useful should be put at the end of the dictionary, not at the front. In - addition, the current implementation of deflate will use at most the window - size minus 262 bytes of the provided dictionary. - - Upon return of this function, strm->adler is set to the Adler-32 value - of the dictionary; the decompressor may later use this value to determine - which dictionary has been used by the compressor. (The Adler-32 value - applies to the whole dictionary even if only a subset of the dictionary is - actually used by the compressor.) If a raw deflate was requested, then the - Adler-32 value is not computed and strm->adler is not set. - - deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a - parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is - inconsistent (for example if deflate has already been called for this stream - or if not at a block boundary for raw deflate). deflateSetDictionary does - not perform any compression: this will be done by deflate(). -*/ - -ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm, - Bytef *dictionary, - uInt *dictLength)); -/* - Returns the sliding dictionary being maintained by deflate. dictLength is - set to the number of bytes in the dictionary, and that many bytes are copied - to dictionary. dictionary must have enough space, where 32768 bytes is - always enough. If deflateGetDictionary() is called with dictionary equal to - Z_NULL, then only the dictionary length is returned, and nothing is copied. - Similary, if dictLength is Z_NULL, then it is not set. - - deflateGetDictionary() may return a length less than the window size, even - when more than the window size in input has been provided. It may return up - to 258 bytes less in that case, due to how zlib's implementation of deflate - manages the sliding window and lookahead for matches, where matches can be - up to 258 bytes long. If the application needs the last window-size bytes of - input, then that would need to be saved by the application outside of zlib. - - deflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the - stream state is inconsistent. -*/ - -ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, - z_streamp source)); -/* - Sets the destination stream as a complete copy of the source stream. - - This function can be useful when several compression strategies will be - tried, for example when there are several ways of pre-processing the input - data with a filter. The streams that will be discarded should then be freed - by calling deflateEnd. Note that deflateCopy duplicates the internal - compression state which can be quite large, so this strategy is slow and can - consume lots of memory. - - deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being Z_NULL). msg is left unchanged in both source and - destination. -*/ - -ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); -/* - This function is equivalent to deflateEnd followed by deflateInit, but - does not free and reallocate the internal compression state. The stream - will leave the compression level and any other attributes that may have been - set unchanged. - - deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being Z_NULL). -*/ - -ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, - int level, - int strategy)); -/* - Dynamically update the compression level and compression strategy. The - interpretation of level and strategy is as in deflateInit2(). This can be - used to switch between compression and straight copy of the input data, or - to switch to a different kind of input data requiring a different strategy. - If the compression approach (which is a function of the level) or the - strategy is changed, and if any input has been consumed in a previous - deflate() call, then the input available so far is compressed with the old - level and strategy using deflate(strm, Z_BLOCK). There are three approaches - for the compression levels 0, 1..3, and 4..9 respectively. The new level - and strategy will take effect at the next call of deflate(). - - If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does - not have enough output space to complete, then the parameter change will not - take effect. In this case, deflateParams() can be called again with the - same parameters and more output space to try again. - - In order to assure a change in the parameters on the first try, the - deflate stream should be flushed using deflate() with Z_BLOCK or other flush - request until strm.avail_out is not zero, before calling deflateParams(). - Then no more input data should be provided before the deflateParams() call. - If this is done, the old level and strategy will be applied to the data - compressed before deflateParams(), and the new level and strategy will be - applied to the the data compressed after deflateParams(). - - deflateParams returns Z_OK on success, Z_STREAM_ERROR if the source stream - state was inconsistent or if a parameter was invalid, or Z_BUF_ERROR if - there was not enough output space to complete the compression of the - available input data before a change in the strategy or approach. Note that - in the case of a Z_BUF_ERROR, the parameters are not changed. A return - value of Z_BUF_ERROR is not fatal, in which case deflateParams() can be - retried with more output space. -*/ - -ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, - int good_length, - int max_lazy, - int nice_length, - int max_chain)); -/* - Fine tune deflate's internal compression parameters. This should only be - used by someone who understands the algorithm used by zlib's deflate for - searching for the best matching string, and even then only by the most - fanatic optimizer trying to squeeze out the last compressed bit for their - specific input data. Read the deflate.c source code for the meaning of the - max_lazy, good_length, nice_length, and max_chain parameters. - - deflateTune() can be called after deflateInit() or deflateInit2(), and - returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. - */ - -ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, - uLong sourceLen)); -/* - deflateBound() returns an upper bound on the compressed size after - deflation of sourceLen bytes. It must be called after deflateInit() or - deflateInit2(), and after deflateSetHeader(), if used. This would be used - to allocate an output buffer for deflation in a single pass, and so would be - called before deflate(). If that first deflate() call is provided the - sourceLen input bytes, an output buffer allocated to the size returned by - deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed - to return Z_STREAM_END. Note that it is possible for the compressed size to - be larger than the value returned by deflateBound() if flush options other - than Z_FINISH or Z_NO_FLUSH are used. -*/ - -ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, - unsigned *pending, - int *bits)); -/* - deflatePending() returns the number of bytes and bits of output that have - been generated, but not yet provided in the available output. The bytes not - provided would be due to the available output space having being consumed. - The number of bits of output not provided are between 0 and 7, where they - await more bits to join them in order to fill out a full byte. If pending - or bits are Z_NULL, then those values are not set. - - deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. - */ - -ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, - int bits, - int value)); -/* - deflatePrime() inserts bits in the deflate output stream. The intent - is that this function is used to start off the deflate output with the bits - leftover from a previous deflate stream when appending to it. As such, this - function can only be used for raw deflate, and must be used before the first - deflate() call after a deflateInit2() or deflateReset(). bits must be less - than or equal to 16, and that many of the least significant bits of value - will be inserted in the output. - - deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough - room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the - source stream state was inconsistent. -*/ - -ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, - gz_headerp head)); -/* - deflateSetHeader() provides gzip header information for when a gzip - stream is requested by deflateInit2(). deflateSetHeader() may be called - after deflateInit2() or deflateReset() and before the first call of - deflate(). The text, time, os, extra field, name, and comment information - in the provided gz_header structure are written to the gzip header (xflag is - ignored -- the extra flags are set according to the compression level). The - caller must assure that, if not Z_NULL, name and comment are terminated with - a zero byte, and that if extra is not Z_NULL, that extra_len bytes are - available there. If hcrc is true, a gzip header crc is included. Note that - the current versions of the command-line version of gzip (up through version - 1.3.x) do not support header crc's, and will report that it is a "multi-part - gzip file" and give up. - - If deflateSetHeader is not used, the default gzip header has text false, - the time set to zero, and os set to 255, with no extra, name, or comment - fields. The gzip header is returned to the default state by deflateReset(). - - deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -/* -ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, - int windowBits)); - - This is another version of inflateInit with an extra parameter. The - fields next_in, avail_in, zalloc, zfree and opaque must be initialized - before by the caller. - - The windowBits parameter is the base two logarithm of the maximum window - size (the size of the history buffer). It should be in the range 8..15 for - this version of the library. The default value is 15 if inflateInit is used - instead. windowBits must be greater than or equal to the windowBits value - provided to deflateInit2() while compressing, or it must be equal to 15 if - deflateInit2() was not used. If a compressed stream with a larger window - size is given as input, inflate() will return with the error code - Z_DATA_ERROR instead of trying to allocate a larger window. - - windowBits can also be zero to request that inflate use the window size in - the zlib header of the compressed stream. - - windowBits can also be -8..-15 for raw inflate. In this case, -windowBits - determines the window size. inflate() will then process raw deflate data, - not looking for a zlib or gzip header, not generating a check value, and not - looking for any check values for comparison at the end of the stream. This - is for use with other formats that use the deflate compressed data format - such as zip. Those formats provide their own check values. If a custom - format is developed using the raw deflate format for compressed data, it is - recommended that a check value such as an Adler-32 or a CRC-32 be applied to - the uncompressed data as is done in the zlib, gzip, and zip formats. For - most applications, the zlib format should be used as is. Note that comments - above on the use in deflateInit2() applies to the magnitude of windowBits. - - windowBits can also be greater than 15 for optional gzip decoding. Add - 32 to windowBits to enable zlib and gzip decoding with automatic header - detection, or add 16 to decode only the gzip format (the zlib format will - return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a - CRC-32 instead of an Adler-32. Unlike the gunzip utility and gzread() (see - below), inflate() will not automatically decode concatenated gzip streams. - inflate() will return Z_STREAM_END at the end of the gzip stream. The state - would need to be reset to continue decoding a subsequent gzip stream. - - inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_VERSION_ERROR if the zlib library version is incompatible with the - version assumed by the caller, or Z_STREAM_ERROR if the parameters are - invalid, such as a null pointer to the structure. msg is set to null if - there is no error message. inflateInit2 does not perform any decompression - apart from possibly reading the zlib header if present: actual decompression - will be done by inflate(). (So next_in and avail_in may be modified, but - next_out and avail_out are unused and unchanged.) The current implementation - of inflateInit2() does not process any header information -- that is - deferred until inflate() is called. -*/ - -ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the decompression dictionary from the given uncompressed byte - sequence. This function must be called immediately after a call of inflate, - if that call returned Z_NEED_DICT. The dictionary chosen by the compressor - can be determined from the Adler-32 value returned by that call of inflate. - The compressor and decompressor must use exactly the same dictionary (see - deflateSetDictionary). For raw inflate, this function can be called at any - time to set the dictionary. If the provided dictionary is smaller than the - window and there is already data in the window, then the provided dictionary - will amend what's there. The application must insure that the dictionary - that was used for compression is provided. - - inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a - parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is - inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the - expected one (incorrect Adler-32 value). inflateSetDictionary does not - perform any decompression: this will be done by subsequent calls of - inflate(). -*/ - -ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, - Bytef *dictionary, - uInt *dictLength)); -/* - Returns the sliding dictionary being maintained by inflate. dictLength is - set to the number of bytes in the dictionary, and that many bytes are copied - to dictionary. dictionary must have enough space, where 32768 bytes is - always enough. If inflateGetDictionary() is called with dictionary equal to - Z_NULL, then only the dictionary length is returned, and nothing is copied. - Similary, if dictLength is Z_NULL, then it is not set. - - inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the - stream state is inconsistent. -*/ - -ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); -/* - Skips invalid compressed data until a possible full flush point (see above - for the description of deflate with Z_FULL_FLUSH) can be found, or until all - available input is skipped. No output is provided. - - inflateSync searches for a 00 00 FF FF pattern in the compressed data. - All full flush points have this pattern, but not all occurrences of this - pattern are full flush points. - - inflateSync returns Z_OK if a possible full flush point has been found, - Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point - has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. - In the success case, the application may save the current current value of - total_in which indicates where valid compressed data was found. In the - error case, the application may repeatedly call inflateSync, providing more - input each time, until success or end of the input data. -*/ - -ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, - z_streamp source)); -/* - Sets the destination stream as a complete copy of the source stream. - - This function can be useful when randomly accessing a large stream. The - first pass through the stream can periodically record the inflate state, - allowing restarting inflate at those points when randomly accessing the - stream. - - inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being Z_NULL). msg is left unchanged in both source and - destination. -*/ - -ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); -/* - This function is equivalent to inflateEnd followed by inflateInit, - but does not free and reallocate the internal decompression state. The - stream will keep attributes that may have been set by inflateInit2. - - inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being Z_NULL). -*/ - -ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, - int windowBits)); -/* - This function is the same as inflateReset, but it also permits changing - the wrap and window size requests. The windowBits parameter is interpreted - the same as it is for inflateInit2. If the window size is changed, then the - memory allocated for the window is freed, and the window will be reallocated - by inflate() if needed. - - inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being Z_NULL), or if - the windowBits parameter is invalid. -*/ - -ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, - int bits, - int value)); -/* - This function inserts bits in the inflate input stream. The intent is - that this function is used to start inflating at a bit position in the - middle of a byte. The provided bits will be used before any bytes are used - from next_in. This function should only be used with raw inflate, and - should be used before the first inflate() call after inflateInit2() or - inflateReset(). bits must be less than or equal to 16, and that many of the - least significant bits of value will be inserted in the input. - - If bits is negative, then the input stream bit buffer is emptied. Then - inflatePrime() can be called again to put bits in the buffer. This is used - to clear out bits leftover after feeding inflate a block description prior - to feeding inflate codes. - - inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); -/* - This function returns two values, one in the lower 16 bits of the return - value, and the other in the remaining upper bits, obtained by shifting the - return value down 16 bits. If the upper value is -1 and the lower value is - zero, then inflate() is currently decoding information outside of a block. - If the upper value is -1 and the lower value is non-zero, then inflate is in - the middle of a stored block, with the lower value equaling the number of - bytes from the input remaining to copy. If the upper value is not -1, then - it is the number of bits back from the current bit position in the input of - the code (literal or length/distance pair) currently being processed. In - that case the lower value is the number of bytes already emitted for that - code. - - A code is being processed if inflate is waiting for more input to complete - decoding of the code, or if it has completed decoding but is waiting for - more output space to write the literal or match data. - - inflateMark() is used to mark locations in the input data for random - access, which may be at bit positions, and to note those cases where the - output of a code may span boundaries of random access blocks. The current - location in the input stream can be determined from avail_in and data_type - as noted in the description for the Z_BLOCK flush parameter for inflate. - - inflateMark returns the value noted above, or -65536 if the provided - source stream state was inconsistent. -*/ - -ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, - gz_headerp head)); -/* - inflateGetHeader() requests that gzip header information be stored in the - provided gz_header structure. inflateGetHeader() may be called after - inflateInit2() or inflateReset(), and before the first call of inflate(). - As inflate() processes the gzip stream, head->done is zero until the header - is completed, at which time head->done is set to one. If a zlib stream is - being decoded, then head->done is set to -1 to indicate that there will be - no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be - used to force inflate() to return immediately after header processing is - complete and before any actual data is decompressed. - - The text, time, xflags, and os fields are filled in with the gzip header - contents. hcrc is set to true if there is a header CRC. (The header CRC - was valid if done is set to one.) If extra is not Z_NULL, then extra_max - contains the maximum number of bytes to write to extra. Once done is true, - extra_len contains the actual extra field length, and extra contains the - extra field, or that field truncated if extra_max is less than extra_len. - If name is not Z_NULL, then up to name_max characters are written there, - terminated with a zero unless the length is greater than name_max. If - comment is not Z_NULL, then up to comm_max characters are written there, - terminated with a zero unless the length is greater than comm_max. When any - of extra, name, or comment are not Z_NULL and the respective field is not - present in the header, then that field is set to Z_NULL to signal its - absence. This allows the use of deflateSetHeader() with the returned - structure to duplicate the header. However if those fields are set to - allocated memory, then the application will need to save those pointers - elsewhere so that they can be eventually freed. - - If inflateGetHeader is not used, then the header information is simply - discarded. The header is always checked for validity, including the header - CRC if present. inflateReset() will reset the process to discard the header - information. The application would need to call inflateGetHeader() again to - retrieve the header from the next gzip stream. - - inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -/* -ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, - unsigned char FAR *window)); - - Initialize the internal stream state for decompression using inflateBack() - calls. The fields zalloc, zfree and opaque in strm must be initialized - before the call. If zalloc and zfree are Z_NULL, then the default library- - derived memory allocation routines are used. windowBits is the base two - logarithm of the window size, in the range 8..15. window is a caller - supplied buffer of that size. Except for special applications where it is - assured that deflate was used with small window sizes, windowBits must be 15 - and a 32K byte window must be supplied to be able to decompress general - deflate streams. - - See inflateBack() for the usage of these routines. - - inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of - the parameters are invalid, Z_MEM_ERROR if the internal state could not be - allocated, or Z_VERSION_ERROR if the version of the library does not match - the version of the header file. -*/ - -typedef unsigned(*in_func) OF((void FAR *, - z_const unsigned char FAR *FAR *)); -typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); - -ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, - in_func in, void FAR *in_desc, - out_func out, void FAR *out_desc)); -/* - inflateBack() does a raw inflate with a single call using a call-back - interface for input and output. This is potentially more efficient than - inflate() for file i/o applications, in that it avoids copying between the - output and the sliding window by simply making the window itself the output - buffer. inflate() can be faster on modern CPUs when used with large - buffers. inflateBack() trusts the application to not change the output - buffer passed by the output function, at least until inflateBack() returns. - - inflateBackInit() must be called first to allocate the internal state - and to initialize the state with the user-provided window buffer. - inflateBack() may then be used multiple times to inflate a complete, raw - deflate stream with each call. inflateBackEnd() is then called to free the - allocated state. - - A raw deflate stream is one with no zlib or gzip header or trailer. - This routine would normally be used in a utility that reads zip or gzip - files and writes out uncompressed files. The utility would decode the - header and process the trailer on its own, hence this routine expects only - the raw deflate stream to decompress. This is different from the default - behavior of inflate(), which expects a zlib header and trailer around the - deflate stream. - - inflateBack() uses two subroutines supplied by the caller that are then - called by inflateBack() for input and output. inflateBack() calls those - routines until it reads a complete deflate stream and writes out all of the - uncompressed data, or until it encounters an error. The function's - parameters and return types are defined above in the in_func and out_func - typedefs. inflateBack() will call in(in_desc, &buf) which should return the - number of bytes of provided input, and a pointer to that input in buf. If - there is no input available, in() must return zero -- buf is ignored in that - case -- and inflateBack() will return a buffer error. inflateBack() will - call out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. - out() should return zero on success, or non-zero on failure. If out() - returns non-zero, inflateBack() will return with an error. Neither in() nor - out() are permitted to change the contents of the window provided to - inflateBackInit(), which is also the buffer that out() uses to write from. - The length written by out() will be at most the window size. Any non-zero - amount of input may be provided by in(). - - For convenience, inflateBack() can be provided input on the first call by - setting strm->next_in and strm->avail_in. If that input is exhausted, then - in() will be called. Therefore strm->next_in must be initialized before - calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called - immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in - must also be initialized, and then if strm->avail_in is not zero, input will - initially be taken from strm->next_in[0 .. strm->avail_in - 1]. - - The in_desc and out_desc parameters of inflateBack() is passed as the - first parameter of in() and out() respectively when they are called. These - descriptors can be optionally used to pass any information that the caller- - supplied in() and out() functions need to do their job. - - On return, inflateBack() will set strm->next_in and strm->avail_in to - pass back any unused input that was provided by the last in() call. The - return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR - if in() or out() returned an error, Z_DATA_ERROR if there was a format error - in the deflate stream (in which case strm->msg is set to indicate the nature - of the error), or Z_STREAM_ERROR if the stream was not properly initialized. - In the case of Z_BUF_ERROR, an input or output error can be distinguished - using strm->next_in which will be Z_NULL only if in() returned an error. If - strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning - non-zero. (in() will always be called before out(), so strm->next_in is - assured to be defined if out() returns non-zero.) Note that inflateBack() - cannot return Z_OK. -*/ - -ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); -/* - All memory allocated by inflateBackInit() is freed. - - inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream - state was inconsistent. -*/ - -ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); -/* Return flags indicating compile-time options. - - Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: - 1.0: size of uInt - 3.2: size of uLong - 5.4: size of voidpf (pointer) - 7.6: size of z_off_t - - Compiler, assembler, and debug options: - 8: ZLIB_DEBUG - 9: ASMV or ASMINF -- use ASM code - 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention - 11: 0 (reserved) - - One-time table building (smaller code, but not thread-safe if true): - 12: BUILDFIXED -- build static block decoding tables when needed - 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed - 14,15: 0 (reserved) - - Library content (indicates missing functionality): - 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking - deflate code when not needed) - 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect - and decode gzip streams (to avoid linking crc code) - 18-19: 0 (reserved) - - Operation variations (changes in library functionality): - 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate - 21: FASTEST -- deflate algorithm with only one, lowest compression level - 22,23: 0 (reserved) - - The sprintf variant used by gzprintf (zero is best): - 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format - 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! - 26: 0 = returns value, 1 = void -- 1 means inferred string length returned - - Remainder: - 27-31: 0 (reserved) - */ - -#ifndef Z_SOLO - -/* utility functions */ - -/* - The following utility functions are implemented on top of the basic - stream-oriented functions. To simplify the interface, some default options - are assumed (compression level and memory usage, standard memory allocation - functions). The source code of these utility functions can be modified if - you need special options. -*/ - -ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); -/* - Compresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total size - of the destination buffer, which must be at least the value returned by - compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed data. compress() is equivalent to compress2() with a level - parameter of Z_DEFAULT_COMPRESSION. - - compress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer. -*/ - -ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen, - int level)); -/* - Compresses the source buffer into the destination buffer. The level - parameter has the same meaning as in deflateInit. sourceLen is the byte - length of the source buffer. Upon entry, destLen is the total size of the - destination buffer, which must be at least the value returned by - compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed data. - - compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_BUF_ERROR if there was not enough room in the output buffer, - Z_STREAM_ERROR if the level parameter is invalid. -*/ - -ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); -/* - compressBound() returns an upper bound on the compressed size after - compress() or compress2() on sourceLen bytes. It would be used before a - compress() or compress2() call to allocate the destination buffer. -*/ - -ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); -/* - Decompresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total size - of the destination buffer, which must be large enough to hold the entire - uncompressed data. (The size of the uncompressed data must have been saved - previously by the compressor and transmitted to the decompressor by some - mechanism outside the scope of this compression library.) Upon exit, destLen - is the actual size of the uncompressed data. - - uncompress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In - the case where there is not enough room, uncompress() will fill the output - buffer with the uncompressed data up to that point. -*/ - -ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong *sourceLen)); -/* - Same as uncompress, except that sourceLen is a pointer, where the - length of the source is *sourceLen. On return, *sourceLen is the number of - source bytes consumed. -*/ - -/* gzip file access functions */ - -/* - This library supports reading and writing files in gzip (.gz) format with - an interface similar to that of stdio, using the functions that start with - "gz". The gzip format is different from the zlib format. gzip is a gzip - wrapper, documented in RFC 1952, wrapped around a deflate stream. -*/ - -typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ - -/* -ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); - - Opens a gzip (.gz) file for reading or writing. The mode parameter is as - in fopen ("rb" or "wb") but can also include a compression level ("wb9") or - a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only - compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' - for fixed code compression as in "wb9F". (See the description of - deflateInit2 for more information about the strategy parameter.) 'T' will - request transparent writing or appending with no compression and not using - the gzip format. - - "a" can be used instead of "w" to request that the gzip stream that will - be written be appended to the file. "+" will result in an error, since - reading and writing to the same gzip file is not supported. The addition of - "x" when writing will create the file exclusively, which fails if the file - already exists. On systems that support it, the addition of "e" when - reading or writing will set the flag to close the file on an execve() call. - - These functions, as well as gzip, will read and decode a sequence of gzip - streams in a file. The append function of gzopen() can be used to create - such a file. (Also see gzflush() for another way to do this.) When - appending, gzopen does not test whether the file begins with a gzip stream, - nor does it look for the end of the gzip streams to begin appending. gzopen - will simply append a gzip stream to the existing file. - - gzopen can be used to read a file which is not in gzip format; in this - case gzread will directly read from the file without decompression. When - reading, this will be detected automatically by looking for the magic two- - byte gzip header. - - gzopen returns NULL if the file could not be opened, if there was - insufficient memory to allocate the gzFile state, or if an invalid mode was - specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). - errno can be checked to determine if the reason gzopen failed was that the - file could not be opened. -*/ - -ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); -/* - gzdopen associates a gzFile with the file descriptor fd. File descriptors - are obtained from calls like open, dup, creat, pipe or fileno (if the file - has been previously opened with fopen). The mode parameter is as in gzopen. - - The next call of gzclose on the returned gzFile will also close the file - descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor - fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, - mode);. The duplicated descriptor should be saved to avoid a leak, since - gzdopen does not close fd if it fails. If you are using fileno() to get the - file descriptor from a FILE *, then you will have to use dup() to avoid - double-close()ing the file descriptor. Both gzclose() and fclose() will - close the associated file descriptor, so they need to have different file - descriptors. - - gzdopen returns NULL if there was insufficient memory to allocate the - gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not - provided, or '+' was provided), or if fd is -1. The file descriptor is not - used until the next gz* read, write, seek, or close operation, so gzdopen - will not detect if fd is invalid (unless fd is -1). -*/ - -ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); -/* - Set the internal buffer size used by this library's functions. The - default buffer size is 8192 bytes. This function must be called after - gzopen() or gzdopen(), and before any other calls that read or write the - file. The buffer memory allocation is always deferred to the first read or - write. Three times that size in buffer space is allocated. A larger buffer - size of, for example, 64K or 128K bytes will noticeably increase the speed - of decompression (reading). - - The new buffer size also affects the maximum length for gzprintf(). - - gzbuffer() returns 0 on success, or -1 on failure, such as being called - too late. -*/ - -ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); -/* - Dynamically update the compression level or strategy. See the description - of deflateInit2 for the meaning of these parameters. Previously provided - data is flushed before the parameter change. - - gzsetparams returns Z_OK if success, Z_STREAM_ERROR if the file was not - opened for writing, Z_ERRNO if there is an error writing the flushed data, - or Z_MEM_ERROR if there is a memory allocation error. -*/ - -ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); -/* - Reads the given number of uncompressed bytes from the compressed file. If - the input file is not in gzip format, gzread copies the given number of - bytes into the buffer directly from the file. - - After reaching the end of a gzip stream in the input, gzread will continue - to read, looking for another gzip stream. Any number of gzip streams may be - concatenated in the input file, and will all be decompressed by gzread(). - If something other than a gzip stream is encountered after a gzip stream, - that remaining trailing garbage is ignored (and no error is returned). - - gzread can be used to read a gzip file that is being concurrently written. - Upon reaching the end of the input, gzread will return with the available - data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then - gzclearerr can be used to clear the end of file indicator in order to permit - gzread to be tried again. Z_OK indicates that a gzip stream was completed - on the last gzread. Z_BUF_ERROR indicates that the input file ended in the - middle of a gzip stream. Note that gzread does not return -1 in the event - of an incomplete gzip stream. This error is deferred until gzclose(), which - will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip - stream. Alternatively, gzerror can be used before gzclose to detect this - case. - - gzread returns the number of uncompressed bytes actually read, less than - len for end of file, or -1 for error. If len is too large to fit in an int, - then nothing is read, -1 is returned, and the error state is set to - Z_STREAM_ERROR. -*/ - -ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, - gzFile file)); -/* - Read up to nitems items of size size from file to buf, otherwise operating - as gzread() does. This duplicates the interface of stdio's fread(), with - size_t request and return types. If the library defines size_t, then - z_size_t is identical to size_t. If not, then z_size_t is an unsigned - integer type that can contain a pointer. - - gzfread() returns the number of full items read of size size, or zero if - the end of the file was reached and a full item could not be read, or if - there was an error. gzerror() must be consulted if zero is returned in - order to determine if there was an error. If the multiplication of size and - nitems overflows, i.e. the product does not fit in a z_size_t, then nothing - is read, zero is returned, and the error state is set to Z_STREAM_ERROR. - - In the event that the end of file is reached and only a partial item is - available at the end, i.e. the remaining uncompressed data length is not a - multiple of size, then the final partial item is nevetheless read into buf - and the end-of-file flag is set. The length of the partial item read is not - provided, but could be inferred from the result of gztell(). This behavior - is the same as the behavior of fread() implementations in common libraries, - but it prevents the direct use of gzfread() to read a concurrently written - file, reseting and retrying on end-of-file, when size is not 1. -*/ - -ZEXTERN int ZEXPORT gzwrite OF((gzFile file, - voidpc buf, unsigned len)); -/* - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of uncompressed bytes written or 0 in case of - error. -*/ - -ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, - z_size_t nitems, gzFile file)); -/* - gzfwrite() writes nitems items of size size from buf to file, duplicating - the interface of stdio's fwrite(), with size_t request and return types. If - the library defines size_t, then z_size_t is identical to size_t. If not, - then z_size_t is an unsigned integer type that can contain a pointer. - - gzfwrite() returns the number of full items written of size size, or zero - if there was an error. If the multiplication of size and nitems overflows, - i.e. the product does not fit in a z_size_t, then nothing is written, zero - is returned, and the error state is set to Z_STREAM_ERROR. -*/ - -ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); -/* - Converts, formats, and writes the arguments to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of - uncompressed bytes actually written, or a negative zlib error code in case - of error. The number of uncompressed bytes written is limited to 8191, or - one less than the buffer size given to gzbuffer(). The caller should assure - that this limit is not exceeded. If it is exceeded, then gzprintf() will - return an error (0) with nothing written. In this case, there may also be a - buffer overflow with unpredictable consequences, which is possible only if - zlib was compiled with the insecure functions sprintf() or vsprintf() - because the secure snprintf() or vsnprintf() functions were not available. - This can be determined using zlibCompileFlags(). -*/ - -ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); -/* - Writes the given null-terminated string to the compressed file, excluding - the terminating null character. - - gzputs returns the number of characters written, or -1 in case of error. -*/ - -ZEXTERN char *ZEXPORT gzgets OF((gzFile file, char *buf, int len)); -/* - Reads bytes from the compressed file until len-1 characters are read, or a - newline character is read and transferred to buf, or an end-of-file - condition is encountered. If any characters are read or if len == 1, the - string is terminated with a null character. If no characters are read due - to an end-of-file or len < 1, then the buffer is left untouched. - - gzgets returns buf which is a null-terminated string, or it returns NULL - for end-of-file or in case of error. If there was an error, the contents at - buf are indeterminate. -*/ - -ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); -/* - Writes c, converted to an unsigned char, into the compressed file. gzputc - returns the value that was written, or -1 in case of error. -*/ - -ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); -/* - Reads one byte from the compressed file. gzgetc returns this byte or -1 - in case of end of file or error. This is implemented as a macro for speed. - As such, it does not do all of the checking the other functions do. I.e. - it does not check to see if file is NULL, nor whether the structure file - points to has been clobbered or not. -*/ - -ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); -/* - Push one character back onto the stream to be read as the first character - on the next read. At least one character of push-back is allowed. - gzungetc() returns the character pushed, or -1 on failure. gzungetc() will - fail if c is -1, and may fail if a character has been pushed but not read - yet. If gzungetc is used immediately after gzopen or gzdopen, at least the - output buffer size of pushed characters is allowed. (See gzbuffer above.) - The pushed character will be discarded if the stream is repositioned with - gzseek() or gzrewind(). -*/ - -ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); -/* - Flushes all pending output into the compressed file. The parameter flush - is as in the deflate() function. The return value is the zlib error number - (see function gzerror below). gzflush is only permitted when writing. - - If the flush parameter is Z_FINISH, the remaining data is written and the - gzip stream is completed in the output. If gzwrite() is called again, a new - gzip stream will be started in the output. gzread() is able to read such - concatenated gzip streams. - - gzflush should be called only when strictly necessary because it will - degrade compression if called too often. -*/ - -/* -ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, - z_off_t offset, int whence)); - - Sets the starting position for the next gzread or gzwrite on the given - compressed file. The offset represents a number of bytes in the - uncompressed data stream. The whence parameter is defined as in lseek(2); - the value SEEK_END is not supported. - - If the file is opened for reading, this function is emulated but can be - extremely slow. If the file is opened for writing, only forward seeks are - supported; gzseek then compresses a sequence of zeroes up to the new - starting position. - - gzseek returns the resulting offset location as measured in bytes from - the beginning of the uncompressed stream, or -1 in case of error, in - particular if the file is opened for writing and the new starting position - would be before the current position. -*/ - -ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); -/* - Rewinds the given file. This function is supported only for reading. - - gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) -*/ - -/* -ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); - - Returns the starting position for the next gzread or gzwrite on the given - compressed file. This position represents a number of bytes in the - uncompressed data stream, and is zero when starting, even if appending or - reading a gzip stream from the middle of a file using gzdopen(). - - gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) -*/ - -/* -ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); - - Returns the current offset in the file being read or written. This offset - includes the count of bytes that precede the gzip stream, for example when - appending or when using gzdopen() for reading. When reading, the offset - does not include as yet unused buffered input. This information can be used - for a progress indicator. On error, gzoffset() returns -1. -*/ - -ZEXTERN int ZEXPORT gzeof OF((gzFile file)); -/* - Returns true (1) if the end-of-file indicator has been set while reading, - false (0) otherwise. Note that the end-of-file indicator is set only if the - read tried to go past the end of the input, but came up short. Therefore, - just like feof(), gzeof() may return false even if there is no more data to - read, in the event that the last read request was for the exact number of - bytes remaining in the input file. This will happen if the input file size - is an exact multiple of the buffer size. - - If gzeof() returns true, then the read functions will return no more data, - unless the end-of-file indicator is reset by gzclearerr() and the input file - has grown since the previous end of file was detected. -*/ - -ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); -/* - Returns true (1) if file is being copied directly while reading, or false - (0) if file is a gzip stream being decompressed. - - If the input file is empty, gzdirect() will return true, since the input - does not contain a gzip stream. - - If gzdirect() is used immediately after gzopen() or gzdopen() it will - cause buffers to be allocated to allow reading the file to determine if it - is a gzip file. Therefore if gzbuffer() is used, it should be called before - gzdirect(). - - When writing, gzdirect() returns true (1) if transparent writing was - requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: - gzdirect() is not needed when writing. Transparent writing must be - explicitly requested, so the application already knows the answer. When - linking statically, using gzdirect() will include all of the zlib code for - gzip file reading and decompression, which may not be desired.) -*/ - -ZEXTERN int ZEXPORT gzclose OF((gzFile file)); -/* - Flushes all pending output if necessary, closes the compressed file and - deallocates the (de)compression state. Note that once file is closed, you - cannot call gzerror with file, since its structures have been deallocated. - gzclose must not be called more than once on the same file, just as free - must not be called more than once on the same allocation. - - gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a - file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the - last read ended in the middle of a gzip stream, or Z_OK on success. -*/ - -ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); -ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); -/* - Same as gzclose(), but gzclose_r() is only for use when reading, and - gzclose_w() is only for use when writing or appending. The advantage to - using these instead of gzclose() is that they avoid linking in zlib - compression or decompression code that is not used when only reading or only - writing respectively. If gzclose() is used, then both compression and - decompression code will be included the application when linking to a static - zlib library. -*/ - -ZEXTERN const char *ZEXPORT gzerror OF((gzFile file, int *errnum)); -/* - Returns the error message for the last error which occurred on the given - compressed file. errnum is set to zlib error number. If an error occurred - in the file system and not in the compression library, errnum is set to - Z_ERRNO and the application may consult errno to get the exact error code. - - The application must not modify the returned string. Future calls to - this function may invalidate the previously returned string. If file is - closed, then the string previously returned by gzerror will no longer be - available. - - gzerror() should be used to distinguish errors from end-of-file for those - functions above that do not distinguish those cases in their return values. -*/ - -ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); -/* - Clears the error and end-of-file flags for file. This is analogous to the - clearerr() function in stdio. This is useful for continuing to read a gzip - file that is being written concurrently. -*/ - -#endif /* !Z_SOLO */ - -/* checksum functions */ - -/* - These functions are not related to compression but are exported - anyway because they might be useful in applications using the compression - library. -*/ - -ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); -/* - Update a running Adler-32 checksum with the bytes buf[0..len-1] and - return the updated checksum. If buf is Z_NULL, this function returns the - required initial value for the checksum. - - An Adler-32 checksum is almost as reliable as a CRC-32 but can be computed - much faster. - - Usage example: - - uLong adler = adler32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - adler = adler32(adler, buffer, length); - } - if (adler != original_adler) error(); -*/ - -ZEXTERN uLong ZEXPORT adler32_z OF((uLong adler, const Bytef *buf, - z_size_t len)); -/* - Same as adler32(), but with a size_t length. -*/ - -/* -ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, - z_off_t len2)); - - Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 - and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for - each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of - seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note - that the z_off_t type (like off_t) is a signed integer. If len2 is - negative, the result has no meaning or utility. -*/ - -ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); -/* - Update a running CRC-32 with the bytes buf[0..len-1] and return the - updated CRC-32. If buf is Z_NULL, this function returns the required - initial value for the crc. Pre- and post-conditioning (one's complement) is - performed within this function so it shouldn't be done by the application. - - Usage example: - - uLong crc = crc32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - crc = crc32(crc, buffer, length); - } - if (crc != original_crc) error(); -*/ - -ZEXTERN uLong ZEXPORT crc32_z OF((uLong adler, const Bytef *buf, - z_size_t len)); -/* - Same as crc32(), but with a size_t length. -*/ - -/* -ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); - - Combine two CRC-32 check values into one. For two sequences of bytes, - seq1 and seq2 with lengths len1 and len2, CRC-32 check values were - calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 - check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and - len2. -*/ - - -/* various hacks, don't look :) */ - -/* deflateInit and inflateInit are macros to allow checking the zlib version - * and the compiler's view of z_stream: - */ -ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, - int windowBits, int memLevel, - int strategy, const char *version, - int stream_size)); -ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, - unsigned char FAR *window, - const char *version, - int stream_size)); -#ifdef Z_PREFIX_SET -# define z_deflateInit(strm, level) \ - deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) -# define z_inflateInit(strm) \ - inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) -# define z_deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ - deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ - (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) -# define z_inflateInit2(strm, windowBits) \ - inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ - (int)sizeof(z_stream)) -# define z_inflateBackInit(strm, windowBits, window) \ - inflateBackInit_((strm), (windowBits), (window), \ - ZLIB_VERSION, (int)sizeof(z_stream)) -#else -# define deflateInit(strm, level) \ - deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) -# define inflateInit(strm) \ - inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) -# define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ - deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ - (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) -# define inflateInit2(strm, windowBits) \ - inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ - (int)sizeof(z_stream)) -# define inflateBackInit(strm, windowBits, window) \ - inflateBackInit_((strm), (windowBits), (window), \ - ZLIB_VERSION, (int)sizeof(z_stream)) -#endif - -#ifndef Z_SOLO - -/* gzgetc() macro and its supporting function and exposed data structure. Note - * that the real internal state is much larger than the exposed structure. - * This abbreviated structure exposes just enough for the gzgetc() macro. The - * user should not mess with these exposed elements, since their names or - * behavior could change in the future, perhaps even capriciously. They can - * only be used by the gzgetc() macro. You have been warned. - */ -struct gzFile_s { - unsigned have; - unsigned char *next; - z_off64_t pos; -}; -ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ -#ifdef Z_PREFIX_SET -# undef z_gzgetc -# define z_gzgetc(g) \ - ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) -#else -# define gzgetc(g) \ - ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) -#endif - -/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or - * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if - * both are true, the application gets the *64 functions, and the regular - * functions are changed to 64 bits) -- in case these are set on systems - * without large file support, _LFS64_LARGEFILE must also be true - */ -#ifdef Z_LARGE64 -ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); -ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); -ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); -ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); -ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); -ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); -#endif - -#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) -# ifdef Z_PREFIX_SET -# define z_gzopen z_gzopen64 -# define z_gzseek z_gzseek64 -# define z_gztell z_gztell64 -# define z_gzoffset z_gzoffset64 -# define z_adler32_combine z_adler32_combine64 -# define z_crc32_combine z_crc32_combine64 -# else -# define gzopen gzopen64 -# define gzseek gzseek64 -# define gztell gztell64 -# define gzoffset gzoffset64 -# define adler32_combine adler32_combine64 -# define crc32_combine crc32_combine64 -# endif -# ifndef Z_LARGE64 -ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); -ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); -ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); -ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); -ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); -ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); -# endif -#else -ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); -ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); -ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); -ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); -ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); -ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); -#endif - -#else /* Z_SOLO */ - -ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); -ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); - -#endif /* !Z_SOLO */ - -/* undocumented functions */ -ZEXTERN const char *ZEXPORT zError OF((int)); -ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); -ZEXTERN const z_crc_t FAR *ZEXPORT get_crc_table OF((void)); -ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); -ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int)); -ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF((z_streamp)); -ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); -ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); -#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(Z_SOLO) -ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, - const char *mode)); -#endif -#if defined(STDC) || defined(Z_HAVE_STDARG_H) -# ifndef Z_SOLO -ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, - const char *format, - va_list va)); -# endif -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* ZLIB_H */ - diff --git a/common/zlib/zutil.c b/common/zlib/zutil.c deleted file mode 100644 index 2d70d74c9..000000000 --- a/common/zlib/zutil.c +++ /dev/null @@ -1,344 +0,0 @@ -/* zutil.c -- target dependent utility functions for the compression library - * Copyright (C) 1995-2017 Jean-loup Gailly - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#include "zutil.h" -#ifndef Z_SOLO -# include "gzguts.h" -#endif - -z_const char *const z_errmsg[10] = { - (z_const char *)"need dictionary", /* Z_NEED_DICT 2 */ - (z_const char *)"stream end", /* Z_STREAM_END 1 */ - (z_const char *)"", /* Z_OK 0 */ - (z_const char *)"file error", /* Z_ERRNO (-1) */ - (z_const char *)"stream error", /* Z_STREAM_ERROR (-2) */ - (z_const char *)"data error", /* Z_DATA_ERROR (-3) */ - (z_const char *)"insufficient memory", /* Z_MEM_ERROR (-4) */ - (z_const char *)"buffer error", /* Z_BUF_ERROR (-5) */ - (z_const char *)"incompatible version",/* Z_VERSION_ERROR (-6) */ - (z_const char *)"" -}; - - -const char *ZEXPORT zlibVersion() { - return ZLIB_VERSION; -} - -uLong ZEXPORT zlibCompileFlags() { - uLong flags; - - flags = 0; - switch ((int)(sizeof(uInt))) { - case 2: - break; - case 4: - flags += 1; - break; - case 8: - flags += 2; - break; - default: - flags += 3; - } - switch ((int)(sizeof(uLong))) { - case 2: - break; - case 4: - flags += 1 << 2; - break; - case 8: - flags += 2 << 2; - break; - default: - flags += 3 << 2; - } - switch ((int)(sizeof(voidpf))) { - case 2: - break; - case 4: - flags += 1 << 4; - break; - case 8: - flags += 2 << 4; - break; - default: - flags += 3 << 4; - } - switch ((int)(sizeof(z_off_t))) { - case 2: - break; - case 4: - flags += 1 << 6; - break; - case 8: - flags += 2 << 6; - break; - default: - flags += 3 << 6; - } -#ifdef ZLIB_DEBUG - flags += 1 << 8; -#endif -#if defined(ASMV) || defined(ASMINF) - flags += 1 << 9; -#endif -#ifdef ZLIB_WINAPI - flags += 1 << 10; -#endif -#ifdef BUILDFIXED - flags += 1 << 12; -#endif -#ifdef DYNAMIC_CRC_TABLE - flags += 1 << 13; -#endif -#ifdef NO_GZCOMPRESS - flags += 1L << 16; -#endif -#ifdef NO_GZIP - flags += 1L << 17; -#endif -#ifdef PKZIP_BUG_WORKAROUND - flags += 1L << 20; -#endif -#ifdef FASTEST - flags += 1L << 21; -#endif -#if defined(STDC) || defined(Z_HAVE_STDARG_H) -# ifdef NO_vsnprintf - flags += 1L << 25; -# ifdef HAS_vsprintf_void - flags += 1L << 26; -# endif -# else -# ifdef HAS_vsnprintf_void - flags += 1L << 26; -# endif -# endif -#else - flags += 1L << 24; -# ifdef NO_snprintf - flags += 1L << 25; -# ifdef HAS_sprintf_void - flags += 1L << 26; -# endif -# else -# ifdef HAS_snprintf_void - flags += 1L << 26; -# endif -# endif -#endif - return flags; -} - -#ifdef ZLIB_DEBUG -#include <stdlib.h> -# ifndef verbose -# define verbose 0 -# endif -int ZLIB_INTERNAL z_verbose = verbose; - -void ZLIB_INTERNAL z_error(m) -char *m; -{ - fprintf(stderr, "%s\n", m); - exit(1); -} -#endif - -/* exported to allow conversion of error code to string for compress() and - * uncompress() - */ -const char *ZEXPORT zError(err) -int err; -{ - return ERR_MSG(err); -} - -#if defined(_WIN32_WCE) -/* The Microsoft C Run-Time Library for Windows CE doesn't have - * errno. We define it as a global variable to simplify porting. - * Its value is always 0 and should not be used. - */ -int errno = 0; -#endif - -#ifndef HAVE_MEMCPY - -void ZLIB_INTERNAL zmemcpy(dest, source, len) -Bytef *dest; -const Bytef *source; -uInt len; -{ - if (len == 0) return; - do { - *dest++ = *source++; /* ??? to be unrolled */ - } while (--len != 0); -} - -int ZLIB_INTERNAL zmemcmp(s1, s2, len) -const Bytef *s1; -const Bytef *s2; -uInt len; -{ - uInt j; - - for (j = 0; j < len; j++) { - if (s1[j] != s2[j]) return 2 * (s1[j] > s2[j]) - 1; - } - return 0; -} - -void ZLIB_INTERNAL zmemzero(dest, len) -Bytef *dest; -uInt len; -{ - if (len == 0) return; - do { - *dest++ = 0; /* ??? to be unrolled */ - } while (--len != 0); -} -#endif - -#ifndef Z_SOLO - -#ifdef SYS16BIT - -#ifdef __TURBOC__ -/* Turbo C in 16-bit mode */ - -# define MY_ZCALLOC - -/* Turbo C malloc() does not allow dynamic allocation of 64K bytes - * and farmalloc(64K) returns a pointer with an offset of 8, so we - * must fix the pointer. Warning: the pointer must be put back to its - * original form in order to free it, use zcfree(). - */ - -#define MAX_PTR 10 -/* 10*64K = 640K */ - -local int next_ptr = 0; - -typedef struct ptr_table_s { - voidpf org_ptr; - voidpf new_ptr; -} ptr_table; - -local ptr_table table[MAX_PTR]; -/* This table is used to remember the original form of pointers - * to large buffers (64K). Such pointers are normalized with a zero offset. - * Since MSDOS is not a preemptive multitasking OS, this table is not - * protected from concurrent access. This hack doesn't work anyway on - * a protected system like OS/2. Use Microsoft C instead. - */ - -voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) { - voidpf buf; - ulg bsize = (ulg)items * size; - - (void)opaque; - - /* If we allocate less than 65520 bytes, we assume that farmalloc - * will return a usable pointer which doesn't have to be normalized. - */ - if (bsize < 65520L) { - buf = farmalloc(bsize); - if (*(ush *)&buf != 0) return buf; - } else { - buf = farmalloc(bsize + 16L); - } - if (buf == NULL || next_ptr >= MAX_PTR) return NULL; - table[next_ptr].org_ptr = buf; - - /* Normalize the pointer to seg:0 */ - *((ush *)&buf + 1) += ((ush)((uch *)buf - 0) + 15) >> 4; - *(ush *)&buf = 0; - table[next_ptr++].new_ptr = buf; - return buf; -} - -void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) { - int n; - - (void)opaque; - - if (*(ush *)&ptr != 0) { /* object < 64K */ - farfree(ptr); - return; - } - /* Find the original pointer */ - for (n = 0; n < next_ptr; n++) { - if (ptr != table[n].new_ptr) continue; - - farfree(table[n].org_ptr); - while (++n < next_ptr) { - table[n - 1] = table[n]; - } - next_ptr--; - return; - } - Assert(0, "zcfree: ptr not found"); -} - -#endif /* __TURBOC__ */ - - -#ifdef M_I86 -/* Microsoft C in 16-bit mode */ - -# define MY_ZCALLOC - -#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) -# define _halloc halloc -# define _hfree hfree -#endif - -voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, uInt items, uInt size) { - (void)opaque; - return _halloc((long)items, size); -} - -void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) { - (void)opaque; - _hfree(ptr); -} - -#endif /* M_I86 */ - -#endif /* SYS16BIT */ - - -#ifndef MY_ZCALLOC /* Any system without a special alloc function */ - -#ifndef STDC -extern voidp malloc OF((uInt size)); -extern voidp calloc OF((uInt items, uInt size)); -extern void free OF((voidpf ptr)); -#endif - -voidpf ZLIB_INTERNAL zcalloc(opaque, items, size) -voidpf opaque; -unsigned items; -unsigned size; -{ - (void)opaque; - return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : - (voidpf)calloc(items, size); -} - -void ZLIB_INTERNAL zcfree(opaque, ptr) -voidpf opaque; -voidpf ptr; -{ - (void)opaque; - free(ptr); -} - -#endif /* MY_ZCALLOC */ - -#endif /* !Z_SOLO */ - diff --git a/common/zlib/zutil.h b/common/zlib/zutil.h deleted file mode 100644 index a5bf91366..000000000 --- a/common/zlib/zutil.h +++ /dev/null @@ -1,272 +0,0 @@ -/* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* @(#) $Id$ */ - -#ifndef ZUTIL_H -#define ZUTIL_H - -#ifdef HAVE_HIDDEN -# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) -#else -# define ZLIB_INTERNAL -#endif - -#include "zlib.h" - -#if defined(STDC) && !defined(Z_SOLO) -# if !(defined(_WIN32_WCE) && defined(_MSC_VER)) -# include <stddef.h> -# endif -# include <string.h> -# include <stdlib.h> -#endif - -#ifdef Z_SOLO -typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ -#endif - -#ifndef local -# define local static -#endif -/* since "static" is used to mean two completely different things in C, we - define "local" for the non-static meaning of "static", for readability - (compile with -Dlocal if your debugger can't find static symbols) */ - -typedef unsigned char uch; -typedef uch FAR uchf; -typedef unsigned short ush; -typedef ush FAR ushf; -typedef unsigned long ulg; - -extern z_const char *const z_errmsg[10]; /* indexed by 2-zlib_error */ -/* (size given to avoid silly warnings with Visual C++) */ - -#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] - -#define ERR_RETURN(strm,err) \ - return (strm->msg = ERR_MSG(err), (err)) -/* To be used only when the state is known to be valid */ - -/* common constants */ - -#ifndef DEF_WBITS -# define DEF_WBITS MAX_WBITS -#endif -/* default windowBits for decompression. MAX_WBITS is for compression only */ - -#if MAX_MEM_LEVEL >= 8 -# define DEF_MEM_LEVEL 8 -#else -# define DEF_MEM_LEVEL MAX_MEM_LEVEL -#endif -/* default memLevel */ - -#define STORED_BLOCK 0 -#define STATIC_TREES 1 -#define DYN_TREES 2 -/* The three kinds of block type */ - -#define MIN_MATCH 3 -#define MAX_MATCH 258 -/* The minimum and maximum match lengths */ - -#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ - -/* target dependencies */ - -#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) -# define OS_CODE 0x00 -# ifndef Z_SOLO -# if defined(__TURBOC__) || defined(__BORLANDC__) -# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) -/* Allow compilation with ANSI keywords only enabled */ -void _Cdecl farfree(void *block); -void *_Cdecl farmalloc(unsigned long nbytes); -# else -# include <alloc.h> -# endif -# else /* MSC or DJGPP */ -# include <malloc.h> -# endif -# endif -#endif - -#ifdef AMIGA -# define OS_CODE 1 -#endif - -#if defined(VAXC) || defined(VMS) -# define OS_CODE 2 -# define F_OPEN(name, mode) \ - fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") -#endif - -#ifdef __370__ -# if __TARGET_LIB__ < 0x20000000 -# define OS_CODE 4 -# elif __TARGET_LIB__ < 0x40000000 -# define OS_CODE 11 -# else -# define OS_CODE 8 -# endif -#endif - -#if defined(ATARI) || defined(atarist) -# define OS_CODE 5 -#endif - -#ifdef OS2 -# define OS_CODE 6 -# if defined(M_I86) && !defined(Z_SOLO) -# include <malloc.h> -# endif -#endif - -#if defined(MACOS) || defined(TARGET_OS_MAC) -# define OS_CODE 7 -# ifndef Z_SOLO -# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os -# include <unix.h> /* for fdopen */ -# else -# ifndef fdopen -# define fdopen(fd,mode) NULL /* No fdopen() */ -# endif -# endif -# endif -#endif - -#ifdef __acorn -# define OS_CODE 13 -#endif - -#if defined(WIN32) && !defined(__CYGWIN__) -# define OS_CODE 10 -#endif - -#ifdef _BEOS_ -# define OS_CODE 16 -#endif - -#ifdef __TOS_OS400__ -# define OS_CODE 18 -#endif - -#ifdef __APPLE__ -# define OS_CODE 19 -#endif - -#if defined(_BEOS_) || defined(RISCOS) -# define fdopen(fd,mode) NULL /* No fdopen() */ -#endif - -#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX -# if defined(_WIN32_WCE) -# define fdopen(fd,mode) NULL /* No fdopen() */ -# ifndef _PTRDIFF_T_DEFINED -typedef int ptrdiff_t; -# define _PTRDIFF_T_DEFINED -# endif -# else -# define fdopen(fd,type) _fdopen(fd,type) -# endif -#endif - -#if defined(__BORLANDC__) && !defined(MSDOS) -#pragma warn -8004 -#pragma warn -8008 -#pragma warn -8066 -#endif - -/* provide prototypes for these when building zlib without LFS */ -#if !defined(_WIN32) && \ - (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) -ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); -ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); -#endif - -/* common defaults */ - -#ifndef OS_CODE -# define OS_CODE 3 /* assume Unix */ -#endif - -#ifndef F_OPEN -# define F_OPEN(name, mode) fopen((name), (mode)) -#endif - -/* functions */ - -#if defined(pyr) || defined(Z_SOLO) -# define NO_MEMCPY -#endif -#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) -/* Use our own functions for small and medium model with MSC <= 5.0. - * You may have to use the same strategy for Borland C (untested). - * The __SC__ check is for Symantec. - */ -# define NO_MEMCPY -#endif -#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) -# define HAVE_MEMCPY -#endif -#ifdef HAVE_MEMCPY -# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ -# define zmemcpy _fmemcpy -# define zmemcmp _fmemcmp -# define zmemzero(dest, len) _fmemset(dest, 0, len) -# else -# define zmemcpy memcpy -# define zmemcmp memcmp -# define zmemzero(dest, len) memset(dest, 0, len) -# endif -#else -void ZLIB_INTERNAL zmemcpy OF((Bytef *dest, const Bytef *source, uInt len)); -int ZLIB_INTERNAL zmemcmp OF((const Bytef *s1, const Bytef *s2, uInt len)); -void ZLIB_INTERNAL zmemzero OF((Bytef *dest, uInt len)); -#endif - -/* Diagnostic functions */ -#ifdef ZLIB_DEBUG -# include <stdio.h> -extern int ZLIB_INTERNAL z_verbose; -extern void ZLIB_INTERNAL z_error OF((char *m)); -# define Assert(cond,msg) {if(!(cond)) z_error(msg);} -# define Trace(x) {if (z_verbose>=0) fprintf x ;} -# define Tracev(x) {if (z_verbose>0) fprintf x ;} -# define Tracevv(x) {if (z_verbose>1) fprintf x ;} -# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} -# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} -#else -# define Assert(cond,msg) -# define Trace(x) -# define Tracev(x) -# define Tracevv(x) -# define Tracec(c,x) -# define Tracecv(c,x) -#endif - -#ifndef Z_SOLO -voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, - unsigned size)); -void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); -#endif - -#define ZALLOC(strm, items, size) \ - (*((strm)->zalloc))((strm)->opaque, (items), (size)) -#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) -#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} - -/* Reverse the bytes in a 32-bit value */ -#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ - (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) - -#endif /* ZUTIL_H */ - diff --git a/doc/md/Installation_Instructions/Linux-Installation-Instructions.md b/doc/md/Installation_Instructions/Linux-Installation-Instructions.md index 578bb429d..688091ee8 100644 --- a/doc/md/Installation_Instructions/Linux-Installation-Instructions.md +++ b/doc/md/Installation_Instructions/Linux-Installation-Instructions.md @@ -37,7 +37,7 @@ If you get some (non blocking) error at runtime such as _Gtk-Message: Failed to ## On ArchLinux ```sh -sudo pacman -Sy git base-devel readline arm-none-eabi-gcc arm-none-eabi-newlib qt5-base bluez --needed +sudo pacman -Sy git base-devel readline bzip2 arm-none-eabi-gcc arm-none-eabi-newlib qt5-base bluez --needed ``` If you don't need the native Bluetooth support in the client, you can skip the installation of `bluez`. @@ -47,7 +47,7 @@ If you don't need the graphical components of the Proxmark3 client (such as in ` ## On Fedora ```sh -sudo dnf install git make gcc gcc-c++ arm-none-eabi-gcc-cs arm-none-eabi-newlib readline-devel qt5-qtbase-devel bluez-libs-devel libatomic +sudo dnf install git make gcc gcc-c++ arm-none-eabi-gcc-cs arm-none-eabi-newlib readline-devel bzip2-devel qt5-qtbase-devel bluez-libs-devel libatomic ``` If you don't need the native Bluetooth support in the client, you can skip the installation of `bluez-libs-devel`. @@ -57,7 +57,7 @@ If you don't need the graphical components of the Proxmark3 client (such as in ` ## On openSUSE ```sh -sudo zypper install git patterns-devel-base-devel_basis gcc-c++ readline-devel cross-arm-none-gcc9 cross-arm-none-newlib-devel libqt5-qtbase-devel +sudo zypper install git patterns-devel-base-devel_basis gcc-c++ readline-devel libbz2-devel cross-arm-none-gcc9 cross-arm-none-newlib-devel libqt5-qtbase-devel ``` If you don't need the graphical components of the Proxmark3 client (such as in `hw tune`), you can skip the installation of `libqt5-qtbase-devel`. diff --git a/tools/fpga_compress/fpga_compress.c b/tools/fpga_compress/fpga_compress.c index 7d574fb38..0d218300f 100644 --- a/tools/fpga_compress/fpga_compress.c +++ b/tools/fpga_compress/fpga_compress.c @@ -21,8 +21,6 @@ #include "fpga.h" #include "lz4hc.h" -#define HARDNESTED_TABLE_SIZE (uint32_t)(sizeof(uint32_t) * ((1L<<19)+1)) - static void usage(void) { fprintf(stdout, "Usage: fpga_compress <infile1> <infile2> ... <infile_n> <outfile>\n"); fprintf(stdout, " Combine n FPGA bitstream files and compress them into one.\n\n"); @@ -30,8 +28,6 @@ static void usage(void) { fprintf(stdout, " Extract Version Information from FPGA bitstream files and write it to <outfile>\n\n"); fprintf(stdout, " fpga_compress -d <infile> <outfile>\n"); fprintf(stdout, " Decompress <infile>. Write result to <outfile>\n\n"); - fprintf(stdout, " fpga_compress -t <infile> <outfile>\n"); - fprintf(stdout, " Compress hardnested table <infile>. Write result to <outfile>\n\n"); } static bool all_feof(FILE *infile[], uint8_t num_infiles) { @@ -43,30 +39,18 @@ static bool all_feof(FILE *infile[], uint8_t num_infiles) { return true; } -static int zlib_compress(FILE *infile[], uint8_t num_infiles, FILE *outfile, bool hardnested_mode) { +static int zlib_compress(FILE *infile[], uint8_t num_infiles, FILE *outfile) { uint8_t *fpga_config; - if (hardnested_mode) { - fpga_config = calloc(num_infiles * HARDNESTED_TABLE_SIZE, sizeof(uint8_t)); - } else { - fpga_config = calloc(num_infiles * FPGA_CONFIG_SIZE, sizeof(uint8_t)); - } - + fpga_config = calloc(num_infiles * FPGA_CONFIG_SIZE, sizeof(uint8_t)); // read the input files. Interleave them into fpga_config[] uint32_t total_size = 0; do { - if (total_size >= num_infiles * (hardnested_mode ? HARDNESTED_TABLE_SIZE : FPGA_CONFIG_SIZE)) { - if (hardnested_mode) { - fprintf(stderr, - "Input file too big (> %" PRIu32 " bytes). This is probably not a hardnested bitflip state table.\n" - , HARDNESTED_TABLE_SIZE); - - } else { - fprintf(stderr, - "Input files too big (total > %li bytes). These are probably not PM3 FPGA config files.\n" - , num_infiles * FPGA_CONFIG_SIZE); - } + if (total_size >= num_infiles * FPGA_CONFIG_SIZE) { + fprintf(stderr, + "Input files too big (total > %li bytes). These are probably not PM3 FPGA config files.\n" + , num_infiles * FPGA_CONFIG_SIZE); for (uint16_t j = 0; j < num_infiles; j++) { fclose(infile[j]); } @@ -376,17 +360,9 @@ int main(int argc, char **argv) { } else { // Compress or generate version info - bool hardnested_mode = false; bool generate_version_file = false; int num_input_files = 0; - if (!strcmp(argv[1], "-t")) { // compress one hardnested table - if (argc != 4) { - usage(); - return (EXIT_FAILURE); - } - hardnested_mode = true; - num_input_files = 1; - } else if (!strcmp(argv[1], "-v")) { // generate version info + if (!strcmp(argv[1], "-v")) { // generate version info generate_version_file = true; num_input_files = argc - 3; } else { // compress 1..n fpga files @@ -396,7 +372,7 @@ int main(int argc, char **argv) { FILE **infiles = calloc(num_input_files, sizeof(FILE *)); char **infile_names = calloc(num_input_files, sizeof(char *)); for (uint16_t i = 0; i < num_input_files; i++) { - infile_names[i] = argv[i + ((hardnested_mode || generate_version_file) ? 2 : 1)]; + infile_names[i] = argv[i + (generate_version_file ? 2 : 1)]; infiles[i] = fopen(infile_names[i], "rb"); if (infiles[i] == NULL) { fprintf(stderr, "Error. Cannot open input file %s\n\n", infile_names[i]); @@ -419,7 +395,7 @@ int main(int argc, char **argv) { return (EXIT_FAILURE); } } else { - int ret = zlib_compress(infiles, num_input_files, outfile, hardnested_mode); + int ret = zlib_compress(infiles, num_input_files, outfile); free(infile_names); free(infiles); return (ret); From e5a97f3e801d3665dee49c245d171ca46e180faf Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Mon, 8 Jun 2020 02:53:13 +0200 Subject: [PATCH 546/632] dockerfiles for tests --- docker/archlinux/Dockerfile | 19 +++++++++++++++++++ docker/archlinux/docker_build.sh | 3 +++ docker/archlinux/docker_run.sh | 3 +++ docker/debian/Dockerfile | 19 +++++++++++++++++++ docker/debian/docker_build.sh | 3 +++ docker/debian/docker_run.sh | 3 +++ docker/fedora/Dockerfile | 15 +++++++++++++++ docker/fedora/docker_build.sh | 3 +++ docker/fedora/docker_run.sh | 3 +++ docker/opensuse/Dockerfile | 16 ++++++++++++++++ docker/opensuse/docker_build.sh | 3 +++ docker/opensuse/docker_run.sh | 3 +++ docker/ubuntu/Dockerfile | 19 +++++++++++++++++++ docker/ubuntu/docker_build.sh | 3 +++ docker/ubuntu/docker_run.sh | 3 +++ 15 files changed, 118 insertions(+) create mode 100644 docker/archlinux/Dockerfile create mode 100755 docker/archlinux/docker_build.sh create mode 100755 docker/archlinux/docker_run.sh create mode 100644 docker/debian/Dockerfile create mode 100755 docker/debian/docker_build.sh create mode 100755 docker/debian/docker_run.sh create mode 100644 docker/fedora/Dockerfile create mode 100755 docker/fedora/docker_build.sh create mode 100755 docker/fedora/docker_run.sh create mode 100644 docker/opensuse/Dockerfile create mode 100755 docker/opensuse/docker_build.sh create mode 100755 docker/opensuse/docker_run.sh create mode 100644 docker/ubuntu/Dockerfile create mode 100755 docker/ubuntu/docker_build.sh create mode 100755 docker/ubuntu/docker_run.sh diff --git a/docker/archlinux/Dockerfile b/docker/archlinux/Dockerfile new file mode 100644 index 000000000..c5517c0fb --- /dev/null +++ b/docker/archlinux/Dockerfile @@ -0,0 +1,19 @@ +FROM archlinux/base + +ENV LANG C +RUN pacman -Syy +RUN pacman-db-upgrade +# qt5-base skipped +RUN pacman -S --noconfirm sudo git base-devel cmake libusb readline bzip2 arm-none-eabi-gcc arm-none-eabi-newlib --needed + +# Create rrg user +RUN useradd -ms /bin/bash rrg +RUN passwd -d rrg +RUN printf 'rrg ALL=(ALL) ALL\n' | tee -a /etc/sudoers + +USER rrg +WORKDIR "/home/rrg" + +RUN git clone https://aur.archlinux.org/package-query.git && cd package-query && makepkg -si --noconfirm --needed && cd .. && rm -rf package-query + +CMD ["/bin/bash"] diff --git a/docker/archlinux/docker_build.sh b/docker/archlinux/docker_build.sh new file mode 100755 index 000000000..be92402d6 --- /dev/null +++ b/docker/archlinux/docker_build.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +docker build -t "pm3-arch:1.0" . diff --git a/docker/archlinux/docker_run.sh b/docker/archlinux/docker_run.sh new file mode 100755 index 000000000..eac7e1378 --- /dev/null +++ b/docker/archlinux/docker_run.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +docker run --volume=$(pwd)/../..:/home/rrg/proxmark3 -it pm3-arch:1.0 diff --git a/docker/debian/Dockerfile b/docker/debian/Dockerfile new file mode 100644 index 000000000..030611739 --- /dev/null +++ b/docker/debian/Dockerfile @@ -0,0 +1,19 @@ +FROM debian:buster-slim + +ENV LANG C +ENV DEBIAN_FRONTEND noninteractive +# qtbase5-dev skipped +RUN apt-get update && \ + apt-get dist-upgrade -y && \ + apt-get install -y --no-install-recommends git ca-certificates build-essential cmake pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev libbz2-dev libbluetooth-dev sudo && \ + apt-get clean + +# Create rrg user +RUN useradd -ms /bin/bash rrg +RUN passwd -d rrg +RUN printf 'rrg ALL=(ALL) ALL\n' | tee -a /etc/sudoers + +USER rrg +WORKDIR "/home/rrg" + +CMD ["/bin/bash"] diff --git a/docker/debian/docker_build.sh b/docker/debian/docker_build.sh new file mode 100755 index 000000000..b051aaf7c --- /dev/null +++ b/docker/debian/docker_build.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +docker build -t "pm3-debian:1.0" . diff --git a/docker/debian/docker_run.sh b/docker/debian/docker_run.sh new file mode 100755 index 000000000..faf35d849 --- /dev/null +++ b/docker/debian/docker_run.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +docker run --volume=$(pwd)/../..:/home/rrg/proxmark3 -it pm3-debian:1.0 diff --git a/docker/fedora/Dockerfile b/docker/fedora/Dockerfile new file mode 100644 index 000000000..db634fc0d --- /dev/null +++ b/docker/fedora/Dockerfile @@ -0,0 +1,15 @@ +FROM fedora:31 + +ENV LANG C +# qt5-qtbase-devel skipped +RUN dnf install -y passwd sudo git make gcc gcc-c++ arm-none-eabi-gcc-cs arm-none-eabi-newlib readline-devel bzip2-devel bluez-libs-devel libatomic + +# Create rrg user +RUN useradd -ms /bin/bash rrg +RUN passwd -d rrg +RUN printf 'rrg ALL=(ALL) ALL\n' | tee -a /etc/sudoers + +USER rrg +WORKDIR "/home/rrg" + +CMD ["/bin/bash"] diff --git a/docker/fedora/docker_build.sh b/docker/fedora/docker_build.sh new file mode 100755 index 000000000..e4ef2258a --- /dev/null +++ b/docker/fedora/docker_build.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +docker build -t "pm3-fedora:1.0" . diff --git a/docker/fedora/docker_run.sh b/docker/fedora/docker_run.sh new file mode 100755 index 000000000..79718b831 --- /dev/null +++ b/docker/fedora/docker_run.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +docker run --volume=$(pwd)/../..:/home/rrg/proxmark3 -it pm3-fedora:1.0 diff --git a/docker/opensuse/Dockerfile b/docker/opensuse/Dockerfile new file mode 100644 index 000000000..4fa4e93a8 --- /dev/null +++ b/docker/opensuse/Dockerfile @@ -0,0 +1,16 @@ +#FROM opensuse/leap +FROM opensuse/tumbleweed + +ENV LANG C +# libqt5-qtbase-devel skipped +RUN zypper --non-interactive install --no-recommends shadow sudo git patterns-devel-base-devel_basis gcc-c++ readline-devel libbz2-devel cross-arm-none-gcc9 cross-arm-none-newlib-devel + +# Create rrg user +RUN useradd -ms /bin/bash rrg +RUN passwd -d rrg +RUN printf 'rrg ALL=(ALL) NOPASSWD: ALL\n' | tee -a /etc/sudoers + +USER rrg +WORKDIR "/home/rrg" + +CMD ["/bin/bash"] diff --git a/docker/opensuse/docker_build.sh b/docker/opensuse/docker_build.sh new file mode 100755 index 000000000..e25149697 --- /dev/null +++ b/docker/opensuse/docker_build.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +docker build -t "pm3-suse:1.0" . diff --git a/docker/opensuse/docker_run.sh b/docker/opensuse/docker_run.sh new file mode 100755 index 000000000..9b346bf69 --- /dev/null +++ b/docker/opensuse/docker_run.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +docker run --volume=$(pwd)/../..:/home/rrg/proxmark3 -it pm3-suse:1.0 diff --git a/docker/ubuntu/Dockerfile b/docker/ubuntu/Dockerfile new file mode 100644 index 000000000..673120e0e --- /dev/null +++ b/docker/ubuntu/Dockerfile @@ -0,0 +1,19 @@ +FROM ubuntu:20.04 + +ENV LANG C +ENV DEBIAN_FRONTEND noninteractive +# qtbase5-dev skipped +RUN apt-get update && \ + apt-get dist-upgrade -y && \ + apt-get install -y --no-install-recommends git ca-certificates build-essential cmake pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev libbz2-dev libbluetooth-dev sudo && \ + apt-get clean + +# Create rrg user +RUN useradd -ms /bin/bash rrg +RUN passwd -d rrg +RUN printf 'rrg ALL=(ALL) ALL\n' | tee -a /etc/sudoers + +USER rrg +WORKDIR "/home/rrg" + +CMD ["/bin/bash"] diff --git a/docker/ubuntu/docker_build.sh b/docker/ubuntu/docker_build.sh new file mode 100755 index 000000000..9c09b3aad --- /dev/null +++ b/docker/ubuntu/docker_build.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +docker build -t "pm3-ubuntu:1.0" . diff --git a/docker/ubuntu/docker_run.sh b/docker/ubuntu/docker_run.sh new file mode 100755 index 000000000..6d43e4d15 --- /dev/null +++ b/docker/ubuntu/docker_run.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +docker run --volume=$(pwd)/../..:/home/rrg/proxmark3 -it pm3-ubuntu:1.0 From a1eb8e78b6ebc55516d072238864a0ce1316cb3a Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Mon, 8 Jun 2020 03:11:16 +0200 Subject: [PATCH 547/632] adapt get_lz4.sh --- common/get_lz4.sh | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/common/get_lz4.sh b/common/get_lz4.sh index 0daa62a80..6c2dcf3cb 100755 --- a/common/get_lz4.sh +++ b/common/get_lz4.sh @@ -5,9 +5,26 @@ unzip -o -j v$version "lz4-$version/LICENSE" "lz4-$version/lib/lz4.h" "lz4-$vers rm v$version.zip patch -p0 << EOF diff -Naur lz4/lz4.c lz4/lz4.c ---- lz4/lz4.c 2019-08-15 13:59:59.000000000 +0200 -+++ lz4/lz4.c 2020-06-07 12:50:11.788924953 +0200 -@@ -1650,7 +1650,7 @@ +--- lz4/lz4.c ++++ lz4/lz4.c +@@ -1270,6 +1270,7 @@ int LZ4_compress_default(const char* src, char* dst, int srcSize, int maxOutputS + } + + ++int LZ4_compress_fast_force(const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); + /* hidden debug function */ + /* strangely enough, gcc generates faster code when this function is uncommented, even if unused */ + int LZ4_compress_fast_force(const char* src, char* dst, int srcSize, int dstCapacity, int acceleration) +@@ -1644,13 +1645,16 @@ read_variable_length(const BYTE**ip, const BYTE* lencheck, int loop_check, int i + return length; + } + ++int LZ4_decompress_generic(const char* const src, char* const dst, int srcSize, int outputSize, endCondition_directive endOnInput, earlyEnd_directive partialDecoding, ++ dict_directive dict, const BYTE* const lowPrefix, const BYTE* const dictStart, const size_t dictSize ); ++ + /*! LZ4_decompress_generic() : + * This generic decompression function covers all use cases. + * It shall be instantiated several times, using different sets of directives. * Note that it is important for performance that this function really get inlined, * in order to remove useless branches during compilation optimization. */ From 224cb2ffd7432824cec132a97fa02fc9106e4f92 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Mon, 8 Jun 2020 03:15:10 +0200 Subject: [PATCH 548/632] make style --- armsrc/Standalone/hf_colin.c | 8 +- armsrc/Standalone/hf_mattyrun.c | 8 +- armsrc/fpgaloader.c | 16 +- armsrc/start.c | 2 +- armsrc/string.c | 26 +- armsrc/string.h | 2 +- client/android/pm3_main.c | 20 +- client/deps/tinycbor/cbor.h | 4 +- client/luascripts/test_t55x7.lua | 2 +- client/luascripts/tracetest.lua | 2 +- client/pyscripts/xorcheck.py | 2 +- client/src/cmdhf15.c | 8 +- client/src/cmdhflto.c | 6 +- client/src/cmdhfmf.c | 10 +- client/src/cmdhfmfdes.c | 20 +- client/src/cmdhfmfu.c | 70 +- client/src/cmdlffdx.c | 4 +- client/src/cmdscript.c | 6 +- client/src/cmdsmartcard.c | 8 +- client/src/cmdtrace.c | 24 +- client/src/emv/cmdemv.c | 108 +-- client/src/emv/emvcore.c | 54 +- client/src/emv/test/sda_test.c | 4 +- client/src/fileutils.c | 38 +- client/src/fileutils.h | 2 +- client/src/jansson_path.c | 8 +- client/src/loclass/cipherutils.c | 12 +- client/src/loclass/elite_crack.c | 12 +- client/src/loclass/ikeys.c | 14 +- client/src/preferences.c | 2 +- common/lz4/lz4.c | 1156 ++++++++++++------------ common/lz4/lz4.h | 94 +- common/lz4/lz4hc.c | 1195 +++++++++++++------------ common/lz4/lz4hc.h | 106 ++- tools/fpga_compress/Makefile | 2 +- tools/fpga_compress/fpga_compress.c | 18 +- tools/hitag2crack/hitag2_gen_nRaR.py | 2 +- tools/mf_nonce_brute/mf_nonce_brute.c | 6 +- 38 files changed, 1531 insertions(+), 1550 deletions(-) diff --git a/armsrc/Standalone/hf_colin.c b/armsrc/Standalone/hf_colin.c index ba5c21cab..8e20ae414 100644 --- a/armsrc/Standalone/hf_colin.c +++ b/armsrc/Standalone/hf_colin.c @@ -330,11 +330,11 @@ void ModInfo(void) { void RunMod(void) { StandAloneMode(); FpgaDownloadAndGo(FPGA_BITSTREAM_HF); - Dbprintf(">> HF Mifare ultra fast sniff/sim/clone a.k.a VIGIKPWN Started <<"); + Dbprintf(">> HF Mifare ultra fast sniff/sim/clone a.k.a VIGIKPWN Started <<"); // turn off all debugging. DBGLEVEL = DBG_NONE; - + // add_schema(Schemas, Noralsy, &total_schemas); // add_schema(Schemas, InfiHexact, &total_schemas); // add_schema_from_json_in_spiffs((char *)HFCOLIN_URMETCAPTIVE_JSON); @@ -504,7 +504,7 @@ failtag: SpinOff(50); FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - + vtsend_cursor_position_restore(NULL); DbprintfEx(FLAG_NEWLINE, "\t\t\t%s[ GOT a Tag ! ]%s", _XGREEN_, _XWHITE_); cjSetCursLeft(); @@ -854,7 +854,7 @@ int cjat91_saMifareChkKeys(uint8_t blockNo, uint8_t keyType, bool clearTrace, pcs = &mpcs; int retval = -1; - + for (uint8_t i = 0; i < keyCount; i++) { /* no need for anticollision. just verify tag is still here */ diff --git a/armsrc/Standalone/hf_mattyrun.c b/armsrc/Standalone/hf_mattyrun.c index e6e099d7c..c0d603fbd 100644 --- a/armsrc/Standalone/hf_mattyrun.c +++ b/armsrc/Standalone/hf_mattyrun.c @@ -263,7 +263,7 @@ static int saMifareECardLoad(uint32_t numofsectors, uint8_t keytype) { retval = PM3_ESOFT; break; }; - + if (blockNo < NumBlocksPerSector(s) - 1) { emlSetMem(dataoutbuf, FirstBlockOfSector(s) + blockNo, 1); } else { @@ -356,7 +356,7 @@ void RunMod(void) { 0x89347350bd36, // INFINEON B 0B 0x66d2b7dc39ef, // INFINEON B 0C 0x6bc1e1ae547d, // INFINEON B 0D - 0x22729a9bd40f, // INFINEON B 0E + 0x22729a9bd40f, // INFINEON B 0E 0xd2ece8b9395e, // lib / Nat Bieb 0x1494E81663D7, // # NSCP default key 0x569369c5a0e5, // # kiev @@ -505,10 +505,10 @@ void RunMod(void) { if (ecfill) { int filled; Dbprintf("\tFilling in with key A."); - + filled = saMifareECardLoad(sectorsCnt, 0); if (filled != PM3_SUCCESS) { - + Dbprintf("\t [✕] Failed filling with A."); Dbprintf("\tFilling in with key B."); filled = saMifareECardLoad(sectorsCnt, 1); diff --git a/armsrc/fpgaloader.c b/armsrc/fpgaloader.c index bb50375f9..d0607d28d 100644 --- a/armsrc/fpgaloader.c +++ b/armsrc/fpgaloader.c @@ -23,12 +23,12 @@ #include "lz4.h" // uncompress typedef struct lz4_stream_s { - LZ4_streamDecode_t* lz4StreamDecode; - char * next_in; + LZ4_streamDecode_t *lz4StreamDecode; + char *next_in; int avail_in; } lz4_stream; -typedef lz4_stream* lz4_streamp; +typedef lz4_stream *lz4_streamp; // remember which version of the bitstream we have already downloaded to the FPGA static int downloaded_bitstream = 0; @@ -194,9 +194,9 @@ static int get_from_fpga_combined_stream(lz4_streamp compressed_fpga_stream, uin memcpy(&cmp_bytes, compressed_fpga_stream->next_in, sizeof(int)); compressed_fpga_stream->next_in += 4; compressed_fpga_stream->avail_in -= cmp_bytes + 4; - int res = LZ4_decompress_safe_continue(compressed_fpga_stream->lz4StreamDecode, + int res = LZ4_decompress_safe_continue(compressed_fpga_stream->lz4StreamDecode, compressed_fpga_stream->next_in, - (char*)output_buffer, + (char *)output_buffer, cmp_bytes, FPGA_RING_BUFFER_BYTES); if (res <= 0) { @@ -232,9 +232,9 @@ static bool reset_fpga_stream(int bitstream_version, lz4_streamp compressed_fpga uncompressed_bytes_cnt = 0; // initialize z_stream structure for inflate: - compressed_fpga_stream->next_in = (char*)&_binary_obj_fpga_all_bit_z_start; + compressed_fpga_stream->next_in = (char *)&_binary_obj_fpga_all_bit_z_start; compressed_fpga_stream->avail_in = &_binary_obj_fpga_all_bit_z_end - &_binary_obj_fpga_all_bit_z_start; - + int res = LZ4_setStreamDecode(compressed_fpga_stream->lz4StreamDecode, NULL, 0); if (res == 0) return false; @@ -415,7 +415,7 @@ void FpgaDownloadAndGo(int bitstream_version) { lz4_stream compressed_fpga_stream; LZ4_streamDecode_t lz4StreamDecode_body = {{ 0 }}; compressed_fpga_stream.lz4StreamDecode = &lz4StreamDecode_body; - uint8_t * output_buffer = BigBuf_malloc(FPGA_RING_BUFFER_BYTES); + uint8_t *output_buffer = BigBuf_malloc(FPGA_RING_BUFFER_BYTES); if (!reset_fpga_stream(bitstream_version, &compressed_fpga_stream, output_buffer)) return; diff --git a/armsrc/start.c b/armsrc/start.c index 11b1064ba..e2904f6e1 100644 --- a/armsrc/start.c +++ b/armsrc/start.c @@ -29,7 +29,7 @@ static void uncompress_data_section(void) { int avail_out = &__data_end__ - &__data_start__; // uncompressed size. Correct. // uncompress data segment to RAM uintptr_t p = (uintptr_t)&__data_src_start__; - int res = LZ4_decompress_safe((char*)p + 4, &__data_start__, avail_in, avail_out); + int res = LZ4_decompress_safe((char *)p + 4, &__data_start__, avail_in, avail_out); if (res < 0) return; diff --git a/armsrc/string.c b/armsrc/string.c index 300e911df..a3b49dcb1 100644 --- a/armsrc/string.c +++ b/armsrc/string.c @@ -20,21 +20,19 @@ void *memcpy(void *dest, const void *src, int len) { return dest; } -void *memmove (void *dest, const void *src, size_t len) -{ - char *d = dest; - const char *s = src; - if (d < s) - while (len--) - *d++ = *s++; - else - { - char *lasts = (char*)s + (len-1); - char *lastd = d + (len-1); - while (len--) - *lastd-- = *lasts--; +void *memmove(void *dest, const void *src, size_t len) { + char *d = dest; + const char *s = src; + if (d < s) + while (len--) + *d++ = *s++; + else { + char *lasts = (char *)s + (len - 1); + char *lastd = d + (len - 1); + while (len--) + *lastd-- = *lasts--; } - return dest; + return dest; } void *memset(void *dest, int c, int len) { diff --git a/armsrc/string.h b/armsrc/string.h index 53f8e8f71..f4d6e3fc1 100644 --- a/armsrc/string.h +++ b/armsrc/string.h @@ -16,7 +16,7 @@ int strlen(const char *str); void *memcpy(void *dest, const void *src, int len); -void *memmove (void *dest, const void *src, size_t len); +void *memmove(void *dest, const void *src, size_t len); void *memset(void *dest, int c, int len); int memcmp(const void *av, const void *bv, int len); void memxor(uint8_t *dest, uint8_t *src, size_t len); diff --git a/client/android/pm3_main.c b/client/android/pm3_main.c index 5d8d51059..f5f8cc7d7 100644 --- a/client/android/pm3_main.c +++ b/client/android/pm3_main.c @@ -88,7 +88,7 @@ jint Console(JNIEnv *env, jobject instance, jstring cmd_) { PrintAndLogEx(NORMAL, ""); - char *cmd = (char *) ((*env)->GetStringUTFChars(env, cmd_, 0)); + char *cmd = (char *)((*env)->GetStringUTFChars(env, cmd_, 0)); int ret = CommandReceived(cmd); if (ret == 99) { // exit / quit @@ -104,7 +104,7 @@ jint Console(JNIEnv *env, jobject instance, jstring cmd_) { * Is client running! * */ jboolean IsClientRunning(JNIEnv *env, jobject instance) { - return (jboolean) ((jboolean) conn.run); + return (jboolean)((jboolean) conn.run); } /* @@ -116,7 +116,7 @@ jboolean TestPm3(JNIEnv *env, jobject instance) { return false; } bool ret = (TestProxmark() == PM3_SUCCESS); - return (jboolean) (ret); + return (jboolean)(ret); } /* @@ -129,8 +129,8 @@ void ClosePm3(JNIEnv *env, jobject instance) { /* * native function map to jvm * */ - - //iceman: todo, pm3:ify java class root. Return codes, should match PM3_E* codes. + +//iceman: todo, pm3:ify java class root. Return codes, should match PM3_E* codes. JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { JNIEnv *jniEnv = NULL; if ((*vm)->GetEnv(vm, (void **) &jniEnv, JNI_VERSION_1_4) != JNI_OK) { @@ -143,14 +143,14 @@ JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { } jclass clz_test = (*jniEnv)->FindClass(jniEnv, "cn/rrg/devices/Proxmark3RRGRdv4"); JNINativeMethod methods[] = { - {"startExecute", "(Ljava/lang/String;)I", (void *) Console}, - {"stopExecute", "()V", (void *) ClosePm3}, - {"isExecuting", "()Z", (void *) IsClientRunning} + {"startExecute", "(Ljava/lang/String;)I", (void *) Console}, + {"stopExecute", "()V", (void *) ClosePm3}, + {"isExecuting", "()Z", (void *) IsClientRunning} }; JNINativeMethod methods1[] = { - {"testPm3", "()Z", (void *) TestPm3}, - {"closePm3", "()V", ClosePm3} + {"testPm3", "()Z", (void *) TestPm3}, + {"closePm3", "()V", ClosePm3} }; if ((*jniEnv)->RegisterNatives(jniEnv, clazz, methods, sizeof(methods) / sizeof(methods[0])) != JNI_OK) { diff --git a/client/deps/tinycbor/cbor.h b/client/deps/tinycbor/cbor.h index 6890ee597..e595caeb1 100644 --- a/client/deps/tinycbor/cbor.h +++ b/client/deps/tinycbor/cbor.h @@ -558,9 +558,9 @@ enum CborPrettyFlags { /* cf https://sourceforge.net/p/mingw-w64/wiki2/gnu%20printf/ */ typedef CborError(*CborStreamFunction)(void *token, const char *fmt, ...) #if defined(__MINGW32__) || defined(__MINGW64__) - __attribute__((format (__MINGW_PRINTF_FORMAT, 2, 3))); +__attribute__((format(__MINGW_PRINTF_FORMAT, 2, 3))); #elif defined(__GNUC__) - __attribute__((__format__(printf, 2, 3))) +__attribute__((__format__(printf, 2, 3))) #endif ; diff --git a/client/luascripts/test_t55x7.lua b/client/luascripts/test_t55x7.lua index f6e0e1ca2..4be0ed4b6 100644 --- a/client/luascripts/test_t55x7.lua +++ b/client/luascripts/test_t55x7.lua @@ -39,7 +39,7 @@ script run test_t55x7 [-h] [-t <modulation type> ]] arguments = [[ -h this help - -t (optional, defaults to ASK) 'PSK1', 'PSK2', 'PSK3', + -t (optional, defaults to ASK) 'PSK1', 'PSK2', 'PSK3', 'FSK1', 'FSK2', 'FSK1A', 'FSK2A', 'ASK', 'BI' ]] diff --git a/client/luascripts/tracetest.lua b/client/luascripts/tracetest.lua index e45d1ceba..b7e931b99 100644 --- a/client/luascripts/tracetest.lua +++ b/client/luascripts/tracetest.lua @@ -79,7 +79,7 @@ local function main(args) local cmdDataLoad = 'data load %s'; local cwd = core.cwd(); - + local tracesEM = "find '"..cwd.."/traces/ ' -iname 'em*.pm3' -type f" local tracesMOD = "find '"..cwd.."/traces/' -iname 'modulation*.pm3' -type f" diff --git a/client/pyscripts/xorcheck.py b/client/pyscripts/xorcheck.py index f4605a5e7..a10c3bba6 100755 --- a/client/pyscripts/xorcheck.py +++ b/client/pyscripts/xorcheck.py @@ -48,4 +48,4 @@ def main(): print('\nTarget (%02X) requires final LRC XOR byte value: %02X\n' % (target,lrc)) if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index 65946b7d5..627e7e4bc 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -1683,7 +1683,7 @@ static int CmdHF15Restore(const char *Cmd) { PrintAndLogEx(WARNING, "Could not find file " _YELLOW_("%s"), filename); return PM3_EFILE; } - + if ((datalen % blocksize) != 0) { PrintAndLogEx(WARNING, "Datalen %zu isn't dividable with blocksize %zu", datalen, blocksize); free(data); @@ -1704,7 +1704,7 @@ static int CmdHF15Restore(const char *Cmd) { if (addressed_mode) { char uidhex[17] = {0x00}; hex_to_buffer((uint8_t *)uidhex, uid, sizeof(uid), sizeof(uidhex) - 1, 0, false, true); - hex_to_buffer((uint8_t *)hex, data + i, blocksize, sizeof(hex) - 1, 0, false, true); + hex_to_buffer((uint8_t *)hex, data + i, blocksize, sizeof(hex) - 1, 0, false, true); snprintf(tmpCmd, sizeof(tmpCmd), "%s %s %u %s", newPrefix, uidhex, i, hex); } else { hex_to_buffer((uint8_t *)hex, data + i, blocksize, sizeof(hex) - 1, 0, false, true); @@ -1718,7 +1718,7 @@ static int CmdHF15Restore(const char *Cmd) { break; } } - + if (tried >= retries) { free(data); PrintAndLogEx(FAILED, "Restore failed. Too many retries."); @@ -1729,7 +1729,7 @@ static int CmdHF15Restore(const char *Cmd) { } free(data); PrintAndLogEx(INFO, "done"); - PrintAndLogEx(HINT, "Try reading your card to verify with " _YELLOW_("`hf 15 dump`") ); + PrintAndLogEx(HINT, "Try reading your card to verify with " _YELLOW_("`hf 15 dump`")); return PM3_SUCCESS; } diff --git a/client/src/cmdhflto.c b/client/src/cmdhflto.c index 5add871b1..c62289108 100644 --- a/client/src/cmdhflto.c +++ b/client/src/cmdhflto.c @@ -586,7 +586,7 @@ static int CmdHfLTRestore(const char *Cmd) { } } - if (errors || strlen(Cmd) == 0 ) { + if (errors || strlen(Cmd) == 0) { return usage_lto_restore(); } @@ -597,7 +597,7 @@ static int CmdHfLTRestore(const char *Cmd) { if (str_endswith(lowstr, ".bin")) { uint8_t *dump = NULL; - if (loadFile_safe(filename, "", (void**)&dump, &dump_len) == PM3_SUCCESS) { + if (loadFile_safe(filename, "", (void **)&dump, &dump_len) == PM3_SUCCESS) { restoreLTO(dump, true); } free(dump); @@ -605,7 +605,7 @@ static int CmdHfLTRestore(const char *Cmd) { } else if (str_endswith(lowstr, ".eml")) { uint8_t *dump = NULL; - if (loadFileEML_safe(filename, (void**)&dump, &dump_len) == PM3_SUCCESS) { + if (loadFileEML_safe(filename, (void **)&dump, &dump_len) == PM3_SUCCESS) { restoreLTO(dump, true); } free(dump); diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 7fe84f55e..983055924 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -3533,7 +3533,7 @@ int CmdHF14AMfELoad(const char *Cmd) { PrintAndLogEx(WARNING, "Fail, cannot allocate memory"); return PM3_EMALLOC; } - + size_t datalen = 0; //int res = loadFile(filename, ".bin", data, maxdatalen, &datalen); int res = loadFileEML(filename, data, &datalen); @@ -3552,24 +3552,24 @@ int CmdHF14AMfELoad(const char *Cmd) { // convert plain or old mfu format to new format if (blockWidth == 4) { - res = convert_mfu_dump_format(&data, &datalen, true); + res = convert_mfu_dump_format(&data, &datalen, true); if (res != PM3_SUCCESS) { PrintAndLogEx(FAILED, "Failed convert on load to new Ultralight/NTAG format"); free(data); return res; } - + mfu_dump_t *mfu_dump = (mfu_dump_t *)data; PrintAndLogEx(INFO, _CYAN_("MFU dump file information")); PrintAndLogEx(INFO, " version %s", sprint_hex(mfu_dump->version, sizeof(mfu_dump->version))); PrintAndLogEx(INFO, " tb 0 %s", sprint_hex(mfu_dump->tbo, sizeof(mfu_dump->tbo))); PrintAndLogEx(INFO, " tb 1 %s", sprint_hex(mfu_dump->tbo1, sizeof(mfu_dump->tbo1))); - for(uint8_t m = 0; m < 3; m++) { + for (uint8_t m = 0; m < 3; m++) { PrintAndLogEx(INFO, " counter %d %s - tearing 0x%02x", m + 1, sprint_hex(mfu_dump->counter_tearing[m], 3), mfu_dump->counter_tearing[m][3]); } PrintAndLogEx(INFO, " signature %s", sprint_hex(mfu_dump->signature, sizeof(mfu_dump->signature))); - PrintAndLogEx(INFO, " data %s... (only first 8 bytes showing)", sprint_hex(mfu_dump->data, 8)); + PrintAndLogEx(INFO, " data %s... (only first 8 bytes showing)", sprint_hex(mfu_dump->data, 8)); PrintAndLogEx(INFO, " max data page %d, data len %d bytes", mfu_dump->pages, (mfu_dump->pages + 1) * 4); PrintAndLogEx(INFO, " file header size %d", MFU_DUMP_PREFIX_LENGTH); PrintAndLogEx(INFO, "----------------------------------------------"); diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index d56218e4b..0f383fd0a 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -3577,9 +3577,9 @@ static int CmdHF14ADesAuth(const char *Cmd) { } static void DesFill2bPattern( - uint8_t deskeyList[MAX_KEYS_LIST_LEN][8], uint32_t *deskeyListLen, - uint8_t aeskeyList[MAX_KEYS_LIST_LEN][16], uint32_t *aeskeyListLen, - uint8_t k3kkeyList[MAX_KEYS_LIST_LEN][24], uint32_t *k3kkeyListLen, uint32_t *startPattern) { + uint8_t deskeyList[MAX_KEYS_LIST_LEN][8], uint32_t *deskeyListLen, + uint8_t aeskeyList[MAX_KEYS_LIST_LEN][16], uint32_t *aeskeyListLen, + uint8_t k3kkeyList[MAX_KEYS_LIST_LEN][24], uint32_t *k3kkeyListLen, uint32_t *startPattern) { for (uint32_t pt = *startPattern; pt < 0x10000; pt++) { if (*deskeyListLen != MAX_KEYS_LIST_LEN) { @@ -3618,10 +3618,10 @@ static void DesFill2bPattern( } static int AuthCheckDesfire(uint8_t *aid, - uint8_t deskeyList[MAX_KEYS_LIST_LEN][8], uint32_t deskeyListLen, - uint8_t aeskeyList[MAX_KEYS_LIST_LEN][16], uint32_t aeskeyListLen, - uint8_t k3kkeyList[MAX_KEYS_LIST_LEN][24], uint32_t k3kkeyListLen, - uint8_t foundKeys[4][0xE][24 + 1], bool *result) { + uint8_t deskeyList[MAX_KEYS_LIST_LEN][8], uint32_t deskeyListLen, + uint8_t aeskeyList[MAX_KEYS_LIST_LEN][16], uint32_t aeskeyListLen, + uint8_t k3kkeyList[MAX_KEYS_LIST_LEN][24], uint32_t k3kkeyListLen, + uint8_t foundKeys[4][0xE][24 + 1], bool *result) { uint32_t curaid = (aid[0] & 0xFF) + ((aid[1] & 0xFF) << 8) + ((aid[2] & 0xFF) << 16); @@ -4078,17 +4078,17 @@ static int CmdHF14aDesChk(const char *Cmd) { res = loadFileDICTIONARYEx((char *)dict_filename, deskeyList, sizeof(deskeyList), NULL, 16, &keycnt, endFilePosition, &endFilePosition, false); if (res == PM3_SUCCESS && endFilePosition) deskeyListLen = keycnt; - + keycnt = 0; res = loadFileDICTIONARYEx((char *)dict_filename, aeskeyList, sizeof(aeskeyList), NULL, 16, &keycnt, endFilePosition, &endFilePosition, false); if (res == PM3_SUCCESS && endFilePosition) aeskeyListLen = keycnt; - + keycnt = 0; res = loadFileDICTIONARYEx((char *)dict_filename, k3kkeyList, sizeof(k3kkeyList), NULL, 16, &keycnt, endFilePosition, &endFilePosition, false); if (res == PM3_SUCCESS && endFilePosition) k3kkeyListLen = keycnt; - + continue; } } diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index ed7e7d358..dece50f3b 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -1055,39 +1055,39 @@ uint32_t GetHF14AMfU_Type(void) { case 0x0A: { /* MF0UL1001DUx 0004030100000B03 -MF0UL1101DUx 0004030101000B03 -MF0ULH1101DUx 0004030201000B03 -MF0UL1141DUF 0004030301000B03 -MF0UL2101Dxy 0004030101000E03 -MF0UL2101DUx 0004030201000E03 -MF0UL3101DUx 0004030101001103 -MF0ULH3101DUx 0004030201001103 -MF0UL5101DUx 0004030101001303 -NT2L1011F0DUx 0004040101000B03 -NT2H1011G0DUD 0004040201000B03 -NT2L1211F0DUx 0004040101000E03 -NT2H1311G0DUx 0004040201000F03 -NT2H1311F0Dxy 0004040401000F03 -NT2H1411G0DUx 0004040201011103 -NT2H1511G0DUx 0004040201001103 -NT2H1511F0Dxy 0004040401001103 -NT2H1611G0DUx 0004040201001303 -NT2H1611F0Dxy 0004040401001303 -NT2H1311C1DTL 0004040201010F03 -NT2H1311TTDUx 0004040203000F03 -NT3H1101W0FHK 0004040502001303 -NT3H1201W0FHK 0004040502001503 -NT3H1101W0FHK_Variant 0004040502011303 -NT3H1201 0004040502011503 -NT3H2111 0004040502021303 -NT3H2211 0004040502021503 -nhs 0004040600001303 -MF0UN0001DUx 0004030102000B03 -MF0UNH0001DUx 0004030202000B03 -MF0UN1001DUx 0004030103000B03 -MF0UNH1001DUx 0004030203000B03 -NT2L1001G0DUx 0004040102000B03 -NT2H1001G0DUx 0004040202000B03 + MF0UL1101DUx 0004030101000B03 + MF0ULH1101DUx 0004030201000B03 + MF0UL1141DUF 0004030301000B03 + MF0UL2101Dxy 0004030101000E03 + MF0UL2101DUx 0004030201000E03 + MF0UL3101DUx 0004030101001103 + MF0ULH3101DUx 0004030201001103 + MF0UL5101DUx 0004030101001303 + NT2L1011F0DUx 0004040101000B03 + NT2H1011G0DUD 0004040201000B03 + NT2L1211F0DUx 0004040101000E03 + NT2H1311G0DUx 0004040201000F03 + NT2H1311F0Dxy 0004040401000F03 + NT2H1411G0DUx 0004040201011103 + NT2H1511G0DUx 0004040201001103 + NT2H1511F0Dxy 0004040401001103 + NT2H1611G0DUx 0004040201001303 + NT2H1611F0Dxy 0004040401001303 + NT2H1311C1DTL 0004040201010F03 + NT2H1311TTDUx 0004040203000F03 + NT3H1101W0FHK 0004040502001303 + NT3H1201W0FHK 0004040502001503 + NT3H1101W0FHK_Variant 0004040502011303 + NT3H1201 0004040502011503 + NT3H2111 0004040502021303 + NT3H2211 0004040502021503 + nhs 0004040600001303 + MF0UN0001DUx 0004030102000B03 + MF0UNH0001DUx 0004030202000B03 + MF0UN1001DUx 0004030103000B03 + MF0UNH1001DUx 0004030203000B03 + NT2L1001G0DUx 0004040102000B03 + NT2H1001G0DUx 0004040202000B03 */ if (memcmp(version, "\x00\x04\x03\x01\x01\x00\x0B", 7) == 0) { tagtype = UL_EV1_48; break; } @@ -2189,7 +2189,7 @@ static int CmdHF14AMfURestore(const char *Cmd) { uint8_t *dump = NULL; size_t bytes_read = 0; - if (loadFile_safe(filename, "", (void**)&dump, &bytes_read) != PM3_SUCCESS) { + if (loadFile_safe(filename, "", (void **)&dump, &bytes_read) != PM3_SUCCESS) { PrintAndLogEx(WARNING, "Could not find file " _YELLOW_("%s"), filename); return PM3_EIO; } @@ -2200,7 +2200,7 @@ static int CmdHF14AMfURestore(const char *Cmd) { return PM3_ESOFT; } - int res = convert_mfu_dump_format(&dump, &bytes_read, verbose); + int res = convert_mfu_dump_format(&dump, &bytes_read, verbose); if (res != PM3_SUCCESS) { PrintAndLogEx(FAILED, "Failed convert on load to new Ultralight/NTAG format"); free(dump); diff --git a/client/src/cmdlffdx.c b/client/src/cmdlffdx.c index def872fde..c9af2fffc 100644 --- a/client/src/cmdlffdx.c +++ b/client/src/cmdlffdx.c @@ -266,8 +266,8 @@ int demodFDX(void) { } uint8_t bt_par = (extended & 0x100) >> 8; - uint8_t bt_temperature = extended & 0xff; - uint8_t bt_calc_parity = (bitcount(bt_temperature) & 0x1) ? 0 : 1; + uint8_t bt_temperature = extended & 0xff; + uint8_t bt_calc_parity = (bitcount(bt_temperature) & 0x1) ? 0 : 1; uint8_t is_bt_temperature = (bt_calc_parity == bt_par) && !(extended & 0xe00) ; if (is_bt_temperature) { diff --git a/client/src/cmdscript.c b/client/src/cmdscript.c index 4e9c5fc1f..24fd5ec37 100644 --- a/client/src/cmdscript.c +++ b/client/src/cmdscript.c @@ -84,7 +84,7 @@ static void set_python_path(char *path) { } if (PySys_SetObject("path", syspath)) { - PrintAndLogEx(WARNING,"Error setting sys.path object"); + PrintAndLogEx(WARNING, "Error setting sys.path object"); } } @@ -300,10 +300,10 @@ static int CmdScriptRun(const char *Cmd) { wchar_t *py_args[argc]; py_args[0] = Py_DecodeLocale(preferredName, NULL); for (int i = 0; i < argc; i++) { - py_args[i+1] = Py_DecodeLocale(argv[i], NULL); + py_args[i + 1] = Py_DecodeLocale(argv[i], NULL); } - PySys_SetArgv(argc+1, py_args); + PySys_SetArgv(argc + 1, py_args); // clean up for (int i = 0; i < argc; ++i) { diff --git a/client/src/cmdsmartcard.c b/client/src/cmdsmartcard.c index 63b32890e..2931b33fd 100644 --- a/client/src/cmdsmartcard.c +++ b/client/src/cmdsmartcard.c @@ -509,11 +509,11 @@ static int CmdSmartRaw(const char *Cmd) { TLVPrintFromBuffer(buf, len - 2); else { if (len > 16) { - for (int i=0; i<len; i += 16) { + for (int i = 0; i < len; i += 16) { PrintAndLogEx(SUCCESS, "%s", sprint_hex_ascii(buf + i, 16)) ; } } else { - PrintAndLogEx(SUCCESS, "%s", sprint_hex_ascii(buf, len)) ; + PrintAndLogEx(SUCCESS, "%s", sprint_hex_ascii(buf, len)) ; } } @@ -577,7 +577,7 @@ static int CmdSmartUpgrade(const char *Cmd) { // load firmware file size_t firmware_size = 0; uint8_t *firmware = NULL; - if (loadFile_safe(filename, "", (void**)&firmware, &firmware_size) != PM3_SUCCESS) { + if (loadFile_safe(filename, "", (void **)&firmware, &firmware_size) != PM3_SUCCESS) { PrintAndLogEx(FAILED, "Firmware file " _YELLOW_("%s") " not found or locked.", filename); return PM3_EFILE; } @@ -585,7 +585,7 @@ static int CmdSmartUpgrade(const char *Cmd) { // load sha512 file size_t sha512_size = 0; char *hashstring = NULL; - if (loadFile_safe(sha512filename, "", (void**)&hashstring, &sha512_size) != PM3_SUCCESS) { + if (loadFile_safe(sha512filename, "", (void **)&hashstring, &sha512_size) != PM3_SUCCESS) { PrintAndLogEx(FAILED, "SHA-512 file not found or locked."); free(firmware); return PM3_EFILE; diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index c142973d9..04b71d677 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -95,7 +95,7 @@ static bool merge_topaz_reader_frames(uint32_t timestamp, uint32_t *duration, ui while (!is_last_record(*tracepos, traceLen) && !next_record_is_response(*tracepos, trace)) { tracelog_hdr_t *hdr = (tracelog_hdr_t *)(trace + *tracepos); - + *tracepos += TRACELOG_HDR_LEN + hdr->data_len; if ((hdr->data_len == 1) && (*data_len + hdr->data_len <= MAX_TOPAZ_READER_CMD_LEN)) { @@ -153,7 +153,7 @@ static uint16_t printHexLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trac char data_len_str[5]; char temp_str1[3] = {0}; char temp_str2[3] = {0}; - + sprintf(data_len_str, "%04x", hdr->data_len); strncat(temp_str1, data_len_str, 2); temp_str1[2] = '\0'; @@ -257,10 +257,10 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr //1 CRC-command, CRC ok //2 Not crc-command - //--- Draw the data column + //--- Draw the data column char line[18][120] = {{0}}; - if (data_len == 0) { + if (data_len == 0) { sprintf(line[0], "<empty trace - possible error>"); return tracepos; } @@ -401,9 +401,9 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr if (is_last_record(tracepos, traceLen)) return traceLen; if (showWaitCycles && !hdr->isResponse && next_record_is_response(tracepos, trace)) { - + tracelog_hdr_t *next_hdr = (tracelog_hdr_t *)(trace + tracepos); - + PrintAndLogEx(NORMAL, " %10u | %10u | %s |fdt (Frame Delay Time): %d", (EndOfTransmissionTimestamp - first_hdr->timestamp), (next_hdr->timestamp - first_hdr->timestamp), @@ -415,7 +415,7 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr } static int download_trace(void) { - + if (!IfPm3Present()) { PrintAndLogEx(FAILED, "You requested a trace upload in offline mode, consider using parameter '1' for working from Tracebuffer"); return PM3_EINVARG; @@ -487,23 +487,23 @@ static int CmdTraceLoad(const char *Cmd) { free(g_trace); size_t len = 0; - if (loadFile_safe(filename, ".trace", (void**)&g_trace, &len) != PM3_SUCCESS) { + if (loadFile_safe(filename, ".trace", (void **)&g_trace, &len) != PM3_SUCCESS) { PrintAndLogEx(FAILED, "Could not open file " _YELLOW_("%s"), filename); return PM3_EIO; } - + g_traceLen = (long)len; - + PrintAndLogEx(SUCCESS, "Recorded Activity (TraceLen = " _YELLOW_("%lu") " bytes) loaded from " _YELLOW_("%s"), g_traceLen, filename); return PM3_SUCCESS; } static int CmdTraceSave(const char *Cmd) { - + if (g_traceLen == 0) { download_trace(); } - + if (g_traceLen == 0) { PrintAndLogEx(WARNING, "trace is empty, nothing to save"); return PM3_SUCCESS; diff --git a/client/src/emv/cmdemv.c b/client/src/emv/cmdemv.c index f1e047c15..f2a99add1 100644 --- a/client/src/emv/cmdemv.c +++ b/client/src/emv/cmdemv.c @@ -1380,7 +1380,7 @@ static int CmdEMVScan(const char *Cmd) { uint8_t buf[APDU_RES_LEN] = {0}; size_t len = 0; uint8_t ODAI_list[4096]; - size_t ODAI_listlen = 0; + size_t ODAI_listlen = 0; uint16_t sw = 0; int res; json_t *root; @@ -1683,24 +1683,24 @@ static int CmdEMVScan(const char *Cmd) { } // Build Input list for Offline Data Authentication - // EMV 4.3 book3 10.3, page 96 - if (first_time && SFIoffline) { - if (SFI < 11) { - const unsigned char *abuf = buf; - size_t elmlen = len; - struct tlv e; - if (tlv_parse_tl(&abuf, &elmlen, &e)) { - memcpy(ODAI_list + ODAI_listlen, &buf[len - elmlen], elmlen); - ODAI_listlen += elmlen; - } else { - PrintAndLogEx(WARNING, "Error SFI[%02x]. Creating input list for Offline Data Authentication error", SFI); - } - } else { - memcpy(ODAI_list + ODAI_listlen, buf, len); - ODAI_listlen += len; - } - first_time = false; - } + // EMV 4.3 book3 10.3, page 96 + if (first_time && SFIoffline) { + if (SFI < 11) { + const unsigned char *abuf = buf; + size_t elmlen = len; + struct tlv e; + if (tlv_parse_tl(&abuf, &elmlen, &e)) { + memcpy(ODAI_list + ODAI_listlen, &buf[len - elmlen], elmlen); + ODAI_listlen += elmlen; + } else { + PrintAndLogEx(WARNING, "Error SFI[%02x]. Creating input list for Offline Data Authentication error", SFI); + } + } else { + memcpy(ODAI_list + ODAI_listlen, buf, len); + ODAI_listlen += len; + } + first_time = false; + } if (decodeTLV) { TLVPrintFromBuffer(buf, len); @@ -1720,18 +1720,18 @@ static int CmdEMVScan(const char *Cmd) { else JsonSaveTLVTreeElm(jsonelm, "$.Data", rsfi, true, true, false); - tlvdb_free(rsfi); + tlvdb_free(rsfi); } } break; } // copy Input list for Offline Data Authentication - if (ODAI_listlen) { - struct tlvdb *oda = tlvdb_fixed(0x21, ODAI_listlen, ODAI_list); // not a standard tag - tlvdb_add(tlvRoot, oda); - PrintAndLogEx(INFO, "Input list for Offline Data Authentication added to TLV [%zu bytes]", ODAI_listlen); - } + if (ODAI_listlen) { + struct tlvdb *oda = tlvdb_fixed(0x21, ODAI_listlen, ODAI_list); // not a standard tag + tlvdb_add(tlvRoot, oda); + PrintAndLogEx(INFO, "Input list for Offline Data Authentication added to TLV [%zu bytes]", ODAI_listlen); + } // getting certificates if (tlvdb_get(tlvRoot, 0x90, NULL)) { @@ -1791,7 +1791,7 @@ static int CmdEMVRoca(const char *Cmd) { size_t len = 0; uint16_t sw = 0; uint8_t ODAI_list[4096]; - size_t ODAI_listlen = 0; + size_t ODAI_listlen = 0; int res; CLIParserContext *ctx; @@ -1955,26 +1955,26 @@ static int CmdEMVRoca(const char *Cmd) { PrintAndLogEx(ERR, "SFI[%02x]. APDU error %4x", SFI, sw); continue; } - - // Build Input list for Offline Data Authentication - // EMV 4.3 book3 10.3, page 96 - if (SFIoffline > 0) { - if (SFI < 11) { - const unsigned char *abuf = buf; - size_t elmlen = len; - struct tlv e; - if (tlv_parse_tl(&abuf, &elmlen, &e)) { - memcpy(ODAI_list + ODAI_listlen, &buf[len - elmlen], elmlen); - ODAI_listlen += elmlen; - } else { - PrintAndLogEx(WARNING, "Error SFI[%02x]. Creating input list for Offline Data Authentication error", SFI); - } - } else { - memcpy(ODAI_list + ODAI_listlen, buf, len); - ODAI_listlen += len; - } - SFIoffline--; - } + + // Build Input list for Offline Data Authentication + // EMV 4.3 book3 10.3, page 96 + if (SFIoffline > 0) { + if (SFI < 11) { + const unsigned char *abuf = buf; + size_t elmlen = len; + struct tlv e; + if (tlv_parse_tl(&abuf, &elmlen, &e)) { + memcpy(ODAI_list + ODAI_listlen, &buf[len - elmlen], elmlen); + ODAI_listlen += elmlen; + } else { + PrintAndLogEx(WARNING, "Error SFI[%02x]. Creating input list for Offline Data Authentication error", SFI); + } + } else { + memcpy(ODAI_list + ODAI_listlen, buf, len); + ODAI_listlen += len; + } + SFIoffline--; + } } } break; @@ -1982,14 +1982,14 @@ static int CmdEMVRoca(const char *Cmd) { // getting certificates int ret = PM3_SUCCESS; - + // copy Input list for Offline Data Authentication - if (ODAI_listlen) { - struct tlvdb *oda = tlvdb_fixed(0x21, ODAI_listlen, ODAI_list); // not a standard tag - tlvdb_add(tlvRoot, oda); - PrintAndLogEx(INFO, "Input list for Offline Data Authentication added to TLV [%zu bytes]", ODAI_listlen); - } - + if (ODAI_listlen) { + struct tlvdb *oda = tlvdb_fixed(0x21, ODAI_listlen, ODAI_list); // not a standard tag + tlvdb_add(tlvRoot, oda); + PrintAndLogEx(INFO, "Input list for Offline Data Authentication added to TLV [%zu bytes]", ODAI_listlen); + } + if (tlvdb_get(tlvRoot, 0x90, NULL)) { PrintAndLogEx(INFO, "Recovering certificates"); PKISetStrictExecution(false); @@ -2025,7 +2025,7 @@ static int CmdEMVRoca(const char *Cmd) { ret = PM3_ESOFT; goto out; } - + PrintAndLogEx(SUCCESS, "ICC Public key recovered RID " _YELLOW_("%s") " IDX " _YELLOW_("%02hhx") " CSN " _YELLOW_("%s"), sprint_hex(icc_pk->rid, 5), icc_pk->index, diff --git a/client/src/emv/emvcore.c b/client/src/emv/emvcore.c index 2f9c82b1d..23de78c7d 100644 --- a/client/src/emv/emvcore.c +++ b/client/src/emv/emvcore.c @@ -309,7 +309,7 @@ static int EMVExchangeEx(EMVCommandChannel channel, bool ActivateField, bool Lea res = 1; if (IfPm3Smartcard()) res = ExchangeAPDUSC(true, data, datalen, ActivateField, LeaveFieldON, Result, (int)MaxResultLen, (int *)ResultLen); - + if (res) { return res; } @@ -677,12 +677,12 @@ int trSDA(struct tlvdb *tlv) { PrintAndLogEx(ERR, "Error: Issuer certificate not found, exiting"); return 2; } - + PrintAndLogEx(SUCCESS, "Issuer Public key recovered RID " _YELLOW_("%s") " IDX " _YELLOW_("%02hhx") " CSN " _YELLOW_("%s"), - sprint_hex(issuer_pk->rid, 5), - issuer_pk->index, - sprint_hex(issuer_pk->serial, 3) - ); + sprint_hex(issuer_pk->rid, 5), + issuer_pk->index, + sprint_hex(issuer_pk->serial, 3) + ); const struct tlv *sda_tlv = tlvdb_get(tlv, 0x21, NULL); if (!sda_tlv || sda_tlv->len < 1) { @@ -736,12 +736,12 @@ int trDDA(EMVCommandChannel channel, bool decodeTLV, struct tlvdb *tlv) { PrintAndLogEx(ERR, "Error: Issuer certificate not found, exiting"); return 2; } - + PrintAndLogEx(SUCCESS, "Issuer Public key recovered RID " _YELLOW_("%s") " IDX " _YELLOW_("%02hhx") " CSN " _YELLOW_("%s"), - sprint_hex(issuer_pk->rid, 5), - issuer_pk->index, - sprint_hex(issuer_pk->serial, 3) - ); + sprint_hex(issuer_pk->rid, 5), + issuer_pk->index, + sprint_hex(issuer_pk->serial, 3) + ); struct emv_pk *icc_pk = emv_pki_recover_icc_cert(issuer_pk, tlv, sda_tlv); if (!icc_pk) { @@ -765,7 +765,7 @@ int trDDA(EMVCommandChannel channel, bool decodeTLV, struct tlvdb *tlv) { PrintAndLogEx(SUCCESS, "ICC PE Public key recovered. RID " _YELLOW_("%s") " IDX " _YELLOW_("%02hhx") " CSN " _YELLOW_("%s"), sprint_hex(icc_pe_pk->rid, 5), icc_pe_pk->index, - sprint_hex(icc_pe_pk->serial,3) + sprint_hex(icc_pe_pk->serial, 3) ); } } else { @@ -943,12 +943,12 @@ int trCDA(struct tlvdb *tlv, struct tlvdb *ac_tlv, struct tlv *pdol_data_tlv, st emv_pk_free(pk); return 2; } - + PrintAndLogEx(SUCCESS, "Issuer Public key recovered RID " _YELLOW_("%s") " IDX " _YELLOW_("%02hhx") " CSN " _YELLOW_("%s"), - sprint_hex(issuer_pk->rid, 5), - issuer_pk->index, - sprint_hex(issuer_pk->serial, 3) - ); + sprint_hex(issuer_pk->rid, 5), + issuer_pk->index, + sprint_hex(issuer_pk->serial, 3) + ); struct emv_pk *icc_pk = emv_pki_recover_icc_cert(issuer_pk, tlv, sda_tlv); if (!icc_pk) { @@ -961,7 +961,7 @@ int trCDA(struct tlvdb *tlv, struct tlvdb *ac_tlv, struct tlv *pdol_data_tlv, st PrintAndLogEx(SUCCESS, "ICC Public key recovered. RID " _YELLOW_("%s") " IDX " _YELLOW_("%02hhx") " CSN " _YELLOW_("%s"), sprint_hex(icc_pk->rid, 5), icc_pk->index, - sprint_hex(icc_pk->serial,3) + sprint_hex(icc_pk->serial, 3) ); struct tlvdb *dac_db = emv_pki_recover_dac(issuer_pk, tlv, sda_tlv); @@ -1013,10 +1013,10 @@ int RecoveryCertificates(struct tlvdb *tlvRoot, json_t *root) { } PrintAndLogEx(SUCCESS, "Issuer Public key recovered RID " _YELLOW_("%s") " IDX " _YELLOW_("%02hhx") " CSN " _YELLOW_("%s"), - sprint_hex(issuer_pk->rid, 5), - issuer_pk->index, - sprint_hex(issuer_pk->serial, 3) - ); + sprint_hex(issuer_pk->rid, 5), + issuer_pk->index, + sprint_hex(issuer_pk->serial, 3) + ); JsonSaveBufAsHex(root, "$.ApplicationData.RID", issuer_pk->rid, 5); @@ -1033,12 +1033,12 @@ int RecoveryCertificates(struct tlvdb *tlvRoot, json_t *root) { PrintAndLogEx(WARNING, "WARNING: ICC certificate not found, exiting"); return 2; } - + PrintAndLogEx(SUCCESS, "ICC Public key recovered RID " _YELLOW_("%s") " IDX " _YELLOW_("%02hhx") " CSN " _YELLOW_("%s"), - sprint_hex(icc_pk->rid, 5), - icc_pk->index, - sprint_hex(icc_pk->serial, 3) - ); + sprint_hex(icc_pk->rid, 5), + icc_pk->index, + sprint_hex(icc_pk->serial, 3) + ); char *icc_pk_c = emv_pk_dump_pk(icc_pk); JsonSaveStr(root, "$.ApplicationData.ICCPublicKeyDec", icc_pk_c); diff --git a/client/src/emv/test/sda_test.c b/client/src/emv/test/sda_test.c index 3907027ad..04f3b70ae 100644 --- a/client/src/emv/test/sda_test.c +++ b/client/src/emv/test/sda_test.c @@ -219,7 +219,7 @@ static int sda_test_pk(bool verbose) { struct emv_pk *ipk = emv_pki_recover_issuer_cert(pk, db); if (!ipk) { - PrintAndLogEx(WARNING, "Could not recover Issuer certificate!"); + PrintAndLogEx(WARNING, "Could not recover Issuer certificate!"); tlvdb_free(db); return 2; } @@ -269,4 +269,4 @@ int exec_sda_test(bool verbose) { } PrintAndLogEx(SUCCESS, "SDA test pk: %s", _GREEN_("passed")); return 0; -} \ No newline at end of file +} diff --git a/client/src/fileutils.c b/client/src/fileutils.c index c27dc0a15..93689d2fa 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -832,7 +832,7 @@ int loadFileEML(const char *preferredName, void *data, size_t *datalen) { continue; strcleanrn(line, sizeof(line)); - + int res = param_gethex_to_eol(line, 0, buf, sizeof(buf), &hexlen); if (res == 0) { memcpy(udata + counter, buf, hexlen); @@ -884,7 +884,7 @@ int loadFileEML_safe(const char *preferredName, void **pdata, size_t *datalen) { fclose(f); return PM3_EMALLOC; } - + // 128 + 2 newline chars + 1 null terminator char line[131]; memset(line, 0, sizeof(line)); @@ -911,10 +911,10 @@ int loadFileEML_safe(const char *preferredName, void **pdata, size_t *datalen) { continue; strcleanrn(line, sizeof(line)); - + res = param_gethex_to_eol(line, 0, buf, sizeof(buf), &hexlen); if (res == 0) { - memcpy( tmp + counter, buf, hexlen); + memcpy(tmp + counter, buf, hexlen); counter += hexlen; } else { retval = PM3_ESOFT; @@ -1286,11 +1286,11 @@ mfu_df_e detect_mfu_dump_format(uint8_t **dump, size_t *dumplen, bool verbose) { mfu_df_e retval = MFU_DF_UNKNOWN; uint8_t bcc0, bcc1; uint8_t ct = 0x88; - + // detect new mfu_dump_t *new = (mfu_dump_t *)*dump; bcc0 = ct ^ new->data[0] ^ new->data[1] ^ new->data[2]; - bcc1 = new->data[4] ^ new->data[5] ^ new->data[6] ^ new->data[7]; + bcc1 = new->data[4] ^ new->data[5] ^ new->data[6] ^ new->data[7]; if (bcc0 == new->data[3] && bcc1 == new->data[8]) { retval = MFU_DF_NEWBIN; } @@ -1316,8 +1316,8 @@ mfu_df_e detect_mfu_dump_format(uint8_t **dump, size_t *dumplen, bool verbose) { } if (verbose) { - switch(retval) { - case MFU_DF_NEWBIN: + switch (retval) { + case MFU_DF_NEWBIN: PrintAndLogEx(INFO, "detected " _GREEN_("new") " mfu dump format"); break; case MFU_DF_OLDBIN: @@ -1335,8 +1335,8 @@ mfu_df_e detect_mfu_dump_format(uint8_t **dump, size_t *dumplen, bool verbose) { } static int convert_plain_mfu_dump(uint8_t **dump, size_t *dumplen, bool verbose) { - - mfu_dump_t *mfu = (mfu_dump_t *) calloc( sizeof(mfu_dump_t), sizeof(uint8_t)); + + mfu_dump_t *mfu = (mfu_dump_t *) calloc(sizeof(mfu_dump_t), sizeof(uint8_t)); if (mfu == NULL) { return PM3_EMALLOC; } @@ -1344,11 +1344,11 @@ static int convert_plain_mfu_dump(uint8_t **dump, size_t *dumplen, bool verbose) memcpy(mfu->data, *dump, *dumplen); mfu->pages = *dumplen / 4 - 1; - + if (verbose) { PrintAndLogEx(SUCCESS, "plain mfu dump format was converted to " _GREEN_("%d") " blocks", mfu->pages + 1); } - + *dump = (uint8_t *)mfu; *dumplen += MFU_DUMP_PREFIX_LENGTH ; return PM3_SUCCESS; @@ -1361,8 +1361,8 @@ static int convert_old_mfu_dump(uint8_t **dump, size_t *dumplen, bool verbose) { size_t old_data_len = *dumplen - OLD_MFU_DUMP_PREFIX_LENGTH; size_t new_dump_len = old_data_len + MFU_DUMP_PREFIX_LENGTH; - - mfu_dump_t *mfu_dump = (mfu_dump_t *) calloc( sizeof(mfu_dump_t), sizeof(uint8_t)); + + mfu_dump_t *mfu_dump = (mfu_dump_t *) calloc(sizeof(mfu_dump_t), sizeof(uint8_t)); if (mfu_dump == NULL) { return PM3_EMALLOC; } @@ -1370,7 +1370,7 @@ static int convert_old_mfu_dump(uint8_t **dump, size_t *dumplen, bool verbose) { memcpy(mfu_dump->version, old_mfu_dump->version, sizeof(mfu_dump->version)); memcpy(mfu_dump->tbo, old_mfu_dump->tbo, sizeof(mfu_dump->tbo)); memcpy(mfu_dump->signature, old_mfu_dump->signature, sizeof(mfu_dump->signature)); - + mfu_dump->tbo1[0] = old_mfu_dump->tbo1[0]; for (int i = 0; i < 3; i++) { @@ -1381,7 +1381,7 @@ static int convert_old_mfu_dump(uint8_t **dump, size_t *dumplen, bool verbose) { mfu_dump->pages = old_data_len / 4 - 1; - if (verbose) { + if (verbose) { PrintAndLogEx(SUCCESS, "old mfu dump format was converted to " _GREEN_("%d") " blocks", mfu_dump->pages + 1); } @@ -1396,11 +1396,11 @@ int convert_mfu_dump_format(uint8_t **dump, size_t *dumplen, bool verbose) { if (!dump || !dumplen || *dumplen < OLD_MFU_DUMP_PREFIX_LENGTH) { return PM3_EINVARG; } - + mfu_df_e res = detect_mfu_dump_format(dump, dumplen, verbose); - switch(res) { - case MFU_DF_NEWBIN: + switch (res) { + case MFU_DF_NEWBIN: return PM3_SUCCESS; case MFU_DF_OLDBIN: return convert_old_mfu_dump(dump, dumplen, verbose); diff --git a/client/src/fileutils.h b/client/src/fileutils.h index 30dc00251..d9bad1364 100644 --- a/client/src/fileutils.h +++ b/client/src/fileutils.h @@ -264,7 +264,7 @@ typedef enum { * @return PM3_SUCCESS for ok, PM3_ESOFT for fails */ int convert_mfu_dump_format(uint8_t **dump, size_t *dumplen, bool verbose); -mfu_df_e detect_mfu_dump_format(uint8_t **dump, size_t *dumplen, bool verbose); +mfu_df_e detect_mfu_dump_format(uint8_t **dump, size_t *dumplen, bool verbose); int searchAndList(const char *pm3dir, const char *ext); int searchFile(char **foundpath, const char *pm3dir, const char *searchname, const char *suffix, bool silent); diff --git a/client/src/jansson_path.c b/client/src/jansson_path.c index 0c0d76a05..b0db54675 100644 --- a/client/src/jansson_path.c +++ b/client/src/jansson_path.c @@ -85,8 +85,8 @@ static void jsonp_error_init(json_error_t *error, const char *source) { } static void jsonp_error_vset(json_error_t *error, int line, int column, - size_t position, enum json_error_code code, - const char *msg, va_list ap) { + size_t position, enum json_error_code code, + const char *msg, va_list ap) { if (!error) return; @@ -105,8 +105,8 @@ static void jsonp_error_vset(json_error_t *error, int line, int column, } static void jsonp_error_set(json_error_t *error, int line, int column, - size_t position, enum json_error_code code, - const char *msg, ...) { + size_t position, enum json_error_code code, + const char *msg, ...) { va_list ap; va_start(ap, msg); jsonp_error_vset(error, line, column, position, code, msg, ap); diff --git a/client/src/loclass/cipherutils.c b/client/src/loclass/cipherutils.c index 31ff90e50..76415b74f 100644 --- a/client/src/loclass/cipherutils.c +++ b/client/src/loclass/cipherutils.c @@ -174,7 +174,7 @@ void printarr_human_readable(const char *title, uint8_t *arr, int len) { PrintAndLogEx(INFO, "%s", title); for (i = 0; i < len; i++) { if (i % 16 == 0) { - + if (i == 0) cx += snprintf(output + cx, outsize - cx, "%02x| ", i); else @@ -204,9 +204,9 @@ static int testBitStream(void) { } if (memcmp(input, output, sizeof(input)) == 0) { - PrintAndLogEx(SUCCESS, " Bitstream test 1 (%s)", _GREEN_("ok") ); + PrintAndLogEx(SUCCESS, " Bitstream test 1 (%s)", _GREEN_("ok")); } else { - PrintAndLogEx(FAILED, " Bitstream test 1 (%s)", _RED_("failed") ); + PrintAndLogEx(FAILED, " Bitstream test 1 (%s)", _RED_("failed")); uint8_t i; for (i = 0 ; i < ARRAYLEN(input) ; i++) { PrintAndLogEx(NORMAL, " IN %02x, OUT %02x", input[i], output[i]); @@ -234,9 +234,9 @@ static int testReversedBitstream(void) { } if (memcmp(input, output, sizeof(input)) == 0) { - PrintAndLogEx(SUCCESS, " Bitstream test 2 (%s)", _GREEN_("ok") ); + PrintAndLogEx(SUCCESS, " Bitstream test 2 (%s)", _GREEN_("ok")); } else { - PrintAndLogEx(FAILED, " Bitstream test 2 (%s)", _RED_("failed") ); + PrintAndLogEx(FAILED, " Bitstream test 2 (%s)", _RED_("failed")); uint8_t i; for (i = 0 ; i < ARRAYLEN(input) ; i++) { PrintAndLogEx(NORMAL, " IN %02x, MIDDLE: %02x, OUT %02x", input[i], reverse[i], output[i]); @@ -251,7 +251,7 @@ int testCipherUtils(void) { int retval = testBitStream(); if (retval == PM3_SUCCESS) retval = testReversedBitstream(); - + return retval; } #endif diff --git a/client/src/loclass/elite_crack.c b/client/src/loclass/elite_crack.c index 83e2a9146..a811106d3 100644 --- a/client/src/loclass/elite_crack.c +++ b/client/src/loclass/elite_crack.c @@ -481,7 +481,7 @@ int calculateMasterKey(uint8_t first16bytes[], uint64_t master_key[]) { if (memcmp(z_0, result, 4) != 0) { PrintAndLogEx(WARNING, _RED_("Failed to verify") " calculated master key (k_cus)! Something is wrong."); return PM3_ESOFT; - } + } PrintAndLogEx(SUCCESS, _GREEN_("Key verified ok!")); return PM3_SUCCESS; @@ -501,9 +501,9 @@ int bruteforceDump(uint8_t dump[], size_t dumpsize, uint16_t keytable[]) { dumpdata *attack = (dumpdata *) calloc(itemsize, sizeof(uint8_t)); if (attack == NULL) { PrintAndLogEx(WARNING, "failed to allocate memory"); - return PM3_EMALLOC; + return PM3_EMALLOC; } - + int res = 0; for (i = 0 ; i * itemsize < dumpsize ; i++) { memcpy(attack, dump + i * itemsize, itemsize); @@ -670,13 +670,13 @@ int testElite(bool slowtests) { int res = PM3_SUCCESS; PrintAndLogEx(INFO, "Testing hash1..."); res += _testHash1(); - PrintAndLogEx(INFO, " hash1 (%s)", (res == PM3_SUCCESS) ? _GREEN_("ok") : _RED_("fail") ); + PrintAndLogEx(INFO, " hash1 (%s)", (res == PM3_SUCCESS) ? _GREEN_("ok") : _RED_("fail")); PrintAndLogEx(INFO, "Testing key diversification..."); res += _test_iclass_key_permutation(); if (res == PM3_SUCCESS) - PrintAndLogEx(INFO, " key diversification (%s)", (res == PM3_SUCCESS) ? _GREEN_("ok") : _RED_("fail") ); - + PrintAndLogEx(INFO, " key diversification (%s)", (res == PM3_SUCCESS) ? _GREEN_("ok") : _RED_("fail")); + if (slowtests) res += _testBruteforce(); diff --git a/client/src/loclass/ikeys.c b/client/src/loclass/ikeys.c index cf14450bd..3adcd97bb 100644 --- a/client/src/loclass/ikeys.c +++ b/client/src/loclass/ikeys.c @@ -228,13 +228,13 @@ static void printState(const char *desc, uint64_t c) { return; char s[60] = {0}; snprintf(s, sizeof(s), "%s : ", desc); - + uint8_t x = (c & 0xFF00000000000000) >> 56; uint8_t y = (c & 0x00FF000000000000) >> 48; - + snprintf(s + strlen(s), sizeof(s) - strlen(s), " %02x %02x", x, y); - for (uint8_t i = 0; i < 8; i++) + for (uint8_t i = 0; i < 8; i++) snprintf(s + strlen(s), sizeof(s) - strlen(s), " %02x", getSixBitByte(c, i)); PrintAndLogEx(DEBUG, "%s", s); @@ -353,7 +353,7 @@ void hash0(uint64_t c, uint8_t k[8]) { * @param key * @param div_key */ -void diversifyKey(uint8_t* csn, uint8_t* key, uint8_t* div_key) { +void diversifyKey(uint8_t *csn, uint8_t *key, uint8_t *div_key) { // Prepare the DES key mbedtls_des_setkey_enc(&ctx_enc, key); @@ -581,7 +581,7 @@ static int testCryptedCSN(uint64_t crypted_csn, uint64_t expected) { PrintAndLogEx(DEBUG, ""); PrintAndLogEx(DEBUG, " {csn} %"PRIx64, crypted_csn); PrintAndLogEx(DEBUG, " {csn-revz} %"PRIx64, crypted_csn_swapped); - PrintAndLogEx(DEBUG, " hash0 %"PRIx64 " (%s)", resultbyte, (resultbyte == expected) ? _GREEN_("OK") : _RED_("FAIL") ); + PrintAndLogEx(DEBUG, " hash0 %"PRIx64 " (%s)", resultbyte, (resultbyte == expected) ? _GREEN_("OK") : _RED_("FAIL")); if (resultbyte != expected) { PrintAndLogEx(DEBUG, " expected " _YELLOW_("%"PRIx64), expected); @@ -602,7 +602,7 @@ static int testDES2(uint64_t csn, uint64_t expected) { uint64_t crypt_csn = x_bytes_to_num(result, 8); PrintAndLogEx(DEBUG, " {csn} %"PRIx64, crypt_csn); - PrintAndLogEx(DEBUG, " expected %"PRIx64 " (%s)", expected, (expected == crypt_csn) ? _GREEN_("OK") : _RED_("FAIL") ); + PrintAndLogEx(DEBUG, " expected %"PRIx64 " (%s)", expected, (expected == crypt_csn) ? _GREEN_("OK") : _RED_("FAIL")); if (expected != crypt_csn) return PM3_ESOFT; @@ -635,7 +635,7 @@ static int doTestsWithKnownInputs(void) { res += testCryptedCSN(0x21ba6565071f9299, 0x34e80f88d5cf39ea); res += testCryptedCSN(0x14e2adfc5bb7e134, 0x6ac90c6508bd9ea3); - if (res != PM3_SUCCESS) { + if (res != PM3_SUCCESS) { PrintAndLogEx(FAILED, "%d res occurred (9 testcases)", res); res = PM3_ESOFT; } else { diff --git a/client/src/preferences.c b/client/src/preferences.c index b5599f1ba..4313c9456 100644 --- a/client/src/preferences.c +++ b/client/src/preferences.c @@ -912,7 +912,7 @@ static int CmdPrefShow(const char *Cmd) { char *fn = prefGetFilename(); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, _CYAN_("Preferences loaded from " _YELLOW_("%s")), fn); - free(fn); + free(fn); } else { PrintAndLogEx(ERR, "Preferences not loaded"); return PM3_ESOFT; diff --git a/common/lz4/lz4.c b/common/lz4/lz4.c index 9de0c00db..5bca93e08 100644 --- a/common/lz4/lz4.c +++ b/common/lz4/lz4.c @@ -193,7 +193,7 @@ #define MFLIMIT 12 /* see ../doc/lz4_Block_format.md#parsing-restrictions */ #define MATCH_SAFEGUARD_DISTANCE ((2*WILDCOPYLENGTH) - MINMATCH) /* ensure it's possible to write 2 x wildcopyLength without overflowing output buffer */ #define FASTLOOP_SAFE_DISTANCE 64 -static const int LZ4_minLength = (MFLIMIT+1); +static const int LZ4_minLength = (MFLIMIT + 1); #define KB *(1 <<10) #define MB *(1 <<20) @@ -242,25 +242,25 @@ static int g_debuglog_enable = 1; **************************************/ #if defined(__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) # include <stdint.h> - typedef uint8_t BYTE; - typedef uint16_t U16; - typedef uint32_t U32; - typedef int32_t S32; - typedef uint64_t U64; - typedef uintptr_t uptrval; +typedef uint8_t BYTE; +typedef uint16_t U16; +typedef uint32_t U32; +typedef int32_t S32; +typedef uint64_t U64; +typedef uintptr_t uptrval; #else - typedef unsigned char BYTE; - typedef unsigned short U16; - typedef unsigned int U32; - typedef signed int S32; - typedef unsigned long long U64; - typedef size_t uptrval; /* generally true, except OpenVMS-64 */ +typedef unsigned char BYTE; +typedef unsigned short U16; +typedef unsigned int U32; +typedef signed int S32; +typedef unsigned long long U64; +typedef size_t uptrval; /* generally true, except OpenVMS-64 */ #endif #if defined(__x86_64__) - typedef U64 reg_t; /* 64-bits in x32 mode */ +typedef U64 reg_t; /* 64-bits in x32 mode */ #else - typedef size_t reg_t; /* 32-bits in x32 mode */ +typedef size_t reg_t; /* 32-bits in x32 mode */ #endif typedef enum { @@ -273,8 +273,7 @@ typedef enum { /*-************************************ * Reading and writing into memory **************************************/ -static unsigned LZ4_isLittleEndian(void) -{ +static unsigned LZ4_isLittleEndian(void) { const union { U32 u; BYTE c[4]; } one = { 1 }; /* don't use static : performance detrimental */ return one.c[0]; } @@ -283,12 +282,12 @@ static unsigned LZ4_isLittleEndian(void) #if defined(LZ4_FORCE_MEMORY_ACCESS) && (LZ4_FORCE_MEMORY_ACCESS==2) /* lie to the compiler about data alignment; use with caution */ -static U16 LZ4_read16(const void* memPtr) { return *(const U16*) memPtr; } -static U32 LZ4_read32(const void* memPtr) { return *(const U32*) memPtr; } -static reg_t LZ4_read_ARCH(const void* memPtr) { return *(const reg_t*) memPtr; } +static U16 LZ4_read16(const void *memPtr) { return *(const U16 *) memPtr; } +static U32 LZ4_read32(const void *memPtr) { return *(const U32 *) memPtr; } +static reg_t LZ4_read_ARCH(const void *memPtr) { return *(const reg_t *) memPtr; } -static void LZ4_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; } -static void LZ4_write32(void* memPtr, U32 value) { *(U32*)memPtr = value; } +static void LZ4_write16(void *memPtr, U16 value) { *(U16 *)memPtr = value; } +static void LZ4_write32(void *memPtr, U32 value) { *(U32 *)memPtr = value; } #elif defined(LZ4_FORCE_MEMORY_ACCESS) && (LZ4_FORCE_MEMORY_ACCESS==1) @@ -296,73 +295,72 @@ static void LZ4_write32(void* memPtr, U32 value) { *(U32*)memPtr = value; } /* currently only defined for gcc and icc */ typedef union { U16 u16; U32 u32; reg_t uArch; } __attribute__((packed)) unalign; -static U16 LZ4_read16(const void* ptr) { return ((const unalign*)ptr)->u16; } -static U32 LZ4_read32(const void* ptr) { return ((const unalign*)ptr)->u32; } -static reg_t LZ4_read_ARCH(const void* ptr) { return ((const unalign*)ptr)->uArch; } +static U16 LZ4_read16(const void *ptr) { return ((const unalign *)ptr)->u16; } +static U32 LZ4_read32(const void *ptr) { return ((const unalign *)ptr)->u32; } +static reg_t LZ4_read_ARCH(const void *ptr) { return ((const unalign *)ptr)->uArch; } -static void LZ4_write16(void* memPtr, U16 value) { ((unalign*)memPtr)->u16 = value; } -static void LZ4_write32(void* memPtr, U32 value) { ((unalign*)memPtr)->u32 = value; } +static void LZ4_write16(void *memPtr, U16 value) { ((unalign *)memPtr)->u16 = value; } +static void LZ4_write32(void *memPtr, U32 value) { ((unalign *)memPtr)->u32 = value; } #else /* safe and portable access using memcpy() */ -static U16 LZ4_read16(const void* memPtr) -{ - U16 val; memcpy(&val, memPtr, sizeof(val)); return val; +static U16 LZ4_read16(const void *memPtr) { + U16 val; + memcpy(&val, memPtr, sizeof(val)); + return val; } -static U32 LZ4_read32(const void* memPtr) -{ - U32 val; memcpy(&val, memPtr, sizeof(val)); return val; +static U32 LZ4_read32(const void *memPtr) { + U32 val; + memcpy(&val, memPtr, sizeof(val)); + return val; } -static reg_t LZ4_read_ARCH(const void* memPtr) -{ - reg_t val; memcpy(&val, memPtr, sizeof(val)); return val; +static reg_t LZ4_read_ARCH(const void *memPtr) { + reg_t val; + memcpy(&val, memPtr, sizeof(val)); + return val; } -static void LZ4_write16(void* memPtr, U16 value) -{ +static void LZ4_write16(void *memPtr, U16 value) { memcpy(memPtr, &value, sizeof(value)); } -static void LZ4_write32(void* memPtr, U32 value) -{ +static void LZ4_write32(void *memPtr, U32 value) { memcpy(memPtr, &value, sizeof(value)); } #endif /* LZ4_FORCE_MEMORY_ACCESS */ -static U16 LZ4_readLE16(const void* memPtr) -{ +static U16 LZ4_readLE16(const void *memPtr) { if (LZ4_isLittleEndian()) { return LZ4_read16(memPtr); } else { - const BYTE* p = (const BYTE*)memPtr; - return (U16)((U16)p[0] + (p[1]<<8)); + const BYTE *p = (const BYTE *)memPtr; + return (U16)((U16)p[0] + (p[1] << 8)); } } -static void LZ4_writeLE16(void* memPtr, U16 value) -{ +static void LZ4_writeLE16(void *memPtr, U16 value) { if (LZ4_isLittleEndian()) { LZ4_write16(memPtr, value); } else { - BYTE* p = (BYTE*)memPtr; + BYTE *p = (BYTE *)memPtr; p[0] = (BYTE) value; - p[1] = (BYTE)(value>>8); + p[1] = (BYTE)(value >> 8); } } /* customized variant of memcpy, which can overwrite up to 8 bytes beyond dstEnd */ LZ4_FORCE_O2_INLINE_GCC_PPC64LE -void LZ4_wildCopy8(void* dstPtr, const void* srcPtr, void* dstEnd) -{ - BYTE* d = (BYTE*)dstPtr; - const BYTE* s = (const BYTE*)srcPtr; - BYTE* const e = (BYTE*)dstEnd; +void LZ4_wildCopy8(void *dstPtr, const void *srcPtr, void *dstEnd) { + BYTE *d = (BYTE *)dstPtr; + const BYTE *s = (const BYTE *)srcPtr; + BYTE *const e = (BYTE *)dstEnd; - do { memcpy(d,s,8); d+=8; s+=8; } while (d<e); + do { memcpy(d, s, 8); d += 8; s += 8; } + while (d < e); } static const unsigned inc32table[8] = {0, 1, 2, 1, 0, 4, 4, 4}; @@ -373,9 +371,9 @@ static const int dec64table[8] = {0, 0, 0, -1, -4, 1, 2, 3}; # if defined(__i386__) || defined(__x86_64__) # define LZ4_FAST_DEC_LOOP 1 # elif defined(__aarch64__) && !defined(__clang__) - /* On aarch64, we disable this optimization for clang because on certain - * mobile chipsets and clang, it reduces performance. For more information - * refer to https://github.com/lz4/lz4/pull/707. */ +/* On aarch64, we disable this optimization for clang because on certain + * mobile chipsets and clang, it reduces performance. For more information + * refer to https://github.com/lz4/lz4/pull/707. */ # define LZ4_FAST_DEC_LOOP 1 # else # define LZ4_FAST_DEC_LOOP 0 @@ -385,15 +383,14 @@ static const int dec64table[8] = {0, 0, 0, -1, -4, 1, 2, 3}; #if LZ4_FAST_DEC_LOOP LZ4_FORCE_O2_INLINE_GCC_PPC64LE void -LZ4_memcpy_using_offset_base(BYTE* dstPtr, const BYTE* srcPtr, BYTE* dstEnd, const size_t offset) -{ +LZ4_memcpy_using_offset_base(BYTE *dstPtr, const BYTE *srcPtr, BYTE *dstEnd, const size_t offset) { if (offset < 8) { dstPtr[0] = srcPtr[0]; dstPtr[1] = srcPtr[1]; dstPtr[2] = srcPtr[2]; dstPtr[3] = srcPtr[3]; srcPtr += inc32table[offset]; - memcpy(dstPtr+4, srcPtr, 4); + memcpy(dstPtr + 4, srcPtr, 4); srcPtr -= dec64table[offset]; dstPtr += 8; } else { @@ -409,42 +406,41 @@ LZ4_memcpy_using_offset_base(BYTE* dstPtr, const BYTE* srcPtr, BYTE* dstEnd, con * this version copies two times 16 bytes (instead of one time 32 bytes) * because it must be compatible with offsets >= 16. */ LZ4_FORCE_O2_INLINE_GCC_PPC64LE void -LZ4_wildCopy32(void* dstPtr, const void* srcPtr, void* dstEnd) -{ - BYTE* d = (BYTE*)dstPtr; - const BYTE* s = (const BYTE*)srcPtr; - BYTE* const e = (BYTE*)dstEnd; +LZ4_wildCopy32(void *dstPtr, const void *srcPtr, void *dstEnd) { + BYTE *d = (BYTE *)dstPtr; + const BYTE *s = (const BYTE *)srcPtr; + BYTE *const e = (BYTE *)dstEnd; - do { memcpy(d,s,16); memcpy(d+16,s+16,16); d+=32; s+=32; } while (d<e); + do { memcpy(d, s, 16); memcpy(d + 16, s + 16, 16); d += 32; s += 32; } + while (d < e); } /* LZ4_memcpy_using_offset() presumes : * - dstEnd >= dstPtr + MINMATCH * - there is at least 8 bytes available to write after dstEnd */ LZ4_FORCE_O2_INLINE_GCC_PPC64LE void -LZ4_memcpy_using_offset(BYTE* dstPtr, const BYTE* srcPtr, BYTE* dstEnd, const size_t offset) -{ +LZ4_memcpy_using_offset(BYTE *dstPtr, const BYTE *srcPtr, BYTE *dstEnd, const size_t offset) { BYTE v[8]; assert(dstEnd >= dstPtr + MINMATCH); LZ4_write32(dstPtr, 0); /* silence an msan warning when offset==0 */ - switch(offset) { - case 1: - memset(v, *srcPtr, 8); - break; - case 2: - memcpy(v, srcPtr, 2); - memcpy(&v[2], srcPtr, 2); - memcpy(&v[4], &v[0], 4); - break; - case 4: - memcpy(v, srcPtr, 4); - memcpy(&v[4], srcPtr, 4); - break; - default: - LZ4_memcpy_using_offset_base(dstPtr, srcPtr, dstEnd, offset); - return; + switch (offset) { + case 1: + memset(v, *srcPtr, 8); + break; + case 2: + memcpy(v, srcPtr, 2); + memcpy(&v[2], srcPtr, 2); + memcpy(&v[4], &v[0], 4); + break; + case 4: + memcpy(v, srcPtr, 4); + memcpy(&v[4], srcPtr, 4); + break; + default: + LZ4_memcpy_using_offset_base(dstPtr, srcPtr, dstEnd, offset); + return; } memcpy(dstPtr, v, 8); @@ -460,14 +456,13 @@ LZ4_memcpy_using_offset(BYTE* dstPtr, const BYTE* srcPtr, BYTE* dstEnd, const si /*-************************************ * Common functions **************************************/ -static unsigned LZ4_NbCommonBytes (reg_t val) -{ +static unsigned LZ4_NbCommonBytes(reg_t val) { if (LZ4_isLittleEndian()) { - if (sizeof(val)==8) { + if (sizeof(val) == 8) { # if defined(_MSC_VER) && defined(_WIN64) && !defined(LZ4_FORCE_SW_BITCOUNT) unsigned long r = 0; - _BitScanForward64( &r, (U64)val ); - return (int)(r>>3); + _BitScanForward64(&r, (U64)val); + return (int)(r >> 3); # elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT) return (unsigned)__builtin_ctzll((U64)val) >> 3; # else @@ -478,52 +473,57 @@ static unsigned LZ4_NbCommonBytes (reg_t val) 7, 0, 1, 2, 3, 3, 4, 6, 2, 6, 5, 5, 3, 4, 5, 6, 7, 1, 2, 4, 6, 4, 4, 5, - 7, 2, 6, 5, 7, 6, 7, 7 }; + 7, 2, 6, 5, 7, 6, 7, 7 + }; return DeBruijnBytePos[((U64)((val & -(long long)val) * 0x0218A392CDABBD3FULL)) >> 58]; # endif } else /* 32 bits */ { # if defined(_MSC_VER) && !defined(LZ4_FORCE_SW_BITCOUNT) unsigned long r; - _BitScanForward( &r, (U32)val ); - return (int)(r>>3); + _BitScanForward(&r, (U32)val); + return (int)(r >> 3); # elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT) return (unsigned)__builtin_ctz((U32)val) >> 3; # else static const int DeBruijnBytePos[32] = { 0, 0, 3, 0, 3, 1, 3, 0, 3, 2, 2, 1, 3, 2, 0, 1, 3, 3, 1, 2, 2, 2, 2, 0, - 3, 1, 2, 0, 1, 0, 1, 1 }; + 3, 1, 2, 0, 1, 0, 1, 1 + }; return DeBruijnBytePos[((U32)((val & -(S32)val) * 0x077CB531U)) >> 27]; # endif } - } else /* Big Endian CPU */ { - if (sizeof(val)==8) { /* 64-bits */ + } else { /* Big Endian CPU */ + if (sizeof(val) == 8) { /* 64-bits */ # if defined(_MSC_VER) && defined(_WIN64) && !defined(LZ4_FORCE_SW_BITCOUNT) unsigned long r = 0; - _BitScanReverse64( &r, val ); - return (unsigned)(r>>3); + _BitScanReverse64(&r, val); + return (unsigned)(r >> 3); # elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT) return (unsigned)__builtin_clzll((U64)val) >> 3; # else - static const U32 by32 = sizeof(val)*4; /* 32 on 64 bits (goal), 16 on 32 bits. + static const U32 by32 = sizeof(val) * 4; /* 32 on 64 bits (goal), 16 on 32 bits. Just to avoid some static analyzer complaining about shift by 32 on 32-bits target. Note that this code path is never triggered in 32-bits mode. */ unsigned r; - if (!(val>>by32)) { r=4; } else { r=0; val>>=by32; } - if (!(val>>16)) { r+=2; val>>=8; } else { val>>=24; } + if (!(val >> by32)) { r = 4; } + else { r = 0; val >>= by32; } + if (!(val >> 16)) { r += 2; val >>= 8; } + else { val >>= 24; } r += (!val); return r; # endif } else /* 32 bits */ { # if defined(_MSC_VER) && !defined(LZ4_FORCE_SW_BITCOUNT) unsigned long r = 0; - _BitScanReverse( &r, (unsigned long)val ); - return (unsigned)(r>>3); + _BitScanReverse(&r, (unsigned long)val); + return (unsigned)(r >> 3); # elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT) return (unsigned)__builtin_clz((U32)val) >> 3; # else unsigned r; - if (!(val>>16)) { r=2; val>>=8; } else { r=0; val>>=24; } + if (!(val >> 16)) { r = 2; val >>= 8; } + else { r = 0; val >>= 24; } r += (!val); return r; # endif @@ -533,28 +533,29 @@ static unsigned LZ4_NbCommonBytes (reg_t val) #define STEPSIZE sizeof(reg_t) LZ4_FORCE_INLINE -unsigned LZ4_count(const BYTE* pIn, const BYTE* pMatch, const BYTE* pInLimit) -{ - const BYTE* const pStart = pIn; +unsigned LZ4_count(const BYTE *pIn, const BYTE *pMatch, const BYTE *pInLimit) { + const BYTE *const pStart = pIn; - if (likely(pIn < pInLimit-(STEPSIZE-1))) { + if (likely(pIn < pInLimit - (STEPSIZE - 1))) { reg_t const diff = LZ4_read_ARCH(pMatch) ^ LZ4_read_ARCH(pIn); if (!diff) { - pIn+=STEPSIZE; pMatch+=STEPSIZE; + pIn += STEPSIZE; + pMatch += STEPSIZE; } else { return LZ4_NbCommonBytes(diff); - } } + } + } - while (likely(pIn < pInLimit-(STEPSIZE-1))) { + while (likely(pIn < pInLimit - (STEPSIZE - 1))) { reg_t const diff = LZ4_read_ARCH(pMatch) ^ LZ4_read_ARCH(pIn); - if (!diff) { pIn+=STEPSIZE; pMatch+=STEPSIZE; continue; } + if (!diff) { pIn += STEPSIZE; pMatch += STEPSIZE; continue; } pIn += LZ4_NbCommonBytes(diff); return (unsigned)(pIn - pStart); } - if ((STEPSIZE==8) && (pIn<(pInLimit-3)) && (LZ4_read32(pMatch) == LZ4_read32(pIn))) { pIn+=4; pMatch+=4; } - if ((pIn<(pInLimit-1)) && (LZ4_read16(pMatch) == LZ4_read16(pIn))) { pIn+=2; pMatch+=2; } - if ((pIn<pInLimit) && (*pMatch == *pIn)) pIn++; + if ((STEPSIZE == 8) && (pIn < (pInLimit - 3)) && (LZ4_read32(pMatch) == LZ4_read32(pIn))) { pIn += 4; pMatch += 4; } + if ((pIn < (pInLimit - 1)) && (LZ4_read16(pMatch) == LZ4_read16(pIn))) { pIn += 2; pMatch += 2; } + if ((pIn < pInLimit) && (*pMatch == *pIn)) pIn++; return (unsigned)(pIn - pStart); } @@ -563,7 +564,7 @@ unsigned LZ4_count(const BYTE* pIn, const BYTE* pMatch, const BYTE* pInLimit) /*-************************************ * Local Constants **************************************/ -static const int LZ4_64Klimit = ((64 KB) + (MFLIMIT-1)); +static const int LZ4_64Klimit = ((64 KB) + (MFLIMIT - 1)); static const U32 LZ4_skipTrigger = 6; /* Increase this value ==> compression run slower on incompressible data */ @@ -602,8 +603,8 @@ typedef enum { noDictIssue = 0, dictSmall } dictIssue_directive; /*-************************************ * Local Utils **************************************/ -int LZ4_versionNumber (void) { return LZ4_VERSION_NUMBER; } -const char* LZ4_versionString(void) { return LZ4_VERSION_STRING; } +int LZ4_versionNumber(void) { return LZ4_VERSION_NUMBER; } +const char *LZ4_versionString(void) { return LZ4_VERSION_STRING; } int LZ4_compressBound(int isize) { return LZ4_COMPRESSBOUND(isize); } int LZ4_sizeofState() { return LZ4_STREAMSIZE; } @@ -615,11 +616,11 @@ int LZ4_sizeofState() { return LZ4_STREAMSIZE; } extern "C" { #endif -int LZ4_compress_forceExtDict (LZ4_stream_t* LZ4_dict, const char* source, char* dest, int srcSize); +int LZ4_compress_forceExtDict(LZ4_stream_t *LZ4_dict, const char *source, char *dest, int srcSize); -int LZ4_decompress_safe_forceExtDict(const char* source, char* dest, +int LZ4_decompress_safe_forceExtDict(const char *source, char *dest, int compressedSize, int maxOutputSize, - const void* dictStart, size_t dictSize); + const void *dictStart, size_t dictSize); #if defined (__cplusplus) } @@ -628,17 +629,15 @@ int LZ4_decompress_safe_forceExtDict(const char* source, char* dest, /*-****************************** * Compression functions ********************************/ -static U32 LZ4_hash4(U32 sequence, tableType_t const tableType) -{ +static U32 LZ4_hash4(U32 sequence, tableType_t const tableType) { if (tableType == byU16) - return ((sequence * 2654435761U) >> ((MINMATCH*8)-(LZ4_HASHLOG+1))); + return ((sequence * 2654435761U) >> ((MINMATCH * 8) - (LZ4_HASHLOG + 1))); else - return ((sequence * 2654435761U) >> ((MINMATCH*8)-LZ4_HASHLOG)); + return ((sequence * 2654435761U) >> ((MINMATCH * 8) - LZ4_HASHLOG)); } -static U32 LZ4_hash5(U64 sequence, tableType_t const tableType) -{ - const U32 hashLog = (tableType == byU16) ? LZ4_HASHLOG+1 : LZ4_HASHLOG; +static U32 LZ4_hash5(U64 sequence, tableType_t const tableType) { + const U32 hashLog = (tableType == byU16) ? LZ4_HASHLOG + 1 : LZ4_HASHLOG; if (LZ4_isLittleEndian()) { const U64 prime5bytes = 889523592379ULL; return (U32)(((sequence << 24) * prime5bytes) >> (64 - hashLog)); @@ -648,51 +647,51 @@ static U32 LZ4_hash5(U64 sequence, tableType_t const tableType) } } -LZ4_FORCE_INLINE U32 LZ4_hashPosition(const void* const p, tableType_t const tableType) -{ - if ((sizeof(reg_t)==8) && (tableType != byU16)) return LZ4_hash5(LZ4_read_ARCH(p), tableType); +LZ4_FORCE_INLINE U32 LZ4_hashPosition(const void *const p, tableType_t const tableType) { + if ((sizeof(reg_t) == 8) && (tableType != byU16)) return LZ4_hash5(LZ4_read_ARCH(p), tableType); return LZ4_hash4(LZ4_read32(p), tableType); } -static void LZ4_clearHash(U32 h, void* tableBase, tableType_t const tableType) -{ - switch (tableType) - { - default: /* fallthrough */ - case clearedTable: { /* illegal! */ assert(0); return; } - case byPtr: { const BYTE** hashTable = (const BYTE**)tableBase; hashTable[h] = NULL; return; } - case byU32: { U32* hashTable = (U32*) tableBase; hashTable[h] = 0; return; } - case byU16: { U16* hashTable = (U16*) tableBase; hashTable[h] = 0; return; } +static void LZ4_clearHash(U32 h, void *tableBase, tableType_t const tableType) { + switch (tableType) { + default: /* fallthrough */ + case clearedTable: { /* illegal! */ assert(0); return; } + case byPtr: + { const BYTE **hashTable = (const BYTE **)tableBase; hashTable[h] = NULL; return; } + case byU32: + { U32 *hashTable = (U32 *) tableBase; hashTable[h] = 0; return; } + case byU16: + { U16 *hashTable = (U16 *) tableBase; hashTable[h] = 0; return; } } } -static void LZ4_putIndexOnHash(U32 idx, U32 h, void* tableBase, tableType_t const tableType) -{ - switch (tableType) - { - default: /* fallthrough */ - case clearedTable: /* fallthrough */ - case byPtr: { /* illegal! */ assert(0); return; } - case byU32: { U32* hashTable = (U32*) tableBase; hashTable[h] = idx; return; } - case byU16: { U16* hashTable = (U16*) tableBase; assert(idx < 65536); hashTable[h] = (U16)idx; return; } +static void LZ4_putIndexOnHash(U32 idx, U32 h, void *tableBase, tableType_t const tableType) { + switch (tableType) { + default: /* fallthrough */ + case clearedTable: /* fallthrough */ + case byPtr: { /* illegal! */ assert(0); return; } + case byU32: + { U32 *hashTable = (U32 *) tableBase; hashTable[h] = idx; return; } + case byU16: + { U16 *hashTable = (U16 *) tableBase; assert(idx < 65536); hashTable[h] = (U16)idx; return; } } } -static void LZ4_putPositionOnHash(const BYTE* p, U32 h, - void* tableBase, tableType_t const tableType, - const BYTE* srcBase) -{ - switch (tableType) - { - case clearedTable: { /* illegal! */ assert(0); return; } - case byPtr: { const BYTE** hashTable = (const BYTE**)tableBase; hashTable[h] = p; return; } - case byU32: { U32* hashTable = (U32*) tableBase; hashTable[h] = (U32)(p-srcBase); return; } - case byU16: { U16* hashTable = (U16*) tableBase; hashTable[h] = (U16)(p-srcBase); return; } +static void LZ4_putPositionOnHash(const BYTE *p, U32 h, + void *tableBase, tableType_t const tableType, + const BYTE *srcBase) { + switch (tableType) { + case clearedTable: { /* illegal! */ assert(0); return; } + case byPtr: + { const BYTE **hashTable = (const BYTE **)tableBase; hashTable[h] = p; return; } + case byU32: + { U32 *hashTable = (U32 *) tableBase; hashTable[h] = (U32)(p - srcBase); return; } + case byU16: + { U16 *hashTable = (U16 *) tableBase; hashTable[h] = (U16)(p - srcBase); return; } } } -LZ4_FORCE_INLINE void LZ4_putPosition(const BYTE* p, void* tableBase, tableType_t tableType, const BYTE* srcBase) -{ +LZ4_FORCE_INLINE void LZ4_putPosition(const BYTE *p, void *tableBase, tableType_t tableType, const BYTE *srcBase) { U32 const h = LZ4_hashPosition(p, tableType); LZ4_putPositionOnHash(p, h, tableBase, tableType, srcBase); } @@ -703,42 +702,40 @@ LZ4_FORCE_INLINE void LZ4_putPosition(const BYTE* p, void* tableBase, tableType_ * Assumption 1 : only valid if tableType == byU32 or byU16. * Assumption 2 : h is presumed valid (within limits of hash table) */ -static U32 LZ4_getIndexOnHash(U32 h, const void* tableBase, tableType_t tableType) -{ +static U32 LZ4_getIndexOnHash(U32 h, const void *tableBase, tableType_t tableType) { LZ4_STATIC_ASSERT(LZ4_MEMORY_USAGE > 2); if (tableType == byU32) { - const U32* const hashTable = (const U32*) tableBase; - assert(h < (1U << (LZ4_MEMORY_USAGE-2))); + const U32 *const hashTable = (const U32 *) tableBase; + assert(h < (1U << (LZ4_MEMORY_USAGE - 2))); return hashTable[h]; } if (tableType == byU16) { - const U16* const hashTable = (const U16*) tableBase; - assert(h < (1U << (LZ4_MEMORY_USAGE-1))); + const U16 *const hashTable = (const U16 *) tableBase; + assert(h < (1U << (LZ4_MEMORY_USAGE - 1))); return hashTable[h]; } - assert(0); return 0; /* forbidden case */ + assert(0); + return 0; /* forbidden case */ } -static const BYTE* LZ4_getPositionOnHash(U32 h, const void* tableBase, tableType_t tableType, const BYTE* srcBase) -{ - if (tableType == byPtr) { const BYTE* const* hashTable = (const BYTE* const*) tableBase; return hashTable[h]; } - if (tableType == byU32) { const U32* const hashTable = (const U32*) tableBase; return hashTable[h] + srcBase; } - { const U16* const hashTable = (const U16*) tableBase; return hashTable[h] + srcBase; } /* default, to ensure a return */ +static const BYTE *LZ4_getPositionOnHash(U32 h, const void *tableBase, tableType_t tableType, const BYTE *srcBase) { + if (tableType == byPtr) { const BYTE *const *hashTable = (const BYTE * const *) tableBase; return hashTable[h]; } + if (tableType == byU32) { const U32 *const hashTable = (const U32 *) tableBase; return hashTable[h] + srcBase; } + { const U16 *const hashTable = (const U16 *) tableBase; return hashTable[h] + srcBase; } /* default, to ensure a return */ } -LZ4_FORCE_INLINE const BYTE* -LZ4_getPosition(const BYTE* p, - const void* tableBase, tableType_t tableType, - const BYTE* srcBase) -{ +LZ4_FORCE_INLINE const BYTE * +LZ4_getPosition(const BYTE *p, + const void *tableBase, tableType_t tableType, + const BYTE *srcBase) { U32 const h = LZ4_hashPosition(p, tableType); return LZ4_getPositionOnHash(h, tableBase, tableType, srcBase); } LZ4_FORCE_INLINE void -LZ4_prepareTable(LZ4_stream_t_internal* const cctx, - const int inputSize, - const tableType_t tableType) { +LZ4_prepareTable(LZ4_stream_t_internal *const cctx, + const int inputSize, + const tableType_t tableType) { /* If compression failed during the previous step, then the context * is marked as dirty, therefore, it has to be fully reset. */ @@ -755,11 +752,10 @@ LZ4_prepareTable(LZ4_stream_t_internal* const cctx, if (cctx->tableType != clearedTable) { assert(inputSize >= 0); if (cctx->tableType != tableType - || ((tableType == byU16) && cctx->currentOffset + (unsigned)inputSize >= 0xFFFFU) - || ((tableType == byU32) && cctx->currentOffset > 1 GB) - || tableType == byPtr - || inputSize >= 4 KB) - { + || ((tableType == byU16) && cctx->currentOffset + (unsigned)inputSize >= 0xFFFFU) + || ((tableType == byU32) && cctx->currentOffset > 1 GB) + || tableType == byPtr + || inputSize >= 4 KB) { DEBUGLOG(4, "LZ4_prepareTable: Resetting table in %p", cctx); MEM_INIT(cctx->hashTable, 0, LZ4_HASHTABLESIZE); cctx->currentOffset = 0; @@ -787,27 +783,26 @@ LZ4_prepareTable(LZ4_stream_t_internal* const cctx, /** LZ4_compress_generic() : inlined, to ensure branches are decided at compilation time */ LZ4_FORCE_INLINE int LZ4_compress_generic( - LZ4_stream_t_internal* const cctx, - const char* const source, - char* const dest, - const int inputSize, - int *inputConsumed, /* only written when outputDirective == fillOutput */ - const int maxOutputSize, - const limitedOutput_directive outputDirective, - const tableType_t tableType, - const dict_directive dictDirective, - const dictIssue_directive dictIssue, - const int acceleration) -{ + LZ4_stream_t_internal *const cctx, + const char *const source, + char *const dest, + const int inputSize, + int *inputConsumed, /* only written when outputDirective == fillOutput */ + const int maxOutputSize, + const limitedOutput_directive outputDirective, + const tableType_t tableType, + const dict_directive dictDirective, + const dictIssue_directive dictIssue, + const int acceleration) { int result; - const BYTE* ip = (const BYTE*) source; + const BYTE *ip = (const BYTE *) source; U32 const startIndex = cctx->currentOffset; - const BYTE* base = (const BYTE*) source - startIndex; - const BYTE* lowLimit; + const BYTE *base = (const BYTE *) source - startIndex; + const BYTE *lowLimit; - const LZ4_stream_t_internal* dictCtx = (const LZ4_stream_t_internal*) cctx->dictCtx; - const BYTE* const dictionary = + const LZ4_stream_t_internal *dictCtx = (const LZ4_stream_t_internal *) cctx->dictCtx; + const BYTE *const dictionary = dictDirective == usingDictCtx ? dictCtx->dictionary : cctx->dictionary; const U32 dictSize = dictDirective == usingDictCtx ? dictCtx->dictSize : cctx->dictSize; @@ -815,20 +810,20 @@ LZ4_FORCE_INLINE int LZ4_compress_generic( int const maybe_extMem = (dictDirective == usingExtDict) || (dictDirective == usingDictCtx); U32 const prefixIdxLimit = startIndex - dictSize; /* used when dictDirective == dictSmall */ - const BYTE* const dictEnd = dictionary + dictSize; - const BYTE* anchor = (const BYTE*) source; - const BYTE* const iend = ip + inputSize; - const BYTE* const mflimitPlusOne = iend - MFLIMIT + 1; - const BYTE* const matchlimit = iend - LASTLITERALS; + const BYTE *const dictEnd = dictionary + dictSize; + const BYTE *anchor = (const BYTE *) source; + const BYTE *const iend = ip + inputSize; + const BYTE *const mflimitPlusOne = iend - MFLIMIT + 1; + const BYTE *const matchlimit = iend - LASTLITERALS; /* the dictCtx currentOffset is indexed on the start of the dictionary, * while a dictionary in the current context precedes the currentOffset */ - const BYTE* dictBase = (dictDirective == usingDictCtx) ? - dictionary + dictSize - dictCtx->currentOffset : - dictionary + dictSize - startIndex; + const BYTE *dictBase = (dictDirective == usingDictCtx) ? + dictionary + dictSize - dictCtx->currentOffset : + dictionary + dictSize - startIndex; - BYTE* op = (BYTE*) dest; - BYTE* const olimit = op + maxOutputSize; + BYTE *op = (BYTE *) dest; + BYTE *const olimit = op + maxOutputSize; U32 offset = 0; U32 forwardH; @@ -838,11 +833,11 @@ LZ4_FORCE_INLINE int LZ4_compress_generic( * as having dirty context, since no action was taken yet */ if (outputDirective == fillOutput && maxOutputSize < 1) { return 0; } /* Impossible to store anything */ if ((U32)inputSize > (U32)LZ4_MAX_INPUT_SIZE) { return 0; } /* Unsupported inputSize, too large (or negative) */ - if ((tableType == byU16) && (inputSize>=LZ4_64Klimit)) { return 0; } /* Size too large (not within 64K limit) */ - if (tableType==byPtr) assert(dictDirective==noDict); /* only supported use case with byPtr */ + if ((tableType == byU16) && (inputSize >= LZ4_64Klimit)) { return 0; } /* Size too large (not within 64K limit) */ + if (tableType == byPtr) assert(dictDirective == noDict); /* only supported use case with byPtr */ assert(acceleration >= 1); - lowLimit = (const BYTE*)source - (dictDirective == withPrefix64k ? dictSize : 0); + lowLimit = (const BYTE *)source - (dictDirective == withPrefix64k ? dictSize : 0); /* Update context state */ if (dictDirective == usingDictCtx) { @@ -856,21 +851,22 @@ LZ4_FORCE_INLINE int LZ4_compress_generic( cctx->currentOffset += (U32)inputSize; cctx->tableType = (U16)tableType; - if (inputSize<LZ4_minLength) goto _last_literals; /* Input too small, no compression (all literals) */ + if (inputSize < LZ4_minLength) goto _last_literals; /* Input too small, no compression (all literals) */ /* First Byte */ LZ4_putPosition(ip, cctx->hashTable, tableType, base); - ip++; forwardH = LZ4_hashPosition(ip, tableType); + ip++; + forwardH = LZ4_hashPosition(ip, tableType); /* Main Loop */ - for ( ; ; ) { - const BYTE* match; - BYTE* token; - const BYTE* filledIp; + for (; ;) { + const BYTE *match; + BYTE *token; + const BYTE *filledIp; /* Find a match */ if (tableType == byPtr) { - const BYTE* forwardIp = ip; + const BYTE *forwardIp = ip; int step = 1; int searchMatchNb = acceleration << LZ4_skipTrigger; do { @@ -886,12 +882,12 @@ LZ4_FORCE_INLINE int LZ4_compress_generic( forwardH = LZ4_hashPosition(forwardIp, tableType); LZ4_putPositionOnHash(ip, h, cctx->hashTable, tableType, base); - } while ( (match+LZ4_DISTANCE_MAX < ip) - || (LZ4_read32(match) != LZ4_read32(ip)) ); + } while ((match + LZ4_DISTANCE_MAX < ip) + || (LZ4_read32(match) != LZ4_read32(ip))); } else { /* byU32, byU16 */ - const BYTE* forwardIp = ip; + const BYTE *forwardIp = ip; int step = 1; int searchMatchNb = acceleration << LZ4_skipTrigger; do { @@ -917,9 +913,9 @@ LZ4_FORCE_INLINE int LZ4_compress_generic( lowLimit = dictionary; } else { match = base + matchIndex; - lowLimit = (const BYTE*)source; + lowLimit = (const BYTE *)source; } - } else if (dictDirective==usingExtDict) { + } else if (dictDirective == usingExtDict) { if (matchIndex < startIndex) { DEBUGLOG(7, "extDict candidate: matchIndex=%5u < startIndex=%5u", matchIndex, startIndex); assert(startIndex - matchIndex >= MINMATCH); @@ -927,7 +923,7 @@ LZ4_FORCE_INLINE int LZ4_compress_generic( lowLimit = dictionary; } else { match = base + matchIndex; - lowLimit = (const BYTE*)source; + lowLimit = (const BYTE *)source; } } else { /* single continuous memory segment */ match = base + matchIndex; @@ -938,8 +934,8 @@ LZ4_FORCE_INLINE int LZ4_compress_generic( DEBUGLOG(7, "candidate at pos=%u (offset=%u \n", matchIndex, current - matchIndex); if ((dictIssue == dictSmall) && (matchIndex < prefixIdxLimit)) { continue; } /* match outside of valid area */ assert(matchIndex < current); - if ( ((tableType != byU16) || (LZ4_DISTANCE_MAX < LZ4_DISTANCE_ABSOLUTE_MAX)) - && (matchIndex+LZ4_DISTANCE_MAX < current)) { + if (((tableType != byU16) || (LZ4_DISTANCE_MAX < LZ4_DISTANCE_ABSOLUTE_MAX)) + && (matchIndex + LZ4_DISTANCE_MAX < current)) { continue; } /* too far */ assert((current - matchIndex) <= LZ4_DISTANCE_MAX); /* match now expected within distance */ @@ -949,38 +945,38 @@ LZ4_FORCE_INLINE int LZ4_compress_generic( break; /* match found */ } - } while(1); + } while (1); } /* Catch up */ filledIp = ip; - while (((ip>anchor) & (match > lowLimit)) && (unlikely(ip[-1]==match[-1]))) { ip--; match--; } + while (((ip > anchor) & (match > lowLimit)) && (unlikely(ip[-1] == match[-1]))) { ip--; match--; } /* Encode Literals */ - { unsigned const litLength = (unsigned)(ip - anchor); + { + unsigned const litLength = (unsigned)(ip - anchor); token = op++; if ((outputDirective == limitedOutput) && /* Check output buffer overflow */ - (unlikely(op + litLength + (2 + 1 + LASTLITERALS) + (litLength/255) > olimit)) ) { + (unlikely(op + litLength + (2 + 1 + LASTLITERALS) + (litLength / 255) > olimit))) { return 0; /* cannot compress within `dst` budget. Stored indexes in hash table are nonetheless fine */ } if ((outputDirective == fillOutput) && - (unlikely(op + (litLength+240)/255 /* litlen */ + litLength /* literals */ + 2 /* offset */ + 1 /* token */ + MFLIMIT - MINMATCH /* min last literals so last match is <= end - MFLIMIT */ > olimit))) { + (unlikely(op + (litLength + 240) / 255 /* litlen */ + litLength /* literals */ + 2 /* offset */ + 1 /* token */ + MFLIMIT - MINMATCH /* min last literals so last match is <= end - MFLIMIT */ > olimit))) { op--; goto _last_literals; } if (litLength >= RUN_MASK) { int len = (int)(litLength - RUN_MASK); - *token = (RUN_MASK<<ML_BITS); - for(; len >= 255 ; len-=255) *op++ = 255; + *token = (RUN_MASK << ML_BITS); + for (; len >= 255 ; len -= 255) * op++ = 255; *op++ = (BYTE)len; - } - else *token = (BYTE)(litLength<<ML_BITS); + } else *token = (BYTE)(litLength << ML_BITS); /* Copy Literals */ - LZ4_wildCopy8(op, anchor, op+litLength); - op+=litLength; + LZ4_wildCopy8(op, anchor, op + litLength); + op += litLength; DEBUGLOG(6, "seq.start:%i, literals=%u, match.start:%i", - (int)(anchor-(const BYTE*)source), litLength, (int)(ip-(const BYTE*)source)); + (int)(anchor - (const BYTE *)source), litLength, (int)(ip - (const BYTE *)source)); } _next_match: @@ -993,7 +989,7 @@ _next_match: */ if ((outputDirective == fillOutput) && - (op + 2 /* offset */ + 1 /* token */ + MFLIMIT - MINMATCH /* min last literals so last match is <= end - MFLIMIT */ > olimit)) { + (op + 2 /* offset */ + 1 /* token */ + MFLIMIT - MINMATCH /* min last literals so last match is <= end - MFLIMIT */ > olimit)) { /* the match was too close to the end, rewind and go to last literals */ op = token; goto _last_literals; @@ -1001,39 +997,42 @@ _next_match: /* Encode Offset */ if (maybe_extMem) { /* static test */ - DEBUGLOG(6, " with offset=%u (ext if > %i)", offset, (int)(ip - (const BYTE*)source)); + DEBUGLOG(6, " with offset=%u (ext if > %i)", offset, (int)(ip - (const BYTE *)source)); assert(offset <= LZ4_DISTANCE_MAX && offset > 0); - LZ4_writeLE16(op, (U16)offset); op+=2; + LZ4_writeLE16(op, (U16)offset); + op += 2; } else { DEBUGLOG(6, " with offset=%u (same segment)", (U32)(ip - match)); - assert(ip-match <= LZ4_DISTANCE_MAX); - LZ4_writeLE16(op, (U16)(ip - match)); op+=2; + assert(ip - match <= LZ4_DISTANCE_MAX); + LZ4_writeLE16(op, (U16)(ip - match)); + op += 2; } /* Encode MatchLength */ - { unsigned matchCode; + { + unsigned matchCode; - if ( (dictDirective==usingExtDict || dictDirective==usingDictCtx) - && (lowLimit==dictionary) /* match within extDict */ ) { - const BYTE* limit = ip + (dictEnd-match); + if ((dictDirective == usingExtDict || dictDirective == usingDictCtx) + && (lowLimit == dictionary) /* match within extDict */) { + const BYTE *limit = ip + (dictEnd - match); assert(dictEnd > match); if (limit > matchlimit) limit = matchlimit; - matchCode = LZ4_count(ip+MINMATCH, match+MINMATCH, limit); + matchCode = LZ4_count(ip + MINMATCH, match + MINMATCH, limit); ip += (size_t)matchCode + MINMATCH; - if (ip==limit) { - unsigned const more = LZ4_count(limit, (const BYTE*)source, matchlimit); + if (ip == limit) { + unsigned const more = LZ4_count(limit, (const BYTE *)source, matchlimit); matchCode += more; ip += more; } - DEBUGLOG(6, " with matchLength=%u starting in extDict", matchCode+MINMATCH); + DEBUGLOG(6, " with matchLength=%u starting in extDict", matchCode + MINMATCH); } else { - matchCode = LZ4_count(ip+MINMATCH, match+MINMATCH, matchlimit); + matchCode = LZ4_count(ip + MINMATCH, match + MINMATCH, matchlimit); ip += (size_t)matchCode + MINMATCH; - DEBUGLOG(6, " with matchLength=%u", matchCode+MINMATCH); + DEBUGLOG(6, " with matchLength=%u", matchCode + MINMATCH); } if ((outputDirective) && /* Check output buffer overflow */ - (unlikely(op + (1 + LASTLITERALS) + (matchCode+240)/255 > olimit)) ) { + (unlikely(op + (1 + LASTLITERALS) + (matchCode + 240) / 255 > olimit))) { if (outputDirective == fillOutput) { /* Match description too long : reduce it */ U32 newMatchCode = 15 /* in token */ - 1 /* to avoid needing a zero byte */ + ((U32)(olimit - op) - 1 - LASTLITERALS) * 255; @@ -1046,7 +1045,7 @@ _next_match: * a problem if we reuse the hash table. So we have to remove these positions * from the hash table. */ - const BYTE* ptr; + const BYTE *ptr; DEBUGLOG(5, "Clearing %u positions", (U32)(filledIp - ip)); for (ptr = ip; ptr <= filledIp; ++ptr) { U32 const h = LZ4_hashPosition(ptr, tableType); @@ -1062,10 +1061,10 @@ _next_match: *token += ML_MASK; matchCode -= ML_MASK; LZ4_write32(op, 0xFFFFFFFF); - while (matchCode >= 4*255) { - op+=4; + while (matchCode >= 4 * 255) { + op += 4; LZ4_write32(op, 0xFFFFFFFF); - matchCode -= 4*255; + matchCode -= 4 * 255; } op += matchCode / 255; *op++ = (BYTE)(matchCode % 255); @@ -1081,21 +1080,21 @@ _next_match: if (ip >= mflimitPlusOne) break; /* Fill table */ - LZ4_putPosition(ip-2, cctx->hashTable, tableType, base); + LZ4_putPosition(ip - 2, cctx->hashTable, tableType, base); /* Test next position */ if (tableType == byPtr) { match = LZ4_getPosition(ip, cctx->hashTable, tableType, base); LZ4_putPosition(ip, cctx->hashTable, tableType, base); - if ( (match+LZ4_DISTANCE_MAX >= ip) - && (LZ4_read32(match) == LZ4_read32(ip)) ) - { token=op++; *token=0; goto _next_match; } + if ((match + LZ4_DISTANCE_MAX >= ip) + && (LZ4_read32(match) == LZ4_read32(ip))) + { token = op++; *token = 0; goto _next_match; } } else { /* byU32, byU16 */ U32 const h = LZ4_hashPosition(ip, tableType); - U32 const current = (U32)(ip-base); + U32 const current = (U32)(ip - base); U32 matchIndex = LZ4_getIndexOnHash(h, cctx->hashTable, tableType); assert(matchIndex < current); if (dictDirective == usingDictCtx) { @@ -1107,29 +1106,29 @@ _next_match: matchIndex += dictDelta; } else { match = base + matchIndex; - lowLimit = (const BYTE*)source; /* required for match length counter */ + lowLimit = (const BYTE *)source; /* required for match length counter */ } - } else if (dictDirective==usingExtDict) { + } else if (dictDirective == usingExtDict) { if (matchIndex < startIndex) { match = dictBase + matchIndex; lowLimit = dictionary; /* required for match length counter */ } else { match = base + matchIndex; - lowLimit = (const BYTE*)source; /* required for match length counter */ + lowLimit = (const BYTE *)source; /* required for match length counter */ } } else { /* single memory segment */ match = base + matchIndex; } LZ4_putIndexOnHash(current, h, cctx->hashTable, tableType); assert(matchIndex < current); - if ( ((dictIssue==dictSmall) ? (matchIndex >= prefixIdxLimit) : 1) - && (((tableType==byU16) && (LZ4_DISTANCE_MAX == LZ4_DISTANCE_ABSOLUTE_MAX)) ? 1 : (matchIndex+LZ4_DISTANCE_MAX >= current)) - && (LZ4_read32(match) == LZ4_read32(ip)) ) { - token=op++; - *token=0; + if (((dictIssue == dictSmall) ? (matchIndex >= prefixIdxLimit) : 1) + && (((tableType == byU16) && (LZ4_DISTANCE_MAX == LZ4_DISTANCE_ABSOLUTE_MAX)) ? 1 : (matchIndex + LZ4_DISTANCE_MAX >= current)) + && (LZ4_read32(match) == LZ4_read32(ip))) { + token = op++; + *token = 0; if (maybe_extMem) offset = current - matchIndex; DEBUGLOG(6, "seq.start:%i, literals=%u, match.start:%i", - (int)(anchor-(const BYTE*)source), 0, (int)(ip-(const BYTE*)source)); + (int)(anchor - (const BYTE *)source), 0, (int)(ip - (const BYTE *)source)); goto _next_match; } } @@ -1141,14 +1140,15 @@ _next_match: _last_literals: /* Encode Last Literals */ - { size_t lastRun = (size_t)(iend - anchor); - if ( (outputDirective) && /* Check output buffer overflow */ - (op + lastRun + 1 + ((lastRun+255-RUN_MASK)/255) > olimit)) { + { + size_t lastRun = (size_t)(iend - anchor); + if ((outputDirective) && /* Check output buffer overflow */ + (op + lastRun + 1 + ((lastRun + 255 - RUN_MASK) / 255) > olimit)) { if (outputDirective == fillOutput) { /* adapt lastRun to fill 'dst' */ assert(olimit >= op); - lastRun = (size_t)(olimit-op) - 1; - lastRun -= (lastRun+240)/255; + lastRun = (size_t)(olimit - op) - 1; + lastRun -= (lastRun + 240) / 255; } else { assert(outputDirective == limitedOutput); return 0; /* cannot compress within `dst` budget. Stored indexes in hash table are nonetheless fine */ @@ -1157,10 +1157,10 @@ _last_literals: if (lastRun >= RUN_MASK) { size_t accumulator = lastRun - RUN_MASK; *op++ = RUN_MASK << ML_BITS; - for(; accumulator >= 255 ; accumulator-=255) *op++ = 255; + for (; accumulator >= 255 ; accumulator -= 255) * op++ = 255; *op++ = (BYTE) accumulator; } else { - *op++ = (BYTE)(lastRun<<ML_BITS); + *op++ = (BYTE)(lastRun << ML_BITS); } memcpy(op, anchor, lastRun); ip = anchor + lastRun; @@ -1168,32 +1168,31 @@ _last_literals: } if (outputDirective == fillOutput) { - *inputConsumed = (int) (((const char*)ip)-source); + *inputConsumed = (int)(((const char *)ip) - source); } - DEBUGLOG(5, "LZ4_compress_generic: compressed %i bytes into %i bytes", inputSize, (int)(((char*)op) - dest)); - result = (int)(((char*)op) - dest); + DEBUGLOG(5, "LZ4_compress_generic: compressed %i bytes into %i bytes", inputSize, (int)(((char *)op) - dest)); + result = (int)(((char *)op) - dest); assert(result > 0); return result; } -int LZ4_compress_fast_extState(void* state, const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration) -{ - LZ4_stream_t_internal* const ctx = & LZ4_initStream(state, sizeof(LZ4_stream_t)) -> internal_donotuse; +int LZ4_compress_fast_extState(void *state, const char *source, char *dest, int inputSize, int maxOutputSize, int acceleration) { + LZ4_stream_t_internal *const ctx = & LZ4_initStream(state, sizeof(LZ4_stream_t)) -> internal_donotuse; assert(ctx != NULL); if (acceleration < 1) acceleration = ACCELERATION_DEFAULT; if (maxOutputSize >= LZ4_compressBound(inputSize)) { if (inputSize < LZ4_64Klimit) { return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, 0, notLimited, byU16, noDict, noDictIssue, acceleration); } else { - const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)source > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + const tableType_t tableType = ((sizeof(void *) == 4) && ((uptrval)source > LZ4_DISTANCE_MAX)) ? byPtr : byU32; return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, 0, notLimited, tableType, noDict, noDictIssue, acceleration); } } else { if (inputSize < LZ4_64Klimit) { return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, byU16, noDict, noDictIssue, acceleration); } else { - const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)source > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + const tableType_t tableType = ((sizeof(void *) == 4) && ((uptrval)source > LZ4_DISTANCE_MAX)) ? byPtr : byU32; return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, noDict, noDictIssue, acceleration); } } @@ -1208,9 +1207,8 @@ int LZ4_compress_fast_extState(void* state, const char* source, char* dest, int * (see comment in lz4.h on LZ4_resetStream_fast() for a definition of * "correctly initialized"). */ -int LZ4_compress_fast_extState_fastReset(void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration) -{ - LZ4_stream_t_internal* ctx = &((LZ4_stream_t*)state)->internal_donotuse; +int LZ4_compress_fast_extState_fastReset(void *state, const char *src, char *dst, int srcSize, int dstCapacity, int acceleration) { + LZ4_stream_t_internal *ctx = &((LZ4_stream_t *)state)->internal_donotuse; if (acceleration < 1) acceleration = ACCELERATION_DEFAULT; if (dstCapacity >= LZ4_compressBound(srcSize)) { @@ -1223,7 +1221,7 @@ int LZ4_compress_fast_extState_fastReset(void* state, const char* src, char* dst return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, 0, notLimited, tableType, noDict, noDictIssue, acceleration); } } else { - const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + const tableType_t tableType = ((sizeof(void *) == 4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; LZ4_prepareTable(ctx, srcSize, tableType); return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, 0, notLimited, tableType, noDict, noDictIssue, acceleration); } @@ -1237,7 +1235,7 @@ int LZ4_compress_fast_extState_fastReset(void* state, const char* src, char* dst return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, dstCapacity, limitedOutput, tableType, noDict, noDictIssue, acceleration); } } else { - const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + const tableType_t tableType = ((sizeof(void *) == 4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; LZ4_prepareTable(ctx, srcSize, tableType); return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, dstCapacity, limitedOutput, tableType, noDict, noDictIssue, acceleration); } @@ -1245,15 +1243,14 @@ int LZ4_compress_fast_extState_fastReset(void* state, const char* src, char* dst } -int LZ4_compress_fast(const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration) -{ +int LZ4_compress_fast(const char *source, char *dest, int inputSize, int maxOutputSize, int acceleration) { int result; #if (LZ4_HEAPMODE) - LZ4_stream_t* ctxPtr = ALLOC(sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */ + LZ4_stream_t *ctxPtr = ALLOC(sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */ if (ctxPtr == NULL) return 0; #else LZ4_stream_t ctx; - LZ4_stream_t* const ctxPtr = &ctx; + LZ4_stream_t *const ctxPtr = &ctx; #endif result = LZ4_compress_fast_extState(ctxPtr, source, dest, inputSize, maxOutputSize, acceleration); @@ -1264,24 +1261,22 @@ int LZ4_compress_fast(const char* source, char* dest, int inputSize, int maxOutp } -int LZ4_compress_default(const char* src, char* dst, int srcSize, int maxOutputSize) -{ +int LZ4_compress_default(const char *src, char *dst, int srcSize, int maxOutputSize) { return LZ4_compress_fast(src, dst, srcSize, maxOutputSize, 1); } -int LZ4_compress_fast_force(const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); +int LZ4_compress_fast_force(const char *src, char *dst, int srcSize, int dstCapacity, int acceleration); /* hidden debug function */ /* strangely enough, gcc generates faster code when this function is uncommented, even if unused */ -int LZ4_compress_fast_force(const char* src, char* dst, int srcSize, int dstCapacity, int acceleration) -{ +int LZ4_compress_fast_force(const char *src, char *dst, int srcSize, int dstCapacity, int acceleration) { LZ4_stream_t ctx; LZ4_initStream(&ctx, sizeof(ctx)); if (srcSize < LZ4_64Klimit) { return LZ4_compress_generic(&ctx.internal_donotuse, src, dst, srcSize, NULL, dstCapacity, limitedOutput, byU16, noDict, noDictIssue, acceleration); } else { - tableType_t const addrMode = (sizeof(void*) > 4) ? byU32 : byPtr; + tableType_t const addrMode = (sizeof(void *) > 4) ? byU32 : byPtr; return LZ4_compress_generic(&ctx.internal_donotuse, src, dst, srcSize, NULL, dstCapacity, limitedOutput, addrMode, noDict, noDictIssue, acceleration); } } @@ -1290,10 +1285,10 @@ int LZ4_compress_fast_force(const char* src, char* dst, int srcSize, int dstCapa /* Note!: This function leaves the stream in an unclean/broken state! * It is not safe to subsequently use the same state with a _fastReset() or * _continue() call without resetting it. */ -static int LZ4_compress_destSize_extState (LZ4_stream_t* state, const char* src, char* dst, int* srcSizePtr, int targetDstSize) -{ - void* const s = LZ4_initStream(state, sizeof (*state)); - assert(s != NULL); (void)s; +static int LZ4_compress_destSize_extState(LZ4_stream_t *state, const char *src, char *dst, int *srcSizePtr, int targetDstSize) { + void *const s = LZ4_initStream(state, sizeof(*state)); + assert(s != NULL); + (void)s; if (targetDstSize >= LZ4_compressBound(*srcSizePtr)) { /* compression success is guaranteed */ return LZ4_compress_fast_extState(state, src, dst, *srcSizePtr, targetDstSize, 1); @@ -1301,20 +1296,20 @@ static int LZ4_compress_destSize_extState (LZ4_stream_t* state, const char* src, if (*srcSizePtr < LZ4_64Klimit) { return LZ4_compress_generic(&state->internal_donotuse, src, dst, *srcSizePtr, srcSizePtr, targetDstSize, fillOutput, byU16, noDict, noDictIssue, 1); } else { - tableType_t const addrMode = ((sizeof(void*)==4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + tableType_t const addrMode = ((sizeof(void *) == 4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; return LZ4_compress_generic(&state->internal_donotuse, src, dst, *srcSizePtr, srcSizePtr, targetDstSize, fillOutput, addrMode, noDict, noDictIssue, 1); - } } + } + } } -int LZ4_compress_destSize(const char* src, char* dst, int* srcSizePtr, int targetDstSize) -{ +int LZ4_compress_destSize(const char *src, char *dst, int *srcSizePtr, int targetDstSize) { #if (LZ4_HEAPMODE) - LZ4_stream_t* ctx = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */ + LZ4_stream_t *ctx = (LZ4_stream_t *)ALLOC(sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */ if (ctx == NULL) return 0; #else LZ4_stream_t ctxBody; - LZ4_stream_t* ctx = &ctxBody; + LZ4_stream_t *ctx = &ctxBody; #endif int result = LZ4_compress_destSize_extState(ctx, src, dst, srcSizePtr, targetDstSize); @@ -1331,9 +1326,8 @@ int LZ4_compress_destSize(const char* src, char* dst, int* srcSizePtr, int targe * Streaming functions ********************************/ -LZ4_stream_t* LZ4_createStream(void) -{ - LZ4_stream_t* const lz4s = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t)); +LZ4_stream_t *LZ4_createStream(void) { + LZ4_stream_t *const lz4s = (LZ4_stream_t *)ALLOC(sizeof(LZ4_stream_t)); LZ4_STATIC_ASSERT(LZ4_STREAMSIZE >= sizeof(LZ4_stream_t_internal)); /* A compilation error here means LZ4_STREAMSIZE is not large enough */ DEBUGLOG(4, "LZ4_createStream %p", lz4s); if (lz4s == NULL) return NULL; @@ -1344,15 +1338,13 @@ LZ4_stream_t* LZ4_createStream(void) #ifndef _MSC_VER /* for some reason, Visual fails the aligment test on 32-bit x86 : it reports an aligment of 8-bytes, while actually aligning LZ4_stream_t on 4 bytes. */ -static size_t LZ4_stream_t_alignment(void) -{ +static size_t LZ4_stream_t_alignment(void) { struct { char c; LZ4_stream_t t; } t_a; return sizeof(t_a) - sizeof(t_a.t); } #endif -LZ4_stream_t* LZ4_initStream (void* buffer, size_t size) -{ +LZ4_stream_t *LZ4_initStream(void *buffer, size_t size) { DEBUGLOG(5, "LZ4_initStream"); if (buffer == NULL) { return NULL; } if (size < sizeof(LZ4_stream_t)) { return NULL; } @@ -1362,23 +1354,21 @@ LZ4_stream_t* LZ4_initStream (void* buffer, size_t size) if (((size_t)buffer) & (LZ4_stream_t_alignment() - 1)) { return NULL; } /* alignment check */ #endif MEM_INIT(buffer, 0, sizeof(LZ4_stream_t)); - return (LZ4_stream_t*)buffer; + return (LZ4_stream_t *)buffer; } /* resetStream is now deprecated, * prefer initStream() which is more general */ -void LZ4_resetStream (LZ4_stream_t* LZ4_stream) -{ +void LZ4_resetStream(LZ4_stream_t *LZ4_stream) { DEBUGLOG(5, "LZ4_resetStream (ctx:%p)", LZ4_stream); MEM_INIT(LZ4_stream, 0, sizeof(LZ4_stream_t)); } -void LZ4_resetStream_fast(LZ4_stream_t* ctx) { +void LZ4_resetStream_fast(LZ4_stream_t *ctx) { LZ4_prepareTable(&(ctx->internal_donotuse), 0, byU32); } -int LZ4_freeStream (LZ4_stream_t* LZ4_stream) -{ +int LZ4_freeStream(LZ4_stream_t *LZ4_stream) { if (!LZ4_stream) return 0; /* support free on NULL */ DEBUGLOG(5, "LZ4_freeStream %p", LZ4_stream); FREEMEM(LZ4_stream); @@ -1387,13 +1377,12 @@ int LZ4_freeStream (LZ4_stream_t* LZ4_stream) #define HASH_UNIT sizeof(reg_t) -int LZ4_loadDict (LZ4_stream_t* LZ4_dict, const char* dictionary, int dictSize) -{ - LZ4_stream_t_internal* dict = &LZ4_dict->internal_donotuse; +int LZ4_loadDict(LZ4_stream_t *LZ4_dict, const char *dictionary, int dictSize) { + LZ4_stream_t_internal *dict = &LZ4_dict->internal_donotuse; const tableType_t tableType = byU32; - const BYTE* p = (const BYTE*)dictionary; - const BYTE* const dictEnd = p + dictSize; - const BYTE* base; + const BYTE *p = (const BYTE *)dictionary; + const BYTE *const dictEnd = p + dictSize; + const BYTE *base; DEBUGLOG(4, "LZ4_loadDict (%i bytes from %p into %p)", dictSize, dictionary, LZ4_dict); @@ -1421,17 +1410,17 @@ int LZ4_loadDict (LZ4_stream_t* LZ4_dict, const char* dictionary, int dictSize) dict->dictSize = (U32)(dictEnd - p); dict->tableType = tableType; - while (p <= dictEnd-HASH_UNIT) { + while (p <= dictEnd - HASH_UNIT) { LZ4_putPosition(p, dict->hashTable, tableType, base); - p+=3; + p += 3; } return (int)dict->dictSize; } -void LZ4_attach_dictionary(LZ4_stream_t* workingStream, const LZ4_stream_t* dictionaryStream) { - const LZ4_stream_t_internal* dictCtx = dictionaryStream == NULL ? NULL : - &(dictionaryStream->internal_donotuse); +void LZ4_attach_dictionary(LZ4_stream_t *workingStream, const LZ4_stream_t *dictionaryStream) { + const LZ4_stream_t_internal *dictCtx = dictionaryStream == NULL ? NULL : + &(dictionaryStream->internal_donotuse); DEBUGLOG(4, "LZ4_attach_dictionary (%p, %p, size %u)", workingStream, dictionaryStream, @@ -1463,17 +1452,16 @@ void LZ4_attach_dictionary(LZ4_stream_t* workingStream, const LZ4_stream_t* dict } -static void LZ4_renormDictT(LZ4_stream_t_internal* LZ4_dict, int nextSize) -{ +static void LZ4_renormDictT(LZ4_stream_t_internal *LZ4_dict, int nextSize) { assert(nextSize >= 0); if (LZ4_dict->currentOffset + (unsigned)nextSize > 0x80000000) { /* potential ptrdiff_t overflow (32-bits mode) */ /* rescale hash table */ U32 const delta = LZ4_dict->currentOffset - 64 KB; - const BYTE* dictEnd = LZ4_dict->dictionary + LZ4_dict->dictSize; + const BYTE *dictEnd = LZ4_dict->dictionary + LZ4_dict->dictSize; int i; DEBUGLOG(4, "LZ4_renormDictT"); - for (i=0; i<LZ4_HASH_SIZE_U32; i++) { - if (LZ4_dict->hashTable[i] < delta) LZ4_dict->hashTable[i]=0; + for (i = 0; i < LZ4_HASH_SIZE_U32; i++) { + if (LZ4_dict->hashTable[i] < delta) LZ4_dict->hashTable[i] = 0; else LZ4_dict->hashTable[i] -= delta; } LZ4_dict->currentOffset = 64 KB; @@ -1483,14 +1471,13 @@ static void LZ4_renormDictT(LZ4_stream_t_internal* LZ4_dict, int nextSize) } -int LZ4_compress_fast_continue (LZ4_stream_t* LZ4_stream, - const char* source, char* dest, - int inputSize, int maxOutputSize, - int acceleration) -{ +int LZ4_compress_fast_continue(LZ4_stream_t *LZ4_stream, + const char *source, char *dest, + int inputSize, int maxOutputSize, + int acceleration) { const tableType_t tableType = byU32; - LZ4_stream_t_internal* streamPtr = &LZ4_stream->internal_donotuse; - const BYTE* dictEnd = streamPtr->dictionary + streamPtr->dictSize; + LZ4_stream_t_internal *streamPtr = &LZ4_stream->internal_donotuse; + const BYTE *dictEnd = streamPtr->dictionary + streamPtr->dictSize; DEBUGLOG(5, "LZ4_compress_fast_continue (inputSize=%i)", inputSize); @@ -1499,16 +1486,17 @@ int LZ4_compress_fast_continue (LZ4_stream_t* LZ4_stream, if (acceleration < 1) acceleration = ACCELERATION_DEFAULT; /* invalidate tiny dictionaries */ - if ( (streamPtr->dictSize-1 < 4-1) /* intentional underflow */ - && (dictEnd != (const BYTE*)source) ) { + if ((streamPtr->dictSize - 1 < 4 - 1) /* intentional underflow */ + && (dictEnd != (const BYTE *)source)) { DEBUGLOG(5, "LZ4_compress_fast_continue: dictSize(%u) at addr:%p is too small", streamPtr->dictSize, streamPtr->dictionary); streamPtr->dictSize = 0; - streamPtr->dictionary = (const BYTE*)source; - dictEnd = (const BYTE*)source; + streamPtr->dictionary = (const BYTE *)source; + dictEnd = (const BYTE *)source; } /* Check overlapping input/dictionary space */ - { const BYTE* sourceEnd = (const BYTE*) source + inputSize; + { + const BYTE *sourceEnd = (const BYTE *) source + inputSize; if ((sourceEnd > streamPtr->dictionary) && (sourceEnd < dictEnd)) { streamPtr->dictSize = (U32)(dictEnd - sourceEnd); if (streamPtr->dictSize > 64 KB) streamPtr->dictSize = 64 KB; @@ -1518,7 +1506,7 @@ int LZ4_compress_fast_continue (LZ4_stream_t* LZ4_stream, } /* prefix mode : source data follows dictionary */ - if (dictEnd == (const BYTE*)source) { + if (dictEnd == (const BYTE *)source) { if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) return LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, withPrefix64k, dictSmall, acceleration); else @@ -1526,7 +1514,8 @@ int LZ4_compress_fast_continue (LZ4_stream_t* LZ4_stream, } /* external dictionary mode */ - { int result; + { + int result; if (streamPtr->dictCtx) { /* We depend here on the fact that dictCtx'es (produced by * LZ4_loadDict) guarantee that their tables contain no references @@ -1551,7 +1540,7 @@ int LZ4_compress_fast_continue (LZ4_stream_t* LZ4_stream, result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingExtDict, noDictIssue, acceleration); } } - streamPtr->dictionary = (const BYTE*)source; + streamPtr->dictionary = (const BYTE *)source; streamPtr->dictSize = (U32)inputSize; return result; } @@ -1559,9 +1548,8 @@ int LZ4_compress_fast_continue (LZ4_stream_t* LZ4_stream, /* Hidden debug function, to force-test external dictionary mode */ -int LZ4_compress_forceExtDict (LZ4_stream_t* LZ4_dict, const char* source, char* dest, int srcSize) -{ - LZ4_stream_t_internal* streamPtr = &LZ4_dict->internal_donotuse; +int LZ4_compress_forceExtDict(LZ4_stream_t *LZ4_dict, const char *source, char *dest, int srcSize) { + LZ4_stream_t_internal *streamPtr = &LZ4_dict->internal_donotuse; int result; LZ4_renormDictT(streamPtr, srcSize); @@ -1572,7 +1560,7 @@ int LZ4_compress_forceExtDict (LZ4_stream_t* LZ4_dict, const char* source, char* result = LZ4_compress_generic(streamPtr, source, dest, srcSize, NULL, 0, notLimited, byU32, usingExtDict, noDictIssue, 1); } - streamPtr->dictionary = (const BYTE*)source; + streamPtr->dictionary = (const BYTE *)source; streamPtr->dictSize = (U32)srcSize; return result; @@ -1586,17 +1574,16 @@ int LZ4_compress_forceExtDict (LZ4_stream_t* LZ4_dict, const char* source, char* * dictionary is immediately usable, you can therefore call LZ4_compress_fast_continue(). * Return : saved dictionary size in bytes (necessarily <= dictSize), or 0 if error. */ -int LZ4_saveDict (LZ4_stream_t* LZ4_dict, char* safeBuffer, int dictSize) -{ - LZ4_stream_t_internal* const dict = &LZ4_dict->internal_donotuse; - const BYTE* const previousDictEnd = dict->dictionary + dict->dictSize; +int LZ4_saveDict(LZ4_stream_t *LZ4_dict, char *safeBuffer, int dictSize) { + LZ4_stream_t_internal *const dict = &LZ4_dict->internal_donotuse; + const BYTE *const previousDictEnd = dict->dictionary + dict->dictSize; if ((U32)dictSize > 64 KB) { dictSize = 64 KB; } /* useless to define a dictionary > 64 KB */ if ((U32)dictSize > dict->dictSize) { dictSize = (int)dict->dictSize; } memmove(safeBuffer, previousDictEnd - dictSize, dictSize); - dict->dictionary = (const BYTE*)safeBuffer; + dict->dictionary = (const BYTE *)safeBuffer; dict->dictSize = (U32)dictSize; return dictSize; @@ -1624,29 +1611,28 @@ typedef enum { decode_full_block = 0, partial_decode = 1 } earlyEnd_directive; */ typedef enum { loop_error = -2, initial_error = -1, ok = 0 } variable_length_error; LZ4_FORCE_INLINE unsigned -read_variable_length(const BYTE**ip, const BYTE* lencheck, int loop_check, int initial_check, variable_length_error* error) -{ - unsigned length = 0; - unsigned s; - if (initial_check && unlikely((*ip) >= lencheck)) { /* overflow detection */ - *error = initial_error; - return length; - } - do { - s = **ip; - (*ip)++; - length += s; - if (loop_check && unlikely((*ip) >= lencheck)) { /* overflow detection */ - *error = loop_error; - return length; +read_variable_length(const BYTE **ip, const BYTE *lencheck, int loop_check, int initial_check, variable_length_error *error) { + unsigned length = 0; + unsigned s; + if (initial_check && unlikely((*ip) >= lencheck)) { /* overflow detection */ + *error = initial_error; + return length; } - } while (s==255); + do { + s = **ip; + (*ip)++; + length += s; + if (loop_check && unlikely((*ip) >= lencheck)) { /* overflow detection */ + *error = loop_error; + return length; + } + } while (s == 255); - return length; + return length; } -int LZ4_decompress_generic(const char* const src, char* const dst, int srcSize, int outputSize, endCondition_directive endOnInput, earlyEnd_directive partialDecoding, - dict_directive dict, const BYTE* const lowPrefix, const BYTE* const dictStart, const size_t dictSize ); +int LZ4_decompress_generic(const char *const src, char *const dst, int srcSize, int outputSize, endCondition_directive endOnInput, earlyEnd_directive partialDecoding, + dict_directive dict, const BYTE *const lowPrefix, const BYTE *const dictStart, const size_t dictSize); /*! LZ4_decompress_generic() : * This generic decompression function covers all use cases. @@ -1656,39 +1642,39 @@ int LZ4_decompress_generic(const char* const src, char* const dst, int srcSize, */ int LZ4_decompress_generic( - const char* const src, - char* const dst, - int srcSize, - int outputSize, /* If endOnInput==endOnInputSize, this value is `dstCapacity` */ + const char *const src, + char *const dst, + int srcSize, + int outputSize, /* If endOnInput==endOnInputSize, this value is `dstCapacity` */ - endCondition_directive endOnInput, /* endOnOutputSize, endOnInputSize */ - earlyEnd_directive partialDecoding, /* full, partial */ - dict_directive dict, /* noDict, withPrefix64k, usingExtDict */ - const BYTE* const lowPrefix, /* always <= dst, == dst when no prefix */ - const BYTE* const dictStart, /* only if dict==usingExtDict */ - const size_t dictSize /* note : = 0 if noDict */ - ) -{ + endCondition_directive endOnInput, /* endOnOutputSize, endOnInputSize */ + earlyEnd_directive partialDecoding, /* full, partial */ + dict_directive dict, /* noDict, withPrefix64k, usingExtDict */ + const BYTE *const lowPrefix, /* always <= dst, == dst when no prefix */ + const BYTE *const dictStart, /* only if dict==usingExtDict */ + const size_t dictSize /* note : = 0 if noDict */ +) { if (src == NULL) { return -1; } - { const BYTE* ip = (const BYTE*) src; - const BYTE* const iend = ip + srcSize; + { + const BYTE *ip = (const BYTE *) src; + const BYTE *const iend = ip + srcSize; - BYTE* op = (BYTE*) dst; - BYTE* const oend = op + outputSize; - BYTE* cpy; + BYTE *op = (BYTE *) dst; + BYTE *const oend = op + outputSize; + BYTE *cpy; - const BYTE* const dictEnd = (dictStart == NULL) ? NULL : dictStart + dictSize; + const BYTE *const dictEnd = (dictStart == NULL) ? NULL : dictStart + dictSize; - const int safeDecode = (endOnInput==endOnInputSize); + const int safeDecode = (endOnInput == endOnInputSize); const int checkOffset = ((safeDecode) && (dictSize < (int)(64 KB))); /* Set up the "end" pointers for the shortcut. */ - const BYTE* const shortiend = iend - (endOnInput ? 14 : 8) /*maxLL*/ - 2 /*offset*/; - const BYTE* const shortoend = oend - (endOnInput ? 14 : 8) /*maxLL*/ - 18 /*maxML*/; + const BYTE *const shortiend = iend - (endOnInput ? 14 : 8) /*maxLL*/ - 2 /*offset*/; + const BYTE *const shortoend = oend - (endOnInput ? 14 : 8) /*maxLL*/ - 18 /*maxML*/; - const BYTE* match; + const BYTE *match; size_t offset; unsigned token; size_t length; @@ -1698,15 +1684,15 @@ LZ4_decompress_generic( /* Special cases */ assert(lowPrefix <= op); - if ((endOnInput) && (unlikely(outputSize==0))) { + if ((endOnInput) && (unlikely(outputSize == 0))) { /* Empty output buffer */ if (partialDecoding) return 0; - return ((srcSize==1) && (*ip==0)) ? 0 : -1; + return ((srcSize == 1) && (*ip == 0)) ? 0 : -1; } - if ((!endOnInput) && (unlikely(outputSize==0))) { return (*ip==0 ? 1 : -1); } - if ((endOnInput) && unlikely(srcSize==0)) { return -1; } + if ((!endOnInput) && (unlikely(outputSize == 0))) { return (*ip == 0 ? 1 : -1); } + if ((endOnInput) && unlikely(srcSize == 0)) { return -1; } - /* Currently the fast loop shows a regression on qualcomm arm chips. */ + /* Currently the fast loop shows a regression on qualcomm arm chips. */ #if LZ4_FAST_DEC_LOOP if ((oend - op) < FASTLOOP_SAFE_DISTANCE) { DEBUGLOG(6, "skip fast decode loop"); @@ -1726,42 +1712,45 @@ LZ4_decompress_generic( /* decode literal length */ if (length == RUN_MASK) { variable_length_error error = ok; - length += read_variable_length(&ip, iend-RUN_MASK, endOnInput, endOnInput, &error); + length += read_variable_length(&ip, iend - RUN_MASK, endOnInput, endOnInput, &error); if (error == initial_error) { goto _output_error; } - if ((safeDecode) && unlikely((uptrval)(op)+length<(uptrval)(op))) { goto _output_error; } /* overflow detection */ - if ((safeDecode) && unlikely((uptrval)(ip)+length<(uptrval)(ip))) { goto _output_error; } /* overflow detection */ + if ((safeDecode) && unlikely((uptrval)(op) + length < (uptrval)(op))) { goto _output_error; } /* overflow detection */ + if ((safeDecode) && unlikely((uptrval)(ip) + length < (uptrval)(ip))) { goto _output_error; } /* overflow detection */ /* copy literals */ - cpy = op+length; + cpy = op + length; LZ4_STATIC_ASSERT(MFLIMIT >= WILDCOPYLENGTH); if (endOnInput) { /* LZ4_decompress_safe() */ - if ((cpy>oend-32) || (ip+length>iend-32)) { goto safe_literal_copy; } + if ((cpy > oend - 32) || (ip + length > iend - 32)) { goto safe_literal_copy; } LZ4_wildCopy32(op, ip, cpy); } else { /* LZ4_decompress_fast() */ - if (cpy>oend-8) { goto safe_literal_copy; } + if (cpy > oend - 8) { goto safe_literal_copy; } LZ4_wildCopy8(op, ip, cpy); /* LZ4_decompress_fast() cannot copy more than 8 bytes at a time : * it doesn't know input length, and only relies on end-of-block properties */ } - ip += length; op = cpy; + ip += length; + op = cpy; } else { - cpy = op+length; + cpy = op + length; if (endOnInput) { /* LZ4_decompress_safe() */ DEBUGLOG(7, "copy %u bytes in a 16-bytes stripe", (unsigned)length); /* We don't need to check oend, since we check it once for each loop below */ - if (ip > iend-(16 + 1/*max lit + offset + nextToken*/)) { goto safe_literal_copy; } + if (ip > iend - (16 + 1/*max lit + offset + nextToken*/)) { goto safe_literal_copy; } /* Literals can only be 14, but hope compilers optimize if we copy by a register size */ memcpy(op, ip, 16); } else { /* LZ4_decompress_fast() */ /* LZ4_decompress_fast() cannot copy more than 8 bytes at a time : * it doesn't know input length, and relies on end-of-block properties */ memcpy(op, ip, 8); - if (length > 8) { memcpy(op+8, ip+8, 8); } + if (length > 8) { memcpy(op + 8, ip + 8, 8); } } - ip += length; op = cpy; + ip += length; + op = cpy; } /* get offset */ - offset = LZ4_readLE16(ip); ip+=2; + offset = LZ4_readLE16(ip); + ip += 2; match = op - offset; assert(match <= op); @@ -1769,11 +1758,11 @@ LZ4_decompress_generic( length = token & ML_MASK; if (length == ML_MASK) { - variable_length_error error = ok; - if ((checkOffset) && (unlikely(match + dictSize < lowPrefix))) { goto _output_error; } /* Error : offset outside buffers */ - length += read_variable_length(&ip, iend - LASTLITERALS + 1, endOnInput, 0, &error); - if (error != ok) { goto _output_error; } - if ((safeDecode) && unlikely((uptrval)(op)+length<(uptrval)op)) { goto _output_error; } /* overflow detection */ + variable_length_error error = ok; + if ((checkOffset) && (unlikely(match + dictSize < lowPrefix))) { goto _output_error; } /* Error : offset outside buffers */ + length += read_variable_length(&ip, iend - LASTLITERALS + 1, endOnInput, 0, &error); + if (error != ok) { goto _output_error; } + if ((safeDecode) && unlikely((uptrval)(op) + length < (uptrval)op)) { goto _output_error; } /* overflow detection */ length += MINMATCH; if (op + length >= oend - FASTLOOP_SAFE_DISTANCE) { goto safe_match_copy; @@ -1792,25 +1781,28 @@ LZ4_decompress_generic( assert(op + 18 <= oend); memcpy(op, match, 8); - memcpy(op+8, match+8, 8); - memcpy(op+16, match+16, 2); + memcpy(op + 8, match + 8, 8); + memcpy(op + 16, match + 16, 2); op += length; continue; - } } } + } + } + } if ((checkOffset) && (unlikely(match + dictSize < lowPrefix))) { goto _output_error; } /* Error : offset outside buffers */ /* match starting within external dictionary */ - if ((dict==usingExtDict) && (match < lowPrefix)) { - if (unlikely(op+length > oend-LASTLITERALS)) { + if ((dict == usingExtDict) && (match < lowPrefix)) { + if (unlikely(op + length > oend - LASTLITERALS)) { if (partialDecoding) { - length = MIN(length, (size_t)(oend-op)); /* reach end of buffer */ + length = MIN(length, (size_t)(oend - op)); /* reach end of buffer */ } else { goto _output_error; /* end-of-block condition violated */ - } } + } + } - if (length <= (size_t)(lowPrefix-match)) { + if (length <= (size_t)(lowPrefix - match)) { /* match fits entirely within external dictionary : just copy */ - memmove(op, dictEnd - (lowPrefix-match), length); + memmove(op, dictEnd - (lowPrefix - match), length); op += length; } else { /* match stretches into both external dictionary and current block */ @@ -1819,21 +1811,22 @@ LZ4_decompress_generic( memcpy(op, dictEnd - copySize, copySize); op += copySize; if (restSize > (size_t)(op - lowPrefix)) { /* overlap copy */ - BYTE* const endOfMatch = op + restSize; - const BYTE* copyFrom = lowPrefix; + BYTE *const endOfMatch = op + restSize; + const BYTE *copyFrom = lowPrefix; while (op < endOfMatch) { *op++ = *copyFrom++; } } else { memcpy(op, lowPrefix, restSize); op += restSize; - } } + } + } continue; } /* copy match within block */ cpy = op + length; - assert((op <= oend) && (oend-op >= 32)); - if (unlikely(offset<16)) { + assert((op <= oend) && (oend - op >= 32)); + if (unlikely(offset < 16)) { LZ4_memcpy_using_offset(op, match, cpy, offset); } else { LZ4_wildCopy32(op, match, cpy); @@ -1841,7 +1834,7 @@ LZ4_decompress_generic( op = cpy; /* wildcopy correction */ } - safe_decode: +safe_decode: #endif /* Main Loop : decode remaining sequences where output < FASTLOOP_SAFE_DISTANCE */ @@ -1860,28 +1853,30 @@ LZ4_decompress_generic( * those 18 bytes earlier, upon entering the shortcut (in other words, * there is a combined check for both stages). */ - if ( (endOnInput ? length != RUN_MASK : length <= 8) - /* strictly "less than" on input, to re-enter the loop with at least one byte */ - && likely((endOnInput ? ip < shortiend : 1) & (op <= shortoend)) ) { + if ((endOnInput ? length != RUN_MASK : length <= 8) + /* strictly "less than" on input, to re-enter the loop with at least one byte */ + && likely((endOnInput ? ip < shortiend : 1) & (op <= shortoend))) { /* Copy the literals */ memcpy(op, ip, endOnInput ? 16 : 8); - op += length; ip += length; + op += length; + ip += length; /* The second stage: prepare for match copying, decode full info. * If it doesn't work out, the info won't be wasted. */ length = token & ML_MASK; /* match length */ - offset = LZ4_readLE16(ip); ip += 2; + offset = LZ4_readLE16(ip); + ip += 2; match = op - offset; assert(match <= op); /* check overflow */ /* Do not deal with overlapping matches. */ - if ( (length != ML_MASK) - && (offset >= 8) - && (dict==withPrefix64k || match >= lowPrefix) ) { + if ((length != ML_MASK) + && (offset >= 8) + && (dict == withPrefix64k || match >= lowPrefix)) { /* Copy the match. */ memcpy(op + 0, match + 0, 8); memcpy(op + 8, match + 8, 8); - memcpy(op +16, match +16, 2); + memcpy(op + 16, match + 16, 2); op += length + MINMATCH; /* Both stages worked, load the next token. */ continue; @@ -1895,21 +1890,20 @@ LZ4_decompress_generic( /* decode literal length */ if (length == RUN_MASK) { variable_length_error error = ok; - length += read_variable_length(&ip, iend-RUN_MASK, endOnInput, endOnInput, &error); + length += read_variable_length(&ip, iend - RUN_MASK, endOnInput, endOnInput, &error); if (error == initial_error) { goto _output_error; } - if ((safeDecode) && unlikely((uptrval)(op)+length<(uptrval)(op))) { goto _output_error; } /* overflow detection */ - if ((safeDecode) && unlikely((uptrval)(ip)+length<(uptrval)(ip))) { goto _output_error; } /* overflow detection */ + if ((safeDecode) && unlikely((uptrval)(op) + length < (uptrval)(op))) { goto _output_error; } /* overflow detection */ + if ((safeDecode) && unlikely((uptrval)(ip) + length < (uptrval)(ip))) { goto _output_error; } /* overflow detection */ } /* copy literals */ - cpy = op+length; + cpy = op + length; #if LZ4_FAST_DEC_LOOP - safe_literal_copy: +safe_literal_copy: #endif LZ4_STATIC_ASSERT(MFLIMIT >= WILDCOPYLENGTH); - if ( ((endOnInput) && ((cpy>oend-MFLIMIT) || (ip+length>iend-(2+1+LASTLITERALS))) ) - || ((!endOnInput) && (cpy>oend-WILDCOPYLENGTH)) ) - { + if (((endOnInput) && ((cpy > oend - MFLIMIT) || (ip + length > iend - (2 + 1 + LASTLITERALS)))) + || ((!endOnInput) && (cpy > oend - WILDCOPYLENGTH))) { /* We've either hit the input parsing restriction or the output parsing restriction. * If we've hit the input parsing condition then this must be the last sequence. * If we've hit the output parsing condition then we are either using partialDecoding @@ -1923,26 +1917,26 @@ LZ4_decompress_generic( /* If we're in this block because of the input parsing condition, then we must be on the * last sequence (or invalid), so we must check that we exactly consume the input. */ - if ((ip+length>iend-(2+1+LASTLITERALS)) && (ip+length != iend)) { goto _output_error; } - assert(ip+length <= iend); + if ((ip + length > iend - (2 + 1 + LASTLITERALS)) && (ip + length != iend)) { goto _output_error; } + assert(ip + length <= iend); /* We are finishing in the middle of a literals segment. * Break after the copy. */ if (cpy > oend) { cpy = oend; - assert(op<=oend); - length = (size_t)(oend-op); + assert(op <= oend); + length = (size_t)(oend - op); } - assert(ip+length <= iend); + assert(ip + length <= iend); } else { /* We must be on the last sequence because of the parsing limitations so check * that we exactly regenerate the original size (must be exact when !endOnInput). */ if ((!endOnInput) && (cpy != oend)) { goto _output_error; } - /* We must be on the last sequence (or invalid) because of the parsing limitations - * so check that we exactly consume the input and don't overrun the output buffer. - */ - if ((endOnInput) && ((ip+length != iend) || (cpy > oend))) { goto _output_error; } + /* We must be on the last sequence (or invalid) because of the parsing limitations + * so check that we exactly consume the input and don't overrun the output buffer. + */ + if ((endOnInput) && ((ip + length != iend) || (cpy > oend))) { goto _output_error; } } memmove(op, ip, length); /* supports overlapping memory regions, which only matters for in-place decompression scenarios */ ip += length; @@ -1956,39 +1950,41 @@ LZ4_decompress_generic( } } else { LZ4_wildCopy8(op, ip, cpy); /* may overwrite up to WILDCOPYLENGTH beyond cpy */ - ip += length; op = cpy; + ip += length; + op = cpy; } /* get offset */ - offset = LZ4_readLE16(ip); ip+=2; + offset = LZ4_readLE16(ip); + ip += 2; match = op - offset; /* get matchlength */ length = token & ML_MASK; - _copy_match: +_copy_match: if (length == ML_MASK) { - variable_length_error error = ok; - length += read_variable_length(&ip, iend - LASTLITERALS + 1, endOnInput, 0, &error); - if (error != ok) goto _output_error; - if ((safeDecode) && unlikely((uptrval)(op)+length<(uptrval)op)) goto _output_error; /* overflow detection */ + variable_length_error error = ok; + length += read_variable_length(&ip, iend - LASTLITERALS + 1, endOnInput, 0, &error); + if (error != ok) goto _output_error; + if ((safeDecode) && unlikely((uptrval)(op) + length < (uptrval)op)) goto _output_error; /* overflow detection */ } length += MINMATCH; #if LZ4_FAST_DEC_LOOP - safe_match_copy: +safe_match_copy: #endif if ((checkOffset) && (unlikely(match + dictSize < lowPrefix))) goto _output_error; /* Error : offset outside buffers */ /* match starting within external dictionary */ - if ((dict==usingExtDict) && (match < lowPrefix)) { - if (unlikely(op+length > oend-LASTLITERALS)) { - if (partialDecoding) length = MIN(length, (size_t)(oend-op)); + if ((dict == usingExtDict) && (match < lowPrefix)) { + if (unlikely(op + length > oend - LASTLITERALS)) { + if (partialDecoding) length = MIN(length, (size_t)(oend - op)); else goto _output_error; /* doesn't respect parsing restriction */ } - if (length <= (size_t)(lowPrefix-match)) { + if (length <= (size_t)(lowPrefix - match)) { /* match fits entirely within external dictionary : just copy */ - memmove(op, dictEnd - (lowPrefix-match), length); + memmove(op, dictEnd - (lowPrefix - match), length); op += length; } else { /* match stretches into both external dictionary and current block */ @@ -1997,13 +1993,14 @@ LZ4_decompress_generic( memcpy(op, dictEnd - copySize, copySize); op += copySize; if (restSize > (size_t)(op - lowPrefix)) { /* overlap copy */ - BYTE* const endOfMatch = op + restSize; - const BYTE* copyFrom = lowPrefix; + BYTE *const endOfMatch = op + restSize; + const BYTE *copyFrom = lowPrefix; while (op < endOfMatch) *op++ = *copyFrom++; } else { memcpy(op, lowPrefix, restSize); op += restSize; - } } + } + } continue; } assert(match >= lowPrefix); @@ -2012,11 +2009,11 @@ LZ4_decompress_generic( cpy = op + length; /* partialDecoding : may end anywhere within the block */ - assert(op<=oend); - if (partialDecoding && (cpy > oend-MATCH_SAFEGUARD_DISTANCE)) { - size_t const mlen = MIN(length, (size_t)(oend-op)); - const BYTE* const matchEnd = match + mlen; - BYTE* const copyEnd = op + mlen; + assert(op <= oend); + if (partialDecoding && (cpy > oend - MATCH_SAFEGUARD_DISTANCE)) { + size_t const mlen = MIN(length, (size_t)(oend - op)); + const BYTE *const matchEnd = match + mlen; + BYTE *const copyEnd = op + mlen; if (matchEnd > op) { /* overlap copy */ while (op < copyEnd) { *op++ = *match++; } } else { @@ -2027,14 +2024,14 @@ LZ4_decompress_generic( continue; } - if (unlikely(offset<8)) { + if (unlikely(offset < 8)) { LZ4_write32(op, 0); /* silence msan warning when offset==0 */ op[0] = match[0]; op[1] = match[1]; op[2] = match[2]; op[3] = match[3]; match += inc32table[offset]; - memcpy(op+4, match, 4); + memcpy(op + 4, match, 4); match -= dec64table[offset]; } else { memcpy(op, match, 8); @@ -2042,9 +2039,9 @@ LZ4_decompress_generic( } op += 8; - if (unlikely(cpy > oend-MATCH_SAFEGUARD_DISTANCE)) { - BYTE* const oCopyLimit = oend - (WILDCOPYLENGTH-1); - if (cpy > oend-LASTLITERALS) { goto _output_error; } /* Error : last LASTLITERALS bytes must be literals (uncompressed) */ + if (unlikely(cpy > oend - MATCH_SAFEGUARD_DISTANCE)) { + BYTE *const oCopyLimit = oend - (WILDCOPYLENGTH - 1); + if (cpy > oend - LASTLITERALS) { goto _output_error; } /* Error : last LASTLITERALS bytes must be literals (uncompressed) */ if (op < oCopyLimit) { LZ4_wildCopy8(op, match, oCopyLimit); match += oCopyLimit - op; @@ -2053,21 +2050,21 @@ LZ4_decompress_generic( while (op < cpy) { *op++ = *match++; } } else { memcpy(op, match, 8); - if (length > 16) { LZ4_wildCopy8(op+8, match+8, cpy); } + if (length > 16) { LZ4_wildCopy8(op + 8, match + 8, cpy); } } op = cpy; /* wildcopy correction */ } /* end of decoding */ if (endOnInput) { - return (int) (((char*)op)-dst); /* Nb of output bytes decoded */ - } else { - return (int) (((const char*)ip)-src); /* Nb of input bytes read */ - } + return (int)(((char *)op) - dst); /* Nb of output bytes decoded */ + } else { + return (int)(((const char *)ip) - src); /* Nb of input bytes read */ + } /* Overflow error detected */ - _output_error: - return (int) (-(((const char*)ip)-src))-1; +_output_error: + return (int)(-(((const char *)ip) - src)) - 1; } } @@ -2075,74 +2072,66 @@ LZ4_decompress_generic( /*===== Instantiate the API decoding functions. =====*/ LZ4_FORCE_O2_GCC_PPC64LE -int LZ4_decompress_safe(const char* source, char* dest, int compressedSize, int maxDecompressedSize) -{ +int LZ4_decompress_safe(const char *source, char *dest, int compressedSize, int maxDecompressedSize) { return LZ4_decompress_generic(source, dest, compressedSize, maxDecompressedSize, endOnInputSize, decode_full_block, noDict, - (BYTE*)dest, NULL, 0); + (BYTE *)dest, NULL, 0); } LZ4_FORCE_O2_GCC_PPC64LE -int LZ4_decompress_safe_partial(const char* src, char* dst, int compressedSize, int targetOutputSize, int dstCapacity) -{ +int LZ4_decompress_safe_partial(const char *src, char *dst, int compressedSize, int targetOutputSize, int dstCapacity) { dstCapacity = MIN(targetOutputSize, dstCapacity); return LZ4_decompress_generic(src, dst, compressedSize, dstCapacity, endOnInputSize, partial_decode, - noDict, (BYTE*)dst, NULL, 0); + noDict, (BYTE *)dst, NULL, 0); } LZ4_FORCE_O2_GCC_PPC64LE -int LZ4_decompress_fast(const char* source, char* dest, int originalSize) -{ +int LZ4_decompress_fast(const char *source, char *dest, int originalSize) { return LZ4_decompress_generic(source, dest, 0, originalSize, endOnOutputSize, decode_full_block, withPrefix64k, - (BYTE*)dest - 64 KB, NULL, 0); + (BYTE *)dest - 64 KB, NULL, 0); } /*===== Instantiate a few more decoding cases, used more than once. =====*/ LZ4_FORCE_O2_GCC_PPC64LE /* Exported, an obsolete API function. */ -int LZ4_decompress_safe_withPrefix64k(const char* source, char* dest, int compressedSize, int maxOutputSize) -{ +int LZ4_decompress_safe_withPrefix64k(const char *source, char *dest, int compressedSize, int maxOutputSize) { return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, endOnInputSize, decode_full_block, withPrefix64k, - (BYTE*)dest - 64 KB, NULL, 0); + (BYTE *)dest - 64 KB, NULL, 0); } /* Another obsolete API function, paired with the previous one. */ -int LZ4_decompress_fast_withPrefix64k(const char* source, char* dest, int originalSize) -{ +int LZ4_decompress_fast_withPrefix64k(const char *source, char *dest, int originalSize) { /* LZ4_decompress_fast doesn't validate match offsets, * and thus serves well with any prefixed dictionary. */ return LZ4_decompress_fast(source, dest, originalSize); } LZ4_FORCE_O2_GCC_PPC64LE -static int LZ4_decompress_safe_withSmallPrefix(const char* source, char* dest, int compressedSize, int maxOutputSize, - size_t prefixSize) -{ +static int LZ4_decompress_safe_withSmallPrefix(const char *source, char *dest, int compressedSize, int maxOutputSize, + size_t prefixSize) { return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, endOnInputSize, decode_full_block, noDict, - (BYTE*)dest-prefixSize, NULL, 0); + (BYTE *)dest - prefixSize, NULL, 0); } LZ4_FORCE_O2_GCC_PPC64LE -int LZ4_decompress_safe_forceExtDict(const char* source, char* dest, +int LZ4_decompress_safe_forceExtDict(const char *source, char *dest, int compressedSize, int maxOutputSize, - const void* dictStart, size_t dictSize) -{ + const void *dictStart, size_t dictSize) { return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, endOnInputSize, decode_full_block, usingExtDict, - (BYTE*)dest, (const BYTE*)dictStart, dictSize); + (BYTE *)dest, (const BYTE *)dictStart, dictSize); } LZ4_FORCE_O2_GCC_PPC64LE -static int LZ4_decompress_fast_extDict(const char* source, char* dest, int originalSize, - const void* dictStart, size_t dictSize) -{ +static int LZ4_decompress_fast_extDict(const char *source, char *dest, int originalSize, + const void *dictStart, size_t dictSize) { return LZ4_decompress_generic(source, dest, 0, originalSize, endOnOutputSize, decode_full_block, usingExtDict, - (BYTE*)dest, (const BYTE*)dictStart, dictSize); + (BYTE *)dest, (const BYTE *)dictStart, dictSize); } /* The "double dictionary" mode, for use with e.g. ring buffers: the first part @@ -2150,34 +2139,30 @@ static int LZ4_decompress_fast_extDict(const char* source, char* dest, int origi * These routines are used only once, in LZ4_decompress_*_continue(). */ LZ4_FORCE_INLINE -int LZ4_decompress_safe_doubleDict(const char* source, char* dest, int compressedSize, int maxOutputSize, - size_t prefixSize, const void* dictStart, size_t dictSize) -{ +int LZ4_decompress_safe_doubleDict(const char *source, char *dest, int compressedSize, int maxOutputSize, + size_t prefixSize, const void *dictStart, size_t dictSize) { return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, endOnInputSize, decode_full_block, usingExtDict, - (BYTE*)dest-prefixSize, (const BYTE*)dictStart, dictSize); + (BYTE *)dest - prefixSize, (const BYTE *)dictStart, dictSize); } LZ4_FORCE_INLINE -int LZ4_decompress_fast_doubleDict(const char* source, char* dest, int originalSize, - size_t prefixSize, const void* dictStart, size_t dictSize) -{ +int LZ4_decompress_fast_doubleDict(const char *source, char *dest, int originalSize, + size_t prefixSize, const void *dictStart, size_t dictSize) { return LZ4_decompress_generic(source, dest, 0, originalSize, endOnOutputSize, decode_full_block, usingExtDict, - (BYTE*)dest-prefixSize, (const BYTE*)dictStart, dictSize); + (BYTE *)dest - prefixSize, (const BYTE *)dictStart, dictSize); } /*===== streaming decompression functions =====*/ -LZ4_streamDecode_t* LZ4_createStreamDecode(void) -{ - LZ4_streamDecode_t* lz4s = (LZ4_streamDecode_t*) ALLOC_AND_ZERO(sizeof(LZ4_streamDecode_t)); +LZ4_streamDecode_t *LZ4_createStreamDecode(void) { + LZ4_streamDecode_t *lz4s = (LZ4_streamDecode_t *) ALLOC_AND_ZERO(sizeof(LZ4_streamDecode_t)); LZ4_STATIC_ASSERT(LZ4_STREAMDECODESIZE >= sizeof(LZ4_streamDecode_t_internal)); /* A compilation error here means LZ4_STREAMDECODESIZE is not large enough */ return lz4s; } -int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream) -{ +int LZ4_freeStreamDecode(LZ4_streamDecode_t *LZ4_stream) { if (LZ4_stream == NULL) { return 0; } /* support free on NULL */ FREEMEM(LZ4_stream); return 0; @@ -2189,11 +2174,10 @@ int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream) * Loading a size of 0 is allowed (same effect as no dictionary). * @return : 1 if OK, 0 if error */ -int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize) -{ - LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse; +int LZ4_setStreamDecode(LZ4_streamDecode_t *LZ4_streamDecode, const char *dictionary, int dictSize) { + LZ4_streamDecode_t_internal *lz4sd = &LZ4_streamDecode->internal_donotuse; lz4sd->prefixSize = (size_t) dictSize; - lz4sd->prefixEnd = (const BYTE*) dictionary + dictSize; + lz4sd->prefixEnd = (const BYTE *) dictionary + dictSize; lz4sd->externalDict = NULL; lz4sd->extDictSize = 0; return 1; @@ -2210,8 +2194,7 @@ int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dicti * @return : minimum ring buffer size, * or 0 if there is an error (invalid maxBlockSize). */ -int LZ4_decoderRingBufferSize(int maxBlockSize) -{ +int LZ4_decoderRingBufferSize(int maxBlockSize) { if (maxBlockSize < 0) return 0; if (maxBlockSize > LZ4_MAX_INPUT_SIZE) return 0; if (maxBlockSize < 16) maxBlockSize = 16; @@ -2226,9 +2209,8 @@ int LZ4_decoderRingBufferSize(int maxBlockSize) and indicate where it stands using LZ4_setStreamDecode() */ LZ4_FORCE_O2_GCC_PPC64LE -int LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int compressedSize, int maxOutputSize) -{ - LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse; +int LZ4_decompress_safe_continue(LZ4_streamDecode_t *LZ4_streamDecode, const char *source, char *dest, int compressedSize, int maxOutputSize) { + LZ4_streamDecode_t_internal *lz4sd = &LZ4_streamDecode->internal_donotuse; int result; if (lz4sd->prefixSize == 0) { @@ -2237,8 +2219,8 @@ int LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, const ch result = LZ4_decompress_safe(source, dest, compressedSize, maxOutputSize); if (result <= 0) return result; lz4sd->prefixSize = (size_t)result; - lz4sd->prefixEnd = (BYTE*)dest + result; - } else if (lz4sd->prefixEnd == (BYTE*)dest) { + lz4sd->prefixEnd = (BYTE *)dest + result; + } else if (lz4sd->prefixEnd == (BYTE *)dest) { /* They're rolling the current segment. */ if (lz4sd->prefixSize >= 64 KB - 1) result = LZ4_decompress_safe_withPrefix64k(source, dest, compressedSize, maxOutputSize); @@ -2259,16 +2241,15 @@ int LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, const ch lz4sd->externalDict, lz4sd->extDictSize); if (result <= 0) return result; lz4sd->prefixSize = (size_t)result; - lz4sd->prefixEnd = (BYTE*)dest + result; + lz4sd->prefixEnd = (BYTE *)dest + result; } return result; } LZ4_FORCE_O2_GCC_PPC64LE -int LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int originalSize) -{ - LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse; +int LZ4_decompress_fast_continue(LZ4_streamDecode_t *LZ4_streamDecode, const char *source, char *dest, int originalSize) { + LZ4_streamDecode_t_internal *lz4sd = &LZ4_streamDecode->internal_donotuse; int result; assert(originalSize >= 0); @@ -2277,8 +2258,8 @@ int LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, const ch result = LZ4_decompress_fast(source, dest, originalSize); if (result <= 0) return result; lz4sd->prefixSize = (size_t)originalSize; - lz4sd->prefixEnd = (BYTE*)dest + originalSize; - } else if (lz4sd->prefixEnd == (BYTE*)dest) { + lz4sd->prefixEnd = (BYTE *)dest + originalSize; + } else if (lz4sd->prefixEnd == (BYTE *)dest) { if (lz4sd->prefixSize >= 64 KB - 1 || lz4sd->extDictSize == 0) result = LZ4_decompress_fast(source, dest, originalSize); else @@ -2294,7 +2275,7 @@ int LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, const ch lz4sd->externalDict, lz4sd->extDictSize); if (result <= 0) return result; lz4sd->prefixSize = (size_t)originalSize; - lz4sd->prefixEnd = (BYTE*)dest + originalSize; + lz4sd->prefixEnd = (BYTE *)dest + originalSize; } return result; @@ -2308,11 +2289,10 @@ Advanced decoding functions : the dictionary must be explicitly provided within parameters */ -int LZ4_decompress_safe_usingDict(const char* source, char* dest, int compressedSize, int maxOutputSize, const char* dictStart, int dictSize) -{ - if (dictSize==0) +int LZ4_decompress_safe_usingDict(const char *source, char *dest, int compressedSize, int maxOutputSize, const char *dictStart, int dictSize) { + if (dictSize == 0) return LZ4_decompress_safe(source, dest, compressedSize, maxOutputSize); - if (dictStart+dictSize == dest) { + if (dictStart + dictSize == dest) { if (dictSize >= 64 KB - 1) { return LZ4_decompress_safe_withPrefix64k(source, dest, compressedSize, maxOutputSize); } @@ -2323,9 +2303,8 @@ int LZ4_decompress_safe_usingDict(const char* source, char* dest, int compressed return LZ4_decompress_safe_forceExtDict(source, dest, compressedSize, maxOutputSize, dictStart, (size_t)dictSize); } -int LZ4_decompress_fast_usingDict(const char* source, char* dest, int originalSize, const char* dictStart, int dictSize) -{ - if (dictSize==0 || dictStart+dictSize == dest) +int LZ4_decompress_fast_usingDict(const char *source, char *dest, int originalSize, const char *dictStart, int dictSize) { + if (dictSize == 0 || dictStart + dictSize == dest) return LZ4_decompress_fast(source, dest, originalSize); assert(dictSize >= 0); return LZ4_decompress_fast_extDict(source, dest, originalSize, dictStart, (size_t)dictSize); @@ -2336,28 +2315,22 @@ int LZ4_decompress_fast_usingDict(const char* source, char* dest, int originalSi * Obsolete Functions ***************************************************/ /* obsolete compression functions */ -int LZ4_compress_limitedOutput(const char* source, char* dest, int inputSize, int maxOutputSize) -{ +int LZ4_compress_limitedOutput(const char *source, char *dest, int inputSize, int maxOutputSize) { return LZ4_compress_default(source, dest, inputSize, maxOutputSize); } -int LZ4_compress(const char* src, char* dest, int srcSize) -{ +int LZ4_compress(const char *src, char *dest, int srcSize) { return LZ4_compress_default(src, dest, srcSize, LZ4_compressBound(srcSize)); } -int LZ4_compress_limitedOutput_withState (void* state, const char* src, char* dst, int srcSize, int dstSize) -{ +int LZ4_compress_limitedOutput_withState(void *state, const char *src, char *dst, int srcSize, int dstSize) { return LZ4_compress_fast_extState(state, src, dst, srcSize, dstSize, 1); } -int LZ4_compress_withState (void* state, const char* src, char* dst, int srcSize) -{ +int LZ4_compress_withState(void *state, const char *src, char *dst, int srcSize) { return LZ4_compress_fast_extState(state, src, dst, srcSize, LZ4_compressBound(srcSize), 1); } -int LZ4_compress_limitedOutput_continue (LZ4_stream_t* LZ4_stream, const char* src, char* dst, int srcSize, int dstCapacity) -{ +int LZ4_compress_limitedOutput_continue(LZ4_stream_t *LZ4_stream, const char *src, char *dst, int srcSize, int dstCapacity) { return LZ4_compress_fast_continue(LZ4_stream, src, dst, srcSize, dstCapacity, 1); } -int LZ4_compress_continue (LZ4_stream_t* LZ4_stream, const char* source, char* dest, int inputSize) -{ +int LZ4_compress_continue(LZ4_stream_t *LZ4_stream, const char *source, char *dest, int inputSize) { return LZ4_compress_fast_continue(LZ4_stream, source, dest, inputSize, LZ4_compressBound(inputSize), 1); } @@ -2367,12 +2340,10 @@ They are only provided here for compatibility with older user programs. - LZ4_uncompress is totally equivalent to LZ4_decompress_fast - LZ4_uncompress_unknownOutputSize is totally equivalent to LZ4_decompress_safe */ -int LZ4_uncompress (const char* source, char* dest, int outputSize) -{ +int LZ4_uncompress(const char *source, char *dest, int outputSize) { return LZ4_decompress_fast(source, dest, outputSize); } -int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize) -{ +int LZ4_uncompress_unknownOutputSize(const char *source, char *dest, int isize, int maxOutputSize) { return LZ4_decompress_safe(source, dest, isize, maxOutputSize); } @@ -2380,23 +2351,20 @@ int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int LZ4_sizeofStreamState() { return LZ4_STREAMSIZE; } -int LZ4_resetStreamState(void* state, char* inputBuffer) -{ +int LZ4_resetStreamState(void *state, char *inputBuffer) { (void)inputBuffer; - LZ4_resetStream((LZ4_stream_t*)state); + LZ4_resetStream((LZ4_stream_t *)state); return 0; } -void* LZ4_create (char* inputBuffer) -{ +void *LZ4_create(char *inputBuffer) { (void)inputBuffer; return LZ4_createStream(); } -char* LZ4_slideInputBuffer (void* state) -{ +char *LZ4_slideInputBuffer(void *state) { /* avoid const char * -> char * conversion warning */ - return (char *)(uptrval)((LZ4_stream_t*)state)->internal_donotuse.dictionary; + return (char *)(uptrval)((LZ4_stream_t *)state)->internal_donotuse.dictionary; } #endif /* LZ4_COMMONDEFS_ONLY */ diff --git a/common/lz4/lz4.h b/common/lz4/lz4.h index 32108e232..82e8008e1 100644 --- a/common/lz4/lz4.h +++ b/common/lz4/lz4.h @@ -109,8 +109,8 @@ extern "C" { #define LZ4_EXPAND_AND_QUOTE(str) LZ4_QUOTE(str) #define LZ4_VERSION_STRING LZ4_EXPAND_AND_QUOTE(LZ4_LIB_VERSION) -LZ4LIB_API int LZ4_versionNumber (void); /**< library version number; useful to check dll version */ -LZ4LIB_API const char* LZ4_versionString (void); /**< library version string; useful to check dll version */ +LZ4LIB_API int LZ4_versionNumber(void); /**< library version number; useful to check dll version */ +LZ4LIB_API const char *LZ4_versionString(void); /**< library version string; useful to check dll version */ /*-************************************ @@ -145,7 +145,7 @@ LZ4LIB_API const char* LZ4_versionString (void); /**< library version string; * or 0 if compression fails * Note : This function is protected against buffer overflow scenarios (never writes outside 'dst' buffer, nor read outside 'source' buffer). */ -LZ4LIB_API int LZ4_compress_default(const char* src, char* dst, int srcSize, int dstCapacity); +LZ4LIB_API int LZ4_compress_default(const char *src, char *dst, int srcSize, int dstCapacity); /*! LZ4_decompress_safe() : * compressedSize : is the exact complete size of the compressed block. @@ -161,7 +161,7 @@ LZ4LIB_API int LZ4_compress_default(const char* src, char* dst, int srcSize, int * The implementation is free to send / store / derive this information in whichever way is most beneficial. * If there is a need for a different format which bundles together both compressed data and its metadata, consider looking at lz4frame.h instead. */ -LZ4LIB_API int LZ4_decompress_safe (const char* src, char* dst, int compressedSize, int dstCapacity); +LZ4LIB_API int LZ4_decompress_safe(const char *src, char *dst, int compressedSize, int dstCapacity); /*-************************************ @@ -188,7 +188,7 @@ LZ4LIB_API int LZ4_compressBound(int inputSize); An acceleration value of "1" is the same as regular LZ4_compress_default() Values <= 0 will be replaced by ACCELERATION_DEFAULT (currently == 1, see lz4.c). */ -LZ4LIB_API int LZ4_compress_fast (const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); +LZ4LIB_API int LZ4_compress_fast(const char *src, char *dst, int srcSize, int dstCapacity, int acceleration); /*! LZ4_compress_fast_extState() : @@ -198,7 +198,7 @@ LZ4LIB_API int LZ4_compress_fast (const char* src, char* dst, int srcSize, int d * Then, provide this buffer as `void* state` to compression function. */ LZ4LIB_API int LZ4_sizeofState(void); -LZ4LIB_API int LZ4_compress_fast_extState (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); +LZ4LIB_API int LZ4_compress_fast_extState(void *state, const char *src, char *dst, int srcSize, int dstCapacity, int acceleration); /*! LZ4_compress_destSize() : @@ -213,7 +213,7 @@ LZ4LIB_API int LZ4_compress_fast_extState (void* state, const char* src, char* d * @return : Nb bytes written into 'dst' (necessarily <= targetDestSize) * or 0 if compression fails. */ -LZ4LIB_API int LZ4_compress_destSize (const char* src, char* dst, int* srcSizePtr, int targetDstSize); +LZ4LIB_API int LZ4_compress_destSize(const char *src, char *dst, int *srcSizePtr, int targetDstSize); /*! LZ4_decompress_safe_partial() : @@ -240,7 +240,7 @@ LZ4LIB_API int LZ4_compress_destSize (const char* src, char* dst, int* srcSizePt * This is no longer necessary. * The function nonetheless keeps its signature, in an effort to not break API. */ -LZ4LIB_API int LZ4_decompress_safe_partial (const char* src, char* dst, int srcSize, int targetOutputSize, int dstCapacity); +LZ4LIB_API int LZ4_decompress_safe_partial(const char *src, char *dst, int srcSize, int targetOutputSize, int dstCapacity); /*-********************************************* @@ -248,8 +248,8 @@ LZ4LIB_API int LZ4_decompress_safe_partial (const char* src, char* dst, int srcS ***********************************************/ typedef union LZ4_stream_u LZ4_stream_t; /* incomplete type (defined later) */ -LZ4LIB_API LZ4_stream_t* LZ4_createStream(void); -LZ4LIB_API int LZ4_freeStream (LZ4_stream_t* streamPtr); +LZ4LIB_API LZ4_stream_t *LZ4_createStream(void); +LZ4LIB_API int LZ4_freeStream(LZ4_stream_t *streamPtr); /*! LZ4_resetStream_fast() : v1.9.0+ * Use this to prepare an LZ4_stream_t for a new chain of dependent blocks @@ -273,7 +273,7 @@ LZ4LIB_API int LZ4_freeStream (LZ4_stream_t* streamPtr); * The *extState* functions perform their own resets. * Invoking LZ4_resetStream_fast() before is redundant, and even counterproductive. */ -LZ4LIB_API void LZ4_resetStream_fast (LZ4_stream_t* streamPtr); +LZ4LIB_API void LZ4_resetStream_fast(LZ4_stream_t *streamPtr); /*! LZ4_loadDict() : * Use this function to reference a static dictionary into LZ4_stream_t. @@ -286,7 +286,7 @@ LZ4LIB_API void LZ4_resetStream_fast (LZ4_stream_t* streamPtr); * Loading a size of 0 is allowed, and is the same as reset. * @return : loaded dictionary size, in bytes (necessarily <= 64 KB) */ -LZ4LIB_API int LZ4_loadDict (LZ4_stream_t* streamPtr, const char* dictionary, int dictSize); +LZ4LIB_API int LZ4_loadDict(LZ4_stream_t *streamPtr, const char *dictionary, int dictSize); /*! LZ4_compress_fast_continue() : * Compress 'src' content using data from previously compressed blocks, for better compression ratio. @@ -311,7 +311,7 @@ LZ4LIB_API int LZ4_loadDict (LZ4_stream_t* streamPtr, const char* dictionary, in * * Note 5 : After an error, the stream status is undefined (invalid), it can only be reset or freed. */ -LZ4LIB_API int LZ4_compress_fast_continue (LZ4_stream_t* streamPtr, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); +LZ4LIB_API int LZ4_compress_fast_continue(LZ4_stream_t *streamPtr, const char *src, char *dst, int srcSize, int dstCapacity, int acceleration); /*! LZ4_saveDict() : * If last 64KB data cannot be guaranteed to remain available at its current memory location, @@ -320,7 +320,7 @@ LZ4LIB_API int LZ4_compress_fast_continue (LZ4_stream_t* streamPtr, const char* * but is much faster, because LZ4_saveDict() doesn't need to rebuild tables. * @return : saved dictionary size in bytes (necessarily <= maxDictSize), or 0 if error. */ -LZ4LIB_API int LZ4_saveDict (LZ4_stream_t* streamPtr, char* safeBuffer, int maxDictSize); +LZ4LIB_API int LZ4_saveDict(LZ4_stream_t *streamPtr, char *safeBuffer, int maxDictSize); /*-********************************************** @@ -333,8 +333,8 @@ typedef union LZ4_streamDecode_u LZ4_streamDecode_t; /* tracking context */ * creation / destruction of streaming decompression tracking context. * A tracking context can be re-used multiple times. */ -LZ4LIB_API LZ4_streamDecode_t* LZ4_createStreamDecode(void); -LZ4LIB_API int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream); +LZ4LIB_API LZ4_streamDecode_t *LZ4_createStreamDecode(void); +LZ4LIB_API int LZ4_freeStreamDecode(LZ4_streamDecode_t *LZ4_stream); /*! LZ4_setStreamDecode() : * An LZ4_streamDecode_t context can be allocated once and re-used multiple times. @@ -343,7 +343,7 @@ LZ4LIB_API int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_str * Dictionary is presumed stable : it must remain accessible and unmodified during next decompression. * @return : 1 if OK, 0 if error */ -LZ4LIB_API int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize); +LZ4LIB_API int LZ4_setStreamDecode(LZ4_streamDecode_t *LZ4_streamDecode, const char *dictionary, int dictSize); /*! LZ4_decoderRingBufferSize() : v1.8.2+ * Note : in a ring buffer scenario (optional), @@ -384,7 +384,7 @@ LZ4LIB_API int LZ4_decoderRingBufferSize(int maxBlockSize); * save the last 64KB of decoded data into a safe buffer where it can't be modified during decompression, * then indicate where this data is saved using LZ4_setStreamDecode(), before decompressing next block. */ -LZ4LIB_API int LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* src, char* dst, int srcSize, int dstCapacity); +LZ4LIB_API int LZ4_decompress_safe_continue(LZ4_streamDecode_t *LZ4_streamDecode, const char *src, char *dst, int srcSize, int dstCapacity); /*! LZ4_decompress_*_usingDict() : @@ -395,7 +395,7 @@ LZ4LIB_API int LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecod * Performance tip : Decompression speed can be substantially increased * when dst == dictStart + dictSize. */ -LZ4LIB_API int LZ4_decompress_safe_usingDict (const char* src, char* dst, int srcSize, int dstCapcity, const char* dictStart, int dictSize); +LZ4LIB_API int LZ4_decompress_safe_usingDict(const char *src, char *dst, int srcSize, int dstCapcity, const char *dictStart, int dictSize); #endif /* LZ4_H_2983827168210 */ @@ -446,7 +446,7 @@ LZ4LIB_API int LZ4_decompress_safe_usingDict (const char* src, char* dst, int sr * this function initializes the provided state with a call to something like LZ4_resetStream_fast() * while LZ4_compress_fast_extState() starts with a call to LZ4_resetStream(). */ -LZ4LIB_STATIC_API int LZ4_compress_fast_extState_fastReset (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); +LZ4LIB_STATIC_API int LZ4_compress_fast_extState_fastReset(void *state, const char *src, char *dst, int srcSize, int dstCapacity, int acceleration); /*! LZ4_attach_dictionary() : * This is an experimental API that allows @@ -474,7 +474,7 @@ LZ4LIB_STATIC_API int LZ4_compress_fast_extState_fastReset (void* state, const c * stream (and source buffer) must remain in-place / accessible / unchanged * through the completion of the first compression call on the stream. */ -LZ4LIB_STATIC_API void LZ4_attach_dictionary(LZ4_stream_t* workingStream, const LZ4_stream_t* dictionaryStream); +LZ4LIB_STATIC_API void LZ4_attach_dictionary(LZ4_stream_t *workingStream, const LZ4_stream_t *dictionaryStream); /*! In-place compression and decompression @@ -566,15 +566,15 @@ struct LZ4_stream_t_internal { uint32_t currentOffset; uint16_t dirty; uint16_t tableType; - const uint8_t* dictionary; - const LZ4_stream_t_internal* dictCtx; + const uint8_t *dictionary; + const LZ4_stream_t_internal *dictCtx; uint32_t dictSize; }; typedef struct { - const uint8_t* externalDict; + const uint8_t *externalDict; size_t extDictSize; - const uint8_t* prefixEnd; + const uint8_t *prefixEnd; size_t prefixSize; } LZ4_streamDecode_t_internal; @@ -586,14 +586,14 @@ struct LZ4_stream_t_internal { unsigned int currentOffset; unsigned short dirty; unsigned short tableType; - const unsigned char* dictionary; - const LZ4_stream_t_internal* dictCtx; + const unsigned char *dictionary; + const LZ4_stream_t_internal *dictCtx; unsigned int dictSize; }; typedef struct { - const unsigned char* externalDict; - const unsigned char* prefixEnd; + const unsigned char *externalDict; + const unsigned char *prefixEnd; size_t extDictSize; size_t prefixSize; } LZ4_streamDecode_t_internal; @@ -630,7 +630,7 @@ union LZ4_stream_u { * Note2: An LZ4_stream_t structure guarantees correct alignment and size. * Note3: Before v1.9.0, use LZ4_resetStream() instead */ -LZ4LIB_API LZ4_stream_t* LZ4_initStream (void* buffer, size_t size); +LZ4LIB_API LZ4_stream_t *LZ4_initStream(void *buffer, size_t size); /*! LZ4_streamDecode_t : @@ -683,16 +683,16 @@ union LZ4_streamDecode_u { #endif /* LZ4_DISABLE_DEPRECATE_WARNINGS */ /* Obsolete compression functions */ -LZ4_DEPRECATED("use LZ4_compress_default() instead") LZ4LIB_API int LZ4_compress (const char* src, char* dest, int srcSize); -LZ4_DEPRECATED("use LZ4_compress_default() instead") LZ4LIB_API int LZ4_compress_limitedOutput (const char* src, char* dest, int srcSize, int maxOutputSize); -LZ4_DEPRECATED("use LZ4_compress_fast_extState() instead") LZ4LIB_API int LZ4_compress_withState (void* state, const char* source, char* dest, int inputSize); -LZ4_DEPRECATED("use LZ4_compress_fast_extState() instead") LZ4LIB_API int LZ4_compress_limitedOutput_withState (void* state, const char* source, char* dest, int inputSize, int maxOutputSize); -LZ4_DEPRECATED("use LZ4_compress_fast_continue() instead") LZ4LIB_API int LZ4_compress_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize); -LZ4_DEPRECATED("use LZ4_compress_fast_continue() instead") LZ4LIB_API int LZ4_compress_limitedOutput_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize, int maxOutputSize); +LZ4_DEPRECATED("use LZ4_compress_default() instead") LZ4LIB_API int LZ4_compress(const char *src, char *dest, int srcSize); +LZ4_DEPRECATED("use LZ4_compress_default() instead") LZ4LIB_API int LZ4_compress_limitedOutput(const char *src, char *dest, int srcSize, int maxOutputSize); +LZ4_DEPRECATED("use LZ4_compress_fast_extState() instead") LZ4LIB_API int LZ4_compress_withState(void *state, const char *source, char *dest, int inputSize); +LZ4_DEPRECATED("use LZ4_compress_fast_extState() instead") LZ4LIB_API int LZ4_compress_limitedOutput_withState(void *state, const char *source, char *dest, int inputSize, int maxOutputSize); +LZ4_DEPRECATED("use LZ4_compress_fast_continue() instead") LZ4LIB_API int LZ4_compress_continue(LZ4_stream_t *LZ4_streamPtr, const char *source, char *dest, int inputSize); +LZ4_DEPRECATED("use LZ4_compress_fast_continue() instead") LZ4LIB_API int LZ4_compress_limitedOutput_continue(LZ4_stream_t *LZ4_streamPtr, const char *source, char *dest, int inputSize, int maxOutputSize); /* Obsolete decompression functions */ -LZ4_DEPRECATED("use LZ4_decompress_fast() instead") LZ4LIB_API int LZ4_uncompress (const char* source, char* dest, int outputSize); -LZ4_DEPRECATED("use LZ4_decompress_safe() instead") LZ4LIB_API int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize); +LZ4_DEPRECATED("use LZ4_decompress_fast() instead") LZ4LIB_API int LZ4_uncompress(const char *source, char *dest, int outputSize); +LZ4_DEPRECATED("use LZ4_decompress_safe() instead") LZ4LIB_API int LZ4_uncompress_unknownOutputSize(const char *source, char *dest, int isize, int maxOutputSize); /* Obsolete streaming functions; degraded functionality; do not use! * @@ -703,14 +703,14 @@ LZ4_DEPRECATED("use LZ4_decompress_safe() instead") LZ4LIB_API int LZ4_uncompres * achieved will therefore be no better than compressing each chunk * independently. */ -LZ4_DEPRECATED("Use LZ4_createStream() instead") LZ4LIB_API void* LZ4_create (char* inputBuffer); +LZ4_DEPRECATED("Use LZ4_createStream() instead") LZ4LIB_API void *LZ4_create(char *inputBuffer); LZ4_DEPRECATED("Use LZ4_createStream() instead") LZ4LIB_API int LZ4_sizeofStreamState(void); -LZ4_DEPRECATED("Use LZ4_resetStream() instead") LZ4LIB_API int LZ4_resetStreamState(void* state, char* inputBuffer); -LZ4_DEPRECATED("Use LZ4_saveDict() instead") LZ4LIB_API char* LZ4_slideInputBuffer (void* state); +LZ4_DEPRECATED("Use LZ4_resetStream() instead") LZ4LIB_API int LZ4_resetStreamState(void *state, char *inputBuffer); +LZ4_DEPRECATED("Use LZ4_saveDict() instead") LZ4LIB_API char *LZ4_slideInputBuffer(void *state); /* Obsolete streaming decoding functions */ -LZ4_DEPRECATED("use LZ4_decompress_safe_usingDict() instead") LZ4LIB_API int LZ4_decompress_safe_withPrefix64k (const char* src, char* dst, int compressedSize, int maxDstSize); -LZ4_DEPRECATED("use LZ4_decompress_fast_usingDict() instead") LZ4LIB_API int LZ4_decompress_fast_withPrefix64k (const char* src, char* dst, int originalSize); +LZ4_DEPRECATED("use LZ4_decompress_safe_usingDict() instead") LZ4LIB_API int LZ4_decompress_safe_withPrefix64k(const char *src, char *dst, int compressedSize, int maxDstSize); +LZ4_DEPRECATED("use LZ4_decompress_fast_usingDict() instead") LZ4LIB_API int LZ4_decompress_fast_withPrefix64k(const char *src, char *dst, int originalSize); /*! LZ4_decompress_fast() : **unsafe!** * These functions used to be faster than LZ4_decompress_safe(), @@ -741,11 +741,11 @@ LZ4_DEPRECATED("use LZ4_decompress_fast_usingDict() instead") LZ4LIB_API int LZ4 */ LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe() instead") -LZ4LIB_API int LZ4_decompress_fast (const char* src, char* dst, int originalSize); +LZ4LIB_API int LZ4_decompress_fast(const char *src, char *dst, int originalSize); LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe_continue() instead") -LZ4LIB_API int LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* src, char* dst, int originalSize); +LZ4LIB_API int LZ4_decompress_fast_continue(LZ4_streamDecode_t *LZ4_streamDecode, const char *src, char *dst, int originalSize); LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe_usingDict() instead") -LZ4LIB_API int LZ4_decompress_fast_usingDict (const char* src, char* dst, int originalSize, const char* dictStart, int dictSize); +LZ4LIB_API int LZ4_decompress_fast_usingDict(const char *src, char *dst, int originalSize, const char *dictStart, int dictSize); /*! LZ4_resetStream() : * An LZ4_stream_t structure must be initialized at least once. @@ -753,7 +753,7 @@ LZ4LIB_API int LZ4_decompress_fast_usingDict (const char* src, char* dst, int or * Consider switching to LZ4_initStream(), * invoking LZ4_resetStream() will trigger deprecation warnings in the future. */ -LZ4LIB_API void LZ4_resetStream (LZ4_stream_t* streamPtr); +LZ4LIB_API void LZ4_resetStream(LZ4_stream_t *streamPtr); #endif /* LZ4_H_98237428734687 */ diff --git a/common/lz4/lz4hc.c b/common/lz4/lz4hc.c index 5922ed7b1..a12cddccc 100644 --- a/common/lz4/lz4hc.c +++ b/common/lz4/lz4hc.c @@ -84,20 +84,18 @@ typedef enum { noDictCtx, usingDictCtxHc } dictCtx_directive; /* Make fields passed to, and updated by LZ4HC_encodeSequence explicit */ #define UPDATABLE(ip, op, anchor) &ip, &op, &anchor -static U32 LZ4HC_hashPtr(const void* ptr) { return HASH_FUNCTION(LZ4_read32(ptr)); } +static U32 LZ4HC_hashPtr(const void *ptr) { return HASH_FUNCTION(LZ4_read32(ptr)); } /************************************** * HC Compression **************************************/ -static void LZ4HC_clearTables (LZ4HC_CCtx_internal* hc4) -{ - MEM_INIT((void*)hc4->hashTable, 0, sizeof(hc4->hashTable)); +static void LZ4HC_clearTables(LZ4HC_CCtx_internal *hc4) { + MEM_INIT((void *)hc4->hashTable, 0, sizeof(hc4->hashTable)); MEM_INIT(hc4->chainTable, 0xFF, sizeof(hc4->chainTable)); } -static void LZ4HC_init_internal (LZ4HC_CCtx_internal* hc4, const BYTE* start) -{ +static void LZ4HC_init_internal(LZ4HC_CCtx_internal *hc4, const BYTE *start) { uptrval startingOffset = (uptrval)(hc4->end - hc4->base); if (startingOffset > 1 GB) { LZ4HC_clearTables(hc4); @@ -114,18 +112,17 @@ static void LZ4HC_init_internal (LZ4HC_CCtx_internal* hc4, const BYTE* start) /* Update chains up to ip (excluded) */ -LZ4_FORCE_INLINE void LZ4HC_Insert (LZ4HC_CCtx_internal* hc4, const BYTE* ip) -{ - U16* const chainTable = hc4->chainTable; - U32* const hashTable = hc4->hashTable; - const BYTE* const base = hc4->base; +LZ4_FORCE_INLINE void LZ4HC_Insert(LZ4HC_CCtx_internal *hc4, const BYTE *ip) { + U16 *const chainTable = hc4->chainTable; + U32 *const hashTable = hc4->hashTable; + const BYTE *const base = hc4->base; U32 const target = (U32)(ip - base); U32 idx = hc4->nextToUpdate; while (idx < target) { - U32 const h = LZ4HC_hashPtr(base+idx); + U32 const h = LZ4HC_hashPtr(base + idx); size_t delta = idx - hashTable[h]; - if (delta>LZ4_DISTANCE_MAX) delta = LZ4_DISTANCE_MAX; + if (delta > LZ4_DISTANCE_MAX) delta = LZ4_DISTANCE_MAX; DELTANEXTU16(chainTable, idx) = (U16)delta; hashTable[h] = idx; idx++; @@ -137,17 +134,18 @@ LZ4_FORCE_INLINE void LZ4HC_Insert (LZ4HC_CCtx_internal* hc4, const BYTE* ip) /** LZ4HC_countBack() : * @return : negative value, nb of common bytes before ip/match */ LZ4_FORCE_INLINE -int LZ4HC_countBack(const BYTE* const ip, const BYTE* const match, - const BYTE* const iMin, const BYTE* const mMin) -{ +int LZ4HC_countBack(const BYTE *const ip, const BYTE *const match, + const BYTE *const iMin, const BYTE *const mMin) { int back = 0; int const min = (int)MAX(iMin - ip, mMin - match); assert(min <= 0); - assert(ip >= iMin); assert((size_t)(ip-iMin) < (1U<<31)); - assert(match >= mMin); assert((size_t)(match - mMin) < (1U<<31)); - while ( (back > min) - && (ip[back-1] == match[back-1]) ) - back--; + assert(ip >= iMin); + assert((size_t)(ip - iMin) < (1U << 31)); + assert(match >= mMin); + assert((size_t)(match - mMin) < (1U << 31)); + while ((back > min) + && (ip[back - 1] == match[back - 1])) + back--; return back; } @@ -158,8 +156,7 @@ int LZ4HC_countBack(const BYTE* const ip, const BYTE* const match, #endif -static U32 LZ4HC_rotatePattern(size_t const rotate, U32 const pattern) -{ +static U32 LZ4HC_rotatePattern(size_t const rotate, U32 const pattern) { size_t const bitsToRotate = (rotate & (sizeof(pattern) - 1)) << 3; if (bitsToRotate == 0) return pattern; @@ -169,29 +166,30 @@ static U32 LZ4HC_rotatePattern(size_t const rotate, U32 const pattern) /* LZ4HC_countPattern() : * pattern32 must be a sample of repetitive pattern of length 1, 2 or 4 (but not 3!) */ static unsigned -LZ4HC_countPattern(const BYTE* ip, const BYTE* const iEnd, U32 const pattern32) -{ - const BYTE* const iStart = ip; - reg_t const pattern = (sizeof(pattern)==8) ? (reg_t)pattern32 + (((reg_t)pattern32) << 32) : pattern32; +LZ4HC_countPattern(const BYTE *ip, const BYTE *const iEnd, U32 const pattern32) { + const BYTE *const iStart = ip; + reg_t const pattern = (sizeof(pattern) == 8) ? (reg_t)pattern32 + (((reg_t)pattern32) << 32) : pattern32; - while (likely(ip < iEnd-(sizeof(pattern)-1))) { + while (likely(ip < iEnd - (sizeof(pattern) - 1))) { reg_t const diff = LZ4_read_ARCH(ip) ^ pattern; - if (!diff) { ip+=sizeof(pattern); continue; } + if (!diff) { ip += sizeof(pattern); continue; } ip += LZ4_NbCommonBytes(diff); return (unsigned)(ip - iStart); } if (LZ4_isLittleEndian()) { reg_t patternByte = pattern; - while ((ip<iEnd) && (*ip == (BYTE)patternByte)) { - ip++; patternByte >>= 8; + while ((ip < iEnd) && (*ip == (BYTE)patternByte)) { + ip++; + patternByte >>= 8; } } else { /* big endian */ - U32 bitOffset = (sizeof(pattern)*8) - 8; + U32 bitOffset = (sizeof(pattern) * 8) - 8; while (ip < iEnd) { BYTE const byte = (BYTE)(pattern >> bitOffset); if (*ip != byte) break; - ip ++; bitOffset -= 8; + ip ++; + bitOffset -= 8; } } @@ -202,19 +200,21 @@ LZ4HC_countPattern(const BYTE* ip, const BYTE* const iEnd, U32 const pattern32) * pattern must be a sample of repetitive pattern of length 1, 2 or 4 (but not 3!) * read using natural platform endianess */ static unsigned -LZ4HC_reverseCountPattern(const BYTE* ip, const BYTE* const iLow, U32 pattern) -{ - const BYTE* const iStart = ip; +LZ4HC_reverseCountPattern(const BYTE *ip, const BYTE *const iLow, U32 pattern) { + const BYTE *const iStart = ip; - while (likely(ip >= iLow+4)) { - if (LZ4_read32(ip-4) != pattern) break; + while (likely(ip >= iLow + 4)) { + if (LZ4_read32(ip - 4) != pattern) break; ip -= 4; } - { const BYTE* bytePtr = (const BYTE*)(&pattern) + 3; /* works for any endianess */ - while (likely(ip>iLow)) { + { + const BYTE *bytePtr = (const BYTE *)(&pattern) + 3; /* works for any endianess */ + while (likely(ip > iLow)) { if (ip[-1] != *bytePtr) break; - ip--; bytePtr--; - } } + ip--; + bytePtr--; + } + } return (unsigned)(iStart - ip); } @@ -223,39 +223,37 @@ LZ4HC_reverseCountPattern(const BYTE* ip, const BYTE* const iLow, U32 pattern) * 4 byte MINMATCH would overflow. * @returns true if the match index is okay. */ -static int LZ4HC_protectDictEnd(U32 const dictLimit, U32 const matchIndex) -{ +static int LZ4HC_protectDictEnd(U32 const dictLimit, U32 const matchIndex) { return ((U32)((dictLimit - 1) - matchIndex) >= 3); } typedef enum { rep_untested, rep_not, rep_confirmed } repeat_state_e; -typedef enum { favorCompressionRatio=0, favorDecompressionSpeed } HCfavor_e; +typedef enum { favorCompressionRatio = 0, favorDecompressionSpeed } HCfavor_e; LZ4_FORCE_INLINE int -LZ4HC_InsertAndGetWiderMatch ( - LZ4HC_CCtx_internal* hc4, - const BYTE* const ip, - const BYTE* const iLowLimit, - const BYTE* const iHighLimit, +LZ4HC_InsertAndGetWiderMatch( + LZ4HC_CCtx_internal *hc4, + const BYTE *const ip, + const BYTE *const iLowLimit, + const BYTE *const iHighLimit, int longest, - const BYTE** matchpos, - const BYTE** startpos, + const BYTE **matchpos, + const BYTE **startpos, const int maxNbAttempts, const int patternAnalysis, const int chainSwap, const dictCtx_directive dict, - const HCfavor_e favorDecSpeed) -{ - U16* const chainTable = hc4->chainTable; - U32* const HashTable = hc4->hashTable; - const LZ4HC_CCtx_internal * const dictCtx = hc4->dictCtx; - const BYTE* const base = hc4->base; + const HCfavor_e favorDecSpeed) { + U16 *const chainTable = hc4->chainTable; + U32 *const HashTable = hc4->hashTable; + const LZ4HC_CCtx_internal *const dictCtx = hc4->dictCtx; + const BYTE *const base = hc4->base; const U32 dictLimit = hc4->dictLimit; - const BYTE* const lowPrefixPtr = base + dictLimit; + const BYTE *const lowPrefixPtr = base + dictLimit; const U32 ipIndex = (U32)(ip - base); const U32 lowestMatchIndex = (hc4->lowLimit + (LZ4_DISTANCE_MAX + 1) > ipIndex) ? hc4->lowLimit : ipIndex - LZ4_DISTANCE_MAX; - const BYTE* const dictBase = hc4->dictBase; - int const lookBackLength = (int)(ip-iLowLimit); + const BYTE *const dictBase = hc4->dictBase; + int const lookBackLength = (int)(ip - iLowLimit); int nbAttempts = maxNbAttempts; U32 matchChainPos = 0; U32 const pattern = LZ4_read32(ip); @@ -268,49 +266,53 @@ LZ4HC_InsertAndGetWiderMatch ( LZ4HC_Insert(hc4, ip); matchIndex = HashTable[LZ4HC_hashPtr(ip)]; DEBUGLOG(7, "First match at index %u / %u (lowestMatchIndex)", - matchIndex, lowestMatchIndex); + matchIndex, lowestMatchIndex); - while ((matchIndex>=lowestMatchIndex) && (nbAttempts)) { - int matchLength=0; + while ((matchIndex >= lowestMatchIndex) && (nbAttempts)) { + int matchLength = 0; nbAttempts--; assert(matchIndex < ipIndex); if (favorDecSpeed && (ipIndex - matchIndex < 8)) { /* do nothing */ } else if (matchIndex >= dictLimit) { /* within current Prefix */ - const BYTE* const matchPtr = base + matchIndex; + const BYTE *const matchPtr = base + matchIndex; assert(matchPtr >= lowPrefixPtr); assert(matchPtr < ip); assert(longest >= 1); if (LZ4_read16(iLowLimit + longest - 1) == LZ4_read16(matchPtr - lookBackLength + longest - 1)) { if (LZ4_read32(matchPtr) == pattern) { int const back = lookBackLength ? LZ4HC_countBack(ip, matchPtr, iLowLimit, lowPrefixPtr) : 0; - matchLength = MINMATCH + (int)LZ4_count(ip+MINMATCH, matchPtr+MINMATCH, iHighLimit); + matchLength = MINMATCH + (int)LZ4_count(ip + MINMATCH, matchPtr + MINMATCH, iHighLimit); matchLength -= back; if (matchLength > longest) { longest = matchLength; *matchpos = matchPtr + back; *startpos = ip + back; - } } } + } + } + } } else { /* lowestMatchIndex <= matchIndex < dictLimit */ - const BYTE* const matchPtr = dictBase + matchIndex; + const BYTE *const matchPtr = dictBase + matchIndex; if (LZ4_read32(matchPtr) == pattern) { - const BYTE* const dictStart = dictBase + hc4->lowLimit; + const BYTE *const dictStart = dictBase + hc4->lowLimit; int back = 0; - const BYTE* vLimit = ip + (dictLimit - matchIndex); + const BYTE *vLimit = ip + (dictLimit - matchIndex); if (vLimit > iHighLimit) vLimit = iHighLimit; - matchLength = (int)LZ4_count(ip+MINMATCH, matchPtr+MINMATCH, vLimit) + MINMATCH; - if ((ip+matchLength == vLimit) && (vLimit < iHighLimit)) - matchLength += LZ4_count(ip+matchLength, lowPrefixPtr, iHighLimit); + matchLength = (int)LZ4_count(ip + MINMATCH, matchPtr + MINMATCH, vLimit) + MINMATCH; + if ((ip + matchLength == vLimit) && (vLimit < iHighLimit)) + matchLength += LZ4_count(ip + matchLength, lowPrefixPtr, iHighLimit); back = lookBackLength ? LZ4HC_countBack(ip, matchPtr, iLowLimit, dictStart) : 0; matchLength -= back; if (matchLength > longest) { longest = matchLength; *matchpos = base + matchIndex + back; /* virtual pos, relative to ip, to retrieve offset */ *startpos = ip + back; - } } } + } + } + } - if (chainSwap && matchLength==longest) { /* better match => select a better chain */ - assert(lookBackLength==0); /* search forward only */ + if (chainSwap && matchLength == longest) { /* better match => select a better chain */ + assert(lookBackLength == 0); /* search forward only */ if (matchIndex + (U32)longest <= ipIndex) { int const kTrigger = 4; U32 distanceToNextMatch = 1; @@ -331,33 +333,38 @@ LZ4HC_InsertAndGetWiderMatch ( if (distanceToNextMatch > matchIndex) break; /* avoid overflow */ matchIndex -= distanceToNextMatch; continue; - } } } + } + } + } - { U32 const distNextMatch = DELTANEXTU16(chainTable, matchIndex); - if (patternAnalysis && distNextMatch==1 && matchChainPos==0) { - U32 const matchCandidateIdx = matchIndex-1; + { + U32 const distNextMatch = DELTANEXTU16(chainTable, matchIndex); + if (patternAnalysis && distNextMatch == 1 && matchChainPos == 0) { + U32 const matchCandidateIdx = matchIndex - 1; /* may be a repeated pattern */ if (repeat == rep_untested) { - if ( ((pattern & 0xFFFF) == (pattern >> 16)) - & ((pattern & 0xFF) == (pattern >> 24)) ) { + if (((pattern & 0xFFFF) == (pattern >> 16)) + & ((pattern & 0xFF) == (pattern >> 24))) { repeat = rep_confirmed; - srcPatternLength = LZ4HC_countPattern(ip+sizeof(pattern), iHighLimit, pattern) + sizeof(pattern); + srcPatternLength = LZ4HC_countPattern(ip + sizeof(pattern), iHighLimit, pattern) + sizeof(pattern); } else { repeat = rep_not; - } } - if ( (repeat == rep_confirmed) && (matchCandidateIdx >= lowestMatchIndex) - && LZ4HC_protectDictEnd(dictLimit, matchCandidateIdx) ) { + } + } + if ((repeat == rep_confirmed) && (matchCandidateIdx >= lowestMatchIndex) + && LZ4HC_protectDictEnd(dictLimit, matchCandidateIdx)) { const int extDict = matchCandidateIdx < dictLimit; - const BYTE* const matchPtr = (extDict ? dictBase : base) + matchCandidateIdx; + const BYTE *const matchPtr = (extDict ? dictBase : base) + matchCandidateIdx; if (LZ4_read32(matchPtr) == pattern) { /* good candidate */ - const BYTE* const dictStart = dictBase + hc4->lowLimit; - const BYTE* const iLimit = extDict ? dictBase + dictLimit : iHighLimit; - size_t forwardPatternLength = LZ4HC_countPattern(matchPtr+sizeof(pattern), iLimit, pattern) + sizeof(pattern); + const BYTE *const dictStart = dictBase + hc4->lowLimit; + const BYTE *const iLimit = extDict ? dictBase + dictLimit : iHighLimit; + size_t forwardPatternLength = LZ4HC_countPattern(matchPtr + sizeof(pattern), iLimit, pattern) + sizeof(pattern); if (extDict && matchPtr + forwardPatternLength == iLimit) { U32 const rotatedPattern = LZ4HC_rotatePattern(forwardPatternLength, pattern); forwardPatternLength += LZ4HC_countPattern(lowPrefixPtr, iHighLimit, rotatedPattern); } - { const BYTE* const lowestMatchPtr = extDict ? dictStart : lowPrefixPtr; + { + const BYTE *const lowestMatchPtr = extDict ? dictStart : lowPrefixPtr; size_t backLength = LZ4HC_reverseCountPattern(matchPtr, lowestMatchPtr, pattern); size_t currentSegmentLength; if (!extDict && matchPtr - backLength == lowPrefixPtr && hc4->lowLimit < dictLimit) { @@ -369,8 +376,8 @@ LZ4HC_InsertAndGetWiderMatch ( assert(matchCandidateIdx - backLength >= lowestMatchIndex); currentSegmentLength = backLength + forwardPatternLength; /* Adjust to end of pattern if the source pattern fits, otherwise the beginning of the pattern */ - if ( (currentSegmentLength >= srcPatternLength) /* current pattern segment large enough to contain full srcPatternLength */ - && (forwardPatternLength <= srcPatternLength) ) { /* haven't reached this position yet */ + if ((currentSegmentLength >= srcPatternLength) /* current pattern segment large enough to contain full srcPatternLength */ + && (forwardPatternLength <= srcPatternLength)) { /* haven't reached this position yet */ U32 const newMatchIndex = matchCandidateIdx + (U32)forwardPatternLength - (U32)srcPatternLength; /* best position, full pattern, might be followed by more match */ if (LZ4HC_protectDictEnd(dictLimit, newMatchIndex)) matchIndex = newMatchIndex; @@ -386,105 +393,114 @@ LZ4HC_InsertAndGetWiderMatch ( matchIndex = dictLimit; } else { matchIndex = newMatchIndex; - if (lookBackLength==0) { /* no back possible */ + if (lookBackLength == 0) { /* no back possible */ size_t const maxML = MIN(currentSegmentLength, srcPatternLength); if ((size_t)longest < maxML) { assert(base + matchIndex < ip); - if (ip - (base+matchIndex) > LZ4_DISTANCE_MAX) break; + if (ip - (base + matchIndex) > LZ4_DISTANCE_MAX) break; assert(maxML < 2 GB); longest = (int)maxML; *matchpos = base + matchIndex; /* virtual pos, relative to ip, to retrieve offset */ *startpos = ip; } - { U32 const distToNextPattern = DELTANEXTU16(chainTable, matchIndex); + { + U32 const distToNextPattern = DELTANEXTU16(chainTable, matchIndex); if (distToNextPattern > matchIndex) break; /* avoid overflow */ matchIndex -= distToNextPattern; - } } } } } + } + } + } + } + } continue; - } } - } } /* PA optimization */ + } + } + } + } /* PA optimization */ /* follow current chain */ matchIndex -= DELTANEXTU16(chainTable, matchIndex + matchChainPos); } /* while ((matchIndex>=lowestMatchIndex) && (nbAttempts)) */ - if ( dict == usingDictCtxHc - && nbAttempts - && ipIndex - lowestMatchIndex < LZ4_DISTANCE_MAX) { + if (dict == usingDictCtxHc + && nbAttempts + && ipIndex - lowestMatchIndex < LZ4_DISTANCE_MAX) { size_t const dictEndOffset = (size_t)(dictCtx->end - dictCtx->base); U32 dictMatchIndex = dictCtx->hashTable[LZ4HC_hashPtr(ip)]; assert(dictEndOffset <= 1 GB); matchIndex = dictMatchIndex + lowestMatchIndex - (U32)dictEndOffset; while (ipIndex - matchIndex <= LZ4_DISTANCE_MAX && nbAttempts--) { - const BYTE* const matchPtr = dictCtx->base + dictMatchIndex; + const BYTE *const matchPtr = dictCtx->base + dictMatchIndex; if (LZ4_read32(matchPtr) == pattern) { int mlt; int back = 0; - const BYTE* vLimit = ip + (dictEndOffset - dictMatchIndex); + const BYTE *vLimit = ip + (dictEndOffset - dictMatchIndex); if (vLimit > iHighLimit) vLimit = iHighLimit; - mlt = (int)LZ4_count(ip+MINMATCH, matchPtr+MINMATCH, vLimit) + MINMATCH; + mlt = (int)LZ4_count(ip + MINMATCH, matchPtr + MINMATCH, vLimit) + MINMATCH; back = lookBackLength ? LZ4HC_countBack(ip, matchPtr, iLowLimit, dictCtx->base + dictCtx->dictLimit) : 0; mlt -= back; if (mlt > longest) { longest = mlt; *matchpos = base + matchIndex + back; *startpos = ip + back; - } } + } + } - { U32 const nextOffset = DELTANEXTU16(dictCtx->chainTable, dictMatchIndex); + { + U32 const nextOffset = DELTANEXTU16(dictCtx->chainTable, dictMatchIndex); dictMatchIndex -= nextOffset; matchIndex -= nextOffset; - } } } + } + } + } return longest; } LZ4_FORCE_INLINE -int LZ4HC_InsertAndFindBestMatch(LZ4HC_CCtx_internal* const hc4, /* Index table will be updated */ - const BYTE* const ip, const BYTE* const iLimit, - const BYTE** matchpos, +int LZ4HC_InsertAndFindBestMatch(LZ4HC_CCtx_internal *const hc4, /* Index table will be updated */ + const BYTE *const ip, const BYTE *const iLimit, + const BYTE **matchpos, const int maxNbAttempts, const int patternAnalysis, - const dictCtx_directive dict) -{ - const BYTE* uselessPtr = ip; + const dictCtx_directive dict) { + const BYTE *uselessPtr = ip; /* note : LZ4HC_InsertAndGetWiderMatch() is able to modify the starting position of a match (*startpos), * but this won't be the case here, as we define iLowLimit==ip, * so LZ4HC_InsertAndGetWiderMatch() won't be allowed to search past ip */ - return LZ4HC_InsertAndGetWiderMatch(hc4, ip, ip, iLimit, MINMATCH-1, matchpos, &uselessPtr, maxNbAttempts, patternAnalysis, 0 /*chainSwap*/, dict, favorCompressionRatio); + return LZ4HC_InsertAndGetWiderMatch(hc4, ip, ip, iLimit, MINMATCH - 1, matchpos, &uselessPtr, maxNbAttempts, patternAnalysis, 0 /*chainSwap*/, dict, favorCompressionRatio); } /* LZ4HC_encodeSequence() : * @return : 0 if ok, * 1 if buffer issue detected */ -LZ4_FORCE_INLINE int LZ4HC_encodeSequence ( - const BYTE** ip, - BYTE** op, - const BYTE** anchor, +LZ4_FORCE_INLINE int LZ4HC_encodeSequence( + const BYTE **ip, + BYTE **op, + const BYTE **anchor, int matchLength, - const BYTE* const match, + const BYTE *const match, limitedOutput_directive limit, - BYTE* oend) -{ + BYTE *oend) { size_t length; - BYTE* const token = (*op)++; + BYTE *const token = (*op)++; #if defined(LZ4_DEBUG) && (LZ4_DEBUG >= 6) - static const BYTE* start = NULL; + static const BYTE *start = NULL; static U32 totalCost = 0; - U32 const pos = (start==NULL) ? 0 : (U32)(*anchor - start); + U32 const pos = (start == NULL) ? 0 : (U32)(*anchor - start); U32 const ll = (U32)(*ip - *anchor); - U32 const llAdd = (ll>=15) ? ((ll-15) / 255) + 1 : 0; - U32 const mlAdd = (matchLength>=19) ? ((matchLength-19) / 255) + 1 : 0; + U32 const llAdd = (ll >= 15) ? ((ll - 15) / 255) + 1 : 0; + U32 const mlAdd = (matchLength >= 19) ? ((matchLength - 19) / 255) + 1 : 0; U32 const cost = 1 + llAdd + ll + 2 + mlAdd; - if (start==NULL) start = *anchor; /* only works for single segment */ + if (start == NULL) start = *anchor; /* only works for single segment */ /* g_debuglog_enable = (pos >= 2228) & (pos <= 2262); */ DEBUGLOG(6, "pos:%7u -- literals:%3u, match:%4i, offset:%5u, cost:%3u + %u", - pos, - (U32)(*ip - *anchor), matchLength, (U32)(*ip-match), - cost, totalCost); + pos, + (U32)(*ip - *anchor), matchLength, (U32)(*ip - match), + cost, totalCost); totalCost += cost; #endif @@ -494,7 +510,7 @@ LZ4_FORCE_INLINE int LZ4HC_encodeSequence ( if (length >= RUN_MASK) { size_t len = length - RUN_MASK; *token = (RUN_MASK << ML_BITS); - for(; len >= 255 ; len -= 255) *(*op)++ = 255; + for (; len >= 255 ; len -= 255) * (*op)++ = 255; *(*op)++ = (BYTE)len; } else { *token = (BYTE)(length << ML_BITS); @@ -505,8 +521,9 @@ LZ4_FORCE_INLINE int LZ4HC_encodeSequence ( *op += length; /* Encode Offset */ - assert( (*ip - match) <= LZ4_DISTANCE_MAX ); /* note : consider providing offset as a value, rather than as a pointer difference */ - LZ4_writeLE16(*op, (U16)(*ip-match)); *op += 2; + assert((*ip - match) <= LZ4_DISTANCE_MAX); /* note : consider providing offset as a value, rather than as a pointer difference */ + LZ4_writeLE16(*op, (U16)(*ip - match)); + *op += 2; /* Encode MatchLength */ assert(matchLength >= MINMATCH); @@ -515,7 +532,7 @@ LZ4_FORCE_INLINE int LZ4HC_encodeSequence ( if (length >= ML_MASK) { *token += ML_MASK; length -= ML_MASK; - for(; length >= 510 ; length -= 510) { *(*op)++ = 255; *(*op)++ = 255; } + for (; length >= 510 ; length -= 510) { *(*op)++ = 255; *(*op)++ = 255; } if (length >= 255) { length -= 255; *(*op)++ = 255; } *(*op)++ = (BYTE)length; } else { @@ -529,38 +546,37 @@ LZ4_FORCE_INLINE int LZ4HC_encodeSequence ( return 0; } -LZ4_FORCE_INLINE int LZ4HC_compress_hashChain ( - LZ4HC_CCtx_internal* const ctx, - const char* const source, - char* const dest, - int* srcSizePtr, +LZ4_FORCE_INLINE int LZ4HC_compress_hashChain( + LZ4HC_CCtx_internal *const ctx, + const char *const source, + char *const dest, + int *srcSizePtr, int const maxOutputSize, unsigned maxNbAttempts, const limitedOutput_directive limit, const dictCtx_directive dict - ) -{ +) { const int inputSize = *srcSizePtr; const int patternAnalysis = (maxNbAttempts > 128); /* levels 9+ */ - const BYTE* ip = (const BYTE*) source; - const BYTE* anchor = ip; - const BYTE* const iend = ip + inputSize; - const BYTE* const mflimit = iend - MFLIMIT; - const BYTE* const matchlimit = (iend - LASTLITERALS); + const BYTE *ip = (const BYTE *) source; + const BYTE *anchor = ip; + const BYTE *const iend = ip + inputSize; + const BYTE *const mflimit = iend - MFLIMIT; + const BYTE *const matchlimit = (iend - LASTLITERALS); - BYTE* optr = (BYTE*) dest; - BYTE* op = (BYTE*) dest; - BYTE* oend = op + maxOutputSize; + BYTE *optr = (BYTE *) dest; + BYTE *op = (BYTE *) dest; + BYTE *oend = op + maxOutputSize; int ml0, ml, ml2, ml3; - const BYTE* start0; - const BYTE* ref0; - const BYTE* ref = NULL; - const BYTE* start2 = NULL; - const BYTE* ref2 = NULL; - const BYTE* start3 = NULL; - const BYTE* ref3 = NULL; + const BYTE *start0; + const BYTE *ref0; + const BYTE *ref = NULL; + const BYTE *start2 = NULL; + const BYTE *ref2 = NULL; + const BYTE *start3 = NULL; + const BYTE *ref3 = NULL; /* init */ *srcSizePtr = 0; @@ -570,16 +586,18 @@ LZ4_FORCE_INLINE int LZ4HC_compress_hashChain ( /* Main Loop */ while (ip <= mflimit) { ml = LZ4HC_InsertAndFindBestMatch(ctx, ip, matchlimit, &ref, maxNbAttempts, patternAnalysis, dict); - if (ml<MINMATCH) { ip++; continue; } + if (ml < MINMATCH) { ip++; continue; } /* saved, in case we would skip too much */ - start0 = ip; ref0 = ref; ml0 = ml; + start0 = ip; + ref0 = ref; + ml0 = ml; _Search2: - if (ip+ml <= mflimit) { + if (ip + ml <= mflimit) { ml2 = LZ4HC_InsertAndGetWiderMatch(ctx, - ip + ml - 2, ip + 0, matchlimit, ml, &ref2, &start2, - maxNbAttempts, patternAnalysis, 0, dict, favorCompressionRatio); + ip + ml - 2, ip + 0, matchlimit, ml, &ref2, &start2, + maxNbAttempts, patternAnalysis, 0, dict, favorCompressionRatio); } else { ml2 = ml; } @@ -592,14 +610,17 @@ _Search2: if (start0 < ip) { /* first match was skipped at least once */ if (start2 < ip + ml0) { /* squeezing ML1 between ML0(original ML1) and ML2 */ - ip = start0; ref = ref0; ml = ml0; /* restore initial ML1 */ - } } + ip = start0; + ref = ref0; + ml = ml0; /* restore initial ML1 */ + } + } /* Here, start0==ip */ if ((start2 - ip) < 3) { /* First Match too small : removed */ ml = ml2; ip = start2; - ref =ref2; + ref = ref2; goto _Search2; } @@ -611,7 +632,7 @@ _Search3: int correction; int new_ml = ml; if (new_ml > OPTIMAL_ML) new_ml = OPTIMAL_ML; - if (ip+new_ml > start2 + ml2 - MINMATCH) new_ml = (int)(start2 - ip) + ml2 - MINMATCH; + if (ip + new_ml > start2 + ml2 - MINMATCH) new_ml = (int)(start2 - ip) + ml2 - MINMATCH; correction = new_ml - (int)(start2 - ip); if (correction > 0) { start2 += correction; @@ -623,15 +644,15 @@ _Search3: if (start2 + ml2 <= mflimit) { ml3 = LZ4HC_InsertAndGetWiderMatch(ctx, - start2 + ml2 - 3, start2, matchlimit, ml2, &ref3, &start3, - maxNbAttempts, patternAnalysis, 0, dict, favorCompressionRatio); + start2 + ml2 - 3, start2, matchlimit, ml2, &ref3, &start3, + maxNbAttempts, patternAnalysis, 0, dict, favorCompressionRatio); } else { ml3 = ml2; } if (ml3 == ml2) { /* No better match => encode ML1 and ML2 */ /* ip & ref are known; Now for ml */ - if (start2 < ip+ml) ml = (int)(start2 - ip); + if (start2 < ip + ml) ml = (int)(start2 - ip); /* Now, encode 2 sequences */ optr = op; if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ml, ref, limit, oend)) goto _dest_overflow; @@ -641,10 +662,10 @@ _Search3: continue; } - if (start3 < ip+ml+3) { /* Not enough space for match 2 : remove it */ - if (start3 >= (ip+ml)) { /* can write Seq1 immediately ==> Seq2 is removed, so Seq3 becomes Seq1 */ - if (start2 < ip+ml) { - int correction = (int)(ip+ml - start2); + if (start3 < ip + ml + 3) { /* Not enough space for match 2 : remove it */ + if (start3 >= (ip + ml)) { /* can write Seq1 immediately ==> Seq2 is removed, so Seq3 becomes Seq1 */ + if (start2 < ip + ml) { + int correction = (int)(ip + ml - start2); start2 += correction; ref2 += correction; ml2 -= correction; @@ -678,7 +699,7 @@ _Search3: * let's write the first one ML1. * ip & ref are known; Now decide ml. */ - if (start2 < ip+ml) { + if (start2 < ip + ml) { if ((start2 - ip) < OPTIMAL_ML) { int correction; if (ml > OPTIMAL_ML) ml = OPTIMAL_ML; @@ -697,10 +718,14 @@ _Search3: if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ml, ref, limit, oend)) goto _dest_overflow; /* ML2 becomes ML1 */ - ip = start2; ref = ref2; ml = ml2; + ip = start2; + ref = ref2; + ml = ml2; /* ML3 becomes ML2 */ - start2 = start3; ref2 = ref3; ml2 = ml3; + start2 = start3; + ref2 = ref3; + ml2 = ml3; /* let's find a new ML3 */ goto _Search3; @@ -708,7 +733,8 @@ _Search3: _last_literals: /* Encode Last Literals */ - { size_t lastRunSize = (size_t)(iend - anchor); /* literals */ + { + size_t lastRunSize = (size_t)(iend - anchor); /* literals */ size_t litLength = (lastRunSize + 255 - RUN_MASK) / 255; size_t const totalSize = 1 + litLength + lastRunSize; if (limit == fillOutput) oend += LASTLITERALS; /* restore correct value */ @@ -724,7 +750,7 @@ _last_literals: if (lastRunSize >= RUN_MASK) { size_t accumulator = lastRunSize - RUN_MASK; *op++ = (RUN_MASK << ML_BITS); - for(; accumulator >= 255 ; accumulator -= 255) *op++ = 255; + for (; accumulator >= 255 ; accumulator -= 255) * op++ = 255; *op++ = (BYTE) accumulator; } else { *op++ = (BYTE)(lastRunSize << ML_BITS); @@ -734,8 +760,8 @@ _last_literals: } /* End */ - *srcSizePtr = (int) (((const char*)ip) - source); - return (int) (((char*)op)-dest); + *srcSizePtr = (int)(((const char *)ip) - source); + return (int)(((char *)op) - dest); _dest_overflow: if (limit == fillOutput) { @@ -746,33 +772,32 @@ _dest_overflow: } -static int LZ4HC_compress_optimal( LZ4HC_CCtx_internal* ctx, - const char* const source, char* dst, - int* srcSizePtr, int dstCapacity, - int const nbSearches, size_t sufficient_len, - const limitedOutput_directive limit, int const fullUpdate, - const dictCtx_directive dict, - HCfavor_e favorDecSpeed); +static int LZ4HC_compress_optimal(LZ4HC_CCtx_internal *ctx, + const char *const source, char *dst, + int *srcSizePtr, int dstCapacity, + int const nbSearches, size_t sufficient_len, + const limitedOutput_directive limit, int const fullUpdate, + const dictCtx_directive dict, + HCfavor_e favorDecSpeed); -LZ4_FORCE_INLINE int LZ4HC_compress_generic_internal ( - LZ4HC_CCtx_internal* const ctx, - const char* const src, - char* const dst, - int* const srcSizePtr, +LZ4_FORCE_INLINE int LZ4HC_compress_generic_internal( + LZ4HC_CCtx_internal *const ctx, + const char *const src, + char *const dst, + int *const srcSizePtr, int const dstCapacity, int cLevel, const limitedOutput_directive limit, const dictCtx_directive dict - ) -{ +) { typedef enum { lz4hc, lz4opt } lz4hc_strat_e; typedef struct { lz4hc_strat_e strat; U32 nbSearches; U32 targetLength; } cParams_t; - static const cParams_t clTable[LZ4HC_CLEVEL_MAX+1] = { + static const cParams_t clTable[LZ4HC_CLEVEL_MAX + 1] = { { lz4hc, 2, 16 }, /* 0, unused */ { lz4hc, 2, 16 }, /* 1, unused */ { lz4hc, 2, 16 }, /* 2, unused */ @@ -784,8 +809,8 @@ LZ4_FORCE_INLINE int LZ4HC_compress_generic_internal ( { lz4hc, 128, 16 }, /* 8 */ { lz4hc, 256, 16 }, /* 9 */ { lz4opt, 96, 64 }, /*10==LZ4HC_CLEVEL_OPT_MIN*/ - { lz4opt, 512,128 }, /*11 */ - { lz4opt,16384,LZ4_OPT_NUM }, /* 12==LZ4HC_CLEVEL_MAX */ + { lz4opt, 512, 128 }, /*11 */ + { lz4opt, 16384, LZ4_OPT_NUM }, /* 12==LZ4HC_CLEVEL_MAX */ }; DEBUGLOG(4, "LZ4HC_compress_generic(ctx=%p, src=%p, srcSize=%d)", ctx, src, *srcSizePtr); @@ -796,55 +821,54 @@ LZ4_FORCE_INLINE int LZ4HC_compress_generic_internal ( ctx->end += *srcSizePtr; if (cLevel < 1) cLevel = LZ4HC_CLEVEL_DEFAULT; /* note : convention is different from lz4frame, maybe something to review */ cLevel = MIN(LZ4HC_CLEVEL_MAX, cLevel); - { cParams_t const cParam = clTable[cLevel]; + { + cParams_t const cParam = clTable[cLevel]; HCfavor_e const favor = ctx->favorDecSpeed ? favorDecompressionSpeed : favorCompressionRatio; int result; if (cParam.strat == lz4hc) { result = LZ4HC_compress_hashChain(ctx, - src, dst, srcSizePtr, dstCapacity, - cParam.nbSearches, limit, dict); + src, dst, srcSizePtr, dstCapacity, + cParam.nbSearches, limit, dict); } else { assert(cParam.strat == lz4opt); result = LZ4HC_compress_optimal(ctx, - src, dst, srcSizePtr, dstCapacity, - (int)cParam.nbSearches, cParam.targetLength, limit, - cLevel == LZ4HC_CLEVEL_MAX, /* ultra mode */ - dict, favor); + src, dst, srcSizePtr, dstCapacity, + (int)cParam.nbSearches, cParam.targetLength, limit, + cLevel == LZ4HC_CLEVEL_MAX, /* ultra mode */ + dict, favor); } if (result <= 0) ctx->dirty = 1; return result; } } -static void LZ4HC_setExternalDict(LZ4HC_CCtx_internal* ctxPtr, const BYTE* newBlock); +static void LZ4HC_setExternalDict(LZ4HC_CCtx_internal *ctxPtr, const BYTE *newBlock); static int -LZ4HC_compress_generic_noDictCtx ( - LZ4HC_CCtx_internal* const ctx, - const char* const src, - char* const dst, - int* const srcSizePtr, - int const dstCapacity, - int cLevel, - limitedOutput_directive limit - ) -{ +LZ4HC_compress_generic_noDictCtx( + LZ4HC_CCtx_internal *const ctx, + const char *const src, + char *const dst, + int *const srcSizePtr, + int const dstCapacity, + int cLevel, + limitedOutput_directive limit +) { assert(ctx->dictCtx == NULL); return LZ4HC_compress_generic_internal(ctx, src, dst, srcSizePtr, dstCapacity, cLevel, limit, noDictCtx); } static int -LZ4HC_compress_generic_dictCtx ( - LZ4HC_CCtx_internal* const ctx, - const char* const src, - char* const dst, - int* const srcSizePtr, - int const dstCapacity, - int cLevel, - limitedOutput_directive limit - ) -{ +LZ4HC_compress_generic_dictCtx( + LZ4HC_CCtx_internal *const ctx, + const char *const src, + char *const dst, + int *const srcSizePtr, + int const dstCapacity, + int cLevel, + limitedOutput_directive limit +) { const size_t position = (size_t)(ctx->end - ctx->base) - ctx->lowLimit; assert(ctx->dictCtx != NULL); if (position >= 64 KB) { @@ -861,16 +885,15 @@ LZ4HC_compress_generic_dictCtx ( } static int -LZ4HC_compress_generic ( - LZ4HC_CCtx_internal* const ctx, - const char* const src, - char* const dst, - int* const srcSizePtr, - int const dstCapacity, - int cLevel, - limitedOutput_directive limit - ) -{ +LZ4HC_compress_generic( + LZ4HC_CCtx_internal *const ctx, + const char *const src, + char *const dst, + int *const srcSizePtr, + int const dstCapacity, + int cLevel, + limitedOutput_directive limit +) { if (ctx->dictCtx == NULL) { return LZ4HC_compress_generic_noDictCtx(ctx, src, dst, srcSizePtr, dstCapacity, cLevel, limit); } else { @@ -884,8 +907,7 @@ int LZ4_sizeofStateHC(void) { return (int)sizeof(LZ4_streamHC_t); } #ifndef _MSC_VER /* for some reason, Visual fails the aligment test on 32-bit x86 : * it reports an aligment of 8-bytes, * while actually aligning LZ4_streamHC_t on 4 bytes. */ -static size_t LZ4_streamHC_t_alignment(void) -{ +static size_t LZ4_streamHC_t_alignment(void) { struct { char c; LZ4_streamHC_t t; } t_a; return sizeof(t_a) - sizeof(t_a.t); } @@ -893,37 +915,34 @@ static size_t LZ4_streamHC_t_alignment(void) /* state is presumed correctly initialized, * in which case its size and alignment have already been validate */ -int LZ4_compress_HC_extStateHC_fastReset (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int compressionLevel) -{ - LZ4HC_CCtx_internal* const ctx = &((LZ4_streamHC_t*)state)->internal_donotuse; +int LZ4_compress_HC_extStateHC_fastReset(void *state, const char *src, char *dst, int srcSize, int dstCapacity, int compressionLevel) { + LZ4HC_CCtx_internal *const ctx = &((LZ4_streamHC_t *)state)->internal_donotuse; #ifndef _MSC_VER /* for some reason, Visual fails the aligment test on 32-bit x86 : * it reports an aligment of 8-bytes, * while actually aligning LZ4_streamHC_t on 4 bytes. */ assert(((size_t)state & (LZ4_streamHC_t_alignment() - 1)) == 0); /* check alignment */ #endif - if (((size_t)(state)&(sizeof(void*)-1)) != 0) return 0; /* Error : state is not aligned for pointers (32 or 64 bits) */ - LZ4_resetStreamHC_fast((LZ4_streamHC_t*)state, compressionLevel); - LZ4HC_init_internal (ctx, (const BYTE*)src); + if (((size_t)(state) & (sizeof(void *) -1)) != 0) return 0; /* Error : state is not aligned for pointers (32 or 64 bits) */ + LZ4_resetStreamHC_fast((LZ4_streamHC_t *)state, compressionLevel); + LZ4HC_init_internal(ctx, (const BYTE *)src); if (dstCapacity < LZ4_compressBound(srcSize)) - return LZ4HC_compress_generic (ctx, src, dst, &srcSize, dstCapacity, compressionLevel, limitedOutput); + return LZ4HC_compress_generic(ctx, src, dst, &srcSize, dstCapacity, compressionLevel, limitedOutput); else - return LZ4HC_compress_generic (ctx, src, dst, &srcSize, dstCapacity, compressionLevel, notLimited); + return LZ4HC_compress_generic(ctx, src, dst, &srcSize, dstCapacity, compressionLevel, notLimited); } -int LZ4_compress_HC_extStateHC (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int compressionLevel) -{ - LZ4_streamHC_t* const ctx = LZ4_initStreamHC(state, sizeof(*ctx)); - if (ctx==NULL) return 0; /* init failure */ +int LZ4_compress_HC_extStateHC(void *state, const char *src, char *dst, int srcSize, int dstCapacity, int compressionLevel) { + LZ4_streamHC_t *const ctx = LZ4_initStreamHC(state, sizeof(*ctx)); + if (ctx == NULL) return 0; /* init failure */ return LZ4_compress_HC_extStateHC_fastReset(state, src, dst, srcSize, dstCapacity, compressionLevel); } -int LZ4_compress_HC(const char* src, char* dst, int srcSize, int dstCapacity, int compressionLevel) -{ +int LZ4_compress_HC(const char *src, char *dst, int srcSize, int dstCapacity, int compressionLevel) { #if defined(LZ4HC_HEAPMODE) && LZ4HC_HEAPMODE==1 - LZ4_streamHC_t* const statePtr = (LZ4_streamHC_t*)ALLOC(sizeof(LZ4_streamHC_t)); + LZ4_streamHC_t *const statePtr = (LZ4_streamHC_t *)ALLOC(sizeof(LZ4_streamHC_t)); #else LZ4_streamHC_t state; - LZ4_streamHC_t* const statePtr = &state; + LZ4_streamHC_t *const statePtr = &state; #endif int const cSize = LZ4_compress_HC_extStateHC(statePtr, src, dst, srcSize, dstCapacity, compressionLevel); #if defined(LZ4HC_HEAPMODE) && LZ4HC_HEAPMODE==1 @@ -933,11 +952,10 @@ int LZ4_compress_HC(const char* src, char* dst, int srcSize, int dstCapacity, in } /* state is presumed sized correctly (>= sizeof(LZ4_streamHC_t)) */ -int LZ4_compress_HC_destSize(void* state, const char* source, char* dest, int* sourceSizePtr, int targetDestSize, int cLevel) -{ - LZ4_streamHC_t* const ctx = LZ4_initStreamHC(state, sizeof(*ctx)); - if (ctx==NULL) return 0; /* init failure */ - LZ4HC_init_internal(&ctx->internal_donotuse, (const BYTE*) source); +int LZ4_compress_HC_destSize(void *state, const char *source, char *dest, int *sourceSizePtr, int targetDestSize, int cLevel) { + LZ4_streamHC_t *const ctx = LZ4_initStreamHC(state, sizeof(*ctx)); + if (ctx == NULL) return 0; /* init failure */ + LZ4HC_init_internal(&ctx->internal_donotuse, (const BYTE *) source); LZ4_setCompressionLevel(ctx, cLevel); return LZ4HC_compress_generic(&ctx->internal_donotuse, source, dest, sourceSizePtr, targetDestSize, cLevel, fillOutput); } @@ -948,16 +966,14 @@ int LZ4_compress_HC_destSize(void* state, const char* source, char* dest, int* s * Streaming Functions **************************************/ /* allocation */ -LZ4_streamHC_t* LZ4_createStreamHC(void) -{ - LZ4_streamHC_t* const LZ4_streamHCPtr = (LZ4_streamHC_t*)ALLOC(sizeof(LZ4_streamHC_t)); - if (LZ4_streamHCPtr==NULL) return NULL; +LZ4_streamHC_t *LZ4_createStreamHC(void) { + LZ4_streamHC_t *const LZ4_streamHCPtr = (LZ4_streamHC_t *)ALLOC(sizeof(LZ4_streamHC_t)); + if (LZ4_streamHCPtr == NULL) return NULL; LZ4_initStreamHC(LZ4_streamHCPtr, sizeof(*LZ4_streamHCPtr)); /* full initialization, malloc'ed buffer can be full of garbage */ return LZ4_streamHCPtr; } -int LZ4_freeStreamHC (LZ4_streamHC_t* LZ4_streamHCPtr) -{ +int LZ4_freeStreamHC(LZ4_streamHC_t *LZ4_streamHCPtr) { DEBUGLOG(4, "LZ4_freeStreamHC(%p)", LZ4_streamHCPtr); if (!LZ4_streamHCPtr) return 0; /* support free on NULL */ FREEMEM(LZ4_streamHCPtr); @@ -965,9 +981,8 @@ int LZ4_freeStreamHC (LZ4_streamHC_t* LZ4_streamHCPtr) } -LZ4_streamHC_t* LZ4_initStreamHC (void* buffer, size_t size) -{ - LZ4_streamHC_t* const LZ4_streamHCPtr = (LZ4_streamHC_t*)buffer; +LZ4_streamHC_t *LZ4_initStreamHC(void *buffer, size_t size) { + LZ4_streamHC_t *const LZ4_streamHCPtr = (LZ4_streamHC_t *)buffer; if (buffer == NULL) return NULL; if (size < sizeof(LZ4_streamHC_t)) return NULL; #ifndef _MSC_VER /* for some reason, Visual fails the aligment test on 32-bit x86 : @@ -979,7 +994,7 @@ LZ4_streamHC_t* LZ4_initStreamHC (void* buffer, size_t size) LZ4_STATIC_ASSERT(sizeof(LZ4HC_CCtx_internal) <= LZ4_STREAMHCSIZE); DEBUGLOG(4, "LZ4_initStreamHC(%p, %u)", LZ4_streamHCPtr, (unsigned)size); /* end-base will trigger a clearTable on starting compression */ - LZ4_streamHCPtr->internal_donotuse.end = (const BYTE *)(ptrdiff_t)-1; + LZ4_streamHCPtr->internal_donotuse.end = (const BYTE *)(ptrdiff_t) -1; LZ4_streamHCPtr->internal_donotuse.base = NULL; LZ4_streamHCPtr->internal_donotuse.dictCtx = NULL; LZ4_streamHCPtr->internal_donotuse.favorDecSpeed = 0; @@ -989,14 +1004,12 @@ LZ4_streamHC_t* LZ4_initStreamHC (void* buffer, size_t size) } /* just a stub */ -void LZ4_resetStreamHC (LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel) -{ +void LZ4_resetStreamHC(LZ4_streamHC_t *LZ4_streamHCPtr, int compressionLevel) { LZ4_initStreamHC(LZ4_streamHCPtr, sizeof(*LZ4_streamHCPtr)); LZ4_setCompressionLevel(LZ4_streamHCPtr, compressionLevel); } -void LZ4_resetStreamHC_fast (LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel) -{ +void LZ4_resetStreamHC_fast(LZ4_streamHC_t *LZ4_streamHCPtr, int compressionLevel) { DEBUGLOG(4, "LZ4_resetStreamHC_fast(%p, %d)", LZ4_streamHCPtr, compressionLevel); if (LZ4_streamHCPtr->internal_donotuse.dirty) { LZ4_initStreamHC(LZ4_streamHCPtr, sizeof(*LZ4_streamHCPtr)); @@ -1009,25 +1022,22 @@ void LZ4_resetStreamHC_fast (LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLev LZ4_setCompressionLevel(LZ4_streamHCPtr, compressionLevel); } -void LZ4_setCompressionLevel(LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel) -{ +void LZ4_setCompressionLevel(LZ4_streamHC_t *LZ4_streamHCPtr, int compressionLevel) { DEBUGLOG(5, "LZ4_setCompressionLevel(%p, %d)", LZ4_streamHCPtr, compressionLevel); if (compressionLevel < 1) compressionLevel = LZ4HC_CLEVEL_DEFAULT; if (compressionLevel > LZ4HC_CLEVEL_MAX) compressionLevel = LZ4HC_CLEVEL_MAX; LZ4_streamHCPtr->internal_donotuse.compressionLevel = (short)compressionLevel; } -void LZ4_favorDecompressionSpeed(LZ4_streamHC_t* LZ4_streamHCPtr, int favor) -{ - LZ4_streamHCPtr->internal_donotuse.favorDecSpeed = (favor!=0); +void LZ4_favorDecompressionSpeed(LZ4_streamHC_t *LZ4_streamHCPtr, int favor) { + LZ4_streamHCPtr->internal_donotuse.favorDecSpeed = (favor != 0); } /* LZ4_loadDictHC() : * LZ4_streamHCPtr is presumed properly initialized */ -int LZ4_loadDictHC (LZ4_streamHC_t* LZ4_streamHCPtr, - const char* dictionary, int dictSize) -{ - LZ4HC_CCtx_internal* const ctxPtr = &LZ4_streamHCPtr->internal_donotuse; +int LZ4_loadDictHC(LZ4_streamHC_t *LZ4_streamHCPtr, + const char *dictionary, int dictSize) { + LZ4HC_CCtx_internal *const ctxPtr = &LZ4_streamHCPtr->internal_donotuse; DEBUGLOG(4, "LZ4_loadDictHC(%p, %p, %d)", LZ4_streamHCPtr, dictionary, dictSize); assert(LZ4_streamHCPtr != NULL); if (dictSize > 64 KB) { @@ -1035,13 +1045,14 @@ int LZ4_loadDictHC (LZ4_streamHC_t* LZ4_streamHCPtr, dictSize = 64 KB; } /* need a full initialization, there are bad side-effects when using resetFast() */ - { int const cLevel = ctxPtr->compressionLevel; + { + int const cLevel = ctxPtr->compressionLevel; LZ4_initStreamHC(LZ4_streamHCPtr, sizeof(*LZ4_streamHCPtr)); LZ4_setCompressionLevel(LZ4_streamHCPtr, cLevel); } - LZ4HC_init_internal (ctxPtr, (const BYTE*)dictionary); - ctxPtr->end = (const BYTE*)dictionary + dictSize; - if (dictSize >= 4) LZ4HC_Insert (ctxPtr, ctxPtr->end-3); + LZ4HC_init_internal(ctxPtr, (const BYTE *)dictionary); + ctxPtr->end = (const BYTE *)dictionary + dictSize; + if (dictSize >= 4) LZ4HC_Insert(ctxPtr, ctxPtr->end - 3); return dictSize; } @@ -1051,11 +1062,10 @@ void LZ4_attach_HC_dictionary(LZ4_streamHC_t *working_stream, const LZ4_streamHC /* compression */ -static void LZ4HC_setExternalDict(LZ4HC_CCtx_internal* ctxPtr, const BYTE* newBlock) -{ +static void LZ4HC_setExternalDict(LZ4HC_CCtx_internal *ctxPtr, const BYTE *newBlock) { DEBUGLOG(4, "LZ4HC_setExternalDict(%p, %p)", ctxPtr, newBlock); if (ctxPtr->end >= ctxPtr->base + ctxPtr->dictLimit + 4) - LZ4HC_Insert (ctxPtr, ctxPtr->end-3); /* Referencing remaining dictionary content */ + LZ4HC_Insert(ctxPtr, ctxPtr->end - 3); /* Referencing remaining dictionary content */ /* Only one memory segment for extDict, so any previous extDict is lost at this stage */ ctxPtr->lowLimit = ctxPtr->dictLimit; @@ -1069,53 +1079,51 @@ static void LZ4HC_setExternalDict(LZ4HC_CCtx_internal* ctxPtr, const BYTE* newBl ctxPtr->dictCtx = NULL; } -static int LZ4_compressHC_continue_generic (LZ4_streamHC_t* LZ4_streamHCPtr, - const char* src, char* dst, - int* srcSizePtr, int dstCapacity, - limitedOutput_directive limit) -{ - LZ4HC_CCtx_internal* const ctxPtr = &LZ4_streamHCPtr->internal_donotuse; +static int LZ4_compressHC_continue_generic(LZ4_streamHC_t *LZ4_streamHCPtr, + const char *src, char *dst, + int *srcSizePtr, int dstCapacity, + limitedOutput_directive limit) { + LZ4HC_CCtx_internal *const ctxPtr = &LZ4_streamHCPtr->internal_donotuse; DEBUGLOG(4, "LZ4_compressHC_continue_generic(ctx=%p, src=%p, srcSize=%d)", - LZ4_streamHCPtr, src, *srcSizePtr); + LZ4_streamHCPtr, src, *srcSizePtr); assert(ctxPtr != NULL); /* auto-init if forgotten */ - if (ctxPtr->base == NULL) LZ4HC_init_internal (ctxPtr, (const BYTE*) src); + if (ctxPtr->base == NULL) LZ4HC_init_internal(ctxPtr, (const BYTE *) src); /* Check overflow */ if ((size_t)(ctxPtr->end - ctxPtr->base) > 2 GB) { size_t dictSize = (size_t)(ctxPtr->end - ctxPtr->base) - ctxPtr->dictLimit; if (dictSize > 64 KB) dictSize = 64 KB; - LZ4_loadDictHC(LZ4_streamHCPtr, (const char*)(ctxPtr->end) - dictSize, (int)dictSize); + LZ4_loadDictHC(LZ4_streamHCPtr, (const char *)(ctxPtr->end) - dictSize, (int)dictSize); } /* Check if blocks follow each other */ - if ((const BYTE*)src != ctxPtr->end) - LZ4HC_setExternalDict(ctxPtr, (const BYTE*)src); + if ((const BYTE *)src != ctxPtr->end) + LZ4HC_setExternalDict(ctxPtr, (const BYTE *)src); /* Check overlapping input/dictionary space */ - { const BYTE* sourceEnd = (const BYTE*) src + *srcSizePtr; - const BYTE* const dictBegin = ctxPtr->dictBase + ctxPtr->lowLimit; - const BYTE* const dictEnd = ctxPtr->dictBase + ctxPtr->dictLimit; - if ((sourceEnd > dictBegin) && ((const BYTE*)src < dictEnd)) { + { + const BYTE *sourceEnd = (const BYTE *) src + *srcSizePtr; + const BYTE *const dictBegin = ctxPtr->dictBase + ctxPtr->lowLimit; + const BYTE *const dictEnd = ctxPtr->dictBase + ctxPtr->dictLimit; + if ((sourceEnd > dictBegin) && ((const BYTE *)src < dictEnd)) { if (sourceEnd > dictEnd) sourceEnd = dictEnd; ctxPtr->lowLimit = (U32)(sourceEnd - ctxPtr->dictBase); if (ctxPtr->dictLimit - ctxPtr->lowLimit < 4) ctxPtr->lowLimit = ctxPtr->dictLimit; } } - return LZ4HC_compress_generic (ctxPtr, src, dst, srcSizePtr, dstCapacity, ctxPtr->compressionLevel, limit); + return LZ4HC_compress_generic(ctxPtr, src, dst, srcSizePtr, dstCapacity, ctxPtr->compressionLevel, limit); } -int LZ4_compress_HC_continue (LZ4_streamHC_t* LZ4_streamHCPtr, const char* src, char* dst, int srcSize, int dstCapacity) -{ +int LZ4_compress_HC_continue(LZ4_streamHC_t *LZ4_streamHCPtr, const char *src, char *dst, int srcSize, int dstCapacity) { if (dstCapacity < LZ4_compressBound(srcSize)) - return LZ4_compressHC_continue_generic (LZ4_streamHCPtr, src, dst, &srcSize, dstCapacity, limitedOutput); + return LZ4_compressHC_continue_generic(LZ4_streamHCPtr, src, dst, &srcSize, dstCapacity, limitedOutput); else - return LZ4_compressHC_continue_generic (LZ4_streamHCPtr, src, dst, &srcSize, dstCapacity, notLimited); + return LZ4_compressHC_continue_generic(LZ4_streamHCPtr, src, dst, &srcSize, dstCapacity, notLimited); } -int LZ4_compress_HC_continue_destSize (LZ4_streamHC_t* LZ4_streamHCPtr, const char* src, char* dst, int* srcSizePtr, int targetDestSize) -{ +int LZ4_compress_HC_continue_destSize(LZ4_streamHC_t *LZ4_streamHCPtr, const char *src, char *dst, int *srcSizePtr, int targetDestSize) { return LZ4_compressHC_continue_generic(LZ4_streamHCPtr, src, dst, srcSizePtr, targetDestSize, fillOutput); } @@ -1123,17 +1131,17 @@ int LZ4_compress_HC_continue_destSize (LZ4_streamHC_t* LZ4_streamHCPtr, const ch /* dictionary saving */ -int LZ4_saveDictHC (LZ4_streamHC_t* LZ4_streamHCPtr, char* safeBuffer, int dictSize) -{ - LZ4HC_CCtx_internal* const streamPtr = &LZ4_streamHCPtr->internal_donotuse; +int LZ4_saveDictHC(LZ4_streamHC_t *LZ4_streamHCPtr, char *safeBuffer, int dictSize) { + LZ4HC_CCtx_internal *const streamPtr = &LZ4_streamHCPtr->internal_donotuse; int const prefixSize = (int)(streamPtr->end - (streamPtr->base + streamPtr->dictLimit)); DEBUGLOG(4, "LZ4_saveDictHC(%p, %p, %d)", LZ4_streamHCPtr, safeBuffer, dictSize); if (dictSize > 64 KB) dictSize = 64 KB; if (dictSize < 4) dictSize = 0; if (dictSize > prefixSize) dictSize = prefixSize; memmove(safeBuffer, streamPtr->end - dictSize, dictSize); - { U32 const endIndex = (U32)(streamPtr->end - streamPtr->base); - streamPtr->end = (const BYTE*)safeBuffer + dictSize; + { + U32 const endIndex = (U32)(streamPtr->end - streamPtr->base); + streamPtr->end = (const BYTE *)safeBuffer + dictSize; streamPtr->base = streamPtr->end - endIndex; streamPtr->dictLimit = endIndex - (U32)dictSize; streamPtr->lowLimit = endIndex - (U32)dictSize; @@ -1150,16 +1158,16 @@ int LZ4_saveDictHC (LZ4_streamHC_t* LZ4_streamHCPtr, char* safeBuffer, int dictS /* These functions currently generate deprecation warnings */ /* Wrappers for deprecated compression functions */ -int LZ4_compressHC(const char* src, char* dst, int srcSize) { return LZ4_compress_HC (src, dst, srcSize, LZ4_compressBound(srcSize), 0); } -int LZ4_compressHC_limitedOutput(const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_HC(src, dst, srcSize, maxDstSize, 0); } -int LZ4_compressHC2(const char* src, char* dst, int srcSize, int cLevel) { return LZ4_compress_HC (src, dst, srcSize, LZ4_compressBound(srcSize), cLevel); } -int LZ4_compressHC2_limitedOutput(const char* src, char* dst, int srcSize, int maxDstSize, int cLevel) { return LZ4_compress_HC(src, dst, srcSize, maxDstSize, cLevel); } -int LZ4_compressHC_withStateHC (void* state, const char* src, char* dst, int srcSize) { return LZ4_compress_HC_extStateHC (state, src, dst, srcSize, LZ4_compressBound(srcSize), 0); } -int LZ4_compressHC_limitedOutput_withStateHC (void* state, const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_HC_extStateHC (state, src, dst, srcSize, maxDstSize, 0); } -int LZ4_compressHC2_withStateHC (void* state, const char* src, char* dst, int srcSize, int cLevel) { return LZ4_compress_HC_extStateHC(state, src, dst, srcSize, LZ4_compressBound(srcSize), cLevel); } -int LZ4_compressHC2_limitedOutput_withStateHC (void* state, const char* src, char* dst, int srcSize, int maxDstSize, int cLevel) { return LZ4_compress_HC_extStateHC(state, src, dst, srcSize, maxDstSize, cLevel); } -int LZ4_compressHC_continue (LZ4_streamHC_t* ctx, const char* src, char* dst, int srcSize) { return LZ4_compress_HC_continue (ctx, src, dst, srcSize, LZ4_compressBound(srcSize)); } -int LZ4_compressHC_limitedOutput_continue (LZ4_streamHC_t* ctx, const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_HC_continue (ctx, src, dst, srcSize, maxDstSize); } +int LZ4_compressHC(const char *src, char *dst, int srcSize) { return LZ4_compress_HC(src, dst, srcSize, LZ4_compressBound(srcSize), 0); } +int LZ4_compressHC_limitedOutput(const char *src, char *dst, int srcSize, int maxDstSize) { return LZ4_compress_HC(src, dst, srcSize, maxDstSize, 0); } +int LZ4_compressHC2(const char *src, char *dst, int srcSize, int cLevel) { return LZ4_compress_HC(src, dst, srcSize, LZ4_compressBound(srcSize), cLevel); } +int LZ4_compressHC2_limitedOutput(const char *src, char *dst, int srcSize, int maxDstSize, int cLevel) { return LZ4_compress_HC(src, dst, srcSize, maxDstSize, cLevel); } +int LZ4_compressHC_withStateHC(void *state, const char *src, char *dst, int srcSize) { return LZ4_compress_HC_extStateHC(state, src, dst, srcSize, LZ4_compressBound(srcSize), 0); } +int LZ4_compressHC_limitedOutput_withStateHC(void *state, const char *src, char *dst, int srcSize, int maxDstSize) { return LZ4_compress_HC_extStateHC(state, src, dst, srcSize, maxDstSize, 0); } +int LZ4_compressHC2_withStateHC(void *state, const char *src, char *dst, int srcSize, int cLevel) { return LZ4_compress_HC_extStateHC(state, src, dst, srcSize, LZ4_compressBound(srcSize), cLevel); } +int LZ4_compressHC2_limitedOutput_withStateHC(void *state, const char *src, char *dst, int srcSize, int maxDstSize, int cLevel) { return LZ4_compress_HC_extStateHC(state, src, dst, srcSize, maxDstSize, cLevel); } +int LZ4_compressHC_continue(LZ4_streamHC_t *ctx, const char *src, char *dst, int srcSize) { return LZ4_compress_HC_continue(ctx, src, dst, srcSize, LZ4_compressBound(srcSize)); } +int LZ4_compressHC_limitedOutput_continue(LZ4_streamHC_t *ctx, const char *src, char *dst, int srcSize, int maxDstSize) { return LZ4_compress_HC_continue(ctx, src, dst, srcSize, maxDstSize); } /* Deprecated streaming functions */ @@ -1167,42 +1175,36 @@ int LZ4_sizeofStreamStateHC(void) { return LZ4_STREAMHCSIZE; } /* state is presumed correctly sized, aka >= sizeof(LZ4_streamHC_t) * @return : 0 on success, !=0 if error */ -int LZ4_resetStreamStateHC(void* state, char* inputBuffer) -{ - LZ4_streamHC_t* const hc4 = LZ4_initStreamHC(state, sizeof(*hc4)); +int LZ4_resetStreamStateHC(void *state, char *inputBuffer) { + LZ4_streamHC_t *const hc4 = LZ4_initStreamHC(state, sizeof(*hc4)); if (hc4 == NULL) return 1; /* init failed */ - LZ4HC_init_internal (&hc4->internal_donotuse, (const BYTE*)inputBuffer); + LZ4HC_init_internal(&hc4->internal_donotuse, (const BYTE *)inputBuffer); return 0; } -void* LZ4_createHC (const char* inputBuffer) -{ - LZ4_streamHC_t* const hc4 = LZ4_createStreamHC(); +void *LZ4_createHC(const char *inputBuffer) { + LZ4_streamHC_t *const hc4 = LZ4_createStreamHC(); if (hc4 == NULL) return NULL; /* not enough memory */ - LZ4HC_init_internal (&hc4->internal_donotuse, (const BYTE*)inputBuffer); + LZ4HC_init_internal(&hc4->internal_donotuse, (const BYTE *)inputBuffer); return hc4; } -int LZ4_freeHC (void* LZ4HC_Data) -{ +int LZ4_freeHC(void *LZ4HC_Data) { if (!LZ4HC_Data) return 0; /* support free on NULL */ FREEMEM(LZ4HC_Data); return 0; } -int LZ4_compressHC2_continue (void* LZ4HC_Data, const char* src, char* dst, int srcSize, int cLevel) -{ - return LZ4HC_compress_generic (&((LZ4_streamHC_t*)LZ4HC_Data)->internal_donotuse, src, dst, &srcSize, 0, cLevel, notLimited); +int LZ4_compressHC2_continue(void *LZ4HC_Data, const char *src, char *dst, int srcSize, int cLevel) { + return LZ4HC_compress_generic(&((LZ4_streamHC_t *)LZ4HC_Data)->internal_donotuse, src, dst, &srcSize, 0, cLevel, notLimited); } -int LZ4_compressHC2_limitedOutput_continue (void* LZ4HC_Data, const char* src, char* dst, int srcSize, int dstCapacity, int cLevel) -{ - return LZ4HC_compress_generic (&((LZ4_streamHC_t*)LZ4HC_Data)->internal_donotuse, src, dst, &srcSize, dstCapacity, cLevel, limitedOutput); +int LZ4_compressHC2_limitedOutput_continue(void *LZ4HC_Data, const char *src, char *dst, int srcSize, int dstCapacity, int cLevel) { + return LZ4HC_compress_generic(&((LZ4_streamHC_t *)LZ4HC_Data)->internal_donotuse, src, dst, &srcSize, dstCapacity, cLevel, limitedOutput); } -char* LZ4_slideInputBufferHC(void* LZ4HC_Data) -{ - LZ4_streamHC_t *ctx = (LZ4_streamHC_t*)LZ4HC_Data; +char *LZ4_slideInputBufferHC(void *LZ4HC_Data) { + LZ4_streamHC_t *ctx = (LZ4_streamHC_t *)LZ4HC_Data; const BYTE *bufferStart = ctx->internal_donotuse.base + ctx->internal_donotuse.lowLimit; LZ4_resetStreamHC_fast(ctx, ctx->internal_donotuse.compressionLevel); /* avoid const char * -> char * conversion warning :( */ @@ -1221,27 +1223,25 @@ typedef struct { } LZ4HC_optimal_t; /* price in bytes */ -LZ4_FORCE_INLINE int LZ4HC_literalsPrice(int const litlen) -{ +LZ4_FORCE_INLINE int LZ4HC_literalsPrice(int const litlen) { int price = litlen; assert(litlen >= 0); if (litlen >= (int)RUN_MASK) - price += 1 + ((litlen-(int)RUN_MASK) / 255); + price += 1 + ((litlen - (int)RUN_MASK) / 255); return price; } /* requires mlen >= MINMATCH */ -LZ4_FORCE_INLINE int LZ4HC_sequencePrice(int litlen, int mlen) -{ +LZ4_FORCE_INLINE int LZ4HC_sequencePrice(int litlen, int mlen) { int price = 1 + 2 ; /* token + 16-bit offset */ assert(litlen >= 0); assert(mlen >= MINMATCH); price += LZ4HC_literalsPrice(litlen); - if (mlen >= (int)(ML_MASK+MINMATCH)) - price += 1 + ((mlen-(int)(ML_MASK+MINMATCH)) / 255); + if (mlen >= (int)(ML_MASK + MINMATCH)) + price += 1 + ((mlen - (int)(ML_MASK + MINMATCH)) / 255); return price; } @@ -1253,286 +1253,303 @@ typedef struct { } LZ4HC_match_t; LZ4_FORCE_INLINE LZ4HC_match_t -LZ4HC_FindLongerMatch(LZ4HC_CCtx_internal* const ctx, - const BYTE* ip, const BYTE* const iHighLimit, +LZ4HC_FindLongerMatch(LZ4HC_CCtx_internal *const ctx, + const BYTE *ip, const BYTE *const iHighLimit, int minLen, int nbSearches, const dictCtx_directive dict, - const HCfavor_e favorDecSpeed) -{ - LZ4HC_match_t match = { 0 , 0 }; - const BYTE* matchPtr = NULL; + const HCfavor_e favorDecSpeed) { + LZ4HC_match_t match = { 0, 0 }; + const BYTE *matchPtr = NULL; /* note : LZ4HC_InsertAndGetWiderMatch() is able to modify the starting position of a match (*startpos), * but this won't be the case here, as we define iLowLimit==ip, * so LZ4HC_InsertAndGetWiderMatch() won't be allowed to search past ip */ int matchLength = LZ4HC_InsertAndGetWiderMatch(ctx, ip, ip, iHighLimit, minLen, &matchPtr, &ip, nbSearches, 1 /*patternAnalysis*/, 1 /*chainSwap*/, dict, favorDecSpeed); if (matchLength <= minLen) return match; if (favorDecSpeed) { - if ((matchLength>18) & (matchLength<=36)) matchLength=18; /* favor shortcut */ + if ((matchLength > 18) & (matchLength <= 36)) matchLength = 18; /* favor shortcut */ } match.len = matchLength; - match.off = (int)(ip-matchPtr); + match.off = (int)(ip - matchPtr); return match; } -static int LZ4HC_compress_optimal ( LZ4HC_CCtx_internal* ctx, - const char* const source, - char* dst, - int* srcSizePtr, - int dstCapacity, - int const nbSearches, - size_t sufficient_len, - const limitedOutput_directive limit, - int const fullUpdate, - const dictCtx_directive dict, - const HCfavor_e favorDecSpeed) -{ +static int LZ4HC_compress_optimal(LZ4HC_CCtx_internal *ctx, + const char *const source, + char *dst, + int *srcSizePtr, + int dstCapacity, + int const nbSearches, + size_t sufficient_len, + const limitedOutput_directive limit, + int const fullUpdate, + const dictCtx_directive dict, + const HCfavor_e favorDecSpeed) { #define TRAILING_LITERALS 3 LZ4HC_optimal_t opt[LZ4_OPT_NUM + TRAILING_LITERALS]; /* ~64 KB, which is a bit large for stack... */ - const BYTE* ip = (const BYTE*) source; - const BYTE* anchor = ip; - const BYTE* const iend = ip + *srcSizePtr; - const BYTE* const mflimit = iend - MFLIMIT; - const BYTE* const matchlimit = iend - LASTLITERALS; - BYTE* op = (BYTE*) dst; - BYTE* opSaved = (BYTE*) dst; - BYTE* oend = op + dstCapacity; + const BYTE *ip = (const BYTE *) source; + const BYTE *anchor = ip; + const BYTE *const iend = ip + *srcSizePtr; + const BYTE *const mflimit = iend - MFLIMIT; + const BYTE *const matchlimit = iend - LASTLITERALS; + BYTE *op = (BYTE *) dst; + BYTE *opSaved = (BYTE *) dst; + BYTE *oend = op + dstCapacity; /* init */ DEBUGLOG(5, "LZ4HC_compress_optimal(dst=%p, dstCapa=%u)", dst, (unsigned)dstCapacity); *srcSizePtr = 0; if (limit == fillOutput) oend -= LASTLITERALS; /* Hack for support LZ4 format restriction */ - if (sufficient_len >= LZ4_OPT_NUM) sufficient_len = LZ4_OPT_NUM-1; + if (sufficient_len >= LZ4_OPT_NUM) sufficient_len = LZ4_OPT_NUM - 1; /* Main Loop */ assert(ip - anchor < LZ4_MAX_INPUT_SIZE); while (ip <= mflimit) { - int const llen = (int)(ip - anchor); - int best_mlen, best_off; - int cur, last_match_pos = 0; + int const llen = (int)(ip - anchor); + int best_mlen, best_off; + int cur, last_match_pos = 0; - LZ4HC_match_t const firstMatch = LZ4HC_FindLongerMatch(ctx, ip, matchlimit, MINMATCH-1, nbSearches, dict, favorDecSpeed); - if (firstMatch.len==0) { ip++; continue; } + LZ4HC_match_t const firstMatch = LZ4HC_FindLongerMatch(ctx, ip, matchlimit, MINMATCH - 1, nbSearches, dict, favorDecSpeed); + if (firstMatch.len == 0) { ip++; continue; } - if ((size_t)firstMatch.len > sufficient_len) { - /* good enough solution : immediate encoding */ - int const firstML = firstMatch.len; - const BYTE* const matchPos = ip - firstMatch.off; - opSaved = op; - if ( LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), firstML, matchPos, limit, oend) ) /* updates ip, op and anchor */ - goto _dest_overflow; - continue; - } + if ((size_t)firstMatch.len > sufficient_len) { + /* good enough solution : immediate encoding */ + int const firstML = firstMatch.len; + const BYTE *const matchPos = ip - firstMatch.off; + opSaved = op; + if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), firstML, matchPos, limit, oend)) /* updates ip, op and anchor */ + goto _dest_overflow; + continue; + } - /* set prices for first positions (literals) */ - { int rPos; - for (rPos = 0 ; rPos < MINMATCH ; rPos++) { - int const cost = LZ4HC_literalsPrice(llen + rPos); - opt[rPos].mlen = 1; - opt[rPos].off = 0; - opt[rPos].litlen = llen + rPos; - opt[rPos].price = cost; - DEBUGLOG(7, "rPos:%3i => price:%3i (litlen=%i) -- initial setup", - rPos, cost, opt[rPos].litlen); - } } - /* set prices using initial match */ - { int mlen = MINMATCH; - int const matchML = firstMatch.len; /* necessarily < sufficient_len < LZ4_OPT_NUM */ - int const offset = firstMatch.off; - assert(matchML < LZ4_OPT_NUM); - for ( ; mlen <= matchML ; mlen++) { - int const cost = LZ4HC_sequencePrice(llen, mlen); - opt[mlen].mlen = mlen; - opt[mlen].off = offset; - opt[mlen].litlen = llen; - opt[mlen].price = cost; - DEBUGLOG(7, "rPos:%3i => price:%3i (matchlen=%i) -- initial setup", - mlen, cost, mlen); - } } - last_match_pos = firstMatch.len; - { int addLit; - for (addLit = 1; addLit <= TRAILING_LITERALS; addLit ++) { - opt[last_match_pos+addLit].mlen = 1; /* literal */ - opt[last_match_pos+addLit].off = 0; - opt[last_match_pos+addLit].litlen = addLit; - opt[last_match_pos+addLit].price = opt[last_match_pos].price + LZ4HC_literalsPrice(addLit); - DEBUGLOG(7, "rPos:%3i => price:%3i (litlen=%i) -- initial setup", - last_match_pos+addLit, opt[last_match_pos+addLit].price, addLit); - } } + /* set prices for first positions (literals) */ + { + int rPos; + for (rPos = 0 ; rPos < MINMATCH ; rPos++) { + int const cost = LZ4HC_literalsPrice(llen + rPos); + opt[rPos].mlen = 1; + opt[rPos].off = 0; + opt[rPos].litlen = llen + rPos; + opt[rPos].price = cost; + DEBUGLOG(7, "rPos:%3i => price:%3i (litlen=%i) -- initial setup", + rPos, cost, opt[rPos].litlen); + } + } + /* set prices using initial match */ + { + int mlen = MINMATCH; + int const matchML = firstMatch.len; /* necessarily < sufficient_len < LZ4_OPT_NUM */ + int const offset = firstMatch.off; + assert(matchML < LZ4_OPT_NUM); + for (; mlen <= matchML ; mlen++) { + int const cost = LZ4HC_sequencePrice(llen, mlen); + opt[mlen].mlen = mlen; + opt[mlen].off = offset; + opt[mlen].litlen = llen; + opt[mlen].price = cost; + DEBUGLOG(7, "rPos:%3i => price:%3i (matchlen=%i) -- initial setup", + mlen, cost, mlen); + } + } + last_match_pos = firstMatch.len; + { + int addLit; + for (addLit = 1; addLit <= TRAILING_LITERALS; addLit ++) { + opt[last_match_pos + addLit].mlen = 1; /* literal */ + opt[last_match_pos + addLit].off = 0; + opt[last_match_pos + addLit].litlen = addLit; + opt[last_match_pos + addLit].price = opt[last_match_pos].price + LZ4HC_literalsPrice(addLit); + DEBUGLOG(7, "rPos:%3i => price:%3i (litlen=%i) -- initial setup", + last_match_pos + addLit, opt[last_match_pos + addLit].price, addLit); + } + } - /* check further positions */ - for (cur = 1; cur < last_match_pos; cur++) { - const BYTE* const curPtr = ip + cur; - LZ4HC_match_t newMatch; + /* check further positions */ + for (cur = 1; cur < last_match_pos; cur++) { + const BYTE *const curPtr = ip + cur; + LZ4HC_match_t newMatch; - if (curPtr > mflimit) break; - DEBUGLOG(7, "rPos:%u[%u] vs [%u]%u", - cur, opt[cur].price, opt[cur+1].price, cur+1); - if (fullUpdate) { - /* not useful to search here if next position has same (or lower) cost */ - if ( (opt[cur+1].price <= opt[cur].price) - /* in some cases, next position has same cost, but cost rises sharply after, so a small match would still be beneficial */ - && (opt[cur+MINMATCH].price < opt[cur].price + 3/*min seq price*/) ) - continue; - } else { - /* not useful to search here if next position has same (or lower) cost */ - if (opt[cur+1].price <= opt[cur].price) continue; - } + if (curPtr > mflimit) break; + DEBUGLOG(7, "rPos:%u[%u] vs [%u]%u", + cur, opt[cur].price, opt[cur + 1].price, cur + 1); + if (fullUpdate) { + /* not useful to search here if next position has same (or lower) cost */ + if ((opt[cur + 1].price <= opt[cur].price) + /* in some cases, next position has same cost, but cost rises sharply after, so a small match would still be beneficial */ + && (opt[cur + MINMATCH].price < opt[cur].price + 3/*min seq price*/)) + continue; + } else { + /* not useful to search here if next position has same (or lower) cost */ + if (opt[cur + 1].price <= opt[cur].price) continue; + } - DEBUGLOG(7, "search at rPos:%u", cur); - if (fullUpdate) - newMatch = LZ4HC_FindLongerMatch(ctx, curPtr, matchlimit, MINMATCH-1, nbSearches, dict, favorDecSpeed); - else - /* only test matches of minimum length; slightly faster, but misses a few bytes */ - newMatch = LZ4HC_FindLongerMatch(ctx, curPtr, matchlimit, last_match_pos - cur, nbSearches, dict, favorDecSpeed); - if (!newMatch.len) continue; + DEBUGLOG(7, "search at rPos:%u", cur); + if (fullUpdate) + newMatch = LZ4HC_FindLongerMatch(ctx, curPtr, matchlimit, MINMATCH - 1, nbSearches, dict, favorDecSpeed); + else + /* only test matches of minimum length; slightly faster, but misses a few bytes */ + newMatch = LZ4HC_FindLongerMatch(ctx, curPtr, matchlimit, last_match_pos - cur, nbSearches, dict, favorDecSpeed); + if (!newMatch.len) continue; - if ( ((size_t)newMatch.len > sufficient_len) - || (newMatch.len + cur >= LZ4_OPT_NUM) ) { - /* immediate encoding */ - best_mlen = newMatch.len; - best_off = newMatch.off; - last_match_pos = cur + 1; - goto encode; - } + if (((size_t)newMatch.len > sufficient_len) + || (newMatch.len + cur >= LZ4_OPT_NUM)) { + /* immediate encoding */ + best_mlen = newMatch.len; + best_off = newMatch.off; + last_match_pos = cur + 1; + goto encode; + } - /* before match : set price with literals at beginning */ - { int const baseLitlen = opt[cur].litlen; - int litlen; - for (litlen = 1; litlen < MINMATCH; litlen++) { - int const price = opt[cur].price - LZ4HC_literalsPrice(baseLitlen) + LZ4HC_literalsPrice(baseLitlen+litlen); - int const pos = cur + litlen; - if (price < opt[pos].price) { - opt[pos].mlen = 1; /* literal */ - opt[pos].off = 0; - opt[pos].litlen = baseLitlen+litlen; - opt[pos].price = price; - DEBUGLOG(7, "rPos:%3i => price:%3i (litlen=%i)", - pos, price, opt[pos].litlen); - } } } + /* before match : set price with literals at beginning */ + { + int const baseLitlen = opt[cur].litlen; + int litlen; + for (litlen = 1; litlen < MINMATCH; litlen++) { + int const price = opt[cur].price - LZ4HC_literalsPrice(baseLitlen) + LZ4HC_literalsPrice(baseLitlen + litlen); + int const pos = cur + litlen; + if (price < opt[pos].price) { + opt[pos].mlen = 1; /* literal */ + opt[pos].off = 0; + opt[pos].litlen = baseLitlen + litlen; + opt[pos].price = price; + DEBUGLOG(7, "rPos:%3i => price:%3i (litlen=%i)", + pos, price, opt[pos].litlen); + } + } + } - /* set prices using match at position = cur */ - { int const matchML = newMatch.len; - int ml = MINMATCH; + /* set prices using match at position = cur */ + { + int const matchML = newMatch.len; + int ml = MINMATCH; - assert(cur + newMatch.len < LZ4_OPT_NUM); - for ( ; ml <= matchML ; ml++) { - int const pos = cur + ml; - int const offset = newMatch.off; - int price; - int ll; - DEBUGLOG(7, "testing price rPos %i (last_match_pos=%i)", - pos, last_match_pos); - if (opt[cur].mlen == 1) { - ll = opt[cur].litlen; - price = ((cur > ll) ? opt[cur - ll].price : 0) - + LZ4HC_sequencePrice(ll, ml); - } else { - ll = 0; - price = opt[cur].price + LZ4HC_sequencePrice(0, ml); - } + assert(cur + newMatch.len < LZ4_OPT_NUM); + for (; ml <= matchML ; ml++) { + int const pos = cur + ml; + int const offset = newMatch.off; + int price; + int ll; + DEBUGLOG(7, "testing price rPos %i (last_match_pos=%i)", + pos, last_match_pos); + if (opt[cur].mlen == 1) { + ll = opt[cur].litlen; + price = ((cur > ll) ? opt[cur - ll].price : 0) + + LZ4HC_sequencePrice(ll, ml); + } else { + ll = 0; + price = opt[cur].price + LZ4HC_sequencePrice(0, ml); + } assert((U32)favorDecSpeed <= 1); - if (pos > last_match_pos+TRAILING_LITERALS - || price <= opt[pos].price - (int)favorDecSpeed) { - DEBUGLOG(7, "rPos:%3i => price:%3i (matchlen=%i)", - pos, price, ml); - assert(pos < LZ4_OPT_NUM); - if ( (ml == matchML) /* last pos of last match */ - && (last_match_pos < pos) ) - last_match_pos = pos; - opt[pos].mlen = ml; - opt[pos].off = offset; - opt[pos].litlen = ll; - opt[pos].price = price; - } } } - /* complete following positions with literals */ - { int addLit; - for (addLit = 1; addLit <= TRAILING_LITERALS; addLit ++) { - opt[last_match_pos+addLit].mlen = 1; /* literal */ - opt[last_match_pos+addLit].off = 0; - opt[last_match_pos+addLit].litlen = addLit; - opt[last_match_pos+addLit].price = opt[last_match_pos].price + LZ4HC_literalsPrice(addLit); - DEBUGLOG(7, "rPos:%3i => price:%3i (litlen=%i)", last_match_pos+addLit, opt[last_match_pos+addLit].price, addLit); - } } - } /* for (cur = 1; cur <= last_match_pos; cur++) */ + if (pos > last_match_pos + TRAILING_LITERALS + || price <= opt[pos].price - (int)favorDecSpeed) { + DEBUGLOG(7, "rPos:%3i => price:%3i (matchlen=%i)", + pos, price, ml); + assert(pos < LZ4_OPT_NUM); + if ((ml == matchML) /* last pos of last match */ + && (last_match_pos < pos)) + last_match_pos = pos; + opt[pos].mlen = ml; + opt[pos].off = offset; + opt[pos].litlen = ll; + opt[pos].price = price; + } + } + } + /* complete following positions with literals */ + { + int addLit; + for (addLit = 1; addLit <= TRAILING_LITERALS; addLit ++) { + opt[last_match_pos + addLit].mlen = 1; /* literal */ + opt[last_match_pos + addLit].off = 0; + opt[last_match_pos + addLit].litlen = addLit; + opt[last_match_pos + addLit].price = opt[last_match_pos].price + LZ4HC_literalsPrice(addLit); + DEBUGLOG(7, "rPos:%3i => price:%3i (litlen=%i)", last_match_pos + addLit, opt[last_match_pos + addLit].price, addLit); + } + } + } /* for (cur = 1; cur <= last_match_pos; cur++) */ - assert(last_match_pos < LZ4_OPT_NUM + TRAILING_LITERALS); - best_mlen = opt[last_match_pos].mlen; - best_off = opt[last_match_pos].off; - cur = last_match_pos - best_mlen; + assert(last_match_pos < LZ4_OPT_NUM + TRAILING_LITERALS); + best_mlen = opt[last_match_pos].mlen; + best_off = opt[last_match_pos].off; + cur = last_match_pos - best_mlen; - encode: /* cur, last_match_pos, best_mlen, best_off must be set */ - assert(cur < LZ4_OPT_NUM); - assert(last_match_pos >= 1); /* == 1 when only one candidate */ - DEBUGLOG(6, "reverse traversal, looking for shortest path (last_match_pos=%i)", last_match_pos); - { int candidate_pos = cur; - int selected_matchLength = best_mlen; - int selected_offset = best_off; - while (1) { /* from end to beginning */ - int const next_matchLength = opt[candidate_pos].mlen; /* can be 1, means literal */ - int const next_offset = opt[candidate_pos].off; - DEBUGLOG(7, "pos %i: sequence length %i", candidate_pos, selected_matchLength); - opt[candidate_pos].mlen = selected_matchLength; - opt[candidate_pos].off = selected_offset; - selected_matchLength = next_matchLength; - selected_offset = next_offset; - if (next_matchLength > candidate_pos) break; /* last match elected, first match to encode */ - assert(next_matchLength > 0); /* can be 1, means literal */ - candidate_pos -= next_matchLength; - } } +encode: /* cur, last_match_pos, best_mlen, best_off must be set */ + assert(cur < LZ4_OPT_NUM); + assert(last_match_pos >= 1); /* == 1 when only one candidate */ + DEBUGLOG(6, "reverse traversal, looking for shortest path (last_match_pos=%i)", last_match_pos); + { + int candidate_pos = cur; + int selected_matchLength = best_mlen; + int selected_offset = best_off; + while (1) { /* from end to beginning */ + int const next_matchLength = opt[candidate_pos].mlen; /* can be 1, means literal */ + int const next_offset = opt[candidate_pos].off; + DEBUGLOG(7, "pos %i: sequence length %i", candidate_pos, selected_matchLength); + opt[candidate_pos].mlen = selected_matchLength; + opt[candidate_pos].off = selected_offset; + selected_matchLength = next_matchLength; + selected_offset = next_offset; + if (next_matchLength > candidate_pos) break; /* last match elected, first match to encode */ + assert(next_matchLength > 0); /* can be 1, means literal */ + candidate_pos -= next_matchLength; + } + } - /* encode all recorded sequences in order */ - { int rPos = 0; /* relative position (to ip) */ - while (rPos < last_match_pos) { - int const ml = opt[rPos].mlen; - int const offset = opt[rPos].off; - if (ml == 1) { ip++; rPos++; continue; } /* literal; note: can end up with several literals, in which case, skip them */ - rPos += ml; - assert(ml >= MINMATCH); - assert((offset >= 1) && (offset <= LZ4_DISTANCE_MAX)); - opSaved = op; - if ( LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ml, ip - offset, limit, oend) ) /* updates ip, op and anchor */ - goto _dest_overflow; - } } - } /* while (ip <= mflimit) */ + /* encode all recorded sequences in order */ + { + int rPos = 0; /* relative position (to ip) */ + while (rPos < last_match_pos) { + int const ml = opt[rPos].mlen; + int const offset = opt[rPos].off; + if (ml == 1) { ip++; rPos++; continue; } /* literal; note: can end up with several literals, in which case, skip them */ + rPos += ml; + assert(ml >= MINMATCH); + assert((offset >= 1) && (offset <= LZ4_DISTANCE_MAX)); + opSaved = op; + if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ml, ip - offset, limit, oend)) /* updates ip, op and anchor */ + goto _dest_overflow; + } + } + } /* while (ip <= mflimit) */ - _last_literals: - /* Encode Last Literals */ - { size_t lastRunSize = (size_t)(iend - anchor); /* literals */ - size_t litLength = (lastRunSize + 255 - RUN_MASK) / 255; - size_t const totalSize = 1 + litLength + lastRunSize; - if (limit == fillOutput) oend += LASTLITERALS; /* restore correct value */ - if (limit && (op + totalSize > oend)) { - if (limit == limitedOutput) return 0; /* Check output limit */ - /* adapt lastRunSize to fill 'dst' */ - lastRunSize = (size_t)(oend - op) - 1; - litLength = (lastRunSize + 255 - RUN_MASK) / 255; - lastRunSize -= litLength; - } - ip = anchor + lastRunSize; +_last_literals: + /* Encode Last Literals */ + { + size_t lastRunSize = (size_t)(iend - anchor); /* literals */ + size_t litLength = (lastRunSize + 255 - RUN_MASK) / 255; + size_t const totalSize = 1 + litLength + lastRunSize; + if (limit == fillOutput) oend += LASTLITERALS; /* restore correct value */ + if (limit && (op + totalSize > oend)) { + if (limit == limitedOutput) return 0; /* Check output limit */ + /* adapt lastRunSize to fill 'dst' */ + lastRunSize = (size_t)(oend - op) - 1; + litLength = (lastRunSize + 255 - RUN_MASK) / 255; + lastRunSize -= litLength; + } + ip = anchor + lastRunSize; - if (lastRunSize >= RUN_MASK) { - size_t accumulator = lastRunSize - RUN_MASK; - *op++ = (RUN_MASK << ML_BITS); - for(; accumulator >= 255 ; accumulator -= 255) *op++ = 255; - *op++ = (BYTE) accumulator; - } else { - *op++ = (BYTE)(lastRunSize << ML_BITS); - } - memcpy(op, anchor, lastRunSize); - op += lastRunSize; - } + if (lastRunSize >= RUN_MASK) { + size_t accumulator = lastRunSize - RUN_MASK; + *op++ = (RUN_MASK << ML_BITS); + for (; accumulator >= 255 ; accumulator -= 255) * op++ = 255; + *op++ = (BYTE) accumulator; + } else { + *op++ = (BYTE)(lastRunSize << ML_BITS); + } + memcpy(op, anchor, lastRunSize); + op += lastRunSize; + } - /* End */ - *srcSizePtr = (int) (((const char*)ip) - source); - return (int) ((char*)op-dst); + /* End */ + *srcSizePtr = (int)(((const char *)ip) - source); + return (int)((char *)op - dst); - _dest_overflow: - if (limit == fillOutput) { - op = opSaved; /* restore correct out pointer */ - goto _last_literals; - } - return 0; - } +_dest_overflow: + if (limit == fillOutput) { + op = opSaved; /* restore correct out pointer */ + goto _last_literals; + } + return 0; +} diff --git a/common/lz4/lz4hc.h b/common/lz4/lz4hc.h index 44e35bbf6..be39e08a3 100644 --- a/common/lz4/lz4hc.h +++ b/common/lz4/lz4hc.h @@ -63,7 +63,7 @@ extern "C" { * @return : the number of bytes written into 'dst' * or 0 if compression fails. */ -LZ4LIB_API int LZ4_compress_HC (const char* src, char* dst, int srcSize, int dstCapacity, int compressionLevel); +LZ4LIB_API int LZ4_compress_HC(const char *src, char *dst, int srcSize, int dstCapacity, int compressionLevel); /* Note : @@ -77,7 +77,7 @@ LZ4LIB_API int LZ4_compress_HC (const char* src, char* dst, int srcSize, int dst * Memory segment must be aligned on 8-bytes boundaries (which a normal malloc() should do properly). */ LZ4LIB_API int LZ4_sizeofStateHC(void); -LZ4LIB_API int LZ4_compress_HC_extStateHC(void* stateHC, const char* src, char* dst, int srcSize, int maxDstSize, int compressionLevel); +LZ4LIB_API int LZ4_compress_HC_extStateHC(void *stateHC, const char *src, char *dst, int srcSize, int maxDstSize, int compressionLevel); /*! LZ4_compress_HC_destSize() : v1.9.0+ @@ -88,9 +88,9 @@ LZ4LIB_API int LZ4_compress_HC_extStateHC(void* stateHC, const char* src, char* * or 0 if compression fails. * `srcSizePtr` : on success, *srcSizePtr is updated to indicate how much bytes were read from `src` */ -LZ4LIB_API int LZ4_compress_HC_destSize(void* stateHC, - const char* src, char* dst, - int* srcSizePtr, int targetDstSize, +LZ4LIB_API int LZ4_compress_HC_destSize(void *stateHC, + const char *src, char *dst, + int *srcSizePtr, int targetDstSize, int compressionLevel); @@ -98,7 +98,7 @@ LZ4LIB_API int LZ4_compress_HC_destSize(void* stateHC, * Streaming Compression * Bufferless synchronous API **************************************/ - typedef union LZ4_streamHC_u LZ4_streamHC_t; /* incomplete type (defined later) */ +typedef union LZ4_streamHC_u LZ4_streamHC_t; /* incomplete type (defined later) */ /*! LZ4_createStreamHC() and LZ4_freeStreamHC() : * These functions create and release memory for LZ4 HC streaming state. @@ -106,8 +106,8 @@ LZ4LIB_API int LZ4_compress_HC_destSize(void* stateHC, * A same state can be used multiple times consecutively, * starting with LZ4_resetStreamHC_fast() to start a new stream of blocks. */ -LZ4LIB_API LZ4_streamHC_t* LZ4_createStreamHC(void); -LZ4LIB_API int LZ4_freeStreamHC (LZ4_streamHC_t* streamHCPtr); +LZ4LIB_API LZ4_streamHC_t *LZ4_createStreamHC(void); +LZ4LIB_API int LZ4_freeStreamHC(LZ4_streamHC_t *streamHCPtr); /* These functions compress data in successive blocks of any size, @@ -152,12 +152,12 @@ LZ4LIB_API int LZ4_freeStreamHC (LZ4_streamHC_t* streamHCPtr); just by resetting it, using LZ4_resetStreamHC_fast(). */ -LZ4LIB_API void LZ4_resetStreamHC_fast(LZ4_streamHC_t* streamHCPtr, int compressionLevel); /* v1.9.0+ */ -LZ4LIB_API int LZ4_loadDictHC (LZ4_streamHC_t* streamHCPtr, const char* dictionary, int dictSize); +LZ4LIB_API void LZ4_resetStreamHC_fast(LZ4_streamHC_t *streamHCPtr, int compressionLevel); /* v1.9.0+ */ +LZ4LIB_API int LZ4_loadDictHC(LZ4_streamHC_t *streamHCPtr, const char *dictionary, int dictSize); -LZ4LIB_API int LZ4_compress_HC_continue (LZ4_streamHC_t* streamHCPtr, - const char* src, char* dst, - int srcSize, int maxDstSize); +LZ4LIB_API int LZ4_compress_HC_continue(LZ4_streamHC_t *streamHCPtr, + const char *src, char *dst, + int srcSize, int maxDstSize); /*! LZ4_compress_HC_continue_destSize() : v1.9.0+ * Similar to LZ4_compress_HC_continue(), @@ -169,11 +169,11 @@ LZ4LIB_API int LZ4_compress_HC_continue (LZ4_streamHC_t* streamHCPtr, * `srcSizePtr` : on success, *srcSizePtr will be updated to indicate how much bytes were read from `src`. * Note that this function may not consume the entire input. */ -LZ4LIB_API int LZ4_compress_HC_continue_destSize(LZ4_streamHC_t* LZ4_streamHCPtr, - const char* src, char* dst, - int* srcSizePtr, int targetDstSize); +LZ4LIB_API int LZ4_compress_HC_continue_destSize(LZ4_streamHC_t *LZ4_streamHCPtr, + const char *src, char *dst, + int *srcSizePtr, int targetDstSize); -LZ4LIB_API int LZ4_saveDictHC (LZ4_streamHC_t* streamHCPtr, char* safeBuffer, int maxDictSize); +LZ4LIB_API int LZ4_saveDictHC(LZ4_streamHC_t *streamHCPtr, char *safeBuffer, int maxDictSize); @@ -202,13 +202,12 @@ LZ4LIB_API int LZ4_saveDictHC (LZ4_streamHC_t* streamHCPtr, char* safeBuffer, in #include <stdint.h> typedef struct LZ4HC_CCtx_internal LZ4HC_CCtx_internal; -struct LZ4HC_CCtx_internal -{ +struct LZ4HC_CCtx_internal { uint32_t hashTable[LZ4HC_HASHTABLESIZE]; uint16_t chainTable[LZ4HC_MAXD]; - const uint8_t* end; /* next block here to continue on current prefix */ - const uint8_t* base; /* All index relative to this position */ - const uint8_t* dictBase; /* alternate base for extDict */ + const uint8_t *end; /* next block here to continue on current prefix */ + const uint8_t *base; /* All index relative to this position */ + const uint8_t *dictBase; /* alternate base for extDict */ uint32_t dictLimit; /* below that point, need extDict */ uint32_t lowLimit; /* below that point, no more dict */ uint32_t nextToUpdate; /* index from which to continue dictionary update */ @@ -216,19 +215,18 @@ struct LZ4HC_CCtx_internal int8_t favorDecSpeed; /* favor decompression speed if this flag set, otherwise, favor compression ratio */ int8_t dirty; /* stream has to be fully reset if this flag is set */ - const LZ4HC_CCtx_internal* dictCtx; + const LZ4HC_CCtx_internal *dictCtx; }; #else typedef struct LZ4HC_CCtx_internal LZ4HC_CCtx_internal; -struct LZ4HC_CCtx_internal -{ +struct LZ4HC_CCtx_internal { unsigned int hashTable[LZ4HC_HASHTABLESIZE]; unsigned short chainTable[LZ4HC_MAXD]; - const unsigned char* end; /* next block here to continue on current prefix */ - const unsigned char* base; /* All index relative to this position */ - const unsigned char* dictBase; /* alternate base for extDict */ + const unsigned char *end; /* next block here to continue on current prefix */ + const unsigned char *base; /* All index relative to this position */ + const unsigned char *dictBase; /* alternate base for extDict */ unsigned int dictLimit; /* below that point, need extDict */ unsigned int lowLimit; /* below that point, no more dict */ unsigned int nextToUpdate; /* index from which to continue dictionary update */ @@ -236,7 +234,7 @@ struct LZ4HC_CCtx_internal char favorDecSpeed; /* favor decompression speed if this flag set, otherwise, favor compression ratio */ char dirty; /* stream has to be fully reset if this flag is set */ - const LZ4HC_CCtx_internal* dictCtx; + const LZ4HC_CCtx_internal *dictCtx; }; #endif @@ -269,7 +267,7 @@ union LZ4_streamHC_u { * Required before first use of a statically allocated LZ4_streamHC_t. * Before v1.9.0 : use LZ4_resetStreamHC() instead */ -LZ4LIB_API LZ4_streamHC_t* LZ4_initStreamHC (void* buffer, size_t size); +LZ4LIB_API LZ4_streamHC_t *LZ4_initStreamHC(void *buffer, size_t size); /*-************************************ @@ -278,16 +276,16 @@ LZ4LIB_API LZ4_streamHC_t* LZ4_initStreamHC (void* buffer, size_t size); /* see lz4.h LZ4_DISABLE_DEPRECATE_WARNINGS to turn off deprecation warnings */ /* deprecated compression functions */ -LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC (const char* source, char* dest, int inputSize); -LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC_limitedOutput (const char* source, char* dest, int inputSize, int maxOutputSize); -LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC2 (const char* source, char* dest, int inputSize, int compressionLevel); -LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC2_limitedOutput(const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel); -LZ4_DEPRECATED("use LZ4_compress_HC_extStateHC() instead") LZ4LIB_API int LZ4_compressHC_withStateHC (void* state, const char* source, char* dest, int inputSize); -LZ4_DEPRECATED("use LZ4_compress_HC_extStateHC() instead") LZ4LIB_API int LZ4_compressHC_limitedOutput_withStateHC (void* state, const char* source, char* dest, int inputSize, int maxOutputSize); -LZ4_DEPRECATED("use LZ4_compress_HC_extStateHC() instead") LZ4LIB_API int LZ4_compressHC2_withStateHC (void* state, const char* source, char* dest, int inputSize, int compressionLevel); -LZ4_DEPRECATED("use LZ4_compress_HC_extStateHC() instead") LZ4LIB_API int LZ4_compressHC2_limitedOutput_withStateHC(void* state, const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel); -LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") LZ4LIB_API int LZ4_compressHC_continue (LZ4_streamHC_t* LZ4_streamHCPtr, const char* source, char* dest, int inputSize); -LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") LZ4LIB_API int LZ4_compressHC_limitedOutput_continue (LZ4_streamHC_t* LZ4_streamHCPtr, const char* source, char* dest, int inputSize, int maxOutputSize); +LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC(const char *source, char *dest, int inputSize); +LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC_limitedOutput(const char *source, char *dest, int inputSize, int maxOutputSize); +LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC2(const char *source, char *dest, int inputSize, int compressionLevel); +LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC2_limitedOutput(const char *source, char *dest, int inputSize, int maxOutputSize, int compressionLevel); +LZ4_DEPRECATED("use LZ4_compress_HC_extStateHC() instead") LZ4LIB_API int LZ4_compressHC_withStateHC(void *state, const char *source, char *dest, int inputSize); +LZ4_DEPRECATED("use LZ4_compress_HC_extStateHC() instead") LZ4LIB_API int LZ4_compressHC_limitedOutput_withStateHC(void *state, const char *source, char *dest, int inputSize, int maxOutputSize); +LZ4_DEPRECATED("use LZ4_compress_HC_extStateHC() instead") LZ4LIB_API int LZ4_compressHC2_withStateHC(void *state, const char *source, char *dest, int inputSize, int compressionLevel); +LZ4_DEPRECATED("use LZ4_compress_HC_extStateHC() instead") LZ4LIB_API int LZ4_compressHC2_limitedOutput_withStateHC(void *state, const char *source, char *dest, int inputSize, int maxOutputSize, int compressionLevel); +LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") LZ4LIB_API int LZ4_compressHC_continue(LZ4_streamHC_t *LZ4_streamHCPtr, const char *source, char *dest, int inputSize); +LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") LZ4LIB_API int LZ4_compressHC_limitedOutput_continue(LZ4_streamHC_t *LZ4_streamHCPtr, const char *source, char *dest, int inputSize, int maxOutputSize); /* Obsolete streaming functions; degraded functionality; do not use! * @@ -297,13 +295,13 @@ LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") LZ4LIB_API int LZ4_comp * LZ4_slideInputBufferHC() will truncate the history of the stream, rather * than preserve a window-sized chunk of history. */ -LZ4_DEPRECATED("use LZ4_createStreamHC() instead") LZ4LIB_API void* LZ4_createHC (const char* inputBuffer); -LZ4_DEPRECATED("use LZ4_saveDictHC() instead") LZ4LIB_API char* LZ4_slideInputBufferHC (void* LZ4HC_Data); -LZ4_DEPRECATED("use LZ4_freeStreamHC() instead") LZ4LIB_API int LZ4_freeHC (void* LZ4HC_Data); -LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") LZ4LIB_API int LZ4_compressHC2_continue (void* LZ4HC_Data, const char* source, char* dest, int inputSize, int compressionLevel); -LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") LZ4LIB_API int LZ4_compressHC2_limitedOutput_continue (void* LZ4HC_Data, const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel); +LZ4_DEPRECATED("use LZ4_createStreamHC() instead") LZ4LIB_API void *LZ4_createHC(const char *inputBuffer); +LZ4_DEPRECATED("use LZ4_saveDictHC() instead") LZ4LIB_API char *LZ4_slideInputBufferHC(void *LZ4HC_Data); +LZ4_DEPRECATED("use LZ4_freeStreamHC() instead") LZ4LIB_API int LZ4_freeHC(void *LZ4HC_Data); +LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") LZ4LIB_API int LZ4_compressHC2_continue(void *LZ4HC_Data, const char *source, char *dest, int inputSize, int compressionLevel); +LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") LZ4LIB_API int LZ4_compressHC2_limitedOutput_continue(void *LZ4HC_Data, const char *source, char *dest, int inputSize, int maxOutputSize, int compressionLevel); LZ4_DEPRECATED("use LZ4_createStreamHC() instead") LZ4LIB_API int LZ4_sizeofStreamStateHC(void); -LZ4_DEPRECATED("use LZ4_initStreamHC() instead") LZ4LIB_API int LZ4_resetStreamStateHC(void* state, char* inputBuffer); +LZ4_DEPRECATED("use LZ4_initStreamHC() instead") LZ4LIB_API int LZ4_resetStreamStateHC(void *state, char *inputBuffer); /* LZ4_resetStreamHC() is now replaced by LZ4_initStreamHC(). @@ -314,7 +312,7 @@ LZ4_DEPRECATED("use LZ4_initStreamHC() instead") LZ4LIB_API int LZ4_resetStre * It is recommended to switch to LZ4_initStreamHC(). * LZ4_resetStreamHC() will generate deprecation warnings in a future version. */ -LZ4LIB_API void LZ4_resetStreamHC (LZ4_streamHC_t* streamHCPtr, int compressionLevel); +LZ4LIB_API void LZ4_resetStreamHC(LZ4_streamHC_t *streamHCPtr, int compressionLevel); #if defined (__cplusplus) @@ -349,14 +347,14 @@ extern "C" { * for dynamic adaptation. */ LZ4LIB_STATIC_API void LZ4_setCompressionLevel( - LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel); + LZ4_streamHC_t *LZ4_streamHCPtr, int compressionLevel); /*! LZ4_favorDecompressionSpeed() : v1.8.2+ (experimental) * Opt. Parser will favor decompression speed over compression ratio. * Only applicable to levels >= LZ4HC_CLEVEL_OPT_MIN. */ LZ4LIB_STATIC_API void LZ4_favorDecompressionSpeed( - LZ4_streamHC_t* LZ4_streamHCPtr, int favor); + LZ4_streamHC_t *LZ4_streamHCPtr, int favor); /*! LZ4_resetStreamHC_fast() : v1.9.0+ * When an LZ4_streamHC_t is known to be in a internally coherent state, @@ -382,7 +380,7 @@ LZ4LIB_STATIC_API void LZ4_favorDecompressionSpeed( * clear any existing history and settings from the context. */ LZ4LIB_STATIC_API void LZ4_resetStreamHC_fast( - LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel); + LZ4_streamHC_t *LZ4_streamHCPtr, int compressionLevel); /*! LZ4_compress_HC_extStateHC_fastReset() : * A variant of LZ4_compress_HC_extStateHC(). @@ -395,9 +393,9 @@ LZ4LIB_STATIC_API void LZ4_resetStreamHC_fast( * LZ4_resetStreamHC_fast() while LZ4_compress_HC_extStateHC() starts with a * call to LZ4_resetStreamHC(). */ -LZ4LIB_STATIC_API int LZ4_compress_HC_extStateHC_fastReset ( - void* state, - const char* src, char* dst, +LZ4LIB_STATIC_API int LZ4_compress_HC_extStateHC_fastReset( + void *state, + const char *src, char *dst, int srcSize, int dstCapacity, int compressionLevel); @@ -427,7 +425,7 @@ LZ4LIB_STATIC_API int LZ4_compress_HC_extStateHC_fastReset ( * through the lifetime of the stream session. */ LZ4LIB_STATIC_API void LZ4_attach_HC_dictionary( - LZ4_streamHC_t *working_stream, + LZ4_streamHC_t *working_stream, const LZ4_streamHC_t *dictionary_stream); #if defined (__cplusplus) diff --git a/tools/fpga_compress/Makefile b/tools/fpga_compress/Makefile index 26b34ba61..4a97776b2 100644 --- a/tools/fpga_compress/Makefile +++ b/tools/fpga_compress/Makefile @@ -1,4 +1,4 @@ -MYSRCPATHS = +MYSRCPATHS = MYINCLUDES = -I../../common_fpga MYCFLAGS = -std=c99 -D_ISOC99_SOURCE MYDEFS = diff --git a/tools/fpga_compress/fpga_compress.c b/tools/fpga_compress/fpga_compress.c index 0d218300f..b03caabf4 100644 --- a/tools/fpga_compress/fpga_compress.c +++ b/tools/fpga_compress/fpga_compress.c @@ -61,7 +61,7 @@ static int zlib_compress(FILE *infile[], uint8_t num_infiles, FILE *outfile) { for (uint16_t j = 0; j < num_infiles; j++) { for (uint16_t k = 0; k < FPGA_INTERLEAVE_SIZE; k++) { uint8_t c = (uint8_t)fgetc(infile[j]); - + if (!feof(infile[j])) { fpga_config[total_size++] = c; } else if (num_infiles > 1) { @@ -81,12 +81,12 @@ static int zlib_compress(FILE *infile[], uint8_t num_infiles, FILE *outfile) { char *outbuf = calloc(outsize_max, sizeof(char)); - LZ4_streamHC_t* lz4_streamhc = LZ4_createStreamHC(); + LZ4_streamHC_t *lz4_streamhc = LZ4_createStreamHC(); LZ4_resetStreamHC_fast(lz4_streamhc, LZ4HC_CLEVEL_MAX); int current_in = 0; int current_out = 0; - char * ring_buffer = calloc(buffer_size, sizeof(char)); + char *ring_buffer = calloc(buffer_size, sizeof(char)); while (current_in < total_size) { int bytes_to_copy = FPGA_RING_BUFFER_BYTES; if (total_size - current_in < FPGA_RING_BUFFER_BYTES) @@ -105,13 +105,13 @@ static int zlib_compress(FILE *infile[], uint8_t num_infiles, FILE *outfile) { free(ring_buffer); free(outbuf); free(fpga_config); - - fclose(outfile); + + fclose(outfile); for (uint16_t j = 0; j < num_infiles; j++) { fclose(infile[j]); } LZ4_freeStreamHC(lz4_streamhc); - + fprintf(stdout, "compressed %u input bytes to %u output bytes\n", total_size, current_out); if (current_out == 0) { @@ -122,8 +122,8 @@ static int zlib_compress(FILE *infile[], uint8_t num_infiles, FILE *outfile) { } typedef struct lz4_stream_s { - LZ4_streamDecode_t* lz4StreamDecode; - char* next_in; + LZ4_streamDecode_t *lz4StreamDecode; + char *next_in; int avail_in; } lz4_stream; @@ -143,7 +143,7 @@ static int zlib_decompress(FILE *infile, FILE *outfile) { return (EXIT_FAILURE); } - char* inbuf = calloc(infile_size, sizeof(char)); + char *inbuf = calloc(infile_size, sizeof(char)); size_t num_read = fread(inbuf, sizeof(char), infile_size, infile); if (num_read != infile_size) { diff --git a/tools/hitag2crack/hitag2_gen_nRaR.py b/tools/hitag2crack/hitag2_gen_nRaR.py index 14f48a26d..232add1f3 100755 --- a/tools/hitag2crack/hitag2_gen_nRaR.py +++ b/tools/hitag2crack/hitag2_gen_nRaR.py @@ -43,7 +43,7 @@ def lfsr_bs(state, i): def f20a_bs(a,b,c,d): return (~(((a|b)&c)^(a|d)^b)) # 6 ops -def f20b_bs(a,b,c,d): +def f20b_bs(a,b,c,d): return (~(((d|c)&(a^b))^(d|a|b))) # 7 ops def f20c_bs(a,b,c,d,e): return (~((((((c^e)|d)&a)^b)&(c^b))^(((d^e)|a)&((d^b)|c)))) # 13 ops diff --git a/tools/mf_nonce_brute/mf_nonce_brute.c b/tools/mf_nonce_brute/mf_nonce_brute.c index 8e769b5b5..93a3025ea 100644 --- a/tools/mf_nonce_brute/mf_nonce_brute.c +++ b/tools/mf_nonce_brute/mf_nonce_brute.c @@ -1,9 +1,9 @@ #define __STDC_FORMAT_MACROS #if !defined(_WIN64) - #if defined(_WIN32) || defined(__WIN32__) - # define _USE_32BIT_TIME_T 1 - #endif +#if defined(_WIN32) || defined(__WIN32__) +# define _USE_32BIT_TIME_T 1 +#endif #endif #include <inttypes.h> From e0371987ace55e03d8fe87557353f366a3bcd85d Mon Sep 17 00:00:00 2001 From: Iceman <iceman@iuse.se> Date: Mon, 8 Jun 2020 09:11:13 +0200 Subject: [PATCH 549/632] Update CMakeLists.txt We swapped from zlib to bz2 --- client/android/CMakeLists.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/client/android/CMakeLists.txt b/client/android/CMakeLists.txt index ddaae2cd2..2bddd4662 100644 --- a/client/android/CMakeLists.txt +++ b/client/android/CMakeLists.txt @@ -165,11 +165,11 @@ find_library(pm3rrg_rdv4_tinycbor REQUIRED) find_library(pm3rrg_rdv4_lua REQUIRED) find_library(pm3rrg_rdv4_mbedtls REQUIRED) find_library(pm3rrg_rdv4_reveng REQUIRED) -find_library(pm3rrg_rdv4_z REQUIRED) find_library(pm3rrg_rdv4_hardnested REQUIRED) find_library(pm3rrg_rdv4_whereami REQUIRED) target_link_libraries( + bz2 pm3rrg_rdv4 pm3rrg_rdv4_hardnested pm3rrg_rdv4_mbedtls @@ -180,6 +180,5 @@ target_link_libraries( pm3rrg_rdv4_amiibo pm3rrg_rdv4_reveng pm3rrg_rdv4_whereami - pm3rrg_rdv4_z android log) From 8f8d42652b2465c3e9e17529e97b8c2c4b33868a Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Mon, 8 Jun 2020 09:23:08 +0200 Subject: [PATCH 550/632] remove dependency --- client/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 336cac4c1..94a8415f9 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -283,7 +283,6 @@ find_library(pm3rrg_rdv4_tinycbor REQUIRED) find_library(pm3rrg_rdv4_lua REQUIRED) find_library(pm3rrg_rdv4_mbedtls REQUIRED) find_library(pm3rrg_rdv4_reveng REQUIRED) -find_library(pm3rrg_rdv4_z REQUIRED) find_library(pm3rrg_rdv4_hardnested REQUIRED) find_library(pm3rrg_rdv4_whereami REQUIRED) From 990d33e109c35bd69fb5d0e32dac9b9e65b3e30b Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Mon, 8 Jun 2020 10:21:17 +0200 Subject: [PATCH 551/632] fix: appveyor checks for bz2 --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 777dcb86d..a97a65276 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -204,7 +204,7 @@ build_script: } - if(!(Test-Path C:\ProxSpace\pm3\client\resources\hardnested_tables\*.bin.z)){ + if(!(Test-Path C:\ProxSpace\pm3\client\resources\hardnested_tables\*.bin.bz2)){ throw "Files in client\resources\hardnested_tables is not exists." @@ -371,7 +371,7 @@ test_script: ExecTest "arm recovery image exists" "proxmark3_recovery.bin" {Test-Path C:\ProxSpace\pm3\Release\share\proxmark3\firmware\proxmark3_recovery.bin} - ExecTest "hardnested tables exists" "hardnested" {Test-Path C:\ProxSpace\pm3\Release\share\proxmark3\resources\hardnested_tables\*.z} + ExecTest "hardnested tables exists" "hardnested" {Test-Path C:\ProxSpace\pm3\Release\share\proxmark3\resources\hardnested_tables\*.bz2} ExecTest "release exists" "release.zip" {Test-Path C:\ProxSpace\release.zip} From e756b9c908c8339cf0fb67903bb235eb72377c23 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Mon, 8 Jun 2020 10:38:32 +0200 Subject: [PATCH 552/632] chg: swap from xenial to bionic as build --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c8d6c8dfd..fbf7e1df3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ os: - linux - osx -dist: xenial +dist: bionic osx_image: xcode11 From 90775638b1f2b6d29d14c484c056ab74157a7ebd Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Mon, 8 Jun 2020 11:07:45 +0200 Subject: [PATCH 553/632] Revert "fix: osx doesn't like target directive" This reverts commit 690db96a7d732e3eaf4c8b9ecab87f31a95e6a9e. --- include/common.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/include/common.h b/include/common.h index cb0962b56..3c6245e52 100644 --- a/include/common.h +++ b/include/common.h @@ -72,12 +72,8 @@ extern int DBGLEVEL; #endif -#if defined(__APPLE__) -#define RAMFUNC __attribute((long_call, section(".ramfunc"))) -#else +//#define RAMFUNC __attribute((long_call, section(".ramfunc"))) #define RAMFUNC __attribute((long_call, section(".ramfunc"))) __attribute__((target("arm"))) -#endif - #ifndef ROTR # define ROTR(x,n) (((uintmax_t)(x) >> (n)) | ((uintmax_t)(x) << ((sizeof(x) * 8) - (n)))) From 7f17b9243cb9fc80714664dcc20a9d6c2bf951d2 Mon Sep 17 00:00:00 2001 From: Iceman <iceman@iuse.se> Date: Mon, 8 Jun 2020 11:17:33 +0200 Subject: [PATCH 554/632] Update Troubleshooting.md --- .../Troubleshooting.md | 40 ++++++++++++++++++- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/doc/md/Installation_Instructions/Troubleshooting.md b/doc/md/Installation_Instructions/Troubleshooting.md index c81d3bea7..dac35cd74 100644 --- a/doc/md/Installation_Instructions/Troubleshooting.md +++ b/doc/md/Installation_Instructions/Troubleshooting.md @@ -18,9 +18,10 @@ Always use the latest repository commits from *master* branch. There are always * [File not found](#file-not-found) * [Pixmap / pixbuf warnings](#pixmap--pixbuf-warnings) * [Usb cable](#usb-cable) - * [WSL 2 explorer.exe . doesnt work](#WSL-2) + * [WSL explorer.exe . doesnt work](#WSL) * [Troubles with running the Proxmark3 client](#troubles-with-running-the-proxmark3-client) * [libQt5Core.so.5 not found](#libQt5Coreso5-not-found) + * [Target attribute is not supported on this machine](#target-attribute-is-not-supported-on-this-machine) ## `pm3` or `pm3-flash*` doesn't see my Proxmark @@ -168,7 +169,7 @@ It's needed to have a good USB cable to connect Proxmark3 to USB. If you have st - check your cable with a USB tester (or try to change it). It needs to have a resistance smaller or equal to 0.3 Ohm. -## WSL 2 +## WSL When ```explorer.exe .``` doesn't work. Trying to access the dump files created in WSL, you will need to run ```explorer.exe .``` but sometimes this doesn't work. [As seen here](https://github.com/microsoft/WSL/issues/4027) they suggest checking the following registry value for *P9NP* @@ -187,3 +188,38 @@ The following steps is needed to make the development environment happy again. sudo apt reinstall qtbase5-dev sudo strip --remove-section=.note.ABI-tag /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 ``` + +## target attribute is not supported on this machine +If you get the message ```error: target attribute is not supported on this machine [-Werror=attributes]``` +when trying to compile, its because you have an older arm-none-eabi tool chain. + +On OSX/Homebrew, the solution is to reinstall the brew. It will trigger a new download of a later tool chain. +``` +brew remove proxmark3 +brew reinstall proxmark3 +``` + +On Ubuntu 16.04 (xenial) you should either conside a later release or you can install a later toolchain. + + +sample error output: +``` +[*] MAKE armsrc/all +compiler version: arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors) 5.4.1 20160919 (release) [ARM/embedded-5-branch revision 240496] + +[-] CC start.c +In file included from start.c:18:0: +BigBuf.h:41:1: error: target attribute is not supported on this machine [-Werror=attributes] + bool RAMFUNC LogTrace(const uint8_t *btBytes, uint16_t iLen, uint32_t timestamp_start, uint32_t timestamp_end, uint8_t *parity, bool readerToTag); + ^ +cc1: all warnings being treated as errors +In file included from iso15693.c:72:0: +ticks.h:25:1: error: target attribute is not supported on this machine [-Werror=attributes] + uint32_t RAMFUNC GetTickCount(void); + ^ +ticks.h:26:1: error: target attribute is not supported on this machine [-Werror=attributes] + uint32_t RAMFUNC GetTickCountDelta(uint32_t start_ticks); + ^ +``` + + From 689474997816a359feccb7c426dcc5711178182d Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Mon, 8 Jun 2020 12:43:25 +0200 Subject: [PATCH 555/632] Android: Fix bug introduced in e0371987ace55e03d8fe87557353f366a3bcd85d --- client/android/CMakeLists.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/client/android/CMakeLists.txt b/client/android/CMakeLists.txt index 2bddd4662..11da2f5e4 100644 --- a/client/android/CMakeLists.txt +++ b/client/android/CMakeLists.txt @@ -168,9 +168,8 @@ find_library(pm3rrg_rdv4_reveng REQUIRED) find_library(pm3rrg_rdv4_hardnested REQUIRED) find_library(pm3rrg_rdv4_whereami REQUIRED) -target_link_libraries( +target_link_libraries(pm3rrg_rdv4 bz2 - pm3rrg_rdv4 pm3rrg_rdv4_hardnested pm3rrg_rdv4_mbedtls pm3rrg_rdv4_cliparser From 618a945e55714600aaf62ccf2c62ccd89bd9b8ca Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Mon, 8 Jun 2020 13:19:01 +0200 Subject: [PATCH 556/632] fix missing semi --- client/android/pm3_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/android/pm3_main.c b/client/android/pm3_main.c index f5f8cc7d7..af45725cd 100644 --- a/client/android/pm3_main.c +++ b/client/android/pm3_main.c @@ -51,7 +51,7 @@ const char *get_executable_directory(void) { if (g_android_executable_directory == NULL) { char buf[FILE_PATH_SIZE] = {0}; getcwd(buf, sizeof(buf)); - strncat(buf, PATHSEP, 1) + strncat(buf, PATHSEP, 1); g_android_executable_directory = strdup(buf); } return g_android_executable_directory; From 86c649f9555d03bf66e76d7ceb994fbaeec0cba0 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Mon, 8 Jun 2020 18:43:34 +0200 Subject: [PATCH 557/632] chg: "lf viking demod" - prepping for lib --- client/src/cmdlf.c | 1 + client/src/cmdlfviking.c | 19 +++++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/client/src/cmdlf.c b/client/src/cmdlf.c index 1e91b490f..9403dc208 100644 --- a/client/src/cmdlf.c +++ b/client/src/cmdlf.c @@ -1344,6 +1344,7 @@ out: // identify chipset if (CheckChipType(isOnline) == false) { PrintAndLogEx(DEBUG, "Automatic chip type detection " _RED_("failed")); + retval = false; } return retval; } diff --git a/client/src/cmdlfviking.c b/client/src/cmdlfviking.c index 153c1d54d..5dd29a95f 100644 --- a/client/src/cmdlfviking.c +++ b/client/src/cmdlfviking.c @@ -1,4 +1,5 @@ //----------------------------------------------------------------------------- +// Marshmellow, // // This code is licensed to you under the terms of the GNU GPL, version 2 or, // at your option, any later version. See the LICENSE.txt file for the text of @@ -51,19 +52,25 @@ static int usage_lf_viking_sim(void) { return PM3_SUCCESS; } -//by marshmellow -//see ASKDemod for what args are accepted static int CmdVikingDemod(const char *Cmd) { - if (ASKDemod(Cmd, false, false, 1) != PM3_SUCCESS) { + return demodViking(); +} + +//see ASKDemod for what args are accepted +int demodViking(void) { + + if (ASKDemod("", false, false, 1) != PM3_SUCCESS) { PrintAndLogEx(DEBUG, "DEBUG: Error - Viking ASKDemod failed"); return PM3_ESOFT; } - size_t size = DemodBufferLen; + + size_t size = DemodBufferLen; int ans = detectViking(DemodBuffer, &size); if (ans < 0) { PrintAndLogEx(DEBUG, "DEBUG: Error - Viking Demod %d %s", ans, (ans == -5) ? _RED_("[chksum error]") : ""); return PM3_ESOFT; } + //got a good demod uint32_t raw1 = bytebits_to_byte(DemodBuffer + ans, 32); uint32_t raw2 = bytebits_to_byte(DemodBuffer + ans + 32, 32); @@ -76,7 +83,6 @@ static int CmdVikingDemod(const char *Cmd) { return PM3_SUCCESS; } -//by marshmellow //see ASKDemod for what args are accepted static int CmdVikingRead(const char *Cmd) { lf_read(false, 10000); @@ -211,7 +217,4 @@ int detectViking(uint8_t *src, size_t *size) { return (int)startIdx; } -int demodViking(void) { - return CmdVikingDemod(""); -} From 526407ed5c219e263b4bdd31bea53f072109ee19 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Mon, 8 Jun 2020 19:06:26 +0200 Subject: [PATCH 558/632] Fix deps/liblua Android cross-compilation --- client/deps/lua.cmake | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/client/deps/lua.cmake b/client/deps/lua.cmake index 679147124..5ccf22c33 100644 --- a/client/deps/lua.cmake +++ b/client/deps/lua.cmake @@ -38,6 +38,11 @@ target_compile_definitions(pm3rrg_rdv4_lua PRIVATE LUA_COMPAT_ALL) if (NOT MINGW) if (APPLE) target_compile_definitions(pm3rrg_rdv4_lua PRIVATE LUA_USE_MACOSX) + elseif (ANDROID) + # Required: + target_compile_definitions(pm3rrg_rdv4_lua PRIVATE LUA_USE_MKSTEMP) + # Same as for LUA_USE_LINUX except LUA_USE_POSIX and client-specific LUA_USE_READLINE and LUA_USE_ISATTY + target_compile_definitions(pm3rrg_rdv4_lua PRIVATE LUA_USE_DLOPEN LUA_USE_STRTODHEX LUA_USE_AFORMAT LUA_USE_LONGLONG LUA_USE_POPEN LUA_USE_ULONGJMP LUA_USE_GMTIME_R) else (APPLE) target_compile_definitions(pm3rrg_rdv4_lua PRIVATE LUA_USE_LINUX) target_link_libraries(pm3rrg_rdv4_lua INTERFACE dl) From c76b3061da799f0d50471d6c0931f664876e86e5 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Mon, 8 Jun 2020 20:20:16 +0200 Subject: [PATCH 559/632] Fix more deps/liblua Android cross-compilation --- client/deps/lua.cmake | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/client/deps/lua.cmake b/client/deps/lua.cmake index 5ccf22c33..12870342e 100644 --- a/client/deps/lua.cmake +++ b/client/deps/lua.cmake @@ -40,9 +40,11 @@ if (NOT MINGW) target_compile_definitions(pm3rrg_rdv4_lua PRIVATE LUA_USE_MACOSX) elseif (ANDROID) # Required: - target_compile_definitions(pm3rrg_rdv4_lua PRIVATE LUA_USE_MKSTEMP) - # Same as for LUA_USE_LINUX except LUA_USE_POSIX and client-specific LUA_USE_READLINE and LUA_USE_ISATTY - target_compile_definitions(pm3rrg_rdv4_lua PRIVATE LUA_USE_DLOPEN LUA_USE_STRTODHEX LUA_USE_AFORMAT LUA_USE_LONGLONG LUA_USE_POPEN LUA_USE_ULONGJMP LUA_USE_GMTIME_R) + add_definitions(-D"getlocaledecpoint\(\)='.'") + # Same as for LUA_USE_LINUX except LUA_USE_POSIX and client-specific LUA_USE_READLINE + target_compile_definitions(pm3rrg_rdv4_lua PRIVATE LUA_USE_DLOPEN LUA_USE_STRTODHEX LUA_USE_AFORMAT LUA_USE_LONGLONG) + # Same as for LUA_USE_POSIX except client-specific LUA_USE_ISATTY. LUA_USE_MKSTEMP is needed. + target_compile_definitions(pm3rrg_rdv4_lua PRIVATE LUA_USE_MKSTEMP LUA_USE_POPEN LUA_USE_ULONGJMP LUA_USE_GMTIME_R) else (APPLE) target_compile_definitions(pm3rrg_rdv4_lua PRIVATE LUA_USE_LINUX) target_link_libraries(pm3rrg_rdv4_lua INTERFACE dl) From 45b5bbed7be5c206ea31269c9f5b7a970b031e79 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Tue, 9 Jun 2020 00:16:42 +0200 Subject: [PATCH 560/632] Add SKIPBT support to cmake --- client/CMakeLists.txt | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 94a8415f9..5ccf73d19 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -38,7 +38,9 @@ foreach(_qt_package IN LISTS QT_PACKAGELIST) endforeach() find_package(PkgConfig) -pkg_search_module(BLUEZ QUIET bluez) +if (NOT SKIPBT EQUAL 1) + pkg_search_module(BLUEZ QUIET bluez) +endif() pkg_search_module(PYTHON3 QUIET python3) pkg_search_module(PYTHON3EMBED QUIET python3-embed) @@ -220,11 +222,12 @@ else (Qt5_FOUND) ${TARGET_SOURCES}) endif (Qt5_FOUND) -if (BLUEZ_FOUND) - message("Bluez library found, building native Bluetooth support :)") - add_definitions("-DHAVE_BLUEZ") - set(ADDITIONAL_LNK ${BLUEZ_LIBRARIES} ${ADDITIONAL_LNK}) -endif (BLUEZ_FOUND) +if (NOT SKIPBT EQUAL 1) + if (BLUEZ_FOUND) + add_definitions("-DHAVE_BLUEZ") + set(ADDITIONAL_LNK ${BLUEZ_LIBRARIES} ${ADDITIONAL_LNK}) + endif (BLUEZ_FOUND) +endif(NOT SKIPBT EQUAL 1) if (PYTHON3EMBED_FOUND) message("Python3-embed library found, building with python3 support :)") @@ -240,6 +243,18 @@ elseif (PYTHON3_FOUND) set(ADDITIONAL_LNKDIRS ${PYTHON3_LIBRARY_DIRS} ${ADDITIONAL_LNKDIRS}) endif (PYTHON3EMBED_FOUND) +message(" ===================================================================)") +if (SKIPBT EQUAL 1) + message("native BT support: skipped") +else (SKIPBT EQUAL 1) + if (BLUEZ_FOUND) + message("native BT support: Bluez found, enabled") + else (BLUEZ_FOUND) + message("native BT support: Bluez not found, disabled") + endif (BLUEZ_FOUND) +endif(SKIPBT EQUAL 1) +message(" ===================================================================)") + add_executable(proxmark3 ${PM3_ROOT}/client/src/proxmark3.c ${TARGET_SOURCES} From 6358c07ec1a2393def55e7ecca4d8829e48a5cef Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Tue, 9 Jun 2020 00:34:41 +0200 Subject: [PATCH 561/632] Add SKIPQT support to cmake --- client/CMakeLists.txt | 70 ++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 30 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 5ccf73d19..d85cfaf00 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -13,29 +13,31 @@ if(CMAKE_VERSION VERSION_LESS "3.7.0") set(CMAKE_INCLUDE_CURRENT_DIR ON) endif() -if(APPLE AND EXISTS /usr/local/opt/qt5) - # Homebrew installs Qt5 (up to at least 5.11.0) in - # /usr/local/qt5. Ensure that it can be found by CMake - # since it is not in the default /usr/local prefix. - # Add it to PATHS so that it doesn't override the - # CMAKE_PREFIX_PATH environment variable. - # QT_FIND_PACKAGE_OPTIONS should be passed to find_package, - # e.g. find_package(Qt5Core ${QT_FIND_PACKAGE_OPTIONS}) - list(APPEND QT_FIND_PACKAGE_OPTIONS PATHS /usr/local/opt/qt5) -endif() -set(QT_PACKAGELIST - Qt5Core - Qt5Widgets - Qt5Gui -) -set(Qt5_FOUND ON) -foreach(_qt_package IN LISTS QT_PACKAGELIST) - find_package(${_qt_package} QUIET ${QT_FIND_PACKAGE_OPTIONS}) - set(Qt5_LIBRARIES ${${_qt_package}_LIBRARIES} ${Qt5_LIBRARIES}) - if(NOT ${_qt_package}_FOUND) - set(Qt5_FOUND OFF) - endif(NOT ${_qt_package}_FOUND) -endforeach() +if (NOT SKIPQT EQUAL 1) + if(APPLE AND EXISTS /usr/local/opt/qt5) + # Homebrew installs Qt5 (up to at least 5.11.0) in + # /usr/local/qt5. Ensure that it can be found by CMake + # since it is not in the default /usr/local prefix. + # Add it to PATHS so that it doesn't override the + # CMAKE_PREFIX_PATH environment variable. + # QT_FIND_PACKAGE_OPTIONS should be passed to find_package, + # e.g. find_package(Qt5Core ${QT_FIND_PACKAGE_OPTIONS}) + list(APPEND QT_FIND_PACKAGE_OPTIONS PATHS /usr/local/opt/qt5) + endif(APPLE AND EXISTS /usr/local/opt/qt5) + set(QT_PACKAGELIST + Qt5Core + Qt5Widgets + Qt5Gui + ) + set(Qt5_FOUND ON) + foreach(_qt_package IN LISTS QT_PACKAGELIST) + find_package(${_qt_package} QUIET ${QT_FIND_PACKAGE_OPTIONS}) + set(Qt5_LIBRARIES ${${_qt_package}_LIBRARIES} ${Qt5_LIBRARIES}) + if(NOT ${_qt_package}_FOUND) + set(Qt5_FOUND OFF) + endif(NOT ${_qt_package}_FOUND) + endforeach() +endif (NOT SKIPQT EQUAL 1) find_package(PkgConfig) if (NOT SKIPBT EQUAL 1) @@ -203,8 +205,7 @@ if (APPLE) set(ADDITIONAL_LNK "-framework Foundation" "-framework AppKit") endif (APPLE) -if (Qt5_FOUND) - message("Qt5 library found, building gui :)") +if ((NOT SKIPQT EQUAL 1) AND (Qt5_FOUND)) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) @@ -215,12 +216,11 @@ if (Qt5_FOUND) add_definitions("-DHAVE_GUI") set(ADDITIONAL_LNK ${Qt5_LIBRARIES} ${ADDITIONAL_LNK}) -else (Qt5_FOUND) - message("Qt5 library not found, not building gui") +else ((NOT SKIPQT EQUAL 1) AND (Qt5_FOUND)) set(TARGET_SOURCES ${PM3_ROOT}/client/src/guidummy.cpp ${TARGET_SOURCES}) -endif (Qt5_FOUND) +endif ((NOT SKIPQT EQUAL 1) AND (Qt5_FOUND)) if (NOT SKIPBT EQUAL 1) if (BLUEZ_FOUND) @@ -243,7 +243,17 @@ elseif (PYTHON3_FOUND) set(ADDITIONAL_LNKDIRS ${PYTHON3_LIBRARY_DIRS} ${ADDITIONAL_LNKDIRS}) endif (PYTHON3EMBED_FOUND) -message(" ===================================================================)") +message("===================================================================") +if (SKIPQT EQUAL 1) + message("GUI support: skipped") +else (SKIPQT EQUAL 1) + if (Qt5_FOUND) + message("GUI support: QT5 found, enabled") + else (Qt5_FOUND) + message("GUI support: QT5 not found, disabled") + endif (Qt5_FOUND) +endif (SKIPQT EQUAL 1) + if (SKIPBT EQUAL 1) message("native BT support: skipped") else (SKIPBT EQUAL 1) @@ -253,7 +263,7 @@ else (SKIPBT EQUAL 1) message("native BT support: Bluez not found, disabled") endif (BLUEZ_FOUND) endif(SKIPBT EQUAL 1) -message(" ===================================================================)") +message("===================================================================") add_executable(proxmark3 ${PM3_ROOT}/client/src/proxmark3.c From 66505988a2662a154d1a60f77b73acf322c91b8d Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Tue, 9 Jun 2020 00:39:35 +0200 Subject: [PATCH 562/632] Add SKIPPTHREAD support to cmake --- client/CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index d85cfaf00..c24ef34d5 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -314,7 +314,6 @@ find_library(pm3rrg_rdv4_whereami REQUIRED) target_link_libraries(proxmark3 PRIVATE bz2 readline - pthread m pm3rrg_rdv4_mbedtls pm3rrg_rdv4_cliparser @@ -327,6 +326,10 @@ target_link_libraries(proxmark3 PRIVATE pm3rrg_rdv4_whereami ${ADDITIONAL_LNK}) +if (NOT SKIPPTHREAD EQUAL 1) + target_link_libraries(proxmark3 PRIVATE pthread) +endif (NOT SKIPPTHREAD EQUAL 1) + # OSX have a hard time compiling python3 dependency with older cmake. if (PYTHON3EMBED_FOUND OR PYTHON3_FOUND) if (NOT CMAKE_VERSION VERSION_LESS 3.13) From de100fc8e77647b1ee870375b0cdf56e14ee5b51 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Tue, 9 Jun 2020 00:47:34 +0200 Subject: [PATCH 563/632] Add SKIPPYTHON support to cmake --- client/CMakeLists.txt | 65 +++++++++++++++++++++++++++---------------- 1 file changed, 41 insertions(+), 24 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index c24ef34d5..449b4fdbe 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -42,9 +42,12 @@ endif (NOT SKIPQT EQUAL 1) find_package(PkgConfig) if (NOT SKIPBT EQUAL 1) pkg_search_module(BLUEZ QUIET bluez) -endif() -pkg_search_module(PYTHON3 QUIET python3) -pkg_search_module(PYTHON3EMBED QUIET python3-embed) +endif (NOT SKIPBT EQUAL 1) + +if (NOT SKIPPYTHON EQUAL 1) + pkg_search_module(PYTHON3 QUIET python3) + pkg_search_module(PYTHON3EMBED QUIET python3-embed) +endif (NOT SKIPPYTHON EQUAL 1) add_subdirectory(${PM3_ROOT}/client/deps deps) @@ -229,19 +232,19 @@ if (NOT SKIPBT EQUAL 1) endif (BLUEZ_FOUND) endif(NOT SKIPBT EQUAL 1) -if (PYTHON3EMBED_FOUND) - message("Python3-embed library found, building with python3 support :)") - add_definitions(-DHAVE_PYTHON) - set(ADDITIONAL_DIRS ${PYTHON3EMBED_INCLUDE_DIRS} ${ADDITIONAL_DIRS}) - set(ADDITIONAL_LNK ${PYTHON3EMBED_LIBRARIES} ${ADDITIONAL_LNK}) - set(ADDITIONAL_LNKDIRS ${PYTHON3EMBED_LIBRARY_DIRS} ${ADDITIONAL_LNKDIRS}) -elseif (PYTHON3_FOUND) - message("Python3 library found, building with python3 support :)") - add_definitions(-DHAVE_PYTHON) - set(ADDITIONAL_DIRS ${PYTHON3_INCLUDE_DIRS} ${ADDITIONAL_DIRS}) - set(ADDITIONAL_LNK ${PYTHON3_LIBRARIES} ${ADDITIONAL_LNK}) - set(ADDITIONAL_LNKDIRS ${PYTHON3_LIBRARY_DIRS} ${ADDITIONAL_LNKDIRS}) -endif (PYTHON3EMBED_FOUND) +if (NOT SKIPPYTHON EQUAL 1) + if (PYTHON3EMBED_FOUND) + add_definitions(-DHAVE_PYTHON) + set(ADDITIONAL_DIRS ${PYTHON3EMBED_INCLUDE_DIRS} ${ADDITIONAL_DIRS}) + set(ADDITIONAL_LNK ${PYTHON3EMBED_LIBRARIES} ${ADDITIONAL_LNK}) + set(ADDITIONAL_LNKDIRS ${PYTHON3EMBED_LIBRARY_DIRS} ${ADDITIONAL_LNKDIRS}) + elseif (PYTHON3_FOUND) + add_definitions(-DHAVE_PYTHON) + set(ADDITIONAL_DIRS ${PYTHON3_INCLUDE_DIRS} ${ADDITIONAL_DIRS}) + set(ADDITIONAL_LNK ${PYTHON3_LIBRARIES} ${ADDITIONAL_LNK}) + set(ADDITIONAL_LNKDIRS ${PYTHON3_LIBRARY_DIRS} ${ADDITIONAL_LNKDIRS}) + endif (PYTHON3EMBED_FOUND) +endif (NOT SKIPPYTHON EQUAL 1) message("===================================================================") if (SKIPQT EQUAL 1) @@ -263,6 +266,18 @@ else (SKIPBT EQUAL 1) message("native BT support: Bluez not found, disabled") endif (BLUEZ_FOUND) endif(SKIPBT EQUAL 1) + +if (SKIPPYTHON EQUAL 1) + message("Python3 library: skipped") +else (SKIPPYTHON EQUAL 1) + if (PYTHON3EMBED_FOUND) + message("Python3 library: Python3 embed found, enabled") + elseif (PYTHON_FOUND) + message("Python3 library: Python3 found, enabled") + else (PYTHON3EMBED_FOUND) + message("Python3 library: Python3 not found, disabled") + endif (PYTHON3EMBED_FOUND) +endif(SKIPPYTHON EQUAL 1) message("===================================================================") add_executable(proxmark3 @@ -330,14 +345,16 @@ if (NOT SKIPPTHREAD EQUAL 1) target_link_libraries(proxmark3 PRIVATE pthread) endif (NOT SKIPPTHREAD EQUAL 1) -# OSX have a hard time compiling python3 dependency with older cmake. -if (PYTHON3EMBED_FOUND OR PYTHON3_FOUND) - if (NOT CMAKE_VERSION VERSION_LESS 3.13) - target_link_directories(proxmark3 PRIVATE ${ADDITIONAL_LNKDIRS}) - elseif (APPLE) - message( SEND_ERROR "Your CMAKE version is too old for Apple platform, please update to a version >=3.13" ) - endif (NOT CMAKE_VERSION VERSION_LESS 3.13) -endif (PYTHON3EMBED_FOUND OR PYTHON3_FOUND) +if (NOT SKIPPYTHON EQUAL 1) + # OSX have a hard time compiling python3 dependency with older cmake. + if (PYTHON3EMBED_FOUND OR PYTHON3_FOUND) + if (NOT CMAKE_VERSION VERSION_LESS 3.13) + target_link_directories(proxmark3 PRIVATE ${ADDITIONAL_LNKDIRS}) + elseif (APPLE) + message( SEND_ERROR "Your CMAKE version is too old for Apple platform, please update to a version >=3.13" ) + endif (NOT CMAKE_VERSION VERSION_LESS 3.13) + endif (PYTHON3EMBED_FOUND OR PYTHON3_FOUND) +endif (NOT SKIPPYTHON EQUAL 1) install(TARGETS proxmark3 DESTINATION "bin") install(DIRECTORY cmdscripts lualibs luascripts pyscripts resources dictionaries DESTINATION "share/proxmark3") From eb35636f49b4f4f9d78f57c13bf3b29e0405c3dd Mon Sep 17 00:00:00 2001 From: Lukas Kuzmiak <lukash@backstep.net> Date: Mon, 8 Jun 2020 17:26:03 -0700 Subject: [PATCH 564/632] remove duplicated key (first occurrence kept) --- client/dictionaries/mfc_default_keys.dic | 4 ---- 1 file changed, 4 deletions(-) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 6e2a2f4da..26f1f938e 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -741,7 +741,6 @@ D3A297DC2698 9EA3387A63C1 A3FAA6DAFF67 A7141147D430 -AAFB06045877 ACFFFFFFFFFF AFCEF64C9913 B27ADDFB64B0 @@ -763,7 +762,6 @@ FD8705E721B0 00ada2cd516d # # -D3F7D3F7D3F7 ## 237a4d0d9119 0ed7846c2bc9 @@ -1068,7 +1066,6 @@ a2a3cca2a3cc 385efa542907 3864fcba5937 3f3865fccb69 -5c8ff9990da2 6291b3860fc8 63fca9492f38 863fcb959373 @@ -1114,7 +1111,6 @@ fe04ecfe5577 5a7a52d5e20d # Bosch Solution 6000 # # Found in TagInfo app -8A19D40CF2B5 # Hotel key card key C1E51C63B8F5 # RATB key 1DB710648A65 18F34C92A56E # E-GO card key From e3d16649b87f93876dbe65f49cdc96f9ffa8bb79 Mon Sep 17 00:00:00 2001 From: Lukas Kuzmiak <lukash@backstep.net> Date: Mon, 8 Jun 2020 21:19:36 -0700 Subject: [PATCH 565/632] MAD application code & cluster code were swapped --- client/src/mifare/mad.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/mifare/mad.c b/client/src/mifare/mad.c index ffacba3a7..0761317fe 100644 --- a/client/src/mifare/mad.c +++ b/client/src/mifare/mad.c @@ -129,9 +129,9 @@ static int madCRCCheck(uint8_t *sector, bool verbose, int MADver) { static uint16_t madGetAID(uint8_t *sector, int MADver, int sectorNo) { if (MADver == 1) - return (sector[16 + 2 + (sectorNo - 1) * 2] << 8) + (sector[16 + 2 + (sectorNo - 1) * 2 + 1]); + return (sector[16 + 2 + (sectorNo - 1) * 2 + 1] << 8) + (sector[16 + 2 + (sectorNo - 1) * 2]); else - return (sector[2 + (sectorNo - 1) * 2] << 8) + (sector[2 + (sectorNo - 1) * 2 + 1]); + return (sector[2 + (sectorNo - 1) * 2 + 1] << 8) + (sector[2 + (sectorNo - 1) * 2]); } int MADCheck(uint8_t *sector0, uint8_t *sector10, bool verbose, bool *haveMAD2) { From a0cbaee1385b127226303159fbae8610ed933591 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 9 Jun 2020 08:51:12 +0200 Subject: [PATCH 566/632] chg: mad makeover --- client/src/cmdhfmf.c | 33 +++++++------- client/src/cmdhfmfp.c | 38 ++++++++-------- client/src/mifare/mad.c | 96 +++++++++++++++++++++++------------------ 3 files changed, 89 insertions(+), 78 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 983055924..b3ccbbe3b 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -4496,7 +4496,7 @@ static int CmdHF14AMfMAD(const char *Cmd) { void *argtable[] = { arg_param_begin, arg_lit0("vV", "verbose", "show technical data"), - arg_str0("aA", "aid", "print all sectors with aid", NULL), + arg_str0("aA", "aid", "print all sectors with specified aid", NULL), arg_str0("kK", "key", "key for printing sectors", NULL), arg_lit0("bB", "keyb", "use key B for access printing sectors (by default: key A)"), arg_param_end @@ -4543,7 +4543,7 @@ static int CmdHF14AMfMAD(const char *Cmd) { if (aidlen == 2) { uint16_t aaid = (aid[0] << 8) + aid[1]; - PrintAndLogEx(NORMAL, "\n-------------- AID 0x%04x ---------------", aaid); + PrintAndLogEx(INFO, "-------------- " _CYAN_("AID 0x%04x") " ---------------", aaid); uint16_t mad[7 + 8 + 8 + 8 + 8] = {0}; size_t madlen = 0; @@ -4621,58 +4621,57 @@ static int CmdHFMFNDEF(const char *Cmd) { uint8_t data[4096] = {0}; int datalen = 0; - PrintAndLogEx(NORMAL, ""); - if (mfReadSector(MF_MAD1_SECTOR, MF_KEY_A, (uint8_t *)g_mifare_mad_key, sector0)) { - PrintAndLogEx(ERR, "read sector 0 error. card don't have MAD or don't have MAD on default keys."); + PrintAndLogEx(ERR, "error, read sector 0. card don't have MAD or don't have MAD on default keys"); return PM3_ESOFT; } bool haveMAD2 = false; int res = MADCheck(sector0, NULL, verbose, &haveMAD2); - if (res) { - PrintAndLogEx(ERR, "MAD error %d.", res); + if (res != PM3_SUCCESS) { + PrintAndLogEx(ERR, "MAD error %d", res); return res; } if (haveMAD2) { if (mfReadSector(MF_MAD2_SECTOR, MF_KEY_A, (uint8_t *)g_mifare_mad_key, sector10)) { - PrintAndLogEx(ERR, "read sector 0x10 error. card don't have MAD or don't have MAD on default keys."); + PrintAndLogEx(ERR, "error, read sector 0x10. card don't have MAD or don't have MAD on default keys"); return PM3_ESOFT; } } uint16_t mad[7 + 8 + 8 + 8 + 8] = {0}; size_t madlen = 0; - if (MADDecode(sector0, (haveMAD2 ? sector10 : NULL), mad, &madlen)) { - PrintAndLogEx(ERR, "can't decode mad."); - return PM3_ESOFT; + res = MADDecode(sector0, (haveMAD2 ? sector10 : NULL), mad, &madlen); + if (res != PM3_SUCCESS) { + PrintAndLogEx(ERR, "can't decode MAD"); + return res; } - printf("data reading:"); + PrintAndLogEx(INFO, "data reading:"); for (int i = 0; i < madlen; i++) { if (ndefAID == mad[i]) { uint8_t vsector[16 * 4] = {0}; if (mfReadSector(i + 1, keyB ? MF_KEY_B : MF_KEY_A, ndefkey, vsector)) { - PrintAndLogEx(ERR, "read sector %d error.", i + 1); + PrintAndLogEx(ERR, "error, reading sector %d ", i + 1); return PM3_ESOFT; } memcpy(&data[datalen], vsector, 16 * 3); datalen += 16 * 3; - printf("."); + PrintAndLogEx(INPLACE, "."); } } - printf(" OK\n"); + PrintAndLogEx(NORMAL, ""); if (!datalen) { - PrintAndLogEx(ERR, "no NDEF data."); + PrintAndLogEx(WARNING, "no NDEF data"); return PM3_SUCCESS; } if (verbose2) { - PrintAndLogEx(NORMAL, "NDEF data:"); + PrintAndLogEx(SUCCESS, "NDEF data:"); dump_buffer(data, datalen, stdout, 1); } diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index f39ba5c2e..36e847fa1 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -1423,63 +1423,61 @@ static int CmdHFMFPNDEF(const char *Cmd) { uint8_t data[4096] = {0}; int datalen = 0; - PrintAndLogEx(NORMAL, ""); - if (mfpReadSector(MF_MAD1_SECTOR, MF_KEY_A, (uint8_t *)g_mifarep_mad_key, sector0, verbose)) { - PrintAndLogEx(ERR, "read sector 0 error. card don't have MAD or don't have MAD on default keys."); - return 2; + PrintAndLogEx(ERR, "error, read sector 0. card don't have MAD or don't have MAD on default keys"); + return PM3_ESOFT; } bool haveMAD2 = false; int res = MADCheck(sector0, NULL, verbose, &haveMAD2); - if (res) { - PrintAndLogEx(ERR, "MAD error %d.", res); + if (res != PM3_SUCCESS) { + PrintAndLogEx(ERR, "MAD error %d", res); return res; } if (haveMAD2) { if (mfpReadSector(MF_MAD2_SECTOR, MF_KEY_A, (uint8_t *)g_mifarep_mad_key, sector10, verbose)) { - PrintAndLogEx(ERR, "read sector 0x10 error. card don't have MAD or don't have MAD on default keys."); - return 2; + PrintAndLogEx(ERR, "error, read sector 0x10. card don't have MAD or don't have MAD on default keys"); + return PM3_ESOFT; } } uint16_t mad[7 + 8 + 8 + 8 + 8] = {0}; size_t madlen = 0; - if (MADDecode(sector0, (haveMAD2 ? sector10 : NULL), mad, &madlen)) { - PrintAndLogEx(ERR, "can't decode mad."); - return 10; + res = MADDecode(sector0, (haveMAD2 ? sector10 : NULL), mad, &madlen); + if (res != PM3_SUCCESS) { + PrintAndLogEx(ERR, "can't decode MAD"); + return res; } - printf("data reading:"); + PrintAndLogEx(INFO, "data reading:"); for (int i = 0; i < madlen; i++) { if (ndefAID == mad[i]) { uint8_t vsector[16 * 4] = {0}; if (mfpReadSector(i + 1, keyB ? MF_KEY_B : MF_KEY_A, ndefkey, vsector, false)) { - PrintAndLogEx(ERR, "read sector %d error.", i + 1); - return 2; + PrintAndLogEx(ERR, "error, reading sector %d", i + 1); + return PM3_ESOFT; } memcpy(&data[datalen], vsector, 16 * 3); datalen += 16 * 3; - printf("."); + PrintAndLogEx(INPLACE, "."); } } - printf(" OK\n"); + PrintAndLogEx(NORMAL, ""); if (!datalen) { - PrintAndLogEx(ERR, "no NDEF data."); - return 11; + PrintAndLogEx(ERR, "no NDEF data"); + return PM3_SUCCESS; } if (verbose2) { - PrintAndLogEx(NORMAL, "NDEF data:"); + PrintAndLogEx(INFO, "NDEF data:"); dump_buffer(data, datalen, stdout, 1); } NDEFDecodeAndPrint(data, datalen, verbose); - return PM3_SUCCESS; } diff --git a/client/src/mifare/mad.c b/client/src/mifare/mad.c index ffacba3a7..47240b6f2 100644 --- a/client/src/mifare/mad.c +++ b/client/src/mifare/mad.c @@ -11,7 +11,7 @@ #include "mad.h" #include "ui.h" #include "commonutil.h" // ARRAYLEN - +#include "pm3_cmd.h" #include "crc.h" #include "util.h" @@ -110,21 +110,20 @@ static const char *GetAIDDescription(uint16_t AID) { } static int madCRCCheck(uint8_t *sector, bool verbose, int MADver) { - if (MADver == 1) { + if (MADver == 2) { uint8_t crc = CRC8Mad(§or[16 + 1], 15 + 16); if (crc != sector[16]) { - PrintAndLogEx(WARNING, "Wrong MAD%d CRC. Calculated: 0x%02x, from card: 0x%02x", MADver, crc, sector[16]); - return 3; + PrintAndLogEx(WARNING, _RED_("Wrong MAD %d CRC") " calculated: 0x%02x != 0x%02x", MADver, crc, sector[16]); + return PM3_ESOFT; }; } else { uint8_t crc = CRC8Mad(§or[1], 15 + 16 + 16); if (crc != sector[0]) { - PrintAndLogEx(WARNING, "Wrong MAD%d CRC. Calculated: 0x%02x, from card: 0x%02x", MADver, crc, sector[16]); - return 3; + PrintAndLogEx(WARNING, _RED_("Wrong MAD %d CRC") " calculated: 0x%02x != 0x%02x", MADver, crc, sector[16]); + return PM3_ESOFT; }; } - - return 0; + return PM3_SUCCESS; } static uint16_t madGetAID(uint8_t *sector, int MADver, int sectorNo) { @@ -135,54 +134,53 @@ static uint16_t madGetAID(uint8_t *sector, int MADver, int sectorNo) { } int MADCheck(uint8_t *sector0, uint8_t *sector10, bool verbose, bool *haveMAD2) { - int res = 0; - if (!sector0) - return 1; + if (sector0 == NULL) + return PM3_EINVARG; uint8_t GPB = sector0[3 * 16 + 9]; if (verbose) - PrintAndLogEx(NORMAL, "GPB: 0x%02x", GPB); + PrintAndLogEx(INFO, "GPB: 0x%02x", GPB); // DA (MAD available) if (!(GPB & 0x80)) { PrintAndLogEx(ERR, "DA=0! MAD not available."); - return 1; + return PM3_ESOFT; } // MA (multi-application card) if (verbose) { if (GPB & 0x40) - PrintAndLogEx(NORMAL, "Multi application card."); + PrintAndLogEx(INFO, "Multi application card."); else - PrintAndLogEx(NORMAL, "Single application card."); + PrintAndLogEx(INFO, "Single application card."); } uint8_t MADVer = GPB & 0x03; if (verbose) - PrintAndLogEx(NORMAL, "MAD version: %d", MADVer); + PrintAndLogEx(INFO, "MAD version: %d", MADVer); // MAD version if ((MADVer != 0x01) && (MADVer != 0x02)) { PrintAndLogEx(ERR, "Wrong MAD version: 0x%02x", MADVer); - return 2; + return PM3_ESOFT; }; if (haveMAD2) *haveMAD2 = (MADVer == 2); - res = madCRCCheck(sector0, true, 1); + int res = madCRCCheck(sector0, true, 1); - if (verbose && !res) - PrintAndLogEx(NORMAL, "CRC8-MAD1 OK."); + if (verbose && res == PM3_SUCCESS) + PrintAndLogEx(INFO, "CRC8-MAD1 (%s)", _GREEN_("ok")); if (MADVer == 2 && sector10) { int res2 = madCRCCheck(sector10, true, 2); - if (!res) + if (res == PM3_SUCCESS) res = res2; if (verbose && !res2) - PrintAndLogEx(NORMAL, "CRC8-MAD2 OK."); + PrintAndLogEx(INFO, "CRC8-MAD2 (%)", _GREEN_("ok")); } return res; @@ -191,7 +189,11 @@ int MADCheck(uint8_t *sector0, uint8_t *sector10, bool verbose, bool *haveMAD2) int MADDecode(uint8_t *sector0, uint8_t *sector10, uint16_t *mad, size_t *madlen) { *madlen = 0; bool haveMAD2 = false; - MADCheck(sector0, sector10, false, &haveMAD2); + int res = MADCheck(sector0, sector10, false, &haveMAD2); + if (res != PM3_SUCCESS) { + PrintAndLogEx(INFO, "Not a valid MAD"); + return res; + } for (int i = 1; i < 16; i++) { mad[*madlen] = madGetAID(sector0, 1, i); @@ -208,51 +210,63 @@ int MADDecode(uint8_t *sector0, uint8_t *sector10, uint16_t *mad, size_t *madlen (*madlen)++; } } - - return 0; + return PM3_SUCCESS; } - int MAD1DecodeAndPrint(uint8_t *sector, bool verbose, bool *haveMAD2) { // check MAD1 only - MADCheck(sector, NULL, verbose, haveMAD2); + int res = MADCheck(sector, NULL, verbose, haveMAD2); + if (verbose) { + if (res == PM3_SUCCESS) + PrintAndLogEx(INFO, "CRC8-MAD1 (%s)", _GREEN_("ok")); + else + PrintAndLogEx(INFO, "CRC8-MAD1 (%s)", _RED_("fail")); + } // info byte uint8_t InfoByte = sector[16 + 1] & 0x3f; if (InfoByte) { - PrintAndLogEx(NORMAL, "Card publisher sector: 0x%02x", InfoByte); + PrintAndLogEx(INFO, "Card publisher sector: " _GREEN_("0x%02x"), InfoByte); } else { if (verbose) - PrintAndLogEx(NORMAL, "Card publisher sector not present."); + PrintAndLogEx(WARNING, "Card publisher sector not present"); } if (InfoByte == 0x10 || InfoByte >= 0x28) PrintAndLogEx(WARNING, "Info byte error"); - PrintAndLogEx(NORMAL, "00 MAD1"); + PrintAndLogEx(INFO, " 00 MAD 1"); for (int i = 1; i < 16; i++) { uint16_t AID = madGetAID(sector, 1, i); - PrintAndLogEx(NORMAL, "%02d [%04X] %s", i, AID, GetAIDDescription(AID)); - }; + PrintAndLogEx(INFO, " %02d [%04X] %s", i, AID, GetAIDDescription(AID)); + } - return 0; + return PM3_SUCCESS; } int MAD2DecodeAndPrint(uint8_t *sector, bool verbose) { - PrintAndLogEx(NORMAL, "16 MAD2"); + PrintAndLogEx(INFO, " 16 MAD 2"); int res = madCRCCheck(sector, true, 2); - - if (verbose && !res) - PrintAndLogEx(NORMAL, "CRC8-MAD2 OK."); + if (verbose) { + if (res == PM3_SUCCESS) + PrintAndLogEx(INFO, "CRC8-MAD2 (%s)", _GREEN_("ok")); + else + PrintAndLogEx(INFO, "CRC8-MAD2 (%s)", _RED_("fail")); + } uint8_t InfoByte = sector[1] & 0x3f; - PrintAndLogEx(NORMAL, "MAD2 Card publisher sector: 0x%02x", InfoByte); + if (InfoByte) { + PrintAndLogEx(INFO, "MAD2 Card publisher sector: " _GREEN_("0x%02x"), InfoByte); + } else { + if (verbose) + PrintAndLogEx(WARNING, "Card publisher sector not present"); + } for (int i = 1; i < 8 + 8 + 7 + 1; i++) { uint16_t AID = madGetAID(sector, 2, i); - PrintAndLogEx(NORMAL, "%02d [%04X] %s", i + 16, AID, GetAIDDescription(AID)); - }; + PrintAndLogEx(INFO, "%02d [%04X] %s", i + 16, AID, GetAIDDescription(AID)); + } - return 0; + return PM3_SUCCESS; } From 849be2376ca81f3a4139316c1aa23a2238aea808 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 9 Jun 2020 09:19:25 +0200 Subject: [PATCH 567/632] textual --- client/src/cmdhf14a.c | 60 +++++++++++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 22 deletions(-) diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index baa2c66cf..7703fe849 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -1256,7 +1256,7 @@ int CmdHF14A(const char *Cmd) { } static void printTag(const char *tag) { - PrintAndLogEx(SUCCESS, "POSSIBLE TYPE:" _YELLOW_(" %s"), tag); + PrintAndLogEx(SUCCESS, " " _YELLOW_("%s"), tag); } @@ -1274,6 +1274,8 @@ typedef enum { static int detect_nxp_card(uint8_t sak, uint16_t atqa) { int type = MTNONE; + PrintAndLogEx(SUCCESS, "Possible types:"); + if (sak == 0x00) { printTag("NTAG 20x / 21x / 21x TT / I2C plus"); printTag("MIFARE Ultralight / C / EV1 / Nano"); @@ -1284,10 +1286,12 @@ static int detect_nxp_card(uint8_t sak, uint16_t atqa) { printTag("TNP3xxx (Activision Game Appliance)"); type = MTCLASSIC; } + if ((sak & 0x04) == 0x04) { printTag("Any MIFARE CL1 / NTAG424DNA"); type |= MTDESFIRE; } + if ((sak & 0x08) == 0x08) { printTag("MIFARE Classic 1K / Classic 1K CL2"); printTag("MIFARE Plus 2K / Plus EV1 2K"); @@ -1295,18 +1299,22 @@ static int detect_nxp_card(uint8_t sak, uint16_t atqa) { type |= MTCLASSIC; type |= MTPLUS; } + if ((sak & 0x09) == 0x09) { printTag("MIFARE Mini 0.3K / Mini CL2 0.3K"); type |= MTMINI; } + if ((sak & 0x10) == 0x10) { printTag("MIFARE Plus 2K / Plus CL2 2K"); type |= MTPLUS; } + if ((sak & 0x11) == 0x11) { printTag("MIFARE Plus 4K / Plus CL2 4K"); type |= MTPLUS; } + if ((sak & 0x18) == 0x18) { if (atqa == 0x0042) { printTag("MIFARE Plus 4K / Plus EV1 4K"); @@ -1316,8 +1324,8 @@ static int detect_nxp_card(uint8_t sak, uint16_t atqa) { printTag("MIFARE Classic 4K / Classic 4K CL2"); type |= MTCLASSIC; } - } + if ((sak & 0x20) == 0x20) { if (atqa == 0x0344) { printTag("MIFARE DESFire EV1 2K/4K/8K / DESFire EV1 CL2 2K/4K/8K"); @@ -1332,18 +1340,25 @@ static int detect_nxp_card(uint8_t sak, uint16_t atqa) { type |= MTPLUS; } } + if ((sak & 0x24) == 0x24) { if (atqa == 0x0344) { printTag("MIFARE DESFire CL1 / DESFire EV1 CL1"); type |= MTDESFIRE; } } + if ((sak & 0x28) == 0x28) { if (atqa == 0x0344) { printTag("MIFARE DESFire CL1 / DESFire EV1 CL1"); type |= MTDESFIRE; } } + + if (type == MTNONE) { + PrintAndLogEx(WARNING, " failed to fingerprint"); + } + return type; } @@ -1351,9 +1366,9 @@ typedef struct { uint8_t uid0; uint8_t uid1; const char *desc; -} uidname; +} uid_label_name; -const uidname uidmap[] = { +const uid_label_name uid_label_map[] = { // UID0, UID1, TEXT {0x02, 0x84, "M24SR64-Y"}, {0x02, 0xA3, "25TA02KB-P"}, @@ -1367,14 +1382,13 @@ const uidname uidmap[] = { static void getTagLabel(uint8_t uid0, uint8_t uid1) { int i = 0; - while (uidmap[i].uid0 != 0x00) { - if ((uidmap[i].uid0 == uid0) && (uidmap[i].uid1 == uid1)) { - PrintAndLogEx(SUCCESS, _YELLOW_(" %s"), uidmap[i].desc); + while (uid_label_map[i].uid0 != 0x00) { + if ((uid_label_map[i].uid0 == uid0) && (uid_label_map[i].uid1 == uid1)) { + PrintAndLogEx(SUCCESS, _YELLOW_(" %s"), uid_label_map[i].desc); return; } i += 1; } - return; } int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { @@ -1414,7 +1428,7 @@ int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { } if (verbose) { - PrintAndLogEx(SUCCESS, "-- ISO14443-a Information -----------------------------------"); + PrintAndLogEx(SUCCESS, "------ " _CYAN_("ISO14443-a Information") "------------------"); PrintAndLogEx(SUCCESS, "-------------------------------------------------------------"); } PrintAndLogEx(SUCCESS, " UID: " _GREEN_("%s"), sprint_hex(card.uid, card.uidlen)); @@ -1426,7 +1440,7 @@ int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { bool isMifarePlus = false; bool isMifareUltralight = false; int nxptype = MTNONE; - // Double & triple sized UID, can be mapped to a manufacturer. + if (card.uidlen <= 4) { nxptype = detect_nxp_card(card.sak, ((card.atqa[1] << 8) + card.atqa[0])); @@ -1437,9 +1451,12 @@ int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { if ((nxptype & MTOTHER) == MTOTHER) isMifareClassic = true; - } - if (card.uidlen > 4) { + + } else { + + // Double & triple sized UID, can be mapped to a manufacturer. PrintAndLogEx(SUCCESS, "MANUFACTURER: " _YELLOW_("%s"), getTagInfo(card.uid[0])); + switch (card.uid[0]) { case 0x04: // NXP nxptype = detect_nxp_card(card.sak, ((card.atqa[1] << 8) + card.atqa[0])); @@ -1756,16 +1773,6 @@ int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { PrintAndLogEx(INFO, "proprietary non iso14443-4 card found, RATS not supported"); } - if (isMifareUltralight) { - PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`hf mfu info`")); - } - if (isMifarePlus) { - PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`hf mfp info`")); - } - if (isMifareDESFire) { - PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`hf mfdes info`")); - } - if (isMifareClassic || isMifareUltralight) { detect_classic_magic(); @@ -1790,6 +1797,15 @@ int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { } } + if (isMifareUltralight) + PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`hf mfu info`")); + + if (isMifarePlus) + PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`hf mfp info`")); + + if (isMifareDESFire) + PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`hf mfdes info`")); + DropField(); return select_status; } From d12606cb26b5ad5b3bb6cd27e173c3d7fbe10d4d Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 9 Jun 2020 11:14:40 +0200 Subject: [PATCH 568/632] reverse crc check --- client/src/mifare/mad.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/mifare/mad.c b/client/src/mifare/mad.c index 9e8974365..a746406c5 100644 --- a/client/src/mifare/mad.c +++ b/client/src/mifare/mad.c @@ -110,7 +110,7 @@ static const char *GetAIDDescription(uint16_t AID) { } static int madCRCCheck(uint8_t *sector, bool verbose, int MADver) { - if (MADver == 2) { + if (MADver == 1) { uint8_t crc = CRC8Mad(§or[16 + 1], 15 + 16); if (crc != sector[16]) { PrintAndLogEx(WARNING, _RED_("Wrong MAD %d CRC") " calculated: 0x%02x != 0x%02x", MADver, crc, sector[16]); From 5b10df9b4cfba25a0aafce48e849913f81305f52 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 9 Jun 2020 11:32:19 +0200 Subject: [PATCH 569/632] textual --- client/src/cmdhfmf.c | 15 +++++++++------ client/src/cmdhfmfp.c | 17 ++++++++++------- client/src/mifare/mad.c | 34 ++++++++++++++-------------------- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index b3ccbbe3b..24a7c9844 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -4499,6 +4499,7 @@ static int CmdHF14AMfMAD(const char *Cmd) { arg_str0("aA", "aid", "print all sectors with specified aid", NULL), arg_str0("kK", "key", "key for printing sectors", NULL), arg_lit0("bB", "keyb", "use key B for access printing sectors (by default: key A)"), + arg_lit0("", "be", "(optional, try BigEndian"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -4510,23 +4511,25 @@ static int CmdHF14AMfMAD(const char *Cmd) { int keylen; CLIGetHexWithReturn(ctx, 3, key, &keylen); bool keyB = arg_get_lit(4); +// bool use_be = arg_get_lit(5); CLIParserFree(ctx); if (aidlen != 2 && keylen > 0) { - PrintAndLogEx(WARNING, "do not need a key without aid."); + PrintAndLogEx(WARNING, "do not need a key without aid"); } uint8_t sector0[16 * 4] = {0}; uint8_t sector10[16 * 4] = {0}; if (mfReadSector(MF_MAD1_SECTOR, MF_KEY_A, (uint8_t *)g_mifare_mad_key, sector0)) { - PrintAndLogEx(ERR, "read sector 0 error. card don't have MAD or don't have MAD on default keys."); + PrintAndLogEx(ERR, "error, read sector 0. card don't have MAD or don't have MAD on default keys"); return PM3_ESOFT; } if (verbose) { + PrintAndLogEx(SUCCESS, "Raw:"); for (int i = 0; i < 4; i ++) - PrintAndLogEx(NORMAL, "[%d] %s", i, sprint_hex(§or0[i * 16], 16)); + PrintAndLogEx(INFO, "[%d] %s", i, sprint_hex(§or0[i * 16], 16)); } bool haveMAD2 = false; @@ -4534,7 +4537,7 @@ static int CmdHF14AMfMAD(const char *Cmd) { if (haveMAD2) { if (mfReadSector(MF_MAD2_SECTOR, MF_KEY_A, (uint8_t *)g_mifare_mad_key, sector10)) { - PrintAndLogEx(ERR, "read sector 0x10 error. card don't have MAD or don't have MAD on default keys."); + PrintAndLogEx(ERR, "error, read sector 0x10. card don't have MAD or don't have MAD on default keys"); return PM3_ESOFT; } @@ -4548,7 +4551,7 @@ static int CmdHF14AMfMAD(const char *Cmd) { uint16_t mad[7 + 8 + 8 + 8 + 8] = {0}; size_t madlen = 0; if (MADDecode(sector0, sector10, mad, &madlen)) { - PrintAndLogEx(ERR, "can't decode mad."); + PrintAndLogEx(ERR, "can't decode MAD"); return PM3_ESOFT; } @@ -4563,7 +4566,7 @@ static int CmdHF14AMfMAD(const char *Cmd) { uint8_t vsector[16 * 4] = {0}; if (mfReadSector(i + 1, keyB ? MF_KEY_B : MF_KEY_A, akey, vsector)) { PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(ERR, "read sector %d error.", i + 1); + PrintAndLogEx(ERR, "error, read sector %d", i + 1); return PM3_ESOFT; } diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index 36e847fa1..b4cf4907f 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -1297,6 +1297,7 @@ static int CmdHFMFPMAD(const char *Cmd) { arg_str0("aA", "aid", "print all sectors with aid", NULL), arg_str0("kK", "key", "key for printing sectors", NULL), arg_lit0("bB", "keyb", "use key B for access printing sectors (by default: key A)"), + arg_lit0("", "be", "(optional, try BigEndian"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -1309,11 +1310,12 @@ static int CmdHFMFPMAD(const char *Cmd) { int keylen; CLIGetHexWithReturn(ctx, 3, key, &keylen); bool keyB = arg_get_lit(4); +// bool use_be = arg_get_lit(5); CLIParserFree(ctx); if (aidlen != 2 && keylen > 0) { - PrintAndLogEx(WARNING, "do not need a key without aid."); + PrintAndLogEx(WARNING, "do not need a key without aid"); } uint8_t sector0[16 * 4] = {0}; @@ -1321,13 +1323,14 @@ static int CmdHFMFPMAD(const char *Cmd) { if (mfpReadSector(MF_MAD1_SECTOR, MF_KEY_A, (uint8_t *)g_mifarep_mad_key, sector0, verbose)) { PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(ERR, "read sector 0 error. card don't have MAD or don't have MAD on default keys."); + PrintAndLogEx(ERR, "error, read sector 0. card don't have MAD or don't have MAD on default keys"); return 2; } if (verbose) { + PrintAndLogEx(SUCCESS, "Raw:"); for (int i = 0; i < 4; i ++) - PrintAndLogEx(NORMAL, "[%d] %s", i, sprint_hex(§or0[i * 16], 16)); + PrintAndLogEx(INFO, "[%d] %s", i, sprint_hex(§or0[i * 16], 16)); } bool haveMAD2 = false; @@ -1336,7 +1339,7 @@ static int CmdHFMFPMAD(const char *Cmd) { if (haveMAD2) { if (mfpReadSector(MF_MAD2_SECTOR, MF_KEY_A, (uint8_t *)g_mifarep_mad_key, sector10, verbose)) { PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(ERR, "read sector 0x10 error. card don't have MAD or don't have MAD on default keys."); + PrintAndLogEx(ERR, "error, read sector 0x10. card don't have MAD or don't have MAD on default keys"); return 2; } @@ -1345,12 +1348,12 @@ static int CmdHFMFPMAD(const char *Cmd) { if (aidlen == 2) { uint16_t aaid = (aid[0] << 8) + aid[1]; - PrintAndLogEx(NORMAL, "\n-------------- AID 0x%04x ---------------", aaid); + PrintAndLogEx(INFO, "-------------- " _CYAN_("AID 0x%04x") " ---------------", aaid); uint16_t mad[7 + 8 + 8 + 8 + 8] = {0}; size_t madlen = 0; if (MADDecode(sector0, sector10, mad, &madlen)) { - PrintAndLogEx(ERR, "can't decode mad."); + PrintAndLogEx(ERR, "can't decode MAD"); return 10; } @@ -1365,7 +1368,7 @@ static int CmdHFMFPMAD(const char *Cmd) { uint8_t vsector[16 * 4] = {0}; if (mfpReadSector(i + 1, keyB ? MF_KEY_B : MF_KEY_A, akey, vsector, false)) { PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(ERR, "read sector %d error.", i + 1); + PrintAndLogEx(ERR, "error, read sector %d error", i + 1); return 2; } diff --git a/client/src/mifare/mad.c b/client/src/mifare/mad.c index a746406c5..9887f0a77 100644 --- a/client/src/mifare/mad.c +++ b/client/src/mifare/mad.c @@ -140,29 +140,29 @@ int MADCheck(uint8_t *sector0, uint8_t *sector10, bool verbose, bool *haveMAD2) uint8_t GPB = sector0[3 * 16 + 9]; if (verbose) - PrintAndLogEx(INFO, "GPB: 0x%02x", GPB); + PrintAndLogEx(SUCCESS, "GPB: " _GREEN_("0x%02x"), GPB); // DA (MAD available) if (!(GPB & 0x80)) { - PrintAndLogEx(ERR, "DA=0! MAD not available."); + PrintAndLogEx(ERR, "DA = 0! MAD not available"); return PM3_ESOFT; } // MA (multi-application card) if (verbose) { if (GPB & 0x40) - PrintAndLogEx(INFO, "Multi application card."); + PrintAndLogEx(SUCCESS, "Multi application card"); else - PrintAndLogEx(INFO, "Single application card."); + PrintAndLogEx(SUCCESS, "Single application card"); } uint8_t MADVer = GPB & 0x03; if (verbose) - PrintAndLogEx(INFO, "MAD version: %d", MADVer); + PrintAndLogEx(SUCCESS, "MAD version: " _GREEN_("%d"), MADVer); // MAD version if ((MADVer != 0x01) && (MADVer != 0x02)) { - PrintAndLogEx(ERR, "Wrong MAD version: 0x%02x", MADVer); + PrintAndLogEx(ERR, "Wrong MAD version: " _RED_("0x%02x"), MADVer); return PM3_ESOFT; }; @@ -172,7 +172,7 @@ int MADCheck(uint8_t *sector0, uint8_t *sector10, bool verbose, bool *haveMAD2) int res = madCRCCheck(sector0, true, 1); if (verbose && res == PM3_SUCCESS) - PrintAndLogEx(INFO, "CRC8-MAD1 (%s)", _GREEN_("ok")); + PrintAndLogEx(SUCCESS, "CRC8-MAD1 (%s)", _GREEN_("ok")); if (MADVer == 2 && sector10) { int res2 = madCRCCheck(sector10, true, 2); @@ -180,7 +180,7 @@ int MADCheck(uint8_t *sector0, uint8_t *sector10, bool verbose, bool *haveMAD2) res = res2; if (verbose && !res2) - PrintAndLogEx(INFO, "CRC8-MAD2 (%)", _GREEN_("ok")); + PrintAndLogEx(SUCCESS, "CRC8-MAD2 (%)", _GREEN_("ok")); } return res; @@ -191,7 +191,7 @@ int MADDecode(uint8_t *sector0, uint8_t *sector10, uint16_t *mad, size_t *madlen bool haveMAD2 = false; int res = MADCheck(sector0, sector10, false, &haveMAD2); if (res != PM3_SUCCESS) { - PrintAndLogEx(INFO, "Not a valid MAD"); + PrintAndLogEx(WARNING, "Not a valid MAD"); return res; } @@ -216,18 +216,12 @@ int MADDecode(uint8_t *sector0, uint8_t *sector10, uint16_t *mad, size_t *madlen int MAD1DecodeAndPrint(uint8_t *sector, bool verbose, bool *haveMAD2) { // check MAD1 only - int res = MADCheck(sector, NULL, verbose, haveMAD2); - if (verbose) { - if (res == PM3_SUCCESS) - PrintAndLogEx(INFO, "CRC8-MAD1 (%s)", _GREEN_("ok")); - else - PrintAndLogEx(INFO, "CRC8-MAD1 (%s)", _RED_("fail")); - } + MADCheck(sector, NULL, verbose, haveMAD2); // info byte uint8_t InfoByte = sector[16 + 1] & 0x3f; if (InfoByte) { - PrintAndLogEx(INFO, "Card publisher sector: " _GREEN_("0x%02x"), InfoByte); + PrintAndLogEx(SUCCESS, "Card publisher sector: " _GREEN_("0x%02x"), InfoByte); } else { if (verbose) PrintAndLogEx(WARNING, "Card publisher sector not present"); @@ -250,14 +244,14 @@ int MAD2DecodeAndPrint(uint8_t *sector, bool verbose) { int res = madCRCCheck(sector, true, 2); if (verbose) { if (res == PM3_SUCCESS) - PrintAndLogEx(INFO, "CRC8-MAD2 (%s)", _GREEN_("ok")); + PrintAndLogEx(SUCCESS, "CRC8-MAD2 (%s)", _GREEN_("ok")); else - PrintAndLogEx(INFO, "CRC8-MAD2 (%s)", _RED_("fail")); + PrintAndLogEx(WARNING, "CRC8-MAD2 (%s)", _RED_("fail")); } uint8_t InfoByte = sector[1] & 0x3f; if (InfoByte) { - PrintAndLogEx(INFO, "MAD2 Card publisher sector: " _GREEN_("0x%02x"), InfoByte); + PrintAndLogEx(SUCCESS, "MAD2 Card publisher sector: " _GREEN_("0x%02x"), InfoByte); } else { if (verbose) PrintAndLogEx(WARNING, "Card publisher sector not present"); From bfc6a2c513ec0efb795588ba35f6f075137eb48c Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 9 Jun 2020 13:31:09 +0200 Subject: [PATCH 570/632] add: a MAD Directory in json --- client/resources/mad.json | 13547 ++++++++++++++++++++++++++++++++++++ 1 file changed, 13547 insertions(+) create mode 100644 client/resources/mad.json diff --git a/client/resources/mad.json b/client/resources/mad.json new file mode 100644 index 000000000..7911599f2 --- /dev/null +++ b/client/resources/mad.json @@ -0,0 +1,13547 @@ +[ + { + "application": "Card holders personal data", + "company": "Rosan Finance", + "mad": "0x0004", + "service_provider": "", + "system_integrator": "Rosan Finance" + }, + { + "application": "Card ID: ISO No., expiry date and other identification data", + "company": "Rosan Finance", + "mad": "0x0005", + "service_provider": "Rosan Finance", + "system_integrator": "Rosan Finance" + }, + { + "application": "Private Rovalty programs, discount programs for card holders", + "company": "Rosan Finance", + "mad": "0x0006", + "service_provider": "Retail Trade and Service Org.", + "system_integrator": "Rosan Finance" + }, + { + "application": "Card Holder Data/ Card Management Data/ Access Control & Security", + "company": "House of Representatives of States General", + "mad": "0x0007", + "service_provider": "House of Representatives of States General", + "system_integrator": "Paul Sas" + }, + { + "application": "Card Holder Data/ Card Management Data/ Access Control & Security", + "company": "House of Representatives of States General", + "mad": "0x0008", + "service_provider": "House of Representatives of States General", + "system_integrator": "Paul Sas" + }, + { + "application": "Card and Reader Configuration", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x0009", + "service_provider": "PBV Kaufmann AG", + "system_integrator": "PBV Kaufmann AG" + }, + { + "application": "Card and Reader Configuration", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x000A", + "service_provider": "PBV Kaufmann AG", + "system_integrator": "PBV Kaufmann AG" + }, + { + "application": "Card and Reader Configuration", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x000B", + "service_provider": "PBV Kaufmann AG", + "system_integrator": "PBV Kaufmann AG" + }, + { + "application": "Card and Reader Configuration", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x000C", + "service_provider": "PBV Kaufmann AG", + "system_integrator": "PBV Kaufmann AG" + }, + { + "application": "Access Control, payment, ID, time registration", + "company": "Sagio A/S", + "mad": "0x000F", + "service_provider": "Sagio A/S", + "system_integrator": "Sagio A/S" + }, + { + "application": "Card administration", + "company": "Emcard a.s.", + "mad": "0x0010", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "Card publisher data", + "company": "Haguess s.r.o.", + "mad": "0x0011", + "service_provider": "Haguess", + "system_integrator": "Haguess" + }, + { + "application": "Card publisher data", + "company": "Haguess s.r.o.", + "mad": "0x0012", + "service_provider": "Haguess", + "system_integrator": "Haguess" + }, + { + "application": "Card publisher data", + "company": "Haguess s.r.o.", + "mad": "0x0013", + "service_provider": "Haguess", + "system_integrator": "Haguess" + }, + { + "application": "Card publisher data", + "company": "Haguess s.r.o.", + "mad": "0x0014", + "service_provider": "Haguess", + "system_integrator": "Haguess" + }, + { + "application": "Card publisher information", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x0015", + "service_provider": "MIKROELEKTRONIKA spol.s.v.o.", + "system_integrator": "MIKROELEKTRONIKA spol.s.v.o." + }, + { + "application": "Issuer information", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x0016", + "service_provider": "Mikroelektronika spol.s.r.o., Kpt. Poplera 55, Vysoke Myto 566 01, Czech Republic", + "system_integrator": "Mikroelektronika spol.s.r.o., Kpt. Poplera 55, Vysoke Myto 566 01, Czech Republic" + }, + { + "application": "Personal information", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x0017", + "service_provider": "Transmetro Guatemala", + "system_integrator": "SIEMENS Itron Business services S.A. - Cordoba, Rep. Argentina" + }, + { + "application": "Customer profile - card holder information", + "company": "CSAD SVT Praha", + "mad": "0x0018", + "service_provider": "", + "system_integrator": "Mikroelektronika, EMTEST" + }, + { + "application": "Card information - provider, status, validity", + "company": "CSAD SVT Praha", + "mad": "0x0019", + "service_provider": "", + "system_integrator": "Mikroelektronika, EMTEST" + }, + { + "application": "Access control", + "company": "Custom Micro Products Ltd.", + "mad": "0x001B", + "service_provider": "Custom Micro Products", + "system_integrator": "Custom Micro Products" + }, + { + "application": "Interoperable Contactless Card for multimode transport in the area of Arava Province and the city of Vitoria-Gasteiz", + "company": "Eusko Tren", + "mad": "0x001D", + "service_provider": "Idom Ingeniera y Consultoria, S.A.", + "system_integrator": "Idom Ingeniera y Consultoria, S.A." + }, + { + "application": "Interoperable Contactless Card for multimode transport in the area of Arava Province and the city of Vitoria-Gasteiz", + "company": "Eusko Tren", + "mad": "0x001E", + "service_provider": "Idom Ingeniera y Consultoria, S.A.", + "system_integrator": "Idom Ingeniera y Consultoria, S.A." + }, + { + "application": "Interoperable Contactless Card for multimode transport in the area of Arava Province and the city of Vitoria-Gasteiz", + "company": "Eusko Tren", + "mad": "0x001F", + "service_provider": "Idom Ingeniera y Consultoria, S.A.", + "system_integrator": "Idom Ingeniera y Consultoria, S.A." + }, + { + "application": "Interoperable Contactless Card for multimode transport in the area of Arava Province and the city of Vitoria-Gasteiz", + "company": "Eusko Tren", + "mad": "0x0020", + "service_provider": "Idom Ingeniera y Consultoria, S.A.", + "system_integrator": "Idom Ingeniera y Consultoria, S.A." + }, + { + "application": "Card certificate", + "company": "Tidomat AB", + "mad": "0x0021", + "service_provider": "Tidomat AB", + "system_integrator": "Tidomat AB" + }, + { + "application": "Card administration", + "company": "Emcard a.s.", + "mad": "0x0022", + "service_provider": "Emcard", + "system_integrator": "Emcard" + }, + { + "application": "Interoperable Contactless Card for multimode transport in the area of Bizkaia Province", + "company": "BISCAY TRANSPORT CONSORTIUM - Consorcio de transportes de Bizkaia", + "mad": "0x0023", + "service_provider": "Idom Ingenieria y Consultoria, S.A.", + "system_integrator": "Idom Ingenieria y Consultoria, S.A." + }, + { + "application": "Interoperable Contactless Card for multimode transport in the area of Bizkaia Province", + "company": "BISCAY TRANSPORT CONSORTIUM - Consorcio de transportes de Bizkaia", + "mad": "0x0024", + "service_provider": "Idom Ingenieria y Consultoria, S.A.", + "system_integrator": "Idom Ingenieria y Consultoria, S.A." + }, + { + "application": "Interoperable Contactless Card for multimode transport in the area of Bizkaia Province", + "company": "BISCAY TRANSPORT CONSORTIUM - Consorcio de transportes de Bizkaia", + "mad": "0x0025", + "service_provider": "Idom Ingenieria y Consultoria, S.A.", + "system_integrator": "Idom Ingenieria y Consultoria, S.A." + }, + { + "application": "Interoperable Contactless Card for multimode transport in the area of Bizkaia Province", + "company": "BISCAY TRANSPORT CONSORTIUM - Consorcio de transportes de Bizkaia", + "mad": "0x0026", + "service_provider": "Idom Ingenieria y Consultoria, S.A.", + "system_integrator": "Idom Ingenieria y Consultoria, S.A." + }, + { + "application": "Card publisher data, card holder profile", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x0027", + "service_provider": "KOORDINATOR ODIS s.r.o.", + "system_integrator": "KOORDINATOR ODIS s.r.o." + }, + { + "application": "Card administration for municipal chip card - card issuer (information)", + "company": "Plzeňské Městské Dopravní Podniky A.S.", + "mad": "0x0028", + "service_provider": "Plzeňské Městské Dopravní Podniky A.S.", + "system_integrator": "Plzeňské Městské Dopravní Podniky A.S." + }, + { + "application": "Card information", + "company": "BULL POLSKA Sp. z o.o.", + "mad": "0x0029", + "service_provider": "BULL POLSKA", + "system_integrator": "BULL POLSKA" + }, + { + "application": "Card administration", + "company": "Sportdata SP. Z.0.0.", + "mad": "0x002A", + "service_provider": "Sportdata SP. 2 0.0.", + "system_integrator": "Sportdata SP. 2 0.0." + }, + { + "application": "Card administration; Issuer information", + "company": "ODP-software s.r.o.", + "mad": "0x002B", + "service_provider": "ODP-software", + "system_integrator": "ODP-software" + }, + { + "application": "Card administration; Issuer information", + "company": "ODP-software s.r.o.", + "mad": "0x002C", + "service_provider": "ODP-software", + "system_integrator": "ODP-software" + }, + { + "application": "Card publisher data, card holder profile", + "company": "OREDO s.r.o", + "mad": "0x002D", + "service_provider": "OREDO s.r.o", + "system_integrator": "OREDO s.r.o" + }, + { + "application": "Card publisher data, card holder profile", + "company": "Ústecky kraj", + "mad": "0x002E", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Internal use (Tests, Demos...)", + "company": "Ascom Monétel", + "mad": "0x0101", + "service_provider": "Monétel R&D Fare Collection Systems Departement", + "system_integrator": "Monétel S.A." + }, + { + "application": "Benefit services", + "company": "Scheidt & Bachmann", + "mad": "0x0102", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Benefit services", + "company": "Scheidt & Bachmann", + "mad": "0x0103", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Benefit services", + "company": "Scheidt & Bachmann", + "mad": "0x0104", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Shipping company", + "company": "Scheidt & Bachmann", + "mad": "0x0105", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Shipping company", + "company": "Scheidt & Bachmann", + "mad": "0x0106", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Shipping company", + "company": "Scheidt & Bachmann", + "mad": "0x0107", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Shipping company", + "company": "Scheidt & Bachmann", + "mad": "0x0108", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Cure management", + "company": "Scheidt & Bachmann", + "mad": "0x0109", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Cure management", + "company": "Scheidt & Bachmann", + "mad": "0x010A", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "MIFARE Micro Module (MMM) easy test card for antenna calibration", + "company": "Philips Semiconductors Gratkorn GmbH", + "mad": "0x010B", + "service_provider": "Mikron GmbH", + "system_integrator": "Mikron GmbH" + }, + { + "application": "MIFARE Windows Application Demo", + "company": "Philips Semiconductors Gratkorn GmbH", + "mad": "0x010C", + "service_provider": "Mikron GmbH", + "system_integrator": "Mikron GmbH" + }, + { + "application": "MIFARE Windows Application Demo", + "company": "Philips Semiconductors Gratkorn GmbH", + "mad": "0x010D", + "service_provider": "Mikron GmbH", + "system_integrator": "Mikron GmbH" + }, + { + "application": "MIFARE Windows Application Demo", + "company": "Philips Semiconductors Gratkorn GmbH", + "mad": "0x010E", + "service_provider": "Mikron GmbH", + "system_integrator": "Mikron GmbH" + }, + { + "application": "MIFARE Windows Application Demo", + "company": "Philips Semiconductors Gratkorn GmbH", + "mad": "0x010F", + "service_provider": "Mikron GmbH", + "system_integrator": "Mikron GmbH" + }, + { + "application": "MIFARE Windows Application Demo", + "company": "Philips Semiconductors Gratkorn GmbH", + "mad": "0x0110", + "service_provider": "Mikron GmbH", + "system_integrator": "Mikron GmbH" + }, + { + "application": "MIFARE Windows Application Demo", + "company": "Philips Semiconductors Gratkorn GmbH", + "mad": "0x0111", + "service_provider": "Mikron GmbH", + "system_integrator": "Mikron GmbH" + }, + { + "application": "MIFARE Windows Application Demo", + "company": "Philips Semiconductors Gratkorn GmbH", + "mad": "0x0112", + "service_provider": "Mikron GmbH", + "system_integrator": "Mikron GmbH" + }, + { + "application": "Employer indentification card", + "company": "VFJ Technology Pty Ltd", + "mad": "0x0113", + "service_provider": "VFJ Electronics Pty Ltd.", + "system_integrator": "VFJ Electronics PTy Ltd." + }, + { + "application": "City Transport (Metro ticketing, bus ticket)", + "company": "VFJ Technology Pty Ltd", + "mad": "0x0114", + "service_provider": "VFJ Electronic Pty Ltd.", + "system_integrator": "Cubic - VFJ" + }, + { + "application": "Card Administratin, cardholder adminstration, access control & security, company services, miscellaneous applications", + "company": "Ministry of Defense", + "mad": "0x0115", + "service_provider": "Ministry of Defence", + "system_integrator": "" + }, + { + "application": "City transport bus, ferry, administration", + "company": "VFJ Technology Pty Ltd", + "mad": "0x0116", + "service_provider": "VFJ Technology", + "system_integrator": "Cubic - VFJ" + }, + { + "application": "Busticketing System", + "company": "VFJ Technology Pty Ltd", + "mad": "0x0117", + "service_provider": "King Man County Public Traffic", + "system_integrator": "Barouh Electronic Co." + }, + { + "application": "", + "company": "Reserved for MAD", + "mad": "0x0118", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Bus services, access control, diverse (service)", + "company": "IEM - Intenierie Electronique Mecanique S.A.", + "mad": "0x0119", + "service_provider": "IEM SA", + "system_integrator": "IEM SA" + }, + { + "application": "Bus services, access control, diverse (service)", + "company": "IEM - Intenierie Electronique Mecanique S.A.", + "mad": "0x011A", + "service_provider": "IEM SA", + "system_integrator": "IEM SA" + }, + { + "application": "Bus services, access control, diverse (service)", + "company": "IEM - Intenierie Electronique Mecanique S.A.", + "mad": "0x011B", + "service_provider": "IEM SA", + "system_integrator": "IEM SA" + }, + { + "application": "Bus services, access control, diverse (service)", + "company": "IEM - Intenierie Electronique Mecanique S.A.", + "mad": "0x011C", + "service_provider": "IEM SA", + "system_integrator": "IEM SA" + }, + { + "application": "Bus services, access control, diverse (service)", + "company": "IEM - Intenierie Electronique Mecanique S.A.", + "mad": "0x011D", + "service_provider": "IEM SA", + "system_integrator": "IEM SA" + }, + { + "application": "Bus services, access control, diverse (service)", + "company": "IEM - Intenierie Electronique Mecanique S.A.", + "mad": "0x011E", + "service_provider": "IEM SA", + "system_integrator": "IEM SA" + }, + { + "application": "Bus services, access control, diverse (service)", + "company": "IEM - Intenierie Electronique Mecanique S.A.", + "mad": "0x011F", + "service_provider": "IEM SA", + "system_integrator": "IEM SA" + }, + { + "application": "Weighbridge for trucks", + "company": "VFJ Technology Pty Ltd", + "mad": "0x0130", + "service_provider": "Hardware Systems Sales", + "system_integrator": "" + }, + { + "application": "Bus services, access control, diverse (service)", + "company": "IEM - Intenierie Electronique Mecanique S.A.", + "mad": "0x0131", + "service_provider": "IEM SA", + "system_integrator": "IEM SA" + }, + { + "application": "Miscellaneous Application", + "company": "BOSCH Telecom GmbH", + "mad": "0x0140", + "service_provider": "Bosch Telecom GmbH", + "system_integrator": "Bosch Telecom GmbH" + }, + { + "application": "Configuration Master Card for MIFARE reader/writers", + "company": "Integrated Engineering", + "mad": "0x0141", + "service_provider": "IE Holding", + "system_integrator": "IE Holding" + }, + { + "application": "Photo copier controll, access controll, time & attendance", + "company": "Beka Elektronik", + "mad": "0x014B", + "service_provider": "BEKA Elektronik", + "system_integrator": "BEKA Elektronik" + }, + { + "application": "Access control & security, city traffic, sports & entertainment", + "company": "IP Core", + "mad": "0x014C", + "service_provider": "IP Core", + "system_integrator": "IP Core" + }, + { + "application": "E-ticketing", + "company": "highQ Computerlösungen GmbH", + "mad": "0x014D", + "service_provider": "", + "system_integrator": "high Q" + }, + { + "application": "E-ticketing", + "company": "highQ Computerlösungen GmbH", + "mad": "0x014E", + "service_provider": "", + "system_integrator": "high Q" + }, + { + "application": "E-ticketing", + "company": "highQ Computerlösungen GmbH", + "mad": "0x014F", + "service_provider": "", + "system_integrator": "high Q" + }, + { + "application": "E-ticketing", + "company": "highQ Computerlösungen GmbH", + "mad": "0x0150", + "service_provider": "", + "system_integrator": "high Q" + }, + { + "application": "E-ticketing", + "company": "highQ Computerlösungen GmbH", + "mad": "0x0151", + "service_provider": "", + "system_integrator": "high Q" + }, + { + "application": "Admin profile", + "company": "KORID LK, spol. s r.o", + "mad": "0x0153", + "service_provider": "KORID LK, spol.s.r.o.", + "system_integrator": "KORID LK, spol.s.r.o." + }, + { + "application": "Details of the card issuer", + "company": "Scheidt & Bachmann", + "mad": "0x0201", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Details of the card issuer", + "company": "Scheidt & Bachmann", + "mad": "0x0202", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "MIFARE Demonstration Software, G&D - F&E Dept.", + "company": "*Giesecke & Devrient GmbH", + "mad": "0x0203", + "service_provider": "G&D", + "system_integrator": "G&D" + }, + { + "application": "MIFARE Demonstration Software, G&D - F&E Dept.", + "company": "*Giesecke & Devrient GmbH", + "mad": "0x0204", + "service_provider": "G&D", + "system_integrator": "G&D" + }, + { + "application": "MIFARE Demonstration Software, G&D - F&E Dept.", + "company": "*Giesecke & Devrient GmbH", + "mad": "0x0205", + "service_provider": "G&D", + "system_integrator": "G&D" + }, + { + "application": "MIFARE Demonstration Software, G&D - F&E Dept.", + "company": "*Giesecke & Devrient GmbH", + "mad": "0x0206", + "service_provider": "G&D", + "system_integrator": "G&D" + }, + { + "application": "Watch service, owner id, electronical service book, messaging system for news", + "company": "Junghans Uhren GmbH", + "mad": "0x0207", + "service_provider": "Junghans Uhren GmbH", + "system_integrator": "" + }, + { + "application": "Card Touch Smart Card Applications", + "company": "Touch Technology International Inc.", + "mad": "0x0208", + "service_provider": "Touch Technology International", + "system_integrator": "Touch Technology International" + }, + { + "application": "Miscellaneous application, city traffic, access controll & security entertainment, car parking, electronic trade", + "company": "KFAP S.A.", + "mad": "0x0209", + "service_provider": "KFPA", + "system_integrator": "KFPA" + }, + { + "application": "Computer, car parking, elec. purse, access control & security", + "company": "DECA Engineering", + "mad": "0x020A", + "service_provider": "Deca Engineering", + "system_integrator": "Deca Engineering" + }, + { + "application": "Social identification no. of card holder", + "company": "Rosan Finance", + "mad": "0x0301", + "service_provider": "Social Protection Org.", + "system_integrator": "Rosan Finance" + }, + { + "application": "Miscellaneous applications: customer profile, card administration", + "company": "ODP-software s.r.o.", + "mad": "0x0302", + "service_provider": "ODP-software", + "system_integrator": "ODP-software" + }, + { + "application": "Miscellaneous applications: customer profile, card administration", + "company": "ODP-software s.r.o.", + "mad": "0x0303", + "service_provider": "ODP-software", + "system_integrator": "ODP-software" + }, + { + "application": "Access Control, payment, ID, time registration", + "company": "Sagio A/S", + "mad": "0x0401", + "service_provider": "Sagio A/S", + "system_integrator": "Sagio A/S" + }, + { + "application": "Multifunctional appplications", + "company": "Braincon Technologies GmbH", + "mad": "0x054D", + "service_provider": "Braincon", + "system_integrator": "Braincon" + }, + { + "application": "Miscellaneous application", + "company": "Ústecky kraj", + "mad": "0x054E", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Miscellaneous application", + "company": "Ústecky kraj", + "mad": "0x054F", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Miscellaneous application", + "company": "Ústecky kraj", + "mad": "0x0550", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Miscellaneous application", + "company": "Ústecky kraj", + "mad": "0x0551", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Miscellaneous application", + "company": "Ústecky kraj", + "mad": "0x0552", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Miscellaneous application", + "company": "BULL POLSKA Sp. z o.o.", + "mad": "0x0601", + "service_provider": "BULL POLSKA", + "system_integrator": "BULL POLSKA" + }, + { + "application": "Miscellaneous application", + "company": "BULL POLSKA Sp. z o.o.", + "mad": "0x0602", + "service_provider": "BULL POLSKA", + "system_integrator": "BULL POLSKA" + }, + { + "application": "Card administration", + "company": "MCF RF TECH SRL", + "mad": "0x0701", + "service_provider": "MCF", + "system_integrator": "MCF" + }, + { + "application": "City traffic, electronic purse, micellaneous applications", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x0702", + "service_provider": "Koordinator", + "system_integrator": "PVT" + }, + { + "application": "Access control, electronic purse, parking, city cards", + "company": "ARD", + "mad": "0x0703", + "service_provider": "ARD", + "system_integrator": "ARD" + }, + { + "application": "Company services, access & sec control, electronic purse...", + "company": "Cominfo a.s.", + "mad": "0x0704", + "service_provider": "Cominfo", + "system_integrator": "Cominfo" + }, + { + "application": "Application containing card holder information", + "company": "DOPRAVNI PODNIK mest Mostu a Litvinova, a.s.", + "mad": "0x0705", + "service_provider": "Dopravni Podnik mest Mostu a Litvinova, a.s.", + "system_integrator": "Mikroelektronika, spol. sr. o., Kpt. Poplera 55, 565 01 Vysoké Mýto, CZ" + }, + { + "application": "Service Application containing information about driver and inspector", + "company": "DOPRAVNI PODNIK mest Mostu a Litvinova, a.s.", + "mad": "0x0706", + "service_provider": "Dopravni Podnik mest Mostu a Litvinova, a.s.", + "system_integrator": "Mikroelektronika, spol. sr. o., Kpt. Poplera 55, 565 01 Vysoké Mýto, CZ" + }, + { + "application": "Bonus counter", + "company": "DOPRAVNI PODNIK mest Mostu a Litvinova, a.s.", + "mad": "0x0707", + "service_provider": "Dopravni Podnik mest Mostu a Litvinova, a.s.", + "system_integrator": "Mikroelektronika, spol. sr.o. Kpt. Poplera 55, 565 01 Vysoké Mýto, CZ" + }, + { + "application": "Liberec City Card - loyalty check", + "company": "Liberecká IS, a.s.", + "mad": "0x0708", + "service_provider": "Liverecká IS, a.s.", + "system_integrator": "Accenture Central Europe" + }, + { + "application": "Electronic purse, city traffic, customer profile, service application, check-in/out application", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x0709", + "service_provider": "Mikroelektronika", + "system_integrator": "Mikroelektronika" + }, + { + "application": "Electronic purse, city traffic, customer profile, service application, check-in/out application", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x070A", + "service_provider": "Mikroelektronika", + "system_integrator": "Mikroelektronika" + }, + { + "application": "Bonus Counter", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x070B", + "service_provider": "Mikroelektronika spol s.r.o.", + "system_integrator": "Mikroelektronika spol s.r.o." + }, + { + "application": "Card Administration", + "company": "MCF RF TECH SRL", + "mad": "0x070C", + "service_provider": "MCF RF TECH S.R.L.", + "system_integrator": "MCF RF TECH S.R.L." + }, + { + "application": "Loyalty/Gift Card application for Cinemas, Resorts, Retails chains", + "company": "VERIFONE ITALIA SRL", + "mad": "0x070D", + "service_provider": "VeriFone Italia", + "system_integrator": "VeriFone Italia" + }, + { + "application": "Transaction log 3S", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x070E", + "service_provider": "Transmetro Guatemala", + "system_integrator": "SIEMENS Itron Business services S.A. - Cordoba, Rep. Argentina" + }, + { + "application": "Multifunctional ID card", + "company": "Micros-Fidelio GmbH", + "mad": "0x070F", + "service_provider": "Micros-Fidelio GmbH", + "system_integrator": "Micros-Fidelio GmbH" + }, + { + "application": "Multifunctional ID card", + "company": "Micros-Fidelio GmbH", + "mad": "0x0710", + "service_provider": "Micros-Fidelio GmbH", + "system_integrator": "Micros-Fidelio GmbH" + }, + { + "application": "Multifunctional ID card", + "company": "Micros-Fidelio GmbH", + "mad": "0x0711", + "service_provider": "Micros-Fidelio GmbH", + "system_integrator": "Micros-Fidelio GmbH" + }, + { + "application": "Dedicated to marina users, to improve data consistancy", + "company": "MARINAPASS", + "mad": "0x0712", + "service_provider": "MARINAPASS", + "system_integrator": "Philippe FONTENOY" + }, + { + "application": "Customer profile", + "company": "KORID LK, spol. s r.o", + "mad": "0x0713", + "service_provider": "KORID LK, spol.s.r.o.", + "system_integrator": "KORID LK, spol.s.r.o." + }, + { + "application": "Cashless Payment; access and time control", + "company": "EVIS AG", + "mad": "0x0714", + "service_provider": "EVIS AG", + "system_integrator": "EVIS AG" + }, + { + "application": "Cashless Payment; access and time control", + "company": "EVIS AG", + "mad": "0x0715", + "service_provider": "EVIS AG", + "system_integrator": "EVIS AG" + }, + { + "application": "Cashless Payment; access and time control", + "company": "EVIS AG", + "mad": "0x0716", + "service_provider": "EVIS AG", + "system_integrator": "EVIS AG" + }, + { + "application": "Cashless Payment; access and time control", + "company": "EVIS AG", + "mad": "0x0717", + "service_provider": "EVIS AG", + "system_integrator": "EVIS AG" + }, + { + "application": "Cashless Payment; access and time control", + "company": "EVIS AG", + "mad": "0x0718", + "service_provider": "EVIS AG", + "system_integrator": "EVIS AG" + }, + { + "application": "Cashless Payment; access and time control", + "company": "EVIS AG", + "mad": "0x0719", + "service_provider": "EVIS AG", + "system_integrator": "EVIS AG" + }, + { + "application": "Cashless Payment; access and time control", + "company": "EVIS AG", + "mad": "0x071A", + "service_provider": "EVIS AG", + "system_integrator": "EVIS AG" + }, + { + "application": "Cashless Payment; access and time control", + "company": "EVIS AG", + "mad": "0x071B", + "service_provider": "EVIS AG", + "system_integrator": "EVIS AG" + }, + { + "application": "Customer profile", + "company": "Mikroelektronika GmbH", + "mad": "0x071C", + "service_provider": "MIKROELEKTRONIKA spol.s.r.o., Draby 849, Vysoke Myto 56601, Czech Republic", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o., Draby 849, Vysoke Myto 56601, Czech Republic" + }, + { + "application": "Customer profile", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x071D", + "service_provider": "ZAGREBACKI Holding d.o.o.", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o." + }, + { + "application": "Bonus counter", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x071E", + "service_provider": "ZAGREBACKI Holding d.o.o.", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o." + }, + { + "application": "Authentication of Casino Staff members", + "company": "Atronic Austria GmbH", + "mad": "0x071F", + "service_provider": "ATRONIC Austria GmBH", + "system_integrator": "ATRONIC Austria GmBH" + }, + { + "application": "Authentication of Casino Staff members", + "company": "Atronic Austria GmbH", + "mad": "0x0720", + "service_provider": "ATRONIC Austria GmBH", + "system_integrator": "ATRONIC Austria GmBH" + }, + { + "application": "Operator Card for Automated-Fare Collection System", + "company": "ACS Solutions Switzerland Ltd. a Xerox Company", + "mad": "0x0721", + "service_provider": "ACS Solutions Switzerland Ltd.", + "system_integrator": "ACS Solutions Switzerland Ltd." + }, + { + "application": "Multi-application Card-Access Control, Ticketing payment", + "company": "APPLICAM", + "mad": "0x0722", + "service_provider": "APPLICAM", + "system_integrator": "APPLICAM" + }, + { + "application": "Multi-application Card-Access Control, Ticketing payment", + "company": "APPLICAM", + "mad": "0x0723", + "service_provider": "APPLICAM", + "system_integrator": "APPLICAM" + }, + { + "application": "Multi-application Card-Access Control, Ticketing payment", + "company": "APPLICAM", + "mad": "0x0724", + "service_provider": "APPLICAM", + "system_integrator": "APPLICAM" + }, + { + "application": "Multi-application Card-Access Control, Ticketing payment", + "company": "APPLICAM", + "mad": "0x0725", + "service_provider": "APPLICAM", + "system_integrator": "APPLICAM" + }, + { + "application": "Multi-application Card-Access Control, Ticketing payment", + "company": "APPLICAM", + "mad": "0x0726", + "service_provider": "APPLICAM", + "system_integrator": "APPLICAM" + }, + { + "application": "Multi-application Card-Access Control, Ticketing payment", + "company": "APPLICAM", + "mad": "0x0727", + "service_provider": "APPLICAM", + "system_integrator": "APPLICAM" + }, + { + "application": "Bonus Counter", + "company": "Mikroelektronika GmbH", + "mad": "0x0728", + "service_provider": "MIKROELEKTRONIKA spol.s.r.o.", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o." + }, + { + "application": "Info-Customer profile", + "company": "Mikroelektronika GmbH", + "mad": "0x0729", + "service_provider": "MIKROELEKTRONIKA spol.s.r.o.", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o." + }, + { + "application": "Micropayments, access control and gift control", + "company": "METAPAY LTD.", + "mad": "0x072A", + "service_provider": "METAPAY LTD.", + "system_integrator": "EPAM Systems Ltd." + }, + { + "application": "Customer profile", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x072B", + "service_provider": "Mikroelektronika spol.s r.o", + "system_integrator": "Mikroelektronika spol.s r.o" + }, + { + "application": "Biometric data", + "company": "Alphatronics", + "mad": "0x072C", + "service_provider": "", + "system_integrator": "Alphatronics" + }, + { + "application": "Hotel, Access control, entertainement, NFC, Academic, Comoany Service, Healt service", + "company": "USSEN Limited", + "mad": "0x072D", + "service_provider": "Ussen Limited", + "system_integrator": "Ussen Limited" + }, + { + "application": "Gangway Access Control for ships", + "company": "LabelCraft AS", + "mad": "0x072E", + "service_provider": "LabelCraft AS", + "system_integrator": "LabelCraft AS" + }, + { + "application": "Gangway Access Control for ships", + "company": "LabelCraft AS", + "mad": "0x072F", + "service_provider": "LabelCraft AS", + "system_integrator": "LabelCraft AS" + }, + { + "application": "E-ticketing ID card", + "company": "Monet+ a.s.", + "mad": "0x0730", + "service_provider": "Monet+ a.s.", + "system_integrator": "Monet+ a.s." + }, + { + "application": "Europe", + "company": "Monet+ a.s.", + "mad": "0x0731", + "service_provider": "Monet+ a.s.", + "system_integrator": "Monet+ a.s." + }, + { + "application": "Identification card", + "company": "Monet+ a.s.", + "mad": "0x0732", + "service_provider": "Monet+ a.s.", + "system_integrator": "Monet+ a.s." + }, + { + "application": "Access control with point store systems for facility integration purpose", + "company": "Unicard S.A.", + "mad": "0x0733", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "Configuration, control and initialization", + "company": "INID BV", + "mad": "0x0734", + "service_provider": "INID", + "system_integrator": "INID" + }, + { + "application": "Public transport sytems. Parking systems. Catering. Electronic wallet. Reservation system. Access services. Attendance services. Industrial identification. City card.", + "company": "Duha systém s.r.o.", + "mad": "0x0735", + "service_provider": "DUHA systém s.r.o.", + "system_integrator": "DUHA systém s.r.o." + }, + { + "application": "Public transport sytems. Parking systems. Catering. Electronic wallet. Reservation system. Access services. Attendance services. Industrial identification. City card.", + "company": "Duha systém s.r.o.", + "mad": "0x0736", + "service_provider": "DUHA systém s.r.o.", + "system_integrator": "DUHA systém s.r.o." + }, + { + "application": "Public transport sytems. Parking systems. Catering. Electronic wallet. Reservation system. Access services. Attendance services. Industrial identification. City card.", + "company": "Duha systém s.r.o.", + "mad": "0x0737", + "service_provider": "DUHA systém s.r.o.", + "system_integrator": "DUHA systém s.r.o." + }, + { + "application": "Public transport sytems. Parking systems. Catering. Electronic wallet. Reservation system. Access services. Attendance services. Industrial identification. City card.", + "company": "Duha systém s.r.o.", + "mad": "0x0738", + "service_provider": "DUHA systém s.r.o.", + "system_integrator": "DUHA systém s.r.o." + }, + { + "application": "Customer profile", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x0739", + "service_provider": "Jamaica Urban Transit Company Ltd", + "system_integrator": "Mikroelektronika spol.s r.o." + }, + { + "application": "Card Holder Information", + "company": "BULL POLSKA Sp. z o.o.", + "mad": "0x073A", + "service_provider": "BULL POLSKA", + "system_integrator": "BULL POLSKA" + }, + { + "application": "PAAC transit services", + "company": "Scheidt & Bachmann GmbH", + "mad": "0x073B", + "service_provider": "Scheidt & Bachmann GmbH", + "system_integrator": "Scheidt & Bachmann GmbH" + }, + { + "application": "Customer loyalty", + "company": "K-Plus Oy", + "mad": "0x073C", + "service_provider": "K-Plus Oy", + "system_integrator": "" + }, + { + "application": "Customer loyalty", + "company": "K-Plus Oy", + "mad": "0x073D", + "service_provider": "K-Plus Oy", + "system_integrator": "" + }, + { + "application": "Customer loyalty", + "company": "K-Plus Oy", + "mad": "0x073E", + "service_provider": "K-Plus Oy", + "system_integrator": "" + }, + { + "application": "Bonus counter", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x073F", + "service_provider": "Jamaica Urban Transit Company Ltd", + "system_integrator": "Mikroelektronika spol.s r.o." + }, + { + "application": "Transaction log 2S", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x0740", + "service_provider": "Mikroelektronika spol.s r.o.", + "system_integrator": "Mikroelektronika spol.s r.o." + }, + { + "application": "JIS", + "company": "eko TIP ID s.r.o", + "mad": "0x0741", + "service_provider": "University of West Bohemia in Pilsen", + "system_integrator": "eko TIP ID s.r.o" + }, + { + "application": "Mobile Ticket/Picticket", + "company": "MATRIX Solutions GmbH & Co.KG", + "mad": "0x0742", + "service_provider": "MATRIX Solutions GmbH & Co.KG", + "system_integrator": "MATRIX Solutions GmbH & Co.KG" + }, + { + "application": "Miscellaneous applications", + "company": "OREDO s.r.o", + "mad": "0x0743", + "service_provider": "OREDO s.r.o", + "system_integrator": "OREDO s.r.o" + }, + { + "application": "Miscellaneous applications", + "company": "OREDO s.r.o", + "mad": "0x0744", + "service_provider": "OREDO s.r.o", + "system_integrator": "OREDO s.r.o" + }, + { + "application": "Miscellaneous applications", + "company": "OREDO s.r.o", + "mad": "0x0745", + "service_provider": "OREDO s.r.o", + "system_integrator": "OREDO s.r.o" + }, + { + "application": "Miscellaneous applications", + "company": "OREDO s.r.o", + "mad": "0x0746", + "service_provider": "OREDO s.r.o", + "system_integrator": "OREDO s.r.o" + }, + { + "application": "Miscellaneous applications", + "company": "OREDO s.r.o", + "mad": "0x0747", + "service_provider": "OREDO s.r.o", + "system_integrator": "OREDO s.r.o" + }, + { + "application": "Public Library User Identification", + "company": "Plasticard-ZFT GmbH", + "mad": "0x0748", + "service_provider": "Plasticard-ZFT GmbH", + "system_integrator": "Bibliotheca RFID Library Systems GmbH" + }, + { + "application": "Multiapplication", + "company": "IMA s.r.o.", + "mad": "0x0749", + "service_provider": "Ima Ltd", + "system_integrator": "" + }, + { + "application": "Supplementary information for other applications - bonus counters, logs", + "company": "TELMAX s.r.o.", + "mad": "0x074A", + "service_provider": "TELMAX s.r.o.", + "system_integrator": "TELMAX s.r.o." + }, + { + "application": "Cafeteria services", + "company": "Netlock Kft.", + "mad": "0x074B", + "service_provider": "Netlock Kft.", + "system_integrator": "Netlock Kft." + }, + { + "application": "Loyalty services", + "company": "Netlock Kft.", + "mad": "0x074C", + "service_provider": "Netlock Kft.", + "system_integrator": "Netlock Kft." + }, + { + "application": "Access control, miscellaneous applications", + "company": "TAGGER SYSTEMS Co Ltd", + "mad": "0x074D", + "service_provider": "TAGGER SYSTEMS Co Ltd", + "system_integrator": "" + }, + { + "application": "Fuel card for International Diesel Sevice", + "company": "Kuwait Petroleum Belgium", + "mad": "0x074E", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Fuel card for International Diesel Sevice", + "company": "Kuwait Petroleum Belgium", + "mad": "0x074F", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Fuel card for International Diesel Sevice", + "company": "Kuwait Petroleum Belgium", + "mad": "0x0750", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Identification for airline related services", + "company": "Lufthansa German Airlines", + "mad": "0x0801", + "service_provider": "Deutsche Lufthansa AG", + "system_integrator": "Deutsche Lufthansa AG" + }, + { + "application": "Airlines", + "company": "KLM-Royal Dutch Airlines", + "mad": "0x0803", + "service_provider": "KLM", + "system_integrator": "KLM" + }, + { + "application": "Ticketing for ferry trafic", + "company": "Pay Vend Solutions", + "mad": "0x0901", + "service_provider": "Payvend Solutions", + "system_integrator": "Payvend Solutions" + }, + { + "application": "Bus services with extension to rail and taxi", + "company": "Questek Marketing", + "mad": "0x1001", + "service_provider": "Questek Marketing", + "system_integrator": "Questek Marketing" + }, + { + "application": "Railway Transit in Moscow region", + "company": "Moscow Railway Federal State Unitary Enterprize", + "mad": "0x1003", + "service_provider": "Moscow railway", + "system_integrator": "Express Card" + }, + { + "application": "Fare collection", + "company": "Tehran Urban & Suburban Railway Co.", + "mad": "0x1004", + "service_provider": "Processing World Corp", + "system_integrator": "Processing World Corp" + }, + { + "application": "Fare collection", + "company": "Ascom", + "mad": "0x1005", + "service_provider": "TUSRC", + "system_integrator": "Ascom Monetel" + }, + { + "application": "Mass Transportation Ticketing", + "company": "Omnifare", + "mad": "0x1006", + "service_provider": "MBS", + "system_integrator": "MBS" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1007", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1008", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1009", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x100A", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x100B", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x100C", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x100D", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x100E", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x100F", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1010", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1011", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1012", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1013", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1014", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1015", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1016", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1017", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1018", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1019", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x101A", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x101B", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x101C", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x101D", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway pass, univers pass, library", + "company": "Emcard a.s.", + "mad": "0x101E", + "service_provider": "Emcard", + "system_integrator": "Emtest" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x101F", + "service_provider": "Zeleznicna Spolocnost", + "system_integrator": "Prosoft SPDL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x1020", + "service_provider": "Zeleznicna Spolocnost", + "system_integrator": "Prosoft SPDL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x1021", + "service_provider": "Zeleznicna Spolocnost", + "system_integrator": "Prosoft SPDL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x1022", + "service_provider": "Zeleznicna Spolocnost", + "system_integrator": "Prosoft SPDL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x1023", + "service_provider": "Zeleznicna Spolocnost", + "system_integrator": "Prosoft SPDL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x1024", + "service_provider": "Zeleznicna Spolocnost", + "system_integrator": "Prosoft SPDL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x1025", + "service_provider": "Zeleznicna Spolocnost", + "system_integrator": "Prosoft SPDL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x1026", + "service_provider": "Zeleznicna Spolocnost", + "system_integrator": "Prosoft SPDL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x1027", + "service_provider": "Zeleznicna", + "system_integrator": "Prosoft SPOL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x1028", + "service_provider": "Zeleznicna", + "system_integrator": "Prosoft SPOL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x1029", + "service_provider": "Zeleznicna", + "system_integrator": "Prosoft SPOL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x102A", + "service_provider": "Zeleznicna", + "system_integrator": "Prosoft SPOL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x102B", + "service_provider": "Zeleznicna", + "system_integrator": "Prosoft SPOL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x102C", + "service_provider": "Zeleznicna", + "system_integrator": "Prosoft SPOL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x102D", + "service_provider": "Zeleznicna", + "system_integrator": "Prosoft" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x102E", + "service_provider": "Zeleznicna", + "system_integrator": "Prosoft" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x102F", + "service_provider": "Zeleznicna", + "system_integrator": "Prosoft" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x1030", + "service_provider": "Zeleznicna", + "system_integrator": "Prosoft" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x1031", + "service_provider": "Zeleznicna", + "system_integrator": "Prosoft" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x1032", + "service_provider": "Zeleznicna", + "system_integrator": "Prosoft" + }, + { + "application": "Railway services, fare collection", + "company": "ODP-software s.r.o.", + "mad": "0x1033", + "service_provider": "ODP-software", + "system_integrator": "ODP-software" + }, + { + "application": "Railway services, fare collection", + "company": "ODP-software s.r.o.", + "mad": "0x1034", + "service_provider": "ODP-software", + "system_integrator": "ODP-software" + }, + { + "application": "Ticketing and reservation for Egyptian Railways", + "company": "ENR Egyptian National Railways", + "mad": "0x1035", + "service_provider": "ENR Egyptian National Railways", + "system_integrator": "TransIT- Transportation Information Technology system, Elsag Datamat" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x1103", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x1104", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Transport ticketing", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x1105", + "service_provider": "KOORDINATOR ODIS s.r.o.", + "system_integrator": "KOORDINATOR ODIS s.r.o." + }, + { + "application": "Transport ticketing", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x1106", + "service_provider": "KOORDINATOR ODIS s.r.o.", + "system_integrator": "KOORDINATOR ODIS s.r.o." + }, + { + "application": "Transport ticketing", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x1107", + "service_provider": "KOORDINATOR ODIS s.r.o.", + "system_integrator": "KOORDINATOR ODIS s.r.o." + }, + { + "application": "Miscellaneous applications", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x1108", + "service_provider": "KOORDINATOR ODIS s.r.o.", + "system_integrator": "KOORDINATOR ODIS s.r.o." + }, + { + "application": "Miscellaneous applications", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x1109", + "service_provider": "KOORDINATOR ODIS s.r.o.", + "system_integrator": "KOORDINATOR ODIS s.r.o." + }, + { + "application": "Miscellaneous applications", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x110A", + "service_provider": "KOORDINATOR ODIS s.r.o.", + "system_integrator": "KOORDINATOR ODIS s.r.o." + }, + { + "application": "Digital registration of attendance of persons", + "company": "Simac QUADCORE", + "mad": "0x110B", + "service_provider": "Simac QUADCORE B.V.", + "system_integrator": "Simac QUADCORE B.V." + }, + { + "application": "Transport ticketing", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x1201", + "service_provider": "KOORDINATOR ODIS s.r.o.", + "system_integrator": "KOORDINATOR ODIS s.r.o." + }, + { + "application": "Transport ticketing", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x1202", + "service_provider": "KOORDINATOR ODIS s.r.o.", + "system_integrator": "KOORDINATOR ODIS s.r.o." + }, + { + "application": "Transport ticketing", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x1203", + "service_provider": "KOORDINATOR ODIS s.r.o.", + "system_integrator": "KOORDINATOR ODIS s.r.o." + }, + { + "application": "ACS - Almex Card Scheme", + "company": "Höft & Wessel AG", + "mad": "0x1204", + "service_provider": "", + "system_integrator": "Höft & Wessel AG" + }, + { + "application": "Public transport ticket", + "company": "MENNICA POLSKA s.a.", + "mad": "0x1205", + "service_provider": "MPK LODZ", + "system_integrator": "MENNICA POLSKA s.a." + }, + { + "application": "Transport ticketing", + "company": "OREDO s.r.o", + "mad": "0x1206", + "service_provider": "OREDO s.r.o", + "system_integrator": "OREDO s.r.o" + }, + { + "application": "Transport ticketing", + "company": "OREDO s.r.o", + "mad": "0x1207", + "service_provider": "OREDO s.r.o", + "system_integrator": "OREDO s.r.o" + }, + { + "application": "Transport ticketing", + "company": "OREDO s.r.o", + "mad": "0x1208", + "service_provider": "OREDO s.r.o", + "system_integrator": "OREDO s.r.o" + }, + { + "application": "Transport ticketing", + "company": "Ústecky kraj", + "mad": "0x1209", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Transport ticketing", + "company": "Ústecky kraj", + "mad": "0x120A", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Transport ticketing", + "company": "Ústecky kraj", + "mad": "0x120B", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Public Transportation System ticketing e-wallet", + "company": "Ministry of Justice of Georgia", + "mad": "0x120C", + "service_provider": "Ministry of Justice of Georgia", + "system_integrator": "" + }, + { + "application": "Electronic tickets for public transpor", + "company": "TELMAX s.r.o.", + "mad": "0x120D", + "service_provider": "TELMAX s.r.o.", + "system_integrator": "TELMAX s.r.o." + }, + { + "application": "City transportation card for Subway, Bus & Minibus", + "company": "AzRy LLC", + "mad": "0x120E", + "service_provider": "Metro service LLC", + "system_integrator": "AzRy LLC" + }, + { + "application": "Interoperable fare management system for transport in Basque Country", + "company": "IDOM INGENIERIA Y CONSULTORIA", + "mad": "0x120F", + "service_provider": "Mugitu", + "system_integrator": "Mugitu" + }, + { + "application": "City Transport (Metro ticketing, bus ticket)", + "company": "VFJ Technology Pty Ltd", + "mad": "0x1801", + "service_provider": "VFJ Electronic Pty Ltd.", + "system_integrator": "Cubic - VFJ" + }, + { + "application": "Public transport fare collection", + "company": "Buscom Oy", + "mad": "0x1802", + "service_provider": "City of Vaasa", + "system_integrator": "Buscom" + }, + { + "application": "Busticketing System", + "company": "VFJ Technology Pty Ltd", + "mad": "0x1803", + "service_provider": "King Man County Public Traffic", + "system_integrator": "Barouh Electronic Co." + }, + { + "application": "Payment for transit by metro", + "company": "Moscow Metro", + "mad": "0x1808", + "service_provider": "Moscow Metro", + "system_integrator": "Express Card" + }, + { + "application": "Transit/public transport", + "company": "Rosan Finance", + "mad": "0x1809", + "service_provider": "Moscow street public transport org.", + "system_integrator": "Rosan Finance" + }, + { + "application": "Multiapplication car for industry & trafic, parking, swimming pool", + "company": "ASEC S.A.", + "mad": "0x180A", + "service_provider": "ASEC S.A", + "system_integrator": "ASEC S.A" + }, + { + "application": "Miscellaneous application, city traffic, access control & security, entertainment, car parking, electronic trade", + "company": "KFAP S.A.", + "mad": "0x180B", + "service_provider": "KFPA", + "system_integrator": "KFPA" + }, + { + "application": "Electronic purse, city traffic", + "company": "Plzeňské Městské Dopravní Podniky A.S.", + "mad": "0x180C", + "service_provider": "Plzenske Mestske", + "system_integrator": "Plzenske Mestske" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x180D", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x180E", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x180F", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x1810", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x1811", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x1812", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x1813", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x1814", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x1815", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x1816", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x1817", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x1818", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x1819", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Subway payment system", + "company": "LOT Ltd", + "mad": "0x181A", + "service_provider": "LOT", + "system_integrator": "LOT" + }, + { + "application": "Subway payment system", + "company": "LOT Ltd", + "mad": "0x181B", + "service_provider": "LOT", + "system_integrator": "LOT" + }, + { + "application": "City traffic, electronic purse, micellaneous applications", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x181C", + "service_provider": "Koordinator", + "system_integrator": "PVT" + }, + { + "application": "City traffic, electronic purse, micellaneous applications", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x181D", + "service_provider": "Koordinator", + "system_integrator": "PVT" + }, + { + "application": "Access control & security, city traffic, sports & entertainment", + "company": "IP Core", + "mad": "0x181F", + "service_provider": "IP Core", + "system_integrator": "IP Core" + }, + { + "application": "Electronic purse, car-parking system, single use ticket, period pass", + "company": "Emcard a.s.", + "mad": "0x1820", + "service_provider": "Emcard", + "system_integrator": "Emtest" + }, + { + "application": "Electronic purse, car-parking system, single use ticket, period pass", + "company": "Emcard a.s.", + "mad": "0x1821", + "service_provider": "Emcard", + "system_integrator": "Emtest" + }, + { + "application": "Liberec City Card - Public transport application", + "company": "Liberecká IS, a.s.", + "mad": "0x1822", + "service_provider": "Liberecká IS, a.s.", + "system_integrator": "Accenture Central Europe" + }, + { + "application": "Season ticket", + "company": "DOPRAVNI PODNIK mest Mostu a Litvinova, a.s.", + "mad": "0x1823", + "service_provider": "Dopravni Pdnik mest Mostu a Litvinova, a.s.", + "system_integrator": "Mikroelectronika, spol. sr. o., Kpt. Poplera 55, 565 01 Vysoké Mýto, CZ" + }, + { + "application": "Check in/out application", + "company": "DOPRAVNI PODNIK mest Mostu a Litvinova, a.s.", + "mad": "0x1824", + "service_provider": "Dopravni Podnik mest Mostu a Litvinova, a.s.", + "system_integrator": "Mikroelektronika, spol. sr.o., Kpt. Poplera 55, 565 01 Vysoké Mýto, CZ" + }, + { + "application": "Car Parking, Electronic Purse", + "company": "Haguess s.r.o.", + "mad": "0x1825", + "service_provider": "Haguess, s.r.o.", + "system_integrator": "Haguess, s.r.o." + }, + { + "application": "EFC-single-use ticket", + "company": "Emcard a.s.", + "mad": "0x1826", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "EFC period pass", + "company": "Emcard a.s.", + "mad": "0x1827", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "Liberec City Card - Season Pass Transport Tariffs", + "company": "Liberecká IS, a.s.", + "mad": "0x1828", + "service_provider": "Liberecká IS, a.s.", + "system_integrator": "Accenture Central Europe" + }, + { + "application": "Liberec City Card - Pre-pay Transport Tariffs", + "company": "Liberecká IS, a.s.", + "mad": "0x1829", + "service_provider": "Liberecká IS, a.s.", + "system_integrator": "Accenture Central Europe" + }, + { + "application": "Electronic purse, city traffic, customer profile, service applic, check-in/out applic", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x182A", + "service_provider": "Mikroelektronika", + "system_integrator": "Mikroelektronika" + }, + { + "application": "Prepaid ticket", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x182B", + "service_provider": "S.C. TRANSPORT PUBLICS A., Bacau, Romania", + "system_integrator": "MIKROELEKTRONIKA spol. s.r.i." + }, + { + "application": "Credit 2S", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x182C", + "service_provider": "Transmetro Guatemala", + "system_integrator": "SIEMENS Itron Business Services S.A. - Cordoba, Republica Argentina" + }, + { + "application": "Prepaid coupon 1S", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x182D", + "service_provider": "Transmetro Guatemala", + "system_integrator": "SIEMENS Itron Business services S.A. - Cordoba, Rep. Argentina" + }, + { + "application": "Prepaid ticket", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x182E", + "service_provider": "Panturist d.d., Croatia", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o., Vysoke Myto, Czech Republic" + }, + { + "application": "Prepaid coupon", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x182F", + "service_provider": "Mikroelektronika spol.s r.o.", + "system_integrator": "Mikroelektronika spol.s r.o." + }, + { + "application": "City traffic", + "company": "MENNICA POLSKA S.A.", + "mad": "0x1830", + "service_provider": "MENNICA POLSKA S.A.", + "system_integrator": "MENNICA POLSKA S.A." + }, + { + "application": "City traffic", + "company": "MENNICA POLSKA S.A.", + "mad": "0x1831", + "service_provider": "MENNICA POLSKA S.A.", + "system_integrator": "MENNICA POLSKA S.A." + }, + { + "application": "Prepaid coupon", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x1832", + "service_provider": "Mikroelektronika spol.s r.o.", + "system_integrator": "Mikroelektronika spol.s r.o." + }, + { + "application": "Prepaid coupon", + "company": "KORID LK, spol. s r.o", + "mad": "0x1834", + "service_provider": "KORID LK, spol.s.r.o.", + "system_integrator": "KORID LK, spol.s.r.o." + }, + { + "application": "Eticket", + "company": "KORID LK, spol. s r.o", + "mad": "0x1835", + "service_provider": "KORID LK, spol.s.r.o.", + "system_integrator": "KORID LK, spol.s.r.o." + }, + { + "application": "Prepaid coupon 1S", + "company": "Mikroelektronika GmbH", + "mad": "0x1836", + "service_provider": "MIKROELEKTRONIKA spol.s.r.o., Draby 849, Vysoke Myto 56601, Czech Republic", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o., Draby 849, Vysoke Myto 56601, Czech Republic" + }, + { + "application": "Prepaid coupon", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x1837", + "service_provider": "ZAGREBACKI Holding d.o.o.", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o." + }, + { + "application": "Prepaid coupon", + "company": "Mikroelektronika GmbH", + "mad": "0x1838", + "service_provider": "MIKROELEKTRONIKA spol.s.r.o.", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o." + }, + { + "application": "Prepaid coupon", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x1839", + "service_provider": "Mikroelektronika spol.s r.o", + "system_integrator": "Mikroelektronika spol.s r.o" + }, + { + "application": "City traffic services - ticket control, city card for Polish municipal services", + "company": "Unicard S.A.", + "mad": "0x183B", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "City traffic services - ticket control, city card for Polish municipal services", + "company": "Unicard S.A.", + "mad": "0x183C", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "City traffic services - ticket control, city card for Polish municipal services", + "company": "Unicard S.A.", + "mad": "0x183D", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "City traffic services - ticket control, city card for Polish municipal services", + "company": "Unicard S.A.", + "mad": "0x183E", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "Public transportation", + "company": "OY MATKAHUOLTO AB", + "mad": "0x183F", + "service_provider": "OY MATKAHUOLTO AB", + "system_integrator": "OY MATKAHUOLTO AB" + }, + { + "application": "Public transportation", + "company": "OY MATKAHUOLTO AB", + "mad": "0x1840", + "service_provider": "OY MATKAHUOLTO AB", + "system_integrator": "OY MATKAHUOLTO AB" + }, + { + "application": "City traffic, prepaid ticket, check in/out", + "company": "ODP-software s.r.o.", + "mad": "0x1841", + "service_provider": "ODP-software", + "system_integrator": "ODP-software" + }, + { + "application": "City traffic, prepaid ticket, check in/out", + "company": "ODP-software s.r.o.", + "mad": "0x1842", + "service_provider": "ODP-software", + "system_integrator": "ODP-software" + }, + { + "application": "Car authentication for telematics", + "company": "NXP Semiconductors", + "mad": "0x1843", + "service_provider": "NXP Semiconductors", + "system_integrator": "NXP Semiconductors" + }, + { + "application": "Public transport ticketing services", + "company": "Netlock Ltd", + "mad": "0x1844", + "service_provider": "Netlock Kft.", + "system_integrator": "Netlock Kft." + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1903", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1904", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Bus fare collection", + "company": "Ascom Monétel", + "mad": "0x2001", + "service_provider": "C.T.A.V.", + "system_integrator": "Monétel S.A." + }, + { + "application": "Bus fare collection", + "company": "Ascom Monétel", + "mad": "0x2002", + "service_provider": "Conseil Général du TARN", + "system_integrator": "Ascom Monétel" + }, + { + "application": "Bus service, ÖPNV", + "company": "Scheidt & Bachmann", + "mad": "0x2003", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Bus service, ÖPNV", + "company": "Scheidt & Bachmann", + "mad": "0x2004", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Bus Fare Collection", + "company": "Ascom Monétel", + "mad": "0x2005", + "service_provider": "Forbus Intercity", + "system_integrator": "Ascom Monétel S.A." + }, + { + "application": "Public transport", + "company": "Scan Coin AB", + "mad": "0x2006", + "service_provider": "Scan Coin AB", + "system_integrator": "" + }, + { + "application": "Ticketing system for public transport in Sweden, used primarily on buses", + "company": "CPT Nordic AB", + "mad": "0x2007", + "service_provider": "Country traffic in Sweden", + "system_integrator": "CPI Nordic AB" + }, + { + "application": "Bus Fare collection", + "company": "Ascom Monétel", + "mad": "0x2008", + "service_provider": "Setrans P", + "system_integrator": "As om Monetél SA" + }, + { + "application": "Automatic Fare Collection city and intercity bus traffic electronic purse", + "company": "Trgovina in Informatika d.o.o.", + "mad": "0x2009", + "service_provider": "Fourth Way - Alpetour", + "system_integrator": "Fourth Way" + }, + { + "application": "", + "company": "Reserved for MAD", + "mad": "0x200A", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Transport Ticketing, E-Purse, Citycard", + "company": "CJS Consultancy Ltd", + "mad": "0x200B", + "service_provider": "", + "system_integrator": "Transmo Citycard Ltd." + }, + { + "application": "Bus fare collection", + "company": "Ascom Monétel", + "mad": "0x200C", + "service_provider": "Maybus", + "system_integrator": "Ascom Monetel" + }, + { + "application": "Bus services with extension to rail and taxi", + "company": "Questek Marketing", + "mad": "0x200D", + "service_provider": "Questek Marketing", + "system_integrator": "Questek Marketing" + }, + { + "application": "Bus fare colection", + "company": "Ascom Monétel", + "mad": "0x200E", + "service_provider": "Oestfold", + "system_integrator": "Ascom Monétel" + }, + { + "application": "Bus Fare Collection", + "company": "Ascom Monétel", + "mad": "0x200F", + "service_provider": "SATAR", + "system_integrator": "Ascom Monetel S.A." + }, + { + "application": "Bus Fare Collection", + "company": "Ascom Monétel", + "mad": "0x2010", + "service_provider": "Atam Arezzo", + "system_integrator": "Ascom Monetel - SA" + }, + { + "application": "Collect fare system for transit authority", + "company": "Soprin ADS", + "mad": "0x2011", + "service_provider": "Soprin ADS - Ascom Monetel", + "system_integrator": "Soprin ADS" + }, + { + "application": "Busticketing System", + "company": "VFJ Technology Pty Ltd", + "mad": "0x2012", + "service_provider": "King Man County Public Traffic", + "system_integrator": "Barouh Electronic Co." + }, + { + "application": "Bus, Tramway, Underground Services", + "company": "Ascom Monétel", + "mad": "0x2013", + "service_provider": "ZTM (Transport Company of Marsaw)", + "system_integrator": "Ascom Monetel (porject leader Mr. Pascal Valette)" + }, + { + "application": "Electronic transportation voucher", + "company": "GRUPO VR", + "mad": "0x2014", + "service_provider": "Grupo VR", + "system_integrator": "" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x2015", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x2016", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x2017", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x2018", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x2019", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x201A", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x201B", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x201C", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x201D", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x201E", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x201F", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x2020", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x2021", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x2022", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x2023", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Bus & tramway fare collection", + "company": "Ascom", + "mad": "0x2030", + "service_provider": "SMTU - Montpellier", + "system_integrator": "Ascom Monétel" + }, + { + "application": "City transport bus, ferry, administration", + "company": "VFJ Technology Pty Ltd", + "mad": "0x2031", + "service_provider": "VFJ Technology", + "system_integrator": "Cubic - VFJ" + }, + { + "application": "Bus fare collection", + "company": "Ascom Monétel", + "mad": "0x2032", + "service_provider": "", + "system_integrator": "Ascom Monétel" + }, + { + "application": "Bus fare collection", + "company": "Ascom Monétel", + "mad": "0x2035", + "service_provider": "TCL", + "system_integrator": "Ascom Monétel" + }, + { + "application": "Bus Fare Collection", + "company": "Ascom Monétel", + "mad": "0x2036", + "service_provider": "TCL", + "system_integrator": "Ascom Monétel" + }, + { + "application": "Bus fare collection", + "company": "Ascom", + "mad": "0x2037", + "service_provider": "Tarragone (Spain)", + "system_integrator": "Ascom Monétel" + }, + { + "application": "Bus fare collection", + "company": "Ascom", + "mad": "0x2038", + "service_provider": "Tarragone (Spain)", + "system_integrator": "Ascom Monétel" + }, + { + "application": "Bus fare collection", + "company": "Ascom", + "mad": "0x2039", + "service_provider": "Tarragone (Spain)", + "system_integrator": "Ascom Monétel" + }, + { + "application": "Bus fare collection", + "company": "Ascom", + "mad": "0x203A", + "service_provider": "Tarragone (Spain)", + "system_integrator": "Ascom Monétel" + }, + { + "application": "Bus fare collection", + "company": "Ascom", + "mad": "0x203F", + "service_provider": "Salineira Ltda", + "system_integrator": "Ascom Monetel" + }, + { + "application": "Bus Fare Collection", + "company": "Ascom Monétel", + "mad": "0x2040", + "service_provider": "Ascom Monétel", + "system_integrator": "Ascom Monétel" + }, + { + "application": "Bus Fare Collection", + "company": "Ascom Monétel", + "mad": "0x2041", + "service_provider": "Ascom Monétel", + "system_integrator": "Ascom Meonétel" + }, + { + "application": "Bus Fare Collection", + "company": "Ascom Monétel", + "mad": "0x2042", + "service_provider": "Ascom Monétel", + "system_integrator": "Ascom Monétel" + }, + { + "application": "Bus Fare Collection", + "company": "Ascom Monétel", + "mad": "0x2043", + "service_provider": "Systas", + "system_integrator": "Ascom Monétel" + }, + { + "application": "Bus Fare Collection", + "company": "Ascom Monétel", + "mad": "0x2044", + "service_provider": "Systas", + "system_integrator": "Ascom Moétel" + }, + { + "application": "Access control, time attendance, bus ticket, hotel room card, VIP card f. club", + "company": "Giga-TMS Inc", + "mad": "0x2045", + "service_provider": "Giga TMS", + "system_integrator": "Giga TMS" + }, + { + "application": "Bus fare collection", + "company": "Ascom", + "mad": "0x2046", + "service_provider": "Burulas", + "system_integrator": "Burulas" + }, + { + "application": "Mass Transportation Ticketing", + "company": "Omnifare", + "mad": "0x2047", + "service_provider": "MBS", + "system_integrator": "MBS" + }, + { + "application": "Bus fare collection", + "company": "Ascom", + "mad": "0x2048", + "service_provider": "Eskisehir", + "system_integrator": "EAS" + }, + { + "application": "Bus fare collection", + "company": "Ascom", + "mad": "0x2049", + "service_provider": "Metro Ciudad Mexico", + "system_integrator": "Ascom" + }, + { + "application": "Elec ticketing, access control, electronic purse", + "company": "Empresa 1 Sistemas de Automacao e Comercio", + "mad": "0x204D", + "service_provider": "Empresa 1", + "system_integrator": "Empresa 1" + }, + { + "application": "City card, prepaid ticket, cardholder, servicespass", + "company": "Emcard a.s.", + "mad": "0x204E", + "service_provider": "Emcard", + "system_integrator": "Emtest" + }, + { + "application": "Fidelity, student, period pass, single-use ticket", + "company": "Emcard a.s.", + "mad": "0x204F", + "service_provider": "emcard", + "system_integrator": "emtest" + }, + { + "application": "Fidelity, student, period pass, single-use ticket", + "company": "Emcard a.s.", + "mad": "0x2050", + "service_provider": "emcard", + "system_integrator": "emtest" + }, + { + "application": "Fidelity, student, period pass, single-use ticket", + "company": "Emcard a.s.", + "mad": "0x2051", + "service_provider": "emcard", + "system_integrator": "emtest" + }, + { + "application": "Fidelity, student, period pass, single-use ticket", + "company": "Emcard a.s.", + "mad": "0x2052", + "service_provider": "emcard", + "system_integrator": "emtest" + }, + { + "application": "Bus, Underground", + "company": "ACS - Affiliated Computer Services", + "mad": "0x2053", + "service_provider": "Tisseo", + "system_integrator": "ACS" + }, + { + "application": "Bus Fare Collection", + "company": "A.C.S. SAS France", + "mad": "0x2054", + "service_provider": "ACS", + "system_integrator": "MetropolitanTransitAuthority of Harris Country" + }, + { + "application": "Public Transport Fare Collection", + "company": "Dublin Bus", + "mad": "0x2055", + "service_provider": "Dublin Bus", + "system_integrator": "Dublin Bus" + }, + { + "application": "Fidelity pass", + "company": "Emcard a.s.", + "mad": "0x2056", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "Service pass", + "company": "Emcard a.s.", + "mad": "0x2057", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "EFC-single-use ticket", + "company": "Emcard a.s.", + "mad": "0x2058", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "EFC-time ticket", + "company": "Emcard a.s.", + "mad": "0x2059", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "Bus Ticketing", + "company": "Krauth Technology", + "mad": "0x205A", + "service_provider": "Prof.A.Krauth Apparatebau", + "system_integrator": "Prof.A.Krauth Apparatebau" + }, + { + "application": "Transit SmartCard System, City E-purse System", + "company": "Intelligent Transaction Systems de Mexico S.A. de C.V.", + "mad": "0x205B", + "service_provider": "St. John's Transportation Commission", + "system_integrator": "Intelligent Transaction Systems de Mexico" + }, + { + "application": "Bus fare collection system", + "company": "PENTA d.o.o.", + "mad": "0x205C", + "service_provider": "PENTA", + "system_integrator": "PENTA" + }, + { + "application": "Bus fare collection system", + "company": "PENTA d.o.o.", + "mad": "0x205D", + "service_provider": "PENTA", + "system_integrator": "PENTA" + }, + { + "application": "Bus fare collection system", + "company": "PENTA d.o.o.", + "mad": "0x205E", + "service_provider": "PENTA", + "system_integrator": "PENTA" + }, + { + "application": "Bus e-ticketing system for different provinces of Iran", + "company": "Processing World Co.", + "mad": "0x205F", + "service_provider": "Processing world co.", + "system_integrator": "Processing world co." + }, + { + "application": "Bus", + "company": "ACS - Affiliated Computer Services", + "mad": "0x2060", + "service_provider": "ACS", + "system_integrator": "ACS" + }, + { + "application": "Electronic ticket", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x2061", + "service_provider": "Mikroelektronika spol.s r.o.", + "system_integrator": "Mikroelektronika spol.s r.o." + }, + { + "application": "Electronic tiicket", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x2062", + "service_provider": "ZAGREBACKI Holding d.o.o.", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o" + }, + { + "application": "Electronic ticket", + "company": "Mikroelektronika GmbH", + "mad": "0x2063", + "service_provider": "MIKROELEKTRONIKA spol.s.r.o.", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o." + }, + { + "application": "BUS", + "company": "ACS - Affiliated Computer Services", + "mad": "0x2064", + "service_provider": "ACS", + "system_integrator": "ACS" + }, + { + "application": "Transit ridership", + "company": "FARE Logistics", + "mad": "0x2065", + "service_provider": "", + "system_integrator": "Fare Logistics" + }, + { + "application": "BUS FARE COLLECTION", + "company": "ACS - Affiliated Computer Services", + "mad": "0x2066", + "service_provider": "BRESCIATRASPORTI", + "system_integrator": "ACS" + }, + { + "application": "Bus", + "company": "ACS - Affiliated Computer Services", + "mad": "0x2067", + "service_provider": "ACS", + "system_integrator": "ACS" + }, + { + "application": "Electronic ticket", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x2068", + "service_provider": "Jamaica Urban Transit Company Ltd", + "system_integrator": "Mikroelektronika spol.s r.o." + }, + { + "application": "Electronic couponticket for public transport", + "company": "BULL POLSKA Sp. z o.o.", + "mad": "0x2069", + "service_provider": "BULL POLSKA", + "system_integrator": "BULL POLSKA" + }, + { + "application": "Electronic ticket for public transport", + "company": "BULL POLSKA Sp. z o.o.", + "mad": "0x206A", + "service_provider": "BULL POLSKA", + "system_integrator": "BULL POLSKA" + }, + { + "application": "Bus Rail Fare Collection", + "company": "ACS - Affiliated Computer Services", + "mad": "0x206B", + "service_provider": "DTEI", + "system_integrator": "ACS" + }, + { + "application": "Bus", + "company": "ACS - Affiliated Computer Services", + "mad": "0x206C", + "service_provider": "STO", + "system_integrator": "ACS" + }, + { + "application": "Bus services, bus fare collection", + "company": "ODP-software s.r.o.", + "mad": "0x206D", + "service_provider": "ODP-software", + "system_integrator": "ODP-software" + }, + { + "application": "Bus services, bus fare collection", + "company": "ODP-software s.r.o.", + "mad": "0x206E", + "service_provider": "ODP-software", + "system_integrator": "ODP-software" + }, + { + "application": "Automatic Fare Collection System", + "company": "ACS Solution France", + "mad": "0x206F", + "service_provider": "Briansk", + "system_integrator": "ACS" + }, + { + "application": "Bus fare collection", + "company": "ACS - Affiliated Computer Services", + "mad": "0x2070", + "service_provider": "DOT", + "system_integrator": "ACS" + }, + { + "application": "Bus", + "company": "Xerox", + "mad": "0x2071", + "service_provider": "SEMITAN", + "system_integrator": "TAN" + }, + { + "application": "Card Touch Smart Card Applications", + "company": "Touch Technology International Inc.", + "mad": "0x2101", + "service_provider": "Touch Technology International", + "system_integrator": "Touch Technology International" + }, + { + "application": "Transport Ticketing", + "company": "Ascom", + "mad": "0x2102", + "service_provider": "SBME Milano", + "system_integrator": "A.I.I." + }, + { + "application": "Multi-Modal Transit", + "company": "ERG Transit Systems", + "mad": "0x2103", + "service_provider": "ERG Transit Systems", + "system_integrator": "ERG Transit Systems" + }, + { + "application": "Multi-Modal Transit", + "company": "ERG Transit Systems", + "mad": "0x2104", + "service_provider": "ERG Transit Systems", + "system_integrator": "ERG Transit Systems" + }, + { + "application": "Mass Transportation Ticketing", + "company": "Omnifare", + "mad": "0x2108", + "service_provider": "MBS", + "system_integrator": "MBS" + }, + { + "application": "Pre-paid bus card, passanger ID bus card", + "company": "Intelligent Transaction Systems de Mexico S.A. de C.V.", + "mad": "0x2109", + "service_provider": "Intelligent Transaction", + "system_integrator": "Intelligent Transcation" + }, + { + "application": "Pre-paid bus card, passanger ID bus card", + "company": "Intelligent Transaction Systems de Mexico S.A. de C.V.", + "mad": "0x210A", + "service_provider": "Intelligent Transaction", + "system_integrator": "Intelligent Transcation" + }, + { + "application": "Pre-paid bus card, passanger ID bus card", + "company": "Intelligent Transaction Systems de Mexico S.A. de C.V.", + "mad": "0x210B", + "service_provider": "Intelligent Transaction", + "system_integrator": "Intelligent Transcation" + }, + { + "application": "City card, prepaid ticket, cardholder, servicespass", + "company": "Emcard a.s.", + "mad": "0x210C", + "service_provider": "Emcard", + "system_integrator": "Emtest" + }, + { + "application": "City card, prepaid ticket, cardholder, servicespass", + "company": "Emcard a.s.", + "mad": "0x210D", + "service_provider": "Emcard", + "system_integrator": "Emtest" + }, + { + "application": "Integrated multi-modal transport ticketing system", + "company": "Keane Australia PTY Limited", + "mad": "0x210F", + "service_provider": "TTA", + "system_integrator": "KAMCO" + }, + { + "application": "Integrated multi-modal transport ticketing system", + "company": "Keane Australia PTY Limited", + "mad": "0x2110", + "service_provider": "TTA", + "system_integrator": "KAMCO" + }, + { + "application": "Card holder", + "company": "Emcard a.s.", + "mad": "0x2111", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "Prepaid ticket", + "company": "Emcard a.s.", + "mad": "0x2112", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "Electronic purse, city traffic, customer profile, service applic, check-in/out applic", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x2113", + "service_provider": "Mikroelektronika", + "system_integrator": "Mikroelektronika" + }, + { + "application": "Electronic ticketing for city of Friedrichshafen", + "company": "T-Systems GEI GmbH", + "mad": "0x2114", + "service_provider": "T-Systems GEI", + "system_integrator": "T-Systems GEI" + }, + { + "application": "Transportation ticket", + "company": "Haguess s.r.o.", + "mad": "0x2115", + "service_provider": "HAGUESS, a.s.", + "system_integrator": "HAGUESS, a.s" + }, + { + "application": "Bus and rail fare collection", + "company": "ACS - Affiliated Computer Services", + "mad": "0x2116", + "service_provider": "GCRTA", + "system_integrator": "ACS" + }, + { + "application": "Prepaid coupon - prepaid ticket for multimodal transport", + "company": "CSAD SVT Praha", + "mad": "0x2117", + "service_provider": "", + "system_integrator": "Mikroelektronika, EMTEST" + }, + { + "application": "Epurse - electronic purse intended for payment of fare in multimodal public transport", + "company": "CSAD SVT Praha", + "mad": "0x2118", + "service_provider": "", + "system_integrator": "Mikroelektronika, EMTEST" + }, + { + "application": "Automatic fare payment system for multi-modal transit", + "company": "Cubic Corporation", + "mad": "0x2119", + "service_provider": "", + "system_integrator": "Cubic Transportation Systems" + }, + { + "application": "Public transport smartcard integrated ticketing scheme for the Republic of Ireland", + "company": "Railway Procurement Agency", + "mad": "0x211A", + "service_provider": "Dublin Bus, Irish Rail, Bus Eireann, private-bus-operators", + "system_integrator": "RPA" + }, + { + "application": "General Ticketing Solution for Mas Transit", + "company": "Parkeon", + "mad": "0x211B", + "service_provider": "PARKEON", + "system_integrator": "PARKEON" + }, + { + "application": "General Ticketing Solution for Mas Transit", + "company": "Parkeon", + "mad": "0x211C", + "service_provider": "PARKEON", + "system_integrator": "PARKEON" + }, + { + "application": "Multi-modal Transit", + "company": "Västra Götalandsregionen", + "mad": "0x211D", + "service_provider": "Västtrafik AB", + "system_integrator": "Vix ERG" + }, + { + "application": "Transport application", + "company": "Unicard Limited UK", + "mad": "0x211E", + "service_provider": "Unicard Limited", + "system_integrator": "Unicard Limited" + }, + { + "application": "Transit fare collection, transit purse, transit ID", + "company": "GFI Genfare", + "mad": "0x211F", + "service_provider": "", + "system_integrator": "GFI Genfare, an SPX Division" + }, + { + "application": "Transit fare collection, transit purse, transit ID", + "company": "GFI Genfare", + "mad": "0x2120", + "service_provider": "", + "system_integrator": "GFI Genfare, an SPX Division" + }, + { + "application": "Transit fare collection, transit purse, transit ID", + "company": "GFI Genfare", + "mad": "0x2121", + "service_provider": "", + "system_integrator": "GFI Genfare, an SPX Division" + }, + { + "application": "Bus and rail fare collection", + "company": "ACS - Affiliated Computer Services", + "mad": "0x2122", + "service_provider": "RTD", + "system_integrator": "ACS" + }, + { + "application": "Bus services with extension to rail and taxi", + "company": "Questek Marketing", + "mad": "0x2801", + "service_provider": "Questek Marketing", + "system_integrator": "Questek Marketing" + }, + { + "application": "Mass Transportation Ticketing", + "company": "Omnifare", + "mad": "0x2803", + "service_provider": "MBS", + "system_integrator": "MBS" + }, + { + "application": "Tollway system", + "company": "VFJ Technology Pty Ltd", + "mad": "0x3001", + "service_provider": "VFJ Technology Pty Ltd", + "system_integrator": "Chendu Shuguang Optical Fibre Network (Ltd. China)" + }, + { + "application": "Tollway system", + "company": "VFJ Technology Pty Ltd", + "mad": "0x3002", + "service_provider": "VFJ Technology Pty Ltd", + "system_integrator": "Chendu Shuguang Optical Fibre Network (Ltd. China)" + }, + { + "application": "Toll collection", + "company": "Philips Projects", + "mad": "0x3003", + "service_provider": "Concepa (Concecionaria da Rodovia Oso Rio - Porto Alegre)", + "system_integrator": "Philips Projects Brazil" + }, + { + "application": "Toll collection", + "company": "Philips Projects", + "mad": "0x3004", + "service_provider": "Concepa (Concecionaria da Rodovia Oso Rio - Porto Alegre)", + "system_integrator": "Philips Projects Brazil" + }, + { + "application": "Toll collection", + "company": "Philips Projects", + "mad": "0x3005", + "service_provider": "Concepa (Concecionaria da Rodovia Oso Rio - Porto Alegre)", + "system_integrator": "Philips Projects Brazil" + }, + { + "application": "Toll collection", + "company": "Philips Projects", + "mad": "0x3006", + "service_provider": "Concepa (Concecionaria da Rodovia Oso Rio - Porto Alegre)", + "system_integrator": "Philips Projects Brazil" + }, + { + "application": "Toll collection", + "company": "Philips Projects", + "mad": "0x3007", + "service_provider": "Concepa (Concecionaria da Rodovia Oso Rio - Porto Alegre)", + "system_integrator": "Philips Projects Brazil" + }, + { + "application": "Road Tolling Application", + "company": "EFKON AG", + "mad": "0x3008", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Tolling Application", + "company": "EFKON AG", + "mad": "0x3009", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Tolling Application", + "company": "EFKON AG", + "mad": "0x300A", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Tolling Application", + "company": "EFKON AG", + "mad": "0x300B", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Tolling Application", + "company": "EFKON AG", + "mad": "0x300C", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Tolling Application", + "company": "EFKON AG", + "mad": "0x300D", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road toll application", + "company": "EFKON AG", + "mad": "0x300E", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Tollway", + "company": "VFJ Technology Pty Ltd", + "mad": "0x300F", + "service_provider": "VFJ HK", + "system_integrator": "" + }, + { + "application": "Tollway", + "company": "VFJ Technology Pty Ltd", + "mad": "0x3010", + "service_provider": "Xiamto Lintong Tollway", + "system_integrator": "" + }, + { + "application": "Tollway", + "company": "VFJ Technology Pty Ltd", + "mad": "0x3011", + "service_provider": "Xiamto Lintong Tollway", + "system_integrator": "" + }, + { + "application": "Tollway", + "company": "VFJ Technology Pty Ltd", + "mad": "0x3012", + "service_provider": "Xiamto Lintong Tollway", + "system_integrator": "" + }, + { + "application": "Tollway", + "company": "VFJ Technology Pty Ltd", + "mad": "0x3013", + "service_provider": "Xiamto Lintong Tollway", + "system_integrator": "" + }, + { + "application": "Tollway", + "company": "VFJ Technology Pty Ltd", + "mad": "0x3014", + "service_provider": "Austream", + "system_integrator": "Austream" + }, + { + "application": "Road toll application", + "company": "EFKON AG", + "mad": "0x3015", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Road toll application", + "company": "EFKON AG", + "mad": "0x3016", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Road toll application", + "company": "EFKON AG", + "mad": "0x3017", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Road toll application", + "company": "EFKON AG", + "mad": "0x3018", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Road toll application", + "company": "EFKON AG", + "mad": "0x3019", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Road toll application", + "company": "EFKON AG", + "mad": "0x301A", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x301B", + "service_provider": "Efkon", + "system_integrator": "Philips Projects" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x301C", + "service_provider": "Efkon", + "system_integrator": "Philips Projects" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x301D", + "service_provider": "Efkon", + "system_integrator": "Philips Projects" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x301E", + "service_provider": "Efkon", + "system_integrator": "Philips Projects" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x301F", + "service_provider": "Efkon", + "system_integrator": "Philips Projects" + }, + { + "application": "Weighbridge for trucks", + "company": "VFJ Technology Pty Ltd", + "mad": "0x3020", + "service_provider": "Hardware Systems Sales", + "system_integrator": "" + }, + { + "application": "Road toll", + "company": "EFKON AG", + "mad": "0x3021", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Road toll", + "company": "EFKON AG", + "mad": "0x3022", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Road toll", + "company": "EFKON AG", + "mad": "0x3023", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Road toll", + "company": "EFKON AG", + "mad": "0x3024", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Road toll", + "company": "EFKON AG", + "mad": "0x3025", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Road toll", + "company": "EFKON AG", + "mad": "0x3026", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Road toll", + "company": "EFKON AG", + "mad": "0x3027", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Road Toll", + "company": "EFKON AG", + "mad": "0x3028", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Toll", + "company": "EFKON AG", + "mad": "0x3029", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Toll", + "company": "EFKON AG", + "mad": "0x302A", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Toll", + "company": "EFKON AG", + "mad": "0x302B", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Toll", + "company": "EFKON AG", + "mad": "0x302C", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road toll", + "company": "EFKON AG", + "mad": "0x302D", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Road toll", + "company": "EFKON AG", + "mad": "0x302E", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Road toll", + "company": "EFKON AG", + "mad": "0x302F", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Road toll", + "company": "EFKON AG", + "mad": "0x3030", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Road toll", + "company": "EFKON AG", + "mad": "0x3031", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x3032", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x3033", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x3034", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x3035", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x3036", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x3037", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x3038", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x3039", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x303A", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x303B", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x303C", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Road Toll Application", + "company": "Compsis Comp. Sist. Ind. Com. LTDA", + "mad": "0x303E", + "service_provider": "Compsis", + "system_integrator": "Compsis" + }, + { + "application": "Road Toll Application", + "company": "Compsis Comp. Sist. Ind. Com. LTDA", + "mad": "0x303F", + "service_provider": "Compsis", + "system_integrator": "Compsis" + }, + { + "application": "Road Toll Application", + "company": "Compsis Comp. Sist. Ind. Com. LTDA", + "mad": "0x3040", + "service_provider": "Compsis", + "system_integrator": "Compsis" + }, + { + "application": "Road Toll Application", + "company": "Compsis Comp. Sist. Ind. Com. LTDA", + "mad": "0x3041", + "service_provider": "Compsis", + "system_integrator": "Compsis" + }, + { + "application": "Road Toll Application", + "company": "Compsis Comp. Sist. Ind. Com. LTDA", + "mad": "0x3042", + "service_provider": "Compsis", + "system_integrator": "Compsis" + }, + { + "application": "Road Toll", + "company": "EFKON AG", + "mad": "0x3043", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Toll", + "company": "EFKON AG", + "mad": "0x3046", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Toll", + "company": "EFKON AG", + "mad": "0x3047", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Toll payment", + "company": "GPS Tecnologia Ltda.", + "mad": "0x3048", + "service_provider": "GPS", + "system_integrator": "GPS" + }, + { + "application": "Electronic toll collection", + "company": "Cetrta Pot d.o.o.", + "mad": "0x3049", + "service_provider": "Dars d.d.", + "system_integrator": "Cetrta POT d.o.o." + }, + { + "application": "Road toll", + "company": "Diners Club Adriatic d.d.", + "mad": "0x305A", + "service_provider": "Diners Club", + "system_integrator": "Diners Club" + }, + { + "application": "Road toll", + "company": "Diners Club Adriatic d.d.", + "mad": "0x305B", + "service_provider": "Diners Club", + "system_integrator": "Diners Club" + }, + { + "application": "Intelligent Transport Services", + "company": "EFKON AG", + "mad": "0x3102", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Intelligent Transport Services", + "company": "EFKON AG", + "mad": "0x3103", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Intelligent Transport Services", + "company": "EFKON AG", + "mad": "0x3104", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Intelligent Transport Services", + "company": "EFKON AG", + "mad": "0x3105", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Intelligent Transport Services", + "company": "EFKON AG", + "mad": "0x3106", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Intelligent Transport Services", + "company": "EFKON AG", + "mad": "0x3107", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Intelligent Transport Services", + "company": "EFKON AG", + "mad": "0x3108", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Intelligent Transport Services", + "company": "EFKON AG", + "mad": "0x3109", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Intelligent Transport Services", + "company": "EFKON AG", + "mad": "0x310A", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Intelligent Transport Services", + "company": "EFKON AG", + "mad": "0x310B", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Stored value card payment system", + "company": "GiroVend Cashless Systems PLC", + "mad": "0x3801", + "service_provider": "GiroVend", + "system_integrator": "GiroVend" + }, + { + "application": "Card Administratin, cardholder adminstration, access control & security, company services, miscellaneous applications", + "company": "Ministry of Defense", + "mad": "0x3802", + "service_provider": "Ministry of Defence", + "system_integrator": "" + }, + { + "application": "Company Payment System, Company Facility Services, Company Identification Services", + "company": "Maas Systems B.V.", + "mad": "0x3803", + "service_provider": "Maas Systems B.V.", + "system_integrator": "Mass Systems B.V." + }, + { + "application": "Company Payment System, Company Facility Services, Company Identification Services", + "company": "Maas Systems B.V.", + "mad": "0x3804", + "service_provider": "Maas Systems B.V.", + "system_integrator": "Mass Systems B.V." + }, + { + "application": "Company Payment System, Company Facility Services, Company Identification Services", + "company": "Maas Systems B.V.", + "mad": "0x3805", + "service_provider": "Maas Systems B.V.", + "system_integrator": "Mass Systems B.V." + }, + { + "application": "Access control, company service", + "company": "Automaten Seitz GmbH", + "mad": "0x3807", + "service_provider": "Automaten Seitz", + "system_integrator": "Automaten Seitz" + }, + { + "application": "Access controll security payment", + "company": "Matsushita Communication Industrial", + "mad": "0x3808", + "service_provider": "Matsushita Communication", + "system_integrator": "Matsushita Communication" + }, + { + "application": "Multi functional badge, private application", + "company": "Microtronic AG", + "mad": "0x3809", + "service_provider": "Microtronic AG", + "system_integrator": "Microtronic AG" + }, + { + "application": "", + "company": "InterCard GmbH Kartensysteme", + "mad": "0x380A", + "service_provider": "Inter Card GmbH", + "system_integrator": "Inter Card GmbH" + }, + { + "application": "", + "company": "InterCard GmbH Kartensysteme", + "mad": "0x380B", + "service_provider": "Inter Card GmbH", + "system_integrator": "Inter Card GmbH" + }, + { + "application": "", + "company": "InterCard GmbH Kartensysteme", + "mad": "0x380C", + "service_provider": "Inter Card GmbH", + "system_integrator": "Inter Card GmbH" + }, + { + "application": "Identification service", + "company": "Pink Roccade", + "mad": "0x380D", + "service_provider": "Pink Roccade", + "system_integrator": "Pink Roccade" + }, + { + "application": "Multiapplication car for industry & trafic, parking, swimming pool", + "company": "ASEC S.A.", + "mad": "0x380E", + "service_provider": "ASEC S.A", + "system_integrator": "ASEC S.A" + }, + { + "application": "Payment and registration system", + "company": "Magna Carta B.U.", + "mad": "0x380F", + "service_provider": "Magna Carta", + "system_integrator": "Magna Carta" + }, + { + "application": "Identification service", + "company": "Pink Roccade", + "mad": "0x3810", + "service_provider": "Pink Roccade", + "system_integrator": "Pink Roccade" + }, + { + "application": "Company Facility Service", + "company": "Deister Electronic", + "mad": "0x3811", + "service_provider": "Deister Electronic GmbH", + "system_integrator": "Deister Electronic GmbH" + }, + { + "application": "Company Facility Service", + "company": "Deister Electronic", + "mad": "0x3812", + "service_provider": "Deister Electronic GmbH", + "system_integrator": "Deister Electronic GmbH" + }, + { + "application": "Multi functional badge for private application", + "company": "Microtronic AG", + "mad": "0x3813", + "service_provider": "Microtronic", + "system_integrator": "Microtronic" + }, + { + "application": "Multi functional badge for private application", + "company": "Microtronic AG", + "mad": "0x3814", + "service_provider": "Microtronic", + "system_integrator": "Microtronic" + }, + { + "application": "Multi functional badge for private application", + "company": "Microtronic AG", + "mad": "0x3815", + "service_provider": "Microtronic", + "system_integrator": "Microtronic" + }, + { + "application": "Multi functional badge for private application", + "company": "Microtronic AG", + "mad": "0x3816", + "service_provider": "Microtronic", + "system_integrator": "Microtronic" + }, + { + "application": "Multi functional badge for private application", + "company": "Microtronic AG", + "mad": "0x3817", + "service_provider": "Microtronic", + "system_integrator": "Microtronic" + }, + { + "application": "Multi functional badge for private application", + "company": "Microtronic AG", + "mad": "0x3818", + "service_provider": "Microtronic", + "system_integrator": "Microtronic" + }, + { + "application": "Multi functional badge for private application", + "company": "Microtronic AG", + "mad": "0x3819", + "service_provider": "Microtronic", + "system_integrator": "Microtronic" + }, + { + "application": "Cashless payment and others", + "company": "GPI GmbH", + "mad": "0x3827", + "service_provider": "GPI GmbH", + "system_integrator": "GPI GmbH" + }, + { + "application": "Company services", + "company": "Deutsche Lufthansa AG FFM", + "mad": "0x3828", + "service_provider": "Deutsche Lufthansa AG", + "system_integrator": "Deutsche Lufthansa AG" + }, + { + "application": "Access control, time management, electronic wallet", + "company": "Universitaire Ziekenhuizen Leuven", + "mad": "0x3829", + "service_provider": "", + "system_integrator": "GET NV" + }, + { + "application": "Company services", + "company": "Card3 GmbH", + "mad": "0x382A", + "service_provider": "Card3 GmbH", + "system_integrator": "Card3 GmbH" + }, + { + "application": "Computer, car parking, elec. purse, access control & security", + "company": "DECA Engineering", + "mad": "0x382B", + "service_provider": "Deca Engineering", + "system_integrator": "Deca Engineering" + }, + { + "application": "", + "company": "Horoquartz Gestion des Temps", + "mad": "0x382C", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "", + "company": "Horoquartz Gestion des Temps", + "mad": "0x382D", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "", + "company": "Horoquartz Gestion des Temps", + "mad": "0x382E", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "", + "company": "Horoquartz Gestion des Temps", + "mad": "0x382F", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "", + "company": "Horoquartz Gestion des Temps", + "mad": "0x3830", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "Road toll", + "company": "Diners Club Adriatic d.d.", + "mad": "0x3831", + "service_provider": "Diners Club", + "system_integrator": "Diners Club" + }, + { + "application": "Company services, access & sec control, electronic purse...", + "company": "Cominfo a.s.", + "mad": "0x3832", + "service_provider": "Cominfo", + "system_integrator": "Cominfo" + }, + { + "application": "Company services", + "company": "Cash Card Automaten GmbH", + "mad": "0x3833", + "service_provider": "Cash Card", + "system_integrator": "Cash Card" + }, + { + "application": "Access control, computer application, company services", + "company": "Volvo Car Corporation", + "mad": "0x3834", + "service_provider": "Volvo Car", + "system_integrator": "Volvo Car" + }, + { + "application": "Time attendnace, fuel, access control", + "company": "Emcard a.s.", + "mad": "0x3835", + "service_provider": "Emtest", + "system_integrator": "Emtest" + }, + { + "application": "Company services", + "company": "Emcard a.s.", + "mad": "0x3836", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "Multiple Company Services", + "company": "Viessmann Werke GmbH & Co KG", + "mad": "0x3837", + "service_provider": "Viessmann Werke", + "system_integrator": "Viessmann Werke" + }, + { + "application": "E.purse", + "company": "GTI", + "mad": "0x3839", + "service_provider": "Mr. Eric Houri", + "system_integrator": "Mr. Francois Bodard" + }, + { + "application": "Company services", + "company": "MENNICA POLSKA S.A.", + "mad": "0x383A", + "service_provider": "MENNICA POLSKA S.A.", + "system_integrator": "MENNICA POLSKA S.A." + }, + { + "application": "Company Services", + "company": "Scheidt & Bachmann GmbH", + "mad": "0x383B", + "service_provider": "Scheidt & Bachmann GmbH", + "system_integrator": "Scheidt & Bachmann GmbH" + }, + { + "application": "", + "company": "Reac BV", + "mad": "0x383C", + "service_provider": "", + "system_integrator": "REAC" + }, + { + "application": "Follow me printing system", + "company": "N.V. EPZ", + "mad": "0x383D", + "service_provider": "EPZ", + "system_integrator": "Xerox Corporation" + }, + { + "application": "Registration of received radiation dose in nuclear power plant", + "company": "N.V. EPZ", + "mad": "0x383E", + "service_provider": "EPZ", + "system_integrator": "Mirion Technologies/MGP" + }, + { + "application": "Access control, identification", + "company": "Swedish Social Isurance Agency", + "mad": "0x383F", + "service_provider": "Swedish Social Isurance Agency", + "system_integrator": "Swedish Social Isurance Agency" + }, + { + "application": "Payment and registration", + "company": "PAYCULT GMBH", + "mad": "0x3840", + "service_provider": "PAYCULT", + "system_integrator": "PAYCULT" + }, + { + "application": "City transport bus, ferry, administration", + "company": "VFJ Technology Pty Ltd", + "mad": "0x4001", + "service_provider": "VFJ Technology", + "system_integrator": "Cubic - VFJ" + }, + { + "application": "Transport Ticketing, E-Purse, Citycard", + "company": "CJS Consultancy Ltd", + "mad": "0x4002", + "service_provider": "", + "system_integrator": "Transmo Citycard Ltd." + }, + { + "application": "Combined application for access control, ferry and rail ticketing for the Island of Langegeoog", + "company": "Companion GmbH", + "mad": "0x4003", + "service_provider": "Companion GmbH", + "system_integrator": "Companion GmbH, Krups Consultants GmbH, Gemplus GmbH" + }, + { + "application": "User needs and preference", + "company": "University of Newcastle", + "mad": "0x4004", + "service_provider": "Distinct", + "system_integrator": "University of Newcastle" + }, + { + "application": "User needs and preference", + "company": "University of Newcastle", + "mad": "0x4005", + "service_provider": "Distinct", + "system_integrator": "University of Newcastle" + }, + { + "application": "User needs and preference", + "company": "University of Newcastle", + "mad": "0x4006", + "service_provider": "Distinct", + "system_integrator": "University of Newcastle" + }, + { + "application": "User needs and preference", + "company": "University of Newcastle", + "mad": "0x4007", + "service_provider": "Distinct", + "system_integrator": "University of Newcastle" + }, + { + "application": "User needs and preference", + "company": "University of Newcastle", + "mad": "0x4008", + "service_provider": "Distinct", + "system_integrator": "University of Newcastle" + }, + { + "application": "City card services", + "company": "Rosan Finance", + "mad": "0x4009", + "service_provider": "Retail Trade and Services in Moscow", + "system_integrator": "Express card" + }, + { + "application": "City card services", + "company": "Moscow Government Department For Retail Trade and Services", + "mad": "0x400B", + "service_provider": "Retail Trade and Service", + "system_integrator": "Express Card" + }, + { + "application": "Identification of cardholder", + "company": "Rosan Finance", + "mad": "0x400C", + "service_provider": "Retail Trade and Services", + "system_integrator": "Rosan Finance" + }, + { + "application": "Mass Transportation Ticketing", + "company": "Omnifare", + "mad": "0x400D", + "service_provider": "MBS", + "system_integrator": "MBS" + }, + { + "application": "Access control", + "company": "Connex Solutions Limited", + "mad": "0x400E", + "service_provider": "Connex", + "system_integrator": "Connex" + }, + { + "application": "Acess Control, Time and Attendance", + "company": "Milenio 3 Systemas Electonicos", + "mad": "0x400F", + "service_provider": "Milenio3", + "system_integrator": "Milenio3" + }, + { + "application": "City card services", + "company": "Axess AG", + "mad": "0x4010", + "service_provider": "Axess", + "system_integrator": "Axess" + }, + { + "application": "Provision of citizen services", + "company": "UK National Smartcard Project", + "mad": "0x4011", + "service_provider": "English Local Authorities", + "system_integrator": "" + }, + { + "application": "Provision of citizen services", + "company": "UK National Smartcard Project", + "mad": "0x4012", + "service_provider": "English Local Authorities", + "system_integrator": "" + }, + { + "application": "Provision of citizen services", + "company": "UK National Smartcard Project", + "mad": "0x4013", + "service_provider": "English Local Authorities", + "system_integrator": "" + }, + { + "application": "City card, prepaid ticket, cardholder, servicespass", + "company": "Emcard a.s.", + "mad": "0x4014", + "service_provider": "Emcard", + "system_integrator": "Emtest" + }, + { + "application": "Liberec City Car, Card manag center", + "company": "Liberecká IS, a.s.", + "mad": "0x4015", + "service_provider": "Liberecka", + "system_integrator": "Accenture Central Europe" + }, + { + "application": "City Card Services", + "company": "Centro Informatico Municipal", + "mad": "0x4016", + "service_provider": "Donostiako Udala/Ayuntamiento de San Sebastian", + "system_integrator": "Centro Informatico Municipal" + }, + { + "application": "City Card Services", + "company": "Centro Informatico Municipal", + "mad": "0x4017", + "service_provider": "Donostiako Udala/Ayuntamiento de San Sebastian", + "system_integrator": "Centro Informatico Municipal" + }, + { + "application": "City Card Services", + "company": "Centro Informatico Municipal", + "mad": "0x4018", + "service_provider": "Donostiako Udala/Ayuntamiento de San Sebastian", + "system_integrator": "Centro Informatico Municipal" + }, + { + "application": "City Card Services", + "company": "Centro Informatico Municipal", + "mad": "0x4019", + "service_provider": "Donostiako Udala/Ayuntamiento de San Sebastian", + "system_integrator": "Centro Informatico Municipal" + }, + { + "application": "City Card Services", + "company": "Centro Informatico Municipal", + "mad": "0x401A", + "service_provider": "Donostiako Udala/Ayuntamiento de San Sebastian", + "system_integrator": "Centro Informatico Municipal" + }, + { + "application": "City Card Services", + "company": "Centro Informatico Municipal", + "mad": "0x401B", + "service_provider": "Donostiako Udala/Ayuntamiento de San Sebastian", + "system_integrator": "Centro Informatico Municipal" + }, + { + "application": "City Card Services", + "company": "Centro Informatico Municipal", + "mad": "0x401C", + "service_provider": "Donostiako Udala/Ayuntamiento de San Sebastian", + "system_integrator": "Centro Informatico Municipal" + }, + { + "application": "City Card Services", + "company": "Centro Informatico Municipal", + "mad": "0x401D", + "service_provider": "Donostiako Udala/Ayuntamiento de San Sebastian", + "system_integrator": "Centro Informatico Municipal" + }, + { + "application": "City Card Services", + "company": "Centro Informatico Municipal", + "mad": "0x401E", + "service_provider": "Donostiako Udala/Ayuntamiento de San Sebastian", + "system_integrator": "Centro Informatico Municipal" + }, + { + "application": "City Card Services", + "company": "Centro Informatico Municipal", + "mad": "0x401F", + "service_provider": "Donostiako Udala/Ayuntamiento de San Sebastian", + "system_integrator": "Centro Informatico Municipal" + }, + { + "application": "City card", + "company": "Emcard a.s.", + "mad": "0x4020", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "Programa Informatico para Fidelazcion Clientes", + "company": "LAI Sistemas Informaticos S.L.", + "mad": "0x4021", + "service_provider": "LAI Sistemas Informaticos S.L.", + "system_integrator": "Luis Maria Ortiz Gorraiz" + }, + { + "application": "Programa Informatico para Fidelazcion Clientes", + "company": "LAI Sistemas Informaticos S.L.", + "mad": "0x4022", + "service_provider": "LAI Sistemas Informaticos S.L.", + "system_integrator": "Luis Maria Ortiz Gorraiz" + }, + { + "application": "Programa Informatico para Fidelazcion Clientes", + "company": "LAI Sistemas Informaticos S.L.", + "mad": "0x4023", + "service_provider": "LAI Sistemas Informaticos S.L.", + "system_integrator": "Luis Maria Ortiz Gorraiz" + }, + { + "application": "Programa Informatico para Fidelazcion Clientes", + "company": "LAI Sistemas Informaticos S.L.", + "mad": "0x4024", + "service_provider": "LAI Sistemas Informaticos S.L.", + "system_integrator": "Luis Maria Ortiz Gorraiz" + }, + { + "application": "Programa Informatico para Fidelazcion Clientes", + "company": "LAI Sistemas Informaticos S.L.", + "mad": "0x4025", + "service_provider": "LAI Sistemas Informaticos S.L.", + "system_integrator": "Luis Maria Ortiz Gorraiz" + }, + { + "application": "City card services", + "company": "Monet+ a.s.", + "mad": "0x4026", + "service_provider": "MONET+, a.s.", + "system_integrator": "MONET+, a.s." + }, + { + "application": "Fare collection & access control", + "company": "Pusatec Oy", + "mad": "0x4027", + "service_provider": "PUSATEC", + "system_integrator": "PUSATEC" + }, + { + "application": "Security management; card management; access control", + "company": "NISCAYAH B.V.", + "mad": "0x4028", + "service_provider": "NISCAYAH", + "system_integrator": "NISCAYAH" + }, + { + "application": "Security management; card management; access control", + "company": "NISCAYAH B.V.", + "mad": "0x4029", + "service_provider": "NISCAYAH", + "system_integrator": "NISCAYAH" + }, + { + "application": "City card services", + "company": "Gantner Electronic GmbH", + "mad": "0x402A", + "service_provider": "GANTNER Electronic", + "system_integrator": "GANTNER Electronic" + }, + { + "application": "National ID Card for Bogota City", + "company": "Bogota Distrito Capital", + "mad": "0x402B", + "service_provider": "Tarjeta Ciudadana Bogota Capital - TCBC", + "system_integrator": "SMARTCHIP S.A." + }, + { + "application": "City card services", + "company": "SIT Solution for IT Payment GmbH", + "mad": "0x402C", + "service_provider": "SIT Solution for IT Payment GmbH", + "system_integrator": "SIT Solution for IT Payment GmbH" + }, + { + "application": "Access control, Time attendanc, job control", + "company": "EM Group", + "mad": "0x4701", + "service_provider": "EM Group", + "system_integrator": "EM Group" + }, + { + "application": "Access control", + "company": "One Security PTY Ltd", + "mad": "0x4702", + "service_provider": "One Security", + "system_integrator": "One Security" + }, + { + "application": "Access control & security, entertainment and sports", + "company": "Giga-TMS Inc", + "mad": "0x4703", + "service_provider": "Giga", + "system_integrator": "Giga" + }, + { + "application": "Various Access Control Applications", + "company": "Honeywell Access Systems", + "mad": "0x4707", + "service_provider": "", + "system_integrator": "HAS - Reston, VA; HAS - Oak Creek; HAS - Austin Texas" + }, + { + "application": "Various Access Control Applications", + "company": "Honeywell Access Systems", + "mad": "0x4708", + "service_provider": "", + "system_integrator": "HAS - Reston, VA; HAS - Oak Creek; HAS - Austin Texas" + }, + { + "application": "Various Access Control Applications", + "company": "Honeywell Access Systems", + "mad": "0x4709", + "service_provider": "", + "system_integrator": "HAS - Reston, VA; HAS - Oak Creek; HAS - Austin Texas" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x470A", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x470B", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x470C", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x470D", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x470E", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x470F", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x4710", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x4711", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x4712", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x4713", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x4714", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x4715", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x4716", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x4717", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x4718", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x4719", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x471A", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x471B", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x471C", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x471D", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x471E", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x471F", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x4720", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x4721", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x4722", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Application COBALT access control ", + "company": "TECHNICOB", + "mad": "0x4723", + "service_provider": "TECHNICOB", + "system_integrator": "TECHNICOB" + }, + { + "application": "Access control, benefits", + "company": "Ústecky kraj", + "mad": "0x4724", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Access control", + "company": "ASCOM", + "mad": "0x4725", + "service_provider": "ASCOM", + "system_integrator": "ASCOM" + }, + { + "application": "Lockers, access control and switch system integration", + "company": "ENKOA System", + "mad": "0x4726", + "service_provider": "Enkoa", + "system_integrator": "Juan Cruz Iriondo" + }, + { + "application": "Lockers, access control and switch system integration", + "company": "ENKOA System", + "mad": "0x4727", + "service_provider": "Enkoa", + "system_integrator": "Juan Cruz Iriondo" + }, + { + "application": "Lockers, access control and switch system integration", + "company": "ENKOA System", + "mad": "0x4728", + "service_provider": "Enkoa", + "system_integrator": "Juan Cruz Iriondo" + }, + { + "application": "Trade fair card Deutsche Messe AG, Hannover", + "company": "Systemform GmbH", + "mad": "0x4801", + "service_provider": "Systemform", + "system_integrator": "Systemform" + }, + { + "application": "Scheidt & Bachmann basis dutes", + "company": "Scheidt & Bachmann", + "mad": "0x4802", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Scheidt & Bachmann basis dutes", + "company": "Scheidt & Bachmann", + "mad": "0x4803", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Scheidt & Bachmann basis dutes", + "company": "Scheidt & Bachmann", + "mad": "0x4804", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Access control & security time management", + "company": "Gelma", + "mad": "0x4805", + "service_provider": "Gelma Industrieelektronik GmbH", + "system_integrator": "" + }, + { + "application": "", + "company": "Systemform GmbH", + "mad": "0x4806", + "service_provider": "Systemform", + "system_integrator": "Systemform" + }, + { + "application": "Zutritt, Zeit- u. Betriebsdatenerfassung", + "company": "Interflex Datensysteme GmbH", + "mad": "0x4807", + "service_provider": "", + "system_integrator": "Interflex Datensysteme GmbH" + }, + { + "application": "Employer indentification card", + "company": "VFJ Technology Pty Ltd", + "mad": "0x4808", + "service_provider": "VFJ Electronics Pty Ltd.", + "system_integrator": "VFJ Electronics PTy Ltd." + }, + { + "application": "City Transport (Metro ticketing, bus ticket)", + "company": "VFJ Technology Pty Ltd", + "mad": "0x4809", + "service_provider": "VFJ Electronic Pty Ltd.", + "system_integrator": "Cubic - VFJ" + }, + { + "application": "Access control & security", + "company": "Ing. Büro Schrick", + "mad": "0x480A", + "service_provider": "Büro Schrick", + "system_integrator": "Büro Schrick" + }, + { + "application": "Michronos Time Attendance System", + "company": "MICOS GmbH", + "mad": "0x480B", + "service_provider": "Micos GmbH", + "system_integrator": "Micos GmbH" + }, + { + "application": "Access control system", + "company": "MICOS GmbH", + "mad": "0x480C", + "service_provider": "Micos", + "system_integrator": "Micos" + }, + { + "application": "Access Controll, Security Electronic Purse, Ski-Ticketing, Ticketing", + "company": "*Siemens ANL", + "mad": "0x480D", + "service_provider": "", + "system_integrator": "Siemens AG" + }, + { + "application": "Card Administratin, cardholder adminstration, access control & security, company services, miscellaneous applications", + "company": "Ministry of Defense", + "mad": "0x480E", + "service_provider": "Ministry of Defence", + "system_integrator": "" + }, + { + "application": "Academic Services, Electronic Purse, Access control & security", + "company": "CNA Limited/Rax-Comm Systems Ltd.", + "mad": "0x480F", + "service_provider": "CNA Limited", + "system_integrator": "CNA Limited" + }, + { + "application": "Time attandence, access control + security, electronic purse, plant data collection", + "company": "LNI Ingenieurgesellschaft für Kommunikationstechnik mbH", + "mad": "0x4810", + "service_provider": "LNI GmbH", + "system_integrator": "LNI GmbH" + }, + { + "application": "Security and Access Control", + "company": "PEC (New Zealand) Ltd.", + "mad": "0x4811", + "service_provider": "Cardax", + "system_integrator": "" + }, + { + "application": "Security and Access Control", + "company": "PEC (New Zealand) Ltd.", + "mad": "0x4812", + "service_provider": "Cardax", + "system_integrator": "" + }, + { + "application": "University & Staff identification", + "company": "VFJ Technology Pty Ltd", + "mad": "0x4813", + "service_provider": "VFJ Hong Kong", + "system_integrator": "" + }, + { + "application": "University & Staff identification", + "company": "VFJ Technology Pty Ltd", + "mad": "0x4814", + "service_provider": "VFJ Hong Kong", + "system_integrator": "" + }, + { + "application": "University & Staff identification", + "company": "VFJ Technology Pty Ltd", + "mad": "0x4815", + "service_provider": "VFJ Hong Kong", + "system_integrator": "" + }, + { + "application": "University & Staff identification", + "company": "VFJ Technology Pty Ltd", + "mad": "0x4816", + "service_provider": "VFJ Hong Kong", + "system_integrator": "" + }, + { + "application": "University & Staff identification", + "company": "VFJ Technology Pty Ltd", + "mad": "0x4817", + "service_provider": "VFJ Hong Kong", + "system_integrator": "" + }, + { + "application": "University & Staff identification", + "company": "VFJ Technology Pty Ltd", + "mad": "0x4818", + "service_provider": "VFJ Hong Kong", + "system_integrator": "" + }, + { + "application": "University & Staff identification", + "company": "VFJ Technology Pty Ltd", + "mad": "0x4819", + "service_provider": "VFJ Hong Kong", + "system_integrator": "" + }, + { + "application": "", + "company": "Reserved for MAD", + "mad": "0x481A", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Access control/security", + "company": "VFJ Technology Pty Ltd", + "mad": "0x481B", + "service_provider": "Taiwan Microcode Co Ltd.", + "system_integrator": "Taiwan Microcode Co Ltd." + }, + { + "application": "Access control/security", + "company": "VFJ Technology Pty Ltd", + "mad": "0x481C", + "service_provider": "Taiwan Microcode Co Ltd.", + "system_integrator": "Taiwan Microcode Co Ltd." + }, + { + "application": "DEM Komponenten für Zutrittskontrolle, Zeiterfassung, Betribsdatenerfassung, Kantine, Automaten, Tankdatenerf.", + "company": "Phg Peter Hengstler GmbH", + "mad": "0x481D", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "OEM-Komponenten für Zutrittskontrolle, Zeiterfassung, elektr. Geldbörse,...", + "company": "Peter Hengstler GmbH + Co KG", + "mad": "0x481E", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "OEM-Komponenten für Zutrittskontrolle, Zeiterfassung, elektr. Geldbörse,...", + "company": "Peter Hengstler GmbH + Co KG", + "mad": "0x481F", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "OEM-Komponenten für Zutrittskontrolle, Zeiterfassung, elektr. Geldbörse,...", + "company": "Peter Hengstler GmbH + Co KG", + "mad": "0x4820", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "OEM-Komponenten für Zutrittskontrolle, Zeiterfassung, elektr. Geldbörse,...", + "company": "Peter Hengstler GmbH + Co KG", + "mad": "0x4821", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "OEM-Komponenten für Zutrittskontrolle, Zeiterfassung, elektr. Geldbörse,...", + "company": "Peter Hengstler GmbH + Co KG", + "mad": "0x4822", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Access control, time management, high security, time attendence", + "company": "Winkhaus Intras Datensysteme GmbH", + "mad": "0x4823", + "service_provider": "Winkhaus Intras Datensysteme GmbH", + "system_integrator": "Winkhaus Intras Datensysteme GmbH" + }, + { + "application": "Access control system, time & attendance system", + "company": "Custom Micro Products Ltd.", + "mad": "0x4824", + "service_provider": "Custom Micro Products Ltd", + "system_integrator": "Custom Micro Products Ltd" + }, + { + "application": "Acess Control", + "company": "CYNAPS", + "mad": "0x4825", + "service_provider": "Cynaps", + "system_integrator": "" + }, + { + "application": "Access control and time managemnet", + "company": "Primion Technology GmbH", + "mad": "0x4826", + "service_provider": "BEL Computer Systems GmbH", + "system_integrator": "BEL Computer Systems GmbH" + }, + { + "application": "Access control and time managemnet", + "company": "Primion Technology GmbH", + "mad": "0x4827", + "service_provider": "BEL Computer Systems GmbH", + "system_integrator": "BEL Computer Systems GmbH" + }, + { + "application": "Access control and time managemnet", + "company": "Primion Technology GmbH", + "mad": "0x4828", + "service_provider": "BEL Computer Systems GmbH", + "system_integrator": "BEL Computer Systems GmbH" + }, + { + "application": "Access control and time managemnet", + "company": "Primion Technology GmbH", + "mad": "0x4829", + "service_provider": "BEL Computer Systems GmbH", + "system_integrator": "BEL Computer Systems GmbH" + }, + { + "application": "Access Control, Time and Attendance, Paid parking, cards and tags", + "company": "Integrated Engineering", + "mad": "0x482A", + "service_provider": "Intesraten Engineering, IE Keyprocessor", + "system_integrator": "IE Keyprocessor" + }, + { + "application": "Access Control", + "company": "Deister Electronic", + "mad": "0x482B", + "service_provider": "Deister Electronic GmbH", + "system_integrator": "Deister Electronic GmbH" + }, + { + "application": "Zutrittskontrolle, Zeiterfassung", + "company": "ZHS Zeitmanagementsysteme GmbH", + "mad": "0x482C", + "service_provider": "", + "system_integrator": "ZHS" + }, + { + "application": "Various", + "company": "BALTECH AG", + "mad": "0x482D", + "service_provider": "PCS GmbH", + "system_integrator": "PCS GmbH, Baltech AG" + }, + { + "application": "Access Control", + "company": "Deister Electronic", + "mad": "0x482E", + "service_provider": "Deister Electronic GmbH", + "system_integrator": "Deister Electronic GmbH" + }, + { + "application": "Access Control & Time Attendence", + "company": "Gelma", + "mad": "0x482F", + "service_provider": "MBB Gelma Industrieelektronik GmbH", + "system_integrator": "MBB Gelma" + }, + { + "application": "Building Management System", + "company": "VFJ Technology Pty Ltd", + "mad": "0x4830", + "service_provider": "VFJ Hong Kong", + "system_integrator": "VFJ Hong Kong" + }, + { + "application": "Combined application for access control, ferry and rail ticketing for the Island of Langegeoog", + "company": "Companion GmbH", + "mad": "0x4831", + "service_provider": "Companion GmbH", + "system_integrator": "Companion GmbH, Krups Consultants GmbH, Gemplus GmbH" + }, + { + "application": "Access control & Security", + "company": "MADA Marx Datentechnik GmbH", + "mad": "0x4832", + "service_provider": "MADA", + "system_integrator": "MADA" + }, + { + "application": "Access Control, time attendance", + "company": "Saubermacher Dienstleistungs GmbH", + "mad": "0x4833", + "service_provider": "AZS Technology AG", + "system_integrator": "AZS Technology AG" + }, + { + "application": "Access control", + "company": "Deister Electronic", + "mad": "0x4834", + "service_provider": "deister electronic GmbH", + "system_integrator": "deister electronic GmbH" + }, + { + "application": "Access control", + "company": "Deister Electronic", + "mad": "0x4835", + "service_provider": "deister electronic GmbH", + "system_integrator": "deister electronic GmbH" + }, + { + "application": "Access control", + "company": "Deister Electronic", + "mad": "0x4836", + "service_provider": "deister electronic GmbH", + "system_integrator": "deister electronic GmbH" + }, + { + "application": "Access control, time & attendance systems", + "company": "Cotag International", + "mad": "0x4837", + "service_provider": "Bewator Cotag Ltd", + "system_integrator": "Bewator Cotag Ltd" + }, + { + "application": "XSkey providing secure access in Rottermdam harbour", + "company": "Secure Logistics", + "mad": "0x4838", + "service_provider": "Secure Logistics", + "system_integrator": "Secure Logistics" + }, + { + "application": "Access control, time attendance, bus ticket, hotel room card, VIP card f. club", + "company": "Giga-TMS Inc", + "mad": "0x4839", + "service_provider": "Giga TMS", + "system_integrator": "Giga TMS" + }, + { + "application": "Access contr, time & attendance, multifunc card", + "company": "Horoquartz Gestion des Temps", + "mad": "0x4840", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "Access controll", + "company": "GRUPO VR", + "mad": "0x4841", + "service_provider": "Grupo VR", + "system_integrator": "" + }, + { + "application": "Access control & security", + "company": "Tyco Integrated Systems B.V.", + "mad": "0x4842", + "service_provider": "Tyco Integrated Systems", + "system_integrator": "Tyco Integrated Systems" + }, + { + "application": "Access controll & security", + "company": "Hi Sec International A/S", + "mad": "0x4843", + "service_provider": "", + "system_integrator": "Hi Sec International A/S" + }, + { + "application": "Access Control, Time & Attendance, E-Purse", + "company": "BALTECH AG", + "mad": "0x4844", + "service_provider": "Baltech", + "system_integrator": "Baltech" + }, + { + "application": "Access Control, Time & Attendance, E-Purse", + "company": "BALTECH AG", + "mad": "0x4845", + "service_provider": "Baltech", + "system_integrator": "Baltech" + }, + { + "application": "Access Control, Time & Attendance, E-Purse", + "company": "BALTECH AG", + "mad": "0x4846", + "service_provider": "Baltech", + "system_integrator": "Baltech" + }, + { + "application": "Access Control, Time & Attendance, E-Purse", + "company": "BALTECH AG", + "mad": "0x4847", + "service_provider": "Baltech", + "system_integrator": "Baltech" + }, + { + "application": "Access Control, Time & Attendance, E-Purse", + "company": "BALTECH AG", + "mad": "0x4848", + "service_provider": "Baltech", + "system_integrator": "Baltech" + }, + { + "application": "Access Control, Time & Attendance, E-Purse", + "company": "BALTECH AG", + "mad": "0x4849", + "service_provider": "Baltech", + "system_integrator": "Baltech" + }, + { + "application": "Access control, payment system", + "company": "Maas Systems B.V.", + "mad": "0x484A", + "service_provider": "Maas Systems B.V.", + "system_integrator": "Maas Systems B.V." + }, + { + "application": "Access control & security", + "company": "BOSCH Telecom GmbH", + "mad": "0x484B", + "service_provider": "Bosch Telecom", + "system_integrator": "Bosch Telecom" + }, + { + "application": "Biometric - access controll & security", + "company": "BOSCH Telecom GmbH", + "mad": "0x484C", + "service_provider": "Bosch Telecom", + "system_integrator": "Bosch Telecom" + }, + { + "application": "Access Control", + "company": "HID Global", + "mad": "0x484D", + "service_provider": "HID Corporation", + "system_integrator": "HID Corporation" + }, + { + "application": "Access Control", + "company": "HID Global", + "mad": "0x484E", + "service_provider": "HID Corporation", + "system_integrator": "HID Corporation" + }, + { + "application": "Access control & security", + "company": "AIE Etudes", + "mad": "0x484F", + "service_provider": "AIE - ID", + "system_integrator": "AIE Etudes" + }, + { + "application": "Access control & security", + "company": "AIE Etudes", + "mad": "0x4850", + "service_provider": "AIE - ID", + "system_integrator": "AIE Etudes" + }, + { + "application": "Access control, company service", + "company": "Automaten Seitz GmbH", + "mad": "0x4851", + "service_provider": "Automaten Seitz", + "system_integrator": "Automaten Seitz" + }, + { + "application": "Access control and securitiy", + "company": "Hitachi Information Technology Co. Ltd.", + "mad": "0x4852", + "service_provider": "Hitachi Information", + "system_integrator": "Hitachi Information" + }, + { + "application": "Access control", + "company": "Petroleos Mexicanos", + "mad": "0x4853", + "service_provider": "Intraproc de Mexico", + "system_integrator": "" + }, + { + "application": "Access controll security payment", + "company": "Matsushita Communication Industrial", + "mad": "0x4854", + "service_provider": "Matsushita Communication", + "system_integrator": "Matsushita Communication" + }, + { + "application": "Storing Resident Info Access Control", + "company": "ITE Smartcard Solutions Limited", + "mad": "0x4855", + "service_provider": "ITE Smartcard", + "system_integrator": "ITE Smartcard" + }, + { + "application": "Storing Resident Info Access Control", + "company": "ITE Smartcard Solutions Limited", + "mad": "0x4856", + "service_provider": "ITE Smartcard", + "system_integrator": "ITE Smartcard" + }, + { + "application": "Access control biometric reader", + "company": "Precise Biometrics AB", + "mad": "0x4857", + "service_provider": "Precise Biometrics AB", + "system_integrator": "Precise Biometrics AB" + }, + { + "application": "Contactless Smartcard Access Controll", + "company": "BQT Solutions Limited", + "mad": "0x4858", + "service_provider": "Banque-Tec", + "system_integrator": "Banque-Tec" + }, + { + "application": "Access control", + "company": "OASys GmbH", + "mad": "0x4859", + "service_provider": "Oasys GmbH", + "system_integrator": "Oasys GmbH" + }, + { + "application": "Access control", + "company": "OASys GmbH", + "mad": "0x486A", + "service_provider": "Oasys GmbH", + "system_integrator": "Oasys GmbH" + }, + { + "application": "Access control & security", + "company": "Third Millennium Systems Ltd", + "mad": "0x486B", + "service_provider": "Third Millenium", + "system_integrator": "Third Millenium" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x486C", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x486D", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x486E", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x486F", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4870", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4871", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4872", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4873", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4874", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4875", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4876", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4877", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4878", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4879", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x487A", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x487B", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x487C", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x487E", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x487F", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4880", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4881", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4882", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4883", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4884", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control & security", + "company": "TechID Engineering bv", + "mad": "0x4885", + "service_provider": "TechID", + "system_integrator": "TechID" + }, + { + "application": "Access control & security", + "company": "N.V. Luchthaven", + "mad": "0x4886", + "service_provider": "N.V. Luchthaven Schiphol", + "system_integrator": "" + }, + { + "application": "Access control & security", + "company": "N.V. Luchthaven", + "mad": "0x4887", + "service_provider": "N.V. Luchthaven Schiphol", + "system_integrator": "" + }, + { + "application": "Access control & security", + "company": "N.V. Luchthaven", + "mad": "0x4888", + "service_provider": "N.V. Luchthaven Schiphol", + "system_integrator": "" + }, + { + "application": "Multi functional badge, private application", + "company": "Microtronic AG", + "mad": "0x4889", + "service_provider": "Microtronic AG", + "system_integrator": "Microtronic AG" + }, + { + "application": "Fingerprint infos compared to user's fingerprint for authentication", + "company": "Biocentric Solutions Inc.", + "mad": "0x489A", + "service_provider": "Biocentric Solutions Inc.", + "system_integrator": "Biocentric Solutions Inc." + }, + { + "application": "Access control application", + "company": "Lenel Systems International", + "mad": "0x489B", + "service_provider": "Lenel Systems International Inc.", + "system_integrator": "Lenel Systems International Inc." + }, + { + "application": "Access control application", + "company": "Lenel Systems International", + "mad": "0x489C", + "service_provider": "Lenel Systems International Inc.", + "system_integrator": "Lenel Systems International Inc." + }, + { + "application": "Access control", + "company": "Interlogix B.V.", + "mad": "0x489D", + "service_provider": "Ge Interlogix", + "system_integrator": "Ge Interlogix" + }, + { + "application": "Biometrial and specific access control data storage", + "company": "Tecisa74", + "mad": "0x489E", + "service_provider": "Tecisa74", + "system_integrator": "Tecisa74" + }, + { + "application": "Biometrial and specific access control data storage", + "company": "Tecisa74", + "mad": "0x489F", + "service_provider": "Tecisa74", + "system_integrator": "Tecisa74" + }, + { + "application": "Biometrial and specific access control data storage", + "company": "Tecisa74", + "mad": "0x48A0", + "service_provider": "Tecisa74", + "system_integrator": "Tecisa74" + }, + { + "application": "Card Holder Data/Card Management Data/Access Control & Security", + "company": "House of Representatives of States General", + "mad": "0x48A1", + "service_provider": "House of Representatives of States General", + "system_integrator": "Paul Sas" + }, + { + "application": "Book and pay system, Access control", + "company": "ADC Systems AB", + "mad": "0x48A2", + "service_provider": "ADC Systems", + "system_integrator": "ADC Systems" + }, + { + "application": "Access contr, time & attendance, multifunc card", + "company": "Horoquartz Gestion des Temps", + "mad": "0x48A3", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "Multiapplication car for industry & trafic, parking, swimming pool", + "company": "ASEC S.A.", + "mad": "0x48A4", + "service_provider": "ASEC S.A", + "system_integrator": "ASEC S.A" + }, + { + "application": "Access control", + "company": "Miditec Datensysteme GmbH", + "mad": "0x48A5", + "service_provider": "Miditec", + "system_integrator": "Miditec" + }, + { + "application": "Acess control", + "company": "Miditec Datensysteme GmbH", + "mad": "0x48A6", + "service_provider": "Miditec", + "system_integrator": "Miditec" + }, + { + "application": "Access control, time & attendence, job control", + "company": "Captor N.V.", + "mad": "0x48A7", + "service_provider": "Captor NV", + "system_integrator": "Captor NV" + }, + { + "application": "Access contr, time & attendance, multifunc card", + "company": "Horoquartz Gestion des Temps", + "mad": "0x48A8", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "Access control & security", + "company": "DATASEC Electronic GmbH", + "mad": "0x48A9", + "service_provider": "Datasec Electronic", + "system_integrator": "Datasec Electronic" + }, + { + "application": "Miscellaneous application, city traffic, access controll & security entertainment, car parking, electronic trade", + "company": "KFAP S.A.", + "mad": "0x48AA", + "service_provider": "KFPA", + "system_integrator": "KFPA" + }, + { + "application": "Access control", + "company": "Electronic Application Laboratory", + "mad": "0x48AB", + "service_provider": "EAL", + "system_integrator": "EAL" + }, + { + "application": "Access control, time management, electronic wallet", + "company": "Universitaire Ziekenhuizen Leuven", + "mad": "0x48AC", + "service_provider": "", + "system_integrator": "GET NV" + }, + { + "application": "Access control, Time and hendance", + "company": "Kaba Benzing GmbH", + "mad": "0x48AD", + "service_provider": "Kaba Benzing", + "system_integrator": "Kaba Benzing" + }, + { + "application": "Attendance-time rading, access control", + "company": "PDTS Gesellschaft für industrielle Datenverarbeitung Ges.mbH", + "mad": "0x48AE", + "service_provider": "PDTS", + "system_integrator": "PDTS" + }, + { + "application": "Access control, Time and attendance", + "company": "Vicking Electronics", + "mad": "0x48AF", + "service_provider": "Vicking Electronics", + "system_integrator": "Vicking Electronics" + }, + { + "application": "", + "company": "Gemplus Nv", + "mad": "0x48B0", + "service_provider": "ING Bank", + "system_integrator": "" + }, + { + "application": "Belgium", + "company": "Gemplus Nv", + "mad": "0x48B1", + "service_provider": "ING Bank", + "system_integrator": "" + }, + { + "application": "Belgium", + "company": "Gemplus Nv", + "mad": "0x48B2", + "service_provider": "ING Bank", + "system_integrator": "" + }, + { + "application": "Access Control", + "company": "IDESCO OY", + "mad": "0x48B3", + "service_provider": "Idesco Oy", + "system_integrator": "Idesco Oy" + }, + { + "application": "Access contr, time & attendance, multifunc card", + "company": "Horoquartz Gestion des Temps", + "mad": "0x48B4", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "Access contr, time & attendance, multifunc card", + "company": "Horoquartz Gestion des Temps", + "mad": "0x48B5", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "Storage of identification data", + "company": "SDS - Security Data Systems", + "mad": "0x48CF", + "service_provider": "SDS", + "system_integrator": "SDS" + }, + { + "application": "Storage of biometric data f. access contr. purposes", + "company": "SDS - Security Data Systems", + "mad": "0x48D0", + "service_provider": "SDS", + "system_integrator": "SDS" + }, + { + "application": "Storage of biometric data f. access contr. purposes", + "company": "SDS - Security Data Systems", + "mad": "0x48D1", + "service_provider": "SDS", + "system_integrator": "SDS" + }, + { + "application": "Storage of biometric data f. access contr. purposes", + "company": "SDS - Security Data Systems", + "mad": "0x48D2", + "service_provider": "SDS", + "system_integrator": "SDS" + }, + { + "application": "Storage of biometric data f. access contr. purposes", + "company": "SDS - Security Data Systems", + "mad": "0x48D3", + "service_provider": "SDS", + "system_integrator": "SDS" + }, + { + "application": "Storage of biometric data f. access contr. purposes", + "company": "SDS - Security Data Systems", + "mad": "0x48D4", + "service_provider": "SDS", + "system_integrator": "SDS" + }, + { + "application": "Storage of biometric data f. access contr. purposes", + "company": "SDS - Security Data Systems", + "mad": "0x48D5", + "service_provider": "SDS", + "system_integrator": "SDS" + }, + { + "application": "Access control & security", + "company": "Hi Sec International A/S", + "mad": "0x48D6", + "service_provider": "HI SEC International", + "system_integrator": "HI SEC International" + }, + { + "application": "Identification for access control", + "company": "Quality Equipment Benelux B.V.", + "mad": "0x48D7", + "service_provider": "Quality Equipment", + "system_integrator": "Quality Equipment" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48D8", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48D9", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48DA", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48DB", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48DC", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48DD", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48DE", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48DF", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48E0", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48E1", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48E2", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48E3", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48E4", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48E5", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48E6", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Finger Print Application", + "company": "Rexroth the identity company GmbH", + "mad": "0x48E7", + "service_provider": "Rexroth", + "system_integrator": "Rexroth" + }, + { + "application": "Finger Print Application", + "company": "Rexroth the identity company GmbH", + "mad": "0x48E8", + "service_provider": "Rexroth", + "system_integrator": "Rexroth" + }, + { + "application": "Access control and identification", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x48E9", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Access control and identification", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x48EA", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Access control and identification", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x48EB", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Access control and identification", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x48EC", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Computer, car parking, elec. purse, access control & security", + "company": "DECA Engineering", + "mad": "0x48ED", + "service_provider": "Deca Engineering", + "system_integrator": "Deca Engineering" + }, + { + "application": "Computer, car parking, elec. purse, access control & security", + "company": "DECA Engineering", + "mad": "0x48EE", + "service_provider": "Deca Engineering", + "system_integrator": "Deca Engineering" + }, + { + "application": "Access Control", + "company": "Salto Systems", + "mad": "0x48EF", + "service_provider": "Salto Systems", + "system_integrator": "Salto Systems" + }, + { + "application": "Electronic locks", + "company": "IR Security & Safety GmbH", + "mad": "0x48F0", + "service_provider": "IR Security & Safety", + "system_integrator": "IR Security & Safety" + }, + { + "application": "Access Control & Security", + "company": "CDV International", + "mad": "0x48F1", + "service_provider": "CDV", + "system_integrator": "CDV" + }, + { + "application": "Access Control & Security", + "company": "CDV International", + "mad": "0x48F2", + "service_provider": "CDV", + "system_integrator": "CDV" + }, + { + "application": "Access Control & Security", + "company": "CDV International", + "mad": "0x48F3", + "service_provider": "CDV", + "system_integrator": "CDV" + }, + { + "application": "Access Control & Security", + "company": "CDV International", + "mad": "0x48F4", + "service_provider": "CDV", + "system_integrator": "CDV" + }, + { + "application": "Access Control & Security", + "company": "CDV International", + "mad": "0x48F5", + "service_provider": "CDV", + "system_integrator": "CDV" + }, + { + "application": "Access Control & Security", + "company": "CDV International", + "mad": "0x48F6", + "service_provider": "CDV", + "system_integrator": "CDV" + }, + { + "application": "Access Control & Security", + "company": "CDV International", + "mad": "0x48F7", + "service_provider": "CDV", + "system_integrator": "CDV" + }, + { + "application": "Access Control & Security", + "company": "CDV International", + "mad": "0x48F8", + "service_provider": "CDV", + "system_integrator": "CDV" + }, + { + "application": "Access Control & Security", + "company": "CDV International", + "mad": "0x48F9", + "service_provider": "CDV", + "system_integrator": "CDV" + }, + { + "application": "Access Control & Security", + "company": "CDV International", + "mad": "0x48FA", + "service_provider": "CDV", + "system_integrator": "CDV" + }, + { + "application": "Access control, card contains, biometric data", + "company": "Spica International", + "mad": "0x48FB", + "service_provider": "Spica", + "system_integrator": "Spica" + }, + { + "application": "Access control & scecurity", + "company": "Adasoft AG", + "mad": "0x48FC", + "service_provider": "Adasoft AG", + "system_integrator": "Adasoft AG" + }, + { + "application": "Access control & scecurity", + "company": "Adasoft AG", + "mad": "0x48FD", + "service_provider": "Adasoft AG", + "system_integrator": "Adasoft AG" + }, + { + "application": "Access control & scecurity", + "company": "Adasoft AG", + "mad": "0x48FE", + "service_provider": "Adasoft AG", + "system_integrator": "Adasoft AG" + }, + { + "application": "Access control & scecurity", + "company": "Adasoft AG", + "mad": "0x48FF", + "service_provider": "Adasoft AG", + "system_integrator": "Adasoft AG" + }, + { + "application": "VIGIK", + "company": "Immotec Systemes", + "mad": "0x4902", + "service_provider": "Immotec", + "system_integrator": "Immotec" + }, + { + "application": "VIGIK", + "company": "Immotec Systemes", + "mad": "0x4903", + "service_provider": "Immotec", + "system_integrator": "Immotec" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x4904", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x4905", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x4906", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x4907", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x4908", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x4909", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x490A", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x490B", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x490C", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x490D", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x490E", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x490F", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x4910", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x4911", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x4912", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x4913", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "Card Administratin, cardholder adminstration, access control & security, company services, miscellaneous applications", + "company": "Ministry of Defense", + "mad": "0x4A01", + "service_provider": "Ministry of Defence", + "system_integrator": "" + }, + { + "application": "Card Administratin, cardholder adminstration, access control & security, company services, miscellaneous applications", + "company": "Ministry of Defense", + "mad": "0x4A02", + "service_provider": "Ministry of Defence", + "system_integrator": "" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C01", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C02", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C03", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C04", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C05", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C06", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C07", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C08", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C09", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C0A", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C0B", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C0C", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C0D", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C0E", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C0F", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C10", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C11", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C12", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C13", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C14", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C15", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C16", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C17", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C18", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C19", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C1A", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C1B", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C1C", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C1D", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C1E", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C1F", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C20", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C21", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C22", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C23", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C24", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C25", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C26", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C27", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C28", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Ski ticketing", + "company": "ADI Ltd.", + "mad": "0x5001", + "service_provider": "BO RROC Sigulda", + "system_integrator": "ADI Ltd." + }, + { + "application": "Ski ticketing, member card, ski association, discounts", + "company": "Cetrta Pot d.o.o.", + "mad": "0x5002", + "service_provider": "Slovenian Ski Association", + "system_integrator": "Cetrta Pot" + }, + { + "application": "Ski ticketing system based on electronic purse", + "company": "ADI Ltd.", + "mad": "0x5003", + "service_provider": "Ramkalni Ltd", + "system_integrator": "ADI Ltd" + }, + { + "application": "Ski ticketing", + "company": "ADI Ltd.", + "mad": "0x5004", + "service_provider": "K-Kalins Ltd.", + "system_integrator": "ADI Ltd" + }, + { + "application": "Entertainment and Sports, Stadiums, Parking, Ski Ticketing", + "company": "Axess AG", + "mad": "0x5005", + "service_provider": "Axess", + "system_integrator": "Axess" + }, + { + "application": "Access control & security, city traffic, sports & entertainment", + "company": "IP Core", + "mad": "0x5006", + "service_provider": "IP Core", + "system_integrator": "IP Core" + }, + { + "application": "Ski ticketing", + "company": "ADI Ltd", + "mad": "0x5007", + "service_provider": "FROKS Ltd", + "system_integrator": "ADI" + }, + { + "application": "Ski ticketing", + "company": "ADI Ltd", + "mad": "0x5008", + "service_provider": "Kalnzaki", + "system_integrator": "ADI" + }, + { + "application": "Local Ski Ticketing Sysem based on electronic purse", + "company": "ADI Ltd", + "mad": "0x5009", + "service_provider": "Mezezers Ltd.", + "system_integrator": "ADI Ltd." + }, + { + "application": "Access Control", + "company": "NEDAP NV", + "mad": "0x5101", + "service_provider": "Nedap Ideas", + "system_integrator": "Nedap Ideas" + }, + { + "application": "Access Control & Security", + "company": "NOVO GmbH", + "mad": "0x5102", + "service_provider": "1. FC Köln GmbH&Co KG", + "system_integrator": "" + }, + { + "application": "Access control and security", + "company": "GPS Tecnologia Ltda.", + "mad": "0x5103", + "service_provider": "GPS Tec", + "system_integrator": "GPS Tec" + }, + { + "application": "Access control and security", + "company": "GPS Tecnologia Ltda.", + "mad": "0x5104", + "service_provider": "GPS Tec", + "system_integrator": "GPS Tec" + }, + { + "application": "Access control", + "company": "Custom Micro Products Ltd.", + "mad": "0x5105", + "service_provider": "Custom Micro Products", + "system_integrator": "Custom Micro Products" + }, + { + "application": "Biometric Access Control", + "company": "CYNAPS", + "mad": "0x5106", + "service_provider": "Cynaps", + "system_integrator": "Cynaps" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x5107", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x5108", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x5109", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x510A", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x510B", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x510C", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x510D", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x510E", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x510F", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x5110", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x5111", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x5112", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x5113", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x5114", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x5115", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x5116", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x5117", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x5118", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x5119", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x511A", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x511B", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x511C", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x511D", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x511E", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x511F", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control", + "company": "Tyco Software House", + "mad": "0x5120", + "service_provider": "Tyco Software House", + "system_integrator": "Tyco Software House" + }, + { + "application": "Access control", + "company": "Connex Solutions Limited", + "mad": "0x5121", + "service_provider": "Connex", + "system_integrator": "Connex" + }, + { + "application": "Acess Control, Time and Attendance", + "company": "Milenio 3 Systemas Electonicos", + "mad": "0x5122", + "service_provider": "Milenio3", + "system_integrator": "Milenio3" + }, + { + "application": "Access control & security", + "company": "CORESTREET", + "mad": "0x5123", + "service_provider": "Corestreet", + "system_integrator": "Corestreet" + }, + { + "application": "Access control & security", + "company": "Honeywell", + "mad": "0x5124", + "service_provider": "Honeywell", + "system_integrator": "Honeywell" + }, + { + "application": "Access control & security", + "company": "Honeywell", + "mad": "0x5125", + "service_provider": "Honeywell", + "system_integrator": "Honeywell" + }, + { + "application": "Access control & security", + "company": "Honeywell", + "mad": "0x5126", + "service_provider": "Honeywell", + "system_integrator": "Honeywell" + }, + { + "application": "Access control & security", + "company": "Honeywell", + "mad": "0x5127", + "service_provider": "Honeywell", + "system_integrator": "Honeywell" + }, + { + "application": "Access control & security", + "company": "Honeywell", + "mad": "0x5128", + "service_provider": "Honeywell", + "system_integrator": "Honeywell" + }, + { + "application": "Access control & security", + "company": "Honeywell", + "mad": "0x5129", + "service_provider": "Honeywell", + "system_integrator": "Honeywell" + }, + { + "application": "Access control & security", + "company": "Honeywell", + "mad": "0x512A", + "service_provider": "Honeywell", + "system_integrator": "Honeywell" + }, + { + "application": "Access control & security", + "company": "Honeywell", + "mad": "0x512B", + "service_provider": "Honeywell", + "system_integrator": "Honeywell" + }, + { + "application": "Biometrics strong authentication", + "company": "LabCal", + "mad": "0x512C", + "service_provider": "Labcal", + "system_integrator": "Labcal" + }, + { + "application": "Access control & security", + "company": "GOB Software&System GmbH Co. KG", + "mad": "0x512D", + "service_provider": "GOB", + "system_integrator": "GOB" + }, + { + "application": "Access control & security", + "company": "Suprema Inc", + "mad": "0x512E", + "service_provider": "Suprema", + "system_integrator": "Suprema" + }, + { + "application": "Access control & security", + "company": "Suprema Inc", + "mad": "0x512F", + "service_provider": "Suprema", + "system_integrator": "Suprema" + }, + { + "application": "Access control & security", + "company": "Suprema Inc", + "mad": "0x5130", + "service_provider": "Suprema", + "system_integrator": "Suprema" + }, + { + "application": "Access control & security", + "company": "Suprema Inc", + "mad": "0x5131", + "service_provider": "Suprema", + "system_integrator": "Suprema" + }, + { + "application": "Access control & security", + "company": "Suprema Inc", + "mad": "0x5132", + "service_provider": "Suprema", + "system_integrator": "Suprema" + }, + { + "application": "Access control & security", + "company": "Suprema Inc", + "mad": "0x5133", + "service_provider": "Suprema", + "system_integrator": "Suprema" + }, + { + "application": "Access control & security", + "company": "Suprema Inc", + "mad": "0x5134", + "service_provider": "Suprema", + "system_integrator": "Suprema" + }, + { + "application": "Access control & security", + "company": "Suprema Inc", + "mad": "0x5135", + "service_provider": "Suprema", + "system_integrator": "Suprema" + }, + { + "application": "Compelete system for lockers, access control & electr. payment", + "company": "Ojmar S. A.", + "mad": "0x5136", + "service_provider": "", + "system_integrator": "Enkoa System S.L." + }, + { + "application": "Access control", + "company": "Honeywell Building Solutions", + "mad": "0x5137", + "service_provider": "Honeywell", + "system_integrator": "Honeywell" + }, + { + "application": "Electronic purse, access control for buliding automation", + "company": "CDE Communication Data Engineering GmbH", + "mad": "0x5138", + "service_provider": "CDE", + "system_integrator": "CDE" + }, + { + "application": "Electronic purse, access control for buliding automation", + "company": "CDE Communication Data Engineering GmbH", + "mad": "0x5139", + "service_provider": "CDE", + "system_integrator": "CDE" + }, + { + "application": "Company services, access & sec control, electronic purse...", + "company": "Cominfo a.s.", + "mad": "0x513A", + "service_provider": "Cominfo", + "system_integrator": "Cominfo" + }, + { + "application": "Access control, card management", + "company": "ID-WARE", + "mad": "0x513B", + "service_provider": "ID-WARE b.v.", + "system_integrator": "" + }, + { + "application": "Access control, card management", + "company": "ID-WARE", + "mad": "0x513C", + "service_provider": "ID-WARE b.v.", + "system_integrator": "" + }, + { + "application": "Access control & security, city traffic, sports & entertainment", + "company": "IP Core", + "mad": "0x513D", + "service_provider": "IP Core", + "system_integrator": "IP Core" + }, + { + "application": "Access control, computer application, company services", + "company": "Volvo Car Corporation", + "mad": "0x513E", + "service_provider": "Volvo Car", + "system_integrator": "Volvo Car" + }, + { + "application": "Access contr, time and attendance", + "company": "Nisus nv", + "mad": "0x513F", + "service_provider": "Nisus NV", + "system_integrator": "NIsus NV" + }, + { + "application": "Time & attendance", + "company": "Flora Holland", + "mad": "0x5140", + "service_provider": "Interflex Datasystems", + "system_integrator": "Interflex Datasystems" + }, + { + "application": "Elec ticketing, access control, electronic purse", + "company": "Empresa 1 Sistemas de Automacao e Comercio", + "mad": "0x5141", + "service_provider": "Empresa 1", + "system_integrator": "Empresa 1" + }, + { + "application": "Biometric Terminal", + "company": "Recognition Systems LLC", + "mad": "0x5142", + "service_provider": "Recognition Systems", + "system_integrator": "" + }, + { + "application": "Access control & security", + "company": "Evotech B.V.", + "mad": "0x5143", + "service_provider": "Evotech B.V., GTI NV", + "system_integrator": "Evotech B.V." + }, + { + "application": "Time attendnace, fuel, access control", + "company": "Emcard a.s.", + "mad": "0x5144", + "service_provider": "Emtest", + "system_integrator": "Emtest" + }, + { + "application": "Access control and security", + "company": "Scotcomms Technology Group Ltd.", + "mad": "0x5145", + "service_provider": "Various", + "system_integrator": "Scotcomms Technology Group Ltd." + }, + { + "application": "Debit Card, Door Acces Control, Computer Identification", + "company": "Netcard", + "mad": "0x5146", + "service_provider": "Netcard", + "system_integrator": "Netcard" + }, + { + "application": "MES Manufactoring Execution System", + "company": "gbo datacomp GmbH", + "mad": "0x5148", + "service_provider": "Gbo datacomp GmbH", + "system_integrator": "gbo datacomp GmbH" + }, + { + "application": "MES Manufactoring Execution System", + "company": "gbo datacomp GmbH", + "mad": "0x5149", + "service_provider": "Gbo datacomp GmbH", + "system_integrator": "gbo datacomp GmbH" + }, + { + "application": "Access control & security", + "company": "Farpointe Data Inc", + "mad": "0x514A", + "service_provider": "Farpointe", + "system_integrator": "" + }, + { + "application": "Fingerprint Recognition Application", + "company": "ESCO Biometric BVBA", + "mad": "0x514B", + "service_provider": "ESCO Biometric", + "system_integrator": "ESCO Biometric" + }, + { + "application": "Access Control", + "company": "Interflex Datensysteme GmbH", + "mad": "0x514C", + "service_provider": "", + "system_integrator": "Interflex Datensysteme GmbH & CoKG" + }, + { + "application": "Access Control", + "company": "Interflex Datensysteme GmbH", + "mad": "0x514D", + "service_provider": "", + "system_integrator": "Interflex Datensysteme GmbH & CoKG" + }, + { + "application": "Access Control", + "company": "Interflex Datensysteme GmbH", + "mad": "0x514E", + "service_provider": "", + "system_integrator": "Interflex Datensysteme GmbH & CoKG" + }, + { + "application": "Access Control", + "company": "Interflex Datensysteme GmbH", + "mad": "0x514F", + "service_provider": "", + "system_integrator": "Interflex Datensysteme GmbH & CoKG" + }, + { + "application": "Fidelity Card", + "company": "Sogedex", + "mad": "0x5150", + "service_provider": "Sogedex", + "system_integrator": "Sogedex" + }, + { + "application": "Fidelity Card", + "company": "Sogedex", + "mad": "0x5151", + "service_provider": "Sogedex", + "system_integrator": "Sogedex" + }, + { + "application": "Identification and authentification system", + "company": "Sogedex", + "mad": "0x5152", + "service_provider": "Sogedex", + "system_integrator": "Sogedex" + }, + { + "application": "Identification and authentification system", + "company": "Sogedex", + "mad": "0x5153", + "service_provider": "Sogedex", + "system_integrator": "Sogedex" + }, + { + "application": "Access Control, Time Attendance, Job Costing, Ticketing", + "company": "Hectrix Limited", + "mad": "0x5154", + "service_provider": "Hectrix Ltd.", + "system_integrator": "Hectrix. Ltd." + }, + { + "application": "Access Control, Time Attendance, Job Costing, Ticketing", + "company": "Hectrix Limited", + "mad": "0x5155", + "service_provider": "Hectrix Ltd.", + "system_integrator": "Hectrix. Ltd." + }, + { + "application": "Access control & security", + "company": "Roger Dariusz Wensker", + "mad": "0x5156", + "service_provider": "Roger", + "system_integrator": "Roger" + }, + { + "application": "Access control & security", + "company": "Roger Dariusz Wensker", + "mad": "0x5157", + "service_provider": "Roger", + "system_integrator": "Roger" + }, + { + "application": "Access control & security", + "company": "Roger Dariusz Wensker", + "mad": "0x5158", + "service_provider": "Roger", + "system_integrator": "Roger" + }, + { + "application": "Access control & security", + "company": "Roger Dariusz Wensker", + "mad": "0x5159", + "service_provider": "Roger", + "system_integrator": "Roger" + }, + { + "application": "Access & parking control, electronic purse", + "company": "General Meters Corp", + "mad": "0x515A", + "service_provider": "General Meters", + "system_integrator": "General Meters" + }, + { + "application": "Car parking, sport applic, hotel, access control systems", + "company": "DATASEC Electronic GmbH", + "mad": "0x515B", + "service_provider": "Datasec", + "system_integrator": "Datatsec" + }, + { + "application": "Car parking, sport applic, hotel, access control systems", + "company": "DATASEC Electronic GmbH", + "mad": "0x515C", + "service_provider": "Datasec", + "system_integrator": "Datatsec" + }, + { + "application": "Access & Inventory conrtol", + "company": "Shockfish SA", + "mad": "0x515D", + "service_provider": "Shockfish", + "system_integrator": "Shockfish" + }, + { + "application": "Access & Inventory conrtol", + "company": "Shockfish SA", + "mad": "0x515E", + "service_provider": "Shockfish", + "system_integrator": "Shockfish" + }, + { + "application": "Access & Inventory conrtol", + "company": "Shockfish SA", + "mad": "0x515F", + "service_provider": "Shockfish", + "system_integrator": "Shockfish" + }, + { + "application": "Access & Inventory conrtol", + "company": "Shockfish SA", + "mad": "0x5160", + "service_provider": "Shockfish", + "system_integrator": "Shockfish" + }, + { + "application": "Access control", + "company": "EAL Apeldoorn B.V.", + "mad": "0x5161", + "service_provider": "EAL", + "system_integrator": "EAL" + }, + { + "application": "Access Control, E-purse", + "company": "Gemalto", + "mad": "0x5162", + "service_provider": "Gemplus", + "system_integrator": "Gemplus" + }, + { + "application": "Access Control, E-purse", + "company": "Gemalto", + "mad": "0x5163", + "service_provider": "Gemplus", + "system_integrator": "Gemplus" + }, + { + "application": "Ausweiskarte", + "company": "Allgemeine Unfallversicherungsanstalt (AUVA)", + "mad": "0x5164", + "service_provider": "AUVA", + "system_integrator": "AUVA" + }, + { + "application": "Ausweiskarte", + "company": "Allgemeine Unfallversicherungsanstalt (AUVA)", + "mad": "0x5165", + "service_provider": "AUVA", + "system_integrator": "AUVA" + }, + { + "application": "Ausweiskarte", + "company": "Allgemeine Unfallversicherungsanstalt (AUVA)", + "mad": "0x5166", + "service_provider": "AUVA", + "system_integrator": "AUVA" + }, + { + "application": "Access Control & Security", + "company": "Nsecure B.V.", + "mad": "0x5167", + "service_provider": "Nsecure", + "system_integrator": "Nsecure" + }, + { + "application": "Fingerprint application, access control & security", + "company": "Shenzhen Ideal Microelectronics Co. Ltd.", + "mad": "0x5168", + "service_provider": "Shenzhen Ideal Microelectronics Co. Ltd.", + "system_integrator": "Shenzhen Ideal Microelectronics Co. Ltd." + }, + { + "application": "Fingerprint application, access control & security", + "company": "Shenzhen Ideal Microelectronics Co. Ltd.", + "mad": "0x5169", + "service_provider": "Shenzhen Ideal Microelectronics Co. Ltd.", + "system_integrator": "Shenzhen Ideal Microelectronics Co. Ltd." + }, + { + "application": "Fingerprint application, access control & security", + "company": "Shenzhen Ideal Microelectronics Co. Ltd.", + "mad": "0x516A", + "service_provider": "Shenzhen Ideal Microelectronics Co. Ltd.", + "system_integrator": "Shenzhen Ideal Microelectronics Co. Ltd." + }, + { + "application": "Fingerprint application, access control & security", + "company": "Shenzhen Ideal Microelectronics Co. Ltd.", + "mad": "0x516B", + "service_provider": "Shenzhen Ideal Microelectronics Co. Ltd.", + "system_integrator": "Shenzhen Ideal Microelectronics Co. Ltd." + }, + { + "application": "Access Control Reader", + "company": "Access Control Technology", + "mad": "0x516C", + "service_provider": "ACT", + "system_integrator": "ACT" + }, + { + "application": "Access control", + "company": "Cogelec", + "mad": "0x516D", + "service_provider": "Cogelec", + "system_integrator": "Cogelec" + }, + { + "application": "Access control", + "company": "Cogelec", + "mad": "0x516E", + "service_provider": "Cogelec", + "system_integrator": "Cogelec" + }, + { + "application": "Access control", + "company": "Cogelec", + "mad": "0x516F", + "service_provider": "Cogelec", + "system_integrator": "Cogelec" + }, + { + "application": "Access control", + "company": "Cogelec", + "mad": "0x5170", + "service_provider": "Cogelec", + "system_integrator": "Cogelec" + }, + { + "application": "Access control", + "company": "Cogelec", + "mad": "0x5171", + "service_provider": "Cogelec", + "system_integrator": "Cogelec" + }, + { + "application": "Access control", + "company": "Cogelec", + "mad": "0x5172", + "service_provider": "Cogelec", + "system_integrator": "Cogelec" + }, + { + "application": "Access control", + "company": "Cogelec", + "mad": "0x5173", + "service_provider": "Cogelec", + "system_integrator": "Cogelec" + }, + { + "application": "Access control", + "company": "Cogelec", + "mad": "0x5174", + "service_provider": "Cogelec", + "system_integrator": "Cogelec" + }, + { + "application": "Access control", + "company": "Cogelec", + "mad": "0x5175", + "service_provider": "Cogelec", + "system_integrator": "Cogelec" + }, + { + "application": "Access control", + "company": "Cogelec", + "mad": "0x5176", + "service_provider": "Cogelec", + "system_integrator": "Cogelec" + }, + { + "application": "Uhlmann & Zacher Clex prime, online and offline electronic locking and access control systems", + "company": "Uhlmann & Zacher GmbH", + "mad": "0x5177", + "service_provider": "Uhlmann & Zacher GmbH", + "system_integrator": "" + }, + { + "application": "Hotel, acces control & security", + "company": "Talleres De Escoriaza S.A.", + "mad": "0x5178", + "service_provider": "Talleres", + "system_integrator": "Talleres" + }, + { + "application": "Energy Saving System For Hotels, Access Control", + "company": "ENKOA System", + "mad": "0x5179", + "service_provider": "Enkoa System S.L.", + "system_integrator": "Enkoa System S.L." + }, + { + "application": "Access conrol function & security", + "company": "Tyco Fire & Security", + "mad": "0x517A", + "service_provider": "Tyco", + "system_integrator": "Tyco" + }, + { + "application": "Logical & Physical access control", + "company": "Pin Cash International B.V.", + "mad": "0x517B", + "service_provider": "PinCash", + "system_integrator": "PinCash" + }, + { + "application": "VIGIK", + "company": "Immotec Systemes", + "mad": "0x517C", + "service_provider": "Immotec", + "system_integrator": "Immotec" + }, + { + "application": "VIGIK", + "company": "Immotec Systemes", + "mad": "0x517D", + "service_provider": "Immotec", + "system_integrator": "Immotec" + }, + { + "application": "VIGIK", + "company": "Immotec Systemes", + "mad": "0x517E", + "service_provider": "Immotec", + "system_integrator": "Immotec" + }, + { + "application": "MIFARE Booster config", + "company": "NEDAP NV", + "mad": "0x517F", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "MIFARE Booster config", + "company": "NEDAP NV", + "mad": "0x5180", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Access control for centrally managed waste treatment", + "company": "Alphatronics", + "mad": "0x5181", + "service_provider": "Alphatronics", + "system_integrator": "Alphatronics" + }, + { + "application": "Access control and identification", + "company": "CEM Systems", + "mad": "0x5182", + "service_provider": "CEM Systems Ltd", + "system_integrator": "CEM Systems Ltd" + }, + { + "application": "Access control and identification", + "company": "CEM Systems", + "mad": "0x5183", + "service_provider": "CEM Systems Ltd", + "system_integrator": "CEM Systems Ltd" + }, + { + "application": "Access control and identification", + "company": "CEM Systems", + "mad": "0x5184", + "service_provider": "CEM Systems Ltd", + "system_integrator": "CEM Systems Ltd" + }, + { + "application": "Hotel, access contr. & sec", + "company": "Vingcard a.s.", + "mad": "0x5185", + "service_provider": "Vingcard", + "system_integrator": "Vingcard" + }, + { + "application": "Hotel, access contr. & sec", + "company": "Vingcard a.s.", + "mad": "0x5186", + "service_provider": "Vingcard", + "system_integrator": "Vingcard" + }, + { + "application": "Zeiterfassung, Werks- bzw. Gebäudezutritt", + "company": "Voestalpine Informationstechnologie GmbH", + "mad": "0x5187", + "service_provider": "Voestalpine Informationstechnologie GmbH", + "system_integrator": "Voestalpine Informationstechnologie GmbH" + }, + { + "application": "Admiral Ausweiskarte (ID-Card)", + "company": "PDTS Gesellschaft für industrielle Datenverarbeitung Ges.mbH", + "mad": "0x5188", + "service_provider": "Admiral Sportwetten GmbH", + "system_integrator": "" + }, + { + "application": "Personal ID and Reporting of Attendance", + "company": "The Swedish Construction Federation", + "mad": "0x5189", + "service_provider": "Sveriges Byggindustrier", + "system_integrator": "" + }, + { + "application": "Personal ID and Reporting of Attendance", + "company": "The Swedish Construction Federation", + "mad": "0x518A", + "service_provider": "Sveriges Byggindustrier", + "system_integrator": "" + }, + { + "application": "Personal ID and Reporting of Attendance", + "company": "The Swedish Construction Federation", + "mad": "0x518B", + "service_provider": "Sveriges Byggindustrier", + "system_integrator": "" + }, + { + "application": "Personal ID and Reporting of Attendance", + "company": "The Swedish Construction Federation", + "mad": "0x518C", + "service_provider": "Sveriges Byggindustrier", + "system_integrator": "" + }, + { + "application": "Personal identification & reporting of attendance", + "company": "The Swedish Construction Federation", + "mad": "0x518D", + "service_provider": "Swedish Construction Fed", + "system_integrator": "" + }, + { + "application": "Personal identification & reporting of attendance", + "company": "The Swedish Construction Federation", + "mad": "0x518E", + "service_provider": "Swedish Construction Fed", + "system_integrator": "" + }, + { + "application": "Security", + "company": "Telenot Electronic GmbH", + "mad": "0x518F", + "service_provider": "Telenot Electronic GmbH", + "system_integrator": "" + }, + { + "application": "Access Control & Security", + "company": "Kaba-Ilco, Inc.", + "mad": "0x5190", + "service_provider": "Kaba Ilco", + "system_integrator": "Kaba Ilco" + }, + { + "application": "Access Control & Security", + "company": "Blue Systems International", + "mad": "0x5191", + "service_provider": "Blue Products.com", + "system_integrator": "Blue Systems International" + }, + { + "application": "Access Control & Security", + "company": "XceedID Corporation", + "mad": "0x5192", + "service_provider": "Xceed ID Corporation", + "system_integrator": "Xceed ID Corporation" + }, + { + "application": "Access Control & Security", + "company": "XceedID Corporation", + "mad": "0x5193", + "service_provider": "Xceed ID Corporation", + "system_integrator": "Xceed ID Corporation" + }, + { + "application": "Arcelor", + "company": "EM Group", + "mad": "0x5194", + "service_provider": "EMGROUP", + "system_integrator": "EMGROUP" + }, + { + "application": "Identification and authentification system", + "company": "Sogedex", + "mad": "0x5195", + "service_provider": "SOGEDEX", + "system_integrator": "SOGEDEX" + }, + { + "application": "Identification and authentification system", + "company": "Sogedex", + "mad": "0x5196", + "service_provider": "SOGEDEX", + "system_integrator": "SOGEDEX" + }, + { + "application": "Identification and authentification system", + "company": "Sogedex", + "mad": "0x5197", + "service_provider": "SOGEDEX", + "system_integrator": "SOGEDEX" + }, + { + "application": "Identification and authentification system", + "company": "Sogedex", + "mad": "0x5198", + "service_provider": "SOGEDEX", + "system_integrator": "SOGEDEX" + }, + { + "application": "Identification and authentification system", + "company": "Sogedex", + "mad": "0x5199", + "service_provider": "SOGEDEX", + "system_integrator": "SOGEDEX" + }, + { + "application": "Identification and authentification system", + "company": "Sogedex", + "mad": "0x519A", + "service_provider": "SOGEDEX", + "system_integrator": "SOGEDEX" + }, + { + "application": "Identification and authentification system", + "company": "Sogedex", + "mad": "0x519B", + "service_provider": "SOGEDEX", + "system_integrator": "SOGEDEX" + }, + { + "application": "Identification and authentification system", + "company": "Sogedex", + "mad": "0x519C", + "service_provider": "SOGEDEX", + "system_integrator": "SOGEDEX" + }, + { + "application": "Identification and authentification system", + "company": "Sogedex", + "mad": "0x519D", + "service_provider": "SOGEDEX", + "system_integrator": "SOGEDEX" + }, + { + "application": "Identification and authentification system", + "company": "Sogedex", + "mad": "0x519E", + "service_provider": "SOGEDEX", + "system_integrator": "SOGEDEX" + }, + { + "application": "Electronic ticketing system", + "company": "CDE Communication Data Engineering GmbH", + "mad": "0x519F", + "service_provider": "CDE-Competence Center for embedded solutions", + "system_integrator": "CDE - Competence Center for embedded solutions" + }, + { + "application": "Electronic ticketing system", + "company": "CDE Communication Data Engineering GmbH", + "mad": "0x51A0", + "service_provider": "CDE-Competence Center for embedded solutions", + "system_integrator": "CDE - Competence Center for embedded solutions" + }, + { + "application": "Access control & security", + "company": "Shenzhen Ideal Microelectronics Co. Ltd.", + "mad": "0x51A1", + "service_provider": "Shenzen IDEAL Microelectronics Co., Ltd.", + "system_integrator": "Shenzen IDEAL Microelectronics Co., Ltd." + }, + { + "application": "Access control & security", + "company": "Shenzhen Ideal Microelectronics Co. Ltd.", + "mad": "0x51A2", + "service_provider": "Shenzen IDEAL Microelectronics Co., Ltd.", + "system_integrator": "Shenzen IDEAL Microelectronics Co., Ltd." + }, + { + "application": "Access control & security", + "company": "Shenzhen Ideal Microelectronics Co. Ltd.", + "mad": "0x51A3", + "service_provider": "Shenzen IDEAL Microelectronics Co., Ltd.", + "system_integrator": "Shenzen IDEAL Microelectronics Co., Ltd." + }, + { + "application": "Access control & security", + "company": "Shenzhen Ideal Microelectronics Co. Ltd.", + "mad": "0x51A4", + "service_provider": "Shenzen IDEAL Microelectronics Co., Ltd.", + "system_integrator": "Shenzen IDEAL Microelectronics Co., Ltd." + }, + { + "application": "Access control & security", + "company": "Shenzhen Ideal Microelectronics Co. Ltd.", + "mad": "0x51A5", + "service_provider": "Shenzen IDEAL Microelectronics Co., Ltd.", + "system_integrator": "Shenzen IDEAL Microelectronics Co., Ltd." + }, + { + "application": "Access control & security", + "company": "Shenzhen Ideal Microelectronics Co. Ltd.", + "mad": "0x51A6", + "service_provider": "Shenzen IDEAL Microelectronics Co., Ltd.", + "system_integrator": "Shenzen IDEAL Microelectronics Co., Ltd." + }, + { + "application": "Access control & security", + "company": "Shenzhen Ideal Microelectronics Co. Ltd.", + "mad": "0x51A7", + "service_provider": "Shenzen IDEAL Microelectronics Co., Ltd.", + "system_integrator": "Shenzen IDEAL Microelectronics Co., Ltd." + }, + { + "application": "Access control & security", + "company": "Shenzhen Ideal Microelectronics Co. Ltd.", + "mad": "0x51A8", + "service_provider": "Shenzen IDEAL Microelectronics Co., Ltd.", + "system_integrator": "Shenzen IDEAL Microelectronics Co., Ltd." + }, + { + "application": "TIME AND ATTENDANCE, ACCESS CONTROL", + "company": "Pyrescom", + "mad": "0x51A9", + "service_provider": "PYRESCOM", + "system_integrator": "PYRESCOM" + }, + { + "application": "Attendance registration and access control", + "company": "Simac QUADCORE", + "mad": "0x51AA", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Access services (to all buildings of Belgian regional and federal political assembles) and Time and Attendances Services", + "company": "Vlaams Parlement", + "mad": "0x51AB", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Physical Access Control", + "company": "General Motors", + "mad": "0x51AC", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Access Control", + "company": "BEKA Elektronik", + "mad": "0x51AD", + "service_provider": "BEKA Electronik", + "system_integrator": "BEKA Electronik" + }, + { + "application": "Access Control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x51AE", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": "Coor Service Management AB, PAS, Card and Know IT" + }, + { + "application": "Access Control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x51AF", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": "Coor Service Management AB, PAS, Card and Know IT" + }, + { + "application": "Access Control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x51B0", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": "Coor Service Management AB, PAS, Card and Know IT" + }, + { + "application": "Access Control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x51B1", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": "Coor Service Management AB, PAS, Card and Know IT" + }, + { + "application": "Access Control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x51B2", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": "Coor Service Management AB, PAS, Card and Know IT" + }, + { + "application": "Access Control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x51B3", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": "Coor Service Management AB, PAS, Card and Know IT" + }, + { + "application": "Access Control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x51B4", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": "Coor Service Management AB, PAS, Card and Know IT" + }, + { + "application": "Access Control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x51B5", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": "Coor Service Management AB, PAS, Card and Know IT" + }, + { + "application": "Access Control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x51B6", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": "Coor Service Management AB, PAS, Card and Know IT" + }, + { + "application": "Access Control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x51B7", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": "Coor Service Management AB, PAS, Card and Know IT" + }, + { + "application": "Access Control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x51B8", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": "Coor Service Management AB, PAS, Card and Know IT" + }, + { + "application": "Access Control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x51B9", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": "Coor Service Management AB, PAS, Card and Know IT" + }, + { + "application": "Access Control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x51BA", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": "Coor Service Management AB, PAS, Card and Know IT" + }, + { + "application": "Access control, Time and Attendance", + "company": "Bodet S.A.", + "mad": "0x51BB", + "service_provider": "Bodet SA", + "system_integrator": "Bodet SA" + }, + { + "application": "Access control and security", + "company": "STid Electronic Identification", + "mad": "0x51BC", + "service_provider": "STid", + "system_integrator": "STid" + }, + { + "application": "Access Control- Time stamping", + "company": "MCF RF TECH SRL", + "mad": "0x51BD", + "service_provider": "MCF RF TECH S.R.L.", + "system_integrator": "MCF RF TECH S.R.L." + }, + { + "application": "ID-cards for logistic company", + "company": "PNL - Pan Nordic Logistics", + "mad": "0x51BE", + "service_provider": "Combiport AB", + "system_integrator": "DAS Card AB" + }, + { + "application": "ID-cards for logistic company", + "company": "PNL - Pan Nordic Logistics", + "mad": "0x51BF", + "service_provider": "Combiport AB", + "system_integrator": "DAS Card AB" + }, + { + "application": "Accesss Control; biometric Identification", + "company": "SYTEL", + "mad": "0x51C0", + "service_provider": "SYTEL", + "system_integrator": "SYTEL" + }, + { + "application": "Accesss Control; biometric Identification", + "company": "SYTEL", + "mad": "0x51C1", + "service_provider": "SYTEL", + "system_integrator": "SYTEL" + }, + { + "application": "Accesss Control; biometric Identification", + "company": "SYTEL", + "mad": "0x51C2", + "service_provider": "SYTEL", + "system_integrator": "SYTEL" + }, + { + "application": "Access control and security application - physical security", + "company": "INID BV", + "mad": "0x51C3", + "service_provider": "INID", + "system_integrator": "INID" + }, + { + "application": "Access control Telectronic locks", + "company": "Deister electronic GmbH", + "mad": "0x51C4", + "service_provider": "Deister electronic GmbH", + "system_integrator": "Deister electronic GmbH" + }, + { + "application": "Access control Telectronic locks", + "company": "Deister electronic GmbH", + "mad": "0x51C5", + "service_provider": "Deister electronic GmbH", + "system_integrator": "Deister electronic GmbH" + }, + { + "application": "Access control", + "company": "INSYS MICROELECTRONICS GmbH", + "mad": "0x51C6", + "service_provider": "INSYS MICROELECTRONICS GmbH", + "system_integrator": "INSYS MICROELECTRONICS GmbH" + }, + { + "application": "Access control", + "company": "INSYS MICROELECTRONICS GmbH", + "mad": "0x51C7", + "service_provider": "INSYS MICROELECTRONICS GmbH", + "system_integrator": "INSYS MICROELECTRONICS GmbH" + }, + { + "application": "Access control", + "company": "INSYS MICROELECTRONICS GmbH", + "mad": "0x51C8", + "service_provider": "INSYS MICROELECTRONICS GmbH", + "system_integrator": "INSYS MICROELECTRONICS GmbH" + }, + { + "application": "Access control", + "company": "INSYS MICROELECTRONICS GmbH", + "mad": "0x51C9", + "service_provider": "INSYS MICROELECTRONICS GmbH", + "system_integrator": "INSYS MICROELECTRONICS GmbH" + }, + { + "application": "Access control", + "company": "INSYS MICROELECTRONICS GmbH", + "mad": "0x51CA", + "service_provider": "INSYS MICROELECTRONICS GmbH", + "system_integrator": "INSYS MICROELECTRONICS GmbH" + }, + { + "application": "Access control, security and monitoring", + "company": "Atelei Engineering SLU", + "mad": "0x51CB", + "service_provider": "Atelei Engineering", + "system_integrator": "Atelei Engineering" + }, + { + "application": "Access & biometrics application", + "company": "Manufacture Francaise des Pneumatiques MICHELIN", + "mad": "0x5202", + "service_provider": "MICHELIN", + "system_integrator": "" + }, + { + "application": "Access & biometrics application", + "company": "Manufacture Francaise des Pneumatiques MICHELIN", + "mad": "0x5203", + "service_provider": "MICHELIN", + "system_integrator": "" + }, + { + "application": "Access & biometrics application", + "company": "Manufacture Francaise des Pneumatiques MICHELIN", + "mad": "0x5204", + "service_provider": "MICHELIN", + "system_integrator": "" + }, + { + "application": "Access & biometrics application", + "company": "Manufacture Francaise des Pneumatiques MICHELIN", + "mad": "0x5205", + "service_provider": "MICHELIN", + "system_integrator": "" + }, + { + "application": "Access & biometrics application", + "company": "Manufacture Francaise des Pneumatiques MICHELIN", + "mad": "0x5206", + "service_provider": "MICHELIN", + "system_integrator": "" + }, + { + "application": "Access Control", + "company": "Triple Eye BV", + "mad": "0x5207", + "service_provider": "Triple Eye B.V.", + "system_integrator": "Triple Eye B.V." + }, + { + "application": "Access Control", + "company": "Triple Eye BV", + "mad": "0x5208", + "service_provider": "Triple Eye B.V.", + "system_integrator": "Triple Eye B.V." + }, + { + "application": "Access Control", + "company": "Triple Eye BV", + "mad": "0x5209", + "service_provider": "Triple Eye B.V.", + "system_integrator": "Triple Eye B.V." + }, + { + "application": "Access Control", + "company": "Triple Eye BV", + "mad": "0x520A", + "service_provider": "Triple Eye B.V.", + "system_integrator": "Triple Eye B.V." + }, + { + "application": "Access Control", + "company": "Triple Eye BV", + "mad": "0x520B", + "service_provider": "Triple Eye B.V.", + "system_integrator": "Triple Eye B.V." + }, + { + "application": "Access Control", + "company": "Triple Eye BV", + "mad": "0x520C", + "service_provider": "Triple Eye B.V.", + "system_integrator": "Triple Eye B.V." + }, + { + "application": "Access Control", + "company": "Triple Eye BV", + "mad": "0x520D", + "service_provider": "Triple Eye B.V.", + "system_integrator": "Triple Eye B.V." + }, + { + "application": "Access Control", + "company": "Triple Eye BV", + "mad": "0x520E", + "service_provider": "Triple Eye B.V.", + "system_integrator": "Triple Eye B.V." + }, + { + "application": "A ticketing application for transport systems", + "company": "VERIFONE ITALIA SRL", + "mad": "0x520F", + "service_provider": "VeriFone Italia", + "system_integrator": "VeriFone Italia" + }, + { + "application": "Access control", + "company": "KABA", + "mad": "0x5210", + "service_provider": "Kaba AG", + "system_integrator": "Kaba AG" + }, + { + "application": "Access control", + "company": "KABA", + "mad": "0x5211", + "service_provider": "Kaba AG", + "system_integrator": "Kaba AG" + }, + { + "application": "Access control", + "company": "KABA", + "mad": "0x5212", + "service_provider": "Kaba AG", + "system_integrator": "Kaba AG" + }, + { + "application": "Access control", + "company": "KABA", + "mad": "0x5213", + "service_provider": "Kaba AG", + "system_integrator": "Kaba AG" + }, + { + "application": "Access control", + "company": "KABA", + "mad": "0x5214", + "service_provider": "Kaba AG", + "system_integrator": "Kaba AG" + }, + { + "application": "Access control", + "company": "KABA", + "mad": "0x5215", + "service_provider": "Kaba AG", + "system_integrator": "Kaba AG" + }, + { + "application": "Access control", + "company": "KABA", + "mad": "0x5216", + "service_provider": "Kaba AG", + "system_integrator": "Kaba AG" + }, + { + "application": "Access control & security", + "company": "Keyprocessor B.V.", + "mad": "0x5217", + "service_provider": "Keyprocessor", + "system_integrator": "" + }, + { + "application": "Access control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x5218", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": " Coor Service Management AB, PAS CARD and Know IT" + }, + { + "application": "Access control", + "company": "MBB Gelma GmbH", + "mad": "0x5229", + "service_provider": "MBB Gelma GmbH", + "system_integrator": "MBB Gelma" + }, + { + "application": "Access control", + "company": "MBB Gelma GmbH", + "mad": "0x522A", + "service_provider": "MBB Gelma GmbH", + "system_integrator": "MBB Gelma" + }, + { + "application": "Access Control, Time & Attendance", + "company": "GRUPO SPEC", + "mad": "0x522B", + "service_provider": "GRUPO SPEC", + "system_integrator": "GRUPO SPEC" + }, + { + "application": "Access Control & Security", + "company": "AB Angpanneföreningen", + "mad": "0x522D", + "service_provider": "AB Angpanneföreningen", + "system_integrator": "AB Angpanneföreningen" + }, + { + "application": "Access control & security", + "company": "Scheidt & Bachmann GmbH", + "mad": "0x522E", + "service_provider": "Scheidt & Bachmann GmbH", + "system_integrator": "Scheidt & Bachmann GmbH" + }, + { + "application": "Access control", + "company": "AMS ENGINEERING Sticht GmbH", + "mad": "0x522F", + "service_provider": "AMS-Engineering", + "system_integrator": "AMS-Engineering" + }, + { + "application": "Access control", + "company": "AMS ENGINEERING Sticht GmbH", + "mad": "0x5230", + "service_provider": "AMS-Engineering", + "system_integrator": "AMS-Engineering" + }, + { + "application": "Security and Access Control", + "company": "Integrated Control Technology Limited", + "mad": "0x5231", + "service_provider": "Integrated Control Technology Limited", + "system_integrator": "Integrated Control Technology Limited" + }, + { + "application": "Centralized access control system", + "company": "National Control Systems S.A.", + "mad": "0x5232", + "service_provider": "National Control Systems S.A.", + "system_integrator": "National Control Systems S.A." + }, + { + "application": "Access control for Pas Card AB and our customers", + "company": "PAS Card AB", + "mad": "0x5233", + "service_provider": "Pas Card AB", + "system_integrator": "Pas Card AB" + }, + { + "application": "Access control for Pas Card AB and our customers", + "company": "PAS Card AB", + "mad": "0x5234", + "service_provider": "Pas Card AB", + "system_integrator": "Pas Card AB" + }, + { + "application": "Access control for Pas Card AB and our customers", + "company": "PAS Card AB", + "mad": "0x5235", + "service_provider": "Pas Card AB", + "system_integrator": "Pas Card AB" + }, + { + "application": "Access control for Pas Card AB and our customers", + "company": "PAS Card AB", + "mad": "0x5236", + "service_provider": "Pas Card AB", + "system_integrator": "Pas Card AB" + }, + { + "application": "Access control for Pas Card AB and our customers", + "company": "PAS Card AB", + "mad": "0x5237", + "service_provider": "Pas Card AB", + "system_integrator": "Pas Card AB" + }, + { + "application": "Access services (to all buildings of Belgian and federal political assemblees) and time and attendance services", + "company": "Vlaams Parlement", + "mad": "0x5238", + "service_provider": "", + "system_integrator": "None" + }, + { + "application": "Access Control & Security Fabricom (GDF SUEZ)", + "company": "Fabricom (GDF SUEZ)", + "mad": "0x5239", + "service_provider": "Fabricom (GDF SUEZ)/Belgian Operations/Communication & Security/Security", + "system_integrator": "Fabricom (GDF SUEZ)/Belgian Operations/Communication & Security/Security" + }, + { + "application": "Access Control & Security Fabricom (GDF SUEZ)", + "company": "Fabricom (GDF SUEZ)", + "mad": "0x523A", + "service_provider": "Fabricom (GDF SUEZ)/Belgian Operations/Communication & Security/Security", + "system_integrator": "Fabricom (GDF SUEZ)/Belgian Operations/Communication & Security/Security" + }, + { + "application": "Access control and security", + "company": "ESTIS", + "mad": "0x523B", + "service_provider": "ESTIS", + "system_integrator": "ESTIS" + }, + { + "application": "Key diversification container", + "company": "KABA", + "mad": "0x523C", + "service_provider": "Kaba AG", + "system_integrator": "Kaba AG" + }, + { + "application": "Key diversification container", + "company": "KABA", + "mad": "0x523D", + "service_provider": "Kaba AG", + "system_integrator": "Kaba AG" + }, + { + "application": "Access control, security and monitoring", + "company": "Atelei Engineering SLU", + "mad": "0x523D", + "service_provider": "Atelei Engineering", + "system_integrator": "Atelei Engineering" + }, + { + "application": "", + "company": "Bombardier Transportation", + "mad": "0x5306", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Access control & security", + "company": "BTICINO s.p.a.", + "mad": "0x5307", + "service_provider": "BTICINO", + "system_integrator": "BTICINO" + }, + { + "application": "Access control & security", + "company": "BTICINO s.p.a.", + "mad": "0x5308", + "service_provider": "BTICINO", + "system_integrator": "BTICINO" + }, + { + "application": "Access control & security", + "company": "BTICINO s.p.a.", + "mad": "0x5309", + "service_provider": "BTICINO", + "system_integrator": "BTICINO" + }, + { + "application": "Access control & security", + "company": "BTICINO s.p.a.", + "mad": "0x530A", + "service_provider": "BTICINO", + "system_integrator": "BTICINO" + }, + { + "application": "Access control & security", + "company": "BTICINO s.p.a.", + "mad": "0x530B", + "service_provider": "BTICINO", + "system_integrator": "BTICINO" + }, + { + "application": "Access Control & Security", + "company": "BSB Electronics Ltd.", + "mad": "0x530C", + "service_provider": "BSB Electronics Ltd.", + "system_integrator": "BSB Electronics Ltd." + }, + { + "application": "Access control security for Uppsala University", + "company": "Uppsala University", + "mad": "0x530D", + "service_provider": "Uppsala University", + "system_integrator": "Uppsala University" + }, + { + "application": "Corporate Access Control application", + "company": "NXP Semiconductors Eindhoven", + "mad": "0x530E", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Corporate Access Control application", + "company": "NXP Semiconductors Eindhoven", + "mad": "0x530F", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Corporate Access Control application", + "company": "NXP Semiconductors Eindhoven", + "mad": "0x5310", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Corporate Access Control application", + "company": "NXP Semiconductors Eindhoven", + "mad": "0x5311", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Corporate Access Control application", + "company": "NXP Semiconductors Eindhoven", + "mad": "0x5312", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Corporate Access Control application", + "company": "NXP Semiconductors Eindhoven", + "mad": "0x5313", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Corporate Access Control application", + "company": "NXP Semiconductors Eindhoven", + "mad": "0x5314", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Corporate Access Control application", + "company": "NXP Semiconductors Eindhoven", + "mad": "0x5315", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Corporate Access Control application", + "company": "NXP Semiconductors Eindhoven", + "mad": "0x5316", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Corporate Access Control application", + "company": "NXP Semiconductors Eindhoven", + "mad": "0x5317", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Access Control", + "company": "EAL Apeldoorn B.V.", + "mad": "0x5318", + "service_provider": "EAL (Apeldoorn) BV", + "system_integrator": "EAL (Apeldoorn) BV" + }, + { + "application": "Access Control reader", + "company": "TIL Technologies", + "mad": "0x5319", + "service_provider": "TIL Technologies", + "system_integrator": "TIL Technologies" + }, + { + "application": "Access Control reader", + "company": "TIL Technologies", + "mad": "0x531A", + "service_provider": "TIL Technologies", + "system_integrator": "TIL Technologies" + }, + { + "application": "Access control", + "company": "BECKMANN GmbH", + "mad": "0x531B", + "service_provider": "BECKMANN GmbH", + "system_integrator": "BECKMANN GmbH" + }, + { + "application": "Access Control using DESFire EV1", + "company": "SIEMENS BT FSP SP PLAC", + "mad": "0x531C", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "", + "company": "DE NEDERLANDSCHE BANK", + "mad": "0x531D", + "service_provider": "AET Europe", + "system_integrator": "EAL NL" + }, + { + "application": "", + "company": "DE NEDERLANDSCHE BANK", + "mad": "0x531E", + "service_provider": "AET Europe", + "system_integrator": "EAL NL" + }, + { + "application": "Standalone Access Control", + "company": "Kimaldi Electronics s.l.", + "mad": "0x531F", + "service_provider": "", + "system_integrator": "KIMALDI Electronics" + }, + { + "application": "Access control & security system", + "company": "Haguess s.r.o.", + "mad": "0x5320", + "service_provider": "Haguess", + "system_integrator": "Haguess" + }, + { + "application": "Centralized access control system", + "company": "National Control Systems S.A", + "mad": "0x5321", + "service_provider": "National Control Systems S.A", + "system_integrator": "National Control Systems S.A" + }, + { + "application": "Centralized access control system", + "company": "National Control Systems S.A", + "mad": "0x5322", + "service_provider": "National Control Systems S.A", + "system_integrator": "National Control Systems S.A" + }, + { + "application": "Access/security", + "company": "ANTWERP WORLD DIAMOND CENTRE", + "mad": "0x5323", + "service_provider": "ANTWERP WORLD DIAMOND CENTRE", + "system_integrator": "Deister + Card Solutions Group" + }, + { + "application": "Acccess Control & security, Resource Acceptability and personnel identity verification", + "company": "Salamander Technologies, Inc.", + "mad": "0x5324", + "service_provider": "N/a", + "system_integrator": "n/a" + }, + { + "application": "High performance physical Accesss Control (reacting and writing on ccard in real time)", + "company": "Qontinuum Plus", + "mad": "0x5325", + "service_provider": "the users themselves", + "system_integrator": "Qontinuum Plus" + }, + { + "application": "Physical access control system", + "company": "Kaba-Ilco, Inc.", + "mad": "0x5327", + "service_provider": "KABA ILCO INC", + "system_integrator": "KABA ILCO INC" + }, + { + "application": "Physical access control system", + "company": "Kaba-Ilco, Inc.", + "mad": "0x5328", + "service_provider": "KABA ILCO INC", + "system_integrator": "KABA ILCO INC" + }, + { + "application": "Physical access control system", + "company": "Kaba-Ilco, Inc.", + "mad": "0x5329", + "service_provider": "KABA ILCO INC", + "system_integrator": "KABA ILCO INC" + }, + { + "application": "Physical access control system", + "company": "Kaba-Ilco, Inc.", + "mad": "0x532A", + "service_provider": "KABA ILCO INC", + "system_integrator": "KABA ILCO INC" + }, + { + "application": "Access Control, Biometrics, Time & attendance, network on card", + "company": "XceedID Corporation", + "mad": "0x532B", + "service_provider": "Ingersoll Rand", + "system_integrator": "Ingersoll Rand, Geoffrey Industries, Schlage, Recognition Systems" + }, + { + "application": "Access Control, Biometrics, Time & attendance, network on card", + "company": "XceedID Corporation", + "mad": "0x532C", + "service_provider": "Ingersoll Rand", + "system_integrator": "Ingersoll Rand, Geoffrey Industries, Schlage, Recognition Systems" + }, + { + "application": "Access Control, Biometrics, Time & attendance, network on card", + "company": "XceedID Corporation", + "mad": "0x532D", + "service_provider": "Ingersoll Rand", + "system_integrator": "Ingersoll Rand, Geoffrey Industries, Schlage, Recognition Systems" + }, + { + "application": "Access control & security", + "company": "Gantner Electronic GmbH", + "mad": "0x532E", + "service_provider": "GANTNER Electronic", + "system_integrator": "GANTNER Electronic" + }, + { + "application": "Standard physical access", + "company": "NXP Semiconductors Columbia PA", + "mad": "0x532F", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Access Control & Electronic security", + "company": "Gunnebo Electronic Security", + "mad": "0x5330", + "service_provider": "Competence Center", + "system_integrator": "GUNNEBO GES" + }, + { + "application": "Access Control & Electronic security", + "company": "Gunnebo Electronic Security", + "mad": "0x5331", + "service_provider": "Competence Center", + "system_integrator": "GUNNEBO GES" + }, + { + "application": "Access Control & Electronic security", + "company": "Gunnebo Electronic Security", + "mad": "0x5332", + "service_provider": "Competence Center", + "system_integrator": "GUNNEBO GES" + }, + { + "application": "Access Control ID", + "company": "EM Group", + "mad": "0x5333", + "service_provider": "EM GROUP", + "system_integrator": "EM GROUP" + }, + { + "application": "Access Control", + "company": "DOM Sicherheitstechnik GmbH & Co. KG", + "mad": "0x5334", + "service_provider": "DOM Sicherheitstechnik GmbH & Co.KG", + "system_integrator": "DOM Sicherheitstechnik GmbH & Co.KG" + }, + { + "application": "Access Control", + "company": "DOM Sicherheitstechnik GmbH & Co. KG", + "mad": "0x5335", + "service_provider": "DOM Sicherheitstechnik GmbH & Co.KG", + "system_integrator": "DOM Sicherheitstechnik GmbH & Co.KG" + }, + { + "application": "Access Control", + "company": "DOM Sicherheitstechnik GmbH & Co. KG", + "mad": "0x5336", + "service_provider": "DOM Sicherheitstechnik GmbH & Co.KG", + "system_integrator": "DOM Sicherheitstechnik GmbH & Co.KG" + }, + { + "application": "Access Control", + "company": "DOM Sicherheitstechnik GmbH & Co. KG", + "mad": "0x5337", + "service_provider": "DOM Sicherheitstechnik GmbH & Co.KG", + "system_integrator": "DOM Sicherheitstechnik GmbH & Co.KG" + }, + { + "application": "Access Control", + "company": "DOM Sicherheitstechnik GmbH & Co. KG", + "mad": "0x5338", + "service_provider": "DOM Sicherheitstechnik GmbH & Co.KG", + "system_integrator": "DOM Sicherheitstechnik GmbH & Co.KG" + }, + { + "application": "Access Control", + "company": "WIGOTEK, Hardware Software Beratung", + "mad": "0x5339", + "service_provider": "WIGOTEK", + "system_integrator": "WIGOTEK" + }, + { + "application": "Access Control", + "company": "WIGOTEK, Hardware Software Beratung", + "mad": "0x533A", + "service_provider": "WIGOTEK", + "system_integrator": "WIGOTEK" + }, + { + "application": "ZKS, Personalnummer, IDs, Nutzerdaten", + "company": "Primion Technology AG", + "mad": "0x533B", + "service_provider": "HDW", + "system_integrator": "Primion" + }, + { + "application": "ZKS, Personalnummer, IDs, Nutzerdaten", + "company": "Primion Technology AG", + "mad": "0x533C", + "service_provider": "HDW", + "system_integrator": "Primion" + }, + { + "application": "ZKS, Personalnummer, IDs, Nutzerdaten", + "company": "Primion Technology AG", + "mad": "0x533D", + "service_provider": "HDW", + "system_integrator": "Primion" + }, + { + "application": "ZKS, Personalnummer, IDs, Nutzerdaten", + "company": "Primion Technology AG", + "mad": "0x533E", + "service_provider": "HDW", + "system_integrator": "Primion" + }, + { + "application": "", + "company": "EVVA-Werk Gesellschaft m.b.H. & Co. KG", + "mad": "0x533F", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Access control and time attendance systems", + "company": "Unicard S.A.", + "mad": "0x5340", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "Access control and time attendance systems", + "company": "Unicard S.A.", + "mad": "0x5341", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "Access control and time attendance systems", + "company": "Unicard S.A.", + "mad": "0x5342", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "Access control", + "company": "TNO ICT", + "mad": "0x5343", + "service_provider": "TNO", + "system_integrator": "TNO" + }, + { + "application": "Access control", + "company": "TNO ICT", + "mad": "0x5344", + "service_provider": "TNO", + "system_integrator": "TNO" + }, + { + "application": "Access control", + "company": "REMSDAQ LIMITED", + "mad": "0x5345", + "service_provider": "", + "system_integrator": "REMSDAQ Limited" + }, + { + "application": "Access control benefits", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x5346", + "service_provider": "KOORDINATOR ODIS s.r.o.", + "system_integrator": "KOORDINATOR ODIS s.r.o." + }, + { + "application": "Access control & security", + "company": "Coor Service Management AB", + "mad": "0x5347", + "service_provider": "SKANDINAVISKA ENSKILDA BANKEN AB", + "system_integrator": "Coor Service Management AB" + }, + { + "application": "Access control & security", + "company": "Coor Service Management AB", + "mad": "0x5348", + "service_provider": "SKANDINAVISKA ENSKILDA BANKEN AB", + "system_integrator": "Coor Service Management AB" + }, + { + "application": "Access control & security", + "company": "Coor Service Management AB", + "mad": "0x5349", + "service_provider": "SKANDINAVISKA ENSKILDA BANKEN AB", + "system_integrator": "Coor Service Management AB" + }, + { + "application": "Access control & security", + "company": "Coor Service Management AB", + "mad": "0x534A", + "service_provider": "SKANDINAVISKA ENSKILDA BANKEN AB", + "system_integrator": "Coor Service Management AB" + }, + { + "application": "Access control & security", + "company": "Coor Service Management AB", + "mad": "0x534B", + "service_provider": "SKANDINAVISKA ENSKILDA BANKEN AB", + "system_integrator": "Coor Service Management AB" + }, + { + "application": "Access control & security", + "company": "Coor Service Management AB", + "mad": "0x534C", + "service_provider": "SKANDINAVISKA ENSKILDA BANKEN AB", + "system_integrator": "Coor Service Management AB" + }, + { + "application": "Access control, user identification, access counter", + "company": "Nordic Alarm AB", + "mad": "0x534D", + "service_provider": "Nordic Alarm AB", + "system_integrator": "Nordic Alarm AB" + }, + { + "application": "Access control, user identification, access counter", + "company": "Nordic Alarm AB", + "mad": "0x534E", + "service_provider": "Nordic Alarm AB", + "system_integrator": "Nordic Alarm AB" + }, + { + "application": "Access control security", + "company": "Mobotix AG Security Vision Systems", + "mad": "0x534F", + "service_provider": "Mobotix AG Security Vision Systems", + "system_integrator": "Mobotix AG Security Vision Systems" + }, + { + "application": "Access Control + Security", + "company": "PKE Electronics AG", + "mad": "0x5350", + "service_provider": "PKE Electronics AG", + "system_integrator": "PKE Electronics AG" + }, + { + "application": "Access Control + Security", + "company": "PKE Electronics AG", + "mad": "0x5351", + "service_provider": "PKE Electronics AG", + "system_integrator": "PKE Electronics AG" + }, + { + "application": "Access Control + Security", + "company": "PKE Electronics AG", + "mad": "0x5352", + "service_provider": "PKE Electronics AG", + "system_integrator": "PKE Electronics AG" + }, + { + "application": "Corporate ID Card BASF", + "company": "Cosmo.id GmbH", + "mad": "0x5353", + "service_provider": "Cosmo.ID", + "system_integrator": "Cosmo.ID" + }, + { + "application": "Corporate ID Crad Daimler", + "company": "Cosmo.id GmbH", + "mad": "0x5354", + "service_provider": "Cosmo.ID", + "system_integrator": "Cosmo.ID" + }, + { + "application": "Access control; Biometric template storage; Offline access control authorization storage; Cash-on card", + "company": "Siemens Building Technologies - Security Solutions - International Headquarters", + "mad": "0x5355", + "service_provider": "Siemens Building Technologies - Security Solutions -worldwide", + "system_integrator": "Siemens Building Technologies - Security Solutions -worldwide" + }, + { + "application": "Access control; Biometric template storage; Offline access control authorization storage; Cash-on card", + "company": "Siemens Building Technologies - Security Solutions - International Headquarters", + "mad": "0x5356", + "service_provider": "Siemens Building Technologies - Security Solutions -worldwide", + "system_integrator": "Siemens Building Technologies - Security Solutions -worldwide" + }, + { + "application": "Access control; Biometric template storage; Offline access control authorization storage; Cash-on card", + "company": "Siemens Building Technologies - Security Solutions - International Headquarters", + "mad": "0x5357", + "service_provider": "Siemens Building Technologies - Security Solutions -worldwide", + "system_integrator": "Siemens Building Technologies - Security Solutions -worldwide" + }, + { + "application": "Access control; Biometric template storage; Offline access control authorization storage; Cash-on card", + "company": "Siemens Building Technologies - Security Solutions - International Headquarters", + "mad": "0x5358", + "service_provider": "Siemens Building Technologies - Security Solutions -worldwide", + "system_integrator": "Siemens Building Technologies - Security Solutions -worldwide" + }, + { + "application": "Access control, security", + "company": "Westec AS", + "mad": "0x5359", + "service_provider": "Westec AS", + "system_integrator": "Westec" + }, + { + "application": "Access control, security", + "company": "Westec AS", + "mad": "0x535A", + "service_provider": "Westec AS", + "system_integrator": "Westec" + }, + { + "application": "Access control, security", + "company": "Westec AS", + "mad": "0x535B", + "service_provider": "Westec AS", + "system_integrator": "Westec" + }, + { + "application": "Access control, security", + "company": "Westec AS", + "mad": "0x535C", + "service_provider": "Westec AS", + "system_integrator": "Westec" + }, + { + "application": "Access control, security", + "company": "Avinor AS", + "mad": "0x535D", + "service_provider": "Avinor AS", + "system_integrator": "Westec AS" + }, + { + "application": "Access Control", + "company": "AMC - Academic Hospital", + "mad": "0x535E", + "service_provider": "EAL (Apeldoorn) B.V.", + "system_integrator": "EAL (Apeldoorn) B.V." + }, + { + "application": "Access control & security", + "company": "Axel Springer AG", + "mad": "0x535F", + "service_provider": "Axel Springer AG", + "system_integrator": "Axel Springer AG" + }, + { + "application": "Access control & security", + "company": "Axel Springer AG", + "mad": "0x5360", + "service_provider": "Axel Springer AG", + "system_integrator": "Axel Springer AG" + }, + { + "application": "Access control & security", + "company": "Axel Springer AG", + "mad": "0x5361", + "service_provider": "Axel Springer AG", + "system_integrator": "Axel Springer AG" + }, + { + "application": "Access Control", + "company": "Universite de Luxembourg", + "mad": "0x5362", + "service_provider": "EAL (Apeldoorn) B.V.", + "system_integrator": "EAL (Apeldoorn) B.V." + }, + { + "application": "Access control, intruder alarm, time & attendance", + "company": "Novar GmbH- Honeywell Security", + "mad": "0x5363", + "service_provider": "NOVAR, HONEYWELL", + "system_integrator": "" + }, + { + "application": "Access Control & Security", + "company": "Vattenfall Research & Development AB", + "mad": "0x5364", + "service_provider": "Vattenfall AB", + "system_integrator": "Coor Service Vattenfall AB" + }, + { + "application": "Access control system", + "company": "ISEO/ATG", + "mad": "0x5365", + "service_provider": "ISEO/ATG", + "system_integrator": "ISEO/ATG" + }, + { + "application": "Access control system", + "company": "ISEO/ATG", + "mad": "0x5366", + "service_provider": "ISEO/ATG", + "system_integrator": "ISEO/ATG" + }, + { + "application": "Access control system", + "company": "ISEO/ATG", + "mad": "0x5367", + "service_provider": "ISEO/ATG", + "system_integrator": "ISEO/ATG" + }, + { + "application": "Access Control, ID Badge, Payment", + "company": "Danfoss A/S", + "mad": "0x5368", + "service_provider": "Vitani A/S", + "system_integrator": "Vitani A/S" + }, + { + "application": "Access control, security and monitoring", + "company": "Atelei Engineering SLU", + "mad": "0x5369", + "service_provider": "Atelei Engineering", + "system_integrator": "Atelei Engineering" + }, + { + "application": "Access Control", + "company": "Teratron GmbH", + "mad": "0x536A", + "service_provider": "Teratron GmbH", + "system_integrator": "Teratron GmbH" + }, + { + "application": "Access Control", + "company": "Assa Abloy (Switzerland)", + "mad": "0x536B", + "service_provider": "Assa Abloy (Switzerland)", + "system_integrator": "Assa Abloy (Switzerland)" + }, + { + "application": "Servicios de Identificacion/Presenncia Corporation; control de Accesos y seguridad", + "company": "IZENPE", + "mad": "0x5401", + "service_provider": "IZENPE", + "system_integrator": "IZENPE" + }, + { + "application": "Servicios de Identificacion/Presenncia Corporation; control de Accesos y seguridad", + "company": "IZENPE", + "mad": "0x5402", + "service_provider": "IZENPE", + "system_integrator": "IZENPE" + }, + { + "application": "Servicios de Identificacion/Presenncia Corporation; control de Accesos y seguridad", + "company": "IZENPE", + "mad": "0x5403", + "service_provider": "IZENPE", + "system_integrator": "IZENPE" + }, + { + "application": "Servicios de Identificacion/Presenncia Corporation; control de Accesos y seguridad", + "company": "IZENPE", + "mad": "0x5404", + "service_provider": "IZENPE", + "system_integrator": "IZENPE" + }, + { + "application": "Corporate ID Card BASF", + "company": "Cosmo.id GmbH", + "mad": "0x5405", + "service_provider": "Cosmo.id", + "system_integrator": "Cosmo.id" + }, + { + "application": "Electrical vehicle charging", + "company": "EnBW Energie Baden-Württemberg AG", + "mad": "0x5406", + "service_provider": "EnBW Systeme Infrastruktur Support GmbH", + "system_integrator": "EnBW Systeme Infrastruktur Support GmbH" + }, + { + "application": "Electronic Access Control Systems EZK", + "company": "Franz Schneider Brakel GmbH + Co KG", + "mad": "0x5407", + "service_provider": "", + "system_integrator": "Franz Schneider Brakel GmbH + Co KG" + }, + { + "application": "Access control & security", + "company": "SCM Microsystems Gmbh", + "mad": "0x5408", + "service_provider": "SCM Microsystems Gmbh", + "system_integrator": "" + }, + { + "application": "Access control and key management system", + "company": "ALCEA", + "mad": "0x5409", + "service_provider": "ALCEA", + "system_integrator": "ALCEA" + }, + { + "application": "Access control and key management system", + "company": "ALCEA", + "mad": "0x540A", + "service_provider": "ALCEA", + "system_integrator": "ALCEA" + }, + { + "application": "Smart City Card \\Schwabencard\"\"", + "company": "Cosmo.id GmbH", + "mad": "0x540B", + "service_provider": "Cosmo.id", + "system_integrator": "Cosmo.id" + }, + { + "application": "Physical access control; Photo; Biometrics data; hourly management; Canteen", + "company": "France Telecom SA", + "mad": "0x540C", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Physical access control; Photo; Biometrics data; hourly management; Canteen", + "company": "France Telecom SA", + "mad": "0x540D", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Physical access control; Photo; Biometrics data; hourly management; Canteen", + "company": "France Telecom SA", + "mad": "0x540E", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Physical access control; Photo; Biometrics data; hourly management; Canteen", + "company": "France Telecom SA", + "mad": "0x540F", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Physical access control; Photo; Biometrics data; hourly management; Canteen", + "company": "France Telecom SA", + "mad": "0x5410", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Access control", + "company": "Medisch Centrum Alkmaar", + "mad": "0x5411", + "service_provider": "EAL (Apeldoorn) B.V.", + "system_integrator": "EAL (Apeldoorn) B.V." + }, + { + "application": "Access control, benefits", + "company": "OREDO s.r.o", + "mad": "0x5412", + "service_provider": "OREDO s.r.o", + "system_integrator": "OREDO s.r.o" + }, + { + "application": "Access control", + "company": "Synchronic", + "mad": "0x5413", + "service_provider": "R&D Synchronic", + "system_integrator": "SYNCHRONIC" + }, + { + "application": "Access Control System", + "company": "Glutz AG, Swiss Access Systems", + "mad": "0x5414", + "service_provider": "Glutz AG", + "system_integrator": "Glutz AG" + }, + { + "application": "Access Control System", + "company": "Glutz AG, Swiss Access Systems", + "mad": "0x5415", + "service_provider": "Glutz AG", + "system_integrator": "Glutz AG" + }, + { + "application": "Access control, security, identification and business services", + "company": "Amtac Professional Services Ptv Ltd", + "mad": "0x5416", + "service_provider": "Amtac Professional Services Ptv Ltd", + "system_integrator": "Amtac Professional Services Ptv Ltd" + }, + { + "application": "Access control, security, identification and business services", + "company": "Amtac Professional Services Ptv Ltd", + "mad": "0x5417", + "service_provider": "Amtac Professional Services Ptv Ltd", + "system_integrator": "Amtac Professional Services Ptv Ltd" + }, + { + "application": "Identification services", + "company": "EasyCheck GmbH", + "mad": "0x5418", + "service_provider": "Stadt Duisburg", + "system_integrator": "Stadt Duisburg" + }, + { + "application": "Access Control, ID Badge, Payment & Hotel", + "company": "Danish Defence", + "mad": "0x5419", + "service_provider": "Vitani A/S", + "system_integrator": "Vitani A/S" + }, + { + "application": "Access control, security and monitoring", + "company": "Atelei Engineering SLU", + "mad": "0x541A", + "service_provider": "Atelei Engineering", + "system_integrator": "Atelei Engineering" + }, + { + "application": "Access to datacenter, cass, rows, disable alarm+security system, employee ID-card", + "company": "VegaSystems", + "mad": "0x541B", + "service_provider": "VegaSystems", + "system_integrator": "VegaSystems" + }, + { + "application": "Academic Services, Electronic Purse, Access control & security", + "company": "CNA Limited/Rax-Comm Systems Ltd.", + "mad": "0x5801", + "service_provider": "CNA Limited", + "system_integrator": "CNA Limited" + }, + { + "application": "Universitz Student & Staff Identification", + "company": "CNA Limited/Rax-Comm Systems Ltd.", + "mad": "0x5802", + "service_provider": "CNA Limited", + "system_integrator": "CNA Limited" + }, + { + "application": "Student/stuff ID Card Travel Pass, Library Card, Photocopy Control & Meal Payment", + "company": "University of Warwick", + "mad": "0x5803", + "service_provider": "University of Warwick", + "system_integrator": "University of Warwick" + }, + { + "application": "Student/stuff ID Card Travel Pass, Library Card, Photocopy Control & Meal Payment", + "company": "University of Warwick", + "mad": "0x5804", + "service_provider": "University of Warwick", + "system_integrator": "University of Warwick" + }, + { + "application": "Student/stuff ID Card Travel Pass, Library Card, Photocopy Control & Meal Payment", + "company": "University of Warwick", + "mad": "0x5805", + "service_provider": "University of Warwick", + "system_integrator": "University of Warwick" + }, + { + "application": "Student/stuff ID Card Travel Pass, Library Card, Photocopy Control & Meal Payment", + "company": "University of Warwick", + "mad": "0x5806", + "service_provider": "University of Warwick", + "system_integrator": "University of Warwick" + }, + { + "application": "Student/stuff ID Card Travel Pass, Library Card, Photocopy Control & Meal Payment", + "company": "University of Warwick", + "mad": "0x5807", + "service_provider": "University of Warwick", + "system_integrator": "University of Warwick" + }, + { + "application": "Accademic services", + "company": "Innolab Private Ltd", + "mad": "0x5809", + "service_provider": "National University of Singapore", + "system_integrator": "Innolab Private Ltd" + }, + { + "application": "Accademic services", + "company": "Innolab Private Ltd", + "mad": "0x580A", + "service_provider": "National University of Singapore", + "system_integrator": "Innolab Private Ltd" + }, + { + "application": "Accademic services", + "company": "Innolab Private Ltd", + "mad": "0x580B", + "service_provider": "National University of Singapore", + "system_integrator": "Innolab Private Ltd" + }, + { + "application": "Accademic services", + "company": "Innolab Private Ltd", + "mad": "0x580C", + "service_provider": "National University of Singapore", + "system_integrator": "Innolab Private Ltd" + }, + { + "application": "Accademic services", + "company": "Innolab Private Ltd", + "mad": "0x580D", + "service_provider": "National University of Singapore", + "system_integrator": "Innolab Private Ltd" + }, + { + "application": "Accademic services", + "company": "Innolab Private Ltd", + "mad": "0x580E", + "service_provider": "National University of Singapore", + "system_integrator": "Innolab Private Ltd" + }, + { + "application": "Academic identity cards", + "company": "Maximus", + "mad": "0x580F", + "service_provider": "Maximus Inc", + "system_integrator": "Maximus Inc" + }, + { + "application": "Basic cardholder info", + "company": "Cambridge University - Institute for Manufacturing", + "mad": "0x5810", + "service_provider": "Cambridge University", + "system_integrator": "Cambridge University" + }, + { + "application": "Basic cardholder info", + "company": "Cambridge University - Institute for Manufacturing", + "mad": "0x5811", + "service_provider": "Cambridge University", + "system_integrator": "Cambridge University" + }, + { + "application": "Basic cardholder info", + "company": "Cambridge University - Institute for Manufacturing", + "mad": "0x5812", + "service_provider": "Cambridge University", + "system_integrator": "Cambridge University" + }, + { + "application": "Basic cardholder info", + "company": "Cambridge University - Institute for Manufacturing", + "mad": "0x5813", + "service_provider": "Cambridge University", + "system_integrator": "Cambridge University" + }, + { + "application": "Academic services", + "company": "Invest Solutions Limited", + "mad": "0x5814", + "service_provider": "Invest Solutions", + "system_integrator": "Invest Solutions" + }, + { + "application": "Academic services", + "company": "Invest Solutions Limited", + "mad": "0x5815", + "service_provider": "Invest Solutions", + "system_integrator": "Invest Solutions" + }, + { + "application": "Access control & security, city traffic, sports & entertainment", + "company": "IP Core", + "mad": "0x5816", + "service_provider": "IP Core", + "system_integrator": "IP Core" + }, + { + "application": "Student, staff ID card", + "company": "University of Bolton", + "mad": "0x5817", + "service_provider": "University of Bolton", + "system_integrator": "University of Bolton" + }, + { + "application": "Student, staff ID card", + "company": "University of Bolton", + "mad": "0x5818", + "service_provider": "University of Bolton", + "system_integrator": "University of Bolton" + }, + { + "application": "Student, staff ID card", + "company": "University of Bolton", + "mad": "0x5819", + "service_provider": "University of Bolton", + "system_integrator": "University of Bolton" + }, + { + "application": "Student, staff ID card", + "company": "University of Bolton", + "mad": "0x581A", + "service_provider": "University of Bolton", + "system_integrator": "University of Bolton" + }, + { + "application": "Railway pass, univers pass, library", + "company": "Emcard a.s.", + "mad": "0x581B", + "service_provider": "Emcard", + "system_integrator": "Emtest" + }, + { + "application": "Railway pass, univers pass, library", + "company": "Emcard a.s.", + "mad": "0x581C", + "service_provider": "Emcard", + "system_integrator": "Emtest" + }, + { + "application": "University Card", + "company": "Faculty of Electrical Engineering and Computing", + "mad": "0x581D", + "service_provider": "Faculty of EE & Computing, Ministry of Science, Technolgoy and Education", + "system_integrator": "Faculty of EE & Computing" + }, + { + "application": "University Card", + "company": "Faculty of Electrical Engineering and Computing", + "mad": "0x581E", + "service_provider": "Faculty of EE & Computing, Ministry of Science, Technolgoy and Education", + "system_integrator": "Faculty of EE & Computing" + }, + { + "application": "University Card", + "company": "Faculty of Electrical Engineering and Computing", + "mad": "0x581F", + "service_provider": "Faculty of EE & Computing, Ministry of Science, Technolgoy and Education", + "system_integrator": "Faculty of EE & Computing" + }, + { + "application": "University Campus Card", + "company": "Smartchip S.A.", + "mad": "0x5820", + "service_provider": "Universidad U.P.B.", + "system_integrator": "Smartchip S.A." + }, + { + "application": "High school pass", + "company": "Emcard a.s.", + "mad": "0x5821", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "Academic services", + "company": "University of Bath", + "mad": "0x5822", + "service_provider": "University Bath", + "system_integrator": "Royall Security Systems" + }, + { + "application": "Student/stuff ID, library ID, access control, purse 1, purse 2, electroral rights indicator", + "company": "Universität Ulm", + "mad": "0x5823", + "service_provider": "University of Ulm", + "system_integrator": "University of Ulm" + }, + { + "application": "Student/stuff ID, library ID, access control, purse 1, purse 2, electroral rights indicator", + "company": "Universität Ulm", + "mad": "0x5824", + "service_provider": "University of Ulm", + "system_integrator": "University of Ulm" + }, + { + "application": "Student/stuff ID, library ID, access control, purse 1, purse 2, electroral rights indicator", + "company": "Universität Ulm", + "mad": "0x5825", + "service_provider": "University of Ulm", + "system_integrator": "University of Ulm" + }, + { + "application": "Student/stuff ID, library ID, access control, purse 1, purse 2, electroral rights indicator", + "company": "Universität Ulm", + "mad": "0x5826", + "service_provider": "University of Ulm", + "system_integrator": "University of Ulm" + }, + { + "application": "Student/stuff ID, library ID, access control, purse 1, purse 2, electroral rights indicator", + "company": "Universität Ulm", + "mad": "0x5827", + "service_provider": "University of Ulm", + "system_integrator": "University of Ulm" + }, + { + "application": "Student/stuff ID, library ID, access control, purse 1, purse 2, electroral rights indicator", + "company": "Universität Ulm", + "mad": "0x5828", + "service_provider": "University of Ulm", + "system_integrator": "University of Ulm" + }, + { + "application": "University Card (Academic Applications)", + "company": "Faculty of Electrical Engineering and Computing", + "mad": "0x5829", + "service_provider": "Faculty of EE & Computing", + "system_integrator": "Faculty of EE & Computing" + }, + { + "application": "University Card (Academic Applications)", + "company": "Faculty of Electrical Engineering and Computing", + "mad": "0x582A", + "service_provider": "Faculty of EE & Computing", + "system_integrator": "Faculty of EE & Computing" + }, + { + "application": "University Card (Academic Applications)", + "company": "Faculty of Electrical Engineering and Computing", + "mad": "0x582B", + "service_provider": "Faculty of EE & Computing", + "system_integrator": "Faculty of EE & Computing" + }, + { + "application": "University Card (Academic Applications)", + "company": "Faculty of Electrical Engineering and Computing", + "mad": "0x582C", + "service_provider": "Faculty of EE & Computing", + "system_integrator": "Faculty of EE & Computing" + }, + { + "application": "University Card (Academic Applications)", + "company": "Faculty of Electrical Engineering and Computing", + "mad": "0x582D", + "service_provider": "Faculty of EE & Computing", + "system_integrator": "Faculty of EE & Computing" + }, + { + "application": "Academic services, food", + "company": "FH Studienbetriebs GmbH", + "mad": "0x582E", + "service_provider": "FH 00E Studienbetriebs GmbH, HSSE", + "system_integrator": "FH 00E Studienbetriebs GmbH, HSSE" + }, + { + "application": "Library card", + "company": "Technical University Of Szczecin", + "mad": "0x582F", + "service_provider": "techn University Szczecin", + "system_integrator": "techn University Szczecin" + }, + { + "application": "Student/Staff IC Card", + "company": "University of Chester", + "mad": "0x5830", + "service_provider": "University of Chester", + "system_integrator": "University of Chester" + }, + { + "application": "Student/Staff IC Card", + "company": "University of Chester", + "mad": "0x5831", + "service_provider": "University of Chester", + "system_integrator": "University of Chester" + }, + { + "application": "Student/Staff IC Card", + "company": "University of Chester", + "mad": "0x5832", + "service_provider": "University of Chester", + "system_integrator": "University of Chester" + }, + { + "application": "Student/Staff IC Card", + "company": "University of Chester", + "mad": "0x5833", + "service_provider": "University of Chester", + "system_integrator": "University of Chester" + }, + { + "application": "Student/Staff IC Card", + "company": "University of Chester", + "mad": "0x5834", + "service_provider": "University of Chester", + "system_integrator": "University of Chester" + }, + { + "application": "University Campus Card", + "company": "Smartchip S.A.", + "mad": "0x5835", + "service_provider": "Universidad EAFIT", + "system_integrator": "Smartchip S.A." + }, + { + "application": "Online Activity Registration and Ticketing (education)", + "company": "PinCash International", + "mad": "0x5836", + "service_provider": "Pincash international BV", + "system_integrator": "Pincash international BV" + }, + { + "application": "University Card, Library Card, Studen/Staff ID, Academic services", + "company": "Stockholm University", + "mad": "0x5837", + "service_provider": "Stockholm University", + "system_integrator": "Stockholm University" + }, + { + "application": "University Card, Library Card, Studen/Staff ID, Academic services", + "company": "Stockholm University", + "mad": "0x5838", + "service_provider": "Stockholm University", + "system_integrator": "Stockholm University" + }, + { + "application": "University Card, Library Card, Studen/Staff ID, Academic services", + "company": "Stockholm University", + "mad": "0x5839", + "service_provider": "Stockholm University", + "system_integrator": "Stockholm University" + }, + { + "application": "University Card, Library Card, Studen/Staff ID, Academic services", + "company": "Stockholm University", + "mad": "0x583A", + "service_provider": "Stockholm University", + "system_integrator": "Stockholm University" + }, + { + "application": "University Campus Card", + "company": "Smartchip S.A.", + "mad": "0x583B", + "service_provider": "Colegiatura Colombiana", + "system_integrator": "SMARTCHIP S.A." + }, + { + "application": "Student/personnel authentication & identification card", + "company": "Hogeschool Gent", + "mad": "0x583C", + "service_provider": "Associatie Universiteit Gent", + "system_integrator": "Universiteit Gent, Hogeschool Gent, Arteveldeschool, Hogeschool West-Vlaanderen" + }, + { + "application": "Student/personnel authentication & identification card", + "company": "Hogeschool Gent", + "mad": "0x583D", + "service_provider": "Associatie Universiteit Gent", + "system_integrator": "Universiteit Gent, Hogeschool Gent, Arteveldeschool, Hogeschool West-Vlaanderen" + }, + { + "application": "Student/personnel authentication & identification card", + "company": "Hogeschool Gent", + "mad": "0x583E", + "service_provider": "Associatie Universiteit Gent", + "system_integrator": "Universiteit Gent, Hogeschool Gent, Arteveldeschool, Hogeschool West-Vlaanderen" + }, + { + "application": "Student/personnel authentication & identification card", + "company": "Hogeschool Gent", + "mad": "0x583F", + "service_provider": "Associatie Universiteit Gent", + "system_integrator": "Universiteit Gent, Hogeschool Gent, Arteveldeschool, Hogeschool West-Vlaanderen" + }, + { + "application": "Studen/personnel authentication & identification card", + "company": "Hogeschool Gent", + "mad": "0x5840", + "service_provider": "Associatie Universiteit Gent", + "system_integrator": "Associatie Universiteit Gent" + }, + { + "application": "Academic services", + "company": "Group Capmonetique", + "mad": "0x5841", + "service_provider": "MONECARTE", + "system_integrator": "MONECARTE" + }, + { + "application": "Academic services", + "company": "Group Capmonetique", + "mad": "0x5842", + "service_provider": "MONECARTE", + "system_integrator": "MONECARTE" + }, + { + "application": "Academic services", + "company": "Group Capmonetique", + "mad": "0x5843", + "service_provider": "MONECARTE", + "system_integrator": "MONECARTE" + }, + { + "application": "Academic services", + "company": "Group Capmonetique", + "mad": "0x5844", + "service_provider": "MONECARTE", + "system_integrator": "MONECARTE" + }, + { + "application": "Multifunctional IT", + "company": "InterCard AG Informationssysteme", + "mad": "0x5845", + "service_provider": "InterCard", + "system_integrator": "InterCard" + }, + { + "application": "Multifunctional IT", + "company": "InterCard AG Informationssysteme", + "mad": "0x5846", + "service_provider": "InterCard", + "system_integrator": "InterCard" + }, + { + "application": "Multifunctional IT", + "company": "InterCard AG Informationssysteme", + "mad": "0x5847", + "service_provider": "InterCard", + "system_integrator": "InterCard" + }, + { + "application": "Multifunctional IT", + "company": "InterCard AG Informationssysteme", + "mad": "0x5848", + "service_provider": "InterCard", + "system_integrator": "InterCard" + }, + { + "application": "Student and staff identification, access control, attendance monitoring, cashless vending", + "company": "Computer Centre, Lancaster University", + "mad": "0x5849", + "service_provider": "Lancaster University", + "system_integrator": "Lancaster University" + }, + { + "application": "Student and staff identification, access control, attendance monitoring, cashless vending", + "company": "Computer Centre, Lancaster University", + "mad": "0x584A", + "service_provider": "Lancaster University", + "system_integrator": "Lancaster University" + }, + { + "application": "Student and staff identification, access control, attendance monitoring, cashless vending", + "company": "Computer Centre, Lancaster University", + "mad": "0x584B", + "service_provider": "Lancaster University", + "system_integrator": "Lancaster University" + }, + { + "application": "Student and staff identification, access control, attendance monitoring, cashless vending", + "company": "Computer Centre, Lancaster University", + "mad": "0x584C", + "service_provider": "Lancaster University", + "system_integrator": "Lancaster University" + }, + { + "application": "Academic services", + "company": "Gantner Electronic GmbH", + "mad": "0x584D", + "service_provider": "GANTNER Electronic", + "system_integrator": "GANTNER Electronic" + }, + { + "application": "Library card", + "company": "Vienna University of Economics", + "mad": "0x584E", + "service_provider": "Vienna University of Economics", + "system_integrator": "Vienna University of Economics" + }, + { + "application": "University campus card", + "company": "Smartchip S.A.", + "mad": "0x584F", + "service_provider": "Universidad de Antioquia - UedA", + "system_integrator": "Smartchip SA" + }, + { + "application": "Sttuden/personnel access control", + "company": "Caja General de Ahorros de Canarias", + "mad": "0x5850", + "service_provider": "Universidad de La laguna-ULL", + "system_integrator": "CajaCanarias" + }, + { + "application": "Academic services", + "company": "Emtest a.s.", + "mad": "0x5851", + "service_provider": "Ministry of Education of Slovak republic", + "system_integrator": "EMtest-SK, s.r.o." + }, + { + "application": "Internal identification", + "company": "HUB-EHSAL VZW", + "mad": "0x5852", + "service_provider": "HUB", + "system_integrator": "" + }, + { + "application": "University/Campus applications", + "company": "Burall InfoSmart Ltd", + "mad": "0x5853", + "service_provider": "Burall InfoSmart Ltd", + "system_integrator": "Burall InfoSmart Ltd" + }, + { + "application": "University student identification", + "company": "Pro Active", + "mad": "0x5854", + "service_provider": "CNOUS", + "system_integrator": "Pro Active SAS" + }, + { + "application": "University student identification", + "company": "Pro Active", + "mad": "0x5855", + "service_provider": "CNOUS", + "system_integrator": "Pro Active SAS" + }, + { + "application": "University student identification", + "company": "Pro Active", + "mad": "0x5856", + "service_provider": "CNOUS", + "system_integrator": "Pro Active SAS" + }, + { + "application": "University student identification", + "company": "Pro Active", + "mad": "0x5857", + "service_provider": "CNOUS", + "system_integrator": "Pro Active SAS" + }, + { + "application": "University student identification", + "company": "Pro Active", + "mad": "0x5858", + "service_provider": "CNOUS", + "system_integrator": "Pro Active SAS" + }, + { + "application": "University student identification", + "company": "Pro Active", + "mad": "0x5859", + "service_provider": "CNOUS", + "system_integrator": "Pro Active SAS" + }, + { + "application": "University student identification", + "company": "Pro Active", + "mad": "0x585A", + "service_provider": "CNOUS", + "system_integrator": "Pro Active SAS" + }, + { + "application": "University student identification", + "company": "Pro Active", + "mad": "0x585B", + "service_provider": "CNOUS", + "system_integrator": "Pro Active SAS" + }, + { + "application": "Wittenborg Caterchip 2002", + "company": "Ing. Büro Schrick", + "mad": "0x6001", + "service_provider": "Wittenborg Automaten GmbH", + "system_integrator": "Ing. Büro Schrick" + }, + { + "application": "Elecronic food voucher", + "company": "GRUPO VR", + "mad": "0x6002", + "service_provider": "Grupo VR", + "system_integrator": "" + }, + { + "application": "Elecronic supermarket voucher", + "company": "GRUPO VR", + "mad": "0x6003", + "service_provider": "Gruop VR", + "system_integrator": "" + }, + { + "application": "Access controll security payment", + "company": "Matsushita Communication Industrial", + "mad": "0x6004", + "service_provider": "Matsushita Communication", + "system_integrator": "Matsushita Communication" + }, + { + "application": "Electronic food voucher", + "company": "Smart Net Brasil LTDA", + "mad": "0x6005", + "service_provider": "Smart.net Brasil LTDA", + "system_integrator": "Smart.net Brasil LTDA" + }, + { + "application": "Electronic food voucher", + "company": "Smart Net Brasil LTDA", + "mad": "0x6006", + "service_provider": "Smart.net Brasil LTDA", + "system_integrator": "Smart.net Brasil LTDA" + }, + { + "application": "Electronic food voucher", + "company": "Smart Net Brasil LTDA", + "mad": "0x6007", + "service_provider": "Smart.net Brasil LTDA", + "system_integrator": "Smart.net Brasil LTDA" + }, + { + "application": "Electronic food voucher", + "company": "Smart Net Brasil LTDA", + "mad": "0x6008", + "service_provider": "Smart.net Brasil LTDA", + "system_integrator": "Smart.net Brasil LTDA" + }, + { + "application": "Company services, access & sec control, electronic purse...", + "company": "Cominfo a.s.", + "mad": "0x6009", + "service_provider": "Cominfo", + "system_integrator": "Cominfo" + }, + { + "application": "Cshless Payment f. catering/vending", + "company": "VMC House", + "mad": "0x600A", + "service_provider": "VMC", + "system_integrator": "VMC" + }, + { + "application": "Food services", + "company": "Emcard a.s.", + "mad": "0x600B", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "Academic services, food", + "company": "FH Studienbetriebs GmbH", + "mad": "0x600C", + "service_provider": "FH 00E Studienbetriebs GmbH, HSSE", + "system_integrator": "FH 00E Studienbetriebs GmbH, HSSE" + }, + { + "application": "Academic services, food", + "company": "FH Studienbetriebs GmbH", + "mad": "0x600D", + "service_provider": "FH 00E Studienbetriebs GmbH, HSSE", + "system_integrator": "FH 00E Studienbetriebs GmbH, HSSE" + }, + { + "application": "Menue@web", + "company": "Hofmann Menü-Manufaktur GmbH", + "mad": "0x600F", + "service_provider": "Hofmann Menü-Manufaktur GmbH", + "system_integrator": "Hofmann Menü-Manufaktur GmbH" + }, + { + "application": "Food, Payment in restaurant for employees", + "company": "AB Angpanneföreningen", + "mad": "0x6010", + "service_provider": "AB Angpanneföreningen", + "system_integrator": "AB Angpanneföreningen" + }, + { + "application": "Vending", + "company": "Dallmayr Card Systeme Gmbh", + "mad": "0x6011", + "service_provider": "Dallmayr Card Systeme Gmbh", + "system_integrator": "Dallmayr Card Systeme Gmbh" + }, + { + "application": "Vending", + "company": "Dallmayr Card Systeme Gmbh", + "mad": "0x6012", + "service_provider": "Dallmayr Card Systeme Gmbh", + "system_integrator": "Dallmayr Card Systeme Gmbh" + }, + { + "application": "Vending", + "company": "Dallmayr Card Systeme Gmbh", + "mad": "0x6013", + "service_provider": "Dallmayr Card Systeme Gmbh", + "system_integrator": "Dallmayr Card Systeme Gmbh" + }, + { + "application": "Vending", + "company": "Dallmayr Card Systeme Gmbh", + "mad": "0x6014", + "service_provider": "Dallmayr Card Systeme Gmbh", + "system_integrator": "Dallmayr Card Systeme Gmbh" + }, + { + "application": "Food Vending and control", + "company": "N&W Innovative Solutions", + "mad": "0x6015", + "service_provider": "N&W", + "system_integrator": "N&W" + }, + { + "application": "Food Vending and control", + "company": "N&W Innovative Solutions", + "mad": "0x6016", + "service_provider": "N&W", + "system_integrator": "N&W" + }, + { + "application": "Food Vending and control", + "company": "N&W Innovative Solutions", + "mad": "0x6017", + "service_provider": "N&W", + "system_integrator": "N&W" + }, + { + "application": "Food Vending and control", + "company": "N&W Innovative Solutions", + "mad": "0x6018", + "service_provider": "N&W", + "system_integrator": "N&W" + }, + { + "application": "Retail identification and customer loyalty", + "company": "Unisys New Zealand Ltd", + "mad": "0x6801", + "service_provider": "Unisys", + "system_integrator": "Unisys" + }, + { + "application": "Access control, time attendance, bus ticket, hotel room card, VIP card f. club", + "company": "Giga-TMS Inc", + "mad": "0x7001", + "service_provider": "Giga TMS", + "system_integrator": "Giga TMS" + }, + { + "application": "Company services, access & sec control, electronic purse...", + "company": "Cominfo a.s.", + "mad": "0x7002", + "service_provider": "Cominfo", + "system_integrator": "Cominfo" + }, + { + "application": "Car parking, sport applic, hotel, access control systems", + "company": "DATASEC Electronic GmbH", + "mad": "0x7003", + "service_provider": "Datasec", + "system_integrator": "Datatsec" + }, + { + "application": "Hotel, acces control & security", + "company": "Talleres De Escoriaza S.A.", + "mad": "0x7004", + "service_provider": "Talleres", + "system_integrator": "Talleres" + }, + { + "application": "Energy Saving System For Hotels, Access Control", + "company": "ENKOA System", + "mad": "0x7005", + "service_provider": "Enkoa System S.L.", + "system_integrator": "Enkoa System S.L." + }, + { + "application": "Hotel, access contr. & sec", + "company": "Vingcard a.s.", + "mad": "0x7006", + "service_provider": "Vingcard", + "system_integrator": "Vingcard" + }, + { + "application": "Hotel, access contr. & sec", + "company": "Vingcard a.s.", + "mad": "0x7007", + "service_provider": "Vingcard", + "system_integrator": "Vingcard" + }, + { + "application": "Multi Application Purse - Access-Parking", + "company": "MCF RF TECH SRL", + "mad": "0x7008", + "service_provider": "MCF RF TECH S.R.L.", + "system_integrator": "MCF RF TECH S.R.L." + }, + { + "application": "Access control data for electronic locks", + "company": "Timelox AB", + "mad": "0x7009", + "service_provider": "Timelox AB", + "system_integrator": "Timelox AB" + }, + { + "application": "Energy Saving System", + "company": "ENKOA System", + "mad": "0x700A", + "service_provider": "ENKOA System S.L.", + "system_integrator": "ENKOA System S.L." + }, + { + "application": "Energy Saving System", + "company": "ENKOA System", + "mad": "0x700B", + "service_provider": "ENKOA System S.L.", + "system_integrator": "ENKOA System S.L." + }, + { + "application": "Energy Saving System", + "company": "ENKOA System", + "mad": "0x700C", + "service_provider": "ENKOA System S.L.", + "system_integrator": "ENKOA System S.L." + }, + { + "application": "Hotel", + "company": "SIT Solution for IT Payment GmbH", + "mad": "0x700D", + "service_provider": "SIT Solution for IT Payment GmbH", + "system_integrator": "SIT Solution for IT Payment GmbH" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7502", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7503", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7504", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7505", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7506", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7507", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7508", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7509", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x750A", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x750B", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x750C", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x750D", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x750E", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x750F", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7510", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7511", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7512", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7513", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7514", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7515", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7516", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7517", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7518", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7519", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x751A", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x751B", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x751C", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x751D", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x751E", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x751F", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7520", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7521", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7522", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7523", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7524", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7525", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7526", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7527", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7528", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7529", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x752A", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x752B", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x752C", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x752D", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x752E", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x752F", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7530", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7531", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7532", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7533", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7534", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7535", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7536", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7537", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7538", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7539", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x753A", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x753B", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x753C", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x753D", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x753E", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x753F", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7540", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7541", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Access and tiketting system for car sharing", + "company": "Mobility Car Sharing", + "mad": "0x7801", + "service_provider": "Bw-digitronik ag", + "system_integrator": "bw-digitronik ag" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x7901", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x7902", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x7903", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x7904", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x7905", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x7906", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x7907", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x7908", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x7909", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x790A", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x790B", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x790C", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x790D", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x790E", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x790F", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x7910", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Tollway", + "company": "VFJ Technology Pty Ltd", + "mad": "0x8001", + "service_provider": "Austream", + "system_integrator": "Austream" + }, + { + "application": "Access control system, time & attendance system", + "company": "Custom Micro Products Ltd.", + "mad": "0x8002", + "service_provider": "Custom Micro Products Ltd", + "system_integrator": "Custom Micro Products Ltd" + }, + { + "application": "Busticketing System", + "company": "VFJ Technology Pty Ltd", + "mad": "0x8003", + "service_provider": "King Man County Public Traffic", + "system_integrator": "Barouh Electronic Co." + }, + { + "application": "Building Management System", + "company": "VFJ Technology Pty Ltd", + "mad": "0x8004", + "service_provider": "VFJ Hong Kong", + "system_integrator": "VFJ Hong Kong" + }, + { + "application": "Security and safty services", + "company": "Staat der Nederlanden, Ministerie van Financien Belastingdienst/Centrum voor facilitaire dienstverlening", + "mad": "0x8006", + "service_provider": "Siemens Nederland BV", + "system_integrator": "Siemens Nederland BV" + }, + { + "application": "Zeiterfassung, Werks- bzw. Gebäudezutritt", + "company": "Voestalpine Informationstechnologie GmbH", + "mad": "0x8007", + "service_provider": "Voestalpine Informationstechnologie GmbH", + "system_integrator": "Voestalpine Informationstechnologie GmbH" + }, + { + "application": "Accesss control in sport stadiums and e-purse", + "company": "FortressGb", + "mad": "0x8008", + "service_provider": "FORTRESSGB", + "system_integrator": "FORTRESSGB" + }, + { + "application": "Personal social status information", + "company": "Civil Registry Agency of the Ministry of Justice of Georgia", + "mad": "0x8009", + "service_provider": "Civil Registry Agency of the Ministry of Justice of Georgia", + "system_integrator": "" + }, + { + "application": "Bargeldlose Abrechnungs-Systeme für Casino- u. Gemeinschaftsverpflegung", + "company": "EKS GmbH", + "mad": "0x8801", + "service_provider": "", + "system_integrator": "EKS GmbH" + }, + { + "application": "Tollway system", + "company": "VFJ Technology Pty Ltd", + "mad": "0x8802", + "service_provider": "VFJ Technology Pty Ltd", + "system_integrator": "Chendu Shuguang Optical Fibre Network (Ltd. China)" + }, + { + "application": "Tollway system", + "company": "VFJ Technology Pty Ltd", + "mad": "0x8803", + "service_provider": "VFJ Technology Pty Ltd", + "system_integrator": "Chendu Shuguang Optical Fibre Network (Ltd. China)" + }, + { + "application": "Automatic Fare Collection city and intercity bus traffic electronic purse", + "company": "Trgovina in Informatika d.o.o.", + "mad": "0x8804", + "service_provider": "Fourth Way - Alpetour", + "system_integrator": "Fourth Way" + }, + { + "application": "Employer indentification card", + "company": "VFJ Technology Pty Ltd", + "mad": "0x8805", + "service_provider": "VFJ Electronics Pty Ltd.", + "system_integrator": "VFJ Electronics PTy Ltd." + }, + { + "application": "City Transport (Metro ticketing, bus ticket)", + "company": "VFJ Technology Pty Ltd", + "mad": "0x8806", + "service_provider": "VFJ Electronic Pty Ltd.", + "system_integrator": "Cubic - VFJ" + }, + { + "application": "Time attandence, access control + security, electronic purse, plant data collection", + "company": "LNI Ingenieurgesellschaft für Kommunikationstechnik mbH", + "mad": "0x8807", + "service_provider": "LNI GmbH", + "system_integrator": "LNI GmbH" + }, + { + "application": "Intelligent Estate Management System", + "company": "Rax Comm Systems Limited", + "mad": "0x8808", + "service_provider": "Rax Comm Systems Limited", + "system_integrator": "Rax Comm Systems Limited" + }, + { + "application": "Tollway", + "company": "VFJ Technology Pty Ltd", + "mad": "0x8809", + "service_provider": "Xiamto Lintong Tollway", + "system_integrator": "" + }, + { + "application": "Tollway", + "company": "VFJ Technology Pty Ltd", + "mad": "0x880A", + "service_provider": "Xiamto Lintong Tollway", + "system_integrator": "" + }, + { + "application": "Access Controll, Security Electronic Purse, Ski-Ticketing, Ticketing", + "company": "*Siemens ANL", + "mad": "0x880B", + "service_provider": "", + "system_integrator": "Siemens AG" + }, + { + "application": "DEM Komponenten für Zutrittskontrolle, Zeiterfassung, Betribsdatenerfassung, Kantine, Automaten, Tankdatenerf.", + "company": "Phg Peter Hengstler GmbH", + "mad": "0x880C", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Electronic Purse for Casino and comon catering", + "company": "EKS GmbH", + "mad": "0x880D", + "service_provider": "", + "system_integrator": "EKS" + }, + { + "application": "OEM-Komponenten für Zutrittskontrolle, Zeiterfassung, elektr. Geldbörse,...", + "company": "Peter Hengstler GmbH + Co KG", + "mad": "0x880E", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "OEM-Komponenten für Zutrittskontrolle, Zeiterfassung, elektr. Geldbörse,...", + "company": "Peter Hengstler GmbH + Co KG", + "mad": "0x880F", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "OEM-Komponenten für Zutrittskontrolle, Zeiterfassung, elektr. Geldbörse,...", + "company": "Peter Hengstler GmbH + Co KG", + "mad": "0x8810", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "OEM-Komponenten für Zutrittskontrolle, Zeiterfassung, elektr. Geldbörse,...", + "company": "Peter Hengstler GmbH + Co KG", + "mad": "0x8811", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "OEM-Komponenten für Zutrittskontrolle, Zeiterfassung, elektr. Geldbörse,...", + "company": "Peter Hengstler GmbH + Co KG", + "mad": "0x8812", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Tollway", + "company": "VFJ Technology Pty Ltd", + "mad": "0x8813", + "service_provider": "Austream", + "system_integrator": "Austream" + }, + { + "application": "Transport Ticketing, E-Purse, Citycard", + "company": "CJS Consultancy Ltd", + "mad": "0x8814", + "service_provider": "", + "system_integrator": "Transmo Citycard Ltd." + }, + { + "application": "Academic Services, Electronic Purse, Access control & security", + "company": "CNA Limited/Rax-Comm Systems Ltd.", + "mad": "0x8815", + "service_provider": "CNA Limited", + "system_integrator": "CNA Limited" + }, + { + "application": "Busticketing System", + "company": "VFJ Technology Pty Ltd", + "mad": "0x8816", + "service_provider": "King Man County Public Traffic", + "system_integrator": "Barouh Electronic Co." + }, + { + "application": "Electronic Purse", + "company": "Counter Solutions Ltd.", + "mad": "0x8817", + "service_provider": "Counter Solutions", + "system_integrator": "Counter Solutions" + }, + { + "application": "Building Management System", + "company": "VFJ Technology Pty Ltd", + "mad": "0x8818", + "service_provider": "VFJ Hong Kong", + "system_integrator": "VFJ Hong Kong" + }, + { + "application": "Weighbridge for trucks", + "company": "VFJ Technology Pty Ltd", + "mad": "0x8819", + "service_provider": "Hardware Systems Sales", + "system_integrator": "" + }, + { + "application": "Access Control, Time & Attendance, E-Purse", + "company": "BALTECH AG", + "mad": "0x881A", + "service_provider": "Baltech", + "system_integrator": "Baltech" + }, + { + "application": "Access control, payment system", + "company": "Maas Systems B.V.", + "mad": "0x881B", + "service_provider": "Maas Systems B.V.", + "system_integrator": "Maas Systems B.V." + }, + { + "application": "Access controll security payment", + "company": "Matsushita Communication Industrial", + "mad": "0x881C", + "service_provider": "Matsushita Communication", + "system_integrator": "Matsushita Communication" + }, + { + "application": "Electronic Purse", + "company": "ITE Smartcard Solutions Limited", + "mad": "0x881D", + "service_provider": "ITE Smartcard", + "system_integrator": "ITE Smartcard" + }, + { + "application": "Electronic purse", + "company": "ADI Ltd.", + "mad": "0x881E", + "service_provider": "Kakitis Ltd", + "system_integrator": "ADI Ltd" + }, + { + "application": "Contactless e-purse", + "company": "Banrisul Processamento de Dados Ltda.", + "mad": "0x881F", + "service_provider": "Banco do Estado do Rio Grande do Sul S/A", + "system_integrator": "Banco do Estado do Rio Grande do Sul S/A" + }, + { + "application": "Contactless e-purse", + "company": "Banrisul Processamento de Dados Ltda.", + "mad": "0x8820", + "service_provider": "Banco do Estado do Rio Grande do Sul S/A", + "system_integrator": "Banco do Estado do Rio Grande do Sul S/A" + }, + { + "application": "Multi functional badge, private application", + "company": "Microtronic AG", + "mad": "0x8821", + "service_provider": "Microtronic AG", + "system_integrator": "Microtronic AG" + }, + { + "application": "Prepaid Electronic Purse", + "company": "Rosan Finance", + "mad": "0x8822", + "service_provider": "Retail Trade & services, Entertainments, Fastfoods, Gazolines etc", + "system_integrator": "Rosan Finance" + }, + { + "application": "Payment Catering", + "company": "Pecusoft Software-Entwicklungsgesellschaft mbH", + "mad": "0x8823", + "service_provider": "Pecusoft GmbH", + "system_integrator": "Pecusoft GmbH" + }, + { + "application": "Access control, time management, electronic wallet", + "company": "Universitaire Ziekenhuizen Leuven", + "mad": "0x8825", + "service_provider": "", + "system_integrator": "GET NV" + }, + { + "application": "Vending cashless prepaid", + "company": "MCF RF TECH SRL", + "mad": "0x8826", + "service_provider": "MCF", + "system_integrator": "MCF" + }, + { + "application": "Electronic purse", + "company": "IPC Systems BV", + "mad": "0x8827", + "service_provider": "IPC", + "system_integrator": "IPC" + }, + { + "application": "Vending System", + "company": "Quality Equipment Benelux B.V.", + "mad": "0x8828", + "service_provider": "Quality Equipment", + "system_integrator": "Quality Equipment" + }, + { + "application": "Electronic purse", + "company": "Hör GmbH & Co.", + "mad": "0x8829", + "service_provider": "Hör GmbH", + "system_integrator": "Hör GmbH" + }, + { + "application": "Electronic purse", + "company": "Tietoenator Energy Components", + "mad": "0x882A", + "service_provider": "Tietoenator", + "system_integrator": "Tietoenator" + }, + { + "application": "Electronic purse", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x882B", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Electronic purse", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x882C", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Electronic purse", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x882D", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Electronic purse", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x882E", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Electronic purse", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x882F", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Electronic purse", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x8830", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Electronic purse", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x8831", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Electronic purse", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x8832", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Electronic purse", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x8833", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Electronic purse", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x8834", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Computer, car parking, elec. purse, access control & security", + "company": "DECA Engineering", + "mad": "0x8835", + "service_provider": "Deca Engineering", + "system_integrator": "Deca Engineering" + }, + { + "application": "Electronic purse, city traffic", + "company": "Plzeňské Městské Dopravní Podniky A.S.", + "mad": "0x8836", + "service_provider": "Plzenske Mestske", + "system_integrator": "Plzenske Mestske" + }, + { + "application": "", + "company": "TechID Engineering bv", + "mad": "0x8837", + "service_provider": "Tech ID", + "system_integrator": "Tech ID" + }, + { + "application": "Access control, Time attendanc, job control", + "company": "EM Group", + "mad": "0x8838", + "service_provider": "EM Group", + "system_integrator": "EM Group" + }, + { + "application": "Mass Transportation Ticketing", + "company": "Omnifare", + "mad": "0x8839", + "service_provider": "MBS", + "system_integrator": "MBS" + }, + { + "application": "Electronic purse", + "company": "Copie Monnaie France", + "mad": "0x883A", + "service_provider": "Copie Monnaie France", + "system_integrator": "Copie Monnaie France" + }, + { + "application": "Electronic purse", + "company": "Monet+ a.s.", + "mad": "0x883B", + "service_provider": "Monet+", + "system_integrator": "Monet+" + }, + { + "application": "LUAS - light rail", + "company": "Scheidt & Bachmann", + "mad": "0x883C", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x883D", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x883E", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Electronic purse, washing card", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x883F", + "service_provider": "BICA AG", + "system_integrator": "BICA AG" + }, + { + "application": "Electronic purse, washing card", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x8840", + "service_provider": "BICA AG", + "system_integrator": "BICA AG" + }, + { + "application": "Compelete system for lockers, access control & electr. payment", + "company": "Ojmar S. A.", + "mad": "0x8841", + "service_provider": "", + "system_integrator": "Enkoa System S.L." + }, + { + "application": "City traffic, electronic purse, micellaneous applications", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x8842", + "service_provider": "Koordinator", + "system_integrator": "PVT" + }, + { + "application": "Electronic purse, access control for buliding automation", + "company": "CDE Communication Data Engineering GmbH", + "mad": "0x8843", + "service_provider": "CDE", + "system_integrator": "CDE" + }, + { + "application": "Electronic purse, access control for buliding automation", + "company": "CDE Communication Data Engineering GmbH", + "mad": "0x8844", + "service_provider": "CDE", + "system_integrator": "CDE" + }, + { + "application": "Company services, access & sec control, electronic purse...", + "company": "Cominfo a.s.", + "mad": "0x8845", + "service_provider": "Cominfo", + "system_integrator": "Cominfo" + }, + { + "application": "Cashless payment", + "company": "Contidata Datensysteme GmbH", + "mad": "0x8847", + "service_provider": "Contidata", + "system_integrator": "Contidata" + }, + { + "application": "Electronic purse", + "company": "ADE S.r.l.", + "mad": "0x8848", + "service_provider": "ADE", + "system_integrator": "ADE" + }, + { + "application": "Electronic purse", + "company": "ADE S.r.l.", + "mad": "0x8849", + "service_provider": "ADE", + "system_integrator": "ADE" + }, + { + "application": "Electronic purse", + "company": "ADE S.r.l.", + "mad": "0x884A", + "service_provider": "ADE", + "system_integrator": "ADE" + }, + { + "application": "Electronic purse", + "company": "ADE S.r.l.", + "mad": "0x884B", + "service_provider": "ADE", + "system_integrator": "ADE" + }, + { + "application": "Electronic purse", + "company": "Vesiel SPA", + "mad": "0x884C", + "service_provider": "Vesiel", + "system_integrator": "Vesiel" + }, + { + "application": "Electronic purse", + "company": "Vesiel SPA", + "mad": "0x884D", + "service_provider": "Vesiel", + "system_integrator": "Vesiel" + }, + { + "application": "Electronic purse", + "company": "Vesiel SPA", + "mad": "0x884E", + "service_provider": "Vesiel", + "system_integrator": "Vesiel" + }, + { + "application": "Elec ticketing, access control, electronic purse", + "company": "Empresa 1 Sistemas de Automacao e Comercio", + "mad": "0x884F", + "service_provider": "Empresa 1", + "system_integrator": "Empresa 1" + }, + { + "application": "Electronic purse/loyalty", + "company": "Premier Retail Services LTD", + "mad": "0x8850", + "service_provider": "Premier Retail", + "system_integrator": "Premier Retail" + }, + { + "application": "Electronic purse/loyalty", + "company": "Premier Retail Services LTD", + "mad": "0x8851", + "service_provider": "Premier Retail", + "system_integrator": "Premier Retail" + }, + { + "application": "Electronic purse, carparking system, single use ticket, period pass", + "company": "Emcard a.s.", + "mad": "0x8852", + "service_provider": "Emcard", + "system_integrator": "Emtest" + }, + { + "application": "Access & parking control, electronic purse", + "company": "General Meters Corp", + "mad": "0x8853", + "service_provider": "General Meters", + "system_integrator": "General Meters" + }, + { + "application": "Electronic purse", + "company": "DOPRAVNI PODNIK mest Mostu a Litvinova, a.s.", + "mad": "0x8854", + "service_provider": "Dopravni Podnik mest Mostu a Litvinova, a.s.", + "system_integrator": "Mikroelektronika, spol. sr.o., Kpt. Poplera 55, 565 01 Vysoké Myto, CZ" + }, + { + "application": "Privateive Payment System", + "company": "Aztek", + "mad": "0x8855", + "service_provider": "Aztek", + "system_integrator": "Aztek" + }, + { + "application": "Car Parking, Electronic Purse", + "company": "Haguess s.r.o.", + "mad": "0x8856", + "service_provider": "Haguess, s.r.o.", + "system_integrator": "Haguess, s.r.o." + }, + { + "application": "Electronic purse", + "company": "Emcard a.s.", + "mad": "0x8857", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "MulitApplicaton Purse", + "company": "MCF RF TECH SRL", + "mad": "0x8858", + "service_provider": "MCF Vending", + "system_integrator": "MCF Vending" + }, + { + "application": "Electr purse f. health services", + "company": "QSI", + "mad": "0x8859", + "service_provider": "QSI", + "system_integrator": "QSI" + }, + { + "application": "Closed elc. purse", + "company": "Siemens AG Österreich", + "mad": "0x885A", + "service_provider": "Siemens", + "system_integrator": "Siemens" + }, + { + "application": "Copy machine", + "company": "BCM Bureautique", + "mad": "0x885B", + "service_provider": "BCM Bureautique", + "system_integrator": "BCM Bureautique, Mr. Larbi Seridj" + }, + { + "application": "Transit SmartCard System, City E-purse System", + "company": "Intelligent Transaction Systems de Mexico S.A. de C.V.", + "mad": "0x885C", + "service_provider": "St. John's Transportation Commission", + "system_integrator": "Intelligent Transaction Systems de Mexico" + }, + { + "application": "Electronic purse, city traffic, customer profile, service applic, check-in/out applic", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x885D", + "service_provider": "Mikroelektronika", + "system_integrator": "Mikroelektronika" + }, + { + "application": "Payment, payment OEM, payment partner, entertainment, OEM data", + "company": "Payment Solution AG", + "mad": "0x885E", + "service_provider": "Payment Solution AG", + "system_integrator": "Payment Solution AG" + }, + { + "application": "Payment, payment OEM, payment partner, entertainment, OEM data", + "company": "Payment Solution AG", + "mad": "0x885F", + "service_provider": "Payment Solution AG", + "system_integrator": "Payment Solution AG" + }, + { + "application": "Payment, payment OEM, payment partner, entertainment, OEM data", + "company": "Payment Solution AG", + "mad": "0x8860", + "service_provider": "Payment Solution AG", + "system_integrator": "Payment Solution AG" + }, + { + "application": "E-Purse", + "company": "PT Visionet Internasional", + "mad": "0x8861", + "service_provider": "Visionet", + "system_integrator": "Multipolar" + }, + { + "application": "E-Purse", + "company": "PT Visionet Internasional", + "mad": "0x8862", + "service_provider": "Visionet", + "system_integrator": "Multipolar" + }, + { + "application": "E-Purse", + "company": "PT Visionet Internasional", + "mad": "0x8863", + "service_provider": "Visionet", + "system_integrator": "Multipolar" + }, + { + "application": "Electronic purse", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x8864", + "service_provider": "Siemens Itron Business Services S.A. - Cordoba, Republica Argentina", + "system_integrator": "Siemens Itron Business Services S.A. - Cordoba, Republica Argentina" + }, + { + "application": "Cashless Payment System", + "company": "Infineer", + "mad": "0x8865", + "service_provider": "Infineer", + "system_integrator": "" + }, + { + "application": "Cashless Payment System", + "company": "Infineer", + "mad": "0x8866", + "service_provider": "Infineer", + "system_integrator": "" + }, + { + "application": "Self service kiosk application (ordering and printing photos)", + "company": "CeWe Color AG & Co OHG", + "mad": "0x8867", + "service_provider": "CeWe Color AG & Co OHG", + "system_integrator": "CeWe Color AG & Co OHG" + }, + { + "application": "Self service kiosk application (ordering and printing photos)", + "company": "CeWe Color AG & Co OHG", + "mad": "0x8868", + "service_provider": "CeWe Color AG & Co OHG", + "system_integrator": "CeWe Color AG & Co OHG" + }, + { + "application": "Multiapplication Purse", + "company": "MCF RF TECH SRL", + "mad": "0x8869", + "service_provider": "MCF RF TECH S.R.L.", + "system_integrator": "MCF RF TECH S.R.L." + }, + { + "application": "Vending-Cashless_prepaid", + "company": "MCF RF TECH SRL", + "mad": "0x886A", + "service_provider": "MCF RF TECH S.R.L.", + "system_integrator": "MCF RF TECH S.R.L." + }, + { + "application": "Online Electronic Payment System", + "company": "PinCash International", + "mad": "0x886B", + "service_provider": "Pincash international BV", + "system_integrator": "Pincash international BV" + }, + { + "application": "E-Money Application", + "company": "SQuidcard Ltd", + "mad": "0x886C", + "service_provider": "Squidcard Limited", + "system_integrator": "Applied Card Technologies Ltd" + }, + { + "application": "E-purse", + "company": "Asdion Berhad", + "mad": "0x886D", + "service_provider": "Asdion Berhad", + "system_integrator": "Asdion Berhad" + }, + { + "application": "MIFARE based payment system", + "company": "supercard as", + "mad": "0x886E", + "service_provider": "Supercard as", + "system_integrator": "supercard as" + }, + { + "application": "Electronic purse", + "company": "Group Capmonetique", + "mad": "0x886F", + "service_provider": "CARTAX", + "system_integrator": "MONECARTE" + }, + { + "application": "Electronic purse", + "company": "Group Capmonetique", + "mad": "0x8870", + "service_provider": "SEDECO", + "system_integrator": "MONECARTE" + }, + { + "application": "Electronic purse", + "company": "Group Capmonetique", + "mad": "0x8871", + "service_provider": "MONECARTE", + "system_integrator": "MONECARTE" + }, + { + "application": "Eectronic purse for CROUS", + "company": "Group Capmonetique", + "mad": "0x8872", + "service_provider": "MONECARTE", + "system_integrator": "MONECARTE" + }, + { + "application": "Copier vending Follow-Me Printing", + "company": "Xafax Nederland BV", + "mad": "0x8873", + "service_provider": "Xafax Nederland", + "system_integrator": "Xafax Nederland" + }, + { + "application": "Copier vending Follow-Me Printing", + "company": "Xafax Nederland BV", + "mad": "0x8874", + "service_provider": "Xafax Nederland", + "system_integrator": "Xafax Nederland" + }, + { + "application": "Epurse", + "company": "KORID LK, spol. s r.o", + "mad": "0x8875", + "service_provider": "KORID LK, spol.s.r.o.", + "system_integrator": "KORID LK, spol.s.r.o." + }, + { + "application": "Electronic purse", + "company": "Mikroelektronika GmbH", + "mad": "0x8876", + "service_provider": "MIKROELEKTRONIKA spol.s.r.o., Draby 849, Vysoke Myto 56601, Czech Republic", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o., Draby 849, Vysoke Myto 56601, Czech Republic" + }, + { + "application": "Electronic payment", + "company": "Dallmayr Card Systeme Gmbh", + "mad": "0x8877", + "service_provider": "Dallmayr Card Systeme Gmbh", + "system_integrator": "Dallmayr Card Systeme Gmbh" + }, + { + "application": "Electronic payment", + "company": "Dallmayr Card Systeme Gmbh", + "mad": "0x8878", + "service_provider": "Dallmayr Card Systeme Gmbh", + "system_integrator": "Dallmayr Card Systeme Gmbh" + }, + { + "application": "Electronic payment", + "company": "Dallmayr Card Systeme Gmbh", + "mad": "0x8879", + "service_provider": "Dallmayr Card Systeme Gmbh", + "system_integrator": "Dallmayr Card Systeme Gmbh" + }, + { + "application": "Electronic payment", + "company": "Dallmayr Card Systeme Gmbh", + "mad": "0x887A", + "service_provider": "Dallmayr Card Systeme Gmbh", + "system_integrator": "Dallmayr Card Systeme Gmbh" + }, + { + "application": "Electronic purse", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x887B", + "service_provider": "ZAGREBACKI Holding d.o.o.", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o." + }, + { + "application": "Electronic purse", + "company": "Mikroelektronika GmbH", + "mad": "0x887C", + "service_provider": "MIKROELEKTRONIKA spol.s.r.o.", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o." + }, + { + "application": "Electronic purse", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x887D", + "service_provider": "Mikroelektronika spol.s r.o", + "system_integrator": "Mikroelektronika spol.s r.o" + }, + { + "application": "Electronic Purse", + "company": "Electronic and Software Engineering Limited (EASEL)", + "mad": "0x887E", + "service_provider": "EASEL", + "system_integrator": "EASEL" + }, + { + "application": "Contactless payment", + "company": "Chess embedded Technology", + "mad": "0x887F", + "service_provider": "Chess", + "system_integrator": "Chess" + }, + { + "application": "Electronic purse", + "company": "WIGOTEK, Hardware Software Beratung", + "mad": "0x8880", + "service_provider": "WIGOTEK", + "system_integrator": "WIGOTEK" + }, + { + "application": "Electronic purse", + "company": "WIGOTEK, Hardware Software Beratung", + "mad": "0x8881", + "service_provider": "WIGOTEK", + "system_integrator": "WIGOTEK" + }, + { + "application": "Electronic purse", + "company": "ENKOA System", + "mad": "0x8882", + "service_provider": "ENKOA System S.L.", + "system_integrator": "ENKOA System S.L." + }, + { + "application": "Electronic payment", + "company": "Alcatel-Lucent Bell NV", + "mad": "0x8883", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Electronic payment", + "company": "Alcatel-Lucent Bell NV", + "mad": "0x8884", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Electronic payment", + "company": "Alcatel-Lucent Bell NV", + "mad": "0x8885", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Vending control systems - point, cash purse", + "company": "Unicard S.A.", + "mad": "0x8886", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "Vending control systems - point, cash purse", + "company": "Unicard S.A.", + "mad": "0x8887", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "Vending control systems - point, cash purse", + "company": "Unicard S.A.", + "mad": "0x8888", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "Electronic purse", + "company": "Inepro BV", + "mad": "0x8889", + "service_provider": "Inepro BV", + "system_integrator": "" + }, + { + "application": "Electronic purse", + "company": "Inepro BV", + "mad": "0x888A", + "service_provider": "Inepro BV", + "system_integrator": "" + }, + { + "application": "Electronic purse", + "company": "Inepro BV", + "mad": "0x888B", + "service_provider": "Inepro BV", + "system_integrator": "" + }, + { + "application": "Electronic purse", + "company": "Inepro BV", + "mad": "0x888C", + "service_provider": "Inepro BV", + "system_integrator": "" + }, + { + "application": "Electronic purse", + "company": "Inepro BV", + "mad": "0x888D", + "service_provider": "Inepro BV", + "system_integrator": "" + }, + { + "application": "Electronic purse", + "company": "Inepro BV", + "mad": "0x888E", + "service_provider": "Inepro BV", + "system_integrator": "" + }, + { + "application": "Electronic purse", + "company": "Inepro BV", + "mad": "0x888F", + "service_provider": "Inepro BV", + "system_integrator": "" + }, + { + "application": "Electronic purse", + "company": "Inepro BV", + "mad": "0x8890", + "service_provider": "Inepro BV", + "system_integrator": "" + }, + { + "application": "Electronic purse", + "company": "Inepro BV", + "mad": "0x8891", + "service_provider": "Inepro BV", + "system_integrator": "" + }, + { + "application": "Electronic purse", + "company": "Inepro BV", + "mad": "0x8892", + "service_provider": "Inepro BV", + "system_integrator": "" + }, + { + "application": "Electronic purse for use in proprietary closed system", + "company": "Absec Malaysia SDN BHD", + "mad": "0x8893", + "service_provider": "Absec Malaysia SDN BHD", + "system_integrator": "MLGN Solutions Ltd" + }, + { + "application": "Electronic purse for use in proprietary closed system", + "company": "Absec Malaysia SDN BHD", + "mad": "0x8894", + "service_provider": "Absec Malaysia SDN BHD", + "system_integrator": "MLGN Solutions Ltd" + }, + { + "application": "Electronic purse", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x8895", + "service_provider": "KOORDINATOR ODIS s.r.o.", + "system_integrator": "KOORDINATOR ODIS s.r.o." + }, + { + "application": "Service application for municipal chip card - customer profile (registration) - validity of card (registration)", + "company": "Plzeňské Městské Dopravní Podniky A.S.", + "mad": "0x8896", + "service_provider": "Plzeňské Městské Dopravní Podniky A.S.", + "system_integrator": "Plzeňské Městské Dopravní Podniky A.S." + }, + { + "application": "Electronic purse", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x8897", + "service_provider": "Jamaica Urban Transit Company Ltd", + "system_integrator": "Mikroelektronika spol.s r.o" + }, + { + "application": "Open cashfile electronic purse", + "company": "Ingenieurbüro Ludwig - Ib Ludwig", + "mad": "0x8898", + "service_provider": "OCF open Cashfile", + "system_integrator": "OCF open Cashfile members" + }, + { + "application": "Open cashfile electronic purse", + "company": "Ingenieurbüro Ludwig - Ib Ludwig", + "mad": "0x8899", + "service_provider": "OCF open Cashfile", + "system_integrator": "OCF open Cashfile members" + }, + { + "application": "Open cashfile electronic purse", + "company": "Ingenieurbüro Ludwig - Ib Ludwig", + "mad": "0x889A", + "service_provider": "OCF open Cashfile", + "system_integrator": "OCF open Cashfile members" + }, + { + "application": "Open cashfile electronic purse", + "company": "Ingenieurbüro Ludwig - Ib Ludwig", + "mad": "0x889B", + "service_provider": "OCF open Cashfile", + "system_integrator": "OCF open Cashfile members" + }, + { + "application": "Open cashfile electronic purse", + "company": "Ingenieurbüro Ludwig - Ib Ludwig", + "mad": "0x889C", + "service_provider": "OCF open Cashfile", + "system_integrator": "OCF open Cashfile members" + }, + { + "application": "Open cashfile electronic purse", + "company": "Ingenieurbüro Ludwig - Ib Ludwig", + "mad": "0x889D", + "service_provider": "OCF open Cashfile", + "system_integrator": "OCF open Cashfile members" + }, + { + "application": "Payment system - electronic purse", + "company": "N&W Innovative Solutions", + "mad": "0x889E", + "service_provider": "N&W", + "system_integrator": "N&W" + }, + { + "application": "Payment system - electronic purse", + "company": "N&W Innovative Solutions", + "mad": "0x889F", + "service_provider": "N&W", + "system_integrator": "N&W" + }, + { + "application": "Payment system - electronic purse", + "company": "N&W Innovative Solutions", + "mad": "0x88A0", + "service_provider": "N&W", + "system_integrator": "N&W" + }, + { + "application": "Payment system - electronic purse", + "company": "N&W Innovative Solutions", + "mad": "0x88A1", + "service_provider": "N&W", + "system_integrator": "N&W" + }, + { + "application": "Contactless payment", + "company": "Rabobank International", + "mad": "0x88A2", + "service_provider": "Rabobank", + "system_integrator": "Rabobank" + }, + { + "application": "Contactless payment", + "company": "Amsterdam Arena", + "mad": "0x88A3", + "service_provider": "Amsterdam Arena", + "system_integrator": "Amsterdam Arena" + }, + { + "application": "Contactless payment", + "company": "Multicard", + "mad": "0x88A4", + "service_provider": "MULTICARD", + "system_integrator": "MULTICARD" + }, + { + "application": "Electronic purse", + "company": "ODP-software s.r.o.", + "mad": "0x88A5", + "service_provider": "ODP-software", + "system_integrator": "ODP-software" + }, + { + "application": "Electronic purse", + "company": "ODP-software s.r.o.", + "mad": "0x88A6", + "service_provider": "ODP-software", + "system_integrator": "ODP-software" + }, + { + "application": "Electronic purse", + "company": "SIT Solution for IT Payment GmbH", + "mad": "0x88A7", + "service_provider": "SIT Solution for IT Payment GmbH", + "system_integrator": "SIT Solution for IT Payment GmbH" + }, + { + "application": "Accesss control in sport stadiums and e-purse", + "company": "FortressGb", + "mad": "0x88AB", + "service_provider": "FORTRESSGB", + "system_integrator": "FORTRESSGB" + }, + { + "application": "Smart City Card \\Schwabencard\"\"", + "company": "Cosmo.id GmbH", + "mad": "0x88AC", + "service_provider": "Cosmo.id", + "system_integrator": "Cosmo.id" + }, + { + "application": "Electronic purse", + "company": "OREDO s.r.o", + "mad": "0x88AD", + "service_provider": "OREDO s.r.o", + "system_integrator": "OREDO s.r.o" + }, + { + "application": "Electronic purse", + "company": "OREDO s.r.o", + "mad": "0x88AE", + "service_provider": "OREDO s.r.o", + "system_integrator": "OREDO s.r.o" + }, + { + "application": "Electronic purse", + "company": "Ústecky kraj", + "mad": "0x88AF", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Electronic purse", + "company": "Ústecky kraj", + "mad": "0x88B0", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Electronic purse", + "company": "TELMAX s.r.o.", + "mad": "0x88B1", + "service_provider": "TELMAX s.r.o.", + "system_integrator": "TELMAX s.r.o." + }, + { + "application": "Contactless Card for payment operations in Kiosk Payment system", + "company": "Sistemas Tecnicos de Cobro S.L.", + "mad": "0x88B2", + "service_provider": "Sistemas Tecnicos de Cobro S.L.", + "system_integrator": "Sistemas Tecnicos de Cobro S.L." + }, + { + "application": "Access control, canteen functionality", + "company": "Elektroniske Betalings Systemer AS", + "mad": "0x88B3", + "service_provider": "Elektroniske Betalings Systemer AS", + "system_integrator": "Elektroniske Betalings Systemer AS" + }, + { + "application": "Electronic purse", + "company": "HUG-Witschi AG", + "mad": "0x88B4", + "service_provider": "HUG-Witschi AG", + "system_integrator": "HUG-Witschi AG" + }, + { + "application": "Electronic purse", + "company": "HUG-Witschi AG", + "mad": "0x88B5", + "service_provider": "HUG-Witschi AG", + "system_integrator": "HUG-Witschi AG" + }, + { + "application": "Electronic purse", + "company": "HUG-Witschi AG", + "mad": "0x88B6", + "service_provider": "HUG-Witschi AG", + "system_integrator": "HUG-Witschi AG" + }, + { + "application": "Electronic purse", + "company": "HUG-Witschi AG", + "mad": "0x88B7", + "service_provider": "HUG-Witschi AG", + "system_integrator": "HUG-Witschi AG" + }, + { + "application": "FIDELIO CRUISE ship property management system, - materials management system, - meal counting system", + "company": "FIDELIO CRUISE SOFTWARE GMBH", + "mad": "0x9101", + "service_provider": "FIDELIO CRUISE SOFTWARE GMBH", + "system_integrator": "FIDELIO CRUISE SOFTWARE GMBH" + }, + { + "application": "FIDELIO CRUISE ship property management system, - materials management system, - meal counting system", + "company": "FIDELIO CRUISE SOFTWARE GMBH", + "mad": "0x9102", + "service_provider": "FIDELIO CRUISE SOFTWARE GMBH", + "system_integrator": "FIDELIO CRUISE SOFTWARE GMBH" + }, + { + "application": "FIDELIO CRUISE ship property management system, - materials management system, - meal counting system", + "company": "FIDELIO CRUISE SOFTWARE GMBH", + "mad": "0x9103", + "service_provider": "FIDELIO CRUISE SOFTWARE GMBH", + "system_integrator": "FIDELIO CRUISE SOFTWARE GMBH" + }, + { + "application": "General / NXP Test / Graz", + "company": "Philips Semiconductors Gratkorn GmbH", + "mad": "0x9502", + "service_provider": "NXP", + "system_integrator": "NXP" + }, + { + "application": "General / NXP Test / Graz", + "company": "Philips Semiconductors Gratkorn GmbH", + "mad": "0x9503", + "service_provider": "NXP", + "system_integrator": "NXP" + }, + { + "application": "General / NXP Test / Graz", + "company": "Philips Semiconductors Gratkorn GmbH", + "mad": "0x9504", + "service_provider": "NXP", + "system_integrator": "NXP" + }, + { + "application": "Prepaid Meteringh, service functions of technical systems", + "company": "Engelmann Sensor GmbH", + "mad": "0x9702", + "service_provider": "Engelmann Sensor GmbH", + "system_integrator": "Engelmann Sensor GmbH" + }, + { + "application": "Prepaid Meteringh, service functions of technical systems", + "company": "Engelmann Sensor GmbH", + "mad": "0x9703", + "service_provider": "Engelmann Sensor GmbH", + "system_integrator": "Engelmann Sensor GmbH" + }, + { + "application": "Prepaid Meteringh, service functions of technical systems", + "company": "Engelmann Sensor GmbH", + "mad": "0x9704", + "service_provider": "Engelmann Sensor GmbH", + "system_integrator": "Engelmann Sensor GmbH" + }, + { + "application": "Prepaid Meteringh, service functions of technical systems", + "company": "Engelmann Sensor GmbH", + "mad": "0x9705", + "service_provider": "Engelmann Sensor GmbH", + "system_integrator": "Engelmann Sensor GmbH" + }, + { + "application": "Prepaid Meteringh, service functions of technical systems", + "company": "Engelmann Sensor GmbH", + "mad": "0x9706", + "service_provider": "Engelmann Sensor GmbH", + "system_integrator": "Engelmann Sensor GmbH" + }, + { + "application": "Prepaid Meteringh, service functions of technical systems", + "company": "Engelmann Sensor GmbH", + "mad": "0x9707", + "service_provider": "Engelmann Sensor GmbH", + "system_integrator": "Engelmann Sensor GmbH" + }, + { + "application": "Prepaid Meteringh, service functions of technical systems", + "company": "Engelmann Sensor GmbH", + "mad": "0x9708", + "service_provider": "Engelmann Sensor GmbH", + "system_integrator": "Engelmann Sensor GmbH" + }, + { + "application": "Health services", + "company": "Rosan Finance", + "mad": "0xA001", + "service_provider": "Express Card", + "system_integrator": "Express Card" + }, + { + "application": "Card holders vital medical data", + "company": "Rosan Finance", + "mad": "0xA002", + "service_provider": "Medical Org.", + "system_integrator": "Rosan Finance" + }, + { + "application": "Identification of card holder", + "company": "Rosan Finance", + "mad": "0xA003", + "service_provider": "Hospitals Cllinics Drug Stores", + "system_integrator": "Rosan Finance" + }, + { + "application": "Medical information", + "company": "CYNAPS", + "mad": "0xA004", + "service_provider": "Cynaps", + "system_integrator": "Cynaps" + }, + { + "application": "Medical information", + "company": "CYNAPS", + "mad": "0xA005", + "service_provider": "Cynaps", + "system_integrator": "Cynaps" + }, + { + "application": "Medical information", + "company": "CYNAPS", + "mad": "0xA006", + "service_provider": "Cynaps", + "system_integrator": "Cynaps" + }, + { + "application": "Medical information", + "company": "CYNAPS", + "mad": "0xA007", + "service_provider": "Cynaps", + "system_integrator": "Cynaps" + }, + { + "application": "Medical information", + "company": "CYNAPS", + "mad": "0xA008", + "service_provider": "Cynaps", + "system_integrator": "Cynaps" + }, + { + "application": "Access control & security, city traffic, sports & entertainment", + "company": "IP Core", + "mad": "0xA009", + "service_provider": "IP Core", + "system_integrator": "IP Core" + }, + { + "application": "Self service, pharmacy, medicine issue", + "company": "EnzoSystems BV", + "mad": "0xA00A", + "service_provider": "EnzoSystems", + "system_integrator": "EnzoSystems" + }, + { + "application": "Health Services", + "company": "QSI", + "mad": "0xA00B", + "service_provider": "QSI", + "system_integrator": "QSI" + }, + { + "application": "Health services", + "company": "Carelink AB", + "mad": "0xA00C", + "service_provider": "Carelink AB", + "system_integrator": "Carelink AB" + }, + { + "application": "Debit card, door access control, computer identification", + "company": "Netcard", + "mad": "0xB001", + "service_provider": "Netcard", + "system_integrator": "Netcard" + }, + { + "application": "Multiapplication car for industry & trafic, parking, swimming pool", + "company": "ASEC S.A.", + "mad": "0xB002", + "service_provider": "ASEC S.A", + "system_integrator": "ASEC S.A" + }, + { + "application": "Miscellaneous application, city traffic, access controll & securitym entertainment, car parking, electronic trade", + "company": "KFAP S.A.", + "mad": "0xB003", + "service_provider": "KFPA", + "system_integrator": "KFPA" + }, + { + "application": "", + "company": "Reac BV", + "mad": "0xB004", + "service_provider": "", + "system_integrator": "REAC" + }, + { + "application": "Electronic purse", + "company": "BULL POLSKA Sp. z o.o.", + "mad": "0xB005", + "service_provider": "BULL POLSKA", + "system_integrator": "BULL POLSKA" + }, + { + "application": "Electronic trade", + "company": "SIT Solution for IT Payment GmbH", + "mad": "0xB006", + "service_provider": "SIT Solution for IT Payment GmbH", + "system_integrator": "SIT Solution for IT Payment GmbH" + }, + { + "application": "Electronic voucher system, loyalty application, electronic wallet, transport", + "company": "Prosoft SPOL S.R.O", + "mad": "0xB007", + "service_provider": "Prosoft SPOL S.R.O", + "system_integrator": "Prosoft SPOL S.R.O" + }, + { + "application": "Electronic voucher system, loyalty application, electronic wallet, transport", + "company": "Prosoft SPOL S.R.O", + "mad": "0xB008", + "service_provider": "Prosoft SPOL S.R.O", + "system_integrator": "Prosoft SPOL S.R.O" + }, + { + "application": "Electronic voucher system, loyalty application, electronic wallet, transport", + "company": "Prosoft SPOL S.R.O", + "mad": "0xB009", + "service_provider": "Prosoft SPOL S.R.O", + "system_integrator": "Prosoft SPOL S.R.O" + }, + { + "application": "Electronic voucher system, loyalty application, electronic wallet, transport", + "company": "Prosoft SPOL S.R.O", + "mad": "0xB00A", + "service_provider": "Prosoft SPOL S.R.O", + "system_integrator": "Prosoft SPOL S.R.O" + }, + { + "application": "Point of sale", + "company": "VFJ Technology Pty Ltd", + "mad": "0xB801", + "service_provider": "VFJ Technology", + "system_integrator": "" + }, + { + "application": "An electronic purse application for Educational Institutions (Universities etc...)", + "company": "VERIFONE ITALIA SRL", + "mad": "0xB802", + "service_provider": "VeriFone Italy", + "system_integrator": "VeriFone Italy" + }, + { + "application": "Banking electronic purse", + "company": "ETC Electronic Technology Communication Company Limited", + "mad": "0xB803", + "service_provider": "Electronic Technology Communication Co Ltd.", + "system_integrator": "Electronic Technology Communication Co Ltd." + }, + { + "application": "Banking prepaid payment", + "company": "ETC Electronic Technology Communication Company Limited", + "mad": "0xB804", + "service_provider": "Vietnam Joint Stock Commercial Bank for Industry and trade (VietinBank)", + "system_integrator": "Electronic Technology Communication Co Ltd (E.T.C)" + }, + { + "application": "Multichip and Multiapplication Credit Card for banking, electronic purse, access control, payment and identification", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0xB805", + "service_provider": "CCC Credit Card Center AG", + "system_integrator": "" + }, + { + "application": "Gaming industry, cashless operation for slotmachines, tables and other Facilities (ID, cashless, offline, purse)", + "company": "Grips Electronic GmbH", + "mad": "0xC001", + "service_provider": "Sun International", + "system_integrator": "Grips, Sun International" + }, + { + "application": "Gaming industry, cashless operation for slotmachines, tables and other Facilities (ID, cashless, offline, purse)", + "company": "Grips Electronic GmbH", + "mad": "0xC002", + "service_provider": "Sun International", + "system_integrator": "Grips, Sun International" + }, + { + "application": "Gaming industry, cashless operation for slotmachines, tables and other Facilities (ID, cashless, offline, purse)", + "company": "Grips Electronic GmbH", + "mad": "0xC003", + "service_provider": "Sun International", + "system_integrator": "Grips, Sun International" + }, + { + "application": "Gaming industry, cashless operation for slotmachines, tables and other Facilities (ID, cashless, offline, purse)", + "company": "Grips Electronic GmbH", + "mad": "0xC004", + "service_provider": "Sun International", + "system_integrator": "Grips, Sun International" + }, + { + "application": "Access Controll, Security Electronic Purse, Ski-Ticketing, Ticketing", + "company": "*Siemens ANL", + "mad": "0xC005", + "service_provider": "", + "system_integrator": "Siemens AG" + }, + { + "application": "Security and safty services", + "company": "Staat der Nederlanden, Ministerie van Financien Belastingdienst/Centrum voor facilitaire dienstverlening", + "mad": "0xC006", + "service_provider": "Siemens Nederland BV", + "system_integrator": "Siemens Nederland BV" + }, + { + "application": "Event ticketing", + "company": "Just Access", + "mad": "0xC007", + "service_provider": "Just Access Inc.", + "system_integrator": "" + }, + { + "application": "Entertainment & Sports", + "company": "A&A Company", + "mad": "0xC008", + "service_provider": "A&A Company", + "system_integrator": "A&A Company" + }, + { + "application": "Miscellaneous application, city traffic, access control & security, entertainment, car parking, electronic trade", + "company": "KFAP S.A.", + "mad": "0xC009", + "service_provider": "KFPA", + "system_integrator": "KFPA" + }, + { + "application": "Access control, time attendance, bus ticket, hotel room card, VIP card f. club", + "company": "Giga-TMS Inc", + "mad": "0xC01A", + "service_provider": "Giga TMS", + "system_integrator": "Giga TMS" + }, + { + "application": "Access control & security, entertainment and sports", + "company": "Giga-TMS Inc", + "mad": "0xC01B", + "service_provider": "Giga", + "system_integrator": "Giga" + }, + { + "application": "Entertainment and Sports, Stadiums, Parking, Ski Ticketing", + "company": "Axess AG", + "mad": "0xC01C", + "service_provider": "Axess", + "system_integrator": "Axess" + }, + { + "application": "Entertainment and Sports, Stadiums, Parking, Ski Ticketing", + "company": "Axess AG", + "mad": "0xC01D", + "service_provider": "Axess", + "system_integrator": "Axess" + }, + { + "application": "Entertainment and Sports, Stadiums, Parking, Ski Ticketing", + "company": "Axess AG", + "mad": "0xC01E", + "service_provider": "Axess", + "system_integrator": "Axess" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC01F", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC020", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC021", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC022", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC023", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC024", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC025", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC026", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC027", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC028", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC029", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC02A", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC02B", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC02C", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC02D", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Compelete system for lockers, access control & electr. payment", + "company": "Ojmar S. A.", + "mad": "0xC02E", + "service_provider": "", + "system_integrator": "Enkoa System S.L." + }, + { + "application": "Company services, access & sec control, electronic purse...", + "company": "Cominfo a.s.", + "mad": "0xC02F", + "service_provider": "Cominfo", + "system_integrator": "Cominfo" + }, + { + "application": "Entertainment & sports", + "company": "n-tree Solutions Ticketsysteme", + "mad": "0xC030", + "service_provider": "n-tree", + "system_integrator": "n-tree" + }, + { + "application": "Access control & security, city traffic, sports & entertainment", + "company": "IP Core", + "mad": "0xC031", + "service_provider": "IP Core", + "system_integrator": "IP Core" + }, + { + "application": "StadiumTicketing & Access Contr", + "company": "T-Systems GEI GmbH", + "mad": "0xC032", + "service_provider": "T-Systems GEI GmbH", + "system_integrator": "T-Systems GEI GmbH" + }, + { + "application": "Car parking, sport applic, hotel, access control systems", + "company": "DATASEC Electronic GmbH", + "mad": "0xC033", + "service_provider": "Datasec", + "system_integrator": "Datatsec" + }, + { + "application": "Gaming Industry", + "company": "Systems in Progress", + "mad": "0xC040", + "service_provider": "Systems in Progress", + "system_integrator": "Systems in Progress" + }, + { + "application": "Gaming Industry", + "company": "Systems in Progress", + "mad": "0xC041", + "service_provider": "Systems in Progress", + "system_integrator": "Systems in Progress" + }, + { + "application": "Gaming Industry", + "company": "Systems in Progress", + "mad": "0xC042", + "service_provider": "Systems in Progress", + "system_integrator": "Systems in Progress" + }, + { + "application": "Gaming Industry", + "company": "Systems in Progress", + "mad": "0xC043", + "service_provider": "Systems in Progress", + "system_integrator": "Systems in Progress" + }, + { + "application": "Payment, payment OEM, payment partner, entertainment, OEM data", + "company": "Payment Solution AG", + "mad": "0xC044", + "service_provider": "Payment Solution AG", + "system_integrator": "Payment Solution AG" + }, + { + "application": "Scorecard for golf, payment solution for golf", + "company": "Gobex", + "mad": "0xC045", + "service_provider": "Gobex", + "system_integrator": "Gobex" + }, + { + "application": "Scorecard for golf, payment solution for golf", + "company": "Gobex", + "mad": "0xC046", + "service_provider": "Gobex", + "system_integrator": "Gobex" + }, + { + "application": "Leisure Management Application. inc. bookings, access control, e-purse and Electronic Point of Sale", + "company": "Gladstone Health & Leisure", + "mad": "0xC047", + "service_provider": "Gladstone", + "system_integrator": "Gladstone" + }, + { + "application": "Leisure Management Application. inc. bookings, access control, e-purse and Electronic Point of Sale", + "company": "Gladstone Health & Leisure", + "mad": "0xC048", + "service_provider": "Gladstone", + "system_integrator": "Gladstone" + }, + { + "application": "Event ticketing", + "company": "IMA ltd.", + "mad": "0xC049", + "service_provider": "IMA LTD.", + "system_integrator": "IMA LTD." + }, + { + "application": "Soccer stadium ticketing and e-purse application", + "company": "Smartchip S.A.", + "mad": "0xC04A", + "service_provider": "Corporacion Dim", + "system_integrator": "Smartchip S.A." + }, + { + "application": "Entertainment & spports", + "company": "Gantner Electronic GmbH", + "mad": "0xC04B", + "service_provider": "GANTNER Electronic", + "system_integrator": "GANTNER Electronic" + }, + { + "application": "Multi-purpose application for sport facilities - access control, purse etc for stadiums, sport centers etc", + "company": "Unicard S.A.", + "mad": "0xC04C", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "Multi-purpose application for sport facilities - access control, purse etc for stadiums, sport centers etc", + "company": "Unicard S.A.", + "mad": "0xC04D", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "Multi-purpose application for sport facilities - access control, purse etc for stadiums, sport centers etc", + "company": "Unicard S.A.", + "mad": "0xC04E", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "Multi-purpose application for sport facilities - access control, purse etc for stadiums, sport centers etc", + "company": "Unicard S.A.", + "mad": "0xC04F", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "", + "company": "Reac BV", + "mad": "0xC050", + "service_provider": "", + "system_integrator": "REAC" + }, + { + "application": "Access control and ticketing for entertainment and sports", + "company": "Mosrir Szczecin", + "mad": "0xC051", + "service_provider": "Mosrir Szczecin", + "system_integrator": "Sportdata Sp. 2 0.0." + }, + { + "application": "Accesss control in sport stadiums and e-purse", + "company": "FortressGb", + "mad": "0xC052", + "service_provider": "FORTRESSGB", + "system_integrator": "FORTRESSGB" + }, + { + "application": "Car parking", + "company": "Scheidt & Bachmann", + "mad": "0xC801", + "service_provider": "Scheidt & Bachmann GmbH", + "system_integrator": "" + }, + { + "application": "Car parking", + "company": "Scheidt & Bachmann", + "mad": "0xC802", + "service_provider": "Scheidt & Bachmann GmbH", + "system_integrator": "" + }, + { + "application": "", + "company": "Reserved for MAD", + "mad": "0xC803", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Car parking systems", + "company": "Eden", + "mad": "0xC805", + "service_provider": "", + "system_integrator": "Eden" + }, + { + "application": "Car Parking", + "company": "MADA Marx Datentechnik GmbH", + "mad": "0xC806", + "service_provider": "MADA", + "system_integrator": "MADA" + }, + { + "application": "Car parking", + "company": "Scheidt & Bachmann", + "mad": "0xC810", + "service_provider": "Scheidt & Bachmann GmbH", + "system_integrator": "" + }, + { + "application": "Car parking", + "company": "CNA Limited/Rax-Comm Systems Ltd.", + "mad": "0xC811", + "service_provider": "CNA Limited", + "system_integrator": "CNA Limited" + }, + { + "application": "Park access application", + "company": "EFKON AG", + "mad": "0xC812", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Park access application", + "company": "EFKON AG", + "mad": "0xC813", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Park access application", + "company": "EFKON AG", + "mad": "0xC814", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Park access application", + "company": "EFKON AG", + "mad": "0xC815", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Park access application", + "company": "EFKON AG", + "mad": "0xC816", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Park access application", + "company": "EFKON AG", + "mad": "0xC817", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Security and safty services", + "company": "Staat der Nederlanden, Ministerie van Financien Belastingdienst/Centrum voor facilitaire dienstverlening", + "mad": "0xC819", + "service_provider": "Siemens Nederland BV", + "system_integrator": "Siemens Nederland BV" + }, + { + "application": "Car Parking System", + "company": "Edward Keller Ltd.", + "mad": "0xC81A", + "service_provider": "Edward Keller Ltd", + "system_integrator": "Edward Keller Ltd" + }, + { + "application": "Multiapplication car for industry & trafic, parking, swimming pool", + "company": "ASEC S.A.", + "mad": "0xC81B", + "service_provider": "ASEC S.A", + "system_integrator": "ASEC S.A" + }, + { + "application": "Miscellaneous application, city traffic, access control & security entertainment, car parking, electronic trade", + "company": "KFAP S.A.", + "mad": "0xC81C", + "service_provider": "KFPA", + "system_integrator": "KFPA" + }, + { + "application": "Computer, car parking, elec. purse, access control & security", + "company": "DECA Engineering", + "mad": "0xC81D", + "service_provider": "Deca Engineering", + "system_integrator": "Deca Engineering" + }, + { + "application": "", + "company": "TechID Engineering bv", + "mad": "0xC81E", + "service_provider": "Tech ID", + "system_integrator": "Tech ID" + }, + { + "application": "Entertainment and Sports, Stadiums, Parking, Ski Ticketing", + "company": "Axess AG", + "mad": "0xC81F", + "service_provider": "Axess", + "system_integrator": "Axess" + }, + { + "application": "Road toll", + "company": "Diners Club Adriatic d.d.", + "mad": "0xC820", + "service_provider": "Diners Club", + "system_integrator": "Diners Club" + }, + { + "application": "Company services, access & sec control, electronic purse...", + "company": "Cominfo a.s.", + "mad": "0xC821", + "service_provider": "Cominfo", + "system_integrator": "Cominfo" + }, + { + "application": "Access control & security, city traffic, sports & entertainment", + "company": "IP Core", + "mad": "0xC822", + "service_provider": "IP Core", + "system_integrator": "IP Core" + }, + { + "application": "Electronic purse, carparking system, single use ticket, period pass", + "company": "Emcard a.s.", + "mad": "0xC823", + "service_provider": "Emcard", + "system_integrator": "Emtest" + }, + { + "application": "Car parking, sport applic, hotel, access control systems", + "company": "DATASEC Electronic GmbH", + "mad": "0xC824", + "service_provider": "Datasec", + "system_integrator": "Datatsec" + }, + { + "application": "Car parking", + "company": "Parkeon", + "mad": "0xC825", + "service_provider": "Parkeon", + "system_integrator": "Parkeon" + }, + { + "application": "Car parking", + "company": "Parkeon", + "mad": "0xC826", + "service_provider": "Parkeon", + "system_integrator": "Parkeon" + }, + { + "application": "Car parking", + "company": "Parkeon", + "mad": "0xC827", + "service_provider": "Parkeon", + "system_integrator": "Parkeon" + }, + { + "application": "Car parking", + "company": "Parkeon", + "mad": "0xC828", + "service_provider": "Parkeon", + "system_integrator": "Parkeon" + }, + { + "application": "Car parking", + "company": "Parkeon", + "mad": "0xC829", + "service_provider": "Parkeon", + "system_integrator": "Parkeon" + }, + { + "application": "Car parking", + "company": "Parkeon", + "mad": "0xC82A", + "service_provider": "Parkeon", + "system_integrator": "Parkeon" + }, + { + "application": "Car parking", + "company": "Parkeon", + "mad": "0xC82B", + "service_provider": "Parkeon", + "system_integrator": "Parkeon" + }, + { + "application": "Car parking", + "company": "Parkeon", + "mad": "0xC82C", + "service_provider": "Parkeon", + "system_integrator": "Parkeon" + }, + { + "application": "Car parking system", + "company": "PENTA d.o.o.", + "mad": "0xC82D", + "service_provider": "PENTA", + "system_integrator": "PENTA" + }, + { + "application": "Car wash", + "company": "Group Capmonetique", + "mad": "0xC82E", + "service_provider": "MONEPARC, Parc Technologique Les moulins 2, 2791 Chemin St. Bernard, 06220 Vallauris, France", + "system_integrator": "MONECARTE" + }, + { + "application": "Car parking system: storage of entrance and payment information", + "company": "DEC S.R.L", + "mad": "0xC82F", + "service_provider": "DEC S.R.L", + "system_integrator": "DEC S.R.L" + }, + { + "application": "Car parking system: storage of subscription data", + "company": "DEC S.R.L", + "mad": "0xC830", + "service_provider": "DEC S.R.L", + "system_integrator": "DEC S.R.L" + }, + { + "application": "Car parking", + "company": "Cards & Devices GmbH", + "mad": "0xC831", + "service_provider": "Cards & Devices GmbH", + "system_integrator": "Cards & Devices GmbH" + }, + { + "application": "RF Loyalty/Fleet Card System", + "company": "Panasonic Industrial Company", + "mad": "0xC902", + "service_provider": "Panasonic Loyalty", + "system_integrator": "Panasonic Industrial Company" + }, + { + "application": "RF Loyalty/Fleet Card System", + "company": "Panasonic Industrial Company", + "mad": "0xC903", + "service_provider": "Panasonic Loyalty", + "system_integrator": "Panasonic Industrial Company" + }, + { + "application": "Payment, loyalty and vehicle card", + "company": "Tokheim", + "mad": "0xD001", + "service_provider": "Retail Petroleum Systems", + "system_integrator": "Retail Petroleum Systems" + }, + { + "application": "Payment, loyalty and vehicle card", + "company": "Tokheim", + "mad": "0xD002", + "service_provider": "Retail Petroleum Systems", + "system_integrator": "Retail Petroleum Systems" + }, + { + "application": "Payment, loyalty and vehicle card", + "company": "Tokheim", + "mad": "0xD003", + "service_provider": "Retail Petroleum Systems", + "system_integrator": "Retail Petroleum Systems" + }, + { + "application": "Driver Vehicle Indentification / fueling", + "company": "Nedap - CTP B.V.", + "mad": "0xD004", + "service_provider": "Nedap CTP B.V.", + "system_integrator": "D.V.I / Nedap - CTP B.V." + }, + { + "application": "Fuel, Gasoline", + "company": "MADA Marx Datentechnik GmbH", + "mad": "0xD005", + "service_provider": "MADA", + "system_integrator": "MADA" + }, + { + "application": "Electronic fuel voucher", + "company": "GRUPO VR", + "mad": "0xD006", + "service_provider": "Grupo VR", + "system_integrator": "" + }, + { + "application": "Attended and unattended operation", + "company": "Postec Data Systems Limited", + "mad": "0xD007", + "service_provider": "Unisys Marconi Commerce", + "system_integrator": "Postec Data Systems" + }, + { + "application": "Attended and unattended operation", + "company": "Postec Data Systems Limited", + "mad": "0xD008", + "service_provider": "Unisys Marconi Commerce", + "system_integrator": "Postec Data Systems" + }, + { + "application": "Attended and unattended operation", + "company": "Postec Data Systems Limited", + "mad": "0xD009", + "service_provider": "Unisys Marconi Commerce", + "system_integrator": "Postec Data Systems" + }, + { + "application": "Attended and unattended operation", + "company": "Postec Data Systems Limited", + "mad": "0xD00A", + "service_provider": "Unisys Marconi Commerce", + "system_integrator": "Postec Data Systems" + }, + { + "application": "Attended and unattended operation", + "company": "Postec Data Systems Limited", + "mad": "0xD00B", + "service_provider": "Unisys Marconi Commerce", + "system_integrator": "Postec Data Systems" + }, + { + "application": "Attended and unattended operation", + "company": "Postec Data Systems Limited", + "mad": "0xD00C", + "service_provider": "Unisys Marconi Commerce", + "system_integrator": "Postec Data Systems" + }, + { + "application": "Attended and unattended operation", + "company": "Postec Data Systems Limited", + "mad": "0xD00D", + "service_provider": "Unisys Marconi Commerce", + "system_integrator": "Postec Data Systems" + }, + { + "application": "Attended and unattended operation", + "company": "Postec Data Systems Limited", + "mad": "0xD00E", + "service_provider": "Unisys Marconi Commerce", + "system_integrator": "Postec Data Systems" + }, + { + "application": "Attended and unattended operation", + "company": "Postec Data Systems Limited", + "mad": "0xD00F", + "service_provider": "Unisys Marconi Commerce", + "system_integrator": "Postec Data Systems" + }, + { + "application": "Attended and unattended operation", + "company": "Postec Data Systems Limited", + "mad": "0xD010", + "service_provider": "Unisys Marconi Commerce", + "system_integrator": "Postec Data Systems" + }, + { + "application": "Fuel gasoline", + "company": "R&D Solutionz Ltd.", + "mad": "0xD038", + "service_provider": "", + "system_integrator": "R&D" + }, + { + "application": "Fuel gasoline", + "company": "R&D Solutionz Ltd.", + "mad": "0xD039", + "service_provider": "", + "system_integrator": "R&D" + }, + { + "application": "Fuel gasoline", + "company": "R&D Solutionz Ltd.", + "mad": "0xD03A", + "service_provider": "", + "system_integrator": "R&D" + }, + { + "application": "Fuel gasoline", + "company": "R&D Solutionz Ltd.", + "mad": "0xD03B", + "service_provider": "", + "system_integrator": "R&D" + }, + { + "application": "Fuel gasoline", + "company": "R&D Solutionz Ltd.", + "mad": "0xD03C", + "service_provider": "", + "system_integrator": "R&D" + }, + { + "application": "Fuel gasoline", + "company": "R&D Solutionz Ltd.", + "mad": "0xD03D", + "service_provider": "", + "system_integrator": "R&D" + }, + { + "application": "Fuel gasoline", + "company": "R&D Solutionz Ltd.", + "mad": "0xD03E", + "service_provider": "", + "system_integrator": "R&D" + }, + { + "application": "Fuel gasoline", + "company": "R&D Solutionz Ltd.", + "mad": "0xD03F", + "service_provider": "", + "system_integrator": "R&D" + }, + { + "application": "Fuel gasoline", + "company": "R&D Solutionz Ltd.", + "mad": "0xD040", + "service_provider": "", + "system_integrator": "R&D" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD041", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD042", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD043", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD044", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD045", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD046", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD047", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD048", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD049", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD04A", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD04B", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD04C", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD04D", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD04E", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD04F", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD050", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD051", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD052", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD053", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD054", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD055", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD056", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD057", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD058", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD059", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD05A", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD05B", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD05C", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD05D", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD05E", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD05F", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD060", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD061", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD062", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD063", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD064", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD065", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD066", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD067", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD068", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD069", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD06A", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD06B", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD06C", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD06D", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Applications for oil and gas", + "company": "Tietoenator Energy Components", + "mad": "0xD06E", + "service_provider": "Tietoenator", + "system_integrator": "Tietoenator" + }, + { + "application": "Applications for oil and gas", + "company": "Tietoenator Energy Components", + "mad": "0xD06F", + "service_provider": "Tietoenator", + "system_integrator": "Tietoenator" + }, + { + "application": "Applications for oil and gas", + "company": "Tietoenator Energy Components", + "mad": "0xD070", + "service_provider": "Tietoenator", + "system_integrator": "Tietoenator" + }, + { + "application": "Applications for oil and gas", + "company": "Tietoenator Energy Components", + "mad": "0xD071", + "service_provider": "Tietoenator", + "system_integrator": "Tietoenator" + }, + { + "application": "Fuel, gasoline station", + "company": "Hectronic GmbH", + "mad": "0xD072", + "service_provider": "Hectronic GmbH", + "system_integrator": "Hectronic GmbH" + }, + { + "application": "Fuel, gasoline", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0xD073", + "service_provider": "BICA AG", + "system_integrator": "BICA AG" + }, + { + "application": "Fuel, gasoline", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0xD074", + "service_provider": "BICA AG", + "system_integrator": "BICA AG" + }, + { + "application": "", + "company": "Hectronic GmbH", + "mad": "0xD075", + "service_provider": "", + "system_integrator": "Hectronic GmbH" + }, + { + "application": "", + "company": "Hectronic GmbH", + "mad": "0xD076", + "service_provider": "", + "system_integrator": "Hectronic GmbH" + }, + { + "application": "", + "company": "Hectronic GmbH", + "mad": "0xD077", + "service_provider": "", + "system_integrator": "Hectronic GmbH" + }, + { + "application": "Time attendance, fuel, access control", + "company": "Emcard a.s.", + "mad": "0xD078", + "service_provider": "Emtest", + "system_integrator": "Emtest" + }, + { + "application": "Identification", + "company": "Honeywell Automation India Limited", + "mad": "0xD079", + "service_provider": "Honeywell Automation India Limited", + "system_integrator": "Honeywell Automation India Limited" + }, + { + "application": "Security and safty services", + "company": "Staat der Nederlanden, Ministerie van Financien Belastingdienst/Centrum voor facilitaire dienstverlening", + "mad": "0xD801", + "service_provider": "Siemens Nederland BV", + "system_integrator": "Siemens Nederland BV" + }, + { + "application": "", + "company": "X-Ident GmbH", + "mad": "0xE101", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "NFC applications", + "company": "Philips Semiconductors Gratkorn GmbH", + "mad": "0xE102", + "service_provider": "Philips Semiconductors", + "system_integrator": "Philips Semiconductors" + }, + { + "application": "NFC applications", + "company": "NXP Semiconductors", + "mad": "0xE103", + "service_provider": "Philips SC", + "system_integrator": "Philps SC" + }, + { + "application": "Global purse", + "company": "Microtronic AG", + "mad": "0xE104", + "service_provider": "Microtronic AG", + "system_integrator": "Microtronic AG" + }, + { + "application": "Global purse", + "company": "Microtronic AG", + "mad": "0xE105", + "service_provider": "Microtronic AG", + "system_integrator": "Microtronic AG" + }, + { + "application": "Global purse", + "company": "Microtronic AG", + "mad": "0xE106", + "service_provider": "Microtronic AG", + "system_integrator": "Microtronic AG" + }, + { + "application": "Global purse", + "company": "Microtronic AG", + "mad": "0xE107", + "service_provider": "Microtronic AG", + "system_integrator": "Microtronic AG" + }, + { + "application": "MS-Windows Logon and security facilities", + "company": "Integrated Engineering", + "mad": "0xE801", + "service_provider": "IE Holding", + "system_integrator": "IE Holding" + }, + { + "application": "Security and safty services", + "company": "Staat der Nederlanden, Ministerie van Financien Belastingdienst/Centrum voor facilitaire dienstverlening", + "mad": "0xE802", + "service_provider": "Siemens Nederland BV", + "system_integrator": "Siemens Nederland BV" + }, + { + "application": "Safeguard Security Products Family", + "company": "Utimaco Safeware AG - Österreich", + "mad": "0xE803", + "service_provider": "Utimaco Safeware AG", + "system_integrator": "Ultimaco Safeware AG" + }, + { + "application": "Safeguard Security Products Family", + "company": "Utimaco Safeware AG - Österreich", + "mad": "0xE804", + "service_provider": "Utimaco Safeware AG", + "system_integrator": "Ultimaco Safeware AG" + }, + { + "application": "Safeguard Security Products Family", + "company": "Utimaco Safeware AG - Österreich", + "mad": "0xE805", + "service_provider": "Utimaco Safeware AG", + "system_integrator": "Ultimaco Safeware AG" + }, + { + "application": "Computer, car parking, elec. purse, access control & security", + "company": "DECA Engineering", + "mad": "0xE806", + "service_provider": "Deca Engineering", + "system_integrator": "Deca Engineering" + }, + { + "application": "", + "company": "TechID Engineering bv", + "mad": "0xE807", + "service_provider": "Tech ID", + "system_integrator": "Tech ID" + }, + { + "application": "", + "company": "Horoquartz Gestion des Temps", + "mad": "0xE808", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "", + "company": "Horoquartz Gestion des Temps", + "mad": "0xE809", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "", + "company": "Horoquartz Gestion des Temps", + "mad": "0xE80A", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "", + "company": "Horoquartz Gestion des Temps", + "mad": "0xE80B", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "", + "company": "Horoquartz Gestion des Temps", + "mad": "0xE80C", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "PC log on via MIFARE & DESfire", + "company": "Tx Systems Inc", + "mad": "0xE80D", + "service_provider": "TX Systems", + "system_integrator": "TX Systems" + }, + { + "application": "Access control, computer application, company services", + "company": "Volvo Car Corporation", + "mad": "0xE80E", + "service_provider": "Volvo Car", + "system_integrator": "Volvo Car" + }, + { + "application": "Software Licensing Application", + "company": "OmniCard Group B.V.", + "mad": "0xE80F", + "service_provider": "OmniCard Group B.V.", + "system_integrator": "OmniCard Group B.V." + }, + { + "application": "Computer logon", + "company": "Igel Technology GmbH", + "mad": "0xE810", + "service_provider": "Igel Technology GmbH", + "system_integrator": "Igel Technology GmbH" + }, + { + "application": "MS-Windows PC Logon", + "company": "United Access GmbH", + "mad": "0xE811", + "service_provider": "United Access GmbH", + "system_integrator": "United Access GmbH" + }, + { + "application": "Computer Technical Event - Membercard access control", + "company": "Strawberry AG", + "mad": "0xE812", + "service_provider": "Strawberry AG", + "system_integrator": "" + }, + { + "application": "Payment, payment OEM, payment partner, entertainment, OEM data", + "company": "Payment Solution AG", + "mad": "0xE814", + "service_provider": "Payment Solution AG", + "system_integrator": "Payment Solution AG" + }, + { + "application": "MIFARE PC Logon & Security", + "company": "PinCash International", + "mad": "0xE815", + "service_provider": "Pincash international BV", + "system_integrator": "Pincash international BV" + }, + { + "application": "Logical Access control and software licensing", + "company": "INID BV", + "mad": "0xE816", + "service_provider": "INID", + "system_integrator": "INID" + }, + { + "application": "Miscellaneous applications", + "company": "TechID Engineering bv", + "mad": "0xF001", + "service_provider": "Tech ID", + "system_integrator": "Tech ID" + } +] \ No newline at end of file From 158251b2d902e95321265622624f929f53ec8c57 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 9 Jun 2020 16:21:54 +0200 Subject: [PATCH 571/632] look up mad directory json --- client/src/mifare/mad.c | 163 ++++++++++++++++++++++++++++++++++------ client/src/mifare/mad.h | 5 -- 2 files changed, 140 insertions(+), 28 deletions(-) diff --git a/client/src/mifare/mad.c b/client/src/mifare/mad.c index 9887f0a77..169833994 100644 --- a/client/src/mifare/mad.c +++ b/client/src/mifare/mad.c @@ -14,20 +14,14 @@ #include "pm3_cmd.h" #include "crc.h" #include "util.h" +#include "fileutils.h" +#include "jansson.h" // https://www.nxp.com/docs/en/application-note/AN10787.pdf -static madAIDDescr madKnownAIDs[] = { - {0x0000, "free"}, - {0x0001, "defect, e.g. access keys are destroyed or unknown"}, - {0x0002, "reserved"}, - {0x0003, "contains additional directory info"}, - {0x0004, "contains card holder information in ASCII format."}, - {0x0005, "not applicable (above memory size)"}, +static json_t* mad_known_aids = NULL; - {0x03e1, "NDEF"}, -}; - -static madAIDDescr madKnownClusterCodes[] = { +/* +static madAID_t madKnownClusterCodes[] = { {0x00, "cluster: card administration"}, {0x01, "cluster: miscellaneous applications"}, {0x02, "cluster: miscellaneous applications"}, @@ -95,18 +89,141 @@ static madAIDDescr madKnownClusterCodes[] = { {0xF8, "cluster: miscellaneous applications"}, }; -static const char unknownAID[] = ""; +*/ -static const char *GetAIDDescription(uint16_t AID) { - for (int i = 0; i < ARRAYLEN(madKnownAIDs); i++) - if (madKnownAIDs[i].AID == AID) - return madKnownAIDs[i].Description; - for (int i = 0; i < ARRAYLEN(madKnownClusterCodes); i++) - if (madKnownClusterCodes[i].AID == (AID >> 8)) // high byte - cluster code - return madKnownClusterCodes[i].Description; +static int open_mad_file(json_t **root, bool verbose) { - return unknownAID; + char *path; + int res = searchFile(&path, RESOURCES_SUBDIR, "mad", ".json", true); + if (res != PM3_SUCCESS) { + return PM3_EFILE; + } + + int retval = PM3_SUCCESS; + json_error_t error; + + *root = json_load_file(path, 0, &error); + if (!*root) { + PrintAndLogEx(ERR, "json (%s) error on line %d: %s", path, error.line, error.text); + retval = PM3_ESOFT; + goto out; + } + + if (!json_is_array(*root)) { + PrintAndLogEx(ERR, "Invalid json (%s) format. root must be an array.", path); + retval = PM3_ESOFT; + goto out; + } + + if (verbose) + PrintAndLogEx(SUCCESS, "Loaded file (%s) OK. %zu records.", path, json_array_size(*root)); +out: + free(path); + return retval; +} + +static int close_mad_file(json_t *root) { + json_decref(root); + return PM3_SUCCESS; +} + + +static const char *mad_json_get_str(json_t *data, const char *name) { + + json_t *jstr = json_object_get(data, name); + if (jstr == NULL) + return NULL; + + if (!json_is_string(jstr)) { + PrintAndLogEx(WARNING, _YELLOW_("`%s`") " is not a string", name); + return NULL; + } + + const char *cstr = json_string_value(jstr); + if (strlen(cstr) == 0) + return NULL; + + return cstr; +} + +static int mad_print(json_t **xroot, char *mad, bool verbose, char *out) { + + json_t *root = *xroot; + if (root == NULL) { + int res = open_mad_file(&root, verbose); + if (res != PM3_SUCCESS) + return res; + + *xroot = root; + } + + int retval = PM3_EUNDEF; + + if (root == NULL) + goto out; + + json_t *elm = NULL; + + for (uint32_t idx = 0; idx < json_array_size(root); idx++) { + + json_t *data = json_array_get(root, idx); + if (!json_is_object(data)) { + PrintAndLogEx(ERR, "data [%d] is not an object\n", idx); + continue; + } + + const char *fmad = mad_json_get_str(data, "mad"); + if (strcmp(mad, fmad) == 0) { + elm = data; + break; + } + } + + if (elm == NULL) + goto out; + + retval = PM3_SUCCESS; + + // print here + const char *application = mad_json_get_str(elm, "application"); + const char *company = mad_json_get_str(elm, "company"); + const char *vmad = mad_json_get_str(elm, "mad"); + const char *provider = mad_json_get_str(elm, "service_provider"); + const char *integrator = mad_json_get_str(elm, "system_integrator"); + + sprintf(out, "%s [%s]", application, company); + + if (verbose) { + PrintAndLogEx(SUCCESS, "MAD %s", vmad); + if (application) + PrintAndLogEx(SUCCESS, "Application %s", application); + if (company) + PrintAndLogEx(SUCCESS, "Company %s", company); + if (provider) + PrintAndLogEx(SUCCESS, "Service provider %s", provider); + if (integrator) + PrintAndLogEx(SUCCESS, "System integrator %s", integrator); + } + +out: + if (*xroot == NULL) { + close_mad_file(root); + } + return retval; +} + +static const char *get_aid_description(uint16_t aid) { + + char result[200]; + char s[7] = {0}; + sprintf(s, "0x%04x", aid); + int res = mad_print(&mad_known_aids, s, false, result); + if (res != PM3_SUCCESS) { + return ""; + } + + return ""; } static int madCRCCheck(uint8_t *sector, bool verbose, int MADver) { @@ -232,7 +349,7 @@ int MAD1DecodeAndPrint(uint8_t *sector, bool verbose, bool *haveMAD2) { PrintAndLogEx(INFO, " 00 MAD 1"); for (int i = 1; i < 16; i++) { uint16_t AID = madGetAID(sector, 1, i); - PrintAndLogEx(INFO, " %02d [%04X] %s", i, AID, GetAIDDescription(AID)); + PrintAndLogEx(INFO, " %02d [%04X] %s", i, AID, get_aid_description(AID)); } return PM3_SUCCESS; @@ -258,8 +375,8 @@ int MAD2DecodeAndPrint(uint8_t *sector, bool verbose) { } for (int i = 1; i < 8 + 8 + 7 + 1; i++) { - uint16_t AID = madGetAID(sector, 2, i); - PrintAndLogEx(INFO, "%02d [%04X] %s", i + 16, AID, GetAIDDescription(AID)); + uint16_t aid = madGetAID(sector, 2, i); + PrintAndLogEx(INFO, "%02d [%04X] %s", i + 16, aid, get_aid_description(aid)); } return PM3_SUCCESS; diff --git a/client/src/mifare/mad.h b/client/src/mifare/mad.h index ce5ed4131..e6e960005 100644 --- a/client/src/mifare/mad.h +++ b/client/src/mifare/mad.h @@ -13,11 +13,6 @@ #include "common.h" -typedef struct { - uint16_t AID; - const char *Description; -} madAIDDescr; - int MADCheck(uint8_t *sector0, uint8_t *sector10, bool verbose, bool *haveMAD2); int MADDecode(uint8_t *sector0, uint8_t *sector10, uint16_t *mad, size_t *madlen); int MAD1DecodeAndPrint(uint8_t *sector, bool verbose, bool *haveMAD2); From 76791bde0ade2d945025c15002a68a28e3fb64dc Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 9 Jun 2020 16:22:35 +0200 Subject: [PATCH 572/632] textual --- client/src/emv/emvjson.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/emv/emvjson.c b/client/src/emv/emvjson.c index ebf42704f..43f5095e2 100644 --- a/client/src/emv/emvjson.c +++ b/client/src/emv/emvjson.c @@ -325,7 +325,7 @@ bool ParamLoadFromJson(struct tlvdb *tlv) { return false; } - PrintAndLogEx(SUCCESS, "Load params: json(%zu) " _GREEN_("OK"), json_array_size(root)); + PrintAndLogEx(SUCCESS, "Load params: json(%zu) (%s)", json_array_size(root), _GREEN_("OK")); for (int i = 0; i < json_array_size(root); i++) { json_t *data, *jtag, *jlength, *jvalue; From e9fba1991593032871c5afa7587ea81be81f16d3 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 9 Jun 2020 16:23:28 +0200 Subject: [PATCH 573/632] fileutils should be searching for json --- client/src/fileutils.c | 58 ++++++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/client/src/fileutils.c b/client/src/fileutils.c index 93689d2fa..8528fa770 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -944,22 +944,31 @@ int loadFileJSON(const char *preferredName, void *data, size_t maxdatalen, size_ int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen, bool verbose, void (*callback)(json_t *)) { if (data == NULL) return PM3_EINVARG; - char *fileName = filenamemcopy(preferredName, ".json"); - if (fileName == NULL) return PM3_EMALLOC; *datalen = 0; - json_error_t error; int retval = PM3_SUCCESS; - json_t *root = json_load_file(fileName, 0, &error); + char *path; + int res = searchFile(&path, RESOURCES_SUBDIR, preferredName, ".json", false); + if (res != PM3_SUCCESS) { + return PM3_EFILE; + } + + json_error_t error; + json_t *root = json_load_file(path, 0, &error); + if (verbose) + PrintAndLogEx(SUCCESS, "loaded from JSON file " _YELLOW_("%s"), path); + + free(path); + if (!root) { - PrintAndLogEx(ERR, "ERROR: json " _YELLOW_("%s") " error on line %d: %s", fileName, error.line, error.text); + PrintAndLogEx(ERR, "ERROR: json " _YELLOW_("%s") " error on line %d: %s", preferredName, error.line, error.text); retval = PM3_ESOFT; goto out; } if (!json_is_object(root)) { - PrintAndLogEx(ERR, "ERROR: Invalid json " _YELLOW_("%s") " format. root must be an object.", fileName); + PrintAndLogEx(ERR, "ERROR: Invalid json " _YELLOW_("%s") " format. root must be an object.", preferredName); retval = PM3_ESOFT; goto out; } @@ -980,11 +989,11 @@ int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, siz goto out; } - char path[30] = {0}; - sprintf(path, "$.blocks.%d", i); + char blocks[30] = {0}; + sprintf(blocks, "$.blocks.%d", i); size_t len = 0; - JsonLoadBufAsHex(root, path, &udata[sptr], 16, &len); + JsonLoadBufAsHex(root, blocks, &udata[sptr], 16, &len); if (!len) break; @@ -1002,11 +1011,11 @@ int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, siz goto out; } - char path[30] = {0}; - sprintf(path, "$.blocks.%d", i); + char blocks[30] = {0}; + sprintf(blocks, "$.blocks.%d", i); size_t len = 0; - JsonLoadBufAsHex(root, path, &udata[sptr], 4, &len); + JsonLoadBufAsHex(root, blocks, &udata[sptr], 4, &len); if (!len) break; @@ -1024,11 +1033,11 @@ int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, siz goto out; } - char path[30] = {0}; - sprintf(path, "$.blocks.%zu", i); + char blocks[30] = {0}; + sprintf(blocks, "$.blocks.%zu", i); size_t len = 0; - JsonLoadBufAsHex(root, path, &udata[sptr], 4, &len); + JsonLoadBufAsHex(root, blocks, &udata[sptr], 4, &len); if (!len) break; @@ -1046,11 +1055,11 @@ int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, siz goto out; } - char path[30] = {0}; - sprintf(path, "$.blocks.%zu", i); + char blocks[30] = {0}; + sprintf(blocks, "$.blocks.%zu", i); size_t len = 0; - JsonLoadBufAsHex(root, path, &udata[sptr], 8, &len); + JsonLoadBufAsHex(root, blocks, &udata[sptr], 8, &len); if (!len) break; @@ -1067,11 +1076,11 @@ int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, siz goto out; } - char path[30] = {0}; - sprintf(path, "$.blocks.%zu", i); + char blocks[30] = {0}; + sprintf(blocks, "$.blocks.%zu", i); size_t len = 0; - JsonLoadBufAsHex(root, path, &udata[sptr], 4, &len); + JsonLoadBufAsHex(root, blocks, &udata[sptr], 4, &len); if (!len) break; @@ -1079,15 +1088,14 @@ int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, siz } *datalen = sptr; } - if (verbose) - PrintAndLogEx(SUCCESS, "loaded from JSON file " _YELLOW_("%s"), fileName); + +out: if (callback != NULL) { (*callback)(root); } -out: + json_decref(root); - free(fileName); return retval; } From 33965f51d8c1f53618eaa80949cfe3c88ad6cc78 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 9 Jun 2020 16:24:12 +0200 Subject: [PATCH 574/632] minor <> --- client/src/aidsearch.c | 2 -- client/src/aidsearch.h | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/client/src/aidsearch.c b/client/src/aidsearch.c index 7361442b0..47c64e77b 100644 --- a/client/src/aidsearch.c +++ b/client/src/aidsearch.c @@ -43,7 +43,6 @@ out: } static int closeAIDFile(json_t *root) { - json_decref(root); return PM3_SUCCESS; } @@ -67,7 +66,6 @@ json_t *AIDSearchGetElm(json_t *root, int elmindx) { } int AIDSearchFree(json_t *root) { - return closeAIDFile(root); } diff --git a/client/src/aidsearch.h b/client/src/aidsearch.h index 528146766..585e173c6 100644 --- a/client/src/aidsearch.h +++ b/client/src/aidsearch.h @@ -15,8 +15,7 @@ #include <stdint.h> #include <stdbool.h> - -#include <jansson.h> +#include "jansson.h" int PrintAIDDescription(json_t *xroot, char *aid, bool verbose); int PrintAIDDescriptionBuf(json_t *root, uint8_t *aid, size_t aidlen, bool verbose); From 241309291b0f7d480d0a58c7d5568c2636bf2fdc Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 9 Jun 2020 16:25:56 +0200 Subject: [PATCH 575/632] chg: hf iclass , use fileutils --- client/src/cmdhficlass.c | 90 +++++++++++++--------------------------- 1 file changed, 29 insertions(+), 61 deletions(-) diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index d67deda5a..80390424e 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -752,11 +752,9 @@ static int CmdHFiClassELoad(const char *Cmd) { //Validations if (errors || cmdp == 0) { - usage_hf_iclass_eload(); - return PM3_EINVARG; + return usage_hf_iclass_eload(); } - uint8_t *dump = calloc(2048, sizeof(uint8_t)); if (!dump) { PrintAndLogEx(ERR, "error, cannot allocate memory "); @@ -772,7 +770,7 @@ static int CmdHFiClassELoad(const char *Cmd) { break; } case EML: { - res = loadFileEML(filename, dump, &bytes_read); + res = loadFileEML_safe(filename, (void**)&dump, &bytes_read); break; } case JSON: { @@ -1592,6 +1590,7 @@ static int CmdHFiClassCloneTag(const char *Cmd) { bool errors = false; bool verbose = false; uint8_t cmdp = 0; + while (param_getchar(Cmd, cmdp) != 0x00 && !errors) { switch (tolower(param_getchar(Cmd, cmdp))) { case 'h': @@ -1675,32 +1674,34 @@ static int CmdHFiClassCloneTag(const char *Cmd) { return PM3_EINVARG; } - // file handling and reading - FILE *f = fopen(filename, "rb"); - if (!f) { + uint8_t *dump = NULL; + size_t bytes_read = 0; + if (loadFile_safe(filename, "", (void**)&dump, &bytes_read) != PM3_SUCCESS) { PrintAndLogEx(FAILED, "File: " _YELLOW_("%s") ": not found or locked.", filename); return PM3_EFILE; } - iclass_block_t tag_data[PM3_CMD_DATA_SIZE / 12]; + if (bytes_read == 0) { + PrintAndLogEx(ERR, "file reading error"); + return PM3_EFILE; + } + if (bytes_read < sizeof(iclass_block_t) * (endblock - startblock + 1)) { + PrintAndLogEx(ERR, "file wrong size"); + return PM3_EFILE; + } // read data from file from block 6 --- 19 // we will use this struct [data 8 bytes][MAC 4 bytes] for each block calculate all mac number for each data // then copy to usbcommand->asbytes; // max is 32 - 6 = 28 block. 28 x 12 bytes gives 336 bytes - int i; - fseek(f, startblock * 8, SEEK_SET); - size_t bytes_read = fread(tag_data, sizeof(iclass_block_t), endblock - startblock + 1, f); - fclose(f); - - if (bytes_read == 0) { - PrintAndLogEx(ERR, "file reading error."); - return PM3_EFILE; - } + iclass_block_t tag_data[PM3_CMD_DATA_SIZE / 12]; + memcpy(tag_data, dump + startblock * 8, sizeof(iclass_block_t) * (endblock - startblock + 1)); + uint8_t MAC[4] = {0x00, 0x00, 0x00, 0x00}; uint8_t div_key[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + int i; int numberAuthRetries = ICLASS_AUTH_RETRY; do { if (select_and_auth(KEY, MAC, div_key, use_credit_key, elite, rawkey, verbose)) @@ -1729,9 +1730,9 @@ static int CmdHFiClassCloneTag(const char *Cmd) { } if (verbose) { - PrintAndLogEx(NORMAL, "------+--------------------------+-------------"); - PrintAndLogEx(NORMAL, "block | data | mac"); - PrintAndLogEx(NORMAL, "------+--------------------------+-------------"); + PrintAndLogEx(INFO, "------+--------------------------+-------------"); + PrintAndLogEx(INFO, "block | data | mac"); + PrintAndLogEx(INFO, "------+--------------------------+-------------"); uint8_t p[12]; for (i = 0; i <= endblock - startblock; i++) { memcpy(p, data + (i * 12), 12); @@ -2032,30 +2033,12 @@ static int CmdHFiClassReadTagFile(const char *Cmd) { if (errors || (strlen(Cmd) == 0)) return usage_hf_iclass_readtagfile(); - // file handling and reading - FILE *f = fopen(filename, "rb"); - if (!f) { + uint8_t *dump = NULL; + size_t bytes_read = 0; + if (loadFile_safe(filename, "", (void**)&dump, &bytes_read) != PM3_SUCCESS) { PrintAndLogEx(FAILED, "File: " _YELLOW_("%s") ": not found or locked.", filename); return PM3_EFILE; } - fseek(f, 0, SEEK_END); - long fsize = ftell(f); - fseek(f, 0, SEEK_SET); - - if (fsize <= 0) { - PrintAndLogEx(ERR, "Error, when getting filesize"); - fclose(f); - return PM3_EFILE; - } - - uint8_t *dump = calloc(fsize, sizeof(uint8_t)); - if (!dump) { - PrintAndLogEx(WARNING, "Failed to allocate memory"); - fclose(f); - return PM3_EMALLOC; - } - size_t bytes_read = fread(dump, 1, fsize, f); - fclose(f); if (verbose) { PrintAndLogEx(INFO, "File: " _YELLOW_("%s"), filename); @@ -2063,6 +2046,7 @@ static int CmdHFiClassReadTagFile(const char *Cmd) { PrintAndLogEx(INFO, "Printing blocks from"); PrintAndLogEx(INFO, "start " _YELLOW_("0x%02x") " end " _YELLOW_("0x%02x"), (startblock == 0) ? 6 : startblock, endblock); } + uint8_t *csn = dump; PrintAndLogEx(INFO, "------+--+-------------------------+----------"); PrintAndLogEx(INFO, " CSN |00| " _GREEN_("%s") " |", sprint_hex(csn, 8)); @@ -2198,30 +2182,14 @@ static int CmdHFiClassCalcNewKey(const char *Cmd) { } static int loadKeys(char *filename) { - FILE *f; - f = fopen(filename, "rb"); - if (!f) { + + uint8_t *dump = NULL; + size_t bytes_read = 0; + if (loadFile_safe(filename, "", (void**)&dump, &bytes_read) != PM3_SUCCESS) { PrintAndLogEx(FAILED, "File: " _YELLOW_("%s") ": not found or locked.", filename); return PM3_EFILE; } - fseek(f, 0, SEEK_END); - long fsize = ftell(f); - fseek(f, 0, SEEK_SET); - if (fsize <= 0) { - PrintAndLogEx(ERR, "Error, when getting filesize"); - fclose(f); - return PM3_EFILE; - } - - uint8_t *dump = calloc(fsize, sizeof(uint8_t)); - if (!dump) { - PrintAndLogEx(WARNING, "Failed to allocate memory"); - fclose(f); - return PM3_EMALLOC; - } - size_t bytes_read = fread(dump, 1, fsize, f); - fclose(f); if (bytes_read > ICLASS_KEYS_MAX * 8) { PrintAndLogEx(WARNING, "File is too long to load - bytes: %zu", bytes_read); free(dump); From 5ada65bb204798f02a6f883d00cd2d1c8f6bb4bd Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 9 Jun 2020 16:46:46 +0200 Subject: [PATCH 576/632] textual --- client/src/cmdhfmf.c | 5 +++++ client/src/cmdhfmfp.c | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 24a7c9844..98d8ea42a 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -4525,6 +4525,11 @@ static int CmdHF14AMfMAD(const char *Cmd) { PrintAndLogEx(ERR, "error, read sector 0. card don't have MAD or don't have MAD on default keys"); return PM3_ESOFT; } + + + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "--- " _CYAN_("MAD Information") " ---------------------------"); + PrintAndLogEx(INFO, "-------------------------------------------------------------"); if (verbose) { PrintAndLogEx(SUCCESS, "Raw:"); diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index b4cf4907f..51b7a1555 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -1327,6 +1327,10 @@ static int CmdHFMFPMAD(const char *Cmd) { return 2; } + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "--- " _CYAN_("MAD Information") " ---------------------------"); + PrintAndLogEx(INFO, "-------------------------------------------------------------"); + if (verbose) { PrintAndLogEx(SUCCESS, "Raw:"); for (int i = 0; i < 4; i ++) From 17f56479ea96bf6cb53f4d394adb4fc34213ed94 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 9 Jun 2020 16:59:20 +0200 Subject: [PATCH 577/632] fix coverity --- client/src/mifare/mad.c | 75 +---------------------------------------- 1 file changed, 1 insertion(+), 74 deletions(-) diff --git a/client/src/mifare/mad.c b/client/src/mifare/mad.c index 169833994..c55c8d9a1 100644 --- a/client/src/mifare/mad.c +++ b/client/src/mifare/mad.c @@ -20,78 +20,6 @@ // https://www.nxp.com/docs/en/application-note/AN10787.pdf static json_t* mad_known_aids = NULL; -/* -static madAID_t madKnownClusterCodes[] = { - {0x00, "cluster: card administration"}, - {0x01, "cluster: miscellaneous applications"}, - {0x02, "cluster: miscellaneous applications"}, - {0x03, "cluster: miscellaneous applications"}, - {0x04, "cluster: miscellaneous applications"}, - {0x05, "cluster: miscellaneous applications"}, - {0x06, "cluster: miscellaneous applications"}, - {0x07, "cluster: miscellaneous applications"}, - {0x08, "cluster: airlines"}, - {0x09, "cluster: ferry traffic"}, - {0x10, "cluster: railway services"}, - {0x11, "cluster: miscellaneous applications"}, - {0x12, "cluster: transport"}, - {0x14, "cluster: security solutions"}, - {0x18, "cluster: city traffic"}, - {0x19, "cluster: Czech Railways"}, - {0x20, "cluster: bus services"}, - {0x21, "cluster: multi modal transit"}, - {0x28, "cluster: taxi"}, - {0x30, "cluster: road toll"}, - {0x31, "cluster: generic transport"}, - {0x38, "cluster: company services"}, - {0x40, "cluster: city card services"}, - {0x47, "cluster: access control & security"}, - {0x48, "cluster: access control & security"}, - {0x49, "cluster: VIGIK"}, - {0x4A, "cluster: Ministry of Defence, Netherlands"}, - {0x4B, "cluster: Bosch Telecom, Germany"}, - {0x4C, "cluster: European Union Institutions"}, - {0x50, "cluster: ski ticketing"}, - {0x51, "cluster: access control & security"}, - {0x52, "cluster: access control & security"}, - {0x53, "cluster: access control & security"}, - {0x54, "cluster: access control & security"}, - {0x55, "cluster: SOAA standard for offline access standard"}, - {0x56, "cluster: access control & security"}, - {0x58, "cluster: academic services"}, - {0x60, "cluster: food"}, - {0x68, "cluster: non-food trade"}, - {0x70, "cluster: hotel"}, - {0x71, "cluster: loyalty"}, - {0x75, "cluster: airport services"}, - {0x78, "cluster: car rental"}, - {0x79, "cluster: Dutch government"}, - {0x80, "cluster: administration services"}, - {0x88, "cluster: electronic purse"}, - {0x90, "cluster: television"}, - {0x91, "cluster: cruise ship"}, - {0x95, "cluster: IOPTA"}, - {0x97, "cluster: metering"}, - {0x98, "cluster: telephone"}, - {0xA0, "cluster: health services"}, - {0xA8, "cluster: warehouse"}, - {0xB0, "cluster: electronic trade"}, - {0xB8, "cluster: banking"}, - {0xC0, "cluster: entertainment & sports"}, - {0xC8, "cluster: car parking"}, - {0xC9, "cluster: fleet management"}, - {0xD0, "cluster: fuel, gasoline"}, - {0xD8, "cluster: info services"}, - {0xE0, "cluster: press"}, - {0xE1, "cluster: NFC Forum"}, - {0xE8, "cluster: computer"}, - {0xF0, "cluster: mail"}, - {0xF8, "cluster: miscellaneous applications"}, -}; - -*/ - - static int open_mad_file(json_t **root, bool verbose) { char *path; @@ -128,7 +56,6 @@ static int close_mad_file(json_t *root) { return PM3_SUCCESS; } - static const char *mad_json_get_str(json_t *data, const char *name) { json_t *jstr = json_object_get(data, name); @@ -297,7 +224,7 @@ int MADCheck(uint8_t *sector0, uint8_t *sector10, bool verbose, bool *haveMAD2) res = res2; if (verbose && !res2) - PrintAndLogEx(SUCCESS, "CRC8-MAD2 (%)", _GREEN_("ok")); + PrintAndLogEx(SUCCESS, "CRC8-MAD2 (%s)", _GREEN_("ok")); } return res; From a71f4cd47545c401717d4868660094de22ed8746 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 9 Jun 2020 17:01:31 +0200 Subject: [PATCH 578/632] fix coverity resource leak --- client/src/cmdhficlass.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 80390424e..82ef2d852 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -1683,10 +1683,13 @@ static int CmdHFiClassCloneTag(const char *Cmd) { if (bytes_read == 0) { PrintAndLogEx(ERR, "file reading error"); + free(dump); return PM3_EFILE; } + if (bytes_read < sizeof(iclass_block_t) * (endblock - startblock + 1)) { PrintAndLogEx(ERR, "file wrong size"); + free(dump); return PM3_EFILE; } @@ -1697,7 +1700,9 @@ static int CmdHFiClassCloneTag(const char *Cmd) { iclass_block_t tag_data[PM3_CMD_DATA_SIZE / 12]; memcpy(tag_data, dump + startblock * 8, sizeof(iclass_block_t) * (endblock - startblock + 1)); - + + free(dump); + uint8_t MAC[4] = {0x00, 0x00, 0x00, 0x00}; uint8_t div_key[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; From cb4369f3ec891d7064dcd89c77eac09550d89b6b Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 9 Jun 2020 17:38:29 +0200 Subject: [PATCH 579/632] fix: hf mf mad - return value --- client/src/mifare/mad.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/client/src/mifare/mad.c b/client/src/mifare/mad.c index c55c8d9a1..5f50b3a4e 100644 --- a/client/src/mifare/mad.c +++ b/client/src/mifare/mad.c @@ -105,6 +105,13 @@ static int mad_print(json_t **xroot, char *mad, bool verbose, char *out) { elm = data; break; } + char low[strlen(fmad)]; + strcpy(low, fmad); + str_lower(low); + if (strcmp(mad, low) == 0) { + elm = data; + break; + } } if (elm == NULL) @@ -142,15 +149,14 @@ out: static const char *get_aid_description(uint16_t aid) { - char result[200]; + static char result[200]; char s[7] = {0}; - sprintf(s, "0x%04x", aid); + sprintf(s, "0x%04X", aid); int res = mad_print(&mad_known_aids, s, false, result); if (res != PM3_SUCCESS) { return ""; } - - return ""; + return result; } static int madCRCCheck(uint8_t *sector, bool verbose, int MADver) { From a93e54374e5902629cf206e6004eaa0046d92889 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 9 Jun 2020 17:52:32 +0200 Subject: [PATCH 580/632] working case-insense --- client/src/mifare/mad.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/mifare/mad.c b/client/src/mifare/mad.c index 5f50b3a4e..d0838877a 100644 --- a/client/src/mifare/mad.c +++ b/client/src/mifare/mad.c @@ -105,10 +105,10 @@ static int mad_print(json_t **xroot, char *mad, bool verbose, char *out) { elm = data; break; } - char low[strlen(fmad)]; - strcpy(low, fmad); - str_lower(low); - if (strcmp(mad, low) == 0) { + char lmad[strlen(mad)]; + strcpy(lmad, mad); + str_lower(lmad); + if (strcmp(lmad, fmad) == 0) { elm = data; break; } From 242c276bfb66b6ff79f3276b945f0693a1a29018 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Tue, 9 Jun 2020 18:45:37 +0200 Subject: [PATCH 581/632] mfc mad_print compare --- client/src/mifare/mad.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/client/src/mifare/mad.c b/client/src/mifare/mad.c index d0838877a..c3007026b 100644 --- a/client/src/mifare/mad.c +++ b/client/src/mifare/mad.c @@ -99,19 +99,23 @@ static int mad_print(json_t **xroot, char *mad, bool verbose, char *out) { PrintAndLogEx(ERR, "data [%d] is not an object\n", idx); continue; } - + const char *fmad = mad_json_get_str(data, "mad"); if (strcmp(mad, fmad) == 0) { elm = data; break; } - char lmad[strlen(mad)]; + + char lfmad[strlen(fmad) + 1]; + strcpy(lfmad, fmad); + str_lower(lfmad); + char lmad[strlen(mad) + 1]; strcpy(lmad, mad); str_lower(lmad); - if (strcmp(lmad, fmad) == 0) { + if (strcmp(lmad, lfmad) == 0) { elm = data; break; - } + } } if (elm == NULL) From 33144d1be864818fbe920f69bd9936d1c372dc75 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Tue, 9 Jun 2020 18:46:07 +0200 Subject: [PATCH 582/632] mfc mad get_aid_description: add verbose passthru --- client/src/mifare/mad.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/mifare/mad.c b/client/src/mifare/mad.c index c3007026b..ead395773 100644 --- a/client/src/mifare/mad.c +++ b/client/src/mifare/mad.c @@ -151,12 +151,12 @@ out: return retval; } -static const char *get_aid_description(uint16_t aid) { +static const char *get_aid_description(uint16_t aid, bool verbose) { static char result[200]; char s[7] = {0}; sprintf(s, "0x%04X", aid); - int res = mad_print(&mad_known_aids, s, false, result); + int res = mad_print(&mad_known_aids, s, verbose, result); if (res != PM3_SUCCESS) { return ""; } @@ -286,7 +286,7 @@ int MAD1DecodeAndPrint(uint8_t *sector, bool verbose, bool *haveMAD2) { PrintAndLogEx(INFO, " 00 MAD 1"); for (int i = 1; i < 16; i++) { uint16_t AID = madGetAID(sector, 1, i); - PrintAndLogEx(INFO, " %02d [%04X] %s", i, AID, get_aid_description(AID)); + PrintAndLogEx(INFO, " %02d [%04X] %s", i, AID, get_aid_description(AID, verbose)); } return PM3_SUCCESS; @@ -313,7 +313,7 @@ int MAD2DecodeAndPrint(uint8_t *sector, bool verbose) { for (int i = 1; i < 8 + 8 + 7 + 1; i++) { uint16_t aid = madGetAID(sector, 2, i); - PrintAndLogEx(INFO, "%02d [%04X] %s", i + 16, aid, get_aid_description(aid)); + PrintAndLogEx(INFO, "%02d [%04X] %s", i + 16, aid, get_aid_description(aid, verbose)); } return PM3_SUCCESS; From 35c6ee1bbba0193ae9a8234fad6a3cb8181ef519 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Tue, 9 Jun 2020 19:12:29 +0200 Subject: [PATCH 583/632] rework a bit mfc mad --- client/src/mifare/mad.c | 122 ++++++++++++++++++---------------------- 1 file changed, 56 insertions(+), 66 deletions(-) diff --git a/client/src/mifare/mad.c b/client/src/mifare/mad.c index ead395773..cc8037f6a 100644 --- a/client/src/mifare/mad.c +++ b/client/src/mifare/mad.c @@ -18,7 +18,7 @@ #include "jansson.h" // https://www.nxp.com/docs/en/application-note/AN10787.pdf -static json_t* mad_known_aids = NULL; +static json_t *mad_known_aids = NULL; static int open_mad_file(json_t **root, bool verbose) { @@ -44,7 +44,7 @@ static int open_mad_file(json_t **root, bool verbose) { goto out; } - if (verbose) + if (verbose) PrintAndLogEx(SUCCESS, "Loaded file (%s) OK. %zu records.", path, json_array_size(*root)); out: free(path); @@ -74,93 +74,52 @@ static const char *mad_json_get_str(json_t *data, const char *name) { return cstr; } -static int mad_print(json_t **xroot, char *mad, bool verbose, char *out) { - - json_t *root = *xroot; - if (root == NULL) { - int res = open_mad_file(&root, verbose); - if (res != PM3_SUCCESS) - return res; - - *xroot = root; - } - - int retval = PM3_EUNDEF; - - if (root == NULL) - goto out; +static int print_aid_description(json_t *root, uint16_t aid, char *fmt, bool verbose) { + char lmad[7] = {0}; + sprintf(lmad, "0x%04x", BSWAP_16(aid)); // must be lowercase json_t *elm = NULL; - - for (uint32_t idx = 0; idx < json_array_size(root); idx++) { + for (uint32_t idx = 0; idx < json_array_size(root); idx++) { json_t *data = json_array_get(root, idx); if (!json_is_object(data)) { PrintAndLogEx(ERR, "data [%d] is not an object\n", idx); continue; } - const char *fmad = mad_json_get_str(data, "mad"); - if (strcmp(mad, fmad) == 0) { - elm = data; - break; - } - char lfmad[strlen(fmad) + 1]; strcpy(lfmad, fmad); str_lower(lfmad); - char lmad[strlen(mad) + 1]; - strcpy(lmad, mad); - str_lower(lmad); if (strcmp(lmad, lfmad) == 0) { elm = data; break; } } - if (elm == NULL) - goto out; - - retval = PM3_SUCCESS; - - // print here + if (elm == NULL) { + PrintAndLogEx(INFO, fmt, " (unknown)"); + return PM3_ENODATA; + } + const char *vmad = mad_json_get_str(elm, "mad"); const char *application = mad_json_get_str(elm, "application"); const char *company = mad_json_get_str(elm, "company"); - const char *vmad = mad_json_get_str(elm, "mad"); const char *provider = mad_json_get_str(elm, "service_provider"); const char *integrator = mad_json_get_str(elm, "system_integrator"); - - sprintf(out, "%s [%s]", application, company); - + char result[4 + strlen(application) + strlen(company)]; + sprintf(result, " %s [%s]", application, company); + PrintAndLogEx(INFO, fmt, result); if (verbose) { - PrintAndLogEx(SUCCESS, "MAD %s", vmad); + PrintAndLogEx(SUCCESS, " MAD: %s", vmad); if (application) - PrintAndLogEx(SUCCESS, "Application %s", application); + PrintAndLogEx(SUCCESS, " Application: %s", application); if (company) - PrintAndLogEx(SUCCESS, "Company %s", company); + PrintAndLogEx(SUCCESS, " Company: %s", company); if (provider) - PrintAndLogEx(SUCCESS, "Service provider %s", provider); + PrintAndLogEx(SUCCESS, " Service provider: %s", provider); if (integrator) - PrintAndLogEx(SUCCESS, "System integrator %s", integrator); + PrintAndLogEx(SUCCESS, " System integrator: %s", integrator); } - -out: - if (*xroot == NULL) { - close_mad_file(root); - } - return retval; -} - -static const char *get_aid_description(uint16_t aid, bool verbose) { - - static char result[200]; - char s[7] = {0}; - sprintf(s, "0x%04X", aid); - int res = mad_print(&mad_known_aids, s, verbose, result); - if (res != PM3_SUCCESS) { - return ""; - } - return result; + return PM3_SUCCESS; } static int madCRCCheck(uint8_t *sector, bool verbose, int MADver) { @@ -267,7 +226,17 @@ int MADDecode(uint8_t *sector0, uint8_t *sector10, uint16_t *mad, size_t *madlen return PM3_SUCCESS; } +static const char *aid_admin[] = { + "free", + "defect", + "reserved", + "additional directory info", + "card holder info", + "not applicable" +}; + int MAD1DecodeAndPrint(uint8_t *sector, bool verbose, bool *haveMAD2) { + open_mad_file(&mad_known_aids, verbose); // check MAD1 only MADCheck(sector, NULL, verbose, haveMAD2); @@ -284,15 +253,26 @@ int MAD1DecodeAndPrint(uint8_t *sector, bool verbose, bool *haveMAD2) { PrintAndLogEx(WARNING, "Info byte error"); PrintAndLogEx(INFO, " 00 MAD 1"); + uint32_t prev_aid = 0xFFFFFFFF; for (int i = 1; i < 16; i++) { - uint16_t AID = madGetAID(sector, 1, i); - PrintAndLogEx(INFO, " %02d [%04X] %s", i, AID, get_aid_description(AID, verbose)); + uint16_t aid = madGetAID(sector, 1, i); + if (aid < 6) { + PrintAndLogEx(INFO, " %02d [%04X] (%s)", i, aid, aid_admin[aid]); + } else if (prev_aid == aid) { + PrintAndLogEx(INFO, " %02d [%04X] (continuation)", i, aid); + } else { + char fmt[20]; + sprintf(fmt, " %02d [%04X]%s", i, aid, "%s"); + print_aid_description(mad_known_aids, aid, fmt, verbose); + prev_aid = aid; + } } - + close_mad_file(mad_known_aids); return PM3_SUCCESS; } int MAD2DecodeAndPrint(uint8_t *sector, bool verbose) { + open_mad_file(&mad_known_aids, verbose); PrintAndLogEx(INFO, " 16 MAD 2"); int res = madCRCCheck(sector, true, 2); @@ -310,11 +290,21 @@ int MAD2DecodeAndPrint(uint8_t *sector, bool verbose) { if (verbose) PrintAndLogEx(WARNING, "Card publisher sector not present"); } - + uint32_t prev_aid = 0xFFFFFFFF; for (int i = 1; i < 8 + 8 + 7 + 1; i++) { uint16_t aid = madGetAID(sector, 2, i); - PrintAndLogEx(INFO, "%02d [%04X] %s", i + 16, aid, get_aid_description(aid, verbose)); + if (aid < 6) { + PrintAndLogEx(INFO, " %02d [%04X] (%s)", i + 16, aid, aid_admin[aid]); + } else if (prev_aid == aid) { + PrintAndLogEx(INFO, " %02d [%04X] (continuation)", i + 16, aid); + } else { + char fmt[20]; + sprintf(fmt, " %02d [%04X]%s", i + 16, aid, "%s"); + print_aid_description(mad_known_aids, aid, fmt, verbose); + prev_aid = aid; + } } + close_mad_file(mad_known_aids); return PM3_SUCCESS; } From 9a156326894933ac788551eca50713866df8b4d7 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Tue, 9 Jun 2020 20:53:33 +0200 Subject: [PATCH 584/632] MAD swap again --- client/src/cmdhfmf.c | 12 ++++++------ client/src/cmdhfmfp.c | 12 ++++++------ client/src/mifare/mad.c | 28 +++++++++++++++++----------- client/src/mifare/mad.h | 6 +++--- 4 files changed, 32 insertions(+), 26 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 98d8ea42a..bd8d158b1 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -4499,7 +4499,7 @@ static int CmdHF14AMfMAD(const char *Cmd) { arg_str0("aA", "aid", "print all sectors with specified aid", NULL), arg_str0("kK", "key", "key for printing sectors", NULL), arg_lit0("bB", "keyb", "use key B for access printing sectors (by default: key A)"), - arg_lit0("", "be", "(optional, try BigEndian"), + arg_lit0("", "be", "(optional, BigEndian)"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -4511,7 +4511,7 @@ static int CmdHF14AMfMAD(const char *Cmd) { int keylen; CLIGetHexWithReturn(ctx, 3, key, &keylen); bool keyB = arg_get_lit(4); -// bool use_be = arg_get_lit(5); + bool swapmad = arg_get_lit(5); CLIParserFree(ctx); @@ -4538,7 +4538,7 @@ static int CmdHF14AMfMAD(const char *Cmd) { } bool haveMAD2 = false; - MAD1DecodeAndPrint(sector0, verbose, &haveMAD2); + MAD1DecodeAndPrint(sector0, swapmad, verbose, &haveMAD2); if (haveMAD2) { if (mfReadSector(MF_MAD2_SECTOR, MF_KEY_A, (uint8_t *)g_mifare_mad_key, sector10)) { @@ -4546,7 +4546,7 @@ static int CmdHF14AMfMAD(const char *Cmd) { return PM3_ESOFT; } - MAD2DecodeAndPrint(sector10, verbose); + MAD2DecodeAndPrint(sector10, swapmad, verbose); } if (aidlen == 2) { @@ -4555,7 +4555,7 @@ static int CmdHF14AMfMAD(const char *Cmd) { uint16_t mad[7 + 8 + 8 + 8 + 8] = {0}; size_t madlen = 0; - if (MADDecode(sector0, sector10, mad, &madlen)) { + if (MADDecode(sector0, sector10, mad, &madlen, swapmad)) { PrintAndLogEx(ERR, "can't decode MAD"); return PM3_ESOFT; } @@ -4650,7 +4650,7 @@ static int CmdHFMFNDEF(const char *Cmd) { uint16_t mad[7 + 8 + 8 + 8 + 8] = {0}; size_t madlen = 0; - res = MADDecode(sector0, (haveMAD2 ? sector10 : NULL), mad, &madlen); + res = MADDecode(sector0, (haveMAD2 ? sector10 : NULL), mad, &madlen, false); if (res != PM3_SUCCESS) { PrintAndLogEx(ERR, "can't decode MAD"); return res; diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index 51b7a1555..5332c0f1a 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -1297,7 +1297,7 @@ static int CmdHFMFPMAD(const char *Cmd) { arg_str0("aA", "aid", "print all sectors with aid", NULL), arg_str0("kK", "key", "key for printing sectors", NULL), arg_lit0("bB", "keyb", "use key B for access printing sectors (by default: key A)"), - arg_lit0("", "be", "(optional, try BigEndian"), + arg_lit0("", "be", "(optional, BigEndian)"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -1310,7 +1310,7 @@ static int CmdHFMFPMAD(const char *Cmd) { int keylen; CLIGetHexWithReturn(ctx, 3, key, &keylen); bool keyB = arg_get_lit(4); -// bool use_be = arg_get_lit(5); + bool swapmad = arg_get_lit(5); CLIParserFree(ctx); @@ -1338,7 +1338,7 @@ static int CmdHFMFPMAD(const char *Cmd) { } bool haveMAD2 = false; - MAD1DecodeAndPrint(sector0, verbose, &haveMAD2); + MAD1DecodeAndPrint(sector0, swapmad, verbose, &haveMAD2); if (haveMAD2) { if (mfpReadSector(MF_MAD2_SECTOR, MF_KEY_A, (uint8_t *)g_mifarep_mad_key, sector10, verbose)) { @@ -1347,7 +1347,7 @@ static int CmdHFMFPMAD(const char *Cmd) { return 2; } - MAD2DecodeAndPrint(sector10, verbose); + MAD2DecodeAndPrint(sector10, swapmad, verbose); } if (aidlen == 2) { @@ -1356,7 +1356,7 @@ static int CmdHFMFPMAD(const char *Cmd) { uint16_t mad[7 + 8 + 8 + 8 + 8] = {0}; size_t madlen = 0; - if (MADDecode(sector0, sector10, mad, &madlen)) { + if (MADDecode(sector0, sector10, mad, &madlen, swapmad)) { PrintAndLogEx(ERR, "can't decode MAD"); return 10; } @@ -1451,7 +1451,7 @@ static int CmdHFMFPNDEF(const char *Cmd) { uint16_t mad[7 + 8 + 8 + 8 + 8] = {0}; size_t madlen = 0; - res = MADDecode(sector0, (haveMAD2 ? sector10 : NULL), mad, &madlen); + res = MADDecode(sector0, (haveMAD2 ? sector10 : NULL), mad, &madlen, false); if (res != PM3_SUCCESS) { PrintAndLogEx(ERR, "can't decode MAD"); return res; diff --git a/client/src/mifare/mad.c b/client/src/mifare/mad.c index cc8037f6a..f85dd9cbe 100644 --- a/client/src/mifare/mad.c +++ b/client/src/mifare/mad.c @@ -76,7 +76,7 @@ static const char *mad_json_get_str(json_t *data, const char *name) { static int print_aid_description(json_t *root, uint16_t aid, char *fmt, bool verbose) { char lmad[7] = {0}; - sprintf(lmad, "0x%04x", BSWAP_16(aid)); // must be lowercase + sprintf(lmad, "0x%04x", aid); // must be lowercase json_t *elm = NULL; @@ -139,11 +139,17 @@ static int madCRCCheck(uint8_t *sector, bool verbose, int MADver) { return PM3_SUCCESS; } -static uint16_t madGetAID(uint8_t *sector, int MADver, int sectorNo) { +static uint16_t madGetAID(uint8_t *sector, bool swapmad, int MADver, int sectorNo) { + uint16_t mad; if (MADver == 1) - return (sector[16 + 2 + (sectorNo - 1) * 2 + 1] << 8) + (sector[16 + 2 + (sectorNo - 1) * 2]); + mad = (sector[16 + 2 + (sectorNo - 1) * 2 + 1] << 8) + (sector[16 + 2 + (sectorNo - 1) * 2]); else - return (sector[2 + (sectorNo - 1) * 2 + 1] << 8) + (sector[2 + (sectorNo - 1) * 2]); + mad = (sector[2 + (sectorNo - 1) * 2 + 1] << 8) + (sector[2 + (sectorNo - 1) * 2]); + if (swapmad) { + return BSWAP_16(mad); + } else { + return mad; + } } int MADCheck(uint8_t *sector0, uint8_t *sector10, bool verbose, bool *haveMAD2) { @@ -199,7 +205,7 @@ int MADCheck(uint8_t *sector0, uint8_t *sector10, bool verbose, bool *haveMAD2) return res; } -int MADDecode(uint8_t *sector0, uint8_t *sector10, uint16_t *mad, size_t *madlen) { +int MADDecode(uint8_t *sector0, uint8_t *sector10, uint16_t *mad, size_t *madlen, bool swapmad) { *madlen = 0; bool haveMAD2 = false; int res = MADCheck(sector0, sector10, false, &haveMAD2); @@ -209,7 +215,7 @@ int MADDecode(uint8_t *sector0, uint8_t *sector10, uint16_t *mad, size_t *madlen } for (int i = 1; i < 16; i++) { - mad[*madlen] = madGetAID(sector0, 1, i); + mad[*madlen] = madGetAID(sector0, swapmad, 1, i); (*madlen)++; } @@ -219,7 +225,7 @@ int MADDecode(uint8_t *sector0, uint8_t *sector10, uint16_t *mad, size_t *madlen (*madlen)++; for (int i = 1; i < 24; i++) { - mad[*madlen] = madGetAID(sector10, 2, i); + mad[*madlen] = madGetAID(sector10, swapmad, 2, i); (*madlen)++; } } @@ -235,7 +241,7 @@ static const char *aid_admin[] = { "not applicable" }; -int MAD1DecodeAndPrint(uint8_t *sector, bool verbose, bool *haveMAD2) { +int MAD1DecodeAndPrint(uint8_t *sector, bool swapmad, bool verbose, bool *haveMAD2) { open_mad_file(&mad_known_aids, verbose); // check MAD1 only @@ -255,7 +261,7 @@ int MAD1DecodeAndPrint(uint8_t *sector, bool verbose, bool *haveMAD2) { PrintAndLogEx(INFO, " 00 MAD 1"); uint32_t prev_aid = 0xFFFFFFFF; for (int i = 1; i < 16; i++) { - uint16_t aid = madGetAID(sector, 1, i); + uint16_t aid = madGetAID(sector, swapmad, 1, i); if (aid < 6) { PrintAndLogEx(INFO, " %02d [%04X] (%s)", i, aid, aid_admin[aid]); } else if (prev_aid == aid) { @@ -271,7 +277,7 @@ int MAD1DecodeAndPrint(uint8_t *sector, bool verbose, bool *haveMAD2) { return PM3_SUCCESS; } -int MAD2DecodeAndPrint(uint8_t *sector, bool verbose) { +int MAD2DecodeAndPrint(uint8_t *sector, bool swapmad, bool verbose) { open_mad_file(&mad_known_aids, verbose); PrintAndLogEx(INFO, " 16 MAD 2"); @@ -292,7 +298,7 @@ int MAD2DecodeAndPrint(uint8_t *sector, bool verbose) { } uint32_t prev_aid = 0xFFFFFFFF; for (int i = 1; i < 8 + 8 + 7 + 1; i++) { - uint16_t aid = madGetAID(sector, 2, i); + uint16_t aid = madGetAID(sector, swapmad, 2, i); if (aid < 6) { PrintAndLogEx(INFO, " %02d [%04X] (%s)", i + 16, aid, aid_admin[aid]); } else if (prev_aid == aid) { diff --git a/client/src/mifare/mad.h b/client/src/mifare/mad.h index e6e960005..e5f23ea0f 100644 --- a/client/src/mifare/mad.h +++ b/client/src/mifare/mad.h @@ -14,9 +14,9 @@ #include "common.h" int MADCheck(uint8_t *sector0, uint8_t *sector10, bool verbose, bool *haveMAD2); -int MADDecode(uint8_t *sector0, uint8_t *sector10, uint16_t *mad, size_t *madlen); -int MAD1DecodeAndPrint(uint8_t *sector, bool verbose, bool *haveMAD2); -int MAD2DecodeAndPrint(uint8_t *sector, bool verbose); +int MADDecode(uint8_t *sector0, uint8_t *sector10, uint16_t *mad, size_t *madlen, bool swapmad); +int MAD1DecodeAndPrint(uint8_t *sector, bool swapmad, bool verbose, bool *haveMAD2); +int MAD2DecodeAndPrint(uint8_t *sector, bool swapmad, bool verbose); #endif // _MAD_H_ From 92f4c445e401198512c144f1648e8210489c5053 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Tue, 9 Jun 2020 21:07:53 +0200 Subject: [PATCH 585/632] mfc ndef needs swapped mad according to our default way to treat mad... --- client/src/cmdhfmf.c | 6 +++--- client/src/cmdhfmfp.c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index bd8d158b1..1badd75e3 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -4528,8 +4528,8 @@ static int CmdHF14AMfMAD(const char *Cmd) { PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(INFO, "--- " _CYAN_("MAD Information") " ---------------------------"); - PrintAndLogEx(INFO, "-------------------------------------------------------------"); + PrintAndLogEx(INFO, "--- " _CYAN_("MAD Information") " -------------------------------"); + PrintAndLogEx(INFO, "---------------------------------------------------"); if (verbose) { PrintAndLogEx(SUCCESS, "Raw:"); @@ -4650,7 +4650,7 @@ static int CmdHFMFNDEF(const char *Cmd) { uint16_t mad[7 + 8 + 8 + 8 + 8] = {0}; size_t madlen = 0; - res = MADDecode(sector0, (haveMAD2 ? sector10 : NULL), mad, &madlen, false); + res = MADDecode(sector0, (haveMAD2 ? sector10 : NULL), mad, &madlen, true); if (res != PM3_SUCCESS) { PrintAndLogEx(ERR, "can't decode MAD"); return res; diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index 5332c0f1a..027fba209 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -1328,8 +1328,8 @@ static int CmdHFMFPMAD(const char *Cmd) { } PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(INFO, "--- " _CYAN_("MAD Information") " ---------------------------"); - PrintAndLogEx(INFO, "-------------------------------------------------------------"); + PrintAndLogEx(INFO, "--- " _CYAN_("MAD Information") " -------------------------------"); + PrintAndLogEx(INFO, "---------------------------------------------------"); if (verbose) { PrintAndLogEx(SUCCESS, "Raw:"); @@ -1451,7 +1451,7 @@ static int CmdHFMFPNDEF(const char *Cmd) { uint16_t mad[7 + 8 + 8 + 8 + 8] = {0}; size_t madlen = 0; - res = MADDecode(sector0, (haveMAD2 ? sector10 : NULL), mad, &madlen, false); + res = MADDecode(sector0, (haveMAD2 ? sector10 : NULL), mad, &madlen, true); if (res != PM3_SUCCESS) { PrintAndLogEx(ERR, "can't decode MAD"); return res; From 4372a728f7287446139d4e96a2325ddd28c6b6c9 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Tue, 9 Jun 2020 21:19:31 +0200 Subject: [PATCH 586/632] mad ndef no swap and restore official AID 0xE103 --- client/src/cmdhfmf.c | 4 ++-- client/src/cmdhfmfp.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 1badd75e3..ffc07099b 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -4614,7 +4614,7 @@ static int CmdHFMFNDEF(const char *Cmd) { CLIParserFree(ctx); - uint16_t ndefAID = 0x03e1; + uint16_t ndefAID = 0xe103; if (aidlen == 2) ndefAID = (aid[0] << 8) + aid[1]; @@ -4650,7 +4650,7 @@ static int CmdHFMFNDEF(const char *Cmd) { uint16_t mad[7 + 8 + 8 + 8 + 8] = {0}; size_t madlen = 0; - res = MADDecode(sector0, (haveMAD2 ? sector10 : NULL), mad, &madlen, true); + res = MADDecode(sector0, (haveMAD2 ? sector10 : NULL), mad, &madlen, false); if (res != PM3_SUCCESS) { PrintAndLogEx(ERR, "can't decode MAD"); return res; diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index 027fba209..f0d90b495 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -1415,7 +1415,7 @@ static int CmdHFMFPNDEF(const char *Cmd) { CLIParserFree(ctx); - uint16_t ndefAID = 0x03e1; + uint16_t ndefAID = 0xe103; if (aidlen == 2) ndefAID = (aid[0] << 8) + aid[1]; @@ -1451,7 +1451,7 @@ static int CmdHFMFPNDEF(const char *Cmd) { uint16_t mad[7 + 8 + 8 + 8 + 8] = {0}; size_t madlen = 0; - res = MADDecode(sector0, (haveMAD2 ? sector10 : NULL), mad, &madlen, true); + res = MADDecode(sector0, (haveMAD2 ? sector10 : NULL), mad, &madlen, false); if (res != PM3_SUCCESS) { PrintAndLogEx(ERR, "can't decode MAD"); return res; From def475e747fecbbf74770a4594efb9a103173f75 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Mon, 8 Jun 2020 22:15:47 +0200 Subject: [PATCH 587/632] Add SKIPREADLINE support to make and cmake It's mostly for headless support. At the moment, for interactive uage without readline, some commands will exit the client prematurely if they use kbd_enter_pressed(). --- client/CMakeLists.txt | 41 +++++++++++++++++++++++++++++++++++------ client/Makefile | 25 +++++++++++++++++++++---- client/src/cmdhflegic.c | 33 ++++++++++++++++++++++----------- client/src/proxmark3.c | 31 ++++++++++++++++++++++++++++--- client/src/ui.c | 6 +++--- 5 files changed, 109 insertions(+), 27 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 449b4fdbe..8db8ebf9c 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -49,6 +49,21 @@ if (NOT SKIPPYTHON EQUAL 1) pkg_search_module(PYTHON3EMBED QUIET python3-embed) endif (NOT SKIPPYTHON EQUAL 1) +if (NOT SKIPREADLINE EQUAL 1) + if (APPLE) + find_path(READLINE_INCLUDE_DIRS readline/readline.h /usr/local/opt/readline/include /opt/local/include /opt/include /usr/local/include /usr/include NO_DEFAULT_PATH) + endif (APPLE) + find_path(READLINE_INCLUDE_DIRS readline/readline.h) + + if (APPLE) + find_library(READLINE_LIBRARIES readline /usr/local/opt/readline/lib /opt/local/lib /opt/lib /usr/local/lib /usr/lib NO_DEFAULT_PATH) + endif (APPLE) + find_library(READLINE_LIBRARIES readline) + if (READLINE_INCLUDE_DIRS AND READLINE_LIBRARIES) + set(READLINE_FOUND ON) + endif (READLINE_INCLUDE_DIRS AND READLINE_LIBRARIES) +endif (NOT SKIPREADLINE EQUAL 1) + add_subdirectory(${PM3_ROOT}/client/deps deps) set (TARGET_SOURCES @@ -246,6 +261,14 @@ if (NOT SKIPPYTHON EQUAL 1) endif (PYTHON3EMBED_FOUND) endif (NOT SKIPPYTHON EQUAL 1) +if (NOT SKIPREADLINE EQUAL 1) + if (READLINE_FOUND) + add_definitions("-DHAVE_READLINE") + set(ADDITIONAL_DIRS ${READLINE_INCLUDE_DIRS} ${ADDITIONAL_DIRS}) + set(ADDITIONAL_LNK ${READLINE_LIBRARIES} ${ADDITIONAL_LNK}) + endif (READLINE_FOUND) +endif(NOT SKIPREADLINE EQUAL 1) + message("===================================================================") if (SKIPQT EQUAL 1) message("GUI support: skipped") @@ -278,6 +301,16 @@ else (SKIPPYTHON EQUAL 1) message("Python3 library: Python3 not found, disabled") endif (PYTHON3EMBED_FOUND) endif(SKIPPYTHON EQUAL 1) + +if (SKIPREADLINE EQUAL 1) + message("Readline library: skipped") +else (SKIPREADLINE EQUAL 1) + if (READLINE_FOUND) + message("Readline library: enabled") + else (READLINE_FOUND) + message("Readline library: Readline not found, disabled") + endif (READLINE_FOUND) +endif(SKIPREADLINE EQUAL 1) message("===================================================================") add_executable(proxmark3 @@ -308,13 +341,10 @@ target_include_directories(proxmark3 PRIVATE ${ADDITIONAL_DIRS} ) -if (APPLE) - set_target_properties(proxmark3 PROPERTIES LINK_FLAGS "-Wl,-F/Library/Frameworks, -L/usr/local/opt/readline/lib") - set_target_properties(proxmark3 PROPERTIES COMPILE_FLAGS "-I/usr/local/opt/readline/include") -else (APPLE) +if (NOT APPLE) # required for Raspberry Pi, but breaks with clang (OSX). Need to be at the end of the linker line. set(ADDITIONAL_LNK ${ADDITIONAL_LNK} -Wl,--as-needed -latomic -Wl,--no-as-needed) -endif (APPLE) +endif (NOT APPLE) find_library(pm3rrg_rdv4_cliparser REQUIRED) @@ -328,7 +358,6 @@ find_library(pm3rrg_rdv4_whereami REQUIRED) target_link_libraries(proxmark3 PRIVATE bz2 - readline m pm3rrg_rdv4_mbedtls pm3rrg_rdv4_cliparser diff --git a/client/Makefile b/client/Makefile index 102bf62dd..3bd059318 100644 --- a/client/Makefile +++ b/client/Makefile @@ -256,11 +256,14 @@ LDLIBS += $(QTLDLIBS) CXXINCLUDES += $(QTINCLUDES) ## Readline -ifeq ($(platform),Darwin) - LDLIBS += -L/usr/local/opt/readline/lib - INCLUDES += -I/usr/local/opt/readline/include +ifneq ($(SKIPREADLINE),1) + ifeq ($(platform),Darwin) + LDLIBS += -L/usr/local/opt/readline/lib + INCLUDES += -I/usr/local/opt/readline/include + endif + LDLIBS += -lreadline + READLINE_FOUND = 1 endif -LDLIBS += -lreadline ####################################################################################################### CFLAGS ?= $(DEFCFLAGS) @@ -280,6 +283,10 @@ ifneq (,$(findstring MINGW,$(platform))) PM3CFLAGS += -mno-ms-bitfields -fexec-charset=cp850 endif +ifeq ($(READLINE_FOUND),1) + PM3CFLAGS += -DHAVE_READLINE +endif + ifeq ($(BT_FOUND),1) PM3CFLAGS += -DHAVE_BLUEZ endif @@ -366,6 +373,16 @@ else endif endif +ifeq ($(SKIPREADLINE),1) + $(info Readline library: skipped) +else + ifeq ($(READLINE_FOUND),1) + $(info Readline library: enabled) + else + $(info Readline library: Readline not found, disabled) + endif +endif + ifeq ($(SKIPWHEREAMISYSTEM),1) $(info Whereami library: local library forced) else diff --git a/client/src/cmdhflegic.c b/client/src/cmdhflegic.c index a97d13d3f..f5ba787ad 100644 --- a/client/src/cmdhflegic.c +++ b/client/src/cmdhflegic.c @@ -73,12 +73,13 @@ static int usage_legic_sim(void) { } static int usage_legic_wrbl(void) { PrintAndLogEx(NORMAL, "Write data to a LEGIC Prime tag. It autodetects tagsize to make sure size\n"); - PrintAndLogEx(NORMAL, "Usage: hf legic wrbl [h] [o <offset>] [d <data (hex symbols)>]\n"); + PrintAndLogEx(NORMAL, "Usage: hf legic wrbl [h] [o <offset>] [d <data (hex symbols)>] [y]\n"); PrintAndLogEx(NORMAL, "Options:"); PrintAndLogEx(NORMAL, " h : this help"); PrintAndLogEx(NORMAL, " o <offset> : (hex) offset in data array to start writing"); //PrintAndLogEx(NORMAL, " <IV> : (optional) Initialization vector to use (ODD and 7bits)"); PrintAndLogEx(NORMAL, " d <data> : (hex symbols) bytes to write "); + PrintAndLogEx(NORMAL, " y : Auto-confirm dangerous operations "); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); PrintAndLogEx(NORMAL, _YELLOW_(" hf legic wrbl o 10 d 11223344 - Write 0x11223344 starting from offset 0x10")); @@ -596,6 +597,7 @@ static int CmdLegicWrbl(const char *Cmd) { uint8_t *data = NULL; uint8_t cmdp = 0; bool errors = false; + bool autoconfirm = false; int len = 0, bg, en; uint32_t offset = 0, IV = 0x55; @@ -655,6 +657,10 @@ static int CmdLegicWrbl(const char *Cmd) { errors = true; break; } + case 'y': { + autoconfirm = true; + break; + } default: { PrintAndLogEx(WARNING, "Unknown parameter '%c'", param_getchar(Cmd, cmdp)); errors = true; @@ -693,23 +699,28 @@ static int CmdLegicWrbl(const char *Cmd) { return PM3_EOUTOFBOUND; } - if (offset == 5 || offset == 6) { + if ((offset == 5 || offset == 6) && (! autoconfirm)) { PrintAndLogEx(NORMAL, "############# DANGER ################"); PrintAndLogEx(NORMAL, "# changing the DCF is irreversible #"); PrintAndLogEx(NORMAL, "#####################################"); - -#ifndef ANDROID - char *answer = readline("do you really want to continue? y(es) n(o) : "); - bool overwrite = (answer[0] == 'y' || answer[0] == 'Y'); + const char *confirm = "Do you really want to continue? y(es)/n(o) : "; + bool overwrite = false; +#ifdef HAVE_READLINE + char *answer = readline(confirm); + overwrite = (answer[0] == 'y' || answer[0] == 'Y'); +#else + printf("%s", confirm); + char *answer = NULL; + size_t anslen = 0; + if (getline(&answer, &anslen, stdin) > 0) { + overwrite = (answer[0] == 'y' || answer[0] == 'Y'); + } +#endif + free(answer); if (!overwrite) { PrintAndLogEx(NORMAL, "command cancelled"); return PM3_EOPABORTED; } -#else - PrintAndLogEx(NORMAL, "\n No interactive support on Android. "); - PrintAndLogEx(NORMAL, " So no confirmation asked, beware! "); -#endif - } legic_chk_iv(&IV); diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index eb34393ae..eea1718c3 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -15,8 +15,11 @@ #include <stdio.h> // for Mingw readline #include <limits.h> #include <unistd.h> +#ifdef HAVE_READLINE #include <readline/readline.h> #include <readline/history.h> +#endif +#include <ctype.h> #include "usart_defs.h" #include "util_posix.h" #include "proxgui.h" @@ -117,6 +120,7 @@ static void prompt_compose(char *buf, size_t buflen, const char *promptctx, cons snprintf(buf, buflen - 1, PROXPROMPT_COMPOSE, promptdev, promptctx); } +#ifdef HAVE_READLINE static int check_comm(void) { // If communications thread goes down. Device disconnected then this should hook up PM3 again. if (IsCommunicationThreadDead() && session.pm3_present) { @@ -132,6 +136,7 @@ static int check_comm(void) { } return 0; } +#endif // first slot is always NULL, indicating absence of script when idx=0 static FILE *cmdscriptfile[MAX_NESTED_CMDSCRIPT + 1] = {0}; @@ -208,6 +213,7 @@ main_loop(char *script_cmds_file, char *script_cmd, bool stayInCommandLoop) { } } +#ifdef HAVE_READLINE char *my_history_path = NULL; if (searchHomeFilePath(&my_history_path, NULL, PROXHISTORY, true) != PM3_SUCCESS) { PrintAndLogEx(ERR, "No history will be recorded"); @@ -215,6 +221,7 @@ main_loop(char *script_cmds_file, char *script_cmd, bool stayInCommandLoop) { } else { read_history(my_history_path); } +#endif // loops every time enter is pressed... while (1) { bool printprompt = false; @@ -290,12 +297,25 @@ check_script: } else { prompt_ctx = PROXPROMPT_CTX_INTERACTIVE; - rl_event_hook = check_comm; char prompt[PROXPROMPT_MAX_SIZE] = {0}; prompt_compose(prompt, sizeof(prompt), prompt_ctx, prompt_dev); char prompt_filtered[PROXPROMPT_MAX_SIZE] = {0}; memcpy_filter_ansi(prompt_filtered, prompt, sizeof(prompt_filtered), !session.supports_colors); +#ifdef HAVE_READLINE + rl_event_hook = check_comm; cmd = readline(prompt_filtered); +#else + printf("%s", prompt_filtered); + cmd = NULL; + size_t len = 0; + int ret; + if ((ret = getline(&cmd, &len, stdin)) < 0) { + // TODO this happens also when kbd_enter_pressed() is used, with a key pressed or not + printf("GETLINE ERR %i", ret); + free(cmd); + cmd = NULL; + } +#endif fflush(NULL); } } @@ -333,6 +353,7 @@ check_script: PrintAndLogEx(NORMAL, "%s%s", prompt_filtered, cmd); g_printAndLog = PRINTANDLOG_PRINT | PRINTANDLOG_LOG; +#ifdef HAVE_READLINE // add to history if not from a script if (!current_cmdscriptfile()) { HIST_ENTRY *entry = history_get(history_length); @@ -341,6 +362,7 @@ check_script: add_history(cmd); } } +#endif // process cmd int ret = CommandReceived(cmd); // exit or quit @@ -367,11 +389,12 @@ check_script: while (current_cmdscriptfile()) pop_cmdscriptfile(); +#ifdef HAVE_READLINE if (my_history_path) { write_history(my_history_path); free(my_history_path); } - +#endif if (cmd) { free(cmd); cmd = NULL; @@ -681,12 +704,14 @@ int main(int argc, char *argv[]) { char *port = NULL; uint32_t speed = 0; +#ifdef HAVE_READLINE /* initialize history */ using_history(); #ifdef RL_STATE_READCMD rl_extend_line_buffer(1024); -#endif +#endif // RL_STATE_READCMD +#endif // HAVE_READLINE char *exec_name = argv[0]; #if defined(_WIN32) diff --git a/client/src/ui.c b/client/src/ui.c index 0f4e28a62..68f0eab24 100644 --- a/client/src/ui.c +++ b/client/src/ui.c @@ -22,7 +22,7 @@ #include <stdarg.h> #include <stdlib.h> -#ifndef ANDROID +#ifdef HAVE_READLINE #include <readline/readline.h> #endif @@ -297,8 +297,6 @@ void PrintAndLogEx(logLevel_t level, const char *fmt, ...) { } static void fPrintAndLog(FILE *stream, const char *fmt, ...) { - char *saved_line; - int saved_point; va_list argptr; static FILE *logfile = NULL; static int logging = 1; @@ -344,6 +342,8 @@ static void fPrintAndLog(FILE *stream, const char *fmt, ...) { #ifdef RL_STATE_READCMD // We are using GNU readline. libedit (OSX) doesn't support this flag. int need_hack = (rl_readline_state & RL_STATE_READCMD) > 0; + char *saved_line; + int saved_point; if (need_hack) { saved_point = rl_point; From dcabb7e37d956142aa78bc701affb1d5a8b81c25 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 9 Jun 2020 21:29:59 +0200 Subject: [PATCH 588/632] chg: hf 14a info - dont print some hints if magic --- client/src/cmdhf14a.c | 19 ++++++++++--------- client/src/mifare/mifarehost.c | 3 ++- client/src/mifare/mifarehost.h | 2 +- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index 7703fe849..50d3fd30a 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -296,7 +296,7 @@ static int CmdHF14AReader(const char *Cmd) { break; default: PrintAndLogEx(WARNING, "Unknown command."); - return 1; + return PM3_EINVARG; } cmdp++; } @@ -312,7 +312,7 @@ static int CmdHF14AReader(const char *Cmd) { if (!WaitForResponseTimeout(CMD_ACK, &resp, 2500)) { if (!silent) PrintAndLogEx(WARNING, "iso14443a card select failed"); DropField(); - return 1; + return PM3_ESOFT; } iso14a_card_select_t card; @@ -329,14 +329,14 @@ static int CmdHF14AReader(const char *Cmd) { if (select_status == 0) { if (!silent) PrintAndLogEx(WARNING, "iso14443a card select failed"); DropField(); - return 1; + return PM3_ESOFT; } if (select_status == 3) { PrintAndLogEx(INFO, "Card doesn't support standard iso14443-3 anticollision"); PrintAndLogEx(SUCCESS, "ATQA: %02x %02x", card.atqa[1], card.atqa[0]); DropField(); - return 1; + return PM3_ESOFT; } PrintAndLogEx(SUCCESS, " UID: " _GREEN_("%s"), sprint_hex(card.uid, card.uidlen)); @@ -356,7 +356,7 @@ static int CmdHF14AReader(const char *Cmd) { if (!silent) PrintAndLogEx(INFO, "field dropped."); } - return 0; + return PM3_SUCCESS; } static int CmdHF14AInfo(const char *Cmd) { @@ -385,7 +385,7 @@ static int CmdHF14AInfo(const char *Cmd) { CLIParserFree(ctx); infoHF14A(verbose, do_nack_test, do_aid_search); - return 0; + return PM3_SUCCESS; } // Collect ISO14443 Type A UIDs @@ -1773,8 +1773,9 @@ int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { PrintAndLogEx(INFO, "proprietary non iso14443-4 card found, RATS not supported"); } + int isMagic = 0; if (isMifareClassic || isMifareUltralight) { - detect_classic_magic(); + isMagic = detect_classic_magic(); if (isMifareClassic) { int res = detect_classic_prng(); @@ -1800,10 +1801,10 @@ int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { if (isMifareUltralight) PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`hf mfu info`")); - if (isMifarePlus) + if (isMifarePlus && isMagic == 0) PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`hf mfp info`")); - if (isMifareDESFire) + if (isMifareDESFire && isMagic == 0) PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`hf mfdes info`")); DropField(); diff --git a/client/src/mifare/mifarehost.c b/client/src/mifare/mifarehost.c index 8e476a424..cf8a414c9 100644 --- a/client/src/mifare/mifarehost.c +++ b/client/src/mifare/mifarehost.c @@ -1117,7 +1117,7 @@ int detect_classic_static_nonce(void) { } /* try to see if card responses to "chinese magic backdoor" commands. */ -void detect_classic_magic(void) { +int detect_classic_magic(void) { uint8_t isGeneration = 0; PacketResponseNG resp; @@ -1144,4 +1144,5 @@ void detect_classic_magic(void) { default: break; } + return isGeneration; } diff --git a/client/src/mifare/mifarehost.h b/client/src/mifare/mifarehost.h index fc3a571be..f8205732f 100644 --- a/client/src/mifare/mifarehost.h +++ b/client/src/mifare/mifarehost.h @@ -84,7 +84,7 @@ int tryDecryptWord(uint32_t nt, uint32_t ar_enc, uint32_t at_enc, uint8_t *data, int detect_classic_prng(void); int detect_classic_nackbug(bool verbose); -void detect_classic_magic(void); +int detect_classic_magic(void); int detect_classic_static_nonce(void); void mf_crypto1_decrypt(struct Crypto1State *pcs, uint8_t *data, int len, bool isEncrypted); #endif From 61f09d0ec407339c534e12e12440cc59c7e05d55 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 9 Jun 2020 22:16:35 +0200 Subject: [PATCH 589/632] add theremin.py script, (@rosco) --- client/pyscripts/theremin.py | 78 ++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 client/pyscripts/theremin.py diff --git a/client/pyscripts/theremin.py b/client/pyscripts/theremin.py new file mode 100644 index 000000000..a84ff3adf --- /dev/null +++ b/client/pyscripts/theremin.py @@ -0,0 +1,78 @@ +#!/usr/bin/python3 + +### Parameters +# Sound output parameters +volume = 1.0 +sample_buf_size = 44 +sampling_freq = 44100 #Hz + +# Frequency generator parameters +min_freq = 200 #Hz +max_freq = 2000 #Hz + +# Proxmark3 parameters +pm3_client="/usr/local/bin/proxmark3" +pm3_reader_dev_file="/dev/ttyACM0" +pm3_tune_cmd="hf tune" + + +### Modules +import numpy +import pyaudio +from select import select +from subprocess import Popen, DEVNULL, PIPE + + +### Main program +p = pyaudio.PyAudio() + +# For paFloat32 sample values must be in range [-1.0, 1.0] +stream = p.open(format=pyaudio.paFloat32, + channels=1, + rate=sampling_freq, + output=True) + +# Initial voltage to frequency values +min_v = 100.0 +max_v = 0.0 +v = 0 +out_freq = min_freq + +# Spawn the Proxmark3 client +pm3_proc = Popen([pm3_client, pm3_reader_dev_file, "-c", pm3_tune_cmd], + bufsize=0, env={}, stdin=DEVNULL, stdout=PIPE, stderr=DEVNULL) +mv_recbuf = "" + +# Read voltages from the Proxmark3, generate the sine wave, output to soundcard +sample_buf = [0.0 for x in range(0, sample_buf_size)] +i = 0 +sinev = 0 +while True: + + # Read Proxmark3 client's stdout and extract voltage values + if(select([pm3_proc.stdout], [], [], 0)[0]): + + b = pm3_proc.stdout.read(256).decode("ascii") + for c in b: + if c in "0123456789 mV": + mv_recbuf += c + else: + mv_recbuf = "" + if mv_recbuf[-3:] == " mV": + v = int(mv_recbuf[:-3]) / 1000 + if v < min_v: + min_v = v - 0.001 + if v > max_v: + max_v = v + + # Recalculate the audio frequency to generate + out_freq = (max_freq - min_freq) * (max_v - v) / (max_v - min_v) + min_freq + + # Generate the samples and write them to the soundcard + sinevs = out_freq / sampling_freq * numpy.pi * 2 + sample_buf[i] = sinev + sinev += sinevs + sinev = sinev if sinev < numpy.pi * 2 else sinev - numpy.pi * 2 + i = (i + 1) % sample_buf_size + if not i: + stream.write((numpy.sin(sample_buf) * volume).astype(numpy.float32).tobytes()) From 9189dc85635af754556b2803033574d425b67146 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Tue, 9 Jun 2020 23:37:56 +0200 Subject: [PATCH 590/632] applied theremin patch, adc values are summed, remember to divide when read --- armsrc/appmain.c | 33 ++++++++++++++++----------------- armsrc/appmain.h | 2 +- armsrc/iso14443b.c | 4 ++-- armsrc/lfops.c | 2 +- armsrc/mifaresim.c | 4 ++-- armsrc/thinfilm.c | 4 ++-- 6 files changed, 24 insertions(+), 25 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 3793182ce..9e51d0f76 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -108,7 +108,7 @@ void ToSendStuffBit(int b) { //----------------------------------------------------------------------------- // Read an ADC channel and block till it completes, then return the result -// in ADC units (0 to 1023). Also a routine to average 32 samples and +// in ADC units (0 to 1023). Also a routine to sum up a number of samples and // return that. //----------------------------------------------------------------------------- static uint16_t ReadAdc(int ch) { @@ -137,13 +137,12 @@ static uint16_t ReadAdc(int ch) { } // was static - merlok -uint16_t AvgAdc(int ch) { +uint16_t SumAdc(int ch, int NbSamples) { uint16_t a = 0; - for (uint8_t i = 0; i < 32; i++) + for (uint8_t i = 0; i < NbSamples; i++) a += ReadAdc(ch); - //division by 32 - return (a + 15) >> 5; + return (a + (NbSamples >> 1) - 1); } static void MeasureAntennaTuning(void) { @@ -186,7 +185,7 @@ static void MeasureAntennaTuning(void) { WDT_HIT(); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, i); SpinDelay(20); - uint32_t adcval = ((MAX_ADC_LF_VOLTAGE * AvgAdc(ADC_CHAN_LF)) >> 10); + uint32_t adcval = ((MAX_ADC_LF_VOLTAGE * (SumAdc(ADC_CHAN_LF, 32) >> 1)) >> 14); if (i == LF_DIVISOR_125) payload.v_lf125 = adcval; // voltage at 125kHz @@ -212,9 +211,9 @@ static void MeasureAntennaTuning(void) { SpinDelay(50); #if defined RDV4 - payload.v_hf = (MAX_ADC_HF_VOLTAGE_RDV40 * AvgAdc(ADC_CHAN_HF_RDV40)) >> 10; + payload.v_hf = (MAX_ADC_HF_VOLTAGE_RDV40 * SumAdc(ADC_CHAN_HF_RDV40, 32)) >> 15; #else - payload.v_hf = (MAX_ADC_HF_VOLTAGE * AvgAdc(ADC_CHAN_HF)) >> 10; + payload.v_hf = (MAX_ADC_HF_VOLTAGE * SumAdc(ADC_CHAN_HF, 32)) >> 15; #endif FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); @@ -226,16 +225,16 @@ static void MeasureAntennaTuning(void) { static uint16_t MeasureAntennaTuningHfData(void) { #if defined RDV4 - return (MAX_ADC_HF_VOLTAGE_RDV40 * AvgAdc(ADC_CHAN_HF_RDV40)) >> 10; + return (MAX_ADC_HF_VOLTAGE_RDV40 * SumAdc(ADC_CHAN_HF_RDV40, 64)) >> 16; #else - return (MAX_ADC_HF_VOLTAGE * AvgAdc(ADC_CHAN_HF)) >> 10; + return (MAX_ADC_HF_VOLTAGE * SumAdc(ADC_CHAN_HF, 64)) >> 16; #endif } // Measure LF in milliVolt static uint32_t MeasureAntennaTuningLfData(void) { - return (MAX_ADC_LF_VOLTAGE * AvgAdc(ADC_CHAN_LF)) >> 10; + return (MAX_ADC_LF_VOLTAGE * (SumAdc(ADC_CHAN_LF, 32) >> 1)) >> 14; } void ReadMem(int addr) { @@ -541,7 +540,7 @@ void ListenReaderField(uint8_t limit) { LEDsoff(); if (limit == LF_ONLY) { - lf_av = lf_max = AvgAdc(ADC_CHAN_LF); + lf_av = lf_max = SumAdc(ADC_CHAN_LF, 32) >> 5; Dbprintf("LF 125/134kHz Baseline: %dmV", (MAX_ADC_LF_VOLTAGE * lf_av) >> 10); lf_baseline = lf_av; } @@ -550,9 +549,9 @@ void ListenReaderField(uint8_t limit) { #if defined RDV4 // iceman, useless, since we are measuring readerfield, not our field. My tests shows a max of 20v from a reader. - hf_av = hf_max = AvgAdc(ADC_CHAN_HF_RDV40); + hf_av = hf_max = SumAdc(ADC_CHAN_HF_RDV40, 32) >> 5; #else - hf_av = hf_max = AvgAdc(ADC_CHAN_HF); + hf_av = hf_max = SumAdc(ADC_CHAN_HF, 32) >> 5; #endif Dbprintf("HF 13.56MHz Baseline: %dmV", (MAX_ADC_HF_VOLTAGE * hf_av) >> 10); hf_baseline = hf_av; @@ -586,7 +585,7 @@ void ListenReaderField(uint8_t limit) { LED_D_OFF(); } - lf_av_new = AvgAdc(ADC_CHAN_LF); + lf_av_new = SumAdc(ADC_CHAN_LF, 32) >> 5; // see if there's a significant change if (ABS(lf_av - lf_av_new) > REPORT_CHANGE) { Dbprintf("LF 125/134kHz Field Change: %5dmV", (MAX_ADC_LF_VOLTAGE * lf_av_new) >> 10); @@ -605,9 +604,9 @@ void ListenReaderField(uint8_t limit) { } #if defined RDV4 - hf_av_new = AvgAdc(ADC_CHAN_HF_RDV40); + hf_av_new = SumAdc(ADC_CHAN_HF_RDV40, 32) >> 5; #else - hf_av_new = AvgAdc(ADC_CHAN_HF); + hf_av_new = SumAdc(ADC_CHAN_HF, 32) >> 5; #endif // see if there's a significant change if (ABS(hf_av - hf_av_new) > REPORT_CHANGE) { diff --git a/armsrc/appmain.h b/armsrc/appmain.h index 5aece8388..15f3d5ffd 100644 --- a/armsrc/appmain.h +++ b/armsrc/appmain.h @@ -30,7 +30,7 @@ void send_wtx(uint16_t wtx); void ReadMem(int addr); void __attribute__((noreturn)) AppMain(void); -uint16_t AvgAdc(int ch); +uint16_t SumAdc(int ch, int NbSamples); //void PrintToSendBuffer(void); void ToSendStuffBit(int b); diff --git a/armsrc/iso14443b.c b/armsrc/iso14443b.c index bbca137fc..4999c4d85 100644 --- a/armsrc/iso14443b.c +++ b/armsrc/iso14443b.c @@ -641,9 +641,9 @@ void SimulateIso14443bTag(uint32_t pupi) { if (cardSTATE == SIM_NOFIELD) { #if defined RDV4 - vHf = (MAX_ADC_HF_VOLTAGE_RDV40 * AvgAdc(ADC_CHAN_HF_RDV40)) >> 10; + vHf = (MAX_ADC_HF_VOLTAGE_RDV40 * SumAdc(ADC_CHAN_HF_RDV40, 32)) >> 15; #else - vHf = (MAX_ADC_HF_VOLTAGE * AvgAdc(ADC_CHAN_HF)) >> 10; + vHf = (MAX_ADC_HF_VOLTAGE * SumAdc(ADC_CHAN_HF, 32)) >> 15; #endif if (vHf > MF_MINFIELDV) { cardSTATE = SIM_IDLE; diff --git a/armsrc/lfops.c b/armsrc/lfops.c index 9ef3a34a8..72559a7b9 100644 --- a/armsrc/lfops.c +++ b/armsrc/lfops.c @@ -1571,7 +1571,7 @@ void TurnReadLFOn(uint32_t delay) { FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER | FPGA_LF_ADC_READER_FIELD); // measure antenna strength. - //int adcval = ((MAX_ADC_LF_VOLTAGE * AvgAdc(ADC_CHAN_LF)) >> 10); + //int adcval = ((MAX_ADC_LF_VOLTAGE * (SumAdc(ADC_CHAN_LF, 32) >> 1)) >> 14); WaitUS(delay); } static void TurnReadLF_off(uint32_t delay) { diff --git a/armsrc/mifaresim.c b/armsrc/mifaresim.c index ecc0ee505..60f9a7810 100644 --- a/armsrc/mifaresim.c +++ b/armsrc/mifaresim.c @@ -539,9 +539,9 @@ void Mifare1ksim(uint16_t flags, uint8_t exitAfterNReads, uint8_t *datain, uint1 if (cardSTATE == MFEMUL_NOFIELD) { #if defined RDV4 - vHf = (MAX_ADC_HF_VOLTAGE_RDV40 * AvgAdc(ADC_CHAN_HF_RDV40)) >> 10; + vHf = (MAX_ADC_HF_VOLTAGE_RDV40 * SumAdc(ADC_CHAN_HF_RDV40, 32)) >> 15; #else - vHf = (MAX_ADC_HF_VOLTAGE * AvgAdc(ADC_CHAN_HF)) >> 10; + vHf = (MAX_ADC_HF_VOLTAGE * SumAdc(ADC_CHAN_HF, 32)) >> 15; #endif if (vHf > MF_MINFIELDV) { diff --git a/armsrc/thinfilm.c b/armsrc/thinfilm.c index a77a70744..14dd1155a 100644 --- a/armsrc/thinfilm.c +++ b/armsrc/thinfilm.c @@ -53,9 +53,9 @@ static uint16_t FpgaSendQueueDelay; static uint16_t ReadReaderField(void) { #if defined RDV4 - return AvgAdc(ADC_CHAN_HF_RDV40); + return SumAdc(ADC_CHAN_HF_RDV40, 32) >> 5; #else - return AvgAdc(ADC_CHAN_HF); + return SumAdc(ADC_CHAN_HF, 32) >> 5; #endif } From 33662bdd598d7dc78e066fd2d921d29400911fca Mon Sep 17 00:00:00 2001 From: Lukas Kuzmiak <lukash@backstep.net> Date: Tue, 9 Jun 2020 14:43:00 -0700 Subject: [PATCH 591/632] Decode MAD Info Byte and show info about sector it points to --- client/src/mifare/mad.c | 51 +++++++++++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/client/src/mifare/mad.c b/client/src/mifare/mad.c index f85dd9cbe..10359a756 100644 --- a/client/src/mifare/mad.c +++ b/client/src/mifare/mad.c @@ -241,22 +241,44 @@ static const char *aid_admin[] = { "not applicable" }; +static int MADInfoByteDecode(uint8_t *sector, bool swapmad, int MADver, bool verbose) { + uint8_t InfoByte; + if (MADver == 1) { + InfoByte = sector[16 + 1] & 0x3f; + if (InfoByte >= 0xF) { + PrintAndLogEx(WARNING, "Invalid Info byte (MAD1) value " _YELLOW_("0x%02x"), InfoByte); + if (verbose) + // I understand the spec in a way that MAD1 InfoByte should not point into MAD2 sectors, @lukaskuzmiak + PrintAndLogEx(WARNING, "MAD1 Info byte points outside of MAD1 sector space (0x%02x), report a bug?", InfoByte); + return PM3_ESOFT; + } + } else { + InfoByte = sector[1] & 0x3f; + if (InfoByte == 0x10 || InfoByte >= 0x28) { + PrintAndLogEx(WARNING, "Invalid Info byte (MAD2) value " _YELLOW_("0x%02x"), InfoByte); + return PM3_ESOFT; + } + } + + if (InfoByte) { + uint16_t aid = madGetAID(sector, swapmad, MADver, InfoByte); + char fmt[50]; + sprintf(fmt, "Card publisher sector: %02d, AID 0x%04X%s", InfoByte, aid, "%s"); + print_aid_description(mad_known_aids, aid, fmt, verbose); + return PM3_SUCCESS; + } else { + PrintAndLogEx(WARNING, "Card publisher not present " _YELLOW_("0x%02x"), InfoByte); + return PM3_ESOFT; + } +} + int MAD1DecodeAndPrint(uint8_t *sector, bool swapmad, bool verbose, bool *haveMAD2) { open_mad_file(&mad_known_aids, verbose); // check MAD1 only MADCheck(sector, NULL, verbose, haveMAD2); - // info byte - uint8_t InfoByte = sector[16 + 1] & 0x3f; - if (InfoByte) { - PrintAndLogEx(SUCCESS, "Card publisher sector: " _GREEN_("0x%02x"), InfoByte); - } else { - if (verbose) - PrintAndLogEx(WARNING, "Card publisher sector not present"); - } - if (InfoByte == 0x10 || InfoByte >= 0x28) - PrintAndLogEx(WARNING, "Info byte error"); + MADInfoByteDecode(sector, swapmad, 1, verbose); PrintAndLogEx(INFO, " 00 MAD 1"); uint32_t prev_aid = 0xFFFFFFFF; @@ -289,13 +311,8 @@ int MAD2DecodeAndPrint(uint8_t *sector, bool swapmad, bool verbose) { PrintAndLogEx(WARNING, "CRC8-MAD2 (%s)", _RED_("fail")); } - uint8_t InfoByte = sector[1] & 0x3f; - if (InfoByte) { - PrintAndLogEx(SUCCESS, "MAD2 Card publisher sector: " _GREEN_("0x%02x"), InfoByte); - } else { - if (verbose) - PrintAndLogEx(WARNING, "Card publisher sector not present"); - } + MADInfoByteDecode(sector, swapmad, 2, verbose); + uint32_t prev_aid = 0xFFFFFFFF; for (int i = 1; i < 8 + 8 + 7 + 1; i++) { uint16_t aid = madGetAID(sector, swapmad, 2, i); From 0ce3be2f3431e9652d7831650c7f916e3d8afe2e Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Wed, 10 Jun 2020 00:06:18 +0200 Subject: [PATCH 592/632] Reintroduce AvgAdv, avoid *64 as it could easily overflow This reverts partly commit 9189dc85635af754556b2803033574d425b67146. --- armsrc/appmain.c | 21 ++++++++++++--------- armsrc/appmain.h | 1 + armsrc/thinfilm.c | 4 ++-- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 9e51d0f76..c5cdc5dc7 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -137,11 +137,14 @@ static uint16_t ReadAdc(int ch) { } // was static - merlok +uint16_t AvgAdc(int ch) { + return SumAdc(ch, 32) >> 5; +} + uint16_t SumAdc(int ch, int NbSamples) { uint16_t a = 0; for (uint8_t i = 0; i < NbSamples; i++) a += ReadAdc(ch); - return (a + (NbSamples >> 1) - 1); } @@ -225,9 +228,9 @@ static void MeasureAntennaTuning(void) { static uint16_t MeasureAntennaTuningHfData(void) { #if defined RDV4 - return (MAX_ADC_HF_VOLTAGE_RDV40 * SumAdc(ADC_CHAN_HF_RDV40, 64)) >> 16; + return (MAX_ADC_HF_VOLTAGE_RDV40 * SumAdc(ADC_CHAN_HF_RDV40, 32)) >> 15; #else - return (MAX_ADC_HF_VOLTAGE * SumAdc(ADC_CHAN_HF, 64)) >> 16; + return (MAX_ADC_HF_VOLTAGE * SumAdc(ADC_CHAN_HF, 32)) >> 15; #endif } @@ -540,7 +543,7 @@ void ListenReaderField(uint8_t limit) { LEDsoff(); if (limit == LF_ONLY) { - lf_av = lf_max = SumAdc(ADC_CHAN_LF, 32) >> 5; + lf_av = lf_max = AvgAdc(ADC_CHAN_LF); Dbprintf("LF 125/134kHz Baseline: %dmV", (MAX_ADC_LF_VOLTAGE * lf_av) >> 10); lf_baseline = lf_av; } @@ -549,9 +552,9 @@ void ListenReaderField(uint8_t limit) { #if defined RDV4 // iceman, useless, since we are measuring readerfield, not our field. My tests shows a max of 20v from a reader. - hf_av = hf_max = SumAdc(ADC_CHAN_HF_RDV40, 32) >> 5; + hf_av = hf_max = AvgAdc(ADC_CHAN_HF_RDV40); #else - hf_av = hf_max = SumAdc(ADC_CHAN_HF, 32) >> 5; + hf_av = hf_max = AvgAdc(ADC_CHAN_HF); #endif Dbprintf("HF 13.56MHz Baseline: %dmV", (MAX_ADC_HF_VOLTAGE * hf_av) >> 10); hf_baseline = hf_av; @@ -585,7 +588,7 @@ void ListenReaderField(uint8_t limit) { LED_D_OFF(); } - lf_av_new = SumAdc(ADC_CHAN_LF, 32) >> 5; + lf_av_new = AvgAdc(ADC_CHAN_LF); // see if there's a significant change if (ABS(lf_av - lf_av_new) > REPORT_CHANGE) { Dbprintf("LF 125/134kHz Field Change: %5dmV", (MAX_ADC_LF_VOLTAGE * lf_av_new) >> 10); @@ -604,9 +607,9 @@ void ListenReaderField(uint8_t limit) { } #if defined RDV4 - hf_av_new = SumAdc(ADC_CHAN_HF_RDV40, 32) >> 5; + hf_av_new = AvgAdc(ADC_CHAN_HF_RDV40); #else - hf_av_new = SumAdc(ADC_CHAN_HF, 32) >> 5; + hf_av_new = AvgAdc(ADC_CHAN_HF); #endif // see if there's a significant change if (ABS(hf_av - hf_av_new) > REPORT_CHANGE) { diff --git a/armsrc/appmain.h b/armsrc/appmain.h index 15f3d5ffd..6a650f163 100644 --- a/armsrc/appmain.h +++ b/armsrc/appmain.h @@ -30,6 +30,7 @@ void send_wtx(uint16_t wtx); void ReadMem(int addr); void __attribute__((noreturn)) AppMain(void); +uint16_t AvgAdc(int ch); uint16_t SumAdc(int ch, int NbSamples); //void PrintToSendBuffer(void); diff --git a/armsrc/thinfilm.c b/armsrc/thinfilm.c index 14dd1155a..a77a70744 100644 --- a/armsrc/thinfilm.c +++ b/armsrc/thinfilm.c @@ -53,9 +53,9 @@ static uint16_t FpgaSendQueueDelay; static uint16_t ReadReaderField(void) { #if defined RDV4 - return SumAdc(ADC_CHAN_HF_RDV40, 32) >> 5; + return AvgAdc(ADC_CHAN_HF_RDV40); #else - return SumAdc(ADC_CHAN_HF, 32) >> 5; + return AvgAdc(ADC_CHAN_HF); #endif } From ca30ff9bc2ae142cf518f3dca07d0190e519ddd3 Mon Sep 17 00:00:00 2001 From: Lukas Kuzmiak <lukash@backstep.net> Date: Tue, 9 Jun 2020 15:39:17 -0700 Subject: [PATCH 593/632] highlight sector line instead of printing it twice, update Changelog --- CHANGELOG.md | 1 + client/src/mifare/mad.c | 27 ++++++++++++--------------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe1ee7560..77e501555 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added Mifare MAD Info Byte decoding. Easier to identify Card Publisher (@lukaskuzmiak) - Change use system Bzip2 library instead of Zlib for hardnested tables, tables are now 7x smaller (@doegox) - Change pushed some ARM source to compile with THUMB. Saves a lot of space of ARM flash memory (@slurdge) - Change from using ZLIB compression of FPGA images in ARM to LZ4. 15%+ speedups when swapping between HF & LF now (@slurdge) diff --git a/client/src/mifare/mad.c b/client/src/mifare/mad.c index 10359a756..c4569b274 100644 --- a/client/src/mifare/mad.c +++ b/client/src/mifare/mad.c @@ -261,11 +261,8 @@ static int MADInfoByteDecode(uint8_t *sector, bool swapmad, int MADver, bool ver } if (InfoByte) { - uint16_t aid = madGetAID(sector, swapmad, MADver, InfoByte); - char fmt[50]; - sprintf(fmt, "Card publisher sector: %02d, AID 0x%04X%s", InfoByte, aid, "%s"); - print_aid_description(mad_known_aids, aid, fmt, verbose); - return PM3_SUCCESS; + PrintAndLogEx(SUCCESS, "Card publisher sector: " _MAGENTA_("0x%02x"), InfoByte); + return InfoByte; } else { PrintAndLogEx(WARNING, "Card publisher not present " _YELLOW_("0x%02x"), InfoByte); return PM3_ESOFT; @@ -278,19 +275,19 @@ int MAD1DecodeAndPrint(uint8_t *sector, bool swapmad, bool verbose, bool *haveMA // check MAD1 only MADCheck(sector, NULL, verbose, haveMAD2); - MADInfoByteDecode(sector, swapmad, 1, verbose); + int InfoByteSector = MADInfoByteDecode(sector, swapmad, 1, verbose); PrintAndLogEx(INFO, " 00 MAD 1"); uint32_t prev_aid = 0xFFFFFFFF; for (int i = 1; i < 16; i++) { uint16_t aid = madGetAID(sector, swapmad, 1, i); if (aid < 6) { - PrintAndLogEx(INFO, " %02d [%04X] (%s)", i, aid, aid_admin[aid]); + PrintAndLogEx(INFO, (InfoByteSector == i) ? _MAGENTA_(" %02d [%04X] (%s)") : " %02d [%04X] (%s)", i, aid, aid_admin[aid]); } else if (prev_aid == aid) { - PrintAndLogEx(INFO, " %02d [%04X] (continuation)", i, aid); + PrintAndLogEx(INFO, (InfoByteSector == i) ? _MAGENTA_(" %02d [%04X] (continuation)") : " %02d [%04X] (continuation)", i, aid); } else { - char fmt[20]; - sprintf(fmt, " %02d [%04X]%s", i, aid, "%s"); + char fmt[30]; + sprintf(fmt, (InfoByteSector == i) ? _MAGENTA_(" %02d [%04X]%s") : " %02d [%04X]%s", i, aid, "%s"); print_aid_description(mad_known_aids, aid, fmt, verbose); prev_aid = aid; } @@ -311,18 +308,18 @@ int MAD2DecodeAndPrint(uint8_t *sector, bool swapmad, bool verbose) { PrintAndLogEx(WARNING, "CRC8-MAD2 (%s)", _RED_("fail")); } - MADInfoByteDecode(sector, swapmad, 2, verbose); + int InfoByteSector = MADInfoByteDecode(sector, swapmad, 2, verbose); uint32_t prev_aid = 0xFFFFFFFF; for (int i = 1; i < 8 + 8 + 7 + 1; i++) { uint16_t aid = madGetAID(sector, swapmad, 2, i); if (aid < 6) { - PrintAndLogEx(INFO, " %02d [%04X] (%s)", i + 16, aid, aid_admin[aid]); + PrintAndLogEx(INFO, (InfoByteSector == i) ? _MAGENTA_(" %02d [%04X] (%s)") : " %02d [%04X] (%s)", i + 16, aid, aid_admin[aid]); } else if (prev_aid == aid) { - PrintAndLogEx(INFO, " %02d [%04X] (continuation)", i + 16, aid); + PrintAndLogEx(INFO, (InfoByteSector == i) ? _MAGENTA_(" %02d [%04X] (continuation)") : " %02d [%04X] (continuation)", i + 16, aid); } else { - char fmt[20]; - sprintf(fmt, " %02d [%04X]%s", i + 16, aid, "%s"); + char fmt[30]; + sprintf(fmt, (InfoByteSector == i) ? _MAGENTA_(" %02d [%04X]%s") : " %02d [%04X]%s", i + 16, aid, "%s"); print_aid_description(mad_known_aids, aid, fmt, verbose); prev_aid = aid; } From ed06f72c3f14f9e59e9112a5fef424a6eab0e56f Mon Sep 17 00:00:00 2001 From: Lukas Kuzmiak <lukash@backstep.net> Date: Tue, 9 Jun 2020 15:57:06 -0700 Subject: [PATCH 594/632] add *.tmp to .gitignore, my git client goes insane during compilation --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index a89e3f6e9..4ee047c9e 100644 --- a/.gitignore +++ b/.gitignore @@ -100,3 +100,6 @@ client/lualibs/pm3_cmd.lua fpga_version_info.c .proxmark3/* + +# .tmp files are created during compilation +*.tmp From e3e33a650195929b2413abce8e7e0dcb64bd11dd Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Wed, 10 Jun 2020 01:08:49 +0200 Subject: [PATCH 595/632] Use SumAdc also in ListenReaderField --- armsrc/appmain.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index c5cdc5dc7..fd5b4853c 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -529,7 +529,7 @@ at the same place! :-) void ListenReaderField(uint8_t limit) { #define LF_ONLY 1 #define HF_ONLY 2 -#define REPORT_CHANGE 10 // report new values only if they have changed at least by REPORT_CHANGE +#define REPORT_CHANGE 1000 // report new values only if they have changed at least by REPORT_CHANGE mV uint16_t lf_av = 0, lf_av_new, lf_baseline = 0, lf_max = 0; uint16_t hf_av = 0, hf_av_new, hf_baseline = 0, hf_max = 0; @@ -543,8 +543,8 @@ void ListenReaderField(uint8_t limit) { LEDsoff(); if (limit == LF_ONLY) { - lf_av = lf_max = AvgAdc(ADC_CHAN_LF); - Dbprintf("LF 125/134kHz Baseline: %dmV", (MAX_ADC_LF_VOLTAGE * lf_av) >> 10); + lf_av = lf_max = (MAX_ADC_LF_VOLTAGE * SumAdc(ADC_CHAN_LF, 32)) >> 15; + Dbprintf("LF 125/134kHz Baseline: %dmV", lf_av); lf_baseline = lf_av; } @@ -552,11 +552,11 @@ void ListenReaderField(uint8_t limit) { #if defined RDV4 // iceman, useless, since we are measuring readerfield, not our field. My tests shows a max of 20v from a reader. - hf_av = hf_max = AvgAdc(ADC_CHAN_HF_RDV40); + hf_av = hf_max = (MAX_ADC_HF_VOLTAGE_RDV40 * SumAdc(ADC_CHAN_HF_RDV40, 32)) >> 15; #else - hf_av = hf_max = AvgAdc(ADC_CHAN_HF); + hf_av = hf_max = (MAX_ADC_HF_VOLTAGE * SumAdc(ADC_CHAN_HF, 32)) >> 15; #endif - Dbprintf("HF 13.56MHz Baseline: %dmV", (MAX_ADC_HF_VOLTAGE * hf_av) >> 10); + Dbprintf("HF 13.56MHz Baseline: %dmV", hf_av); hf_baseline = hf_av; } @@ -588,10 +588,10 @@ void ListenReaderField(uint8_t limit) { LED_D_OFF(); } - lf_av_new = AvgAdc(ADC_CHAN_LF); + lf_av_new = (MAX_ADC_LF_VOLTAGE * SumAdc(ADC_CHAN_LF, 32)) >> 15; // see if there's a significant change if (ABS(lf_av - lf_av_new) > REPORT_CHANGE) { - Dbprintf("LF 125/134kHz Field Change: %5dmV", (MAX_ADC_LF_VOLTAGE * lf_av_new) >> 10); + Dbprintf("LF 125/134kHz Field Change: %5dmV", lf_av_new); lf_av = lf_av_new; if (lf_av > lf_max) lf_max = lf_av; @@ -607,13 +607,13 @@ void ListenReaderField(uint8_t limit) { } #if defined RDV4 - hf_av_new = AvgAdc(ADC_CHAN_HF_RDV40); + hf_av_new = (MAX_ADC_HF_VOLTAGE_RDV40 * SumAdc(ADC_CHAN_HF_RDV40, 32)) >> 15; #else - hf_av_new = AvgAdc(ADC_CHAN_HF); + hf_av_new = (MAX_ADC_HF_VOLTAGE * SumAdc(ADC_CHAN_HF, 32)) >> 15; #endif // see if there's a significant change if (ABS(hf_av - hf_av_new) > REPORT_CHANGE) { - Dbprintf("HF 13.56MHz Field Change: %5dmV", (MAX_ADC_HF_VOLTAGE * hf_av_new) >> 10); + Dbprintf("HF 13.56MHz Field Change: %5dmV", hf_av_new); hf_av = hf_av_new; if (hf_av > hf_max) hf_max = hf_av; From b55c186b3a52cbfe542a787243d3e8d3a1bbf49f Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Wed, 10 Jun 2020 01:17:49 +0200 Subject: [PATCH 596/632] make style --- client/pyscripts/theremin.py | 16 +++++++++------- client/src/cmdhf14a.c | 2 +- client/src/cmdhficlass.c | 10 +++++----- client/src/cmdhfmf.c | 4 ++-- client/src/cmdlfviking.c | 10 +++++----- 5 files changed, 22 insertions(+), 20 deletions(-) mode change 100644 => 100755 client/pyscripts/theremin.py diff --git a/client/pyscripts/theremin.py b/client/pyscripts/theremin.py old mode 100644 new mode 100755 index a84ff3adf..2bd1681ac --- a/client/pyscripts/theremin.py +++ b/client/pyscripts/theremin.py @@ -28,9 +28,9 @@ p = pyaudio.PyAudio() # For paFloat32 sample values must be in range [-1.0, 1.0] stream = p.open(format=pyaudio.paFloat32, - channels=1, - rate=sampling_freq, - output=True) + channels=1, + rate=sampling_freq, + output=True) # Initial voltage to frequency values min_v = 100.0 @@ -38,9 +38,9 @@ max_v = 0.0 v = 0 out_freq = min_freq -# Spawn the Proxmark3 client +# Spawn the Proxmark3 client pm3_proc = Popen([pm3_client, pm3_reader_dev_file, "-c", pm3_tune_cmd], - bufsize=0, env={}, stdin=DEVNULL, stdout=PIPE, stderr=DEVNULL) + bufsize=0, env={}, stdin=DEVNULL, stdout=PIPE, stderr=DEVNULL) mv_recbuf = "" # Read voltages from the Proxmark3, generate the sine wave, output to soundcard @@ -66,7 +66,8 @@ while True: max_v = v # Recalculate the audio frequency to generate - out_freq = (max_freq - min_freq) * (max_v - v) / (max_v - min_v) + min_freq + out_freq = (max_freq - min_freq) * (max_v - v) / (max_v - min_v) \ + + min_freq # Generate the samples and write them to the soundcard sinevs = out_freq / sampling_freq * numpy.pi * 2 @@ -75,4 +76,5 @@ while True: sinev = sinev if sinev < numpy.pi * 2 else sinev - numpy.pi * 2 i = (i + 1) % sample_buf_size if not i: - stream.write((numpy.sin(sample_buf) * volume).astype(numpy.float32).tobytes()) + stream.write((numpy.sin(sample_buf) * volume). + astype(numpy.float32).tobytes()) diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index 50d3fd30a..2a8fe5485 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -1354,7 +1354,7 @@ static int detect_nxp_card(uint8_t sak, uint16_t atqa) { type |= MTDESFIRE; } } - + if (type == MTNONE) { PrintAndLogEx(WARNING, " failed to fingerprint"); } diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 82ef2d852..396511efd 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -770,7 +770,7 @@ static int CmdHFiClassELoad(const char *Cmd) { break; } case EML: { - res = loadFileEML_safe(filename, (void**)&dump, &bytes_read); + res = loadFileEML_safe(filename, (void **)&dump, &bytes_read); break; } case JSON: { @@ -1676,7 +1676,7 @@ static int CmdHFiClassCloneTag(const char *Cmd) { uint8_t *dump = NULL; size_t bytes_read = 0; - if (loadFile_safe(filename, "", (void**)&dump, &bytes_read) != PM3_SUCCESS) { + if (loadFile_safe(filename, "", (void **)&dump, &bytes_read) != PM3_SUCCESS) { PrintAndLogEx(FAILED, "File: " _YELLOW_("%s") ": not found or locked.", filename); return PM3_EFILE; } @@ -1702,7 +1702,7 @@ static int CmdHFiClassCloneTag(const char *Cmd) { memcpy(tag_data, dump + startblock * 8, sizeof(iclass_block_t) * (endblock - startblock + 1)); free(dump); - + uint8_t MAC[4] = {0x00, 0x00, 0x00, 0x00}; uint8_t div_key[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; @@ -2040,7 +2040,7 @@ static int CmdHFiClassReadTagFile(const char *Cmd) { uint8_t *dump = NULL; size_t bytes_read = 0; - if (loadFile_safe(filename, "", (void**)&dump, &bytes_read) != PM3_SUCCESS) { + if (loadFile_safe(filename, "", (void **)&dump, &bytes_read) != PM3_SUCCESS) { PrintAndLogEx(FAILED, "File: " _YELLOW_("%s") ": not found or locked.", filename); return PM3_EFILE; } @@ -2190,7 +2190,7 @@ static int loadKeys(char *filename) { uint8_t *dump = NULL; size_t bytes_read = 0; - if (loadFile_safe(filename, "", (void**)&dump, &bytes_read) != PM3_SUCCESS) { + if (loadFile_safe(filename, "", (void **)&dump, &bytes_read) != PM3_SUCCESS) { PrintAndLogEx(FAILED, "File: " _YELLOW_("%s") ": not found or locked.", filename); return PM3_EFILE; } diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index ffc07099b..9cd0b282e 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -4525,8 +4525,8 @@ static int CmdHF14AMfMAD(const char *Cmd) { PrintAndLogEx(ERR, "error, read sector 0. card don't have MAD or don't have MAD on default keys"); return PM3_ESOFT; } - - + + PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "--- " _CYAN_("MAD Information") " -------------------------------"); PrintAndLogEx(INFO, "---------------------------------------------------"); diff --git a/client/src/cmdlfviking.c b/client/src/cmdlfviking.c index 5dd29a95f..dccdb16c5 100644 --- a/client/src/cmdlfviking.c +++ b/client/src/cmdlfviking.c @@ -1,5 +1,5 @@ //----------------------------------------------------------------------------- -// Marshmellow, +// Marshmellow, // // This code is licensed to you under the terms of the GNU GPL, version 2 or, // at your option, any later version. See the LICENSE.txt file for the text of @@ -53,18 +53,18 @@ static int usage_lf_viking_sim(void) { } static int CmdVikingDemod(const char *Cmd) { - return demodViking(); + return demodViking(); } //see ASKDemod for what args are accepted int demodViking(void) { - + if (ASKDemod("", false, false, 1) != PM3_SUCCESS) { PrintAndLogEx(DEBUG, "DEBUG: Error - Viking ASKDemod failed"); return PM3_ESOFT; } - - size_t size = DemodBufferLen; + + size_t size = DemodBufferLen; int ans = detectViking(DemodBuffer, &size); if (ans < 0) { PrintAndLogEx(DEBUG, "DEBUG: Error - Viking Demod %d %s", ans, (ans == -5) ? _RED_("[chksum error]") : ""); From 2a29a1431de7ec622918d31091e7d1885d73af01 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Wed, 10 Jun 2020 01:18:26 +0200 Subject: [PATCH 597/632] theremin.py: quit when pm3 button is pressed --- client/pyscripts/theremin.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/pyscripts/theremin.py b/client/pyscripts/theremin.py index 2bd1681ac..a286d6193 100755 --- a/client/pyscripts/theremin.py +++ b/client/pyscripts/theremin.py @@ -53,6 +53,8 @@ while True: if(select([pm3_proc.stdout], [], [], 0)[0]): b = pm3_proc.stdout.read(256).decode("ascii") + if "Done" in b: + break; for c in b: if c in "0123456789 mV": mv_recbuf += c From d189ac7b451d653891bd0546c7adf5bcf8009033 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Wed, 10 Jun 2020 01:31:37 +0200 Subject: [PATCH 598/632] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 77e501555..d0cdd77d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Change Better precision for HF and LF voltage measurements and Add theremin.py script (@rosco) - Added Mifare MAD Info Byte decoding. Easier to identify Card Publisher (@lukaskuzmiak) - Change use system Bzip2 library instead of Zlib for hardnested tables, tables are now 7x smaller (@doegox) - Change pushed some ARM source to compile with THUMB. Saves a lot of space of ARM flash memory (@slurdge) From 8d1027e0c90cb90eda1c31c4fafd121490824b28 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Wed, 10 Jun 2020 02:15:16 +0200 Subject: [PATCH 599/632] typo --- client/resources/mad.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/resources/mad.json b/client/resources/mad.json index 7911599f2..535407ab4 100644 --- a/client/resources/mad.json +++ b/client/resources/mad.json @@ -13360,7 +13360,7 @@ "company": "NXP Semiconductors", "mad": "0xE103", "service_provider": "Philips SC", - "system_integrator": "Philps SC" + "system_integrator": "Philips SC" }, { "application": "Global purse", From 9d71f66d1617c5d7082b61d32b174b02e2b3df7b Mon Sep 17 00:00:00 2001 From: Lukas Kuzmiak <lukash@backstep.net> Date: Tue, 9 Jun 2020 18:34:59 -0700 Subject: [PATCH 600/632] Mifare MAD Card Holder Information --- CHANGELOG.md | 1 + client/src/cmdhfmf.c | 65 +++++++++++++++++++++++++++++++---------- client/src/mifare/mad.c | 35 +++++++++++++++++----- client/src/mifare/mad.h | 2 +- 4 files changed, 79 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0cdd77d7..4c4ec4c2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added Mifare MAD Card Holder Information decoding (@lukaskuzmiak) - Change Better precision for HF and LF voltage measurements and Add theremin.py script (@rosco) - Added Mifare MAD Info Byte decoding. Easier to identify Card Publisher (@lukaskuzmiak) - Change use system Bzip2 library instead of Zlib for hardnested tables, tables are now 7x smaller (@doegox) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 9cd0b282e..ae0c26a76 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -4500,6 +4500,7 @@ static int CmdHF14AMfMAD(const char *Cmd) { arg_str0("kK", "key", "key for printing sectors", NULL), arg_lit0("bB", "keyb", "use key B for access printing sectors (by default: key A)"), arg_lit0("", "be", "(optional, BigEndian)"), + arg_lit0("", "dch", "decode Card Holder information"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -4512,11 +4513,12 @@ static int CmdHF14AMfMAD(const char *Cmd) { CLIGetHexWithReturn(ctx, 3, key, &keylen); bool keyB = arg_get_lit(4); bool swapmad = arg_get_lit(5); + bool decodeholder = arg_get_lit(6); CLIParserFree(ctx); - if (aidlen != 2 && keylen > 0) { - PrintAndLogEx(WARNING, "do not need a key without aid"); + if (aidlen != 2 && !decodeholder && keylen > 0) { + PrintAndLogEx(WARNING, "do not need a key without aid/decode card holder"); } uint8_t sector0[16 * 4] = {0}; @@ -4549,10 +4551,7 @@ static int CmdHF14AMfMAD(const char *Cmd) { MAD2DecodeAndPrint(sector10, swapmad, verbose); } - if (aidlen == 2) { - uint16_t aaid = (aid[0] << 8) + aid[1]; - PrintAndLogEx(INFO, "-------------- " _CYAN_("AID 0x%04x") " ---------------", aaid); - + if (aidlen == 2 || decodeholder) { uint16_t mad[7 + 8 + 8 + 8 + 8] = {0}; size_t madlen = 0; if (MADDecode(sector0, sector10, mad, &madlen, swapmad)) { @@ -4566,19 +4565,53 @@ static int CmdHF14AMfMAD(const char *Cmd) { memcpy(akey, key, 6); } - for (int i = 0; i < madlen; i++) { - if (aaid == mad[i]) { - uint8_t vsector[16 * 4] = {0}; - if (mfReadSector(i + 1, keyB ? MF_KEY_B : MF_KEY_A, akey, vsector)) { - PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(ERR, "error, read sector %d", i + 1); - return PM3_ESOFT; - } + if (aidlen == 2) { + uint16_t aaid = (aid[0] << 8) + aid[1]; + PrintAndLogEx(INFO, "-------------- " _CYAN_("AID 0x%04x") " ---------------", aaid); - for (int j = 0; j < (verbose ? 4 : 3); j ++) - PrintAndLogEx(NORMAL, " [%03d] %s", (i + 1) * 4 + j, sprint_hex(&vsector[j * 16], 16)); + for (int i = 0; i < madlen; i++) { + if (aaid == mad[i]) { + uint8_t vsector[16 * 4] = {0}; + if (mfReadSector(i + 1, keyB ? MF_KEY_B : MF_KEY_A, akey, vsector)) { + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(ERR, "error, read sector %d", i + 1); + return PM3_ESOFT; + } + + for (int j = 0; j < (verbose ? 4 : 3); j ++) + PrintAndLogEx(NORMAL, " [%03d] %s", (i + 1) * 4 + j, sprint_hex(&vsector[j * 16], 16)); + } } } + + if (decodeholder) { + uint16_t aaid = 0x0004; + PrintAndLogEx(INFO, "-------- " _CYAN_("Card Holder Info 0x%04x") " --------", aaid); + + uint8_t data[4096] = {0}; + int datalen = 0; + + for (int i = 0; i < madlen; i++) { + if (aaid == mad[i]) { + uint8_t vsector[16 * 4] = {0}; + if (mfReadSector(i + 1, keyB ? MF_KEY_B : MF_KEY_A, akey, vsector)) { + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(ERR, "error, read sector %d", i + 1); + return PM3_ESOFT; + } + + memcpy(&data[datalen], vsector, 16 * 3); + datalen += 16 * 3; + } + } + + if (!datalen) { + PrintAndLogEx(WARNING, "no Card Holder Info data"); + return PM3_SUCCESS; + } + + MADCardHolderInfoDecode(data, datalen, verbose); + } } return PM3_SUCCESS; diff --git a/client/src/mifare/mad.c b/client/src/mifare/mad.c index c4569b274..dad6d6ea6 100644 --- a/client/src/mifare/mad.c +++ b/client/src/mifare/mad.c @@ -232,15 +232,27 @@ int MADDecode(uint8_t *sector0, uint8_t *sector10, uint16_t *mad, size_t *madlen return PM3_SUCCESS; } -static const char *aid_admin[] = { - "free", - "defect", - "reserved", - "additional directory info", - "card holder info", - "not applicable" +static const char *holder_info_type[] = { + "Surname", + "Given name", + "Sex", + "Other" }; +int MADCardHolderInfoDecode(uint8_t *data, size_t dataLen, bool verbose) { + size_t idx = 0; + while (idx < dataLen) { + uint8_t len = data[idx] & 0x3f; + uint8_t type = data[idx] >> 6; + idx++; + if (len > 0) { + PrintAndLogEx(INFO, "%s: %.*s", holder_info_type[type], len, &data[idx]); + idx += len; + } else break; + } + return PM3_SUCCESS; +} + static int MADInfoByteDecode(uint8_t *sector, bool swapmad, int MADver, bool verbose) { uint8_t InfoByte; if (MADver == 1) { @@ -269,6 +281,15 @@ static int MADInfoByteDecode(uint8_t *sector, bool swapmad, int MADver, bool ver } } +static const char *aid_admin[] = { + "free", + "defect", + "reserved", + "additional directory info", + "card holder info", + "not applicable" +}; + int MAD1DecodeAndPrint(uint8_t *sector, bool swapmad, bool verbose, bool *haveMAD2) { open_mad_file(&mad_known_aids, verbose); diff --git a/client/src/mifare/mad.h b/client/src/mifare/mad.h index e5f23ea0f..bb1b3800c 100644 --- a/client/src/mifare/mad.h +++ b/client/src/mifare/mad.h @@ -17,6 +17,6 @@ int MADCheck(uint8_t *sector0, uint8_t *sector10, bool verbose, bool *haveMAD2); int MADDecode(uint8_t *sector0, uint8_t *sector10, uint16_t *mad, size_t *madlen, bool swapmad); int MAD1DecodeAndPrint(uint8_t *sector, bool swapmad, bool verbose, bool *haveMAD2); int MAD2DecodeAndPrint(uint8_t *sector, bool swapmad, bool verbose); - +int MADCardHolderInfoDecode(uint8_t *data, size_t dataLen, bool verbose); #endif // _MAD_H_ From cb2200463589f9bc888d57ffd581da605c343d9c Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 10 Jun 2020 08:43:29 +0200 Subject: [PATCH 601/632] chg "hf mf cwipe" - textual and also use magic wipe card --- client/src/mifare/mifarehost.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/client/src/mifare/mifarehost.c b/client/src/mifare/mifarehost.c index cf8a414c9..8e15cb509 100644 --- a/client/src/mifare/mifarehost.c +++ b/client/src/mifare/mifarehost.c @@ -883,8 +883,11 @@ int mfCWipe(uint8_t *uid, uint8_t *atqa, uint8_t *sak) { int res; for (int blockNo = 0; blockNo < 4 * 16; blockNo++) { for (int retry = 0; retry < 3; retry++) { + + PrintAndLogEx(INPLACE, "wipe block %d", blockNo); + if (blockNo == 0) { - res = mfCSetBlock(blockNo, block0, NULL, params); + res = mfCSetBlock(blockNo, block0, NULL, (params | MAGIC_WIPE)); } else { if (mfIsSectorTrailer(blockNo)) res = mfCSetBlock(blockNo, blockK, NULL, params); @@ -894,16 +897,17 @@ int mfCWipe(uint8_t *uid, uint8_t *atqa, uint8_t *sak) { if (res == PM3_SUCCESS) break; - PrintAndLogEx(WARNING, "Retry block[%d]...", blockNo); + + PrintAndLogEx(WARNING, "retry block %d ...", blockNo); } if (res) { - PrintAndLogEx(ERR, "Error setting block[%d]: %d", blockNo, res); + PrintAndLogEx(ERR, "error setting block %d (%d)", blockNo, res); return res; } } DropField(); - + PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } From cd9b26af17c222e15f19575e8cabe8ef17997961 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 10 Jun 2020 08:44:13 +0200 Subject: [PATCH 602/632] helptext --- client/src/cmdhfmf.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index ae0c26a76..135872627 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -4490,8 +4490,10 @@ static int CmdHF14AMfMAD(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf mf mad", "Checks and prints Mifare Application Directory (MAD)", - "Usage:\n\thf mf mad -> shows MAD if exists\n" - "\thf mf mad -a 03e1 -k ffffffffffff -b -> shows NDEF data if exists. read card with custom key and key B\n"); + "Usage:\n" + "\thf mf mad -> shows MAD if exists\n" + "\thf mf mad -a 03e1 -k ffffffffffff -b -> shows NDEF data if exists. read card with custom key and key B\n" + "\thf mf mad -a 0004 -k ffffffffffff --dch -> decode CardHolder information\n"); void *argtable[] = { arg_param_begin, @@ -4518,7 +4520,7 @@ static int CmdHF14AMfMAD(const char *Cmd) { CLIParserFree(ctx); if (aidlen != 2 && !decodeholder && keylen > 0) { - PrintAndLogEx(WARNING, "do not need a key without aid/decode card holder"); + PrintAndLogEx(WARNING, "Using default MAD keys instead"); } uint8_t sector0[16 * 4] = {0}; From 9d1cbaddf914cb60a8e7565884c122985ac91433 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 10 Jun 2020 08:56:45 +0200 Subject: [PATCH 603/632] text --- armsrc/lfsampling.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/armsrc/lfsampling.c b/armsrc/lfsampling.c index 6365a0967..db73ce385 100644 --- a/armsrc/lfsampling.c +++ b/armsrc/lfsampling.c @@ -32,7 +32,7 @@ static sample_config config = { 1, 8, 1, LF_DIVISOR_125, 0, 0, 1} ; void printConfig(void) { uint32_t d = config.divisor; DbpString(_BLUE_("LF Sampling config")); - Dbprintf(" [q] divisor.............%d ( "_GREEN_("%d.%02d kHz")")", d, 12000 / (d + 1), ((1200000 + (d + 1) / 2) / (d + 1)) - ((12000 / (d + 1)) * 100)); + Dbprintf(" [q] divisor.............%d ( "_GREEN_("%d.%02d kHz")" )", d, 12000 / (d + 1), ((1200000 + (d + 1) / 2) / (d + 1)) - ((12000 / (d + 1)) * 100)); Dbprintf(" [b] bits per sample.....%d", config.bits_per_sample); Dbprintf(" [d] decimation..........%d", config.decimation); Dbprintf(" [a] averaging...........%s", (config.averaging) ? "Yes" : "No"); From ea73746d323e0d57a1f4291f45ea2acf51e9cdf2 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 10 Jun 2020 09:02:58 +0200 Subject: [PATCH 604/632] text --- armsrc/Standalone/hf_msdsal.c | 42 +++++++++++++++++------------------ 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/armsrc/Standalone/hf_msdsal.c b/armsrc/Standalone/hf_msdsal.c index e9f700a01..f97dc0d7c 100644 --- a/armsrc/Standalone/hf_msdsal.c +++ b/armsrc/Standalone/hf_msdsal.c @@ -119,7 +119,7 @@ static uint8_t treatPDOL(uint8_t *apdu) { //Generate GET PROCES void RunMod(void) { StandAloneMode(); - Dbprintf(_YELLOW_(">>") "Reading Visa cards & Emulating a Visa MSD Transaction a.k.a. MSDSal Started<<"); + DbpString(_YELLOW_(">>") "Reading Visa cards & Emulating a Visa MSD Transaction a.k.a. MSDSal Started " _YELLOW_("<<")); FpgaDownloadAndGo(FPGA_BITSTREAM_HF); //For reading process @@ -206,10 +206,10 @@ void RunMod(void) { //Checking if the user wants to go directly to emulation mode using a hardcoded track 2 if (chktoken == true && token[0] != 0x00) { state = STATE_EMU; - Dbprintf(_YELLOW_("[") "Initialized emulation mode " _YELLOW_("]")); + DbpString(_YELLOW_("[ ") "Initialized emulation mode" _YELLOW_(" ]")); DbpString("\n"_YELLOW_("!!") "Waiting for a card reader..."); } else { - DbpString(_YELLOW_("[") "Initialized reading mode " _YELLOW_("]")); + DbpString(_YELLOW_("[ ") "Initialized reading mode" _YELLOW_(" ]")); DbpString("\n"_YELLOW_("!!") "Waiting for a Visa card..."); } @@ -228,12 +228,12 @@ void RunMod(void) { if (state == STATE_READ) { if (chktoken == true && token[0] != 0x00) { //Only change to emulation if it saved a track 2 in memory state = STATE_EMU; - Dbprintf(_YELLOW_("[") "In emulation mode " _YELLOW_("]")); + DbpString(_YELLOW_("[ ") "In emulation mode" _YELLOW_(" ]")); } else - Dbprintf(_YELLOW_("!!") "Nothing in memory to emulate"); + DbpString(_YELLOW_("!!") "Nothing in memory to emulate"); } else { state = STATE_READ; - Dbprintf(_YELLOW_("[") "In reading mode " _YELLOW_("]")); + DbpString(_YELLOW_("[ ") "In reading mode" _YELLOW_(" ]")); } } @@ -248,7 +248,7 @@ void RunMod(void) { if (iso14443a_select_card(NULL, &card_a_info, NULL, true, 0, false)) { - Dbprintf(_YELLOW_("+") "Found ISO 14443 Type A!"); + DbpString(_YELLOW_("+") "Found ISO 14443 Type A!"); for (uint8_t i = 0; i < 4; i++) { chktoken = false; @@ -257,11 +257,11 @@ void RunMod(void) { uint8_t apdulen = iso14_apdu(apdus[i], (uint16_t) apdusLen[i], false, apdubuffer, NULL); if (apdulen > 0) { - Dbprintf(_YELLOW_("[") "Proxmark command " _YELLOW_("]")); + DbpString(_YELLOW_("[ ") "Proxmark command" _YELLOW_(" ]")); Dbhexdump(apdusLen[i], apdus[i], false); - Dbprintf(_GREEN_("[") "Card answer " _GREEN_("]")); + DbpString(_GREEN_("[ ") "Card answer" _GREEN_(" ]")); Dbhexdump(apdulen - 2, apdubuffer, false); - Dbprintf("----"); + DbpString("----"); for (uint8_t u = 0; u < apdulen; u++) { if (i == 1) { @@ -284,24 +284,24 @@ void RunMod(void) { } if (i == 1) { - Dbprintf(_GREEN_("[") "Challenge generated " _GREEN_("]")); + DbpString(_GREEN_("[ ") "Challenge generated" _GREEN_(" ]")); Dbhexdump(plen, existpdol ? ppdol : processing, false); } } else { - Dbprintf(_YELLOW_("!!") "Error reading the card"); + DbpString(_YELLOW_("!!") "Error reading the card"); } LED_B_OFF(); } if (chktoken) { - Dbprintf(_RED_("[") "Track 2 " _RED_("]")); + DbpString(_RED_("[ ") "Track 2" _RED_(" ]")); Dbhexdump(19, (uint8_t *)token, false); - Dbprintf(_YELLOW_("!!") "Card number"); + DbpString(_YELLOW_("!!") "Card number"); Dbhexdump(8, (uint8_t *)token, false); DbpString("---"); LED_C_ON(); state = STATE_EMU; - Dbprintf(_YELLOW_("[") "Initialized emulation mode " _YELLOW_("]")); + DbpString(_YELLOW_("[ ") "Initialized emulation mode" _YELLOW_(" ]")); DbpString("\n"_YELLOW_("!!") "Waiting for a card reader..."); } } @@ -318,7 +318,7 @@ void RunMod(void) { DbpString(_YELLOW_("!!") "Error initializing the emulation process!"); SpinDelay(500); state = STATE_READ; - DbpString(_YELLOW_("[") "Initialized reading mode " _YELLOW_("]")); + DbpString(_YELLOW_("[ ") "Initialized reading mode" _YELLOW_(" ]")); DbpString("\n" _YELLOW_("!!") "Waiting for a Visa card..."); break; } @@ -336,7 +336,7 @@ void RunMod(void) { LED_B_OFF(); // Clean receive command buffer if (!GetIso14443aCommandFromReader(receivedCmd, receivedCmdPar, &len)) { - Dbprintf(_YELLOW_("!!") "Emulator stopped"); + DbpString(_YELLOW_("!!") "Emulator stopped"); retval = PM3_EOPABORTED; break; } @@ -367,7 +367,7 @@ void RunMod(void) { DbpString(_YELLOW_("+") "Request for RATS"); p_response = &responses[RATS]; } else { - Dbprintf(_YELLOW_("[") "Card reader command " _YELLOW_("]")); + DbpString(_YELLOW_("[ ") "Card reader command" _YELLOW_(" ]")); Dbhexdump(len, receivedCmd, false); if (receivedCmd[0] == 0x02 || receivedCmd[0] == 0x03) { //Emulate a Visa MSD(Magnetic stripe data) card @@ -408,7 +408,7 @@ void RunMod(void) { } } } else { - Dbprintf(_YELLOW_("!!") "Received unknown command!"); + DbpString(_YELLOW_("!!") "Received unknown command!"); if (prevCmd < 4) { memcpy(dynamic_response_info.response, receivedCmd, len); dynamic_response_info.response_n = len; @@ -418,9 +418,9 @@ void RunMod(void) { } } if (dynamic_response_info.response_n > 0) { - Dbprintf(_GREEN_("[") "Proxmark3 answer " _GREEN_("]")); + DbpString(_GREEN_("[ ") "Proxmark3 answer" _GREEN_(" ]")); Dbhexdump(dynamic_response_info.response_n, dynamic_response_info.response, false); - Dbprintf("----"); + DbpString("----"); // Add CRC bytes, always used in ISO 14443A-4 compliant cards AddCrc14A(dynamic_response_info.response, dynamic_response_info.response_n); From 569107579eafcdd181260880c7ea051bfe5c9322 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Wed, 10 Jun 2020 11:33:15 +0200 Subject: [PATCH 605/632] Fix cliparser buffer allocation --- client/deps/cliparser/cliparser.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/client/deps/cliparser/cliparser.c b/client/deps/cliparser/cliparser.c index f0ba57d40..3eaec2b55 100644 --- a/client/deps/cliparser/cliparser.c +++ b/client/deps/cliparser/cliparser.c @@ -11,6 +11,9 @@ #include "cliparser.h" #include <string.h> #include <stdlib.h> +#ifndef ARRAYLEN +# define ARRAYLEN(x) (sizeof(x)/sizeof((x)[0])) +#endif int CLIParserInit(CLIParserContext **ctx, const char *vprogramName, const char *vprogramHint, const char *vprogramHelp) { *ctx = malloc(sizeof(CLIParserContext)); @@ -88,15 +91,14 @@ int CLIParserParseStringEx(CLIParserContext *ctx, const char *str, void *vargtab char *argv[200] = {NULL}; int len = strlen(str); - char buf[500] = {0}; - memset(ctx->buf, 0x00, 500); - char *bufptr = buf; + memset(ctx->buf, 0x00, ARRAYLEN(ctx->buf)); + char *bufptr = ctx->buf; char *spaceptr = NULL; enum ParserState state = PS_FIRST; argv[argc++] = bufptr; // param0 = program name - memcpy(buf, ctx->programName, strlen(ctx->programName) + 1); // with 0x00 + memcpy(ctx->buf, ctx->programName, strlen(ctx->programName) + 1); // with 0x00 bufptr += strlen(ctx->programName) + 1; if (len) argv[argc++] = bufptr; From cb614f3f1133e86b32c632de8c272bfc1efef9ff Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Wed, 10 Jun 2020 11:34:33 +0200 Subject: [PATCH 606/632] cliparser: generalize ctx usage --- client/deps/cliparser/cliparser.h | 18 ++-- client/src/cmdhf14a.c | 26 +++--- client/src/cmdhffido.c | 42 ++++----- client/src/cmdhfmf.c | 20 ++-- client/src/cmdhfmfdes.c | 34 +++---- client/src/cmdhfmfp.c | 64 ++++++------- client/src/cmdhfmfu.c | 2 +- client/src/cmdlfindala.c | 10 +- client/src/emv/cmdemv.c | 146 +++++++++++++++--------------- 9 files changed, 181 insertions(+), 181 deletions(-) diff --git a/client/deps/cliparser/cliparser.h b/client/deps/cliparser/cliparser.h index 990e6d8d6..f51d338df 100644 --- a/client/deps/cliparser/cliparser.h +++ b/client/deps/cliparser/cliparser.h @@ -18,21 +18,21 @@ #define arg_param_end arg_end(20) #define arg_getsize(a) (sizeof(a) / sizeof(a[0])) -#define arg_get_lit(n) (((struct arg_lit*)argtable[n])->count) -#define arg_get_int_count(n)(((struct arg_int*)argtable[n])->count) -#define arg_get_int(n) (((struct arg_int*)argtable[n])->ival[0]) -#define arg_get_int_def(n, def)(arg_get_int_count(n) ? (arg_get_int(n)) : (def)) -#define arg_get_str(n) ((struct arg_str*)argtable[n]) -#define arg_get_str_len(n) (strlen(((struct arg_str*)argtable[n])->sval[0])) +#define arg_get_lit(ctx, n) (((struct arg_lit*)((ctx)->argtable)[n])->count) +#define arg_get_int_count(ctx, n)(((struct arg_int*)((ctx)->argtable)[n])->count) +#define arg_get_int(ctx, n) (((struct arg_int*)((ctx)->argtable)[n])->ival[0]) +#define arg_get_int_def(ctx, n, def)(arg_get_int_count((ctx), n) ? (arg_get_int((ctx), n)) : (def)) +#define arg_get_str(ctx, n) ((struct arg_str*)((ctx)->argtable)[n]) +#define arg_get_str_len(ctx, n) (strlen(((struct arg_str*)((ctx)->argtable)[n])->sval[0])) #define arg_strx1(shortopts, longopts, datatype, glossary) (arg_strn((shortopts), (longopts), (datatype), 1, 250, (glossary))) #define arg_strx0(shortopts, longopts, datatype, glossary) (arg_strn((shortopts), (longopts), (datatype), 0, 250, (glossary))) #define CLIParserFree(ctx) if ((ctx)) {arg_freetable(ctx->argtable, ctx->argtableLen); free((ctx)); (ctx)=NULL;} #define CLIExecWithReturn(ctx, cmd, atbl, ifempty) if (CLIParserParseString(ctx, cmd, atbl, arg_getsize(atbl), ifempty)) {CLIParserFree((ctx)); return PM3_ESOFT;} -#define CLIGetHexBLessWithReturn(ctx, paramnum, data, datalen, delta) if (CLIParamHexToBuf(arg_get_str(paramnum), data, sizeof(data) - (delta), datalen)) {CLIParserFree((ctx)); return PM3_ESOFT;} -#define CLIGetHexWithReturn(ctx, paramnum, data, datalen) if (CLIParamHexToBuf(arg_get_str(paramnum), data, sizeof(data), datalen)) {CLIParserFree((ctx)); return PM3_ESOFT;} -#define CLIGetStrWithReturn(ctx, paramnum, data, datalen) if (CLIParamStrToBuf(arg_get_str(paramnum), data, sizeof(data), datalen)) {CLIParserFree((ctx)); return PM3_ESOFT;} +#define CLIGetHexBLessWithReturn(ctx, paramnum, data, datalen, delta) if (CLIParamHexToBuf(arg_get_str(ctx, paramnum), data, sizeof(data) - (delta), datalen)) {CLIParserFree((ctx)); return PM3_ESOFT;} +#define CLIGetHexWithReturn(ctx, paramnum, data, datalen) if (CLIParamHexToBuf(arg_get_str(ctx, paramnum), data, sizeof(data), datalen)) {CLIParserFree((ctx)); return PM3_ESOFT;} +#define CLIGetStrWithReturn(ctx, paramnum, data, datalen) if (CLIParamStrToBuf(arg_get_str(ctx, paramnum), data, sizeof(data), datalen)) {CLIParserFree((ctx)); return PM3_ESOFT;} typedef struct { void **argtable; diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index 2a8fe5485..b41dabb7f 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -378,9 +378,9 @@ static int CmdHF14AInfo(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, true); - verbose = arg_get_lit(1); - do_nack_test = arg_get_lit(2); - do_aid_search = arg_get_lit(3); + verbose = arg_get_lit(ctx, 1); + do_nack_test = arg_get_lit(ctx, 2); + do_aid_search = arg_get_lit(ctx, 3); CLIParserFree(ctx); @@ -903,10 +903,10 @@ static int CmdHF14AAPDU(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, false); - activateField = arg_get_lit(1); - leaveSignalON = arg_get_lit(2); - decodeTLV = arg_get_lit(3); - decodeAPDU = arg_get_lit(4); + activateField = arg_get_lit(ctx, 1); + leaveSignalON = arg_get_lit(ctx, 2); + decodeTLV = arg_get_lit(ctx, 3); + decodeAPDU = arg_get_lit(ctx, 4); CLIGetHexWithReturn(ctx, 5, header, &headerlen); makeAPDU = headerlen > 0; @@ -915,8 +915,8 @@ static int CmdHF14AAPDU(const char *Cmd) { CLIParserFree(ctx); return 1; } - extendedAPDU = arg_get_lit(6); - le = arg_get_int_def(7, 0); + extendedAPDU = arg_get_lit(ctx, 6); + le = arg_get_int_def(ctx, 7, 0); if (makeAPDU) { uint8_t apdudata[PM3_CMD_DATA_SIZE] = {0}; @@ -1186,9 +1186,9 @@ static int CmdHF14AAntiFuzz(const char *Cmd) { CLIExecWithReturn(ctx, Cmd, argtable, false); uint8_t arg0 = FLAG_4B_UID_IN_DATA; - if (arg_get_lit(2)) + if (arg_get_lit(ctx, 2)) arg0 = FLAG_7B_UID_IN_DATA; - if (arg_get_lit(3)) + if (arg_get_lit(ctx, 3)) arg0 = FLAG_10B_UID_IN_DATA; CLIParserFree(ctx); @@ -1213,8 +1213,8 @@ static int CmdHF14AChaining(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, true); - struct arg_str *str = arg_get_str(1); - int len = arg_get_str_len(1); + struct arg_str *str = arg_get_str(ctx, 1); + int len = arg_get_str_len(ctx, 1); if (len && (!strcmp(str->sval[0], "enable") || !strcmp(str->sval[0], "1"))) APDUInFramingEnable = true; diff --git a/client/src/cmdhffido.c b/client/src/cmdhffido.c index 1458c1f14..50c1495c8 100644 --- a/client/src/cmdhffido.c +++ b/client/src/cmdhffido.c @@ -117,7 +117,7 @@ static json_t *OpenJson(CLIParserContext *ctx, int paramnum, char *fname, void * int jsonnamelen = 0; // CLIGetStrWithReturn(ctx, paramnum, jsonname, &jsonnamelen); - if (CLIParamStrToBuf(arg_get_str(paramnum), jsonname, sizeof(jsonname), &jsonnamelen)) { + if (CLIParamStrToBuf(arg_get_str(ctx, paramnum), jsonname, sizeof(jsonname), &jsonnamelen)) { return NULL; } @@ -177,11 +177,11 @@ static int CmdHFFidoRegister(const char *cmd) { }; CLIExecWithReturn(ctx, cmd, argtable, true); - bool APDULogging = arg_get_lit(1); - bool verbose = arg_get_lit(2); - bool verbose2 = arg_get_lit(2) > 1; - bool paramsPlain = arg_get_lit(3); - bool showDERTLV = arg_get_lit(4); + bool APDULogging = arg_get_lit(ctx, 1); + bool verbose = arg_get_lit(ctx, 2); + bool verbose2 = arg_get_lit(ctx, 2) > 1; + bool paramsPlain = arg_get_lit(ctx, 3); + bool showDERTLV = arg_get_lit(ctx, 4); char fname[FILE_PATH_SIZE] = {0}; bool err; @@ -418,13 +418,13 @@ static int CmdHFFidoAuthenticate(const char *cmd) { }; CLIExecWithReturn(ctx, cmd, argtable, true); - bool APDULogging = arg_get_lit(1); - bool verbose = arg_get_lit(2); - bool paramsPlain = arg_get_lit(3); + bool APDULogging = arg_get_lit(ctx, 1); + bool verbose = arg_get_lit(ctx, 2); + bool paramsPlain = arg_get_lit(ctx, 3); uint8_t controlByte = 0x08; - if (arg_get_lit(5)) + if (arg_get_lit(ctx, 5)) controlByte = 0x03; - if (arg_get_lit(6)) + if (arg_get_lit(ctx, 6)) controlByte = 0x07; char fname[250] = {0}; @@ -673,11 +673,11 @@ static int CmdHFFido2MakeCredential(const char *cmd) { }; CLIExecWithReturn(ctx, cmd, argtable, true); - bool APDULogging = arg_get_lit(1); - bool verbose = arg_get_lit(2); - bool verbose2 = arg_get_lit(2) > 1; - bool showDERTLV = arg_get_lit(3); - bool showCBOR = arg_get_lit(4); + bool APDULogging = arg_get_lit(ctx, 1); + bool verbose = arg_get_lit(ctx, 2); + bool verbose2 = arg_get_lit(ctx, 2) > 1; + bool showDERTLV = arg_get_lit(ctx, 3); + bool showCBOR = arg_get_lit(ctx, 4); uint8_t jsonname[FILE_PATH_SIZE] = {0}; char *cjsonname = (char *)jsonname; @@ -798,11 +798,11 @@ static int CmdHFFido2GetAssertion(const char *cmd) { }; CLIExecWithReturn(ctx, cmd, argtable, true); - bool APDULogging = arg_get_lit(1); - bool verbose = arg_get_lit(2); - bool verbose2 = arg_get_lit(2) > 1; - bool showCBOR = arg_get_lit(3); - bool createAllowList = arg_get_lit(4); + bool APDULogging = arg_get_lit(ctx, 1); + bool verbose = arg_get_lit(ctx, 2); + bool verbose2 = arg_get_lit(ctx, 2) > 1; + bool showCBOR = arg_get_lit(ctx, 3); + bool createAllowList = arg_get_lit(ctx, 4); uint8_t jsonname[FILE_PATH_SIZE] = {0}; char *cjsonname = (char *)jsonname; diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 135872627..cdbe29e96 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -4506,16 +4506,16 @@ static int CmdHF14AMfMAD(const char *Cmd) { arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); - bool verbose = arg_get_lit(1); + bool verbose = arg_get_lit(ctx, 1); uint8_t aid[2] = {0}; int aidlen; CLIGetHexWithReturn(ctx, 2, aid, &aidlen); uint8_t key[6] = {0}; int keylen; CLIGetHexWithReturn(ctx, 3, key, &keylen); - bool keyB = arg_get_lit(4); - bool swapmad = arg_get_lit(5); - bool decodeholder = arg_get_lit(6); + bool keyB = arg_get_lit(ctx, 4); + bool swapmad = arg_get_lit(ctx, 5); + bool decodeholder = arg_get_lit(ctx, 6); CLIParserFree(ctx); @@ -4637,15 +4637,15 @@ static int CmdHFMFNDEF(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, true); - bool verbose = arg_get_lit(1); - bool verbose2 = arg_get_lit(1) > 1; + bool verbose = arg_get_lit(ctx, 1); + bool verbose2 = arg_get_lit(ctx, 1) > 1; uint8_t aid[2] = {0}; int aidlen; CLIGetHexWithReturn(ctx, 2, aid, &aidlen); uint8_t key[6] = {0}; int keylen; CLIGetHexWithReturn(ctx, 3, key, &keylen); - bool keyB = arg_get_lit(4); + bool keyB = arg_get_lit(ctx, 4); CLIParserFree(ctx); @@ -4746,7 +4746,7 @@ static int CmdHFMFPersonalize(const char *cmd) { char keytypestr[2] = "a"; uint8_t keytype = 0x00; int keytypestr_len; - int res = CLIParamStrToBuf(arg_get_str(1), (uint8_t *)keytypestr, 1, &keytypestr_len); + int res = CLIParamStrToBuf(arg_get_str(ctx, 1), (uint8_t *)keytypestr, 1, &keytypestr_len); str_lower(keytypestr); if (res || (keytypestr[0] != 'a' && keytypestr[0] != 'b')) { @@ -4760,7 +4760,7 @@ static int CmdHFMFPersonalize(const char *cmd) { uint8_t key[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; int key_len; - res = CLIParamHexToBuf(arg_get_str(2), key, 6, &key_len); + res = CLIParamHexToBuf(arg_get_str(ctx, 2), key, 6, &key_len); if (res || (!res && key_len > 0 && key_len != 6)) { PrintAndLogEx(ERR, "ERROR: not a valid key. Key must be 12 hex digits"); CLIParserFree(ctx); @@ -4770,7 +4770,7 @@ static int CmdHFMFPersonalize(const char *cmd) { char pers_optionstr[6]; int opt_len; uint8_t pers_option; - res = CLIParamStrToBuf(arg_get_str(3), (uint8_t *)pers_optionstr, 5, &opt_len); + res = CLIParamStrToBuf(arg_get_str(ctx, 3), (uint8_t *)pers_optionstr, 5, &opt_len); str_lower(pers_optionstr); if (res || (!res && opt_len > 0 && opt_len != 5) diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index 0f383fd0a..d1c38373a 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -2100,7 +2100,7 @@ static int CmdHF14ADesCreateFile(const char *Cmd) { uint8_t fid[2] = {0}; CLIGetHexWithReturn(ctx, 3, fid, &fidlength); - uint8_t comset = arg_get_int(4); + uint8_t comset = arg_get_int(ctx, 4); int arlength = 0; uint8_t ar[2] = {0}; CLIGetHexWithReturn(ctx, 5, ar, &arlength); @@ -2109,7 +2109,7 @@ static int CmdHF14ADesCreateFile(const char *Cmd) { uint8_t filesize[3] = {0}; CLIGetHexWithReturn(ctx, 6, filesize, &fsizelen); - bool isbackup = arg_get_lit(7); + bool isbackup = arg_get_lit(ctx, 7); CLIParserFree(ctx); swap24(aid); @@ -2281,7 +2281,7 @@ static int CmdHF14ADesReadData(const char *Cmd) { uint8_t filesize[3] = {0}; CLIGetHexWithReturn(ctx, 4, filesize, &flength); - int type = arg_get_int(5); + int type = arg_get_int(ctx, 5); CLIParserFree(ctx); if (type > 1) { @@ -2385,7 +2385,7 @@ static int CmdHF14ADesChangeValue(const char *Cmd) { int vlength = 0x0; CLIGetHexWithReturn(ctx, 3, value.value, &vlength); - int mode = arg_get_int(4); + int mode = arg_get_int(ctx, 4); CLIParserFree(ctx); swap24(aid); @@ -2485,13 +2485,13 @@ static int CmdHF14ADesWriteData(const char *Cmd) { CLIParserFree(ctx); return PM3_EMALLOC; } - if (CLIParamHexToBuf(arg_get_str(4), data, dlength, &dlength)) { + if (CLIParamHexToBuf(arg_get_str(ctx, 4), data, dlength, &dlength)) { free(data); CLIParserFree(ctx); return PM3_ESOFT; } - int type = arg_get_int(5); + int type = arg_get_int(ctx, 5); CLIParserFree(ctx); @@ -2597,7 +2597,7 @@ static int CmdHF14ADesCreateRecordFile(const char *Cmd) { uint8_t fid[2] = {0}; CLIGetHexWithReturn(ctx, 3, fid, &fidlength); - uint8_t comset = arg_get_int(4); + uint8_t comset = arg_get_int(ctx, 4); int arlength = 0; uint8_t ar[2] = {0}; CLIGetHexWithReturn(ctx, 5, ar, &arlength); @@ -2610,7 +2610,7 @@ static int CmdHF14ADesCreateRecordFile(const char *Cmd) { uint8_t maxnumrecords[3] = {0}; CLIGetHexWithReturn(ctx, 7, maxnumrecords, &msizelen); - bool cyclic = arg_get_lit(8); + bool cyclic = arg_get_lit(ctx, 8); CLIParserFree(ctx); swap24(aid); @@ -2724,7 +2724,7 @@ static int CmdHF14ADesCreateValueFile(const char *Cmd) { uint8_t _fileno[1] = {0}; CLIGetHexWithReturn(ctx, 2, _fileno, &filenolen); - uint8_t comset = arg_get_int(3); + uint8_t comset = arg_get_int(ctx, 3); int arlength = 0; uint8_t ar[2] = {0}; CLIGetHexWithReturn(ctx, 4, ar, &arlength); @@ -3452,14 +3452,14 @@ static int CmdHF14ADesAuth(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, false); - uint8_t cmdAuthMode = arg_get_int_def(1, 0); - uint8_t cmdAuthAlgo = arg_get_int_def(2, 0); + uint8_t cmdAuthMode = arg_get_int_def(ctx, 1, 0); + uint8_t cmdAuthAlgo = arg_get_int_def(ctx, 2, 0); int aidlength = 3; uint8_t aid[3] = {0}; CLIGetHexWithReturn(ctx, 3, aid, &aidlength); swap24(aid); - uint8_t cmdKeyNo = arg_get_int_def(4, 0); + uint8_t cmdKeyNo = arg_get_int_def(ctx, 4, 0); uint8_t key[24] = {0}; int keylen = 0; @@ -3925,14 +3925,14 @@ static int CmdHF14aDesChk(const char *Cmd) { uint8_t dict_filename[FILE_PATH_SIZE + 2] = {0}; int dict_filenamelen = 0; - if (CLIParamStrToBuf(arg_get_str(3), dict_filename, FILE_PATH_SIZE, &dict_filenamelen)) { + if (CLIParamStrToBuf(arg_get_str(ctx, 3), dict_filename, FILE_PATH_SIZE, &dict_filenamelen)) { PrintAndLogEx(FAILED, "File name too long or invalid."); CLIParserFree(ctx); return PM3_EINVARG; } - bool pattern1b = arg_get_lit(4); - bool pattern2b = arg_get_lit(5); + bool pattern1b = arg_get_lit(ctx, 4); + bool pattern2b = arg_get_lit(ctx, 5); if (pattern1b && pattern2b) { PrintAndLogEx(ERR, "Pattern search mode must be 2-byte or 1-byte only."); @@ -3964,14 +3964,14 @@ static int CmdHF14aDesChk(const char *Cmd) { uint8_t jsonname[250] = {0}; int jsonnamelen = 0; - if (CLIParamStrToBuf(arg_get_str(7), jsonname, sizeof(jsonname), &jsonnamelen)) { + if (CLIParamStrToBuf(arg_get_str(ctx, 7), jsonname, sizeof(jsonname), &jsonnamelen)) { PrintAndLogEx(ERR, "Invalid json name."); CLIParserFree(ctx); return PM3_EINVARG; } jsonname[jsonnamelen] = 0; - bool verbose = arg_get_lit(8); + bool verbose = arg_get_lit(ctx, 8); CLIParserFree(ctx); diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index f0d90b495..1403948c8 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -439,7 +439,7 @@ static int CmdHFMFPWritePerso(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, true); - bool verbose = arg_get_lit(1); + bool verbose = arg_get_lit(ctx, 1); CLIGetHexWithReturn(ctx, 2, keyNum, &keyNumLen); CLIGetHexWithReturn(ctx, 3, key, &keyLen); CLIParserFree(ctx); @@ -505,8 +505,8 @@ static int CmdHFMFPInitPerso(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, true); - bool verbose = arg_get_lit(1); - bool verbose2 = arg_get_lit(1) > 1; + bool verbose = arg_get_lit(ctx, 1); + bool verbose2 = arg_get_lit(ctx, 1) > 1; CLIGetHexWithReturn(ctx, 2, key, &keyLen); CLIParserFree(ctx); @@ -572,7 +572,7 @@ static int CmdHFMFPCommitPerso(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, true); - bool verbose = arg_get_lit(1); + bool verbose = arg_get_lit(ctx, 1); CLIParserFree(ctx); mfpSetVerboseMode(verbose); @@ -621,7 +621,7 @@ static int CmdHFMFPAuth(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, true); - bool verbose = arg_get_lit(1); + bool verbose = arg_get_lit(ctx, 1); CLIGetHexWithReturn(ctx, 2, keyn, &keynlen); CLIGetHexWithReturn(ctx, 3, key, &keylen); CLIParserFree(ctx); @@ -662,11 +662,11 @@ static int CmdHFMFPRdbl(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, false); - bool verbose = arg_get_lit(1); - int blocksCount = arg_get_int_def(2, 1); - bool keyB = arg_get_lit(3); - int plain = arg_get_lit(4); - uint32_t blockn = arg_get_int(5); + bool verbose = arg_get_lit(ctx, 1); + int blocksCount = arg_get_int_def(ctx, 2, 1); + bool keyB = arg_get_lit(ctx, 3); + int plain = arg_get_lit(ctx, 4); + uint32_t blockn = arg_get_int(ctx, 5); CLIGetHexWithReturn(ctx, 6, key, &keylen); CLIParserFree(ctx); @@ -774,10 +774,10 @@ static int CmdHFMFPRdsc(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, false); - bool verbose = arg_get_lit(1); - bool keyB = arg_get_lit(2); - bool plain = arg_get_lit(3); - uint32_t sectorNum = arg_get_int(4); + bool verbose = arg_get_lit(ctx, 1); + bool keyB = arg_get_lit(ctx, 2); + bool plain = arg_get_lit(ctx, 3); + uint32_t sectorNum = arg_get_int(ctx, 4); CLIGetHexWithReturn(ctx, 5, key, &keylen); CLIParserFree(ctx); @@ -873,9 +873,9 @@ static int CmdHFMFPWrbl(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, false); - bool verbose = arg_get_lit(1); - bool keyB = arg_get_lit(2); - uint32_t blockNum = arg_get_int(3); + bool verbose = arg_get_lit(ctx, 1); + bool keyB = arg_get_lit(ctx, 2); + uint32_t blockNum = arg_get_int(ctx, 3); CLIGetHexWithReturn(ctx, 4, datain, &datainlen); CLIGetHexWithReturn(ctx, 5, key, &keylen); CLIParserFree(ctx); @@ -1081,10 +1081,10 @@ static int CmdHFMFPChk(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, true); - bool keyA = arg_get_lit(1); - bool keyB = arg_get_lit(2); - uint8_t startSector = arg_get_int_def(3, 0); - uint8_t endSector = arg_get_int_def(4, 0); + bool keyA = arg_get_lit(ctx, 1); + bool keyB = arg_get_lit(ctx, 2); + uint8_t startSector = arg_get_int_def(ctx, 3, 0); + uint8_t endSector = arg_get_int_def(ctx, 4, 0); uint8_t vkey[16] = {0}; int vkeylen = 0; @@ -1102,14 +1102,14 @@ static int CmdHFMFPChk(const char *Cmd) { uint8_t dict_filename[FILE_PATH_SIZE + 2] = {0}; int dict_filenamelen = 0; - if (CLIParamStrToBuf(arg_get_str(6), dict_filename, FILE_PATH_SIZE, &dict_filenamelen)) { + if (CLIParamStrToBuf(arg_get_str(ctx, 6), dict_filename, FILE_PATH_SIZE, &dict_filenamelen)) { PrintAndLogEx(FAILED, "File name too long or invalid."); CLIParserFree(ctx); return PM3_EINVARG; } - bool pattern1b = arg_get_lit(7); - bool pattern2b = arg_get_lit(8); + bool pattern1b = arg_get_lit(ctx, 7); + bool pattern2b = arg_get_lit(ctx, 8); if (pattern1b && pattern2b) { PrintAndLogEx(ERR, "Pattern search mode must be 2-byte or 1-byte only."); @@ -1141,14 +1141,14 @@ static int CmdHFMFPChk(const char *Cmd) { uint8_t jsonname[250] = {0}; int jsonnamelen = 0; - if (CLIParamStrToBuf(arg_get_str(10), jsonname, sizeof(jsonname), &jsonnamelen)) { + if (CLIParamStrToBuf(arg_get_str(ctx, 10), jsonname, sizeof(jsonname), &jsonnamelen)) { PrintAndLogEx(ERR, "Invalid json name."); CLIParserFree(ctx); return PM3_EINVARG; } jsonname[jsonnamelen] = 0; - bool verbose = arg_get_lit(11); + bool verbose = arg_get_lit(ctx, 11); CLIParserFree(ctx); @@ -1302,15 +1302,15 @@ static int CmdHFMFPMAD(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, true); - bool verbose = arg_get_lit(1); + bool verbose = arg_get_lit(ctx, 1); uint8_t aid[2] = {0}; int aidlen; CLIGetHexWithReturn(ctx, 2, aid, &aidlen); uint8_t key[16] = {0}; int keylen; CLIGetHexWithReturn(ctx, 3, key, &keylen); - bool keyB = arg_get_lit(4); - bool swapmad = arg_get_lit(5); + bool keyB = arg_get_lit(ctx, 4); + bool swapmad = arg_get_lit(ctx, 5); CLIParserFree(ctx); @@ -1403,15 +1403,15 @@ static int CmdHFMFPNDEF(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, true); - bool verbose = arg_get_lit(1); - bool verbose2 = arg_get_lit(1) > 1; + bool verbose = arg_get_lit(ctx, 1); + bool verbose2 = arg_get_lit(ctx, 1) > 1; uint8_t aid[2] = {0}; int aidlen; CLIGetHexWithReturn(ctx, 2, aid, &aidlen); uint8_t key[16] = {0}; int keylen; CLIGetHexWithReturn(ctx, 3, key, &keylen); - bool keyB = arg_get_lit(4); + bool keyB = arg_get_lit(ctx, 4); CLIParserFree(ctx); diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index dece50f3b..2a361cbb7 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -2911,7 +2911,7 @@ static int CmdHF14MfuNDEF(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, true); CLIGetHexWithReturn(ctx, 1, key, &keylen); - swapEndian = arg_get_lit(2); + swapEndian = arg_get_lit(ctx, 2); CLIParserFree(ctx); switch (keylen) { diff --git a/client/src/cmdlfindala.c b/client/src/cmdlfindala.c index d9d24bfdd..6457bf671 100644 --- a/client/src/cmdlfindala.c +++ b/client/src/cmdlfindala.c @@ -581,22 +581,22 @@ static int CmdIndalaClone(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, false); - is_long_uid = arg_get_lit(1); + is_long_uid = arg_get_lit(ctx, 1); // raw param CLIGetHexWithReturn(ctx, 3, data, &datalen); - is_t5555 = arg_get_lit(4); + is_t5555 = arg_get_lit(ctx, 4); if (is_long_uid == false) { // Heden param - cardnumber = arg_get_int_def(2, -1); + cardnumber = arg_get_int_def(ctx, 2, -1); got_cn = (cardnumber != -1); // 26b FC/CN param - fc = arg_get_int_def(5, 0); - cn = arg_get_int_def(6, 0); + fc = arg_get_int_def(ctx, 5, 0); + cn = arg_get_int_def(ctx, 6, 0); got_26 = (fc != 0 && cn != 0); } diff --git a/client/src/emv/cmdemv.c b/client/src/emv/cmdemv.c index f2a99add1..65c9cafb2 100644 --- a/client/src/emv/cmdemv.c +++ b/client/src/emv/cmdemv.c @@ -85,12 +85,12 @@ static int CmdEMVSelect(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, true); - bool activateField = arg_get_lit(1); - bool leaveSignalON = arg_get_lit(2); - bool APDULogging = arg_get_lit(3); - bool decodeTLV = arg_get_lit(4); + bool activateField = arg_get_lit(ctx, 1); + bool leaveSignalON = arg_get_lit(ctx, 2); + bool APDULogging = arg_get_lit(ctx, 3); + bool decodeTLV = arg_get_lit(ctx, 4); EMVCommandChannel channel = ECC_CONTACTLESS; - if (arg_get_lit(5)) + if (arg_get_lit(ctx, 5)) channel = ECC_CONTACT; PrintChannel(channel); CLIGetHexWithReturn(ctx, 6, data, &datalen); @@ -134,12 +134,12 @@ static int CmdEMVSearch(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, true); - bool activateField = arg_get_lit(1); - bool leaveSignalON = arg_get_lit(2); - bool APDULogging = arg_get_lit(3); - bool decodeTLV = arg_get_lit(4); + bool activateField = arg_get_lit(ctx, 1); + bool leaveSignalON = arg_get_lit(ctx, 2); + bool APDULogging = arg_get_lit(ctx, 3); + bool decodeTLV = arg_get_lit(ctx, 4); EMVCommandChannel channel = ECC_CONTACTLESS; - if (arg_get_lit(5)) + if (arg_get_lit(ctx, 5)) channel = ECC_CONTACT; PrintChannel(channel); CLIParserFree(ctx); @@ -186,17 +186,17 @@ static int CmdEMVPPSE(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, true); - bool activateField = arg_get_lit(1); - bool leaveSignalON = arg_get_lit(2); + bool activateField = arg_get_lit(ctx, 1); + bool leaveSignalON = arg_get_lit(ctx, 2); uint8_t PSENum = 2; - if (arg_get_lit(3)) + if (arg_get_lit(ctx, 3)) PSENum = 1; - if (arg_get_lit(4)) + if (arg_get_lit(ctx, 4)) PSENum = 2; - bool APDULogging = arg_get_lit(5); - bool decodeTLV = arg_get_lit(6); + bool APDULogging = arg_get_lit(ctx, 5); + bool decodeTLV = arg_get_lit(ctx, 6); EMVCommandChannel channel = ECC_CONTACTLESS; - if (arg_get_lit(7)) + if (arg_get_lit(ctx, 7)) channel = ECC_CONTACT; PrintChannel(channel); CLIParserFree(ctx); @@ -245,13 +245,13 @@ static int CmdEMVGPO(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, true); - bool leaveSignalON = arg_get_lit(1); - bool paramsLoadFromFile = arg_get_lit(2); - bool dataMakeFromPDOL = arg_get_lit(3); - bool APDULogging = arg_get_lit(4); - bool decodeTLV = arg_get_lit(5); + bool leaveSignalON = arg_get_lit(ctx, 1); + bool paramsLoadFromFile = arg_get_lit(ctx, 2); + bool dataMakeFromPDOL = arg_get_lit(ctx, 3); + bool APDULogging = arg_get_lit(ctx, 4); + bool decodeTLV = arg_get_lit(ctx, 5); EMVCommandChannel channel = ECC_CONTACTLESS; - if (arg_get_lit(6)) + if (arg_get_lit(ctx, 6)) channel = ECC_CONTACT; PrintChannel(channel); CLIGetHexWithReturn(ctx, 7, data, &datalen); @@ -350,11 +350,11 @@ static int CmdEMVReadRecord(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, true); - bool leaveSignalON = arg_get_lit(1); - bool APDULogging = arg_get_lit(2); - bool decodeTLV = arg_get_lit(3); + bool leaveSignalON = arg_get_lit(ctx, 1); + bool APDULogging = arg_get_lit(ctx, 2); + bool decodeTLV = arg_get_lit(ctx, 3); EMVCommandChannel channel = ECC_CONTACTLESS; - if (arg_get_lit(4)) + if (arg_get_lit(ctx, 4)) channel = ECC_CONTACT; PrintChannel(channel); CLIGetHexWithReturn(ctx, 5, data, &datalen); @@ -413,19 +413,19 @@ static int CmdEMVAC(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, false); - bool leaveSignalON = arg_get_lit(1); - bool trTypeCDA = arg_get_lit(2); + bool leaveSignalON = arg_get_lit(ctx, 1); + bool trTypeCDA = arg_get_lit(ctx, 2); uint8_t termDecision = 0xff; - if (arg_get_str_len(3)) { - if (!strncmp(arg_get_str(3)->sval[0], "aac", 4)) + if (arg_get_str_len(ctx, 3)) { + if (!strncmp(arg_get_str(ctx, 3)->sval[0], "aac", 4)) termDecision = EMVAC_AAC; - if (!strncmp(arg_get_str(3)->sval[0], "tc", 4)) + if (!strncmp(arg_get_str(ctx, 3)->sval[0], "tc", 4)) termDecision = EMVAC_TC; - if (!strncmp(arg_get_str(3)->sval[0], "arqc", 4)) + if (!strncmp(arg_get_str(ctx, 3)->sval[0], "arqc", 4)) termDecision = EMVAC_ARQC; if (termDecision == 0xff) { - PrintAndLogEx(ERR, "ERROR: can't find terminal decision '%s'", arg_get_str(3)->sval[0]); + PrintAndLogEx(ERR, "ERROR: can't find terminal decision '%s'", arg_get_str(ctx, 3)->sval[0]); CLIParserFree(ctx); return PM3_EINVARG; } @@ -434,13 +434,13 @@ static int CmdEMVAC(const char *Cmd) { } if (trTypeCDA) termDecision = termDecision | EMVAC_CDAREQ; - bool paramsLoadFromFile = arg_get_lit(4); - bool dataMakeFromCDOL = arg_get_lit(5); - bool APDULogging = arg_get_lit(6); - bool decodeTLV = arg_get_lit(7); + bool paramsLoadFromFile = arg_get_lit(ctx, 4); + bool dataMakeFromCDOL = arg_get_lit(ctx, 5); + bool APDULogging = arg_get_lit(ctx, 6); + bool decodeTLV = arg_get_lit(ctx, 7); EMVCommandChannel channel = ECC_CONTACTLESS; - if (arg_get_lit(8)) + if (arg_get_lit(ctx, 8)) channel = ECC_CONTACT; PrintChannel(channel); @@ -527,10 +527,10 @@ static int CmdEMVGenerateChallenge(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, true); - bool leaveSignalON = arg_get_lit(1); - bool APDULogging = arg_get_lit(2); + bool leaveSignalON = arg_get_lit(ctx, 1); + bool APDULogging = arg_get_lit(ctx, 2); EMVCommandChannel channel = ECC_CONTACTLESS; - if (arg_get_lit(3)) + if (arg_get_lit(ctx, 3)) channel = ECC_CONTACT; PrintChannel(channel); CLIParserFree(ctx); @@ -584,13 +584,13 @@ static int CmdEMVInternalAuthenticate(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, false); - bool leaveSignalON = arg_get_lit(1); - bool paramsLoadFromFile = arg_get_lit(2); - bool dataMakeFromDDOL = arg_get_lit(3); - bool APDULogging = arg_get_lit(4); - bool decodeTLV = arg_get_lit(5); + bool leaveSignalON = arg_get_lit(ctx, 1); + bool paramsLoadFromFile = arg_get_lit(ctx, 2); + bool dataMakeFromDDOL = arg_get_lit(ctx, 3); + bool APDULogging = arg_get_lit(ctx, 4); + bool decodeTLV = arg_get_lit(ctx, 5); EMVCommandChannel channel = ECC_CONTACTLESS; - if (arg_get_lit(6)) + if (arg_get_lit(ctx, 6)) channel = ECC_CONTACT; PrintChannel(channel); CLIGetHexWithReturn(ctx, 7, data, &datalen); @@ -816,23 +816,23 @@ static int CmdEMVExec(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, true); - bool activateField = arg_get_lit(1); - bool showAPDU = arg_get_lit(2); - bool decodeTLV = arg_get_lit(3); - bool paramLoadJSON = arg_get_lit(4); - bool forceSearch = arg_get_lit(5); + bool activateField = arg_get_lit(ctx, 1); + bool showAPDU = arg_get_lit(ctx, 2); + bool decodeTLV = arg_get_lit(ctx, 3); + bool paramLoadJSON = arg_get_lit(ctx, 4); + bool forceSearch = arg_get_lit(ctx, 5); enum TransactionType TrType = TT_MSD; - if (arg_get_lit(7)) + if (arg_get_lit(ctx, 7)) TrType = TT_QVSDCMCHIP; - if (arg_get_lit(8)) + if (arg_get_lit(ctx, 8)) TrType = TT_CDA; - if (arg_get_lit(9)) + if (arg_get_lit(ctx, 9)) TrType = TT_VSDC; - bool GenACGPO = arg_get_lit(10); + bool GenACGPO = arg_get_lit(ctx, 10); EMVCommandChannel channel = ECC_CONTACTLESS; - if (arg_get_lit(11)) + if (arg_get_lit(ctx, 11)) channel = ECC_CONTACT; PrintChannel(channel); uint8_t psenum = (channel == ECC_CONTACT) ? 1 : 2; @@ -1411,23 +1411,23 @@ static int CmdEMVScan(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, true); - bool showAPDU = arg_get_lit(1); - bool decodeTLV = arg_get_lit(2); - bool extractTLVElements = arg_get_lit(3); - bool paramLoadJSON = arg_get_lit(4); + bool showAPDU = arg_get_lit(ctx, 1); + bool decodeTLV = arg_get_lit(ctx, 2); + bool extractTLVElements = arg_get_lit(ctx, 3); + bool paramLoadJSON = arg_get_lit(ctx, 4); enum TransactionType TrType = TT_MSD; - if (arg_get_lit(6)) + if (arg_get_lit(ctx, 6)) TrType = TT_QVSDCMCHIP; - if (arg_get_lit(7)) + if (arg_get_lit(ctx, 7)) TrType = TT_CDA; - if (arg_get_lit(8)) + if (arg_get_lit(ctx, 8)) TrType = TT_VSDC; - bool GenACGPO = arg_get_lit(9); - bool MergeJSON = arg_get_lit(10); + bool GenACGPO = arg_get_lit(ctx, 9); + bool MergeJSON = arg_get_lit(ctx, 10); EMVCommandChannel channel = ECC_CONTACTLESS; - if (arg_get_lit(11)) + if (arg_get_lit(ctx, 11)) channel = ECC_CONTACT; PrintChannel(channel); uint8_t psenum = (channel == ECC_CONTACT) ? 1 : 2; @@ -1777,8 +1777,8 @@ static int CmdEMVTest(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, true); - bool ignoreTimeTest = arg_get_lit(1); - bool runSlowTests = arg_get_lit(2); + bool ignoreTimeTest = arg_get_lit(ctx, 1); + bool runSlowTests = arg_get_lit(ctx, 2); CLIParserFree(ctx); return ExecuteCryptoTests(true, ignoreTimeTest, runSlowTests); @@ -1811,15 +1811,15 @@ static int CmdEMVRoca(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, true); - if (arg_get_lit(1)) { + if (arg_get_lit(ctx, 1)) { CLIParserFree(ctx); return roca_self_test(); } - bool show_apdu = arg_get_lit(2); + bool show_apdu = arg_get_lit(ctx, 2); EMVCommandChannel channel = ECC_CONTACTLESS; - if (arg_get_lit(3)) + if (arg_get_lit(ctx, 3)) channel = ECC_CONTACT; CLIParserFree(ctx); From c89fc81fcff94f0d99ab34814d1a8a0405e239a5 Mon Sep 17 00:00:00 2001 From: slurdge <slurdge@slurdge.org> Date: Wed, 10 Jun 2020 12:41:18 +0200 Subject: [PATCH 607/632] Make BigBuf take dynamically the available space with a fixed (4K) stack --- armsrc/BigBuf.c | 38 ++++++++++++++++++++++++++------------ armsrc/BigBuf.h | 3 ++- armsrc/appmain.c | 6 +++--- common_arm/ldscript.common | 4 ++++ 4 files changed, 35 insertions(+), 16 deletions(-) diff --git a/armsrc/BigBuf.c b/armsrc/BigBuf.c index 07f32239f..20e2e3e2d 100644 --- a/armsrc/BigBuf.c +++ b/armsrc/BigBuf.c @@ -14,34 +14,48 @@ #include "dbprint.h" #include "pm3_cmd.h" +extern uint8_t _stack_start, __bss_end__; + // BigBuf is the large multi-purpose buffer, typically used to hold A/D samples or traces. // Also used to hold various smaller buffers and the Mifare Emulator Memory. -// declare it as uint32_t to achieve alignment to 4 Byte boundary -static uint32_t BigBuf[BIGBUF_SIZE / sizeof(uint32_t)]; +// We know that bss is aligned to 4 bytes. +static uint8_t* BigBuf = &__bss_end__; /* BigBuf memory layout: Pointer to highest available memory: BigBuf_hi - - high BIGBUF_SIZE + high BigBuf_size reserved = BigBuf_malloc() subtracts amount from BigBuf_hi, low 0x00 */ +static uint32_t BigBuf_size = 0; + // High memory mark -static uint16_t BigBuf_hi = BIGBUF_SIZE; +static uint32_t BigBuf_hi = 0; // pointer to the emulator memory. static uint8_t *emulator_memory = NULL; // trace related variables static uint32_t traceLen = 0; -static bool tracing = true; //todo static? +static bool tracing = true; + +// compute the available size for BigBuf +void BigBuf_initialize(void) { + BigBuf_size = (uint32_t)&_stack_start - (uint32_t)&__bss_end__; + BigBuf_hi = BigBuf_size; + traceLen = 0; +} // get the address of BigBuf uint8_t *BigBuf_get_addr(void) { return (uint8_t *)BigBuf; } +uint32_t BigBuf_get_size(void) { + return BigBuf_size; +} + // get the address of the emulator memory. Allocate part of Bigbuf for it, if not yet done uint8_t *BigBuf_get_EM_addr(void) { // not yet allocated @@ -58,9 +72,9 @@ void BigBuf_Clear(void) { // clear ALL of BigBuf void BigBuf_Clear_ext(bool verbose) { - memset(BigBuf, 0, BIGBUF_SIZE); + memset(BigBuf, 0, BigBuf_size); if (verbose) - Dbprintf("Buffer cleared (%i bytes)", BIGBUF_SIZE); + Dbprintf("Buffer cleared (%i bytes)", BigBuf_size); } void BigBuf_Clear_EM(void) { @@ -74,7 +88,7 @@ void BigBuf_Clear_keep_EM(void) { // allocate a chunk of memory from BigBuf. We allocate high memory first. The unallocated memory // at the beginning of BigBuf is always for traces/samples uint8_t *BigBuf_malloc(uint16_t chunksize) { - if (BigBuf_hi - chunksize < 0) + if (BigBuf_hi < chunksize) return NULL; // no memory left chunksize = (chunksize + 3) & 0xfffc; // round to next multiple of 4 @@ -84,7 +98,7 @@ uint8_t *BigBuf_malloc(uint16_t chunksize) { // free ALL allocated chunks. The whole BigBuf is available for traces or samples again. void BigBuf_free(void) { - BigBuf_hi = BIGBUF_SIZE; + BigBuf_hi = BigBuf_size; emulator_memory = NULL; // shouldn't this empty BigBuf also? } @@ -94,14 +108,14 @@ void BigBuf_free_keep_EM(void) { if (emulator_memory != NULL) BigBuf_hi = emulator_memory - (uint8_t *)BigBuf; else - BigBuf_hi = BIGBUF_SIZE; + BigBuf_hi = BigBuf_size; // shouldn't this empty BigBuf also? } void BigBuf_print_status(void) { DbpString(_BLUE_("Memory")); - Dbprintf(" BIGBUF_SIZE.............%d", BIGBUF_SIZE); + Dbprintf(" BigBuf_size.............%d", BigBuf_size); Dbprintf(" Available memory........%d", BigBuf_hi); DbpString(_BLUE_("Tracing")); Dbprintf(" tracing ................%d", tracing); diff --git a/armsrc/BigBuf.h b/armsrc/BigBuf.h index ad967c4c7..60857e82a 100644 --- a/armsrc/BigBuf.h +++ b/armsrc/BigBuf.h @@ -14,7 +14,6 @@ #include "common.h" -#define BIGBUF_SIZE 40000 #define MAX_FRAME_SIZE 256 // maximum allowed ISO14443 frame #define MAX_PARITY_SIZE ((MAX_FRAME_SIZE + 7) / 8) #define MAX_MIFARE_FRAME_SIZE 18 // biggest Mifare frame is answer to a read (one block = 16 Bytes) + 2 Bytes CRC @@ -23,8 +22,10 @@ #define DMA_BUFFER_SIZE 256 //128 (how big is the dma?!? uint8_t *BigBuf_get_addr(void); +uint32_t BigBuf_get_size(void); uint8_t *BigBuf_get_EM_addr(void); uint16_t BigBuf_max_traceLen(void); +void BigBuf_initialize(void); void BigBuf_Clear(void); void BigBuf_Clear_ext(bool verbose); void BigBuf_Clear_keep_EM(void); diff --git a/armsrc/appmain.c b/armsrc/appmain.c index fd5b4853c..96f133f49 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -1659,12 +1659,12 @@ static void PacketReceived(PacketCommandNG *packet) { } // offset should not be over buffer - if (payload->offset >= BIGBUF_SIZE) { + if (payload->offset >= BigBuf_get_size()) { reply_ng(CMD_LF_UPLOAD_SIM_SAMPLES, PM3_EOVFLOW, NULL, 0); break; } // ensure len bytes copied wont go past end of bigbuf - uint16_t len = MIN(BIGBUF_SIZE - payload->offset, sizeof(payload->data)); + uint16_t len = MIN(BigBuf_get_size() - payload->offset, sizeof(payload->data)); uint8_t *mem = BigBuf_get_addr(); @@ -2054,7 +2054,7 @@ static void PacketReceived(PacketCommandNG *packet) { void __attribute__((noreturn)) AppMain(void) { SpinDelay(100); - clear_trace(); + BigBuf_initialize(); if (common_area.magic != COMMON_AREA_MAGIC || common_area.version != 1) { /* Initialize common area */ diff --git a/common_arm/ldscript.common b/common_arm/ldscript.common index 1be33df95..c94d0dcff 100644 --- a/common_arm/ldscript.common +++ b/common_arm/ldscript.common @@ -9,6 +9,8 @@ ms of the GNU GPL, version 2 or, ----------------------------------------------------------------------------- */ +stacksize = DEFINED(stacksize) ? stacksize : 4K; + /* AT91SAM7S256 has 256k Flash and 64k RAM */ /* AT91SAM7S512 has 512k Flash and 64k RAM */ /* boot space = 8192bytes (0x2000) */ @@ -19,6 +21,7 @@ MEMORY bootphase2 : ORIGIN = 0x00100200, LENGTH = 0x2000 - 0x200 /* Main bootloader code, stored in Flash, executed from RAM */ osimage : ORIGIN = 0x00102000, LENGTH = 512K - 0x2000 /* Place where the main OS will end up */ ram : ORIGIN = 0x00200000, LENGTH = 64K - 0x20 /* RAM, minus small common area */ + stack : ORIGIN = 0x00200000 + 64K - 4K - 0x20, LENGTH = stacksize /* Stack */ commonarea : ORIGIN = 0x00200000 + 64K - 0x20, LENGTH = 0x20 /* Communication between bootloader and main OS */ } @@ -29,4 +32,5 @@ _bootrom_start = ORIGIN(bootphase1); _bootrom_end = ORIGIN(bootphase2) + LENGTH(bootphase2); _flash_start = ORIGIN(bootphase1); _flash_end = ORIGIN(osimage) + LENGTH(osimage); +_stack_start = ORIGIN(stack); _stack_end = ORIGIN(ram) + LENGTH(ram) - 8; From 61be7c7c30bb8c7f636ccdcbafc78c634194a022 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 10 Jun 2020 13:31:57 +0200 Subject: [PATCH 608/632] chg: cliparse should have atleast same file_max_path_len --- client/deps/cliparser/cliparser.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/deps/cliparser/cliparser.h b/client/deps/cliparser/cliparser.h index f51d338df..86ed21977 100644 --- a/client/deps/cliparser/cliparser.h +++ b/client/deps/cliparser/cliparser.h @@ -40,7 +40,7 @@ typedef struct { const char *programName; const char *programHint; const char *programHelp; - char buf[500]; + char buf[1024 + 60]; } CLIParserContext; int CLIParserInit(CLIParserContext **ctx, const char *vprogramName, const char *vprogramHint, const char *vprogramHelp); int CLIParserParseString(CLIParserContext *ctx, const char *str, void *vargtable[], size_t vargtableLen, bool allowEmptyExec); From d7377e7cccec0f05187695fdf01afdd1e1bc07f4 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 10 Jun 2020 13:33:08 +0200 Subject: [PATCH 609/632] textual --- client/src/cmdhfmf.c | 67 +++++++++------ client/src/cmdhfmfp.c | 109 +++++++++++++++++------- client/src/mifare/mad.c | 178 ++++++++++++++++++++++----------------- client/src/mifare/ndef.c | 2 +- 4 files changed, 223 insertions(+), 133 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index cdbe29e96..ea09db66c 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -4492,14 +4492,14 @@ static int CmdHF14AMfMAD(const char *Cmd) { "Checks and prints Mifare Application Directory (MAD)", "Usage:\n" "\thf mf mad -> shows MAD if exists\n" - "\thf mf mad -a 03e1 -k ffffffffffff -b -> shows NDEF data if exists. read card with custom key and key B\n" - "\thf mf mad -a 0004 -k ffffffffffff --dch -> decode CardHolder information\n"); + "\thf mf mad --aid 03e1 -k ffffffffffff -b -> shows NDEF data if exists. read card with custom key and key B\n" + "\thf mf mad --dch -k ffffffffffff -> decode CardHolder information\n"); void *argtable[] = { arg_param_begin, arg_lit0("vV", "verbose", "show technical data"), - arg_str0("aA", "aid", "print all sectors with specified aid", NULL), - arg_str0("kK", "key", "key for printing sectors", NULL), + arg_str0("", "aid", "<aid>", "print all sectors with specified aid"), + arg_str0("kK", "key", "<key>", "key for printing sectors"), arg_lit0("bB", "keyb", "use key B for access printing sectors (by default: key A)"), arg_lit0("", "be", "(optional, BigEndian)"), arg_lit0("", "dch", "decode Card Holder information"), @@ -4530,16 +4530,9 @@ static int CmdHF14AMfMAD(const char *Cmd) { return PM3_ESOFT; } - PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(INFO, "--- " _CYAN_("MAD Information") " -------------------------------"); - PrintAndLogEx(INFO, "---------------------------------------------------"); - - if (verbose) { - PrintAndLogEx(SUCCESS, "Raw:"); - for (int i = 0; i < 4; i ++) - PrintAndLogEx(INFO, "[%d] %s", i, sprint_hex(§or0[i * 16], 16)); - } + PrintAndLogEx(INFO, "--- " _CYAN_("Mifare App Directory Information") " ----------------"); + PrintAndLogEx(INFO, "-----------------------------------------------------"); bool haveMAD2 = false; MAD1DecodeAndPrint(sector0, swapmad, verbose, &haveMAD2); @@ -4561,14 +4554,21 @@ static int CmdHF14AMfMAD(const char *Cmd) { return PM3_ESOFT; } + // copy default NDEF key uint8_t akey[6] = {0}; memcpy(akey, g_mifare_ndef_key, 6); + + // user specified key if (keylen == 6) { memcpy(akey, key, 6); } + uint16_t aaid = 0x0004; if (aidlen == 2) { - uint16_t aaid = (aid[0] << 8) + aid[1]; + + aaid = (aid[0] << 8) + aid[1]; + + PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "-------------- " _CYAN_("AID 0x%04x") " ---------------", aaid); for (int i = 0; i < madlen; i++) { @@ -4587,7 +4587,8 @@ static int CmdHF14AMfMAD(const char *Cmd) { } if (decodeholder) { - uint16_t aaid = 0x0004; + + PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "-------- " _CYAN_("Card Holder Info 0x%04x") " --------", aaid); uint8_t data[4096] = {0}; @@ -4595,6 +4596,7 @@ static int CmdHF14AMfMAD(const char *Cmd) { for (int i = 0; i < madlen; i++) { if (aaid == mad[i]) { + uint8_t vsector[16 * 4] = {0}; if (mfReadSector(i + 1, keyB ? MF_KEY_B : MF_KEY_A, akey, vsector)) { PrintAndLogEx(NORMAL, ""); @@ -4611,11 +4613,17 @@ static int CmdHF14AMfMAD(const char *Cmd) { PrintAndLogEx(WARNING, "no Card Holder Info data"); return PM3_SUCCESS; } - MADCardHolderInfoDecode(data, datalen, verbose); } } + if (verbose) { + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "------------ " _CYAN_("MAD sector raw") " -------------"); + for (int i = 0; i < 4; i ++) + PrintAndLogEx(INFO, "[%d] %s", i, sprint_hex(§or0[i * 16], 16)); + } + return PM3_SUCCESS; } @@ -4624,14 +4632,15 @@ static int CmdHFMFNDEF(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf mf ndef", "Prints NFC Data Exchange Format (NDEF)", - "Usage:\n\thf mf ndef -> shows NDEF data\n" - "\thf mf ndef -a 03e1 -k ffffffffffff -b -> shows NDEF data with custom AID, key and with key B\n"); + "Usage:\n\thf mf ndef -> shows NDEF parsed data\n" + "\thf mf ndef -vv -> shows NDEF parsed and raw data\n" + "\thf mf ndef --aid 03e1 -k ffffffffffff -b -> shows NDEF data with custom AID, key and with key B\n"); void *argtable[] = { arg_param_begin, arg_litn("vV", "verbose", 0, 2, "show technical data"), - arg_str0("aA", "aid", "replace default aid for NDEF", NULL), - arg_str0("kK", "key", "replace default key for NDEF", NULL), + arg_str0("", "aid", "<aid>", "replace default aid for NDEF"), + arg_str0("kK", "key", "<key>", "replace default key for NDEF"), arg_lit0("bB", "keyb", "use key B for access sectors (by default: key A)"), arg_param_end }; @@ -4664,11 +4673,15 @@ static int CmdHFMFNDEF(const char *Cmd) { uint8_t data[4096] = {0}; int datalen = 0; + if (verbose) + PrintAndLogEx(INFO, "reading MAD v1 sector"); + if (mfReadSector(MF_MAD1_SECTOR, MF_KEY_A, (uint8_t *)g_mifare_mad_key, sector0)) { PrintAndLogEx(ERR, "error, read sector 0. card don't have MAD or don't have MAD on default keys"); + PrintAndLogEx(HINT, "Try " _YELLOW_("`hf mf ndef -k `") " with your custom key"); return PM3_ESOFT; } - + bool haveMAD2 = false; int res = MADCheck(sector0, NULL, verbose, &haveMAD2); if (res != PM3_SUCCESS) { @@ -4677,8 +4690,12 @@ static int CmdHFMFNDEF(const char *Cmd) { } if (haveMAD2) { + if (verbose) + PrintAndLogEx(INFO, "reading MAD v2 sector"); + if (mfReadSector(MF_MAD2_SECTOR, MF_KEY_A, (uint8_t *)g_mifare_mad_key, sector10)) { PrintAndLogEx(ERR, "error, read sector 0x10. card don't have MAD or don't have MAD on default keys"); + PrintAndLogEx(HINT, "Try " _YELLOW_("`hf mf ndef -k `") " with your custom key"); return PM3_ESOFT; } } @@ -4691,7 +4708,7 @@ static int CmdHFMFNDEF(const char *Cmd) { return res; } - PrintAndLogEx(INFO, "data reading:"); + PrintAndLogEx(INFO, "reading data from tag"); for (int i = 0; i < madlen; i++) { if (ndefAID == mad[i]) { uint8_t vsector[16 * 4] = {0}; @@ -4703,7 +4720,7 @@ static int CmdHFMFNDEF(const char *Cmd) { memcpy(&data[datalen], vsector, 16 * 3); datalen += 16 * 3; - PrintAndLogEx(INPLACE, "."); + PrintAndLogEx(INPLACE, "%d", i); } } PrintAndLogEx(NORMAL, ""); @@ -4714,12 +4731,14 @@ static int CmdHFMFNDEF(const char *Cmd) { } if (verbose2) { - PrintAndLogEx(SUCCESS, "NDEF data:"); + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "--- " _CYAN_("MFC NDEF raw") " ----------------"); dump_buffer(data, datalen, stdout, 1); } NDEFDecodeAndPrint(data, datalen, verbose); + PrintAndLogEx(HINT, "Try " _YELLOW_("`hf mf ndef -vv`") " for more details"); return PM3_SUCCESS; } diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index 1403948c8..6b330878c 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -1288,16 +1288,17 @@ static int CmdHFMFPMAD(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf mfp mad", "Checks and prints Mifare Application Directory (MAD)", - "Usage:\n\thf mfp mad -> shows MAD if exists\n" + "Usage:\n\thf mfp mad -> shows MAD if exists\n" "\thf mfp mad -a 03e1 -k d3f7d3f7d3f7d3f7d3f7d3f7d3f7d3f7 -> shows NDEF data if exists\n"); void *argtable[] = { arg_param_begin, arg_lit0("vV", "verbose", "show technical data"), - arg_str0("aA", "aid", "print all sectors with aid", NULL), - arg_str0("kK", "key", "key for printing sectors", NULL), + arg_str0("", "aid", "<aid>", "print all sectors with aid"), + arg_str0("kK", "key", "<key>", "key for printing sectors"), arg_lit0("bB", "keyb", "use key B for access printing sectors (by default: key A)"), arg_lit0("", "be", "(optional, BigEndian)"), + arg_lit0("", "dch", "decode Card Holder information"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -1311,11 +1312,12 @@ static int CmdHFMFPMAD(const char *Cmd) { CLIGetHexWithReturn(ctx, 3, key, &keylen); bool keyB = arg_get_lit(ctx, 4); bool swapmad = arg_get_lit(ctx, 5); + bool decodeholder = arg_get_lit(ctx, 6); CLIParserFree(ctx); - if (aidlen != 2 && keylen > 0) { - PrintAndLogEx(WARNING, "do not need a key without aid"); + if (aidlen != 2 && !decodeholder && keylen > 0) { + PrintAndLogEx(WARNING, "Using default MAD keys instead"); } uint8_t sector0[16 * 4] = {0}; @@ -1328,8 +1330,8 @@ static int CmdHFMFPMAD(const char *Cmd) { } PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(INFO, "--- " _CYAN_("MAD Information") " -------------------------------"); - PrintAndLogEx(INFO, "---------------------------------------------------"); + PrintAndLogEx(INFO, "--- " _CYAN_("Mifare App Directory Information") " ----------------"); + PrintAndLogEx(INFO, "-----------------------------------------------------"); if (verbose) { PrintAndLogEx(SUCCESS, "Raw:"); @@ -1350,10 +1352,7 @@ static int CmdHFMFPMAD(const char *Cmd) { MAD2DecodeAndPrint(sector10, swapmad, verbose); } - if (aidlen == 2) { - uint16_t aaid = (aid[0] << 8) + aid[1]; - PrintAndLogEx(INFO, "-------------- " _CYAN_("AID 0x%04x") " ---------------", aaid); - + if (aidlen == 2 || decodeholder) { uint16_t mad[7 + 8 + 8 + 8 + 8] = {0}; size_t madlen = 0; if (MADDecode(sector0, sector10, mad, &madlen, swapmad)) { @@ -1361,27 +1360,66 @@ static int CmdHFMFPMAD(const char *Cmd) { return 10; } + // copy default NDEF key uint8_t akey[16] = {0}; memcpy(akey, g_mifarep_ndef_key, 16); + + // user specified key if (keylen == 16) { memcpy(akey, key, 16); } - for (int i = 0; i < madlen; i++) { - if (aaid == mad[i]) { - uint8_t vsector[16 * 4] = {0}; - if (mfpReadSector(i + 1, keyB ? MF_KEY_B : MF_KEY_A, akey, vsector, false)) { - PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(ERR, "error, read sector %d error", i + 1); - return 2; - } + uint16_t aaid = 0x0004; + if (aidlen == 2) { + aaid = (aid[0] << 8) + aid[1]; + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "-------------- " _CYAN_("AID 0x%04x") " ---------------", aaid); - for (int j = 0; j < (verbose ? 4 : 3); j ++) - PrintAndLogEx(NORMAL, " [%03d] %s", (i + 1) * 4 + j, sprint_hex(&vsector[j * 16], 16)); + for (int i = 0; i < madlen; i++) { + if (aaid == mad[i]) { + uint8_t vsector[16 * 4] = {0}; + if (mfpReadSector(i + 1, keyB ? MF_KEY_B : MF_KEY_A, akey, vsector, false)) { + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(ERR, "error, read sector %d error", i + 1); + return PM3_ESOFT; + } + + for (int j = 0; j < (verbose ? 4 : 3); j ++) + PrintAndLogEx(NORMAL, " [%03d] %s", (i + 1) * 4 + j, sprint_hex(&vsector[j * 16], 16)); + } } } - } + if (decodeholder) { + + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "-------- " _CYAN_("Card Holder Info 0x%04x") " --------", aaid); + + uint8_t data[4096] = {0}; + int datalen = 0; + + for (int i = 0; i < madlen; i++) { + if (aaid == mad[i]) { + + uint8_t vsector[16 * 4] = {0}; + if (mfReadSector(i + 1, keyB ? MF_KEY_B : MF_KEY_A, akey, vsector)) { + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(ERR, "error, read sector %d", i + 1); + return PM3_ESOFT; + } + + memcpy(&data[datalen], vsector, 16 * 3); + datalen += 16 * 3; + } + } + + if (!datalen) { + PrintAndLogEx(WARNING, "no Card Holder Info data"); + return PM3_SUCCESS; + } + MADCardHolderInfoDecode(data, datalen, verbose); + } + } return PM3_SUCCESS; } @@ -1390,14 +1428,16 @@ static int CmdHFMFPNDEF(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf mfp ndef", "Prints NFC Data Exchange Format (NDEF)", - "Usage:\n\thf mfp ndef -> shows NDEF data\n" - "\thf mfp ndef -a 03e1 -k d3f7d3f7d3f7d3f7d3f7d3f7d3f7d3f7 -> shows NDEF data with custom AID and key\n"); + "Usage:\n" + "\thf mfp ndef -> shows NDEF data\n" + "\thf mfp ndef -vv -> shows NDEF parsed and raw data\n" + "\thf mfp ndef -a 03e1 -k d3f7d3f7d3f7d3f7d3f7d3f7d3f7d3f7 -> shows NDEF data with custom AID and key\n"); void *argtable[] = { arg_param_begin, arg_litn("vV", "verbose", 0, 2, "show technical data"), - arg_str0("aA", "aid", "replace default aid for NDEF", NULL), - arg_str0("kK", "key", "replace default key for NDEF", NULL), + arg_str0("", "aid", "<aid>", "replace default aid for NDEF"), + arg_str0("kK", "key", "<key>", "replace default key for NDEF"), arg_lit0("bB", "keyb", "use key B for access sectors (by default: key A)"), arg_param_end }; @@ -1430,8 +1470,12 @@ static int CmdHFMFPNDEF(const char *Cmd) { uint8_t data[4096] = {0}; int datalen = 0; + if (verbose) + PrintAndLogEx(INFO, "reading MAD v1 sector"); + if (mfpReadSector(MF_MAD1_SECTOR, MF_KEY_A, (uint8_t *)g_mifarep_mad_key, sector0, verbose)) { PrintAndLogEx(ERR, "error, read sector 0. card don't have MAD or don't have MAD on default keys"); + PrintAndLogEx(HINT, "Try " _YELLOW_("`hf mfp ndef -k `") " with your custom key"); return PM3_ESOFT; } @@ -1443,8 +1487,13 @@ static int CmdHFMFPNDEF(const char *Cmd) { } if (haveMAD2) { + + if (verbose) + PrintAndLogEx(INFO, "reading MAD v2 sector"); + if (mfpReadSector(MF_MAD2_SECTOR, MF_KEY_A, (uint8_t *)g_mifarep_mad_key, sector10, verbose)) { PrintAndLogEx(ERR, "error, read sector 0x10. card don't have MAD or don't have MAD on default keys"); + PrintAndLogEx(HINT, "Try " _YELLOW_("`hf mf ndef -k `") " with your custom key"); return PM3_ESOFT; } } @@ -1457,7 +1506,7 @@ static int CmdHFMFPNDEF(const char *Cmd) { return res; } - PrintAndLogEx(INFO, "data reading:"); + PrintAndLogEx(INFO, "reading data from tag"); for (int i = 0; i < madlen; i++) { if (ndefAID == mad[i]) { uint8_t vsector[16 * 4] = {0}; @@ -1469,7 +1518,7 @@ static int CmdHFMFPNDEF(const char *Cmd) { memcpy(&data[datalen], vsector, 16 * 3); datalen += 16 * 3; - PrintAndLogEx(INPLACE, "."); + PrintAndLogEx(INPLACE, "%d", i); } } PrintAndLogEx(NORMAL, ""); @@ -1480,11 +1529,13 @@ static int CmdHFMFPNDEF(const char *Cmd) { } if (verbose2) { - PrintAndLogEx(INFO, "NDEF data:"); + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "--- " _CYAN_("MFC NDEF raw") " ----------------"); dump_buffer(data, datalen, stdout, 1); } NDEFDecodeAndPrint(data, datalen, verbose); + PrintAndLogEx(HINT, "Try " _YELLOW_("`hf mf ndef -vv`") " for more details"); return PM3_SUCCESS; } diff --git a/client/src/mifare/mad.c b/client/src/mifare/mad.c index dad6d6ea6..96ac4f1d1 100644 --- a/client/src/mifare/mad.c +++ b/client/src/mifare/mad.c @@ -20,6 +20,22 @@ // https://www.nxp.com/docs/en/application-note/AN10787.pdf static json_t *mad_known_aids = NULL; +static const char *holder_info_type[] = { + "Surname", + "Given name", + "Sex", + "Other" +}; + +static const char *aid_admin[] = { + "free", + "defect", + "reserved", + "additional directory info", + "card holder info", + "not applicable" +}; + static int open_mad_file(json_t **root, bool verbose) { char *path; @@ -45,7 +61,7 @@ static int open_mad_file(json_t **root, bool verbose) { } if (verbose) - PrintAndLogEx(SUCCESS, "Loaded file (%s) OK. %zu records.", path, json_array_size(*root)); + PrintAndLogEx(SUCCESS, "Loaded file " _YELLOW_("`%s`") " (%s) %zu records.", path, _GREEN_("ok"), json_array_size(*root)); out: free(path); return retval; @@ -157,9 +173,9 @@ int MADCheck(uint8_t *sector0, uint8_t *sector10, bool verbose, bool *haveMAD2) if (sector0 == NULL) return PM3_EINVARG; - uint8_t GPB = sector0[3 * 16 + 9]; + uint8_t GPB = sector0[3 * 16 + 9]; if (verbose) - PrintAndLogEx(SUCCESS, "GPB: " _GREEN_("0x%02x"), GPB); + PrintAndLogEx(SUCCESS, "%14s " _GREEN_("0x%02x"), "GPB", GPB); // DA (MAD available) if (!(GPB & 0x80)) { @@ -167,6 +183,33 @@ int MADCheck(uint8_t *sector0, uint8_t *sector10, bool verbose, bool *haveMAD2) return PM3_ESOFT; } + uint8_t mad_ver = GPB & 0x03; + if (verbose) + PrintAndLogEx(SUCCESS, "%14s " _GREEN_("%d"), "MAD version", mad_ver); + + // MAD version + if ((mad_ver != 0x01) && (mad_ver != 0x02)) { + PrintAndLogEx(ERR, "Wrong MAD version " _RED_("0x%02x"), mad_ver); + return PM3_ESOFT; + }; + + if (haveMAD2) + *haveMAD2 = (mad_ver == 2); + + int res = madCRCCheck(sector0, true, 1); + + if (verbose && res == PM3_SUCCESS) + PrintAndLogEx(SUCCESS, "%14s " _GREEN_("0x%02x") " (%s)", "CRC8", sector0[16], _GREEN_("ok")); + + if (mad_ver == 2 && sector10) { + int res2 = madCRCCheck(sector10, true, 2); + if (res == PM3_SUCCESS) + res = res2; + + if (verbose && !res2) + PrintAndLogEx(SUCCESS, "%14s " _GREEN_("0x%02x") " (%s)", "CRC8", sector10[0], _GREEN_("ok")); + } + // MA (multi-application card) if (verbose) { if (GPB & 0x40) @@ -174,34 +217,6 @@ int MADCheck(uint8_t *sector0, uint8_t *sector10, bool verbose, bool *haveMAD2) else PrintAndLogEx(SUCCESS, "Single application card"); } - - uint8_t MADVer = GPB & 0x03; - if (verbose) - PrintAndLogEx(SUCCESS, "MAD version: " _GREEN_("%d"), MADVer); - - // MAD version - if ((MADVer != 0x01) && (MADVer != 0x02)) { - PrintAndLogEx(ERR, "Wrong MAD version: " _RED_("0x%02x"), MADVer); - return PM3_ESOFT; - }; - - if (haveMAD2) - *haveMAD2 = (MADVer == 2); - - int res = madCRCCheck(sector0, true, 1); - - if (verbose && res == PM3_SUCCESS) - PrintAndLogEx(SUCCESS, "CRC8-MAD1 (%s)", _GREEN_("ok")); - - if (MADVer == 2 && sector10) { - int res2 = madCRCCheck(sector10, true, 2); - if (res == PM3_SUCCESS) - res = res2; - - if (verbose && !res2) - PrintAndLogEx(SUCCESS, "CRC8-MAD2 (%s)", _GREEN_("ok")); - } - return res; } @@ -232,83 +247,78 @@ int MADDecode(uint8_t *sector0, uint8_t *sector10, uint16_t *mad, size_t *madlen return PM3_SUCCESS; } -static const char *holder_info_type[] = { - "Surname", - "Given name", - "Sex", - "Other" -}; - -int MADCardHolderInfoDecode(uint8_t *data, size_t dataLen, bool verbose) { +int MADCardHolderInfoDecode(uint8_t *data, size_t datalen, bool verbose) { size_t idx = 0; - while (idx < dataLen) { + while (idx < datalen) { uint8_t len = data[idx] & 0x3f; uint8_t type = data[idx] >> 6; idx++; if (len > 0) { - PrintAndLogEx(INFO, "%s: %.*s", holder_info_type[type], len, &data[idx]); + PrintAndLogEx(INFO, "%14s " _GREEN_("%.*s"), holder_info_type[type], len, &data[idx]); idx += len; - } else break; + } else { + break; + } } return PM3_SUCCESS; } -static int MADInfoByteDecode(uint8_t *sector, bool swapmad, int MADver, bool verbose) { - uint8_t InfoByte; - if (MADver == 1) { - InfoByte = sector[16 + 1] & 0x3f; - if (InfoByte >= 0xF) { - PrintAndLogEx(WARNING, "Invalid Info byte (MAD1) value " _YELLOW_("0x%02x"), InfoByte); +static int MADInfoByteDecode(uint8_t *sector, bool swapmad, int mad_ver, bool verbose) { + uint8_t info; + if (mad_ver == 1) { + info = sector[16 + 1] & 0x3f; + if (info >= 0xF) { + PrintAndLogEx(WARNING, "Invalid Info byte (MAD1) value " _YELLOW_("0x%02x"), info); if (verbose) // I understand the spec in a way that MAD1 InfoByte should not point into MAD2 sectors, @lukaskuzmiak - PrintAndLogEx(WARNING, "MAD1 Info byte points outside of MAD1 sector space (0x%02x), report a bug?", InfoByte); + PrintAndLogEx(WARNING, "MAD1 Info byte points outside of MAD1 sector space (0x%02x), report a bug?", info); return PM3_ESOFT; } } else { - InfoByte = sector[1] & 0x3f; - if (InfoByte == 0x10 || InfoByte >= 0x28) { - PrintAndLogEx(WARNING, "Invalid Info byte (MAD2) value " _YELLOW_("0x%02x"), InfoByte); + info = sector[1] & 0x3f; + if (info == 0x10 || info >= 0x28) { + PrintAndLogEx(WARNING, "Invalid Info byte (MAD2) value " _YELLOW_("0x%02x"), info); return PM3_ESOFT; } } - if (InfoByte) { - PrintAndLogEx(SUCCESS, "Card publisher sector: " _MAGENTA_("0x%02x"), InfoByte); - return InfoByte; - } else { - PrintAndLogEx(WARNING, "Card publisher not present " _YELLOW_("0x%02x"), InfoByte); - return PM3_ESOFT; + if (info) { + return info; } + return PM3_ESOFT; } -static const char *aid_admin[] = { - "free", - "defect", - "reserved", - "additional directory info", - "card holder info", - "not applicable" -}; - int MAD1DecodeAndPrint(uint8_t *sector, bool swapmad, bool verbose, bool *haveMAD2) { open_mad_file(&mad_known_aids, verbose); + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "------------ " _CYAN_("MAD v1 details") " -------------"); + // check MAD1 only MADCheck(sector, NULL, verbose, haveMAD2); - int InfoByteSector = MADInfoByteDecode(sector, swapmad, 1, verbose); + int ibs = MADInfoByteDecode(sector, swapmad, 1, verbose); - PrintAndLogEx(INFO, " 00 MAD 1"); + if (ibs) { + PrintAndLogEx(SUCCESS, "Card publisher sector " _MAGENTA_("0x%02x"), ibs); + } else { + PrintAndLogEx(WARNING, "Card publisher " _RED_("not") " present " _YELLOW_("0x%02x"), ibs); + } + + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "---------------- " _CYAN_("Listing") " ----------------"); + + PrintAndLogEx(INFO, " 00 MAD v1"); uint32_t prev_aid = 0xFFFFFFFF; for (int i = 1; i < 16; i++) { uint16_t aid = madGetAID(sector, swapmad, 1, i); if (aid < 6) { - PrintAndLogEx(INFO, (InfoByteSector == i) ? _MAGENTA_(" %02d [%04X] (%s)") : " %02d [%04X] (%s)", i, aid, aid_admin[aid]); + PrintAndLogEx(INFO, (ibs == i) ? _MAGENTA_(" %02d [%04X] (%s)") : " %02d [%04X] (%s)", i, aid, aid_admin[aid]); } else if (prev_aid == aid) { - PrintAndLogEx(INFO, (InfoByteSector == i) ? _MAGENTA_(" %02d [%04X] (continuation)") : " %02d [%04X] (continuation)", i, aid); + PrintAndLogEx(INFO, (ibs == i) ? _MAGENTA_(" %02d [%04X] (continuation)") : " %02d [%04X] (continuation)", i, aid); } else { char fmt[30]; - sprintf(fmt, (InfoByteSector == i) ? _MAGENTA_(" %02d [%04X]%s") : " %02d [%04X]%s", i, aid, "%s"); + sprintf(fmt, (ibs == i) ? _MAGENTA_(" %02d [%04X]%s") : " %02d [%04X]%s", i, aid, "%s"); print_aid_description(mad_known_aids, aid, fmt, verbose); prev_aid = aid; } @@ -319,28 +329,38 @@ int MAD1DecodeAndPrint(uint8_t *sector, bool swapmad, bool verbose, bool *haveMA int MAD2DecodeAndPrint(uint8_t *sector, bool swapmad, bool verbose) { open_mad_file(&mad_known_aids, verbose); - PrintAndLogEx(INFO, " 16 MAD 2"); + + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "------------ " _CYAN_("MAD v2 details") " -------------"); + + PrintAndLogEx(INFO, " 16 MAD v2"); int res = madCRCCheck(sector, true, 2); if (verbose) { if (res == PM3_SUCCESS) - PrintAndLogEx(SUCCESS, "CRC8-MAD2 (%s)", _GREEN_("ok")); + PrintAndLogEx(SUCCESS, "CRC8 (%s)", _GREEN_("ok")); else - PrintAndLogEx(WARNING, "CRC8-MAD2 (%s)", _RED_("fail")); + PrintAndLogEx(WARNING, "CRC8 (%s)", _RED_("fail")); + } + + int ibs = MADInfoByteDecode(sector, swapmad, 2, verbose); + if (ibs) { + PrintAndLogEx(SUCCESS, "Card publisher sector " _MAGENTA_("0x%02x"), ibs); + } else { + PrintAndLogEx(WARNING, "Card publisher " _RED_("not") " present " _YELLOW_("0x%02x"), ibs); } - int InfoByteSector = MADInfoByteDecode(sector, swapmad, 2, verbose); uint32_t prev_aid = 0xFFFFFFFF; for (int i = 1; i < 8 + 8 + 7 + 1; i++) { uint16_t aid = madGetAID(sector, swapmad, 2, i); if (aid < 6) { - PrintAndLogEx(INFO, (InfoByteSector == i) ? _MAGENTA_(" %02d [%04X] (%s)") : " %02d [%04X] (%s)", i + 16, aid, aid_admin[aid]); + PrintAndLogEx(INFO, (ibs == i) ? _MAGENTA_(" %02d [%04X] (%s)") : " %02d [%04X] (%s)", i + 16, aid, aid_admin[aid]); } else if (prev_aid == aid) { - PrintAndLogEx(INFO, (InfoByteSector == i) ? _MAGENTA_(" %02d [%04X] (continuation)") : " %02d [%04X] (continuation)", i + 16, aid); + PrintAndLogEx(INFO, (ibs == i) ? _MAGENTA_(" %02d [%04X] (continuation)") : " %02d [%04X] (continuation)", i + 16, aid); } else { char fmt[30]; - sprintf(fmt, (InfoByteSector == i) ? _MAGENTA_(" %02d [%04X]%s") : " %02d [%04X]%s", i + 16, aid, "%s"); + sprintf(fmt, (ibs == i) ? _MAGENTA_(" %02d [%04X]%s") : " %02d [%04X]%s", i + 16, aid, "%s"); print_aid_description(mad_known_aids, aid, fmt, verbose); prev_aid = aid; } diff --git a/client/src/mifare/ndef.c b/client/src/mifare/ndef.c index 58b9b0a25..2aab01634 100644 --- a/client/src/mifare/ndef.c +++ b/client/src/mifare/ndef.c @@ -437,7 +437,7 @@ int NDEFDecodeAndPrint(uint8_t *ndef, size_t ndefLen, bool verbose) { size_t indx = 0; PrintAndLogEx(INFO, ""); - PrintAndLogEx(INFO, "NDEF parsing"); + PrintAndLogEx(INFO, "--- " _CYAN_("NDEF parsing") " ----------------"); while (indx < ndefLen) { PrintAndLogEx(INFO, "-----------------------------------------------------"); From 8ccc592ca07ede0cc9835c2aa1885f28b0508376 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Wed, 10 Jun 2020 14:02:14 +0200 Subject: [PATCH 610/632] mf ndef examples 03e1 -> e103 --- client/src/cmdhfmf.c | 8 ++++---- client/src/cmdhfmfp.c | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index ea09db66c..1050992f0 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -4491,9 +4491,9 @@ static int CmdHF14AMfMAD(const char *Cmd) { CLIParserInit(&ctx, "hf mf mad", "Checks and prints Mifare Application Directory (MAD)", "Usage:\n" - "\thf mf mad -> shows MAD if exists\n" - "\thf mf mad --aid 03e1 -k ffffffffffff -b -> shows NDEF data if exists. read card with custom key and key B\n" - "\thf mf mad --dch -k ffffffffffff -> decode CardHolder information\n"); + "\thf mf mad -> shows MAD if exists\n" + "\thf mf mad --aid e103 -k ffffffffffff -b -> shows NDEF data if exists. read card with custom key and key B\n" + "\thf mf mad --dch -k ffffffffffff -> decode CardHolder information\n"); void *argtable[] = { arg_param_begin, @@ -4634,7 +4634,7 @@ static int CmdHFMFNDEF(const char *Cmd) { "Prints NFC Data Exchange Format (NDEF)", "Usage:\n\thf mf ndef -> shows NDEF parsed data\n" "\thf mf ndef -vv -> shows NDEF parsed and raw data\n" - "\thf mf ndef --aid 03e1 -k ffffffffffff -b -> shows NDEF data with custom AID, key and with key B\n"); + "\thf mf ndef --aid e103 -k ffffffffffff -b -> shows NDEF data with custom AID, key and with key B\n"); void *argtable[] = { arg_param_begin, diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index 6b330878c..7fc0f0bf7 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -1288,8 +1288,8 @@ static int CmdHFMFPMAD(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf mfp mad", "Checks and prints Mifare Application Directory (MAD)", - "Usage:\n\thf mfp mad -> shows MAD if exists\n" - "\thf mfp mad -a 03e1 -k d3f7d3f7d3f7d3f7d3f7d3f7d3f7d3f7 -> shows NDEF data if exists\n"); + "Usage:\n\thf mfp mad -> shows MAD if exists\n" + "\thf mfp mad -a e103 -k d3f7d3f7d3f7d3f7d3f7d3f7d3f7d3f7 -> shows NDEF data if exists\n"); void *argtable[] = { arg_param_begin, @@ -1429,9 +1429,9 @@ static int CmdHFMFPNDEF(const char *Cmd) { CLIParserInit(&ctx, "hf mfp ndef", "Prints NFC Data Exchange Format (NDEF)", "Usage:\n" - "\thf mfp ndef -> shows NDEF data\n" - "\thf mfp ndef -vv -> shows NDEF parsed and raw data\n" - "\thf mfp ndef -a 03e1 -k d3f7d3f7d3f7d3f7d3f7d3f7d3f7d3f7 -> shows NDEF data with custom AID and key\n"); + "\thf mfp ndef -> shows NDEF data\n" + "\thf mfp ndef -vv -> shows NDEF parsed and raw data\n" + "\thf mfp ndef -a e103 -k d3f7d3f7d3f7d3f7d3f7d3f7d3f7d3f7 -> shows NDEF data with custom AID and key\n"); void *argtable[] = { arg_param_begin, From cba76ca1674dc20a1b8704c48e4e4f6bfe613a9f Mon Sep 17 00:00:00 2001 From: slurdge <slurdge@slurdge.org> Date: Wed, 10 Jun 2020 14:06:45 +0200 Subject: [PATCH 611/632] Fix stacksize & make common area size a variable --- common_arm/ldscript.common | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/common_arm/ldscript.common b/common_arm/ldscript.common index c94d0dcff..8400f740a 100644 --- a/common_arm/ldscript.common +++ b/common_arm/ldscript.common @@ -10,6 +10,7 @@ ms of the GNU GPL, version 2 or, */ stacksize = DEFINED(stacksize) ? stacksize : 4K; +commonareasize = 0x20; /* AT91SAM7S256 has 256k Flash and 64k RAM */ /* AT91SAM7S512 has 512k Flash and 64k RAM */ @@ -17,12 +18,12 @@ stacksize = DEFINED(stacksize) ? stacksize : 4K; /* osimage space = (512k - 0x2000 == 524288 - 8192 == 516096bytes == 0x7E000 ) */ MEMORY { - bootphase1 : ORIGIN = 0x00100000, LENGTH = 0x200 /* Phase 1 bootloader: Copies real bootloader to RAM */ - bootphase2 : ORIGIN = 0x00100200, LENGTH = 0x2000 - 0x200 /* Main bootloader code, stored in Flash, executed from RAM */ - osimage : ORIGIN = 0x00102000, LENGTH = 512K - 0x2000 /* Place where the main OS will end up */ - ram : ORIGIN = 0x00200000, LENGTH = 64K - 0x20 /* RAM, minus small common area */ - stack : ORIGIN = 0x00200000 + 64K - 4K - 0x20, LENGTH = stacksize /* Stack */ - commonarea : ORIGIN = 0x00200000 + 64K - 0x20, LENGTH = 0x20 /* Communication between bootloader and main OS */ + bootphase1 : ORIGIN = 0x00100000, LENGTH = 0x200 /* Phase 1 bootloader: Copies real bootloader to RAM */ + bootphase2 : ORIGIN = 0x00100200, LENGTH = 0x2000 - 0x200 /* Main bootloader code, stored in Flash, executed from RAM */ + osimage : ORIGIN = 0x00102000, LENGTH = 512K - 0x2000 /* Place where the main OS will end up */ + ram : ORIGIN = 0x00200000, LENGTH = 64K - commonareasize /* RAM, minus small common area */ + stack : ORIGIN = 0x00200000 + 64K - stacksize - commonareasize, LENGTH = stacksize /* Stack */ + commonarea : ORIGIN = 0x00200000 + 64K - commonareasize, LENGTH = commonareasize /* Communication between bootloader and main OS */ } /* Export some information that can be used from within the firmware */ From df4bdc89ea9499e2ac0d2389e17ec546d62f0bf3 Mon Sep 17 00:00:00 2001 From: slurdge <slurdge@slurdge.org> Date: Wed, 10 Jun 2020 19:06:40 +0200 Subject: [PATCH 612/632] Fix BIGBUF_SIZE used in #WITH_FLASH --- armsrc/mifarecmd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index ef1a15864..9e19cbc53 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -1392,7 +1392,7 @@ void MifareChkKeys_fast(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *da // limit size of availlable for keys in bigbuff // a key is 6bytes - uint16_t key_mem_available = MIN(BIGBUF_SIZE, keyCount * 6); + uint16_t key_mem_available = MIN(BigBuf_get_size(), keyCount * 6); keyCount = key_mem_available / 6; From 6f1c074801782e7c9b82ee899c447a8926d81e90 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Wed, 10 Jun 2020 22:47:47 +0200 Subject: [PATCH 613/632] textual --- client/src/cmdlfem4x.c | 76 ++++++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/client/src/cmdlfem4x.c b/client/src/cmdlfem4x.c index 2f003c8d5..ebb3fe2e4 100644 --- a/client/src/cmdlfem4x.c +++ b/client/src/cmdlfem4x.c @@ -931,11 +931,11 @@ int EM4x50Read(const char *Cmd, bool verbose) { // report back if (verbose || g_debugMode) { if (start >= 0) { - PrintAndLogEx(NORMAL, "\nNote: one block = 50 bits (32 data, 12 parity, 6 marker)"); + PrintAndLogEx(INFO, "\nNote: one block = 50 bits (32 data, 12 parity, 6 marker)"); } else { - PrintAndLogEx(NORMAL, "No data found!, clock tried: " _YELLOW_("%d"), clk); - PrintAndLogEx(NORMAL, "Try again with more samples."); - PrintAndLogEx(NORMAL, " or after a " _YELLOW_("'data askedge'") " command to clean up the read"); + PrintAndLogEx(INFO, "No data found!, clock tried: " _YELLOW_("%d"), clk); + PrintAndLogEx(HINT, "Try again with more samples"); + PrintAndLogEx(HINT, " or after a " _YELLOW_("'data askedge'") " command to clean up the read"); return PM3_ESOFT; } } else if (start < 0) { @@ -1002,20 +1002,22 @@ int EM4x50Read(const char *Cmd, bool verbose) { //print full code: if (verbose || g_debugMode || AllPTest) { if (!complete) { - PrintAndLogEx(NORMAL, _RED_("* **Warning!")); - PrintAndLogEx(NORMAL, "Partial data - no end found!"); - PrintAndLogEx(NORMAL, "Try again with more samples."); + PrintAndLogEx(WARNING, _RED_("* **Warning!")); + PrintAndLogEx(INFO, "Partial data - no end found!"); + PrintAndLogEx(HINT, "Try again with more samples."); } - PrintAndLogEx(NORMAL, "Found data at sample: %i - using clock: %i", start, clk); + PrintAndLogEx(INFO, "Found data at sample: %i - using clock: %i", start, clk); end = block; + PrintAndLogEx(INFO, "blk | data"); + PrintAndLogEx(INFO, "----+--------------"); for (block = 0; block < end; block++) { - PrintAndLogEx(NORMAL, "Block %d: %08x", block, Code[block]); + PrintAndLogEx(INFO, "%03d | %08x", block, Code[block]); } - - PrintAndLogEx(NORMAL, "Parities checks | %s", (AllPTest) ? _GREEN_("Passed") : _RED_("Fail")); + PrintAndLogEx(INFO, "----+--------------"); + PrintAndLogEx( (AllPTest) ? SUCCESS : WARNING, "Parities checks | %s", (AllPTest) ? _GREEN_("Passed") : _RED_("Fail")); if (AllPTest == false) { - PrintAndLogEx(NORMAL, "Try cleaning the read samples with " _YELLOW_("'data askedge'")); + PrintAndLogEx(HINT, "Try cleaning the read samples with " _YELLOW_("'data askedge'")); } } @@ -1607,21 +1609,21 @@ static void printEM4x05config(uint32_t wordData) { uint8_t disable = (wordData & EM4x05_DISABLE_ALLOWED) >> 23; uint8_t rtf = (wordData & EM4x05_READER_TALK_FIRST) >> 24; uint8_t pigeon = (wordData & (1 << 26)) >> 26; - PrintAndLogEx(NORMAL, "ConfigWord: %08X (Word 4)\n", wordData); - PrintAndLogEx(NORMAL, "Config Breakdown:"); - PrintAndLogEx(NORMAL, " Data Rate: %02u | "_YELLOW_("RF/%u"), wordData & 0x3F, datarate); - PrintAndLogEx(NORMAL, " Encoder: %u | " _YELLOW_("%s"), encoder, enc); - PrintAndLogEx(NORMAL, " PSK CF: %u | %s", PSKcf, cf); - PrintAndLogEx(NORMAL, " Delay: %u | %s", delay, cdelay); - PrintAndLogEx(NORMAL, " LastWordR: %02u | Address of last word for default read - meaning %u blocks are output", LWR, numblks); - PrintAndLogEx(NORMAL, " ReadLogin: %u | Read login is %s", readLogin, readLogin ? _YELLOW_("required") : _GREEN_("not required")); - PrintAndLogEx(NORMAL, " ReadHKL: %u | Read housekeeping words login is %s", readHKL, readHKL ? _YELLOW_("required") : _GREEN_("not required")); - PrintAndLogEx(NORMAL, "WriteLogin: %u | Write login is %s", writeLogin, writeLogin ? _YELLOW_("required") : _GREEN_("not required")); - PrintAndLogEx(NORMAL, " WriteHKL: %u | Write housekeeping words login is %s", writeHKL, writeHKL ? _YELLOW_("required") : _GREEN_("not Required")); - PrintAndLogEx(NORMAL, " R.A.W.: %u | Read after write is %s", raw, raw ? "on" : "off"); - PrintAndLogEx(NORMAL, " Disable: %u | Disable command is %s", disable, disable ? "accepted" : "not accepted"); - PrintAndLogEx(NORMAL, " R.T.F.: %u | Reader talk first is %s", rtf, rtf ? _YELLOW_("enabled") : "disabled"); - PrintAndLogEx(NORMAL, " Pigeon: %u | Pigeon mode is %s\n", pigeon, pigeon ? _YELLOW_("enabled") : "disabled"); + PrintAndLogEx(INFO, "ConfigWord: %08X (Word 4)\n", wordData); + PrintAndLogEx(INFO, "Config Breakdown:"); + PrintAndLogEx(INFO, " Data Rate: %02u | "_YELLOW_("RF/%u"), wordData & 0x3F, datarate); + PrintAndLogEx(INFO, " Encoder: %u | " _YELLOW_("%s"), encoder, enc); + PrintAndLogEx(INFO, " PSK CF: %u | %s", PSKcf, cf); + PrintAndLogEx(INFO, " Delay: %u | %s", delay, cdelay); + PrintAndLogEx(INFO, " LastWordR: %02u | Address of last word for default read - meaning %u blocks are output", LWR, numblks); + PrintAndLogEx(INFO, " ReadLogin: %u | Read login is %s", readLogin, readLogin ? _YELLOW_("required") : _GREEN_("not required")); + PrintAndLogEx(INFO, " ReadHKL: %u | Read housekeeping words login is %s", readHKL, readHKL ? _YELLOW_("required") : _GREEN_("not required")); + PrintAndLogEx(INFO, "WriteLogin: %u | Write login is %s", writeLogin, writeLogin ? _YELLOW_("required") : _GREEN_("not required")); + PrintAndLogEx(INFO, " WriteHKL: %u | Write housekeeping words login is %s", writeHKL, writeHKL ? _YELLOW_("required") : _GREEN_("not Required")); + PrintAndLogEx(INFO, " R.A.W.: %u | Read after write is %s", raw, raw ? "on" : "off"); + PrintAndLogEx(INFO, " Disable: %u | Disable command is %s", disable, disable ? "accepted" : "not accepted"); + PrintAndLogEx(INFO, " R.T.F.: %u | Reader talk first is %s", rtf, rtf ? _YELLOW_("enabled") : "disabled"); + PrintAndLogEx(INFO, " Pigeon: %u | Pigeon mode is %s\n", pigeon, pigeon ? _YELLOW_("enabled") : "disabled"); } static void printEM4x05info(uint32_t block0, uint32_t serial) { @@ -1650,36 +1652,36 @@ static void printEM4x05info(uint32_t block0, uint32_t serial) { snprintf(ctstr + strlen(ctstr), sizeof(ctstr) - strlen(ctstr), _YELLOW_("%s"), "Unknown"); break; } - PrintAndLogEx(NORMAL, "%s", ctstr); + PrintAndLogEx(SUCCESS, "%s", ctstr); switch (cap) { case 3: - PrintAndLogEx(NORMAL, " Cap Type: %u | 330pF", cap); + PrintAndLogEx(SUCCESS, " Cap Type: %u | 330pF", cap); break; case 2: - PrintAndLogEx(NORMAL, " Cap Type: %u | %spF", cap, (chipType == 2) ? "75" : "210"); + PrintAndLogEx(SUCCESS, " Cap Type: %u | %spF", cap, (chipType == 2) ? "75" : "210"); break; case 1: - PrintAndLogEx(NORMAL, " Cap Type: %u | 250pF", cap); + PrintAndLogEx(SUCCESS, " Cap Type: %u | 250pF", cap); break; case 0: - PrintAndLogEx(NORMAL, " Cap Type: %u | no resonant capacitor", cap); + PrintAndLogEx(SUCCESS, " Cap Type: %u | no resonant capacitor", cap); break; default: - PrintAndLogEx(NORMAL, " Cap Type: %u | unknown", cap); + PrintAndLogEx(SUCCESS, " Cap Type: %u | unknown", cap); break; } - PrintAndLogEx(NORMAL, " Cust Code: %03u | %s", custCode, (custCode == 0x200) ? "Default" : "Unknown"); + PrintAndLogEx(SUCCESS, " Cust Code: %03u | %s", custCode, (custCode == 0x200) ? "Default" : "Unknown"); if (serial != 0) - PrintAndLogEx(NORMAL, "\n Serial #: " _YELLOW_("%08X") "\n", serial); + PrintAndLogEx(SUCCESS, "\n Serial #: " _YELLOW_("%08X"), serial); } static void printEM4x05ProtectionBits(uint32_t word) { for (uint8_t i = 0; i < 15; i++) { - PrintAndLogEx(NORMAL, " Word: %02u | %s", i, (((1 << i) & word) || i < 2) ? _RED_("write Locked") : "unlocked"); + PrintAndLogEx(INFO, " Word: %02u | %s", i, (((1 << i) & word) || i < 2) ? _RED_("write Locked") : "unlocked"); if (i == 14) - PrintAndLogEx(NORMAL, " Word: %02u | %s", i + 1, (((1 << i) & word) || i < 2) ? _RED_("write locked") : "unlocked"); + PrintAndLogEx(INFO, " Word: %02u | %s", i + 1, (((1 << i) & word) || i < 2) ? _RED_("write locked") : "unlocked"); } } From c11c7ab54533aae7f2640225b8137b7f8ba45de2 Mon Sep 17 00:00:00 2001 From: slurdge <slurdge@slurdge.org> Date: Wed, 10 Jun 2020 23:03:03 +0200 Subject: [PATCH 614/632] Add support for client getting bigbufsize --- armsrc/appmain.c | 9 +++++++++ client/src/cmddata.c | 14 ++++++++------ client/src/cmddata.h | 1 - client/src/cmdlft55xx.c | 2 +- include/pm3_cmd.h | 3 ++- 5 files changed, 20 insertions(+), 9 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 96f133f49..7ba6158c7 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -392,6 +392,7 @@ static void SendCapabilities(void) { capabilities.version = CAPABILITIES_VERSION; capabilities.via_fpc = g_reply_via_fpc; capabilities.via_usb = g_reply_via_usb; + capabilities.bigbuf_size = BigBuf_get_size(); capabilities.baudrate = 0; // no real baudrate for USB-CDC #ifdef WITH_FPC_USART if (g_reply_via_fpc) @@ -2051,11 +2052,15 @@ static void PacketReceived(PacketCommandNG *packet) { } } +extern uint32_t _stack_start; + void __attribute__((noreturn)) AppMain(void) { SpinDelay(100); BigBuf_initialize(); + _stack_start = 0xdeadbeef; + if (common_area.magic != COMMON_AREA_MAGIC || common_area.version != 1) { /* Initialize common area */ memset(&common_area, 0, sizeof(common_area)); @@ -2121,6 +2126,10 @@ void __attribute__((noreturn)) AppMain(void) { for (;;) { WDT_HIT(); + if (_stack_start != 0xdeadbeef) { + Dbprintf("Stack overflow detected! Please increase stack size."); + } + // Check if there is a packet available PacketCommandNG rx; memset(&rx.data, 0, sizeof(rx.data)); diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 326e0d457..99908d1ea 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -567,7 +567,7 @@ int ASKDemod_ext(const char *Cmd, bool verbose, bool emSearch, uint8_t askType, sscanf(Cmd, "%i %i %i %zu %c", &clk, &invert, &maxErr, &maxLen, &); - if (!maxLen) maxLen = BIGBUF_SIZE; + if (!maxLen) maxLen = pm3_capabilities.bigbuf_size; if (invert != 0 && invert != 1) { PrintAndLogEx(WARNING, "Invalid argument: %s", Cmd); @@ -1517,16 +1517,18 @@ static int CmdHexsamples(const char *Cmd) { uint32_t offset = 0; char string_buf[25]; char *string_ptr = string_buf; - uint8_t got[BIGBUF_SIZE]; + uint8_t got[512*1024]; sscanf(Cmd, "%u %u", &requested, &offset); /* if no args send something */ if (requested == 0) requested = 8; + if (requested > pm3_capabilities.bigbuf_size) + requested = pm3_capabilities.bigbuf_size; if (offset + requested > sizeof(got)) { - PrintAndLogEx(NORMAL, "Tried to read past end of buffer, <bytes> + <offset> > %d", BIGBUF_SIZE); + PrintAndLogEx(NORMAL, "Tried to read past end of buffer, <bytes> + <offset> > %d", pm3_capabilities.bigbuf_size); return PM3_EINVARG; } @@ -1595,10 +1597,10 @@ int getSamples(uint32_t n, bool verbose) { // we don't have to worry about remaining trash // in the last byte in case the bits-per-sample // does not line up on byte boundaries - uint8_t got[BIGBUF_SIZE - 1] = { 0 }; + uint8_t got[512*1024] = { 0 }; - if (n == 0 || n > sizeof(got)) - n = sizeof(got); + if (n == 0 || n > pm3_capabilities.bigbuf_size) + n = pm3_capabilities.bigbuf_size; if (verbose) PrintAndLogEx(INFO, "Reading " _YELLOW_("%u") " bytes from device memory", n); diff --git a/client/src/cmddata.h b/client/src/cmddata.h index a7a69e430..abef8fde8 100644 --- a/client/src/cmddata.h +++ b/client/src/cmddata.h @@ -79,7 +79,6 @@ int AskEdgeDetect(const int *in, int *out, int len, int threshold); int demodIdteck(void); #define MAX_DEMOD_BUF_LEN (1024*128) -#define BIGBUF_SIZE 40000 extern uint8_t DemodBuffer[MAX_DEMOD_BUF_LEN]; extern size_t DemodBufferLen; diff --git a/client/src/cmdlft55xx.c b/client/src/cmdlft55xx.c index 6294ffef6..b2f048665 100644 --- a/client/src/cmdlft55xx.c +++ b/client/src/cmdlft55xx.c @@ -2837,7 +2837,7 @@ static int CmdResetRead(const char *Cmd) { if (resp.status == PM3_SUCCESS) { - uint16_t gotsize = BIGBUF_SIZE - 1; + uint16_t gotsize = pm3_capabilities.bigbuf_size - 1; uint8_t *got = calloc(gotsize, sizeof(uint8_t)); if (got == NULL) { PrintAndLogEx(WARNING, "failed to allocate memory"); diff --git a/include/pm3_cmd.h b/include/pm3_cmd.h index b6de6f292..3cafb9df1 100644 --- a/include/pm3_cmd.h +++ b/include/pm3_cmd.h @@ -175,6 +175,7 @@ typedef struct { typedef struct { uint8_t version; uint32_t baudrate; + uint32_t bigbuf_size; bool via_fpc : 1; bool via_usb : 1; // rdv4 @@ -203,7 +204,7 @@ typedef struct { bool hw_available_flash : 1; bool hw_available_smartcard : 1; } PACKED capabilities_t; -#define CAPABILITIES_VERSION 4 +#define CAPABILITIES_VERSION 5 extern capabilities_t pm3_capabilities; // For CMD_LF_T55XX_WRITEBL From 3b757a627bed6dfab479651c438fd93099decd4e Mon Sep 17 00:00:00 2001 From: slurdge <slurdge@slurdge.org> Date: Wed, 10 Jun 2020 23:03:17 +0200 Subject: [PATCH 615/632] Increase stack to 5KiB --- common_arm/ldscript.common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common_arm/ldscript.common b/common_arm/ldscript.common index 8400f740a..9e53d8436 100644 --- a/common_arm/ldscript.common +++ b/common_arm/ldscript.common @@ -9,7 +9,7 @@ ms of the GNU GPL, version 2 or, ----------------------------------------------------------------------------- */ -stacksize = DEFINED(stacksize) ? stacksize : 4K; +stacksize = DEFINED(stacksize) ? stacksize : 5K; commonareasize = 0x20; /* AT91SAM7S256 has 256k Flash and 64k RAM */ From edff230d551236e7341a8f3aebc8aca8e5358714 Mon Sep 17 00:00:00 2001 From: Lukas Kuzmiak <lukash@backstep.net> Date: Wed, 10 Jun 2020 14:59:53 -0700 Subject: [PATCH 616/632] fix a bug in MADInfoByteDecode (did not return 0x00), textual fixes --- client/src/mifare/mad.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/client/src/mifare/mad.c b/client/src/mifare/mad.c index 96ac4f1d1..9a8e20353 100644 --- a/client/src/mifare/mad.c +++ b/client/src/mifare/mad.c @@ -148,7 +148,7 @@ static int madCRCCheck(uint8_t *sector, bool verbose, int MADver) { } else { uint8_t crc = CRC8Mad(§or[1], 15 + 16 + 16); if (crc != sector[0]) { - PrintAndLogEx(WARNING, _RED_("Wrong MAD %d CRC") " calculated: 0x%02x != 0x%02x", MADver, crc, sector[16]); + PrintAndLogEx(WARNING, _RED_("Wrong MAD %d CRC") " calculated: 0x%02x != 0x%02x", MADver, crc, sector[0]); return PM3_ESOFT; }; } @@ -282,10 +282,7 @@ static int MADInfoByteDecode(uint8_t *sector, bool swapmad, int mad_ver, bool ve } } - if (info) { - return info; - } - return PM3_ESOFT; + return info; } int MAD1DecodeAndPrint(uint8_t *sector, bool swapmad, bool verbose, bool *haveMAD2) { @@ -333,8 +330,6 @@ int MAD2DecodeAndPrint(uint8_t *sector, bool swapmad, bool verbose) { PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "------------ " _CYAN_("MAD v2 details") " -------------"); - PrintAndLogEx(INFO, " 16 MAD v2"); - int res = madCRCCheck(sector, true, 2); if (verbose) { if (res == PM3_SUCCESS) @@ -350,6 +345,10 @@ int MAD2DecodeAndPrint(uint8_t *sector, bool swapmad, bool verbose) { PrintAndLogEx(WARNING, "Card publisher " _RED_("not") " present " _YELLOW_("0x%02x"), ibs); } + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "---------------- " _CYAN_("Listing") " ----------------"); + + PrintAndLogEx(INFO, " 16 MAD v2"); uint32_t prev_aid = 0xFFFFFFFF; for (int i = 1; i < 8 + 8 + 7 + 1; i++) { From 73b6138f7f53d441bc18c538e8587de425a3165d Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Thu, 11 Jun 2020 01:18:50 +0200 Subject: [PATCH 617/632] cmddata: Adjust bigbuf size on client side as before but fix 1b overflow --- client/src/cmddata.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 99908d1ea..007c32c8a 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -1517,7 +1517,7 @@ static int CmdHexsamples(const char *Cmd) { uint32_t offset = 0; char string_buf[25]; char *string_ptr = string_buf; - uint8_t got[512*1024]; + uint8_t got[pm3_capabilities.bigbuf_size]; sscanf(Cmd, "%u %u", &requested, &offset); @@ -1597,10 +1597,11 @@ int getSamples(uint32_t n, bool verbose) { // we don't have to worry about remaining trash // in the last byte in case the bits-per-sample // does not line up on byte boundaries - uint8_t got[512*1024] = { 0 }; + uint8_t got[pm3_capabilities.bigbuf_size - 1]; + memset(got, 0x00, sizeof(got)); - if (n == 0 || n > pm3_capabilities.bigbuf_size) - n = pm3_capabilities.bigbuf_size; + if (n == 0 || n > pm3_capabilities.bigbuf_size - 1) + n = pm3_capabilities.bigbuf_size - 1; if (verbose) PrintAndLogEx(INFO, "Reading " _YELLOW_("%u") " bytes from device memory", n); From 35857f535d42b8e42f40675abea1de31e5ff16aa Mon Sep 17 00:00:00 2001 From: slurdge <slurdge@slurdge.org> Date: Thu, 11 Jun 2020 11:14:53 +0200 Subject: [PATCH 618/632] Compute the max usage --- armsrc/appmain.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 7ba6158c7..b9225bed5 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -71,6 +71,8 @@ uint8_t ToSend[TOSEND_BUFFER_SIZE]; int ToSendMax = -1; +extern uint32_t _stack_start, _stack_end; + static int ToSendBit; struct common_area common_area __attribute__((section(".commonarea"))); @@ -359,6 +361,12 @@ static void SendStatus(void) { #endif printConnSpeed(); DbpString(_BLUE_("Various")); + for (uint32_t *p = &_stack_start; ; ++p) { + if (*p != 0xdeadbeef) { + Dbprintf(" Max stack usage.........%d", (&_stack_end - p)*4); + break; + } + } Dbprintf(" DBGLEVEL................%d", DBGLEVEL); Dbprintf(" ToSendMax...............%d", ToSendMax); Dbprintf(" ToSendBit...............%d", ToSendBit); @@ -2052,15 +2060,15 @@ static void PacketReceived(PacketCommandNG *packet) { } } -extern uint32_t _stack_start; - void __attribute__((noreturn)) AppMain(void) { SpinDelay(100); BigBuf_initialize(); - _stack_start = 0xdeadbeef; - + for (uint32_t * p = &_stack_start; p < (&_stack_end) - 0x80; ++p) { + *p = 0xdeadbeef; + } + if (common_area.magic != COMMON_AREA_MAGIC || common_area.version != 1) { /* Initialize common area */ memset(&common_area, 0, sizeof(common_area)); From 53c5456f7ac7607b4eff516d559f8aae013608c8 Mon Sep 17 00:00:00 2001 From: slurdge <slurdge@slurdge.org> Date: Thu, 11 Jun 2020 11:35:15 +0200 Subject: [PATCH 619/632] Fix ptr arithmetic hopefully --- armsrc/appmain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index b9225bed5..a4b5fc6a7 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -2065,7 +2065,7 @@ void __attribute__((noreturn)) AppMain(void) { SpinDelay(100); BigBuf_initialize(); - for (uint32_t * p = &_stack_start; p < (&_stack_end) - 0x80; ++p) { + for (uint32_t * p = &_stack_start; p < ((uint32_t *)(uintptr_t)&_stack_end) - 0x80; ++p) { *p = 0xdeadbeef; } From 05ed3f7018207b350887f7a4ce17a558e994fdad Mon Sep 17 00:00:00 2001 From: slurdge <slurdge@slurdge.org> Date: Thu, 11 Jun 2020 12:12:20 +0200 Subject: [PATCH 620/632] Second try to fix appveyor --- armsrc/appmain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index a4b5fc6a7..28e2d9625 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -2065,7 +2065,7 @@ void __attribute__((noreturn)) AppMain(void) { SpinDelay(100); BigBuf_initialize(); - for (uint32_t * p = &_stack_start; p < ((uint32_t *)(uintptr_t)&_stack_end) - 0x80; ++p) { + for (uint32_t * p = &_stack_start; p < (uint32_t *)((uintptr_t)&_stack_end - 0x200); ++p) { *p = 0xdeadbeef; } From 54cbaf5b879e150ca3bd721746085bfac9944c75 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Thu, 11 Jun 2020 13:24:55 +0200 Subject: [PATCH 621/632] textual --- armsrc/appmain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 28e2d9625..9897cefc1 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -363,7 +363,7 @@ static void SendStatus(void) { DbpString(_BLUE_("Various")); for (uint32_t *p = &_stack_start; ; ++p) { if (*p != 0xdeadbeef) { - Dbprintf(" Max stack usage.........%d", (&_stack_end - p)*4); + Dbprintf(" Max stack usage so far..%d", (&_stack_end - p)*4); break; } } From 688d3388ba1a4ec38a5eb030aa5de896a9fb9401 Mon Sep 17 00:00:00 2001 From: slurdge <slurdge@users.noreply.github.com> Date: Thu, 11 Jun 2020 13:55:34 +0200 Subject: [PATCH 622/632] Add stack size to CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c4ec4c2c..3975e12cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Fix stack size and automatically use available space for BigBuf. Stack is now 5K (@slurdge) - Added Mifare MAD Card Holder Information decoding (@lukaskuzmiak) - Change Better precision for HF and LF voltage measurements and Add theremin.py script (@rosco) - Added Mifare MAD Info Byte decoding. Easier to identify Card Publisher (@lukaskuzmiak) From 5f148bb8353533fadeb1ac11a844faacd9e79122 Mon Sep 17 00:00:00 2001 From: slurdge <slurdge@slurdge.org> Date: Thu, 11 Jun 2020 16:21:27 +0200 Subject: [PATCH 623/632] Happy colors for messages coming from pm3 --- client/src/comms.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/comms.c b/client/src/comms.c index d67fccc11..9763504d4 100644 --- a/client/src/comms.c +++ b/client/src/comms.c @@ -289,7 +289,7 @@ static void PacketResponseReceived(PacketResponseNG *packet) { } if (flag & FLAG_LOG) { - PrintAndLogEx(NORMAL, "#db# %s", s); + PrintAndLogEx(NORMAL, "[" _MAGENTA_("pm3") "] ["_BLUE_("#")"] " "%s", s); } else { if (flag & FLAG_INPLACE) printf("\r"); @@ -303,7 +303,7 @@ static void PacketResponseReceived(PacketResponseNG *packet) { } case CMD_DEBUG_PRINT_INTEGERS: { if (! packet->ng) - PrintAndLogEx(NORMAL, "#db# %" PRIx64 ", %" PRIx64 ", %" PRIx64 "", packet->oldarg[0], packet->oldarg[1], packet->oldarg[2]); + PrintAndLogEx(NORMAL, "[" _MAGENTA_("pm3") "] ["_BLUE_("#")"] " "%" PRIx64 ", %" PRIx64 ", %" PRIx64 "", packet->oldarg[0], packet->oldarg[1], packet->oldarg[2]); break; } // iceman: hw status - down the path on device, runs printusbspeed which starts sending a lot of From 3832cf26fd24492a076380ed6297786f24405e0b Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Thu, 11 Jun 2020 19:20:59 +0200 Subject: [PATCH 624/632] color --- armsrc/BigBuf.c | 4 ++-- armsrc/appmain.c | 6 +++--- armsrc/flashmem.c | 4 ++-- armsrc/fpgaloader.c | 2 +- armsrc/i2c.c | 40 +++++++++++++++++++++++++--------------- armsrc/lfops.c | 2 +- armsrc/lfsampling.c | 2 +- armsrc/spiffs.c | 6 +++--- 8 files changed, 38 insertions(+), 28 deletions(-) diff --git a/armsrc/BigBuf.c b/armsrc/BigBuf.c index 20e2e3e2d..6d272f571 100644 --- a/armsrc/BigBuf.c +++ b/armsrc/BigBuf.c @@ -114,10 +114,10 @@ void BigBuf_free_keep_EM(void) { } void BigBuf_print_status(void) { - DbpString(_BLUE_("Memory")); + DbpString(_CYAN_("Memory")); Dbprintf(" BigBuf_size.............%d", BigBuf_size); Dbprintf(" Available memory........%d", BigBuf_hi); - DbpString(_BLUE_("Tracing")); + DbpString(_CYAN_("Tracing")); Dbprintf(" tracing ................%d", tracing); Dbprintf(" traceLen ...............%d", traceLen); } diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 9897cefc1..afa822c7f 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -320,7 +320,7 @@ static void TimingIntervalAcquisition(void) { // measure the Connection Speed by sending SpeedTestBufferSize bytes to client and measuring the elapsed time. // Note: this mimics GetFromBigbuf(), i.e. we have the overhead of the PacketCommandNG structure included. static void printConnSpeed(void) { - DbpString(_BLUE_("Transfer Speed")); + DbpString(_CYAN_("Transfer Speed")); Dbprintf(" Sending packets to client..."); #define CONN_SPEED_TEST_MIN_TIME 500 // in milliseconds @@ -360,7 +360,7 @@ static void SendStatus(void) { printT55xxConfig(); // LF T55XX Config #endif printConnSpeed(); - DbpString(_BLUE_("Various")); + DbpString(_CYAN_("Various")); for (uint32_t *p = &_stack_start; ; ++p) { if (*p != 0xdeadbeef) { Dbprintf(" Max stack usage so far..%d", (&_stack_end - p)*4); @@ -385,7 +385,7 @@ static void SendStatus(void) { Dbprintf(_YELLOW_(" Slow Clock actual speed seems closer to %d kHz"), (16 * MAINCK / 1000) / mainf * delta_time / SLCK_CHECK_MS); } - DbpString(_BLUE_("Installed StandAlone Mode")); + DbpString(_CYAN_("Installed StandAlone Mode")); ModInfo(); #ifdef WITH_FLASH diff --git a/armsrc/flashmem.c b/armsrc/flashmem.c index 66b4813e4..f09ae8c40 100644 --- a/armsrc/flashmem.c +++ b/armsrc/flashmem.c @@ -523,7 +523,7 @@ void Flash_EraseChip(void) { */ void Flashmem_print_status(void) { - DbpString(_BLUE_("Flash memory")); + DbpString(_CYAN_("Flash memory")); Dbprintf(" Baudrate................" _GREEN_("%d MHz"), FLASHMEM_SPIBAUDRATE / 1000000); if (!FlashInit()) { @@ -562,7 +562,7 @@ void Flashmem_print_info(void) { if (!FlashInit()) return; - DbpString(_BLUE_("Flash memory dictionary loaded")); + DbpString(_CYAN_("Flash memory dictionary loaded")); // load dictionary offsets. uint8_t keysum[2]; diff --git a/armsrc/fpgaloader.c b/armsrc/fpgaloader.c index d0607d28d..f1f157eec 100644 --- a/armsrc/fpgaloader.c +++ b/armsrc/fpgaloader.c @@ -507,7 +507,7 @@ void SetAdcMuxFor(uint32_t whichGpio) { } void Fpga_print_status(void) { - DbpString(_BLUE_("Currently loaded FPGA image")); + DbpString(_CYAN_("Current FPGA image")); Dbprintf(" mode....................%s", g_fpga_version_information[downloaded_bitstream - 1]); } diff --git a/armsrc/i2c.c b/armsrc/i2c.c index e3e84690e..7e7ba4605 100644 --- a/armsrc/i2c.c +++ b/armsrc/i2c.c @@ -27,12 +27,12 @@ #define SDA_H HIGH(GPIO_SDA) #define SDA_L LOW(GPIO_SDA) -#define SCL_read (AT91C_BASE_PIOA->PIO_PDSR & GPIO_SCL) -#define SDA_read (AT91C_BASE_PIOA->PIO_PDSR & GPIO_SDA) +#define SCL_read ((AT91C_BASE_PIOA->PIO_PDSR & GPIO_SCL) == GPIO_SCL) +#define SDA_read ((AT91C_BASE_PIOA->PIO_PDSR & GPIO_SDA) == GPIO_SDA) #define I2C_ERROR "I2C_WaitAck Error" -static volatile unsigned long c; +static volatile uint32_t c; // Direct use the loop to delay. 6 instructions loop, Masterclock 48MHz, // delay=1 is about 200kbps @@ -47,6 +47,12 @@ static void __attribute__((optimize("O0"))) I2CSpinDelayClk(uint16_t delay) { #define I2C_DELAY_2CLK I2CSpinDelayClk(2) #define I2C_DELAY_XCLK(x) I2CSpinDelayClk((x)) +#define I2C_DELAY_100us I2CSpinDelayClk( 100 / 3) +#define I2C_DELAY_600us I2CSpinDelayClk( 600 / 3) +#define I2C_DELAY_10ms I2CSpinDelayClk( 10 * 1000 / 3 ) +#define I2C_DELAY_30ms I2CSpinDelayClk( 30 * 1000 / 3 ) +#define I2C_DELAY_100ms I2CSpinDelayClk( 100 * 1000 / 3) + #define ISO7618_MAX_FRAME 255 // try i2c bus recovery at 100kHz = 5us high, 5us low @@ -69,6 +75,7 @@ void I2C_recovery(void) { //a STOP signal (SDA from low to high while CLK is high) SDA_L; WaitUS(5); + SCL_H; WaitUS(2); SDA_H; @@ -127,11 +134,11 @@ void I2C_Reset_EnterMainProgram(void) { StartTicks(); I2C_init(); I2C_SetResetStatus(0, 0, 0); - WaitMS(30); + I2C_DELAY_30ms; I2C_SetResetStatus(1, 0, 0); - WaitMS(30); + I2C_DELAY_30ms; I2C_SetResetStatus(1, 1, 1); - WaitMS(10); + I2C_DELAY_10ms; } // Reset the SIM_Adapter, then enter the bootloader program @@ -140,9 +147,9 @@ void I2C_Reset_EnterBootloader(void) { StartTicks(); I2C_init(); I2C_SetResetStatus(0, 1, 1); - WaitMS(100); + I2C_DELAY_100ms; I2C_SetResetStatus(1, 1, 1); - WaitMS(10); + I2C_DELAY_10ms; } // Wait for the clock to go High. @@ -180,13 +187,13 @@ static bool WaitSCL_L(void) { // It timeout reading response from card // Which ever comes first static bool WaitSCL_L_timeout(void) { - volatile uint16_t delay = 1800; + volatile uint32_t delay = 18000; while (delay--) { // exit on SCL LOW if (!SCL_read) return true; - WaitMS(1); + I2C_DELAY_100us; } return (delay == 0); } @@ -218,7 +225,7 @@ static bool I2C_WaitForSim(void) { // 8051 speaks with smart card. // 1000*50*3.07 = 153.5ms // 1byte transfer == 1ms with max frame being 256bytes - if (!WaitSCL_H_delay(10 * 1000 * 50)) + if (!WaitSCL_H_delay(20 * 1000 * 50)) return false; return true; @@ -433,7 +440,9 @@ int16_t I2C_BufferRead(uint8_t *data, uint8_t len, uint8_t device_cmd, uint8_t d // extra wait 500us (514us measured) // 200us (xx measured) - WaitUS(600); +// WaitUS(600); + I2C_DELAY_600us; + bool bBreak = true; uint16_t readcount = 0; @@ -474,7 +483,7 @@ int16_t I2C_BufferRead(uint8_t *data, uint8_t len, uint8_t device_cmd, uint8_t d *data = (uint8_t)tmp & 0xFF; len--; - // 读取的第一个字节为后续长度 + // The first byte in response is the message length if (!readcount && (len > *data)) { len = *data; @@ -601,7 +610,7 @@ bool I2C_WriteFW(uint8_t *data, uint8_t len, uint8_t msb, uint8_t lsb, uint8_t d } void I2C_print_status(void) { - DbpString(_BLUE_("Smart card module (ISO 7816)")); + DbpString(_CYAN_("Smart card module (ISO 7816)")); uint8_t maj, min; if (I2C_get_version(&maj, &min) == PM3_SUCCESS) Dbprintf(" version................." _YELLOW_("v%x.%02d"), maj, min); @@ -799,7 +808,8 @@ void SmartCardUpgrade(uint64_t arg0) { } // writing takes time. - WaitMS(50); +// WaitMS(50); + I2C_DELAY_100ms; // read res = I2C_ReadFW(verfiydata, size, msb, lsb, I2C_DEVICE_ADDRESS_BOOT); diff --git a/armsrc/lfops.c b/armsrc/lfops.c index 72559a7b9..03c6c5164 100644 --- a/armsrc/lfops.c +++ b/armsrc/lfops.c @@ -198,7 +198,7 @@ void printT55xxConfig(void) { #define PRN_NA sprintf(s + strlen(s), _RED_("N/A") " | "); - DbpString(_BLUE_("LF T55XX config")); + DbpString(_CYAN_("LF T55XX config")); Dbprintf(" [r] [a] [b] [c] [d] [e] [f] [g]"); Dbprintf(" mode |start|write|write|write| read|write|write"); Dbprintf(" | gap | gap | 0 | 1 | gap | 2 | 3"); diff --git a/armsrc/lfsampling.c b/armsrc/lfsampling.c index db73ce385..f74101573 100644 --- a/armsrc/lfsampling.c +++ b/armsrc/lfsampling.c @@ -31,7 +31,7 @@ static sample_config config = { 1, 8, 1, LF_DIVISOR_125, 0, 0, 1} ; void printConfig(void) { uint32_t d = config.divisor; - DbpString(_BLUE_("LF Sampling config")); + DbpString(_CYAN_("LF Sampling config")); Dbprintf(" [q] divisor.............%d ( "_GREEN_("%d.%02d kHz")" )", d, 12000 / (d + 1), ((1200000 + (d + 1) / 2) / (d + 1)) - ((12000 / (d + 1)) * 100)); Dbprintf(" [b] bits per sample.....%d", config.bits_per_sample); Dbprintf(" [d] decimation..........%d", config.decimation); diff --git a/armsrc/spiffs.c b/armsrc/spiffs.c index 4267412c5..025146b55 100644 --- a/armsrc/spiffs.c +++ b/armsrc/spiffs.c @@ -536,13 +536,13 @@ int rdv40_spiffs_read_as_filetype(char *filename, uint8_t *dst, uint32_t size, R //////////////////////////////////////////////////////////////////////////////// ///////// MISC HIGH LEVEL FUNCTIONS //////////////////////////////////////////// -#define SPIFFS_BANNER DbpString(_BLUE_("Flash Memory FileSystem tree (SPIFFS)")); +#define SPIFFS_BANNER DbpString(_CYAN_("Flash Memory FileSystem tree (SPIFFS)")); void rdv40_spiffs_safe_print_fsinfo(void) { rdv40_spiffs_fsinfo fsinfo; rdv40_spiffs_getfsinfo(&fsinfo, RDV40_SPIFFS_SAFETY_SAFE); - DbpString(_BLUE_("Flash Memory FileSystem Info (SPIFFS)")); + DbpString(_CYAN_("Flash Memory FileSystem Info (SPIFFS)")); Dbprintf(" Logical Block Size........." _YELLOW_("%d")" bytes", fsinfo.blockSize); @@ -570,7 +570,7 @@ void rdv40_spiffs_safe_print_fsinfo(void) { void rdv40_spiffs_safe_print_tree(uint8_t banner) { if (banner) { - DbpString(_BLUE_("Flash Memory FileSystem tree (SPIFFS)")); + DbpString(_CYAN_("Flash Memory FileSystem tree (SPIFFS)")); Dbprintf("-------------------------------------"); } From fc5feffa4b691e437d7be1e59cccbe434d0eace3 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Thu, 11 Jun 2020 19:23:15 +0200 Subject: [PATCH 625/632] color --- client/src/cmdsmartcard.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdsmartcard.c b/client/src/cmdsmartcard.c index 2931b33fd..009e876c8 100644 --- a/client/src/cmdsmartcard.c +++ b/client/src/cmdsmartcard.c @@ -712,7 +712,7 @@ static int CmdSmartInfo(const char *Cmd) { memcpy(&card, (smart_card_atr_t *)resp.data.asBytes, sizeof(smart_card_atr_t)); // print header - PrintAndLogEx(INFO, "--- Smartcard Information ---------"); + PrintAndLogEx(INFO, "--- " _CYAN_("Smartcard Information") " ---------"); PrintAndLogEx(INFO, "-------------------------------------------------------------"); PrintAndLogEx(INFO, "ISO7618-3 ATR : %s", sprint_hex(card.atr, card.atr_len)); PrintAndLogEx(INFO, "http://smartcard-atr.apdu.fr/parse?ATR=%s", sprint_hex_inrow(card.atr, card.atr_len)); From 6a8ea64feb5caecc3020687cae2c87ec44821aa0 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Thu, 11 Jun 2020 19:53:21 +0200 Subject: [PATCH 626/632] text --- client/src/cmdhficlass.c | 46 +++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 396511efd..1960eb426 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -465,27 +465,27 @@ static void mem_app_config(const picopass_hdr *hdr) { if (applimit < 6) applimit = 26; if (kb == 2 && (applimit > 0x1f)) applimit = 26; - PrintAndLogEx(NORMAL, " Mem: %u KBits/%u App Areas (%u * 8 bytes) [%02X]", kb, app_areas, max_blk, mem); - PrintAndLogEx(NORMAL, " AA1: blocks 06-%02X", applimit); - PrintAndLogEx(NORMAL, " AA2: blocks %02X-%02X", applimit + 1, max_blk); - PrintAndLogEx(NORMAL, " OTP: 0x%02X%02X", hdr->conf.otp[1], hdr->conf.otp[0]); - PrintAndLogEx(NORMAL, " KeyAccess:"); + PrintAndLogEx(INFO, " Mem: %u KBits/%u App Areas (%u * 8 bytes) [%02X]", kb, app_areas, max_blk, mem); + PrintAndLogEx(INFO, " AA1: blocks 06-%02X", applimit); + PrintAndLogEx(INFO, " AA2: blocks %02X-%02X", applimit + 1, max_blk); + PrintAndLogEx(INFO, " OTP: 0x%02X%02X", hdr->conf.otp[1], hdr->conf.otp[0]); + PrintAndLogEx(INFO, " KeyAccess:"); uint8_t book = isset(mem, 0x20); if (book) { - PrintAndLogEx(NORMAL, " Read A - Kd"); - PrintAndLogEx(NORMAL, " Read B - Kc"); - PrintAndLogEx(NORMAL, " Write A - Kd"); - PrintAndLogEx(NORMAL, " Write B - Kc"); - PrintAndLogEx(NORMAL, " Debit - Kd or Kc"); - PrintAndLogEx(NORMAL, " Credit - Kc"); + PrintAndLogEx(INFO, " Read A - Kd"); + PrintAndLogEx(INFO, " Read B - Kc"); + PrintAndLogEx(INFO, " Write A - Kd"); + PrintAndLogEx(INFO, " Write B - Kc"); + PrintAndLogEx(INFO, " Debit - Kd or Kc"); + PrintAndLogEx(INFO, " Credit - Kc"); } else { - PrintAndLogEx(NORMAL, " Read A - Kd or Kc"); - PrintAndLogEx(NORMAL, " Read B - Kd or Kc"); - PrintAndLogEx(NORMAL, " Write A - Kc"); - PrintAndLogEx(NORMAL, " Write B - Kc"); - PrintAndLogEx(NORMAL, " Debit - Kd or Kc"); - PrintAndLogEx(NORMAL, " Credit - Kc"); + PrintAndLogEx(INFO, " Read A - Kd or Kc"); + PrintAndLogEx(INFO, " Read B - Kd or Kc"); + PrintAndLogEx(INFO, " Write A - Kc"); + PrintAndLogEx(INFO, " Write B - Kc"); + PrintAndLogEx(INFO, " Debit - Kd or Kc"); + PrintAndLogEx(INFO, " Credit - Kc"); } } @@ -2943,7 +2943,7 @@ int readIclass(bool loop, bool verbose) { if (readStatus & FLAG_ICLASS_READER_CSN) { PrintAndLogEx(NORMAL, "\n"); - PrintAndLogEx(SUCCESS, " CSN: %s", sprint_hex(data, 8)); + PrintAndLogEx(SUCCESS, " CSN: " _YELLOW_("%s"), sprint_hex(data, 8)); tagFound = true; } @@ -2964,17 +2964,19 @@ int readIclass(bool loop, bool verbose) { bool se_enabled = (memcmp((uint8_t *)(data + 8 * 5), "\xff\xff\xff\x00\x06\xff\xff\xff", 8) == 0); PrintAndLogEx(SUCCESS, " App IA: %s", sprint_hex(data + 8 * 5, 8)); + PrintAndLogEx(INFO, "------ " _CYAN_("fingerprint") " ------"); if (isHidRange) { + PrintAndLogEx(SUCCESS, _YELLOW_(" iClass")" (CSN is in HID range)"); + if (legacy) - PrintAndLogEx(SUCCESS, " : Possible iClass - "_YELLOW_("legacy")" credential tag"); + PrintAndLogEx(SUCCESS, " possible "_YELLOW_("iClass legacy")" credential"); if (se_enabled) - PrintAndLogEx(SUCCESS, " : Possible iClass - "_YELLOW_("SE")" credential tag"); + PrintAndLogEx(SUCCESS, " possible "_YELLOW_("iClass SE")" credential"); - PrintAndLogEx(SUCCESS, " : Tag is "_YELLOW_("iClass")", CSN is in HID range"); } else { - PrintAndLogEx(SUCCESS, " : Tag is "_YELLOW_("PicoPass")", CSN is not in HID range"); + PrintAndLogEx(SUCCESS, _YELLOW_(" PicoPass")" (CSN is not in HID range)"); } } From c716bb9e3176d2b2883255eea401c2c95ab21c2e Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Thu, 11 Jun 2020 20:11:44 +0200 Subject: [PATCH 627/632] textual, color, and "hf iclass info" does something --- client/src/cmdhficlass.c | 61 ++++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 1960eb426..98fd29562 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -388,34 +388,34 @@ static void fuse_config(const picopass_hdr *hdr) { uint8_t fuses = hdr->conf.fuses; if (isset(fuses, FUSE_FPERS)) - PrintAndLogEx(SUCCESS, " Mode: Personalization [Programmable]"); + PrintAndLogEx(SUCCESS, " Mode: " _GREEN_("Personalization [programmable]")); else - PrintAndLogEx(SUCCESS, " Mode: Application [Locked]"); + PrintAndLogEx(SUCCESS, " Mode: " _YELLOW_("Application [locked]")); if (isset(fuses, FUSE_CODING1)) { - PrintAndLogEx(SUCCESS, " Coding: RFU"); + PrintAndLogEx(SUCCESS, "Coding: RFU"); } else { if (isset(fuses, FUSE_CODING0)) - PrintAndLogEx(SUCCESS, " Coding: ISO 14443-2 B/ISO 15693"); + PrintAndLogEx(SUCCESS, "Coding: " _YELLOW_("ISO 14443-2 B / 15693")); else - PrintAndLogEx(SUCCESS, " Coding: ISO 14443B only"); + PrintAndLogEx(SUCCESS, "Coding: " _YELLOW_("ISO 14443-B only")); } // 1 1 - if (isset(fuses, FUSE_CRYPT1) && isset(fuses, FUSE_CRYPT0)) PrintAndLogEx(SUCCESS, " Crypt: Secured page, keys not locked"); + if (isset(fuses, FUSE_CRYPT1) && isset(fuses, FUSE_CRYPT0)) PrintAndLogEx(SUCCESS, " Crypt: Secured page, " _GREEN_("keys not locked")); // 1 0 - if (isset(fuses, FUSE_CRYPT1) && notset(fuses, FUSE_CRYPT0)) PrintAndLogEx(NORMAL, " Crypt: Secured page, keys locked"); + if (isset(fuses, FUSE_CRYPT1) && notset(fuses, FUSE_CRYPT0)) PrintAndLogEx(INFO, " Crypt: Secured page, keys locked"); // 0 1 - if (notset(fuses, FUSE_CRYPT1) && isset(fuses, FUSE_CRYPT0)) PrintAndLogEx(SUCCESS, " Crypt: Non secured page"); + if (notset(fuses, FUSE_CRYPT1) && isset(fuses, FUSE_CRYPT0)) PrintAndLogEx(SUCCESS, " Crypt: Non secured page"); // 0 0 - if (notset(fuses, FUSE_CRYPT1) && notset(fuses, FUSE_CRYPT0)) PrintAndLogEx(NORMAL, " Crypt: No auth possible. Read only if RA is enabled"); + if (notset(fuses, FUSE_CRYPT1) && notset(fuses, FUSE_CRYPT0)) PrintAndLogEx(INFO, " Crypt: No auth possible. Read only if RA is enabled"); if (isset(fuses, FUSE_RA)) PrintAndLogEx(SUCCESS, " RA: Read access enabled"); else - PrintAndLogEx(WARNING, " RA: Read access not enabled"); + PrintAndLogEx(INFO, " RA: Read access not enabled"); - PrintAndLogEx(INFO, " Block write lock: %02x", hdr->conf.block_writelock); - PrintAndLogEx(INFO, " EAS: %02x", hdr->conf.eas); + PrintAndLogEx(INFO, " Block write lock 0x%02X", hdr->conf.block_writelock); + PrintAndLogEx(INFO, " EAS 0x%02X", hdr->conf.eas); } @@ -465,27 +465,28 @@ static void mem_app_config(const picopass_hdr *hdr) { if (applimit < 6) applimit = 26; if (kb == 2 && (applimit > 0x1f)) applimit = 26; - PrintAndLogEx(INFO, " Mem: %u KBits/%u App Areas (%u * 8 bytes) [%02X]", kb, app_areas, max_blk, mem); - PrintAndLogEx(INFO, " AA1: blocks 06-%02X", applimit); - PrintAndLogEx(INFO, " AA2: blocks %02X-%02X", applimit + 1, max_blk); - PrintAndLogEx(INFO, " OTP: 0x%02X%02X", hdr->conf.otp[1], hdr->conf.otp[0]); - PrintAndLogEx(INFO, " KeyAccess:"); + PrintAndLogEx(INFO, "------ " _CYAN_("Memory") "------"); + PrintAndLogEx(INFO, " %u KBits/%u App Areas (%u * 8 bytes) [%02X]", kb, app_areas, max_blk, mem); + PrintAndLogEx(INFO, " AA1 blocks 06-%02X", applimit); + PrintAndLogEx(INFO, " AA2 blocks %02X-%02X", applimit + 1, max_blk); + PrintAndLogEx(INFO, " OTP 0x%02X%02X", hdr->conf.otp[1], hdr->conf.otp[0]); + PrintAndLogEx(INFO, "------ " _CYAN_("KeyAccess") "------"); uint8_t book = isset(mem, 0x20); if (book) { - PrintAndLogEx(INFO, " Read A - Kd"); - PrintAndLogEx(INFO, " Read B - Kc"); + PrintAndLogEx(INFO, " Read A - Kd"); + PrintAndLogEx(INFO, " Read B - Kc"); PrintAndLogEx(INFO, " Write A - Kd"); PrintAndLogEx(INFO, " Write B - Kc"); - PrintAndLogEx(INFO, " Debit - Kd or Kc"); - PrintAndLogEx(INFO, " Credit - Kc"); + PrintAndLogEx(INFO, " Debit - Kd or Kc"); + PrintAndLogEx(INFO, " Credit - Kc"); } else { - PrintAndLogEx(INFO, " Read A - Kd or Kc"); - PrintAndLogEx(INFO, " Read B - Kd or Kc"); + PrintAndLogEx(INFO, " Read A - Kd or Kc"); + PrintAndLogEx(INFO, " Read B - Kd or Kc"); PrintAndLogEx(INFO, " Write A - Kc"); PrintAndLogEx(INFO, " Write B - Kc"); - PrintAndLogEx(INFO, " Debit - Kd or Kc"); - PrintAndLogEx(INFO, " Credit - Kc"); + PrintAndLogEx(INFO, " Debit - Kd or Kc"); + PrintAndLogEx(INFO, " Credit - Kc"); } } @@ -689,14 +690,14 @@ static int CmdHFiClassSim(const char *Cmd) { } static int CmdHFiClassInfo(const char *Cmd) { - return PM3_SUCCESS; + return readIclass(false, true); } static int CmdHFiClassReader(const char *Cmd) { char cmdp = tolower(param_getchar(Cmd, 0)); if (cmdp == 'h') return usage_hf_iclass_reader(); - bool findone = (cmdp == '1') ? false : true; - return readIclass(findone, true); + bool loop_read = (cmdp == '1') ? false : true; + return readIclass(loop_read, true); } static int CmdHFiClassReader_Replay(const char *Cmd) { @@ -2967,7 +2968,7 @@ int readIclass(bool loop, bool verbose) { PrintAndLogEx(INFO, "------ " _CYAN_("fingerprint") " ------"); if (isHidRange) { - PrintAndLogEx(SUCCESS, _YELLOW_(" iClass")" (CSN is in HID range)"); + PrintAndLogEx(SUCCESS, _YELLOW_("iClass")" (CSN is in HID range)"); if (legacy) PrintAndLogEx(SUCCESS, " possible "_YELLOW_("iClass legacy")" credential"); @@ -2976,7 +2977,7 @@ int readIclass(bool loop, bool verbose) { PrintAndLogEx(SUCCESS, " possible "_YELLOW_("iClass SE")" credential"); } else { - PrintAndLogEx(SUCCESS, _YELLOW_(" PicoPass")" (CSN is not in HID range)"); + PrintAndLogEx(SUCCESS, _YELLOW_("PicoPass")" (CSN is not in HID range)"); } } From 6dc0aa53c70ff5959f3548809af92675b52f22bf Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Thu, 11 Jun 2020 20:58:31 +0200 Subject: [PATCH 628/632] textual... --- client/src/comms.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/client/src/comms.c b/client/src/comms.c index 9763504d4..df4c404df 100644 --- a/client/src/comms.c +++ b/client/src/comms.c @@ -115,11 +115,11 @@ void SendCommandOLD(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, v static void SendCommandNG_internal(uint16_t cmd, uint8_t *data, size_t len, bool ng) { #ifdef COMMS_DEBUG - PrintAndLogEx(NORMAL, "Sending %s", ng ? "NG" : "MIX"); + PrintAndLogEx(INFO, "Sending %s", ng ? "NG" : "MIX"); #endif if (!session.pm3_present) { - PrintAndLogEx(NORMAL, "Sending bytes to proxmark failed - offline"); + PrintAndLogEx(INFO, "Sending bytes to proxmark failed - offline"); return; } if (len > PM3_CMD_DATA_SIZE) { @@ -289,7 +289,8 @@ static void PacketResponseReceived(PacketResponseNG *packet) { } if (flag & FLAG_LOG) { - PrintAndLogEx(NORMAL, "[" _MAGENTA_("pm3") "] ["_BLUE_("#")"] " "%s", s); + //PrintAndLogEx(NORMAL, "[" _MAGENTA_("pm3") "] ["_BLUE_("#")"] " "%s", s); + PrintAndLogEx(NORMAL, "[" _BLUE_("#") "] %s", s); } else { if (flag & FLAG_INPLACE) printf("\r"); From c460dcf12d22961811c67ed83245641cbe5447e5 Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Fri, 12 Jun 2020 00:37:48 +0200 Subject: [PATCH 629/632] test prox --- client/dictionaries/t55xx_default_pwds.dic | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/dictionaries/t55xx_default_pwds.dic b/client/dictionaries/t55xx_default_pwds.dic index 511be26d1..c35014d79 100644 --- a/client/dictionaries/t55xx_default_pwds.dic +++ b/client/dictionaries/t55xx_default_pwds.dic @@ -24,6 +24,8 @@ A5B4C3D2 575F4F4B # 50520901 +# default PROX +50524F58 # Default pwd, simple: 00000000 11111111 From 47262ce1e936936e5a640f86377861f8b5bb5fcf Mon Sep 17 00:00:00 2001 From: iceman1001 <iceman@iuse.se> Date: Fri, 12 Jun 2020 01:34:42 +0200 Subject: [PATCH 630/632] fix #777 thanks @doegox --- pm3 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pm3 b/pm3 index 73f2cac46..59960fe7c 100755 --- a/pm3 +++ b/pm3 @@ -115,7 +115,7 @@ function get_pm3_list_Windows { # Need to look for this first, the call to Win32_serialport "crashes" then native bt serial port. Don't ask why. #BT direct SERIAL PORTS (COM) if $FINDBTRFCOMM; then - for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_PnPEntity | Where-Object Caption -like 'Standard Serial over Bluetooth link (COM*' | Select Name" 2> /dev/null | awk '$0 ~ /COM/{print substr($6,2,4)}'); do + for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_PnPEntity | Where-Object Caption -like 'Standard Serial over Bluetooth link (COM*' | Select Name" 2> /dev/null | awk '$0 ~ /COM/{print substr($6,2,5)}'); do DEV=${DEV/ */} PM3LIST+=("$DEV") if [ ${#PM3LIST[*]} -ge "$N" ]; then @@ -152,7 +152,7 @@ function get_pm3_list_WSL { # Need to look for this first, the call to Win32_serialport "crashes" then native bt serial port. Don't ask why. #BT direct SERIAL PORTS (COM) if $FINDBTRFCOMM; then - for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_PnPEntity | Where-Object Caption -like 'Standard Serial over Bluetooth link (COM*' | Select Name" 2> /dev/null | awk '$0 ~ /COM/{print substr($6,2,4)}'); do + for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_PnPEntity | Where-Object Caption -like 'Standard Serial over Bluetooth link (COM*' | Select Name" 2> /dev/null | awk '$0 ~ /COM/{print substr($6,2,5)}'); do DEV=${DEV/ */} DEV="/dev/ttyS${DEV#COM}" From d229364a2143b4448fc6bceb0f843d8430206332 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Fri, 12 Jun 2020 02:00:55 +0200 Subject: [PATCH 631/632] Variant for fix #777 independent of sentence and nr of com port digits --- pm3 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pm3 b/pm3 index 59960fe7c..c3829b796 100755 --- a/pm3 +++ b/pm3 @@ -115,7 +115,7 @@ function get_pm3_list_Windows { # Need to look for this first, the call to Win32_serialport "crashes" then native bt serial port. Don't ask why. #BT direct SERIAL PORTS (COM) if $FINDBTRFCOMM; then - for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_PnPEntity | Where-Object Caption -like 'Standard Serial over Bluetooth link (COM*' | Select Name" 2> /dev/null | awk '$0 ~ /COM/{print substr($6,2,5)}'); do + for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_PnPEntity | Where-Object Caption -like 'Standard Serial over Bluetooth link (COM*' | Select Name" 2> /dev/null | awk 'match($0,/COM([0-9]+)/,m){print m[1]}'); do DEV=${DEV/ */} PM3LIST+=("$DEV") if [ ${#PM3LIST[*]} -ge "$N" ]; then From def55011be606f1a8ddb7b819c0f270c0222f580 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen <phil@teuwen.org> Date: Fri, 12 Jun 2020 02:02:53 +0200 Subject: [PATCH 632/632] and the other one... --- pm3 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pm3 b/pm3 index c3829b796..771dce77d 100755 --- a/pm3 +++ b/pm3 @@ -152,7 +152,7 @@ function get_pm3_list_WSL { # Need to look for this first, the call to Win32_serialport "crashes" then native bt serial port. Don't ask why. #BT direct SERIAL PORTS (COM) if $FINDBTRFCOMM; then - for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_PnPEntity | Where-Object Caption -like 'Standard Serial over Bluetooth link (COM*' | Select Name" 2> /dev/null | awk '$0 ~ /COM/{print substr($6,2,5)}'); do + for DEV in $(powershell.exe -command "Get-CimInstance -ClassName Win32_PnPEntity | Where-Object Caption -like 'Standard Serial over Bluetooth link (COM*' | Select Name" 2> /dev/null | awk 'match($0,/COM([0-9]+)/,m){print m[1]}'); do DEV=${DEV/ */} DEV="/dev/ttyS${DEV#COM}"