diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7d153ee..7ac8ea8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -15,13 +15,16 @@ message (STATUS "CMake version: ${CMAKE_VERSION}")
message (STATUS "Project version: ${PROJECT_VERSION}")
set(BLOWFISH_SRC ${PROJECT_SOURCE_DIR}/src/blowfish.cc)
-source_group(src FILES ${BLOWFISH_SRC})
+set(BLOWFISH2_SRC ${PROJECT_SOURCE_DIR}/src/blowfish2.cc)
+source_group(src FILES ${BLOWFISH_SRC} ${BLOWFISH2_SRC})
set(BLOWFISH_TEST ${PROJECT_SOURCE_DIR}/tests/Main.cpp)
-source_group(tests FILES ${BLOWFISH_TEST})
+set(BLOWFISH2_TEST ${PROJECT_SOURCE_DIR}/tests/Main2.cpp)
+source_group(tests FILES ${BLOWFISH_TEST} ${BLOWFISH2_TEST})
set(BLOWFISH_INC ${PROJECT_SOURCE_DIR}/include/blowfish/blowfish.h)
-source_group(include FILES ${BLOWFISH_INC})
+set(BLOWFISH2_INC ${PROJECT_SOURCE_DIR}/include/blowfish/blowfish2.h)
+source_group(include FILES ${BLOWFISH_INC} ${BLOWFISH2_INC})
set(BLOWFISH_DOC
README.md
@@ -37,6 +40,14 @@ set(BLOWFISH_SCRIPTS
source_group(scripts FILES ${BLOWFISH_SCRIPTS})
add_library(blowfish ${BLOWFISH_SRC} ${BLOWFISH_INC} ${BLOWFISH_SCRIPTS} ${BLOWFISH_DOC})
-add_executable(bf_test ${BLOWFISH_TEST} ${BLOWFISH_SRC} ${BLOWFISH_INC} )
-target_include_directories(bf_test PUBLIC ${PROJECT_SOURCE_DIR}/include)
+add_library(blowfish2 ${BLOWFISH2_SRC} ${BLOWFISH2_INC} ${BLOWFISH_SCRIPTS} ${BLOWFISH_DOC})
+
target_include_directories(blowfish PUBLIC ${PROJECT_SOURCE_DIR}/include)
+target_include_directories(blowfish2 PUBLIC ${PROJECT_SOURCE_DIR}/include)
+
+add_executable(bf_test ${BLOWFISH_TEST} ${BLOWFISH_SRC} ${BLOWFISH_INC})
+add_executable(bf2_test ${BLOWFISH2_TEST} ${BLOWFISH2_SRC} ${BLOWFISH2_INC})
+
+target_include_directories(bf_test PUBLIC ${PROJECT_SOURCE_DIR}/include)
+target_include_directories(bf2_test PUBLIC ${PROJECT_SOURCE_DIR}/include)
+
diff --git a/LICENSE b/LICENSE
index 85a0ca2..cf3aeae 100644
--- a/LICENSE
+++ b/LICENSE
@@ -19,3 +19,8 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+
+Original Algorithm Copyrights:
+
+Blowfish 64-bit block 1997 by Paul Kocher
+Blowfish 2 128-bit block 2005 by Alexander Pukall
diff --git a/README.md b/README.md
index 24bac07..e4e38c0 100644
--- a/README.md
+++ b/README.md
@@ -1,17 +1,20 @@
-# Blowfish Encryption Algorithm
+# Blowfish and Blowfish2 Encryption Algorithm
-
Blowfish is a symmetric block cipher that can be used as a drop-in replacement for DES or IDEA. It takes a variable-length key, from 32 bits to 448 bits, making it ideal for both domestic and exportable use. Blowfish was designed in 1993 by Bruce Schneier as a fast, free alternative to existing encryption algorithms. Since then it has been analyzed considerably, and it is slowly gaining acceptance as a strong encryption algorithm. Blowfish is unpatented and license-free, and is available free for all uses.
+Blowfish 2 was released in 2005. It has exactly the same design but has twice as many S tables and uses 64-bit integers instead of 32-bit integers. It no longer works on 64-bit blocks but on 128-bit blocks like AES. 128-bit block, 64 rounds, key up to 4224 bits.
+
## About this project
This is a C++ implementation of the encryption algorithm.
## How to use this in your project?
+
1. You may fork it and use it like any other source file in your project. You only need [blowfish.hpp](include/blowfish/blowfish.hpp) and [blowfish.cpp](src/blowfish.cpp) files. Just modify the header as per your convienence.
-2. If you are using CMake, the work is lot easier. You can add this as a git submodule. It isolates your project from this dependency.
+2. If you are using CMake, the work is lot easier. You can add this as a git submodule. It isolates your project from this dependency.
+
```bash
# In your project root type these commands
git submodule add https://github.com/avinal/blowfish
@@ -19,9 +22,11 @@ This is a C++ implementation of the encryption algorithm.
git commit -m "blowfish submodule added"
git push origin main
```
+
Add this to your CMakeLists.txt as well.
-
## References
+
- [Description of a new variable-length key, 64-bit block cipher (Blowfish)](https://link.springer.com/chapter/10.1007/3-540-58108-1_24)
- [The Blowfish Encryption Algorithm](https://www.schneier.com/academic/blowfish/)
+- [The Blowfish 2 C Implementation](https://github.com/erwanmilon/blowfish2/)
diff --git a/build.sh b/build.sh
old mode 100644
new mode 100755
diff --git a/include/blowfish/blowfish.h b/include/blowfish/blowfish.h
index 1163208..7307cbe 100644
--- a/include/blowfish/blowfish.h
+++ b/include/blowfish/blowfish.h
@@ -1,19 +1,17 @@
-/*
- * @file blowfish.hpp
- * @author Avinal Kumar
- * @since February 15, 2021
- *
- * Blowfish Algorithm Header File
- */
+// SPDX-FileCopyrightText: 2024 Avinal Kumar avinal.xlvii@gmail.com
+// SPDX-License-Identifier: MIT
+
+// Original Blowfish Algorithm copyright:
+// SPDX-FileCopyrightText: 1997 Paul Kocher
#include
#include
+#include
#include
#define MAXKEYBYTES 56 // 448 bits max
#define N 16
-
#if !defined(BLOWFISH_BLOWFISH_H_)
#define BLOWFISH_BLOWFISH_H_
diff --git a/include/blowfish/blowfish2.h b/include/blowfish/blowfish2.h
new file mode 100644
index 0000000..a03ef85
--- /dev/null
+++ b/include/blowfish/blowfish2.h
@@ -0,0 +1,35 @@
+// SPDX-FileCopyrightText: 2024 Avinal Kumar avinal.xlvii@gmail.com
+// SPDX-License-Identifier: MIT
+
+// Original Blowfish 2 Algorithm copyright:
+// SPDX-FileCopyrightText: 2005 Alexander Pukall
+
+#include
+#include
+#include
+#include
+
+#define MAXKEYBYTES 56 // 4224 bits max
+#define N 64
+
+#if !defined(BLOWFISH_BLOWFISH2_H_)
+#define BLOWFISH_BLOWFISH2_H_
+
+class Blowfish2 {
+private:
+ std::array PArray;
+ std::array, 8> Sboxes;
+ uint64_t F(uint64_t x);
+
+public:
+ Blowfish2() {}
+ Blowfish2(std::string const &key);
+ Blowfish2(Blowfish2 const &) = delete;
+
+ void initialize(std::string const &key);
+
+ void encrypt(uint64_t &xl, uint64_t &xr);
+ void decrypt(uint64_t &xl, uint64_t &xr);
+};
+
+#endif // BLOWFISH_BLOWFISH2_H_
diff --git a/src/blowfish.cc b/src/blowfish.cc
index 60f112f..3e94b68 100644
--- a/src/blowfish.cc
+++ b/src/blowfish.cc
@@ -1,11 +1,8 @@
-/**
- * /mnt/z/my_git/blowfish/include/blowfish.cpp
- * @file blowfish.cpp
- * @author Avinal Kumar
- * @since February 16, 2021
- *
- * Blowfish Implementation
- */
+// SPDX-FileCopyrightText: 2024 Avinal Kumar avinal.xlvii@gmail.com
+// SPDX-License-Identifier: MIT
+
+// Original Blowfish Algorithm copyright:
+// SPDX-FileCopyrightText: 1997 Paul Kocher
#include
@@ -254,8 +251,8 @@ void Blowfish::initialize(std::string const &key) {
for (uint32_t i = 0; i < 4; ++i) {
for (uint32_t k = 0; k < 256; k += 2) {
encrypt(datal, datar);
- Sboxes[i][j] = datal;
- Sboxes[i][j + 1] = datar;
+ Sboxes[i][k] = datal;
+ Sboxes[i][k + 1] = datar;
}
}
}
@@ -266,15 +263,15 @@ uint32_t Blowfish::F(uint32_t x) {
uint16_t a, b, c, d;
uint32_t y;
- d = x & 0x00FF;
+ d = (unsigned int)(x & 0xFF);
x >>= 8;
- d = x & 0x00FF;
+ d = (unsigned int)(x & 0xFF);
x >>= 8;
- c = x & 0x00FF;
+ c = (unsigned int)(x & 0xFF);
x >>= 8;
- b = x & 0x00FF;
+ b = (unsigned int)(x & 0xFF);
x >>= 8;
- a = x & 0x00FF;
+ a = (unsigned int)(x & 0xFF);
y = Sboxes[0][a] + Sboxes[1][b];
y ^= Sboxes[2][c];
diff --git a/src/blowfish2.cc b/src/blowfish2.cc
new file mode 100644
index 0000000..8666d66
--- /dev/null
+++ b/src/blowfish2.cc
@@ -0,0 +1,826 @@
+// SPDX-FileCopyrightText: 2024 Avinal Kumar avinal.xlvii@gmail.com
+// SPDX-License-Identifier: MIT
+
+// Original Blowfish 2 Algorithm copyright:
+// SPDX-FileCopyrightText: 2005 Alexander Pukall
+
+#include
+
+static const std::array P = {
+ 0x243F6A8885A308D3, 0x13198A2E03707344, 0xA4093822299F31D0,
+ 0x082EFA98EC4E6C89, 0x452821E638D01377, 0xBE5466CF34E90C6C,
+ 0xC0AC29B7C97C50DD, 0x3F84D5B5B5470917, 0x9216D5D98979FB1B,
+ 0xD1310BA698DFB5AC, 0x2FFD72DBD01ADFB7, 0xB8E1AFED6A267E96,
+ 0xBA7C9045F12C7F99, 0x24A19947B3916CF7, 0x0801F2E2858EFC16,
+ 0x636920D871574E69, 0xA458FEA3F4933D7E, 0x0D95748F728EB658,
+ 0x718BCD5882154AEE, 0x7B54A41DC25A59B5, 0x9C30D5392AF26013,
+ 0xC5D1B023286085F0, 0xCA417918B8DB38EF, 0x8E79DCB0603A180E,
+ 0x6C9E0E8BB01E8A3E, 0xD71577C1BD314B27, 0x78AF2FDA55605C60,
+ 0xE65525F3AA55AB94, 0x5748986263E81440, 0x55CA396A2AAB10B6,
+ 0xB4CC5C341141E8CE, 0xA15486AF7C72E993, 0xB3EE1411636FBC2A,
+ 0x2BA9C55D741831F6, 0xCE5C3E169B87931E, 0xAFD6BA336C24CF5C,
+ 0x7A32538128958677, 0x3B8F48986B4BB9AF, 0xC4BFE81B66282193,
+ 0x61D809CCFB21A991, 0x487CAC605DEC8032, 0xEF845D5DE98575B1,
+ 0xDC262302EB651B88, 0x23893E81D396ACC5, 0x0F6D6FF383F44239,
+ 0x2E0B4482A4842004, 0x69C8F04A9E1F9B5E, 0x21C66842F6E96C9A,
+ 0x670C9C61ABD388F0, 0x6A51A0D2D8542F68, 0x960FA728AB5133A3,
+ 0x6EEF0B6C137A3BE4, 0xBA3BF0507EFB2A98, 0xA1F1651D39AF0176,
+ 0x66CA593E82430E88, 0x8CEE8619456F9FB4, 0x7D84A5C33B8B5EBE,
+ 0xE06F75D885C12073, 0x401A449F56C16AA6, 0x4ED3AA62363F7706,
+ 0x1BFEDF72429B023D, 0x37D0D724D00A1248, 0xDB0FEAD349F1C09B,
+ 0x075372C980991B7B, 0x25D479D8F6E8DEF7, 0xE3FE501AB6794C3B};
+
+static const std::array, 8> S = {
+ {{0x976CE0BD04C006BA, 0xC1A94FB6409F60C4, 0x5E5C9EC2196A2463,
+ 0x68FB6FAF3E6C53B5, 0x1339B2EB3B52EC6F, 0x6DFC511F9B30952C,
+ 0xCC814544AF5EBD09, 0xBEE3D004DE334AFD, 0x660F2807192E4BB3,
+ 0xC0CBA85745C8740F, 0xD20B5F39B9D3FBDB, 0x5579C0BD1A60320A,
+ 0xD6A100C6402C7279, 0x679F25FEFB1FA3CC, 0x8EA5E9F8DB3222F8,
+ 0x3C7516DFFD616B15, 0x2F501EC8AD0552AB, 0x323DB5FAFD238760,
+ 0x53317B483E00DF82, 0x9E5C57BBCA6F8CA0, 0x1A87562EDF1769DB,
+ 0xD542A8F6287EFFC3, 0xAC6732C68C4F5573, 0x695B27B0BBCA58C8,
+ 0xE1FFA35DB8F011A0, 0x10FA3D98FD2183B8, 0x4AFCB56C2DD1D35B,
+ 0x9A53E479B6F84565, 0xD28E49BC4BFB9790, 0xE1DDF2DAA4CB7E33,
+ 0x62FB1341CEE4C6E8, 0xEF20CADA36774C01, 0xD07E9EFE2BF11FB4,
+ 0x95DBDA4DAE909198, 0xEAAD8E716B93D5A0, 0xD08ED1D0AFC725E0,
+ 0x8E3C5B2F8E7594B7, 0x8FF6E2FBF2122B64, 0x8888B812900DF01C,
+ 0x4FAD5EA0688FC31C, 0xD1CFF191B3A8C1AD, 0x2F2F2218BE0E1777,
+ 0xEA752DFE8B021FA1, 0xE5A0CC0FB56F74E8, 0x18ACF3D6CE89E299,
+ 0xB4A84FE0FD13E0B7, 0x7CC43B81D2ADA8D9, 0x165FA26680957705,
+ 0x93CC7314211A1477, 0xE6AD206577B5FA86, 0xC75442F5FB9D35CF,
+ 0xEBCDAF0C7B3E89A0, 0xD6411BD3AE1E7E49, 0x00250E2D2071B35E,
+ 0x226800BB57B8E0AF, 0x2464369BF009B91E, 0x5563911D59DFA6AA,
+ 0x78C14389D95A537F, 0x207D5BA202E5B9C5, 0x832603766295CFA9,
+ 0x11C819684E734A41, 0xB3472DCA7B14A94A, 0x1B5100529A532915,
+ 0xD60F573FBC9BC6E4, 0x2B60A47681E67400, 0x08BA6FB5571BE91F,
+ 0xF296EC6B2A0DD915, 0xB6636521E7B9F9B6, 0xFF34052EC5855664,
+ 0x53B02D5DA99F8FA1, 0x08BA47996E85076A, 0x4B7A70E9B5B32944,
+ 0xDB75092EC4192623, 0xAD6EA6B049A7DF7D, 0x9CEE60B88FEDB266,
+ 0xECAA8C71699A18FF, 0x5664526CC2B19EE1, 0x193602A575094C29,
+ 0xA0591340E4183A3E, 0x3F54989A5B429D65, 0x6B8FE4D699F73FD6,
+ 0xA1D29C07EFE830F5, 0x4D2D38E6F0255DC1, 0x4CDD20868470EB26,
+ 0x6382E9C6021ECC5E, 0x09686B3F3EBAEFC9, 0x3C9718146B6A70A1,
+ 0x687F358452A0E286, 0xB79C5305AA500737, 0x3E07841C7FDEAE5C,
+ 0x8E7D44EC5716F2B8, 0xB03ADA37F0500C0D, 0xF01C1F040200B3FF,
+ 0xAE0CF51A3CB574B2, 0x25837A58DC0921BD, 0xD19113F97CA92FF6,
+ 0x9432477322F54701, 0x3AE5E58137C2DADC, 0xC8B576349AF3DDA7,
+ 0xA94461460FD0030E, 0xECC8C73EA4751E41, 0xE238CD993BEA0E2F,
+ 0x3280BBA1183EB331, 0x4E548B384F6DB908, 0x6F420D03F60A04BF,
+ 0x2CB8129024977C79, 0x5679B072BCAF89AF, 0xDE9A771FD9930810,
+ 0xB38BAE12DCCF3F2E, 0x5512721F2E6B7124, 0x501ADDE69F84CD87,
+ 0x7A5847187408DA17, 0xBC9F9ABCE94B7D8C, 0xEC7AEC3ADB851DFA,
+ 0x63094366C464C3D2, 0xEF1C18473215D808, 0xDD433B3724C2BA16,
+ 0x12A14D432A65C451, 0x50940002133AE4DD, 0x71DFF89E10314E55,
+ 0x81AC77D65F11199B, 0x043556F1D7A3C76B, 0x3C11183B5924A509,
+ 0xF28FE6ED97F1FBFA, 0x9EBABF2C1E153C6E, 0x86E34570EAE96FB1,
+ 0x860E5E0A5A3E2AB3, 0x771FE71C4E3D06FA, 0x2965DCB999E71D0F,
+ 0x803E89D65266C825, 0x2E4CC9789C10B36A, 0xC6150EBA94E2EA78,
+ 0xA6FC3C531E0A2DF4, 0xF2F74EA7361D2B3D, 0x1939260F19C27960,
+ 0x5223A708F71312B6, 0xEBADFE6EEAC31F66, 0xE3BC4595A67BC883,
+ 0xB17F37D1018CFF28, 0xC332DDEFBE6C5AA5, 0x6558218568AB9702,
+ 0xEECEA50FDB2F953B, 0x2AEF7DAD5B6E2F84, 0x1521B62829076170,
+ 0xECDD4775619F1510, 0x13CCA830EB61BD96, 0x0334FE1EAA0363CF,
+ 0xB5735C904C70A239, 0xD59E9E0BCBAADE14, 0xEECC86BC60622CA7,
+ 0x9CAB5CABB2F3846E, 0x648B1EAF19BDF0CA, 0xA02369B9655ABB50,
+ 0x40685A323C2AB4B3, 0x319EE9D5C021B8F7, 0x9B540B19875FA099,
+ 0x95F7997E623D7DA8, 0xF837889A97E32D77, 0x11ED935F16681281,
+ 0x0E358829C7E61FD6, 0x96DEDFA17858BA99, 0x57F584A51B227263,
+ 0x9B83C3FF1AC24696, 0xCDB30AEB532E3054, 0x8FD948E46DBC3128,
+ 0x58EBF2EF34C6FFEA, 0xFE28ED61EE7C3C73, 0x5D4A14D9E864B7E3,
+ 0x42105D14203E13E0, 0x45EEE2B6A3AAABEA, 0xDB6C4F15FACB4FD0,
+ 0xC742F442EF6ABBB5, 0x654F3B1D41CD2105, 0xD81E799E86854DC7,
+ 0xE44B476A3D816250, 0xCF62A1F25B8D2646, 0xFC8883A0C1C7B6A3,
+ 0x7F1524C369CB7492, 0x47848A0B5692B285, 0x095BBF00AD19489D,
+ 0x1462B17423820D00, 0x58428D2A0C55F5EA, 0x1DADF43E233F7061,
+ 0x3372F0928D937E41, 0xD65FECF16C223BDB, 0x7CDE3759CBEE7460,
+ 0x4085F2A7CE77326E, 0xA607808419F8509E, 0xE8EFD85561D99735,
+ 0xA969A7AAC50C06C2, 0x5A04ABFC800BCADC, 0x9E447A2EC3453484,
+ 0xFDD567050E1E9EC9, 0xDB73DBD3105588CD, 0x675FDA79E3674340,
+ 0xC5C43465713E38D8, 0x3D28F89EF16DFF20, 0x153E21E78FB03D4A,
+ 0xE6E39F2BDB83ADF7, 0xE93D5A68948140F7, 0xF64C261C94692934,
+ 0x411520F77602D4F7, 0xBCF46B2ED4A10068, 0xD40824713320F46A,
+ 0x43B7D4B7500061AF, 0x1E39F62E97244546, 0x14214F74BF8B8840,
+ 0x4D95FC1D96B591AF, 0x70F4DDD366A02F45, 0xBFBC09EC03BD9785,
+ 0x7FAC6DD031CB8504, 0x96EB27B355FD3941, 0xDA2547E6ABCA0A9A,
+ 0x28507825530429F4, 0x0A2C86DAE9B66DFB, 0x68DC1462D7486900,
+ 0x680EC0A427A18DEE, 0x4F3FFEA2E887AD8C, 0xB58CE0067AF4D6B6,
+ 0xAACE1E7CD3375FEC, 0xCE78A399406B2A42, 0x20FE9E35D9F385B9,
+ 0xEE39D7AB3B124E8B, 0x1DC9FAF74B6D1856, 0x26A36631EAE397B2,
+ 0x3A6EFA74DD5B4332, 0x6841E7F7CA7820FB, 0xFB0AF54ED8FEB397,
+ 0x454056ACBA489527, 0x55533A3A20838D87, 0xFE6BA9B7D096954B,
+ 0x55A867BCA1159A58, 0xCCA9296399E1DB33, 0xA62A4A563F3125F9,
+ 0x5EF47E1C9029317C, 0xFDF8E80204272F70, 0x80BB155C05282CE3,
+ 0x95C11548E4C66D22, 0x48C1133FC70F86DC, 0x07F9C9EE41041F0F,
+ 0x404779A45D886E17, 0x325F51EBD59BC0D1, 0xF2BCC18F41113564,
+ 0x257B7834602A9C60, 0xDFF8E8A31F636C1B, 0x0E12B4C202E1329E,
+ 0xAF664FD1CAD18115, 0x6B2395E0333E92E1, 0x3B240B62EEBEB922,
+ 0x85B2A20EE6BA0D99, 0xDE720C8C2DA2F728, 0xD012784595B794FD,
+ 0x647D0862E7CCF5F0, 0x5449A36F877D48FA, 0xC39DFD27F33E8D1E,
+ 0x0A476341992EFF74},
+
+ {0x3A6F6EABF4F8FD37, 0xA812DC60A1EBDDF8, 0x991BE14CDB6E6B0D,
+ 0xC67B55106D672C37, 0x2765D43BDCD0E804, 0xF1290DC7CC00FFA3,
+ 0xB5390F92690FED0B, 0x667BA0FBCEDB7D9C, 0xA091CF0BD9155EA3,
+ 0xBB132F88515BAD24, 0x7B9479BF763BD6EB, 0x37392EB3CC115979,
+ 0x8026E297F42E312D, 0x6842ADA7C66A2B3B, 0x12754CCC782EF11C,
+ 0x6A124237B79251E7, 0x06A1BBE64BFB6350, 0x1A6B101811CAEDFA,
+ 0x3D25BDD8E2E1C3C9, 0x444216590A121386, 0xD90CEC6ED5ABEA2A,
+ 0x64AF674EDA86A85F, 0xBEBFE98864E4C3FE, 0x9DBC8057F0F7C086,
+ 0x60787BF86003604D, 0xD1FD8346F6381FB0, 0x7745AE04D736FCCC,
+ 0x83426B33F01EAB71, 0xB08041873B005E5F, 0x77A057BEBDE8AE24,
+ 0x55464299BF582E61, 0x4E58F48FF2DDFDA2, 0xF474EF388789BDC2,
+ 0x5366F9C3C8B38E74, 0xB475F25546FCD9B9, 0x7AEB26618B1DDF84,
+ 0x846A0E79915F95E2, 0x466E598E20B45770, 0x8CD55591C802DE4C,
+ 0xB90BACE1BB8205D0, 0x11A862487574A99E, 0xB77F19B6E0A9DC09,
+ 0x662D09A1C4324633, 0xE85A1F0209F0BE8C, 0x4A99A0251D6EFE10,
+ 0x1AB93D1D0BA5A4DF, 0xA186F20F2868F169, 0xDCB7DA83573906FE,
+ 0xA1E2CE9B4FCD7F52, 0x50115E01A70683FA, 0xA002B5C40DE6D027,
+ 0x9AF88C27773F8641, 0xC3604C0661A806B5, 0xF0177A28C0F586E0,
+ 0x006058AA30DC7D62, 0x11E69ED72338EA63, 0x53C2DD94C2C21634,
+ 0xBBCBEE5690BCB6DE, 0xEBFC7DA1CE591D76, 0x6F05E4094B7C0188,
+ 0x39720A3D7C927C24, 0x86E3725F724D9DB9, 0x1AC15BB4D39EB8FC,
+ 0xED54557808FCA5B5, 0xD83D7CD34DAD0FC4, 0x1E50EF5EB161E6F8,
+ 0xA28514D96C51133C, 0x6FD5C7E756E14EC4, 0x362ABFCEDDC6C837,
+ 0xD79A323492638212, 0x670EFA8E406000E0, 0x3A39CE37D3FBF5CF,
+ 0xABC277375AC52D1B, 0x5CB0679E4FA33742, 0xD382274099BC9BBE,
+ 0xD5118E9DBF0F7315, 0xD62D1C7EC700C47B, 0xB78C1B6B21A19045,
+ 0xB26EB1BE6A366EB4, 0x5748AB2FBC946E79, 0xC6A376D26549C2C8,
+ 0x530FF8EE468DDE7D, 0xD5730A1D4CD04DC6, 0x2939BBDBA9BA4650,
+ 0xAC9526E8BE5EE304, 0xA1FAD5F06A2D519A, 0x63EF8CE29A86EE22,
+ 0xC089C2B843242EF6, 0xA51E03AA9CF2D0A4, 0x83C061BA9BE96A4D,
+ 0x8FE51550BA645BD6, 0x2826A2F9A73A3AE1, 0x4BA99586EF5562E9,
+ 0xC72FEFD3F752F7DA, 0x3F046F6977FA0A59, 0x80E4A91587B08601,
+ 0x9B09E6AD3B3EE593, 0xE990FD5A9E34D797, 0x2CF0B7D9022B8B51,
+ 0x96D5AC3A017DA67D, 0xD1CF3ED67C7D2D28, 0x1F9F25CFADF2B89B,
+ 0x5AD6B4725A88F54C, 0xE029AC71E019A5E6, 0x47B0ACFDED93FA9B,
+ 0xE8D3C48D283B57CC, 0xF8D5662979132E28, 0x785F0191ED756055,
+ 0xF7960E44E3D35E8C, 0x15056DD488F46DBA, 0x03A161250564F0BD,
+ 0xC3EB9E153C9057A2, 0x97271AECA93A072A, 0x1B3F6D9B1E6321F5,
+ 0xF59C66FB26DCF319, 0x7533D928B155FDF5, 0x035634828ABA3CBB,
+ 0x28517711C20AD9F8, 0xABCC5167CCAD925F, 0x4DE817513830DC8E,
+ 0x379D58629320F991, 0xEA7A90C2FB3E7BCE, 0x5121CE64774FBE32,
+ 0xA8B6E37EC3293D46, 0x48DE53696413E680, 0xA2AE0810DD6DB224,
+ 0x69852DFD09072166, 0xB39A460A6445C0DD, 0x586CDECF1C20C8AE,
+ 0x5BBEF7DD1B588D40, 0xCCD2017F6BB4E3BB, 0xDDA26A7E3A5AFF45,
+ 0x3E350A44BCB4CDD5, 0x72EACEA8FA6484BB, 0x8D6612AEBF3C6F47,
+ 0xD29BE463542F5D9E, 0xAEC2771BF64E6370, 0x740E0D8DE75B1358,
+ 0xF8721671AF537D5D, 0x4040CB084EB4E2CC, 0x34D2466A0115AF84,
+ 0xE1B0042895983A1D, 0x06B89FB4CE6EA048, 0x6F3F3B823520AB82,
+ 0x011A1D4B277228F8, 0x611560B1E7933FDC, 0xBB3A792B344525BD,
+ 0xA08839E151CE794B, 0x2F32C9B7A01FBAC9, 0xE01CC87EBCC7D1F6,
+ 0xCF0111C3A1E8AAC7, 0x1A908749D44FBD9A, 0xD0DADECBD50ADA37,
+ 0x0339C32AC6913667, 0x8DF9317CE0B12B4F, 0xF79E59B743F5BB3A,
+ 0xF2D519FF27D9459C, 0xBF97222C15E6FC2A, 0x0F91FC719B941525,
+ 0xFAE59361CEB69CEB, 0xC2A8645912BAA8D1, 0xB6C1075EE3056A0C,
+ 0x10D25065CB03A442, 0xE0EC6E0E1698DB3B, 0x4C98A0BE3278E964,
+ 0x9F1F9532E0D392DF, 0xD3A0342B8971F21E, 0x1B0A74414BA3348C,
+ 0xC5BE7120C37632D8, 0xDF359F8D9B992F2E, 0xE60B6F470FE3F11D,
+ 0xE54CDA541EDAD891, 0xCE6279CFCD3E7E6F, 0x1618B166FD2C1D05,
+ 0x848FD2C5F6FB2299, 0xF523F357A6327623, 0x93A8353156CCCD02,
+ 0xACF081625A75EBB5, 0x6E16369788D273CC, 0xDE96629281B949D0,
+ 0x4C50901B71C65614, 0xE6C6C7BD327A140A, 0x45E1D006C3F27B9A,
+ 0xC9AA53FD62A80F00, 0xBB25BFE235BDD2F6, 0x71126905B2040222,
+ 0xB6CBCF7CCD769C2B, 0x53113EC01640E3D3, 0x38ABBD602547ADF0,
+ 0xBA38209CF746CE76, 0x77AFA1C520756060, 0x85CBFE4E8AE88DD8,
+ 0x7AAAF9B04CF9AA7E, 0x1948C25C03FB8A8C, 0x01C36AE4D6EBE2F9,
+ 0x90D4F869A65CDEA0, 0x3F09252DC208E69F, 0xB74E6132CE77E25B,
+ 0x578FDFE33AC372E6, 0xB83ACB022002397A, 0x6EC6FB5BFFCFD4DD,
+ 0x4CBF5ED1F43FE582, 0x3EF4E8232D152AF0, 0xE718C97059BD9820,
+ 0x1F4A9D62E7A529BA, 0x89E1248D3BF88656, 0xC5114D0EBC4CEE16,
+ 0x034D8A3920E47882, 0xE9AE8FBDE3ABDC1F, 0x6DA51E525DB2BAE1,
+ 0x01F86E7A6D9C68A9, 0x2708FCD9293CBC0C, 0xB03C87F8A8AD2C2F,
+ 0x00424EEBCACB452D, 0x89CC71FCD59C7F91, 0x7F0622BC6D8A08B1,
+ 0x834D21326884CA82, 0xE3AACBF37786F2FA, 0x2CAB6E3DCE535AD1,
+ 0xF20AC607C6B8E14F, 0x5EB4388E775014A6, 0x656665F7B64A43E4,
+ 0xBA383D01B2E41079, 0x8EB2986F909E0CA4, 0x1F7B37772C126030,
+ 0x85088718C4E7D1BD, 0x4065FFCE8392FD8A, 0xAA36D12BB4C8C9D0,
+ 0x994FB0B714F96818, 0xF9A53998A0A178C6, 0x2684A81E8AE972F6,
+ 0xB8425EB67A29D486, 0x551BD719AF32C189, 0xD5145505DC81D53E,
+ 0x48424EDAB796EF46, 0xA0498F03667DEEDE, 0x03AC0AB3C497733D,
+ 0x5316A89130A88FCC, 0x9604440ACEEB893A, 0x7725B82B0E1EF69D,
+ 0x302A5C8EE7B84DEF, 0x5A31B096C9EBF88D, 0x512D788E7E4002EE,
+ 0x87E02AF6C358A1BB, 0x02E8D7AFDF9FB0E7, 0x790E942A3B3C1ABA,
+ 0xC6FFA7AF9DF796F9, 0x321BB9940174A8A8, 0xED22162CCFF1BB99,
+ 0xDAA8D551A4D5E44B, 0xECDDE3ECA80DC509, 0x0393EEF272523D31,
+ 0xD48E3A1C224EB65E, 0x6052C3A42109C32F, 0x052EE388ED9F7EA9,
+ 0x91C62F9777B55BA0},
+
+ {0x150CBCA33AEC6525, 0xDF31838343A9CE26, 0x9362AD8B0134140B,
+ 0x8DF5CF811E9FF559, 0x167F05643812F4E0, 0x588A52B0CBB8E944,
+ 0xEF5B16A373C4EDA1, 0x7DFCFEEAF54BCBBE, 0x8773E3D2C531DCD0,
+ 0x55C4672952774F3A, 0x57CA6BC0467D3A3B, 0x24778425B7991E9A,
+ 0xDD825C26E452C8EE, 0xFCACDE1E84833AF3, 0x61211D031732C131,
+ 0xCCADB247E606BE8C, 0x712B39F188B4EF39, 0x3A9FCDC5C5755169,
+ 0x1FF6994F39829CB0, 0x110165733343CBEB, 0x61D3D0B444F30AEF,
+ 0xA8AE73752A3A1C9D, 0xB4B70914D6AB250C, 0x853B7328495F948F,
+ 0xD2A4ED8E6CF751E4, 0xC320BB75D9CAA0B3, 0x8BA562624E84B03F,
+ 0xEEA8076E74A07FE5, 0x8039E00C36FFDAF8, 0x03731358B9E671B9,
+ 0xDAC4CE1CB25B10ED, 0x4DD3D5B1FCF2B480, 0x4634F57925EAC400,
+ 0xA9AC55EA728932DF, 0x06041D055D31F502, 0xC539C2E32B89D9DB,
+ 0x5BCC0A98C05BFD6F, 0x1B2506222E21BE0E, 0x60973B04ECD54A67,
+ 0xB54FE638A6ED6615, 0x981A910A5D92928D, 0xAC6FC697E73C63AD,
+ 0x456EDF5F457A8145, 0x51875A64CD3099F1, 0x69B5F18A8C73EE0B,
+ 0x5E57368F6C7AF4BB, 0x7A595926AAB49EC6, 0x8AC8FCFB8016CBDB,
+ 0x8BBC1F476982C711, 0x85C7DA7A58811477, 0xCD67FAD1D764D9B4,
+ 0xC81029505CD09DA5, 0x1BB1F14795167D80, 0x0366046DAF1DACA1,
+ 0xA2247B2311301A54, 0x791D99C67A4FB7CF, 0x277449A409E57492,
+ 0x35C9A57E5E7F500A, 0xB9A62A8AD5242A6B, 0xA13378599CDA3346,
+ 0x148740474328BA08, 0xEB81D51F3248896A, 0x8007D85D0F6E8DDA,
+ 0x8250BDAFCE2EE042, 0x897EE0225F003612, 0x3BA18F9026314076,
+ 0x7824035A3B57E2D5, 0x8E78AED1E90DC600, 0x90C15EA624609519,
+ 0xB72EC3F8663DDCEF, 0xEF574232194195B6, 0x20C9203FF993700E,
+ 0xC1A44A7CBAEDE941, 0xF98AD4C4F8F43F26, 0xF060DD080EB9DF1D,
+ 0x9B33618855EEB734, 0x6C56D0D433A0D6E4, 0x182885B21DAFB611,
+ 0xF04D46F750CDCB91, 0x407B4733D7A2B343, 0x0269AC52B520773C,
+ 0x8C910B9F7680E5F6, 0xC79AD874FD97CFE6, 0xDEB78FB3279EE2A1,
+ 0x7428670533645AA5, 0x554438084F1FC8DC, 0x116CC402D4F14617,
+ 0x6183CD9EE11D5B9E, 0x195D2523EF2F8E07, 0xD836767C44811938,
+ 0xAD366C9FDAB0065B, 0x2C5BD6F663F7D10E, 0x79104BD1D7C3E497,
+ 0x432DD056932F8F20, 0x878025A708E90347, 0xCDAC2120753A3201,
+ 0x9C6BE2FD03F7B32B, 0x0AB85150D75A8F1E, 0x8FBF70ECE0C67DF9,
+ 0x71F250E41ABB9BF0, 0x3F17F108EDBFDC76, 0x37DCD54A48CCE570,
+ 0x8011BB358BC70BFB, 0x8194F91BD0816B10, 0x5B3FE6415C6C5D42,
+ 0x39D03AD66881CC3B, 0x95ED2BBA9B2DF677, 0x7DB8057E0E1A306A,
+ 0x9C73B22B0F6FAE4C, 0x1477324E85041C8A, 0x31F1B31CB03F5338,
+ 0x3A3E70F003BDA3D7, 0x21507C16990FC0DC, 0xEC48EB1B6E5AA777,
+ 0x9DC7E5750C9490FC, 0xE8B70BB69C2462DE, 0x58F9D6E286C90D9E,
+ 0x393954BDB5F2A4FD, 0xA1CAD7C66DEDFC47, 0x4664D28514E21038,
+ 0xA34AE5A60CC88295, 0x26D74884885A7DAA, 0xAB0E25AAE328DACF,
+ 0x3D75CA5C9315B071, 0xA8F86A7A869A2A3B, 0x73C244966E32834B,
+ 0x247DEE3AB3A3E118, 0x0E3E864B85639D62, 0x88B3363FB3A767E5,
+ 0x4B847B5E39540816, 0x7538DE9741B0D6D8, 0xED77D7107636B96C,
+ 0xF57D4C5B2066FFB3, 0x17877F49FF0478D2, 0x759AF12C0E64DCF8,
+ 0x547B59F127BCEC3D, 0x18CE85B88418FE15, 0xF07CF6B4A5827EC1,
+ 0xED2893DE8A5FE68B, 0x4E112D7347572CCB, 0xAF86678002E62D57,
+ 0xE2994ED7B1C7EBA4, 0x01AAD3603470F655, 0x8F1BB1A1E9FC7E99,
+ 0x995672B0A2FA5702, 0x15B4DE2A4F23088C, 0xF2F97EC938568716,
+ 0x61A4FFCCF419CF11, 0xCCFACBCEBBCA28E3, 0x784DD43E1150DEE3,
+ 0xBC060BA08223C3D9, 0x4BDA38C78D9A7575, 0x4C007EC0AB58EFBB,
+ 0x5CC287D0F064EA5C, 0x85C0368AAF2AD213, 0x0EAAC3CDCE740241,
+ 0xFB003622BFAA4ABB, 0x583B589762A96A1A, 0xD06C7F57FF53F144,
+ 0xDD67F044D1C28282, 0x8BDA0388548D04D4, 0x4E4DAB2DB00734EE,
+ 0xD46E84086EFCE2BD, 0x39C9FB1B50898815, 0xC67E79C49FDEDF05,
+ 0x10DA0B2AF8B32839, 0x06C91AF07F24F3BC, 0xFB10760CB49F0850,
+ 0xD2CC97D8EC63395B, 0x9DB31D42A7CEC064, 0xF90E398D479ACAB7,
+ 0x07BE140A28F3754D, 0x728C72A3F53F82D5, 0xBDEFD866BF22F70B,
+ 0x655E9A03A6F11D63, 0x4A7132F693E833A5, 0x5E9274B4015F4E35,
+ 0x6A59DCDD9D1E85EF, 0x137D430AA6BE0B0F, 0x12A13EA30191692D,
+ 0x91A1E7691CC2852D, 0xAEE7300FDAF3860E, 0x408AC32A6A50C876,
+ 0x996E523B8C04F81B, 0x417F8595AA4CC582, 0xFCB3B8E23C2156FC,
+ 0xCD71AECD32A95C70, 0x7924389BD1047541, 0x9516C77F3DF7F5A6,
+ 0xB1384D6FCB22F10B, 0xBC73CA3B1EC4F4F4, 0xB9DEE7FB93A467F7,
+ 0xD638221089A1405C, 0xFD2FB6A54BC618B6, 0x96F3BB267289FE18,
+ 0xEB855796F09854D1, 0xDC9E8AFCAF106FDB, 0xF5A238571B1815CA,
+ 0x0A6F7CB51513353F, 0x8AC43941D1600967, 0xBA7A830ACD6CE82C,
+ 0x29AB1461C4BE5ECF, 0xBF756728EE1651D2, 0x8351FEF2D9A56503,
+ 0x1160D3CCB0767848, 0x82FA32727DC7523B, 0x409D85E9F46167C9,
+ 0xEF335BFEDE10E539, 0x360295CD5E0F347A, 0x9DC0DA0142AC93FC,
+ 0x32C3BEC9171678B9, 0x4C78A82B7C2C748F, 0x3828095E064D62C9,
+ 0xF49CB2BE9C9F0126, 0x321485CB4773E463, 0x0E24D3491B7D32E8,
+ 0x5D15EE76A962F764, 0xDEB15D4574DB8D32, 0x099610F3B3BD25A7,
+ 0x8A4A1E30E3A7F974, 0x11B6004CDA44BF5E, 0x9848711F5104ADE1,
+ 0x4A3B2AC8CF048420, 0x2F073250BE5F1DCC, 0x59F58B34F5410B4B,
+ 0x172EDC27C8B798C9, 0xE7FBA7BEE8131C63, 0x3DA9D7944FA593B6,
+ 0x684A0C6BEA248658, 0x6A33F10A3A76F7C9, 0x490BCC010090EDAC,
+ 0x643FE36AA33A5490, 0xA3D5F8B48CF3FCE6, 0xF53EF83439DC6EED,
+ 0xCB7A2AD77357022B, 0xBDA4E4538DB6C313, 0x88DF6453A5E9EA24,
+ 0x5DC52D198ABE6869, 0x6BDB8D96E21B92AB, 0x8C3DB835FFCEDFCA,
+ 0xAE947E3B49A2B4BD, 0x298CCC36A3D7193B, 0x922D5A7ED0C5161D,
+ 0xE4CD940BE06728C4, 0xEF5CB80D23E73708, 0x29C4FD6F93F61230,
+ 0x4E30CF0507C74C09, 0xC04C1B3D943D5EC6, 0x03E1291945FDD157,
+ 0x11348FB5CB36DBA1, 0xC5FE692324A33B0E, 0x499425F2FA87319C,
+ 0x587D2E1DE3BF7A76, 0x3D1A1D39600D94E4, 0x88019070C7BAEDFD,
+ 0x13733CC160299767},
+
+ {0xE3EDE1160BC75684, 0x44ABBD60A47D8E20, 0xC589A0633522CB00,
+ 0xE87815164ACE93CC, 0x6B9E5D20A12CFE3D, 0x11371EEB584A4436,
+ 0xA6DF8D4BB44831C6, 0x852C8C2A711EB439, 0x6DB68C03A9FB89F3,
+ 0xFC170E64EA76B5B0, 0x8DBE0E5F805CAD36, 0x7530AC9C6CF68E35,
+ 0x891A338814ED7939, 0xE8214B6BDB3206B1, 0xE4A66072C4497E62,
+ 0xFC14BB667F4EC9A0, 0x5648857D9958EF6C, 0xCE2487DDB79E1FAC,
+ 0x49687EF7BFB13209, 0x72F4723CF6652529, 0xD291228D7308942B,
+ 0xF00DE97DE596928C, 0xF7017FC9A08BF910, 0x1AB9C11568F592BE,
+ 0xB48A4ECE91C1B9D0, 0x0BC340B19ED82B04, 0x435D352B0BD8FCEF,
+ 0x3544FFDBB90F5CEE, 0xACB9B26C18141308, 0xF0D3923E920D0C84,
+ 0x67D95EEE3D2892EE, 0xCBBF9791DAC6ABFA, 0x2107CA17EEB2D41F,
+ 0x0A15B8536117F7F8, 0xE38EFD17847C5965, 0x299F455128902084,
+ 0xE3C19C842DA0FC7F, 0x438542355030A02B, 0x09B20BFDA067ADC3,
+ 0x207E8E2296B7B8C3, 0xAE2034D10DF42664, 0x8AEC66374C6A4CAF,
+ 0x021C5E382756DF1F, 0xDAB397892E258D3F, 0xBBEB27F2593CA22C,
+ 0x02F538557C761FBD, 0x5D1F93565BD28C1D, 0xF93CE73599B8AA44,
+ 0x118489EF0E0ED804, 0x26E9A60FC55BA1A7, 0x2D592A941EE1BBCA,
+ 0xF3E4EA86BB639898, 0x8A2C6F5594D4EF71, 0xD3DD68B3E2E12B5D,
+ 0xE3A3F757D7EE1599, 0xA4C0E18D9997F82D, 0xBD32A8C683CB1B29,
+ 0xA059953A4F92D812, 0xBB2289A9855D888C, 0x677D6EF341DA321A,
+ 0x2B4FFC49B1821BD2, 0x0257E7E26F413397, 0xCB31728801CB390C,
+ 0x3CB685B21CB3FBA1, 0x788DB8A125D301BB, 0x63BFFA8112F19D42,
+ 0xA26082BE05E4E1AC, 0x2FA9937F2125AB76, 0xE5E315E2266C09BD,
+ 0xDC5B8B66D671F135, 0x7F354193FABCB03A, 0x3C9D682D7F698313,
+ 0x8BA04039FF140FDC, 0x312A0A394E8C9048, 0x1A2290ECB9F91D01,
+ 0x28CD49E7AF451EC0, 0x0F6ADBDE5FFFC10A, 0xC53C8C75FA7DCF99,
+ 0x01FC98CCB44CA6F3, 0x6BD7A58209C968C0, 0xAC23BCFD1A4FA2E1,
+ 0x7FC86C6FB1B0E97C, 0x9ED901F601EAF9F0, 0x95F1081A1BEBBF37,
+ 0xDB26CD0DA39B1F05, 0x4C6E73DF5FB3F0FA, 0x3EB86A198B26131C,
+ 0xCAC5592422935EBD, 0x95EACD29BF617EFA, 0x2F41A05EFFE82B79,
+ 0xA86A40EF4867CAE7, 0x9C39B9117A125986, 0xE37D32CE39DBCB51,
+ 0x3F68378EB6844A13, 0x7CC5A27CA798F90C, 0x0620A80357EC10A5,
+ 0xEB8432E5703111DE, 0xE859F372BE354560, 0x82656F21A2C57145,
+ 0x14A9B7E1C553EA68, 0xD2D5DD6F9307BB8A, 0x14B7194207B5105C,
+ 0x8184D3C3A12DDC77, 0x519F29673D8158CE, 0xB3C32CA30F77E983,
+ 0x2128E5D7E296BBAA, 0xB3C36F108C02701B, 0x79799E52E875F1CF,
+ 0xFADFFB023A68E76C, 0xB092A17C4F389380, 0x26649815211577DA,
+ 0x64DF730E2B87A4FD, 0x1A5E4F14169CFCF2, 0xE076A65F976E635C,
+ 0xDCAD57936E017E84, 0x2123F4ADCFE3E761, 0x7689CE9C7291B34A,
+ 0x3128D6249BFEF6AF, 0xED98745FAD9BCAA0, 0xE48850A31635FB8B,
+ 0x06FD57BD0D326219, 0x1746DFA4E85901E7, 0xAE9D5A4533D88A6D,
+ 0x21EA70902DE52E47, 0x711024D7735E27C4, 0x8348E17F014190E7,
+ 0xF6DF0D50C6700128, 0x5B70ECABA6A01C98, 0x1114AF3E1DD46FD6,
+ 0x1E3C56823076FA3D, 0x642F2EB5A7C7C625, 0x75655A99C51920CD,
+ 0xEFC5E07D1C996040, 0xE3048644EF5FC2BA, 0xF381235F5959D426,
+ 0xB1485DBBF14BB82B, 0x340CA2AB7E8C3151, 0x5901BB9DD8C93107,
+ 0x1693701C2F0FD38A, 0x2265D674ECC395FB, 0xF951CBE74CDE4AF9,
+ 0x16DE85E3E0CB3310, 0x8B16C0143A0106FF, 0xF125B5B3CB45F407,
+ 0x79E7389F5CD3A367, 0x5A80B1E4EDB17199, 0x436EA05A3E377949,
+ 0x3A3D4ECDE00B34A0, 0xFFA49567F668FA93, 0x36BCAE2201E1C17C,
+ 0xEAC3650F973AD8D5, 0x430DBB8D05F92104, 0x5641EDCE3AC26AFB,
+ 0x786AFF702A2CACB4, 0xF6228018EEB3E205, 0x5223B6B884DA7B94,
+ 0xF69CB1725661CED8, 0x52D65674BB06447D, 0x10D976884A4D4E2E,
+ 0x85562963AFB9FD77, 0x3EB067C62ECCB316, 0xB715B82C4CD5704B,
+ 0xFC48C9515A696AAA, 0x91CA3A2FC6C97B48, 0x1E1227EEEA5AAE0F,
+ 0x1FCE1B1B0149C632, 0xFDD8AFD9F6466639, 0x645338F3EB8392C8,
+ 0x3318915B53748398, 0xBB711937AFAA09E5, 0x5FC32FF1B3C1FE1D,
+ 0xACA39DBE6F87B608, 0xBED2B1B1C036C554, 0x22DAAF24CAF4F53D,
+ 0xF854E55A212471D9, 0x7D2D07779B25563B, 0x85ED851CDC95DBE4,
+ 0x6FF966162C13E934, 0x0886BA4D85F776EC, 0x4FC3757CCC791C7D,
+ 0x67171D83FE93E855, 0x650428C5A5D69909, 0x1A4AF2BC95B74227,
+ 0x26AE05E937CC6E58, 0xB6EBF6A679FC9DBC, 0x6A289F831DB090A4,
+ 0xFED906D8873153D8, 0x8D17068C2FCB255D, 0x9CE6F36322E5F0E9,
+ 0x99505EC4777D1D28, 0xCEA31A15FC3F4432, 0x40EF079C4F26C32B,
+ 0xF9C2CB89F0B40D03, 0x4F10DBC4BC83DE6D, 0xE34AE5CB8798EC34,
+ 0x632D8651CC6CAF6B, 0xCE4797BD98CA8826, 0xC28D82EDC7BCD3B2,
+ 0x2AFB56FFB2280BF9, 0x0FAA53BA70BB13F1, 0xB88C9BEE75F865DB,
+ 0x65B9747600C27A47, 0x7147367E52B391D3, 0x9A10C6322889967A,
+ 0xD667521FE7E68D9F, 0x41B14D505D608D8A, 0x2A8D5EE472197B7A,
+ 0x9E0D40E0B7D84D86, 0x8FAEF64A9F40B830, 0x085A45BF37C66777,
+ 0xDD26FE46494978CD, 0xC336AC136D0EF2D0, 0x93D63D524059298F,
+ 0x758E39DEB59FB07A, 0x9F5087D97A5ABFA6, 0xEA89450159E9B256,
+ 0x0B81091656CF23AC, 0x8BDD7C9476FA3428, 0x0CD33C02749D58A8,
+ 0xC14D4DCE4D984D74, 0xBCEA2DF9BA5EE882, 0xFDFB1D43FA94D0CA,
+ 0xEC038FBE3F78E4BC, 0x0C83727C60A40C3B, 0xB60283FD1A1F7DF8,
+ 0x83647DDF5A6EA43A, 0x45E2C5FA1164677D, 0x12C2242292D83289,
+ 0x67C64BB1516CF2FD, 0xDEFC03FA52D573DD, 0xF2DA185F6FCEF553,
+ 0x280C9FAE8BEBE1C3, 0x5C4648C6AC8E2156, 0x39F3ACDDAAFF23EC,
+ 0x426570EEFF59D494, 0x19C3BE0BD6F859FB, 0x23CE10871775DA1A,
+ 0xBA648A66CCC808C4, 0x51BE41EA51A28FD8, 0x34DF5E938481F74F,
+ 0x6100816D3340A466, 0x70548249C75E5120, 0xBA79702279A00748,
+ 0x6F067133E39C6F68, 0xD4A56F6DE85BF670, 0x9BC03ABAA6FC1A71,
+ 0x7896217952937711, 0x04CF9FD6C613F747, 0xADB4E5E44BD90F88,
+ 0x994FD52DF174D699, 0x30042813012C0114, 0xF26207D02A6E2994,
+ 0xD01EA8CA8B4289E4, 0x288B2E9FB77EC8C2, 0x062AB5EF441C44B9,
+ 0x023017B24D33E3F7},
+
+ {0xC9C549126B629FC5, 0x13D2028D708FFC38, 0x99BF4A68002FA9F9,
+ 0x959B2BDBBF79C584, 0x2A6AE3A9AF0DEF7F, 0x3961DFF94E0F2FC3,
+ 0x375602F6CB38090E, 0xFF27FA5FB4361DAD, 0x27F105C6FF7A86A7,
+ 0x89C6A294797B99FD, 0x859C810D3E650654, 0xCD5FAEBDAA91E7A4,
+ 0x80B70152513A0E3B, 0xF3D5225D6212305A, 0x0B2E2D04D6E0A998,
+ 0xBC00734CB44E2BC4, 0xDF6923BF27418C14, 0x6B0D8E79BBC2202C,
+ 0x4F5354ECCF70BFBD, 0x3004547DA9FC32F9, 0x284A7E7F49AB8971,
+ 0x7C4C5273348AECA7, 0x4AF7B4566A7D274F, 0x41144E72C6576B5E,
+ 0x94DE31E88FFF2C89, 0xC4B22594D0138A97, 0x63EFE7A453EA6DDF,
+ 0xB611ECB4722FE373, 0xF819C4B88FC3DF60, 0x93E879D9871E50B2,
+ 0x0AB6063FF823AB24, 0x1D753E36002FE0A2, 0x59155829A234E540,
+ 0x2A3A5EF606E16C73, 0x398EED502BA793DF, 0xA2E4CD3D50E7C902,
+ 0x455226EE9CC01966, 0xE783C5FAA4A03BB8, 0xE627076A6A926733,
+ 0x7ECFF39F7A1F3091, 0x0CFB8FC622B3ED44, 0x3BF287327CC97604,
+ 0x16588EBC87273BFD, 0x23AD2E3D79DC9FA4, 0x6F33F954DC3DDFAA,
+ 0x8855135E2935EF4E, 0x980A08E4CADE1B0B, 0x0AE829C4B9832D25,
+ 0x7E26508CB0E1D951, 0x014E05A1EFEF032A, 0x7D73E257F5E46436,
+ 0x3EDDB5EABF92518C, 0xBEB2E77DE87FBEA2, 0xE774B1C87370FA54,
+ 0x8212C2D3FD68BCD3, 0x80FDFEBF5965C349, 0x36E0BE298259B3C2,
+ 0x7900B71C3BBDE591, 0x4BE48027CBABC230, 0x9AB8623D10F1DDB8,
+ 0x67353FE74B23E082, 0x14D19143CD01BBD9, 0x9B8F27FEE6873317,
+ 0xA80F9F28BE002243, 0x95E3326A1A5D0985, 0xE9CDFC8A83BB7D8B,
+ 0xDD5BDCBFB6238048, 0xAC5DB086974C4A25, 0x3138A84A6EE55DF9,
+ 0xB6AAFF87D1AAAB74, 0x7D882D01EAC51639, 0xB1D786708070B049,
+ 0x2B2D6ACBBE60CA03, 0x7E9FB44B03BB7CDD, 0xD46CD6E2B7355F16,
+ 0x28189952E1F24EF1, 0xAB1BB900C9ED265C, 0xE2D04CF2396E9E95,
+ 0xE90B7C2BC71EDFBF, 0x2BFD0239BCAA1AE2, 0xD5A67AC75C09E06C,
+ 0x1042C9914BD7A768, 0xB95D116A50577DF5, 0x4D5BA7FD9302A958,
+ 0x10EFB35D7C44D04C, 0x2840CD3BBFE8A000, 0x6E1D0B91BF83166F,
+ 0xC94BEADCE2A22661, 0x29F3DEC66D94A52B, 0x6DE8D82598C80D5A,
+ 0xDBA35D1E9FC9976E, 0x70C6F78CCB1DC1AC, 0x5F89D50A1A0F5014,
+ 0x89BA6ABE2675A341, 0x2E91CA2D639705C6, 0x0A1E10F5ECB1CDF8,
+ 0xC6F4D4C76CA28E32, 0x6C1F1960E1FFBA3D, 0xFDABA7B749417CCB,
+ 0x2EBE5734F41BB7B7, 0xFF1B3883F1C9AB13, 0xD2BB196566A38EFA,
+ 0x7B512382658E0EA5, 0x935BB5D4A12A9BF7, 0x960FBAA2555C0B70,
+ 0x3E525A53AED652B2, 0xB391181888F09E91, 0xEB9C20C7852CB5B6,
+ 0xFE412D512E5FC6F7, 0xFCE8C877AEBF0456, 0x64E554384FAE86D3,
+ 0x3F7FCB2D2961457A, 0xEAAA1911B7B127B4, 0xFB0705A22D459DC0,
+ 0xE1BDFA1C0BFDEE98, 0xF87B87A9F83C326A, 0x5EF4FBCDA686CCD5,
+ 0x3A6062109261F2CB, 0x6DE5ADF39C432638, 0xD3E5B2421AA14DF5,
+ 0xB8C3E2A48D04B5AB, 0x353AD3256B300551, 0x2C293E7B5CD65ED1,
+ 0xD1424A125365A941, 0x2D7DABF9A99A9EF0, 0xA22E73F4144C14B0,
+ 0xB28D10B4DAEDEACE, 0xED1C674702891AF1, 0x97086B1018A4CF83,
+ 0xE2BFABED37127735, 0x02F6EA6EE53CEE62, 0xABD1EE13E70FB008,
+ 0xC74EF42B9A66ADC1, 0xB37D68BD31CF57BA, 0x50FE1D7E33412595,
+ 0x5E1D0F55FF19FA60, 0x60BC42EF8A205D65, 0xF6C988FE294D1666,
+ 0x58FBD06F63EB46E3, 0x6EF46444A4CDBE82, 0x8B5264728BD852F1,
+ 0xBCAE0DB7DD7356F2, 0xA668BEA6E240D70C, 0x3B57508CB52C4041,
+ 0x896E399798C84992, 0x55762FF107ED577E, 0x594A7E2FBCB2EB8F,
+ 0x9AEBC80F2B38F26A, 0x43E6DD993FE053CB, 0xBD77A7E5122AEAAD,
+ 0xE7928B16D1212579, 0x095BD76F6E364AE7, 0x45C5C8EC7B9A739E,
+ 0x192B00027D4F1F15, 0xC7370445FF3569DA, 0x4D89F2C82087874D,
+ 0x3001B7CAB20DC804, 0x8E85FFCF7DE4AB5D, 0x3BA794F55A19ADE7,
+ 0x1D485BEBF50C76DA, 0xE937C2354A69FF66, 0x65B0FDC5E27F9505,
+ 0xFDEC5B5707A41CB5, 0x56226E58F0342F9D, 0xE47B29225D24BE40,
+ 0x0708B0582DA0D569, 0xCAEACAFB626D88B6, 0xD9A23DDAFC49DE6C,
+ 0x0E54F8C288AE7A36, 0x5A16100CF86D7CA0, 0x1B400779B429DCFF,
+ 0xFFDB45E8FE03B385, 0x55883F5A18C4C190, 0x36080E4DE983C048,
+ 0xA7619E4D5D7023BA, 0xEA1B4448FAE19DF1, 0x920A7A62FF9BE5DA,
+ 0x8D630C913A8457B3, 0xC1317AAD19B125E4, 0x2AC60DA85EF6A4FC,
+ 0x18453D57CBE16E34, 0x5B3D0DC184E910D3, 0x5989E958B02A738C,
+ 0xA76A21342AE3153D, 0x6C9A6DA3A6B590C3, 0x9294F2B261FFD9FC,
+ 0x5DC7ABBC0A085E11, 0x718F3BE7FD0598BF, 0x8552331CA17183EC,
+ 0xC702CAA9151C171F, 0x02A6E9CD28FC2637, 0x1D79CE9FCA06C85D,
+ 0xF990DF8D4704243D, 0x4A5C1F56FE965B3C, 0x603347ADDC37A650,
+ 0x1CAE34EB5EBB9A97, 0x137D411F4DEFE9FE, 0x8B1E6D8B9D92A7DD,
+ 0x5888051BBD7DE708, 0x2A05F513CD02F32D, 0xF37A6090024DF9AA,
+ 0x3E9D2A7E829CFEF2, 0x61D25546792B1059, 0x1B042CABCC51561C,
+ 0xBA6A92F3C9C23431, 0xDAFA0C012658242F, 0x15388A8C97D1C6E1,
+ 0x1D75A986270AE314, 0x00AD6269F740DAF5, 0xE11ACD2629ED5C7D,
+ 0x78B8E95513F8D4C2, 0x9B4216455EB07F9E, 0xDE96E41B398E740F,
+ 0x47F4DBAA6AF2216B, 0xE324E52ED534622F, 0xBFA0F89B7BF36FA7,
+ 0xAD459D4846671973, 0xBC8C0111A08779BF, 0xBF7E8F32F914239A,
+ 0x7C039FA68DCBCC5C, 0xB2C77934F9D19EE2, 0x2014EFF97BF6F383,
+ 0x18A1E15B762D0A76, 0xAB97671844F7D0F7, 0xD900ED19F558726F,
+ 0xC40702BEFEF81427, 0x3C04AD1AA20E9FEC, 0xA5994E7F4FAE1300,
+ 0xC30D8C955DFFC1E9, 0x28B67F51321D79A4, 0x80805CDDCAAC217A,
+ 0xC450000E76A4C407, 0xE6B11477FB29BA1F, 0xB6117B2EDB67EFDF,
+ 0x90919CF5F2402660, 0x870990DEE6953D45, 0x59DCA2BBE1D1EFE0,
+ 0x1AFC02321CB98FBD, 0x4D64D3E14F230A06, 0x6711320EA8A9F71A,
+ 0xB30472183291CE32, 0x50E85B556358D19B, 0x75574349C061908A,
+ 0xD8FD1AA7E4FC7A61, 0xC01E9492FB30E932, 0x8EE6D89FAA3D9A2E,
+ 0xF8B5C1B7C0B0BA37, 0xD81FDFDD54EB3270, 0x9CD27406EB1FF9F7,
+ 0x338CAE31F8B82E2F, 0x85FD727AB033FA40, 0xD702FBCBB7403203,
+ 0xDE77DD60D4423BA3, 0x4C85C9518E850016, 0x7A70931FEE8600A5,
+ 0xADBBA0197CD52986},
+
+ {0x626263A3B381D4D1, 0x28913CD012DA73DA, 0x6B41DD34C1ADA2FB,
+ 0x8D97DA19B167ED9B, 0xB4812D4C5BB6CDA7, 0x669C5EB0AB412ED2,
+ 0xD3C0D38280BCADE4, 0x961F99BE007375C9, 0xE1CD3F0D18427E6B,
+ 0x2F8E1F31AC07916B, 0x0BCB45904214A966, 0x080DEA4FE4402AB8,
+ 0x3164DA2C4EC6D4B3, 0xEC1AB3E0371AA403, 0x703CC4A2D61C9EAF,
+ 0xDF938277B360CC64, 0xA809622ED1CA223A, 0x0D0C41C61FC1CB73,
+ 0x6B1D07D0F7631F64, 0xCD6C472B23716169, 0x7C547D101DE31920,
+ 0xB8AA5D5D5A08B84D, 0x8783FA268476EEC3, 0x4AD24805DEA948D4,
+ 0xEFD4680DE1082145, 0x1F400A6F5CB25D7B, 0x5830BAE8DFC1B3DD,
+ 0xA52EEAC39FA9E4E6, 0xE780295AA1FDA9CB, 0x05292076633BD6C1,
+ 0x84F452863BCCD3F0, 0x0C0FFA13A48AC0E7, 0xC10B071D8F38B069,
+ 0xFC797F140A0C843B, 0x55B2102F2B6F2CBA, 0x6A65ABF4BC13F3D5,
+ 0x7AB981E9ED36BC8A, 0x01590DEDE28853A9, 0x880A305A45927BB5,
+ 0xAD60BEC2758C9434, 0x4F5CC2D0842FFFA1, 0xB56BC910589D9119,
+ 0x29510482F6B85BCB, 0x191C5E8C0AAC8F1D, 0x53AEE004B3A760B2,
+ 0x6C47171AE122EE50, 0x8F882588C3AF791D, 0x3AB1E787787F23A2,
+ 0x740A3D69F574F889, 0x563A7542EE0275A9, 0x1D4C7F0288B0F4BD,
+ 0x0B6A095505C57B60, 0xFCDC13AC38250CC2, 0x7C0F6DD8FEE40397,
+ 0x75D040BD4F8C08B0, 0xDA40BCD1AB461EA7, 0x0BB2664FB361B106,
+ 0xFF88C17C7ECBBDF3, 0xCB397F5A34BD8C06, 0x2C79097E71DC4099,
+ 0x0C7E28743703E385, 0x6B4E04AB3244D2E0, 0x7FB8C9F38282173F,
+ 0x21AFABC5CA89F8C3, 0x3AA25BFAE9E1B88B, 0x77E8C0B888B0B2EE,
+ 0x8D7E99220B214D8B, 0xE4C85444B026A4F2, 0xF29A85E1881A45A5,
+ 0x73105CDEBCF4939A, 0x6B923A2FFAA6D9CD, 0x44EB8BB4794D87DF,
+ 0x0A60094B3CB6F83C, 0x03661679A1F217E8, 0x963C57F0455BA773,
+ 0x48ED66F36494C7AA, 0x0B20EAFD85EB9191, 0x1C890980EFA34C0D,
+ 0xBDA11E825B6095DB, 0x3E193DB7CE3E5F19, 0xD52A1E3477B0CC82,
+ 0x489DB03838376CC8, 0x3CEF20B0BC9F84E9, 0x70CB14480EC62200,
+ 0x246227A4A55EE063, 0x7AF69EB03F5EA747, 0x39FA87659196B7F3,
+ 0x81ECEEFE543BB263, 0x041009D0CF373731, 0x62836B24EEC15E94,
+ 0xB498922DBAB7E562, 0xB8A4FCA94750926A, 0x880C34678827F078,
+ 0xD9ADAD0A8D1D0854, 0x6F3054702D3DE155, 0xFFF92A2DA11FD9B0,
+ 0x6B012A4C96009615, 0x95BD42D4CA1FF867, 0xB1B1B706A1B652C4,
+ 0x606C1C06836140CC, 0x687393E9571F598B, 0x7FB3189C01008403,
+ 0x196DC6E309DD3F96, 0x2EE2504E4FA033AF, 0x656EDD9C1C2898DA,
+ 0x1CF705B8EBE7ED56, 0xA335F9DE920E0456, 0x176E632D59157144,
+ 0x37B8036FBDE47E04, 0x8DB69C255B58351D, 0x75E3AD18FA15C435,
+ 0xB88F8FA79E7ACD2E, 0xF4F1ADB22C44430A, 0xA6F667B7787DE551,
+ 0x7F5A7205AAB32994, 0x415894996FFDADD7, 0x0066BB6CDDC58D69,
+ 0x73355DBCC89631CF, 0x4431FD499E8875DB, 0x497D7F92A785C0A1,
+ 0x9E1259957CD82824, 0x06AA4F3FE70CA2A2, 0x2089374C701AD9E5,
+ 0x9232A152F12FA6F5, 0x8642D5B1E978751D, 0xB983D466746FC062,
+ 0xB927B4CDD4A40163, 0xD318EFA72D4E8E2C, 0x0739C2B135066E85,
+ 0x288D2F5EC554BB59, 0xE932090E1594B11D, 0x99AAE93439757411,
+ 0xB6355EBE7352D0D5, 0xC55036D033D4CE1A, 0xCF62E455765770ED,
+ 0xD35B32D0879CEC65, 0x4A7F75A91E55A387, 0xDBA77CCE6BBA86C5,
+ 0xA5BD40453312CC34, 0xC873CF4AD2B21BDA, 0xFB57ACBBFFF82A86,
+ 0x548532941E5C97F5, 0xC66A0BF8E8A5EBA2, 0x4263CE77F7EB6DE5,
+ 0x2E8A6099FB9CB50C, 0x1D45AB6111B0DCB0, 0x7FE52FF300874786,
+ 0x595B7D86EA04E95F, 0x02670CBA727270DC, 0xDA2647DCAC755BCC,
+ 0x587200296A36C48A, 0xDCB2C01C8B852F55, 0x9437511867ECA888,
+ 0xDA15A6EBE12F1ACA, 0x6BB01516C79BA56C, 0x59D5512650DA86FE,
+ 0x2508641E00EFB3D8, 0x1082864880F8737B, 0xB353426A76C9620F,
+ 0x1133CD70565B0C38, 0x4758F74C3AE9A9C7, 0x3C3158E934173FD8,
+ 0x932EAB7FF21856F6, 0xEE6E49FA9C5D22BB, 0xF0D5647DA187773A,
+ 0x12D8F8D9175D50B5, 0xCC1D89F26CA5F76B, 0xAD350118288382EF,
+ 0x2E8209A98951707A, 0x429AC0E06E896040, 0x1FA39EAB38C767F8,
+ 0x0DB3875C9089C512, 0xD833C218B2296004, 0x51D022375837CDA6,
+ 0xB197EFD3310610EC, 0x96D9426A03DD99F1, 0xA668A96A49BD5595,
+ 0x88B9C5A482DEF3CF, 0xCE29AA1123CE0CCE, 0xE8C5D1BEDFEB8F4C,
+ 0x9FD5C941FA43F815, 0x71403B035037F8D6, 0xF96985771B6CAEF5,
+ 0xB0CEAEF1407FA726, 0xDAE80323BC5687EE, 0xE766D91350438AB1,
+ 0x83352D6317D820D4, 0x471FAF84D19B9D6B, 0xB68B6E05C551787A,
+ 0x0D82CB9A2FD0ED0A, 0x9C9FA69B835533CF, 0x529708C8B631A586,
+ 0xAE6E7D9A9A021C8D, 0x3776E16D46423ABD, 0xE26768F257FA285A,
+ 0xD1064D1D8071EC0B, 0x87DD00CA296EC314, 0x55664BAA77126B71,
+ 0x84923CEA48B80A5D, 0xCEEF0FB7CDBE63E8, 0xEE9CD1F8F1BA69D1,
+ 0x630CB18DCEF9F6D6, 0x9ACCCFEC1E5B0B8B, 0xA7C603D6C1771990,
+ 0x8D8CFCA125F0FC18, 0x21B3040B45983A58, 0x779277D37F6F40B7,
+ 0xE00E05C70D0DD723, 0x2E06042A483503D1, 0x11E6C7594E2D37BC,
+ 0xB05774BB3125D878, 0xF2F37B26D9686660, 0xEC467268C4B86304,
+ 0xBCB60695B6C2FE57, 0xBD0F1F36040BE959, 0x3717E742E40C6ACB,
+ 0x3CC4804C944F7A20, 0x460408E2E1B06095, 0xA670D0945BE59F3A,
+ 0x302057B370FF72B1, 0xDA167250DCC3541C, 0x05640270451078B4,
+ 0xB76AA32013FC0D9A, 0x46AEEECD80943D79, 0x40ECDF130731B4A1,
+ 0x97AD3D679928A042, 0x504F5C189FA51C84, 0x4E87AFD137482693,
+ 0xA2BADFB0FAFEA200, 0x1F87EA7EC1EC7232, 0x5AE7467498550A62,
+ 0x46078EAF639D8B94, 0xFCD6039345449DC5, 0xF1D0921E12BBF3E1,
+ 0xA8278D27BF1494D9, 0x3AAB6E1FDAA2078C, 0xA7056D8748FE8393,
+ 0xEDE587F7AA7F0D10, 0x7CC2F685085F2B73, 0xAB013AA88CD2F44F,
+ 0xE728EE7494DB1A90, 0x91E7AD1C7A9DC3A0, 0x0B50F837CCCA0AB9,
+ 0x6F4FAF4B3591C776, 0x8ECEF7BB5EB62F62, 0x38B856766C7E761F,
+ 0xA804C793B28B69D6, 0xE1ED19F49068CDB7, 0x49104B4C4DD93914,
+ 0xD5EAB4E714DBDCCE, 0xC5CC85B5C060507F, 0xDB32425C0D97E0AA,
+ 0x40982C04911C28C2, 0x2CC09E5BBEB228EB, 0x12D0EE550AE54C7F,
+ 0xCDA4DBE4290E1192},
+
+ {0xC8E7EE2A6D35A85D, 0xE65C4BA2BDB172A3, 0x24E778560394EA96,
+ 0xC2B27A43E3B8DE3A, 0x68851CA62A4E9602, 0x5C55530FE3B65709,
+ 0x879085274307A299, 0x55EF07A5128D13E4, 0x9D725027DBFCE0D1,
+ 0x1F0A36B7042A8604, 0xC0B998CFE7483209, 0x68C3492A53196622,
+ 0x74AB18A58026E986, 0xB2A80581C9BB8E61, 0xF6BEA5D51868B77E,
+ 0xFB9EEF919206448B, 0xD994BE0A28AB72B3, 0x9E4F201F17E3A924,
+ 0xE417494C2B40948B, 0xF181F1AD48176EC8, 0x4E6DFACE8A54167E,
+ 0x03EAE7EBCCD76504, 0xADB580CF9AEFD7EC, 0xC95F10516FC1822C,
+ 0x16B4DBCA7E2AF7B6, 0x4C2C1E92A3FD8B1E, 0x2C47E98AF402DB8F,
+ 0x41B35ECC6648A3F4, 0x3E6304DBBAB7D72F, 0x7FC1AAEAF908800E,
+ 0x221D7A4945772D5B, 0x2C2E0622FC7D0EBA, 0x9642246B05B23630,
+ 0x0A7B0F45486B606D, 0x13177F6FCE892312, 0xD1CB0F1F6DFCC606,
+ 0xAA78E533377B4884, 0xD6B52F4A8C9E2A60, 0x99B73FD0ACE073AC,
+ 0x6C15A0193AB9C716, 0xDFC2B9DAB731F594, 0x346570BDBEEFF775,
+ 0x72C4AA3D7F315855, 0x33A724C96D575675, 0x048D4945B24864EB,
+ 0x4A133231D8592CC0, 0xD5C73DB05E524096, 0x37FF9F3C0083DDB2,
+ 0x62CF329FB4CA2C7A, 0xFA32EB7340C80018, 0x44A0BEBCC3FF0AF4,
+ 0xE69FDA32090494F2, 0x5BC6B8759CD4735D, 0xEBD794C34F999AC3,
+ 0x15EC4AB381966658, 0x04227560AAD6E119, 0x666F53B1C2D0E5CF,
+ 0xFDA528678C635D9A, 0xA95E2B06AF981F38, 0xAC8D213BAF14763E,
+ 0x618980C706184FD8, 0x065FB48BFBED58F2, 0x3530BF7072F45B25,
+ 0x63496CF13DA894A7, 0x10B0AAB9B53D00D5, 0xC94D06690A504E9F,
+ 0xB0188F98A1416C8F, 0xD617690189DB2B89, 0xD6C5973072B0D296,
+ 0x41C5AF732550CA99, 0x1F14A4CD472685D4, 0x7FF0EB3059940A8F,
+ 0x6AD4BB06B2CFC19A, 0x26CAAFF27D31965B, 0x24BAC753CA8C7495,
+ 0x0BD00E001AD03531, 0xC85A61F41B4F63BF, 0xC069E56EA641FC8B,
+ 0x58F03B9F82249453, 0x3845C8E628849C2C, 0x35A07EAA2B311D24,
+ 0xBD87A6CAA8808EE4, 0x6132969AF471FEEE, 0xAD3CA83EFFC050F2,
+ 0x92F28FADFE9548EE, 0x4A445E95E2B96A7F, 0x0CD740D338AC4E9E,
+ 0x22CBDBA02CACEE06, 0x2EF0B47ED4A26551, 0x95162DFE6F77218E,
+ 0x949BBE6E2C5E18CB, 0xD858457AE86AEB8F, 0x70160C4C32FCC035,
+ 0xDA1B117537022CC1, 0x4155B446242E9516, 0x0EBB3A91C05F6DC1,
+ 0x72CE4A139155F85E, 0x968D1D2BE2202DAA, 0x0DD112E69A43590B,
+ 0x54571D7106AA1177, 0x8185CF7C873A83D2, 0xB60E081435FC7665,
+ 0x1119443E61477BCD, 0xBE341A447FBF3154, 0x207BB1320C48C47F,
+ 0x4ABDA6DE378E0293, 0x6107CEF20273CE94, 0xDB975B82DE2E74B7,
+ 0xB5C328A45210420A, 0xFD5DB064FF0CE588, 0xA13D0310EA1451F2,
+ 0x43B7383D053E52AE, 0x0E8EF259EB10920A, 0xAD3AD1E9745478B4,
+ 0x6205B40C776A6AF2, 0x555382797179A5A3, 0x2FFE1524EFCC58F9,
+ 0x7CF888C7BC0799F2, 0xCDA43BA405DDBB75, 0xB5477636677732F6,
+ 0x01319EC2188D7305, 0xC304C3C9C905CE9C, 0xF1FE7A84086D9818,
+ 0x33FFC90248AFEFEC, 0x5F936E7E0B73F2A5, 0x997533FE57D3D2BC,
+ 0xA8727C21D3025478, 0xB9A5ECB6D2B53213, 0xA719EC619141CF64,
+ 0x575191E04E65313A, 0xE939E987FCC67DC8, 0xE311DC20B4BF98CA,
+ 0x83B18F3FE3C6B19A, 0x45A3F7DBE43309F2, 0x29C88527BB7E1798,
+ 0x9BD9065395ED5092, 0x3AFA47133CB87F2F, 0x79D33156F2A0AEB5,
+ 0x4E391928829ED724, 0x45976E853A57156C, 0x274ECB26774225DC,
+ 0xF01D518D64D90A76, 0xB7AA9CD93BDF7DFC, 0x675187C1DDE860D2,
+ 0x5B27441797399AA3, 0x34A484AE25A7D8CC, 0x3313743EEA047C38,
+ 0x6642F851A39F0FE0, 0x7E784F26458566B6, 0x1667EB5A365039B7,
+ 0x320CD5C287747C42, 0xC500626988237C54, 0x1900CD551BEA8F06,
+ 0x1CB2EB6D1009C5F8, 0xFE4467CE9DE6B84C, 0x474907E7E930D4DE,
+ 0x9A03748021094135, 0x1D01A2CD1671E5E7, 0xEA36E4D4BAEE3186,
+ 0xFDC80A189B81415B, 0xF05E5C2CEAD51307, 0xB10BF4AB1BF091DD,
+ 0x9A360064E7EFF780, 0x002D8FD679033659, 0x2CB6755A67B7F1A9,
+ 0x74289C32DAC31036, 0x8B43C5F7E46D7626, 0xA5824FF7A1C04253,
+ 0xBE299B6E486689D6, 0xA6A36640B0E7ED10, 0xEFCE1B3B69319579,
+ 0xA4C7511EEF2E25D6, 0xE734535A0A39E4D7, 0x0D4058B97CBA88FF,
+ 0x3FA7B14B24CDC6CD, 0x97B32577F69EE7D2, 0xF456EADE82A767FB,
+ 0x0010AE7A6C3454D4, 0x35A647CF2DFE414F, 0x5F939DE1E6B3A564,
+ 0x761CD4B5F4B8F9DE, 0x32701D9F38859564, 0x927008126BC94ED2,
+ 0x04CA39A82D3EE4A0, 0x26FF262BE4C1CD83, 0xD8171EDC5EAF11B2,
+ 0xE67378C44FB8DBBE, 0x43821B229ED5B95D, 0xF7049AAC3635CBE4,
+ 0x1C4DDDB37B9AFD05, 0xF0CBF5B4691CD3D3, 0x6976C062ED0FFE99,
+ 0xD936DB478E654D9B, 0x22F34DBE8B13F2E7, 0xCCB7DC2DE2731B06,
+ 0x85F8BD4FCBDF97FA, 0x02FAB7045B1C055F, 0x97A94E31DB778B87,
+ 0x2882DF5FC805577D, 0xB695D74F9A30DE4A, 0x0CF049C0A7345FA5,
+ 0x96B9509F55F63483, 0x3084D0AFBE224AAD, 0x84CA453BC82105E9,
+ 0x9B4D589D4A02FECF, 0x3136FBBA8192321A, 0xBD97D146DF9F4E2B,
+ 0xB9F8040962D96DA1, 0xEDCF51D37D9621F7, 0x8DECA39042A16FFD,
+ 0x9441F853C1504B57, 0x9D1024FD82563051, 0xD34746588B2CE81A,
+ 0x6BEA6D58DF62C819, 0x31029351D2E7904E, 0xDDB03A88345FCBDB,
+ 0xE62307DB8BADD207, 0x32E5BB8925D326F4, 0x290DDC6CF8B1C598,
+ 0x0B7248827F06A000, 0x7679EE16865E48EB, 0x1F3BAB764D8FE8CF,
+ 0x3CB0E848F54B3538, 0x956D9C6EECEC3965, 0x73EC71CE0828103A,
+ 0x86FBEE17D8845ADD, 0xE60D3AFF0F007CBE, 0x89D3033A550F2A11,
+ 0x2E081952F84293A0, 0x974F0F245BD0A5E7, 0xFE79914859C60354,
+ 0x8982ACEAFD60F579, 0xE1233F40905919BE, 0xFAB1DFF38F021851,
+ 0xC430D68AFFB03AA2, 0x2BB72E416FAA9D5E, 0xAD3A44FE8079644A,
+ 0x2E9561FB8B801944, 0x3300A1E2C054CCF4, 0xD8084D497FFF7A10,
+ 0xC33E8B2B8828E728, 0xD1B3DEB329DD52C0, 0x31B88B43F606C5FE,
+ 0xB4212E76E6DC6095, 0x93324E6411A911AA, 0x5138BEA009DEBCCC,
+ 0x5BBA38F1987EECB8, 0xA2FCFCA27891EFB9, 0xFB0C2EF580179636,
+ 0x0625A4AE64B186C9, 0xF3CF2FCBC3C58C0F, 0xF5EA740F98982795,
+ 0x2564A9C150FFBA8C, 0xE62645E8043D11BF, 0xBF3FCCC3619B3C35,
+ 0x73D10F6B60D11815},
+
+ {0xA8E12082D7624114, 0x9245F1A7A0997271, 0xAD40A4311D954016,
+ 0xC18B37D3FFBEA3CA, 0x9F75CB789BDCC8D1, 0x543457A71981F784,
+ 0x7940B92E57823865, 0xEE91834176D1A1CF, 0x265FF2A579D6FAED,
+ 0xB66BF86CB191E358, 0xB0E5C8A0964F04AE, 0x407D0DC8595D3934,
+ 0x5DFF91E9D6352EC1, 0xB9D495DD6FE7EBD8, 0x815BCF0EDFEDB01F,
+ 0xC02BF2BB2A2A6FA7, 0xCD2F1CEA53958F27, 0x0683592403762063,
+ 0x0F26652B5091303B, 0xE43FFB8885812210, 0x3205ADA9F0D3640A,
+ 0x22807158D37A7403, 0x8B17A7AAA8121956, 0xE5B239C95AE32EF1,
+ 0xA14B442A7EF8C780, 0xE1449CA4F16ADD48, 0xE6079B9D7714A475,
+ 0x9A9F36ADB6FCE01C, 0x053444FDEF512622, 0x9E1C5A27A97414F3,
+ 0x97158027964BBA33, 0x3577193E76F39380, 0x503C38D0899EE5A7,
+ 0x56F8A8386D84D297, 0x46301A01246C0F8A, 0x5340554DD1C86B9A,
+ 0x5C02E7A5A846AEAD, 0x94AF414D21FFE6CE, 0x7AB72F4275B1701D,
+ 0x37800AA8B54E391C, 0x796EC8A820644CDB, 0x3257B2C90337228A,
+ 0x36FA9CEEE74E624B, 0x8715D5B910D11736, 0xF450DFB3840B3808,
+ 0x877336D0A96226C1, 0xF1B1D7EAF1EF9164, 0xA234ABEB1CC6D6F5,
+ 0x5C9378781B51529B, 0x851E350D710845C6, 0x5DD5164748FED079,
+ 0x9327398D83D5CD98, 0xB3721C8D87BDA627, 0x21F6D79FC003D794,
+ 0x3375B31563AB92B8, 0x83BC7E579D936ECC, 0x3DA3D1EB726E0F38,
+ 0x21AEDA1E95BDA637, 0x877FFA5529B29937, 0x432303F07D4DD09E,
+ 0xF4970D01770AD733, 0xD9A755DAD173E41F, 0xC8CE6C2632B896E0,
+ 0x9C20F5D8623E9196, 0x5B90DCC953048D23, 0xAF339F2A14763FD0,
+ 0x4BB23C18895CD2BA, 0x8F9F3E95F22CEA61, 0x374B5A39DB49BB9D,
+ 0xE8D0649554DD3240, 0x3686F79BD4AA41F0, 0x92345E7B3F4B9805,
+ 0xB9210C91B1B72896, 0x909B40770A717BD4, 0x7165196685C3BA29,
+ 0x819E949DC1F68FF5, 0x35981A79BDC9B23D, 0xA8ABA317D6362F42,
+ 0x4395E8D918C5D29E, 0x24A9AF953ED557DC, 0x1E8B609F9289CF48,
+ 0xCF94872A5E21CC20, 0x88F2A9DFFF3D5B30, 0xF82694A79A525209,
+ 0xA6730AD7996CB74D, 0x5960CA440F7B3D2D, 0x10272FCB8474D797,
+ 0x11B5C7975713E5C5, 0x881D6984156E7F67, 0x4265E61A40384B34,
+ 0x658F30B6F57BFE38, 0x2D30CEC9B7D2141F, 0xB4DE84C92F235B18,
+ 0xF6C84891BBD361B1, 0x09AC2B3F99A4DF60, 0x139D9360FEE621FA,
+ 0x35E1ACEFD867644F, 0x95D6FE63E2C3ED5B, 0x4127228476DAD854,
+ 0x9A030F1D35D0610A, 0xEF67FCA008316188, 0x1AE36D97427BFC2B,
+ 0xAA0A541207EBCDD1, 0xF21A86A982BA0A5B, 0xA158626CC13DA4F2,
+ 0x8454855F71F362B5, 0xA4A02DA6CD956970, 0x3A1933A20A413562,
+ 0x7FB08FD190C1750D, 0x95C9D6D8F0A5597F, 0x905F7A12F8B9F05F,
+ 0x14F063982721D6C8, 0xE1C81055EAF345E4, 0x8B02B1F9A7B91569,
+ 0x907307319BB4D3A2, 0x22FC429A762E202B, 0x4C8298D584C50557,
+ 0x4EE680F9D55E8E1C, 0xA59AADB37A64D4AB, 0x777AEF54255C6BAF,
+ 0xB9E9CD12C9F6D03F, 0x0486405D89E12012, 0xA8F32195AD9B848A,
+ 0x24536A63053F1662, 0xB8ABDF34B4352046, 0x008E066DDF7B1BF0,
+ 0x0937FA7D9D183D1A, 0x1A5396EF432972AF, 0xB07471DD5EA1912A,
+ 0xFA5DFDA5DB809F3B, 0x151E0E66B664D54F, 0x1BBC2143B288B9AB,
+ 0xABC02F7631CC1927, 0xF9A4AE96F9834DB0, 0xF8193501A12927BA,
+ 0x650FCD815770113E, 0xE0CE618E5B52DA6D, 0xB5B152BE30A8B07C,
+ 0xDAD8F353972ECC52, 0x99D4AEBC060A6A0F, 0x08E62828868BB696,
+ 0x5167F893396D2F36, 0x1F2E9E73C80E8F85, 0xE0AB823094E08AB3,
+ 0xDC0BEABAACC05EDD, 0xB6753A97DA5A8058, 0xCFDB118A67D4916F,
+ 0x51D9C89214F493F4, 0xC26167305289B384, 0x97160AB71A7E4CEF,
+ 0x973179255169012B, 0x7771F3EF6E0C219E, 0x5E09D8BBE3A6AE29,
+ 0xA711508CEC25DD3E, 0x04279E53EFF42D64, 0x9B8A1B3518BB56E9,
+ 0x221111F31D86B8D4, 0xE97D5EE7ABDE1FB8, 0xBC734F44DF744FAC,
+ 0xDFC032C98833DA84, 0xF7A162F11B585ECC, 0xA6D1166246CE8EEA,
+ 0x0C6BD217156F8815, 0x439D1F080BA22869, 0x652E7C122E040C21,
+ 0x1747E6D3B2983347, 0x16B5B9143BDB4F64, 0x0E17A5C775C2EE40,
+ 0x53F23FAD5AC19C45, 0x937348E6DECA163C, 0x26D8F5211D908278,
+ 0x2CA9D3196906EBAA, 0x64D9C221B876DBE8, 0xF5BD98B39765093A,
+ 0xF2EFCBB39AC97411, 0xA01C2699CADA8BBF, 0x6ABC75F617DBEC7C,
+ 0x23A862F326261E25, 0x7DEF17B30E43CCF9, 0xE454CB7EC51A1D90,
+ 0x8D441891ABA6BEBE, 0x2F2DA70DCC76EF77, 0x439676424FA5A358,
+ 0x49BBDCEE76067631, 0xF63A6BD29775D777, 0x5DFDDB9B12E8FCA9,
+ 0x09A674E06451281A, 0xE418486E062AC31D, 0x3B180BBE4A1E515A,
+ 0xD0CB5C961B63E731, 0x9E8149929AD99C72, 0xEC51E0A5193CA3EB,
+ 0xFA21CE56A89D7E17, 0xB08547231034F2EB, 0xB0EEFD1E2BC1FBAA,
+ 0x0A8AD2D2753F3F42, 0xE283BEFA009FF8EC, 0xE1D4FC1FF2132D83,
+ 0x9DAE527A8DE56FF6, 0x336F47D657E3EFB0, 0x660AAEC7B4DA8111,
+ 0xA6DCB60F391303AC, 0xF85A3D5BF5D59398, 0x900E22F664D6875E,
+ 0xFA4C029F198DBAAD, 0x4D773F305C40752E, 0xEC2386ABD852D287,
+ 0x7B1A582851235AEF, 0x207FF1EA50D9D7E1, 0xE969BE8B38C1865C,
+ 0x99FA2391FD44F7B7, 0x910EF30F8F61DACE, 0x7E313EAFA58D460E,
+ 0xCF3AC88D24E28A32, 0x61B92C3C1990400C, 0x940CE033C5F94165,
+ 0xD035E3678AD93195, 0x35CF0C9BA37347E2, 0x7798C3C39EDF6978,
+ 0x7FBFD530B558D69B, 0xA6CF9EA4C6FD06A8, 0x56E996F2C3C1629F,
+ 0x0E1DC63B951C705C, 0xCC124FBCD97D41DC, 0x400342714ACDD337,
+ 0x1365793B1B5E6497, 0x869266F1299C7352, 0xD74CEA89E67B7194,
+ 0xC47E30EE84EF357F, 0x0DB3483C5653CD54, 0x8C9A962EB061CFE0,
+ 0xBB242F2B4B07D64A, 0x25814925B674FFAD, 0x2ADFEB635DD35CC9,
+ 0xAF510E642C60DA37, 0x169475C9F7DC6F53, 0xD4D553F641A01782,
+ 0xE9FAEAEC2FFE94CE, 0x4936FA1BBBD9097E, 0x7B8A614E856107AB,
+ 0xD21A345A686A03B4, 0x50C20AC660123213, 0x6997AFA323E3573D,
+ 0x430C76E287C5D8F5, 0x4BFE61429794D597, 0xEDA7F3F70FF8F1A1,
+ 0x0A137800E0F0F7E7, 0x9C376D1E98B7BE7C, 0x10F892DF487C4C27,
+ 0x812AB00AB6486D79, 0x24C3C23FA0CB549B, 0x5F20AAC86BB637D8,
+ 0xBF2FAD7CDA8F11B8, 0x9B14B76D08EF72BE, 0x8A0E0EEC190EBEBA,
+ 0x8CF97F6ECE339C68}}};
+
+void Blowfish2::initialize(std::string const &key) {
+ uint64_t data, datal, datar;
+ Sboxes = S;
+ uint64_t j = 0, keylength = key.length();
+ for (uint64_t i = 0; i < N + 2; ++i) {
+ data = 0x00000000;
+ for (uint64_t k = 0; k < 4; ++k) {
+ data = (data << 8) | key[j];
+ if (++j >= keylength) {
+ j = 0;
+ }
+ }
+ PArray[i] = P[i] ^ data;
+ }
+ datal = 0x00000000;
+ datar = 0x00000000;
+
+ for (uint64_t i = 0; i < N + 2; i += 2) {
+ encrypt(datal, datar);
+ PArray[i] = datal;
+ PArray[i + 1] = datar;
+ }
+
+ for (uint64_t i = 0; i < 4; ++i) {
+ for (uint64_t k = 0; k < 256; k += 2) {
+ encrypt(datal, datar);
+ Sboxes[i][k] = datal;
+ Sboxes[i][k + 1] = datar;
+ }
+ }
+}
+
+Blowfish2::Blowfish2(std::string const &key) { initialize(key); }
+
+uint64_t Blowfish2::F(uint64_t x) {
+ unsigned int a, b, c, d, e, f, g, h;
+ uint64_t y;
+
+ h = (unsigned int)(x & 0xFF);
+ x >>= 8;
+ g = (unsigned int)(x & 0xFF);
+ x >>= 8;
+ f = (unsigned int)(x & 0xFF);
+ x >>= 8;
+ e = (unsigned int)(x & 0xFF);
+ x >>= 8;
+ d = (unsigned int)(x & 0xFF);
+ x >>= 8;
+ c = (unsigned int)(x & 0xFF);
+ x >>= 8;
+ b = (unsigned int)(x & 0xFF);
+ x >>= 8;
+ a = (unsigned int)(x & 0xFF);
+
+ y = Sboxes[0][a] + Sboxes[1][b];
+ y ^= Sboxes[2][c];
+ y += Sboxes[3][d];
+ y ^= Sboxes[4][e];
+ y += Sboxes[5][f];
+ y ^= Sboxes[6][g];
+ y += Sboxes[7][h];
+ return y;
+}
+
+void Blowfish2::encrypt(uint64_t &xl, uint64_t &xr) {
+ uint64_t Xl = xl;
+ uint64_t Xr = xr;
+
+ for (uint64_t i = 0; i < N; ++i) {
+ Xl ^= PArray[i];
+ Xr = F(Xl) ^ Xr;
+ std::swap(Xl, Xr);
+ }
+
+ std::swap(Xl, Xr);
+ Xr ^= PArray[N];
+ Xl ^= PArray[N + 1];
+ xl = Xl;
+ xr = Xr;
+}
+
+void Blowfish2::decrypt(uint64_t &xl, uint64_t &xr) {
+ uint64_t Xl = xl;
+ uint64_t Xr = xr;
+
+ for (uint64_t i = N + 1; i > 1; --i) {
+ Xl ^= PArray[i];
+ Xr = F(Xl) ^ Xr;
+ std::swap(Xl, Xr);
+ }
+
+ std::swap(Xl, Xr);
+ Xr ^= PArray[1];
+ Xl ^= PArray[0];
+ xl = Xl;
+ xr = Xr;
+}
diff --git a/tests/Main.cpp b/tests/Main.cpp
index 3f7ffd2..70dbf71 100644
--- a/tests/Main.cpp
+++ b/tests/Main.cpp
@@ -1,12 +1,3 @@
-/**
- * /mnt/z/my_git/blowfish/src/Main.cpp
- * @file Main.cpp
- * @author Avinal Kumar
- * @since March 06, 2021
- *
- * Test Program
- */
-
#include
#include
@@ -59,6 +50,7 @@ int main(int argc, char const *argv[]) {
std::cout << decipher << std::endl;
if (message == decipher) {
+ std::cout << "Test successful!" << std::endl;
return 0;
} else {
return 1;
diff --git a/tests/Main2.cpp b/tests/Main2.cpp
new file mode 100644
index 0000000..f7aba57
--- /dev/null
+++ b/tests/Main2.cpp
@@ -0,0 +1,58 @@
+#include
+
+#include
+
+std::string from_uint(uint64_t sh) {
+ std::string re("");
+ for (int i = 0; i < 8; i++) {
+ re += (unsigned char)(sh >> i * 8);
+ }
+ return re;
+}
+
+int main(int argc, char const *argv[]) {
+ std::string key("test@pass47");
+ std::string message("My name is Avinal and I am cute and smart");
+ std::string cipher("");
+ int len = message.length();
+ int j = sizeof(uint64_t);
+ int rem =
+ ((len > j * 2) ? (((len / j * 2) + 1) * j * 2 - len) : (j * 2 - len));
+ message.append(rem, '\0');
+ len = message.length();
+ Blowfish2 blowfish(key);
+ std::cout << "My message is: " << message << std::endl;
+ uint64_t lm, rm;
+ for (size_t i = 0; i < len; i += 16) {
+ lm = 0;
+ rm = 0;
+ lm = *reinterpret_cast(
+ const_cast(message.substr(i, 8).c_str()));
+ rm = *reinterpret_cast(
+ const_cast(message.substr(i + 8, 8).c_str()));
+ blowfish.encrypt(lm, rm);
+ cipher += from_uint(lm) + from_uint(rm);
+ }
+ std::cout << cipher << std::endl;
+ std::string decipher("");
+ len = cipher.length();
+ std::cout << "length: " << len << std::endl;
+ for (size_t i = 0; i < len; i += 16) {
+ lm = 0;
+ rm = 0;
+ lm = *reinterpret_cast(
+ const_cast(cipher.substr(i, j).c_str()));
+ rm = *reinterpret_cast(
+ const_cast(cipher.substr(i + j, j).c_str()));
+ blowfish.decrypt(lm, rm);
+ decipher += from_uint(lm) + from_uint(rm);
+ }
+
+ std::cout << decipher << std::endl;
+ if (message == decipher) {
+ std::cout << "Test successful!" << std::endl;
+ return 0;
+ } else {
+ return 1;
+ }
+}