Skip to content
Snippets Groups Projects
Commit fac869aa authored by dam1n19's avatar dam1n19
Browse files

ATO2-24: Added ID Passthrough to hash compression

parent 1ba87935
Branches
Tags
No related merge requests found
...@@ -21,12 +21,14 @@ module sha256_hash_compression ( ...@@ -21,12 +21,14 @@ module sha256_hash_compression (
// Data In data and Handshaking // Data In data and Handshaking
input logic [511:0] data_in, input logic [511:0] data_in,
input logic [5:0] data_in_id,
input logic data_in_last, input logic data_in_last,
input logic data_in_valid, input logic data_in_valid,
output logic data_in_ready, output logic data_in_ready,
// Data Out data and Handshaking // Data Out data and Handshaking
output logic [255:0] data_out, output logic [255:0] data_out,
output logic [5:0] data_out_id,
output logic data_out_last, output logic data_out_last,
output logic data_out_valid, output logic data_out_valid,
input logic data_out_ready input logic data_out_ready
...@@ -61,12 +63,15 @@ module sha256_hash_compression ( ...@@ -61,12 +63,15 @@ module sha256_hash_compression (
logic [31:0] T1, T2; logic [31:0] T1, T2;
// State Machine Registers // State Machine Registers
logic [2:0] state, next_state; logic [2:0] state, next_state;
logic [255:0] next_data_out; logic [255:0] next_data_out;
logic [5:0] next_data_out_id;
logic next_data_in_ready, next_data_out_valid, next_data_out_last; logic next_data_in_ready, next_data_out_valid, next_data_out_last;
logic [5:0] hash_iter, next_hash_iter; logic [5:0] hash_iter, next_hash_iter;
logic last_block, next_last_block; logic last_block, next_last_block;
logic [5:0] next_id, reg_id;
// // SHA-2 Constants // // SHA-2 Constants
logic [31:0] K [63:0]; logic [31:0] K [63:0];
...@@ -156,6 +161,8 @@ module sha256_hash_compression ( ...@@ -156,6 +161,8 @@ module sha256_hash_compression (
data_out_valid <= 1'b0; data_out_valid <= 1'b0;
data_out_last <= 1'b0; data_out_last <= 1'b0;
data_out <= 256'd0; data_out <= 256'd0;
data_out_id <= 6'd0;
reg_id <= 6'd0;
// Reset Working Registers // Reset Working Registers
a <= 32'd0; a <= 32'd0;
b <= 32'd0; b <= 32'd0;
...@@ -181,6 +188,8 @@ module sha256_hash_compression ( ...@@ -181,6 +188,8 @@ module sha256_hash_compression (
data_out_valid <= next_data_out_valid; data_out_valid <= next_data_out_valid;
data_out_last <= next_data_out_last; data_out_last <= next_data_out_last;
data_out <= next_data_out; data_out <= next_data_out;
data_out_id <= next_data_out_id;
reg_id <= next_id;
// Set Working Registers // Set Working Registers
a <= next_a; a <= next_a;
b <= next_b; b <= next_b;
...@@ -214,6 +223,8 @@ module sha256_hash_compression ( ...@@ -214,6 +223,8 @@ module sha256_hash_compression (
next_data_out_valid = data_out_valid; next_data_out_valid = data_out_valid;
next_data_out_last = data_out_last; next_data_out_last = data_out_last;
next_data_out = data_out; next_data_out = data_out;
next_data_out_id = data_out_id;
next_id = reg_id;
// Set next Working Registers // Set next Working Registers
next_a = a; next_a = a;
next_b = b; next_b = b;
...@@ -283,6 +294,8 @@ module sha256_hash_compression ( ...@@ -283,6 +294,8 @@ module sha256_hash_compression (
next_state = 3'd2; next_state = 3'd2;
next_hash_iter = 6'd0; next_hash_iter = 6'd0;
next_last_block = data_in_last; next_last_block = data_in_last;
// Store ID Value
next_id = data_in_id;
// Drop Ready Signal to confirm handshake // Drop Ready Signal to confirm handshake
next_data_in_ready = 1'b0; next_data_in_ready = 1'b0;
end end
...@@ -317,6 +330,7 @@ module sha256_hash_compression ( ...@@ -317,6 +330,7 @@ module sha256_hash_compression (
if (last_block) begin if (last_block) begin
if (!data_out_valid) begin // No Data waiting at output if (!data_out_valid) begin // No Data waiting at output
// Output updated H values // Output updated H values
next_data_out_id = reg_id;
next_data_out = {a + H[0], b + H[1], c + H[2], d + H[3], e + H[4], f + H[5], g + H[6], h + H[7]}; next_data_out = {a + H[0], b + H[1], c + H[2], d + H[3], e + H[4], f + H[5], g + H[6], h + H[7]};
next_data_out_last = 1'b1; next_data_out_last = 1'b1;
next_data_out_valid = 1'b1; next_data_out_valid = 1'b1;
......
...@@ -19,48 +19,55 @@ module tb_sha256_hash_compression; ...@@ -19,48 +19,55 @@ module tb_sha256_hash_compression;
logic sync_rst; logic sync_rst;
// Data In data and Handshaking // Data In data and Handshaking
logic [511:0] data_in; logic [511:0] data_in;
logic [5:0] data_in_id;
logic data_in_last; logic data_in_last;
logic data_in_valid; logic data_in_valid;
logic data_in_ready; logic data_in_ready;
// Data Out data and Handshaking // Data Out data and Handshaking
logic [255:0] data_out; logic [255:0] data_out;
logic [5:0] data_out_id;
logic data_out_valid; logic data_out_valid;
logic data_out_ready; logic data_out_ready;
logic data_out_last; logic data_out_last;
sha256_hash_compression uut ( sha256_hash_compression uut (
.clk (clk), .clk (clk),
.nrst(nrst), .nrst (nrst),
.en (en), .en (en),
.sync_rst(sync_rst), .sync_rst (sync_rst),
.data_in(data_in), .data_in (data_in),
.data_in_valid(data_in_valid), .data_in_id (data_in_id),
.data_in_ready(data_in_ready), .data_in_valid (data_in_valid),
.data_in_last(data_in_last), .data_in_ready (data_in_ready),
.data_out(data_out), .data_in_last (data_in_last),
.data_out_last(data_out_last), .data_out (data_out),
.data_out_valid(data_out_valid), .data_out_id (data_out_id),
.data_out_ready(data_out_ready)); .data_out_last (data_out_last),
.data_out_valid (data_out_valid),
.data_out_ready (data_out_ready));
logic data_in_drive_en; logic data_in_drive_en;
logic data_out_drive_ready; logic data_out_drive_ready;
logic [511:0] data_in_queue [$]; logic [511:0] data_in_queue [$];
logic data_in_last_queue [$]; logic [5:0] data_in_id_queue [$];
int data_in_gap_queue [$]; logic data_in_last_queue [$];
int data_in_gap_queue [$];
logic data_in_wait_queue; logic data_in_wait_queue;
logic [255:0] data_out_queue [$]; logic [255:0] data_out_queue [$];
logic data_out_last_queue [$]; logic [5:0] data_out_id_queue [$];
int data_out_stall_queue [$]; logic data_out_last_queue [$];
int data_out_stall_queue [$];
logic data_out_wait_queue; logic data_out_wait_queue;
// Handle Valid and Data for data_in // Handle Valid and Data for data_in
always_ff @(posedge clk, negedge nrst) begin: data_in_valid_drive always_ff @(posedge clk, negedge nrst) begin: data_in_valid_drive
if (!nrst) begin if (!nrst) begin
data_in <= 512'd0; data_in <= 512'd0;
data_in_id <= 6'd0;
data_in_valid <= 1'b0; data_in_valid <= 1'b0;
data_in_last <= 1'b0; data_in_last <= 1'b0;
data_in_gap <= 0; data_in_gap <= 0;
...@@ -75,8 +82,9 @@ module tb_sha256_hash_compression; ...@@ -75,8 +82,9 @@ module tb_sha256_hash_compression;
if (((data_in_valid == 1'b1) && (data_in_ready == 1'b1)) || if (((data_in_valid == 1'b1) && (data_in_ready == 1'b1)) ||
(data_in_wait_queue == 1'b1)) begin (data_in_wait_queue == 1'b1)) begin
// Data transfer just completed or transfers already up to date // Data transfer just completed or transfers already up to date
if ((data_in_queue.size() > 0) && (data_in_last_queue.size() > 0) && (data_in_gap_queue.size() > 0)) begin if ((data_in_queue.size() > 0) && (data_in_id_queue.size() > 0) && (data_in_last_queue.size() > 0) && (data_in_gap_queue.size() > 0)) begin
data_in <= data_in_queue.pop_front(); data_in <= data_in_queue.pop_front();
data_in_id <= data_in_id_queue.pop_front();
data_in_last <= data_in_last_queue.pop_front(); data_in_last <= data_in_last_queue.pop_front();
if (data_in_gap_queue[0] == 0) begin if (data_in_gap_queue[0] == 0) begin
data_in_valid <= 1'b1; data_in_valid <= 1'b1;
...@@ -96,7 +104,9 @@ module tb_sha256_hash_compression; ...@@ -96,7 +104,9 @@ module tb_sha256_hash_compression;
logic [255:0] data_out_check; logic [255:0] data_out_check;
logic [5:0] data_out_id_check;
logic data_out_last_check; logic data_out_last_check;
int data_in_gap; int data_in_gap;
int data_out_stall; int data_out_stall;
...@@ -145,8 +155,9 @@ module tb_sha256_hash_compression; ...@@ -145,8 +155,9 @@ module tb_sha256_hash_compression;
$finish; $finish;
end end
if ($test$plusargs ("DEBUG")) $display("data_out_last match! packet %d | recieve: %x == check: %x", packet_num, data_out_last, data_out_last_check); if ($test$plusargs ("DEBUG")) $display("data_out_last match! packet %d | recieve: %x == check: %x", packet_num, data_out_last, data_out_last_check);
if ((data_out_queue.size() > 0) && (data_out_last_queue.size() > 0)) begin if ((data_out_queue.size() > 0) && (data_out_id_queue.size() > 0) && (data_out_last_queue.size() > 0)) begin
data_out_check <= data_out_queue.pop_front(); data_out_check <= data_out_queue.pop_front();
data_out_id_check <= data_out_id_queue.pop_front();
data_out_last_check <= data_out_last_queue.pop_front(); data_out_last_check <= data_out_last_queue.pop_front();
if (data_out_last_check == 1'b1) begin if (data_out_last_check == 1'b1) begin
packet_num <= packet_num + 1; packet_num <= packet_num + 1;
...@@ -161,14 +172,16 @@ module tb_sha256_hash_compression; ...@@ -161,14 +172,16 @@ module tb_sha256_hash_compression;
// File Reading Variables // File Reading Variables
int fd; // File descriptor Handle int fd; // File descriptor Handle
logic [511:0] input_data; // Temporary Input Data Storage logic [511:0] temp_data_in; // Temporary Input Data Storage
logic input_data_last; // Temporary Input Data Last logic [5:0] temp_data_in_id; // Temporary Input Data Storage
int input_data_gap; // Temporary Input Gap logic temp_data_in_last; // Temporary Input Data Last
int temp_data_in_gap; // Temporary Input Gap
logic [255:0] output_data; // Temporary Output Data Storage logic [255:0] temp_data_out; // Temporary Output Data Storage
logic output_data_last; // Temporary Output Data Last logic [5:0] temp_data_out_id; // Temporary Output Data Storage
int output_data_stall; // Temporary Output Stall logic temp_data_out_last; // Temporary Output Data Last
int temp_data_out_stall; // Temporary Output Stall
initial begin initial begin
$dumpfile("sha256_hash_compression.vcd"); $dumpfile("sha256_hash_compression.vcd");
...@@ -192,24 +205,27 @@ module tb_sha256_hash_compression; ...@@ -192,24 +205,27 @@ module tb_sha256_hash_compression;
// Read input data into Queue // Read input data into Queue
fd = $fopen("../stimulus/testbench/input_message_block_stim.csv", "r"); fd = $fopen("../stimulus/testbench/input_message_block_stim.csv", "r");
while ($fscanf (fd, "%x,%b,%d", input_data, input_data_last, input_data_gap) == 3) begin while ($fscanf (fd, "%x,%d,%b,%d", temp_data_in, temp_data_in_id, temp_data_in_last, temp_data_in_gap) == 4) begin
data_in_queue.push_back(input_data); data_in_queue.push_back(temp_data_in);
data_in_last_queue.push_back(input_data_last); data_in_id_queue.push_back(temp_data_in_id);
data_in_gap_queue.push_back(input_data_gap); data_in_last_queue.push_back(temp_data_in_last);
data_in_gap_queue.push_back(temp_data_in_gap);
end end
$fclose(fd); $fclose(fd);
// Read output data into Queue // Read output data into Queue
fd = $fopen("../stimulus/testbench/output_hash_ref.csv", "r"); fd = $fopen("../stimulus/testbench/output_hash_ref.csv", "r");
while ($fscanf (fd, "%x,%b,%d", output_data, output_data_last, output_data_stall) == 3) begin while ($fscanf (fd, "%x,%d,%b,%d", temp_data_out, temp_data_out_id, temp_data_out_last, temp_data_out_stall) == 4) begin
data_out_queue.push_back(output_data); data_out_queue.push_back(temp_data_out);
data_out_last_queue.push_back(output_data_last); data_out_id_queue.push_back(temp_data_out_id);
data_out_stall_queue.push_back(output_data_stall); data_out_last_queue.push_back(temp_data_out_last);
data_out_stall_queue.push_back(temp_data_out_stall);
end end
$fclose(fd); $fclose(fd);
// Initialise First Checking Values // Initialise First Checking Values
data_out_check = data_out_queue.pop_front(); data_out_check = data_out_queue.pop_front();
data_out_id_check = data_out_id_queue.pop_front();
data_out_last_check = data_out_last_queue.pop_front(); data_out_last_check = data_out_last_queue.pop_front();
data_out_stall = data_out_stall_queue.pop_front(); data_out_stall = data_out_stall_queue.pop_front();
......
...@@ -45,7 +45,10 @@ def main(): ...@@ -45,7 +45,10 @@ def main():
message_block_last_list = [] message_block_last_list = []
message_block_gap_list = [] message_block_gap_list = []
message_block_stall_list = [] message_block_stall_list = []
hash_list = []
# Hash Output List Initialisation
hash_list = []
hash_id_list = []
hash_stall_list = [] hash_stall_list = []
# ID Lists # ID Lists
id_gap_list = [] id_gap_list = []
...@@ -161,7 +164,7 @@ def main(): ...@@ -161,7 +164,7 @@ def main():
hash_list.append(hash_val) hash_list.append(hash_val)
# Write out Input ID Seed to Text File # Write out Input ID Seed to Text File
input_header = ["id_seed", "use_seed", "last"] input_header = ["id_seed", "use_seed", "last", "gap_value"]
with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "input_id_stim.csv", "w", encoding="UTF8", newline='') as f: with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "input_id_stim.csv", "w", encoding="UTF8", newline='') as f:
writer = csv.writer(f) writer = csv.writer(f)
for idx, word in enumerate(expected_id_list): for idx, word in enumerate(expected_id_list):
...@@ -175,7 +178,7 @@ def main(): ...@@ -175,7 +178,7 @@ def main():
writer.writerow([word, "1", expected_id_stall_list[idx]]) writer.writerow([word, "1", expected_id_stall_list[idx]])
# Write out Input Data Stimulus to Text File # Write out Input Data Stimulus to Text File
input_header = ["input_data", "input_data_last"] input_header = ["input_data", "input_data_last", "gap_value"]
with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "input_data_stim.csv", "w", encoding="UTF8", newline='') as f: with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "input_data_stim.csv", "w", encoding="UTF8", newline='') as f:
writer = csv.writer(f) writer = csv.writer(f)
for idx, word in enumerate(in_data_words_list): for idx, word in enumerate(in_data_words_list):
...@@ -189,39 +192,39 @@ def main(): ...@@ -189,39 +192,39 @@ def main():
writer.writerow(["{0:x}".format(int(word, 2)), "0", "1", in_cfg_words_gap_list[idx]]) writer.writerow(["{0:x}".format(int(word, 2)), "0", "1", in_cfg_words_gap_list[idx]])
# Write out Cfg Stimulus to Text File # Write out Cfg Stimulus to Text File
input_header = ["input_cfg_size", "input_cfg_scheme", "input_cfg_id", "input_cfg_last"] input_header = ["input_cfg_size", "input_cfg_scheme", "input_cfg_id", "input_cfg_last", "gap_value"]
with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "input_cfg_sync_stim.csv", "w", encoding="UTF8", newline='') as f: with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "input_cfg_sync_stim.csv", "w", encoding="UTF8", newline='') as f:
writer = csv.writer(f) writer = csv.writer(f)
for idx, word in enumerate(in_cfg_words_list): for idx, word in enumerate(in_cfg_words_list):
writer.writerow(["{0:x}".format(int(word, 2)), "0", expected_id_list[idx] ,"1", in_cfg_words_gap_list[idx]]) writer.writerow(["{0:x}".format(int(word, 2)), "0", expected_id_list[idx] ,"1", in_cfg_words_gap_list[idx]])
# Write out Cfg sync reference to Text File # Write out Cfg sync reference to Text File
input_header = ["input_cfg_size", "input_cfg_scheme", "input_cfg_last"] input_header = ["output_cfg_size", "output_cfg_scheme", "output_cfg_id", "output_cfg_last", "stall_value"]
with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "output_cfg_sync_ref.csv", "w", encoding="UTF8", newline='') as f: with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "output_cfg_sync_ref.csv", "w", encoding="UTF8", newline='') as f:
writer = csv.writer(f) writer = csv.writer(f)
for idx, word in enumerate(sync_cfg_size_list): for idx, word in enumerate(sync_cfg_size_list):
writer.writerow(["{0:x}".format(int(word, 2)), "0", sync_cfg_id_list[idx], "1", sync_cfg_stall_list[idx]]) writer.writerow(["{0:x}".format(int(word, 2)), "0", sync_cfg_id_list[idx], "1", sync_cfg_stall_list[idx]])
# Write out Expected output to text file # Write out Expected output to text file
output_header = ["output_data", "output_data_id", "output_data_last"] output_header = ["output_data", "output_data_id", "output_data_last", "stall_value"]
with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "output_message_block_ref.csv", "w", encoding="UTF8", newline='') as f: with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "output_message_block_ref.csv", "w", encoding="UTF8", newline='') as f:
writer = csv.writer(f) writer = csv.writer(f)
for idx, word in enumerate(message_block_list): for idx, word in enumerate(message_block_list):
writer.writerow(["{0:x}".format(int(word, 2)), message_block_id_list[idx] ,message_block_last_list[idx], message_block_stall_list[idx]]) writer.writerow(["{0:x}".format(int(word, 2)), message_block_id_list[idx], message_block_last_list[idx], message_block_stall_list[idx]])
# Write out Message Block (Input) to text file # Write out Message Block (Input) to text file
output_header = ["message_block_data", "message_block_data_last"] output_header = ["message_block_data", "message_block_id", "message_block_data_last", "gap_value"]
with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "input_message_block_stim.csv", "w", encoding="UTF8", newline='') as f: with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "input_message_block_stim.csv", "w", encoding="UTF8", newline='') as f:
writer = csv.writer(f) writer = csv.writer(f)
for idx, word in enumerate(message_block_list): for idx, word in enumerate(message_block_list):
writer.writerow(["{0:x}".format(int(word, 2)), message_block_last_list[idx], message_block_gap_list[idx]]) writer.writerow(["{0:x}".format(int(word, 2)), message_block_id_list[idx], message_block_last_list[idx], message_block_gap_list[idx]])
# Write out hash value to text file # Write out hash value to text file
output_header = ["output_data", "output_data_last"] output_header = ["output_data", "output_id", "output_data_last", "stall_value"]
with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "output_hash_ref.csv", "w", encoding="UTF8", newline='') as f: with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "output_hash_ref.csv", "w", encoding="UTF8", newline='') as f:
writer = csv.writer(f) writer = csv.writer(f)
for idx, word in enumerate(hash_list): for idx, word in enumerate(hash_list):
writer.writerow([word, "1", hash_stall_list[idx]]) writer.writerow([word, expected_id_list[idx], "1", hash_stall_list[idx]])
def chunkstring(string, length): def chunkstring(string, length):
array_len = math.ceil(len(string)/length) array_len = math.ceil(len(string)/length)
......
Source diff could not be displayed: it is too large. Options to address this: view the blob.
eec110c2f50fb5d45bfd9bc9e7ba1afcc0be8b4ef9f8c434e57950152e278363,1,0 eec110c2f50fb5d45bfd9bc9e7ba1afcc0be8b4ef9f8c434e57950152e278363,0,1,0
f909a5ffce3c39bfb3104d9278f76b909dfbeb7c72f318dc8523ab11b6017090,1,1 f909a5ffce3c39bfb3104d9278f76b909dfbeb7c72f318dc8523ab11b6017090,1,1,1
bca58d138346c71535f7105fe4ecd57c0bcea4af11a5c7624b4fd62c31851cd3,1,1 bca58d138346c71535f7105fe4ecd57c0bcea4af11a5c7624b4fd62c31851cd3,2,1,1
2cf2aaad835c4e557fa24897f6b87667a3c178051b3ca8eae67fa91346a86d24,1,2 2cf2aaad835c4e557fa24897f6b87667a3c178051b3ca8eae67fa91346a86d24,3,1,2
35a06199ff501ac21d4233bf7a6d25a3e09603cf0f16bfb73752bf9684bf9b2f,1,2 35a06199ff501ac21d4233bf7a6d25a3e09603cf0f16bfb73752bf9684bf9b2f,4,1,2
88b6ec38427d9b17552a64632400e0d6f880c8590c92f76ac794a578e1757ffc,1,2 88b6ec38427d9b17552a64632400e0d6f880c8590c92f76ac794a578e1757ffc,5,1,2
a56b6d54666f68725f9c061a45c4bfb59528158a93ba81599958b8d789af6040,1,1 a56b6d54666f68725f9c061a45c4bfb59528158a93ba81599958b8d789af6040,6,1,1
52952e0cc3f1d7cef48e3f32f7eccd9e355dd5371a63ce8c8cf0ac8c8968d6ac,1,2 52952e0cc3f1d7cef48e3f32f7eccd9e355dd5371a63ce8c8cf0ac8c8968d6ac,7,1,2
c50f6cb58fb23704559d33a87a623dd02bc397c95c2d5878c0f23aca52a746a9,1,0 c50f6cb58fb23704559d33a87a623dd02bc397c95c2d5878c0f23aca52a746a9,8,1,0
dc6851fdd9c67feaa69b5a3b2b31e37e153c27b426316793aa085895bf8771c0,1,0 dc6851fdd9c67feaa69b5a3b2b31e37e153c27b426316793aa085895bf8771c0,9,1,0
71239b5cfbc19e1cf609fbe3beeef85e15661bae9ebd212781ae45d4cfdc9024,1,2 71239b5cfbc19e1cf609fbe3beeef85e15661bae9ebd212781ae45d4cfdc9024,10,1,2
8b68f60808e8ef66934656e0f02d898dd9db7bf6c9a32cf9c3e0ef4a1e24ddda,1,2 8b68f60808e8ef66934656e0f02d898dd9db7bf6c9a32cf9c3e0ef4a1e24ddda,11,1,2
7a8e26790d709976def2b47b89f4ec788ebfe0fbabdcb59c00b339e9441ab9a8,1,2 7a8e26790d709976def2b47b89f4ec788ebfe0fbabdcb59c00b339e9441ab9a8,12,1,2
b195f54e833faf94dfd1088b448e27602c6f7f2ceea6b930037e3ae21d8900d4,1,0 b195f54e833faf94dfd1088b448e27602c6f7f2ceea6b930037e3ae21d8900d4,13,1,0
ae1301202c1c94d77badc2283b7e0006fbe7847784a9b0f9db7956ab56f807cd,1,1 ae1301202c1c94d77badc2283b7e0006fbe7847784a9b0f9db7956ab56f807cd,14,1,1
29ce1d81699fad1cbd46893a8890f8d4794c943cd3dc2fe4cbaba1735df2e063,1,0 29ce1d81699fad1cbd46893a8890f8d4794c943cd3dc2fe4cbaba1735df2e063,15,1,0
b0e6d839a2ed92539ea11e52ae0a12f99589888101787b0580f3001ac92febcd,1,0 b0e6d839a2ed92539ea11e52ae0a12f99589888101787b0580f3001ac92febcd,16,1,0
ec283a687a761e9c369fa56fd11aeda350e90a8598b6589def0f94d4928f4bf9,1,2 ec283a687a761e9c369fa56fd11aeda350e90a8598b6589def0f94d4928f4bf9,17,1,2
cff2268d89ccf74500abbd3573c04c5f3aec12713ad8736bee5adba4bc3fb24a,1,1 cff2268d89ccf74500abbd3573c04c5f3aec12713ad8736bee5adba4bc3fb24a,18,1,1
653f3415aee10f739ae4231b17063acd35549c6a5702055b9edf0ccd052cea48,1,1 653f3415aee10f739ae4231b17063acd35549c6a5702055b9edf0ccd052cea48,19,1,1
ac2241b42ab756522c3967d97fcdf3b55d0856c27cb3ef33ee86964a7cadf4f5,1,2 ac2241b42ab756522c3967d97fcdf3b55d0856c27cb3ef33ee86964a7cadf4f5,20,1,2
5becbd245aaf6b2f5331b324bf24f6c09e7184a048de5b3e5f414147a15fe906,1,1 5becbd245aaf6b2f5331b324bf24f6c09e7184a048de5b3e5f414147a15fe906,21,1,1
e48a649307aec2d630cf7f16d05b1a9eb44c93510b08a2bc2a4edb0733876662,1,1 e48a649307aec2d630cf7f16d05b1a9eb44c93510b08a2bc2a4edb0733876662,22,1,1
0ed53354625d13aa87f94be3a79bd0f7cbccc9a343b0e471bc5b01f2525c7e8c,1,2 0ed53354625d13aa87f94be3a79bd0f7cbccc9a343b0e471bc5b01f2525c7e8c,23,1,2
7733a1b48bf7ad529bdeb0fec7f6e26359c8642d8d1426b2790ab1546b42932a,1,2 7733a1b48bf7ad529bdeb0fec7f6e26359c8642d8d1426b2790ab1546b42932a,24,1,2
2b8a039c232a83b457d343638869c7e54765ca33a4167683e7e5925b7e6ab605,1,1 2b8a039c232a83b457d343638869c7e54765ca33a4167683e7e5925b7e6ab605,25,1,1
2161868f3d67221c316f0f81809aee51b8985d29ac309af647f89d041eb5b1f8,1,0 2161868f3d67221c316f0f81809aee51b8985d29ac309af647f89d041eb5b1f8,26,1,0
e16735d170f450944771f9aee4f7de2341ced9dc42f928b97d0d488d7eec407e,1,1 e16735d170f450944771f9aee4f7de2341ced9dc42f928b97d0d488d7eec407e,27,1,1
18aaf3d16fb9068f086eae37f4a99023afb9baeafcf71b7149463267cb38ea70,1,1 18aaf3d16fb9068f086eae37f4a99023afb9baeafcf71b7149463267cb38ea70,28,1,1
607f502961bf7128dd0582b9a571efa0cea3e963ac67a9e3b456f52bb53a3cb9,1,0 607f502961bf7128dd0582b9a571efa0cea3e963ac67a9e3b456f52bb53a3cb9,29,1,0
8606079991b7a8abe0cd38e5769df5383235396f40c3358edab721d98003303c,1,2 8606079991b7a8abe0cd38e5769df5383235396f40c3358edab721d98003303c,30,1,2
d00b4ab93cae7da54b7abf7279db292a21d52044adb0ac6827be60659fc7cd0d,1,0 d00b4ab93cae7da54b7abf7279db292a21d52044adb0ac6827be60659fc7cd0d,31,1,0
08a55e5e5fa0661ee79d3ecd316fd7cc99dc7d8ed1c93facebde6ee1cf1076cd,1,0 08a55e5e5fa0661ee79d3ecd316fd7cc99dc7d8ed1c93facebde6ee1cf1076cd,32,1,0
eb267ad1eeae88c9d7f7002fb2ecfa91ef34a3e821aa973cb96351260e5758a0,1,1 eb267ad1eeae88c9d7f7002fb2ecfa91ef34a3e821aa973cb96351260e5758a0,33,1,1
03b9498cc22138daa719d5f4df3411328fba475d9b4ed555abc2f4d1421ef908,1,1 03b9498cc22138daa719d5f4df3411328fba475d9b4ed555abc2f4d1421ef908,34,1,1
70b5c750751a06fcd4a37fd218e6ec1bc9b333cc88b470834b5817d40503ec6e,1,1 70b5c750751a06fcd4a37fd218e6ec1bc9b333cc88b470834b5817d40503ec6e,35,1,1
6aa4e39368f7503a0ebbed7ed2d6ca319e4bc6d12850670521cc5ea39d3e9892,1,2 6aa4e39368f7503a0ebbed7ed2d6ca319e4bc6d12850670521cc5ea39d3e9892,36,1,2
9631860b028e749a622e45e75dcb0aba513e5132c84866c405817370cbc98e83,1,2 9631860b028e749a622e45e75dcb0aba513e5132c84866c405817370cbc98e83,37,1,2
088b8f12891abcf8a5a95315dd9055bd0f275a0ed4828e4438c739dd942ddf20,1,1 088b8f12891abcf8a5a95315dd9055bd0f275a0ed4828e4438c739dd942ddf20,38,1,1
cdbe7c3bfc8459eb7d30cd03a693904d6f77d02a41910fe4bcce07ac54128b3d,1,2 cdbe7c3bfc8459eb7d30cd03a693904d6f77d02a41910fe4bcce07ac54128b3d,39,1,2
8fb91ad478af62f3315016314c0ca35cc79138ee0a77be4ca60932bfc8c925eb,1,2 8fb91ad478af62f3315016314c0ca35cc79138ee0a77be4ca60932bfc8c925eb,40,1,2
5c994145e0457e4b27e17a1a4b91c3201febe4884427a6f97f565bb10cef1664,1,2 5c994145e0457e4b27e17a1a4b91c3201febe4884427a6f97f565bb10cef1664,41,1,2
00ed78a5e4367b0c00dede8fdd45b5f5560b82f42df04d2e731cd53b11ae0696,1,1 00ed78a5e4367b0c00dede8fdd45b5f5560b82f42df04d2e731cd53b11ae0696,42,1,1
9848aceeb1374534725a30e69cb10cf85b6de125ffb1ab0bde623c074d5f4be4,1,2 9848aceeb1374534725a30e69cb10cf85b6de125ffb1ab0bde623c074d5f4be4,43,1,2
e21d8b52aabe226501a62b3541c59c7387cbdd72896c4972dd207f2230bb40b0,1,2 e21d8b52aabe226501a62b3541c59c7387cbdd72896c4972dd207f2230bb40b0,44,1,2
4baf6fbc8dabc8f590d528a92a174c6ee601697321ce63ef6707c24e32a5aa26,1,2 4baf6fbc8dabc8f590d528a92a174c6ee601697321ce63ef6707c24e32a5aa26,45,1,2
19d91162f3c3f8bebc7093934a0feb2d0f4d49d68026f76d3e1852e74985e572,1,1 19d91162f3c3f8bebc7093934a0feb2d0f4d49d68026f76d3e1852e74985e572,46,1,1
d33034f6a11eb63a0442e86222a2378661e4303e88fde85d6111f2fc51a29564,1,2 d33034f6a11eb63a0442e86222a2378661e4303e88fde85d6111f2fc51a29564,47,1,2
72902677753a71ee277fc2d38421063afe18d4326758edf5681861cce8ef3d61,1,1 72902677753a71ee277fc2d38421063afe18d4326758edf5681861cce8ef3d61,48,1,1
ef5383ba7f7d24472a20c86b417329c4000970718e2663b98eb8b234b8ad1c82,1,1 ef5383ba7f7d24472a20c86b417329c4000970718e2663b98eb8b234b8ad1c82,49,1,1
18e2a439b5f6230f88763fb27473ed47e2ff2defe58532e73b59f5a4d90021fd,1,0 18e2a439b5f6230f88763fb27473ed47e2ff2defe58532e73b59f5a4d90021fd,50,1,0
45aee4075e3bbd4cab4af22210214a42e563999ce20ffa9f0017d2b87fdefc99,1,0 45aee4075e3bbd4cab4af22210214a42e563999ce20ffa9f0017d2b87fdefc99,51,1,0
efc8893b0c467f8db7690c1808f4e5401d1523a444da95ef387b98cad9131668,1,0 efc8893b0c467f8db7690c1808f4e5401d1523a444da95ef387b98cad9131668,52,1,0
21b572cbf923782a7eef9993d2034c1f2bff4629ce4b7064dc792f4f46701bff,1,1 21b572cbf923782a7eef9993d2034c1f2bff4629ce4b7064dc792f4f46701bff,53,1,1
c02db01c7f040be32a7bbf69f4b52290237631eb527b41e222379f58236f295f,1,0 c02db01c7f040be32a7bbf69f4b52290237631eb527b41e222379f58236f295f,54,1,0
40ea2fdfc79e1f1eb0d850308f2d5bae5cfdff4384d64e4e168e29d6c6dcb7ed,1,1 40ea2fdfc79e1f1eb0d850308f2d5bae5cfdff4384d64e4e168e29d6c6dcb7ed,55,1,1
b4f43d72c79515268f144661fb32993138d174ff8d54892b45a6c7dc6e0a4226,1,1 b4f43d72c79515268f144661fb32993138d174ff8d54892b45a6c7dc6e0a4226,56,1,1
bb47abbc0284f7f6b19b1f5fa8e9af87d2cf24770bb895d34727abcff90d85e6,1,0 bb47abbc0284f7f6b19b1f5fa8e9af87d2cf24770bb895d34727abcff90d85e6,57,1,0
e2d713a01cc9cba5bf722757a7cb6153ce6375baac52ee12e3e46a3b00915c4b,1,0 e2d713a01cc9cba5bf722757a7cb6153ce6375baac52ee12e3e46a3b00915c4b,58,1,0
25a4bdea8d4d42776a1d83da854dbd0430a34d6a4dcbee8eaf81279b15e12291,1,1 25a4bdea8d4d42776a1d83da854dbd0430a34d6a4dcbee8eaf81279b15e12291,59,1,1
324ca091ea1357a2bed7c1697827f6602275eae504a10126deb0cdc92546d5fb,1,1 324ca091ea1357a2bed7c1697827f6602275eae504a10126deb0cdc92546d5fb,60,1,1
fb8cbfdaba8d8de6c9446aef9fdb768c3a78d026bb798574bdac2a80a5dc5733,1,2 fb8cbfdaba8d8de6c9446aef9fdb768c3a78d026bb798574bdac2a80a5dc5733,61,1,2
4f9330b4a6897a4f6ad632da8d7117005fa1181ea456493d0c7101b0ae28de90,1,0 4f9330b4a6897a4f6ad632da8d7117005fa1181ea456493d0c7101b0ae28de90,62,1,0
b9561e05ff078b70b559e17de698900540df5bb55ec46d632462f3cda6823bb2,1,1 b9561e05ff078b70b559e17de698900540df5bb55ec46d632462f3cda6823bb2,63,1,1
1f7a113217ad1525cd04c2200135e45bed9b34f1375f7086ed780d9dba6cc595,1,2 1f7a113217ad1525cd04c2200135e45bed9b34f1375f7086ed780d9dba6cc595,0,1,2
e32d56c58727fc1f9848c38083255e21091a72c72f9c71653358d796cf17f272,1,2 e32d56c58727fc1f9848c38083255e21091a72c72f9c71653358d796cf17f272,1,1,2
17e04c4bc48de0879c9e18c2d75b34222e4b77363fbd338d010f169351f41c9f,1,2 17e04c4bc48de0879c9e18c2d75b34222e4b77363fbd338d010f169351f41c9f,2,1,2
f80f806ece842e8db7866342077e4372c9151ad0630f9257a935bb9d71ab66dd,1,2 f80f806ece842e8db7866342077e4372c9151ad0630f9257a935bb9d71ab66dd,3,1,2
11e9d8792583ad9beec9022050915ea0ec7797947571e28a9ae25f4c22babf68,1,2 11e9d8792583ad9beec9022050915ea0ec7797947571e28a9ae25f4c22babf68,4,1,2
5627bd2c93cdd1b6ff225b20cca0d5cdb74a43488e7df89b936e98d71fc66294,1,0 5627bd2c93cdd1b6ff225b20cca0d5cdb74a43488e7df89b936e98d71fc66294,5,1,0
26c1e8256e3def246128afd91d8cdff4b83d4257ba7db6ec7cb23b722de2c9d6,1,2 26c1e8256e3def246128afd91d8cdff4b83d4257ba7db6ec7cb23b722de2c9d6,6,1,2
530176ac9cf80fa181b52f160f2e45090e22edfe73fcf81d43cdbbf0f9778fec,1,1 530176ac9cf80fa181b52f160f2e45090e22edfe73fcf81d43cdbbf0f9778fec,7,1,1
46f1e1aa0db4789221b5c99923be986ff36689ac15aaa27b85ba24b28f6fe199,1,1 46f1e1aa0db4789221b5c99923be986ff36689ac15aaa27b85ba24b28f6fe199,8,1,1
114dbe06457718d6a076ac635c4e8d55dffdd3f15f8ceb048198182d8efd7c1c,1,0 114dbe06457718d6a076ac635c4e8d55dffdd3f15f8ceb048198182d8efd7c1c,9,1,0
2f7beaa38367ab067f43d964a4cde00ac8f7661aa9e1cd46111344e6a784c951,1,2 2f7beaa38367ab067f43d964a4cde00ac8f7661aa9e1cd46111344e6a784c951,10,1,2
5ac5b0506e8e691723efba9dc9c9a15b652831863fe2bba24268233a05eafeec,1,2 5ac5b0506e8e691723efba9dc9c9a15b652831863fe2bba24268233a05eafeec,11,1,2
4dda7384be203140dbc49a076a7e6b76d9112675a3029df640448f2179e953be,1,2 4dda7384be203140dbc49a076a7e6b76d9112675a3029df640448f2179e953be,12,1,2
76aa5fc37a6628340dfb7f8b9a4c9d138d02155c1ea8abbd6225e23c927df840,1,2 76aa5fc37a6628340dfb7f8b9a4c9d138d02155c1ea8abbd6225e23c927df840,13,1,2
d04380cc3dd2c3eb4ab705151f5d12eebf86585a9b867ef846fd5a1f1e6161f8,1,2 d04380cc3dd2c3eb4ab705151f5d12eebf86585a9b867ef846fd5a1f1e6161f8,14,1,2
34df27f9c8f4f4db2175a33ffd0eb44788134fab1b002757192f84fa94454f57,1,0 34df27f9c8f4f4db2175a33ffd0eb44788134fab1b002757192f84fa94454f57,15,1,0
1c13f34d3c4d4d3bbdca8e243905d5c9de5e4c1d98b272b222391cf1f13b7184,1,0 1c13f34d3c4d4d3bbdca8e243905d5c9de5e4c1d98b272b222391cf1f13b7184,16,1,0
05e17ba0f827c14cd1120bc42f68673a73d187e62039cd3148e5ed015c162632,1,1 05e17ba0f827c14cd1120bc42f68673a73d187e62039cd3148e5ed015c162632,17,1,1
c8a91589b448de06d3275b582f9e0d9716236f265b339f1705850cf157c410f9,1,0 c8a91589b448de06d3275b582f9e0d9716236f265b339f1705850cf157c410f9,18,1,0
eab88e86d7f334c2c02d7400189f6e080354d4cecaf507d0461e1e4d036bc0eb,1,0 eab88e86d7f334c2c02d7400189f6e080354d4cecaf507d0461e1e4d036bc0eb,19,1,0
01d6756968fccc11ca43f9b36a50fc303ffb4cd6811bcdf13d09d6e1fce1eed3,1,1 01d6756968fccc11ca43f9b36a50fc303ffb4cd6811bcdf13d09d6e1fce1eed3,20,1,1
86256b8c5af7fb0832807a7737daa800b1e9a542ac4bbf3fa60087b652adc16b,1,1 86256b8c5af7fb0832807a7737daa800b1e9a542ac4bbf3fa60087b652adc16b,21,1,1
a2991c5df59cc7df0c47401fe9c0928b67bea9f5c04dc5479a63bbb309f7af23,1,2 a2991c5df59cc7df0c47401fe9c0928b67bea9f5c04dc5479a63bbb309f7af23,22,1,2
90c5583036dfdc73b2fa0933b1168fa7ce4a14dffcfbce4f085d84f159c784b8,1,2 90c5583036dfdc73b2fa0933b1168fa7ce4a14dffcfbce4f085d84f159c784b8,23,1,2
a6441fdc2e4b68955189f1a5d72e50f080db4841a089568c6c1347d7b05a1ce7,1,1 a6441fdc2e4b68955189f1a5d72e50f080db4841a089568c6c1347d7b05a1ce7,24,1,1
d3e6cf58710e9e5bcffe67fd728d4e3f4055af46c92ec150af93788a2b56824c,1,1 d3e6cf58710e9e5bcffe67fd728d4e3f4055af46c92ec150af93788a2b56824c,25,1,1
d843400cce5fc05e84045b39a62c8ad7944a04bb36df2448af8791c203b6f690,1,2 d843400cce5fc05e84045b39a62c8ad7944a04bb36df2448af8791c203b6f690,26,1,2
bf0e629445d89620ee41b1818aec01e6174a97ca3f9bde96c2acb6498e5efb0d,1,0 bf0e629445d89620ee41b1818aec01e6174a97ca3f9bde96c2acb6498e5efb0d,27,1,0
a047c8aded8a034624c6f3f1246de829941019b6f28557417f70217dacb34da2,1,1 a047c8aded8a034624c6f3f1246de829941019b6f28557417f70217dacb34da2,28,1,1
d9159efafd5d3af1ceaf724733480f914b241a5d260a47877ddc101a05c1fe67,1,1 d9159efafd5d3af1ceaf724733480f914b241a5d260a47877ddc101a05c1fe67,29,1,1
08d7e6831bb79c67d8378a1afedd5e6082cca5f60243387279815436cad13f76,1,1 08d7e6831bb79c67d8378a1afedd5e6082cca5f60243387279815436cad13f76,30,1,1
456bf5ab78d630f088fc7da2320c8b4aa4d29ce1edab299b2cf662d367bbb229,1,0 456bf5ab78d630f088fc7da2320c8b4aa4d29ce1edab299b2cf662d367bbb229,31,1,0
8a8550534e652ed1557847431efbdd442075375bfc4a79ff9548c5d99c03a415,1,2 8a8550534e652ed1557847431efbdd442075375bfc4a79ff9548c5d99c03a415,32,1,2
3c4adb4817f08f234dfa1eb3a803ca29af2e9c86d6cd18cf347275e67589d531,1,1 3c4adb4817f08f234dfa1eb3a803ca29af2e9c86d6cd18cf347275e67589d531,33,1,1
cb94c03bfdd01224bd08519962c2fbf958a582a50dab4d3d537e301c101deb2f,1,0 cb94c03bfdd01224bd08519962c2fbf958a582a50dab4d3d537e301c101deb2f,34,1,0
6f5cc260c8f8a527aead7ede796c8abb5880f5f717ca18c6d6b853672dd46e2c,1,2 6f5cc260c8f8a527aead7ede796c8abb5880f5f717ca18c6d6b853672dd46e2c,35,1,2
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment