diff --git a/ARM.CMSIS-NN.pdsc b/ARM.CMSIS-NN.pdsc
index d5240368..5dbf5495 100644
--- a/ARM.CMSIS-NN.pdsc
+++ b/ARM.CMSIS-NN.pdsc
@@ -38,6 +38,7 @@
+
@@ -53,7 +54,6 @@
-
@@ -69,13 +69,13 @@
-
+
@@ -101,9 +101,9 @@
+
-
@@ -112,6 +112,7 @@
+
diff --git a/Include/arm_nnfunctions.h b/Include/arm_nnfunctions.h
index ab4c0eca..e4604c17 100644
--- a/Include/arm_nnfunctions.h
+++ b/Include/arm_nnfunctions.h
@@ -21,8 +21,8 @@
* Title: arm_nnfunctions.h
* Description: Public header file for CMSIS NN Library
*
- * $Date: 20 February 2024
- * $Revision: V.14.0.0
+ * $Date: 11 March 2024
+ * $Revision: V.15.0.0
*
* Target : Arm(R) M-Profile Architecture
@@ -375,8 +375,10 @@ arm_cmsis_nn_status arm_convolve_s4(const cmsis_nn_context *ctx,
* @param[in] bias_data Optional bias data pointer. Data type: int32
* @param[in] output_dims Output tensor dimensions. Format: [N, H, W, C_OUT]
* @param[out] output_data Output data pointer. Data type: int8
-
- * @return The function returns ARM_CMSIS_NN_SUCCESS
+ *
+ * @return The function returns ARM_CMSIS_NN_SUCCESS
if successful or
+ * ARM_CMSIS_NN_ARG_ERROR
if incorrect arguments or
+ * ARM_CMSIS_NN_NO_IMPL_ERROR
*
* @details
* 1. Supported framework: TensorFlow Lite micro
@@ -522,8 +524,10 @@ int32_t arm_transpose_conv_s8_get_buffer_size_mve(const cmsis_nn_dims *input_dim
* @param[in] bias_data Optional bias data pointer. Data type: int64
* @param[in] output_dims Output tensor dimensions. Format: [N, H, W, C_OUT]
* @param[out] output_data Output data pointer. Data type: int16
-
- * @return The function returns ARM_CMSIS_NN_SUCCESS
+ *
+ * @return The function returns ARM_CMSIS_NN_SUCCESS
if successful or
+ * ARM_CMSIS_NN_ARG_ERROR
if incorrect arguments or
+ * ARM_CMSIS_NN_NO_IMPL_ERROR
*
* @details
* 1. Supported framework: TensorFlow Lite micro
@@ -541,47 +545,6 @@ arm_cmsis_nn_status arm_convolve_s16(const cmsis_nn_context *ctx,
const int64_t *bias_data,
const cmsis_nn_dims *output_dims,
int16_t *output_data);
-/**
- * @brief Optimized s16 convolution function
- * @param[in, out] ctx Function context that contains the additional buffer if required by the function.
- * arm_convolve_fast_s16_get_buffer_size will return the buffer_size if required.
- * The caller is expected to clear the buffer, if applicable, for security reasons.
- * @param[in] conv_params Convolution parameters (e.g. strides, dilations, pads,...).
- * conv_params->input_offset : Not used
- * conv_params->output_offset : Not used
- * @param[in] quant_params Per-channel quantization info.
- * It contains the multiplier and shift values to be applied to each output channel
- * @param[in] input_dims Input (activation) tensor dimensions. Format: [N, H, W, C_IN]
- * @param[in] input_data Input (activation) data pointer. Data type: int16
- * @param[in] filter_dims Filter tensor dimensions. Format: [C_OUT, HK, WK, C_IN] where HK and WK are the
- * spatial filter dimensions. (filter_dims->w * filter_dims->h * input_dims->c) must not
- exceed 512
- * @param[in] filter_data Filter data pointer. Data type: int8
- * @param[in] bias_dims Bias tensor dimensions. Format: [C_OUT]
- * @param[in] bias_data Optional bias data pointer. Data type: int64
- * @param[in] output_dims Output tensor dimensions. Format: [N, H, W, C_OUT]
- * @param[out] output_data Output data pointer. Data type: int16
-
- * @return The function returns ARM_CMSIS_NN_SUCCESS
- *
- * @details
- * 1. Supported framework: TensorFlow Lite micro
- * 2. Additional memory is required for optimization. Refer to argument 'ctx' for details.
- * 3. Implementation supports kernel volumes (filter width * filter height * input channels) < 512.
- *
- */
-
-arm_cmsis_nn_status arm_convolve_fast_s16(const cmsis_nn_context *ctx,
- const cmsis_nn_conv_params *conv_params,
- const cmsis_nn_per_channel_quant_params *quant_params,
- const cmsis_nn_dims *input_dims,
- const int16_t *input_data,
- const cmsis_nn_dims *filter_dims,
- const int8_t *filter_data,
- const cmsis_nn_dims *bias_dims,
- const int64_t *bias_data,
- const cmsis_nn_dims *output_dims,
- int16_t *output_data);
/**
* @brief Get the required buffer size for s16 convolution function
@@ -594,17 +557,6 @@ arm_cmsis_nn_status arm_convolve_fast_s16(const cmsis_nn_context *ctx,
*/
int32_t arm_convolve_s16_get_buffer_size(const cmsis_nn_dims *input_dims, const cmsis_nn_dims *filter_dims);
-/**
- * @brief Get the required buffer size for fast s16 convolution function
- *
- * @param[in] input_dims Input (activation) tensor dimensions. Format: [N, H, W, C_IN]
- * @param[in] filter_dims Filter tensor dimensions. Format: [C_OUT, HK, WK, C_IN] where HK and WK
- * are the spatial filter dimensions
- * @return The function returns required buffer size(bytes)
- *
- */
-int32_t arm_convolve_fast_s16_get_buffer_size(const cmsis_nn_dims *input_dims, const cmsis_nn_dims *filter_dims);
-
/**
* @brief Fast s4 version for 1x1 convolution (non-square shape)
*
diff --git a/Include/arm_nnsupportfunctions.h b/Include/arm_nnsupportfunctions.h
index f2b7f29b..70c57022 100644
--- a/Include/arm_nnsupportfunctions.h
+++ b/Include/arm_nnsupportfunctions.h
@@ -21,8 +21,8 @@
* Title: arm_nnsupportfunctions.h
* Description: Public header file of support functions for CMSIS NN Library
*
- * $Date: 14 February 2024
- * $Revision: V.19.0.0
+ * $Date: 22 March 2024
+ * $Revision: V.20.0.0
*
* Target : Arm(R) M-Profile Architecture
* -------------------------------------------------------------------- */
@@ -63,6 +63,10 @@ extern "C" {
// will result in lower scratch buffer usage.
#define CH_IN_BLOCK_MVE (124)
+// For input of int16 when number of columns are above this limit int64 accumulation is needed
+// to not loose precision.
+#define MAX_COL_COUNT (512)
+
/**
* @brief definition to pack four 8 bit values.
*/
@@ -281,8 +285,8 @@ int16_t *arm_nn_mat_mult_kernel_s16(const int8_t *input_a,
const int32_t output_ch,
const int32_t *out_shift,
const int32_t *out_mult,
- const int16_t activation_min,
- const int16_t activation_max,
+ const int32_t activation_min,
+ const int32_t activation_max,
const int32_t num_col_a,
const int64_t *const output_bias,
int16_t *out_0);
@@ -445,6 +449,48 @@ arm_cmsis_nn_status arm_nn_mat_mult_nt_t_s8(const int8_t *lhs,
const int32_t row_address_offset,
const int32_t lhs_cols_offset);
+/**
+ * @brief General Matrix-multiplication function with per-channel requantization and int16 input (LHS) and output.
+ * This function assumes:
+ * - LHS input matrix NOT transposed (nt)
+ * - RHS input matrix transposed (t)
+ *
+ * @note This operation also performs the broadcast bias addition before the requantization
+ *
+ * @param[in] lhs Pointer to the LHS input matrix
+ * @param[in] rhs Pointer to the RHS input matrix
+ * @param[in] bias Pointer to the bias vector. The length of this vector is equal to the number of
+ * output columns (or RHS input rows)
+ * @param[out] dst Pointer to the output matrix with "m" rows and "n" columns
+ * @param[in] dst_multipliers Pointer to the multipliers vector needed for the per-channel requantization.
+ * The length of this vector is equal to the number of output columns (or RHS input
+ * rows)
+ * @param[in] dst_shifts Pointer to the shifts vector needed for the per-channel requantization. The length
+ * of this vector is equal to the number of output columns (or RHS input rows)
+ * @param[in] lhs_rows Number of LHS input rows
+ * @param[in] rhs_rows Number of RHS input rows
+ * @param[in] rhs_cols Number of LHS/RHS input columns
+ * @param[in] activation_min Minimum value to clamp down the output. Range : int16
+ * @param[in] activation_max Maximum value to clamp up the output. Range : int16
+ *
+ * @details MVE implementation only.
+ *
+ * @return The function returns ARM_CMSIS_NN_SUCCESS
or
+ * ARM_CMSIS_NN_NO_IMPL_ERROR
if not for MVE
+ *
+ */
+arm_cmsis_nn_status arm_nn_mat_mult_nt_t_s16(const int16_t *lhs,
+ const int8_t *rhs,
+ const int64_t *bias,
+ int16_t *dst,
+ const int32_t *dst_multipliers,
+ const int32_t *dst_shifts,
+ const int32_t lhs_rows,
+ const int32_t rhs_rows,
+ const int32_t rhs_cols,
+ const int32_t activation_min,
+ const int32_t activation_max);
+
/**
* @brief General Matrix-multiplication function with int8 input and int32 output.
* This function assumes:
diff --git a/Source/ConvolutionFunctions/arm_convolve_fast_s16.c b/Source/ConvolutionFunctions/arm_convolve_fast_s16.c
deleted file mode 100644
index 5348c3f7..00000000
--- a/Source/ConvolutionFunctions/arm_convolve_fast_s16.c
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- * SPDX-FileCopyrightText: Copyright 2010-2023 Arm Limited and/or its affiliates
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed under the Apache License, Version 2.0 (the License); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/* ----------------------------------------------------------------------
- * Project: CMSIS NN Library
- * Title: arm_convolve_fast_s16.c
- * Description: Optimized s16 version of convolution.
- *
- * $Date: 23 March 2023
- * $Revision: V.2.3.0
- *
- * Target : Arm(R) M-Profile Architecture
- *
- * -------------------------------------------------------------------- */
-
-#include "arm_nnfunctions.h"
-#include "arm_nnsupportfunctions.h"
-
-/**
- * @ingroup Public
- */
-
-/**
- * @addtogroup NNConv
- * @{
- */
-
-/*
- * Basic s16 convolution function.
- *
- * Refer header file for details. Optimal use case for the DSP/MVE implementation is when input and output channels
- * are multiples of 4 or atleast greater than 4.
- *
- */
-
-arm_cmsis_nn_status arm_convolve_fast_s16(const cmsis_nn_context *ctx,
- const cmsis_nn_conv_params *conv_params,
- const cmsis_nn_per_channel_quant_params *quant_params,
- const cmsis_nn_dims *input_dims,
- const int16_t *input_data,
- const cmsis_nn_dims *filter_dims,
- const int8_t *filter_data,
- const cmsis_nn_dims *bias_dims,
- const int64_t *bias_data,
- const cmsis_nn_dims *output_dims,
- int16_t *output_data)
-{
- (void)bias_dims;
- if (filter_dims->w * filter_dims->h * input_dims->c >= 512)
- {
- return ARM_CMSIS_NN_ARG_ERROR;
- }
-
- if (ctx->buf == NULL && arm_convolve_s8_get_buffer_size(input_dims, filter_dims) > 0)
- {
- return ARM_CMSIS_NN_ARG_ERROR;
- }
- int16_t *buffer_a = (int16_t *)ctx->buf;
-
- const int32_t input_batches = input_dims->n;
- const int32_t input_x = input_dims->w;
- const int32_t input_y = input_dims->h;
- const int32_t input_ch = input_dims->c;
- const int32_t kernel_x = filter_dims->w;
- const int32_t kernel_y = filter_dims->h;
- const int32_t output_x = output_dims->w;
- const int32_t output_y = output_dims->h;
- const int32_t output_ch = output_dims->c;
- const int32_t rhs_cols = input_ch * kernel_y * kernel_x;
-
- const int32_t pad_x = conv_params->padding.w;
- const int32_t pad_y = conv_params->padding.h;
- const int32_t stride_x = conv_params->stride.w;
- const int32_t stride_y = conv_params->stride.h;
-
- const int16_t out_activation_min = conv_params->activation.min;
- const int16_t out_activation_max = conv_params->activation.max;
- int32_t *output_mult = quant_params->multiplier;
- int32_t *output_shift = quant_params->shift;
-
- for (int i_batch = 0; i_batch < input_batches; i_batch++)
- {
-#if defined(ARM_MATH_DSP) && !defined(ARM_MATH_MVEI)
- /* Generate two columns from the input tensor a GEMM computation */
- int16_t *two_column_buf = buffer_a;
- int16_t *out = output_data;
- /* This part implements the im2col function */
- for (int32_t i_out_y = 0; i_out_y < output_y; i_out_y++)
- {
- for (int32_t i_out_x = 0; i_out_x < output_x; i_out_x++)
- {
- for (int32_t i_ker_y = i_out_y * stride_y - pad_y; i_ker_y < i_out_y * stride_y - pad_y + kernel_y;
- i_ker_y++)
- {
- for (int32_t i_ker_x = i_out_x * stride_x - pad_x; i_ker_x < i_out_x * stride_x - pad_x + kernel_x;
- i_ker_x++)
- {
- if (i_ker_y < 0 || i_ker_y >= input_y || i_ker_x < 0 || i_ker_x >= input_x)
- {
- /* Filling 0 for out-of-bound paddings */
- arm_memset_s8((int8_t *)two_column_buf, 0, sizeof(int16_t) * input_ch);
- }
- else
- {
- arm_memcpy_s8((int8_t *)two_column_buf,
- (const int8_t *)(input_data + (i_ker_y * input_x + i_ker_x) * input_ch),
- input_ch * sizeof(int16_t));
- }
- two_column_buf += input_ch;
- }
- }
- /* Computation is filed for every 2 columns */
- if (two_column_buf == buffer_a + 2 * rhs_cols)
- {
- out = arm_nn_mat_mult_kernel_s16(filter_data,
- buffer_a,
- output_ch,
- output_shift,
- output_mult,
- out_activation_min,
- out_activation_max,
- rhs_cols,
- bias_data,
- out);
-
- /* Counter reset */
- two_column_buf = buffer_a;
- }
- }
- }
-
- /* Left-over because odd number of output pixels */
- if (two_column_buf != buffer_a)
- {
- const int8_t *ker_a = filter_data;
- int i;
-
- for (i = 0; i < output_ch; i++)
- {
- /* Init the accumulator*/
- int32_t sum = 0;
-
- /* Point to the beginning of the im2col buffer where the input is available as a rearranged column */
- const int16_t *ip_as_col = buffer_a;
-
- /* 4 multiply and accumulates are done in one loop. */
- int32_t col_count = rhs_cols >> 2;
-
- while (col_count)
- {
- int32_t ker_a1, ker_a2;
- int32_t ip_b1, ip_b2;
-
- ker_a = read_and_pad(ker_a, &ker_a1, &ker_a2);
-
- ip_b1 = arm_nn_read_q15x2_ia(&ip_as_col);
- sum = SMLAD(ker_a1, ip_b1, sum);
- ip_b2 = arm_nn_read_q15x2_ia(&ip_as_col);
- sum = SMLAD(ker_a2, ip_b2, sum);
-
- col_count--;
- }
- /* Handle left over mac */
- col_count = rhs_cols & 0x3;
- while (col_count)
- {
- int8_t ker_a1 = *ker_a++;
- int16_t ip_b1 = *ip_as_col++;
- sum += ker_a1 * ip_b1;
- col_count--;
- }
- if (bias_data)
- {
- int32_t reduced_multiplier = REDUCE_MULTIPLIER(output_mult[i]);
- int64_t acc_64 = sum + bias_data[i];
- sum = arm_nn_requantize_s64(acc_64, reduced_multiplier, output_shift[i]);
- }
- else
- {
- sum = arm_nn_requantize(sum, output_mult[i], output_shift[i]);
- }
- sum = MAX(sum, out_activation_min);
- sum = MIN(sum, out_activation_max);
- *out++ = (int16_t)sum;
- }
- }
-#else
- (void)input_data;
- (void)output_data;
- (void)bias_data;
- (void)filter_data;
- (void)buffer_a;
- (void)kernel_x;
- (void)kernel_y;
- (void)pad_x;
- (void)pad_y;
- (void)stride_x;
- (void)stride_y;
- (void)out_activation_min;
- (void)out_activation_max;
- (void)output_mult;
- (void)output_shift;
- (void)rhs_cols;
- return ARM_CMSIS_NN_ARG_ERROR;
-#endif
- /* Advance to the next batch */
- input_data += (input_x * input_y * input_ch);
- output_data += (output_x * output_y * output_ch);
- }
-
- /* Return to application */
- return ARM_CMSIS_NN_SUCCESS;
-}
-
-/**
- * @} end of NNConv group
- */
diff --git a/Source/ConvolutionFunctions/arm_convolve_get_buffer_sizes_s16.c b/Source/ConvolutionFunctions/arm_convolve_get_buffer_sizes_s16.c
index 56af0e35..ad3291cd 100644
--- a/Source/ConvolutionFunctions/arm_convolve_get_buffer_sizes_s16.c
+++ b/Source/ConvolutionFunctions/arm_convolve_get_buffer_sizes_s16.c
@@ -1,5 +1,5 @@
/*
- * SPDX-FileCopyrightText: Copyright 2023 Arm Limited and/or its affiliates
+ * SPDX-FileCopyrightText: Copyright 2023-2024 Arm Limited and/or its affiliates
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -21,8 +21,8 @@
* Title: arm_convolve_get_buffer_sizes_s16.c
* Description: Collection of get buffer size functions for the various s16 convolution layer functions.
*
- * $Date: 30 January 2023
- * $Revision: V.1.0.0
+ * $Date: 20 March 2024
+ * $Revision: V.2.0.0
*
* Target : Arm(R) M-Profile Architecture
*
@@ -40,30 +40,26 @@
* @{
*/
-__STATIC_INLINE int32_t arm_convolve_fast_s16_get_buffer_size_dsp(const cmsis_nn_dims *input_dims,
- const cmsis_nn_dims *filter_dims)
+__STATIC_INLINE int32_t arm_convolve_s16_get_buffer_size_mve(const cmsis_nn_dims *input_dims,
+ const cmsis_nn_dims *filter_dims)
{
- return (2 * input_dims->c * filter_dims->w * filter_dims->h) * (int32_t)sizeof(int16_t);
+ int32_t col_length = input_dims->c * filter_dims->w * filter_dims->h;
+ // Get number of complete lanes with int16 elements (multiple of 8) for given col_length. This is dependent on
+ // implementation of arm_nn_mat_mult_nt_t_s16
+ col_length = (col_length + 7) / 8;
+ // 4 -> number of im2col buffers, 8 -> 8 elements per Q register
+ return 4 * col_length * 8 * (int32_t)sizeof(int16_t);
}
-int32_t arm_convolve_fast_s16_get_buffer_size(const cmsis_nn_dims *input_dims, const cmsis_nn_dims *filter_dims)
+int32_t arm_convolve_s16_get_buffer_size(const cmsis_nn_dims *input_dims, const cmsis_nn_dims *filter_dims)
{
-#if defined(ARM_MATH_DSP) && !defined(ARM_MATH_MVEI)
- return arm_convolve_fast_s16_get_buffer_size_dsp(input_dims, filter_dims);
+#if defined(ARM_MATH_MVEI)
+ return arm_convolve_s16_get_buffer_size_mve(input_dims, filter_dims);
#else
- (void)input_dims;
- (void)filter_dims;
- return 0;
+ return (2 * input_dims->c * filter_dims->w * filter_dims->h) * (int32_t)sizeof(int16_t);
#endif
}
-int32_t arm_convolve_s16_get_buffer_size(const cmsis_nn_dims *input_dims, const cmsis_nn_dims *filter_dims)
-{
- (void)input_dims;
- (void)filter_dims;
- return 0;
-}
-
/*
* Get the required buffer size for arm_convolve_wrapper_s16. This is the recommended function convolve wrapper s16
* function.
@@ -76,16 +72,10 @@ int32_t arm_convolve_wrapper_s16_get_buffer_size(const cmsis_nn_conv_params *con
const cmsis_nn_dims *filter_dims,
const cmsis_nn_dims *output_dims)
{
-
-#if defined(ARM_MATH_DSP) && !defined(ARM_MATH_MVEI)
- return arm_convolve_wrapper_s16_get_buffer_size_dsp(conv_params, input_dims, filter_dims, output_dims);
-#else
(void)conv_params;
(void)output_dims;
- // MVE and scalar implementation have same buffer requirements
return arm_convolve_s16_get_buffer_size(input_dims, filter_dims);
-#endif
}
int32_t arm_convolve_wrapper_s16_get_buffer_size_dsp(const cmsis_nn_conv_params *conv_params,
@@ -93,18 +83,7 @@ int32_t arm_convolve_wrapper_s16_get_buffer_size_dsp(const cmsis_nn_conv_params
const cmsis_nn_dims *filter_dims,
const cmsis_nn_dims *output_dims)
{
- (void)output_dims;
-
- if (filter_dims->w * filter_dims->h * input_dims->c < 512 &&
- (conv_params->dilation.w == 1 && conv_params->dilation.h == 1))
- {
- return arm_convolve_fast_s16_get_buffer_size_dsp(input_dims, filter_dims);
- }
- else
- {
-
- return arm_convolve_s16_get_buffer_size(input_dims, filter_dims);
- }
+ return arm_convolve_wrapper_s16_get_buffer_size(conv_params, input_dims, filter_dims, output_dims);
}
int32_t arm_convolve_wrapper_s16_get_buffer_size_mve(const cmsis_nn_conv_params *conv_params,
@@ -112,7 +91,10 @@ int32_t arm_convolve_wrapper_s16_get_buffer_size_mve(const cmsis_nn_conv_params
const cmsis_nn_dims *filter_dims,
const cmsis_nn_dims *output_dims)
{
- return arm_convolve_wrapper_s16_get_buffer_size(conv_params, input_dims, filter_dims, output_dims);
+ (void)conv_params;
+ (void)output_dims;
+
+ return arm_convolve_s16_get_buffer_size_mve(input_dims, filter_dims);
}
/**
diff --git a/Source/ConvolutionFunctions/arm_convolve_get_buffer_sizes_s8.c b/Source/ConvolutionFunctions/arm_convolve_get_buffer_sizes_s8.c
index fc48198d..dd09b4ed 100644
--- a/Source/ConvolutionFunctions/arm_convolve_get_buffer_sizes_s8.c
+++ b/Source/ConvolutionFunctions/arm_convolve_get_buffer_sizes_s8.c
@@ -21,8 +21,8 @@
* Title: arm_convolve_get_buffer_sizes_s8.c
* Description: Collection of get buffer size functions for the various s8 convolution layer functions.
*
- * $Date: 14 March 2024
- * $Revision: V.2.1.0
+ * $Date: 28 March 2024
+ * $Revision: V.2.1.1
*
* Target : Arm(R) M-Profile Architecture
*
@@ -45,11 +45,11 @@ __STATIC_INLINE int32_t arm_convolve_s8_get_buffer_size_mve(const cmsis_nn_dims
const cmsis_nn_dims *filter_dims)
{
int32_t col_length = input_dims->c * filter_dims->w * filter_dims->h;
- // Get number of complete int16 lanes(multiple of 8) for given col_length. This is dependent on
+ // Get number of complete lanes with int8 elements (multiple of 16) for given col_length. This is dependent on
// implementation of arm_nn_mat_mult_nt_t_s8
- col_length = (col_length + 7) / 8;
- // 4 -> number of im2col buffers, 8 -> 8 elements per Q register
- return 4 * col_length * 8 * (int32_t)sizeof(int8_t);
+ col_length = (col_length + 15) / 16;
+ // 4 -> number of im2col buffers, 16 -> 16 elements per Q register
+ return 4 * col_length * 16 * (int32_t)sizeof(int8_t);
}
__STATIC_INLINE int32_t arm_convolve_1_x_n_s8_get_buffer_size_mve(const cmsis_nn_conv_params *conv_params,
diff --git a/Source/ConvolutionFunctions/arm_convolve_s16.c b/Source/ConvolutionFunctions/arm_convolve_s16.c
index 75d30f16..08e21663 100644
--- a/Source/ConvolutionFunctions/arm_convolve_s16.c
+++ b/Source/ConvolutionFunctions/arm_convolve_s16.c
@@ -1,5 +1,5 @@
/*
- * SPDX-FileCopyrightText: Copyright 2010-2023 Arm Limited and/or its affiliates
+ * SPDX-FileCopyrightText: Copyright 2010-2024 Arm Limited and/or its affiliates
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -19,10 +19,10 @@
/* ----------------------------------------------------------------------
* Project: CMSIS NN Library
* Title: arm_convolve_s16.c
- * Description: s16 version of convolution using symmetric quantization.
+ * Description: s16 version of convolution.
*
- * $Date: 30 January 2023
- * $Revision: V.2.1.0
+ * $Date: 22 March 2024
+ * $Revision: V.3.0.0
*
* Target : Arm(R) M-Profile Architecture
*
@@ -47,7 +47,6 @@
* are multiples of 4 or atleast greater than 4.
*
*/
-
arm_cmsis_nn_status arm_convolve_s16(const cmsis_nn_context *ctx,
const cmsis_nn_conv_params *conv_params,
const cmsis_nn_per_channel_quant_params *quant_params,
@@ -61,7 +60,12 @@ arm_cmsis_nn_status arm_convolve_s16(const cmsis_nn_context *ctx,
int16_t *output_data)
{
(void)bias_dims;
- (void)ctx;
+
+ if (ctx->buf == NULL)
+ {
+ return ARM_CMSIS_NN_ARG_ERROR;
+ }
+ int16_t *buffer_a = (int16_t *)ctx->buf;
const int32_t input_batches = input_dims->n;
const int32_t input_x = input_dims->w;
@@ -72,69 +76,190 @@ arm_cmsis_nn_status arm_convolve_s16(const cmsis_nn_context *ctx,
const int32_t output_x = output_dims->w;
const int32_t output_y = output_dims->h;
const int32_t output_ch = output_dims->c;
+ const int32_t rhs_cols = input_ch * kernel_y * kernel_x;
+ const int32_t dilation_x = conv_params->dilation.w;
+ const int32_t dilation_y = conv_params->dilation.h;
const int32_t pad_x = conv_params->padding.w;
const int32_t pad_y = conv_params->padding.h;
const int32_t stride_x = conv_params->stride.w;
const int32_t stride_y = conv_params->stride.h;
- const int32_t dilation_x = conv_params->dilation.w;
- const int32_t dilation_y = conv_params->dilation.h;
const int32_t out_activation_min = conv_params->activation.min;
const int32_t out_activation_max = conv_params->activation.max;
int32_t *output_mult = quant_params->multiplier;
int32_t *output_shift = quant_params->shift;
+#if defined(ARM_MATH_MVEI)
+ const int32_t rhs_rows = output_dims->c;
+#endif
+
for (int i_batch = 0; i_batch < input_batches; i_batch++)
{
- /* Run the following code as reference implementation for Cortex-M0 and Cortex-M3 */
- for (int32_t i_out_ch = 0; i_out_ch < output_ch; i_out_ch++)
- {
- const int32_t reduced_multiplier = REDUCE_MULTIPLIER(output_mult[i_out_ch]);
+ int16_t *im2col = buffer_a;
+ int16_t *out = output_data;
- for (int32_t base_idx_y = -pad_y, i_out_y = 0; i_out_y < output_y; base_idx_y += stride_y, i_out_y++)
+ int32_t lhs_rows = 0;
+
+ /* This part implements the im2col function */
+ for (int32_t i_out_y = 0; i_out_y < output_y; i_out_y++)
+ {
+ for (int32_t i_out_x = 0; i_out_x < output_x; i_out_x++)
{
- for (int32_t base_idx_x = -pad_x, i_out_x = 0; i_out_x < output_x; base_idx_x += stride_x, i_out_x++)
+ const int32_t base_idx_x = stride_x * i_out_x - pad_x;
+ const int32_t base_idx_y = stride_y * i_out_y - pad_y;
+
+ for (int32_t i_ker_y = 0; i_ker_y < kernel_y; i_ker_y++)
{
- int64_t conv_out_acc = 0;
-
- const int32_t start_y_max = (-base_idx_y + dilation_y - 1) / dilation_y;
- const int32_t ker_y_start = MAX(0, start_y_max);
- const int32_t start_x_max = (-base_idx_x + dilation_x - 1) / dilation_x;
- const int32_t ker_x_start = MAX(0, start_x_max);
- const int32_t end_min_y = (input_y - base_idx_y + dilation_y - 1) / dilation_y;
- const int32_t ker_y_end = MIN(kernel_y, end_min_y);
- const int32_t end_min_x = (input_x - base_idx_x + dilation_x - 1) / dilation_x;
- const int32_t ker_x_end = MIN(kernel_x, end_min_x);
-
- for (int32_t i_ker_y = ker_y_start; i_ker_y < ker_y_end; i_ker_y++)
+ for (int32_t i_ker_x = 0; i_ker_x < kernel_x; i_ker_x++)
{
- for (int32_t i_ker_x = ker_x_start; i_ker_x < ker_x_end; i_ker_x++)
+ const int32_t k_y = base_idx_y + dilation_y * i_ker_y;
+ const int32_t k_x = base_idx_x + dilation_x * i_ker_x;
+
+ if (k_y < 0 || k_y >= input_y || k_x < 0 || k_x >= input_x)
+ {
+ /* Filling 0 for out-of-bound paddings */
+ arm_memset_s8((int8_t *)im2col, 0, sizeof(int16_t) * (uint32_t)input_ch);
+ }
+ else
{
- const int32_t in_row = base_idx_y + dilation_y * i_ker_y;
- const int32_t in_col = base_idx_x + dilation_x * i_ker_x;
-
- for (int32_t i_input_ch = 0; i_input_ch < input_ch; i_input_ch++)
- {
- conv_out_acc += input_data[(in_row * input_x + in_col) * input_ch + i_input_ch] *
- filter_data[i_out_ch * input_ch * kernel_y * kernel_x +
- (i_ker_y * kernel_x + i_ker_x) * input_ch + i_input_ch];
- }
+ arm_memcpy_s8((int8_t *)im2col,
+ (const int8_t *)(input_data + (k_y * input_x + k_x) * input_ch),
+ (uint32_t)input_ch * sizeof(int16_t));
}
+ im2col += input_ch;
}
+ }
- if (bias_data)
- {
- conv_out_acc += bias_data[i_out_ch];
- }
+ lhs_rows++;
+#if defined(ARM_MATH_MVEI)
+ /* Computation is filed for every 4 columns */
+ if (lhs_rows == 4)
+ {
+ arm_nn_mat_mult_nt_t_s16(buffer_a,
+ filter_data,
+ bias_data,
+ out,
+ output_mult,
+ output_shift,
+ lhs_rows,
+ rhs_rows,
+ rhs_cols,
+ out_activation_min,
+ out_activation_max);
+ out += lhs_rows * output_ch;
+
+ lhs_rows = 0;
+ im2col = buffer_a;
+ }
+#else
+ /* Computation is filed for every 2 columns */
+ if (lhs_rows == 2)
+ {
+ out = arm_nn_mat_mult_kernel_s16(filter_data,
+ buffer_a,
+ output_ch,
+ output_shift,
+ output_mult,
+ out_activation_min,
+ out_activation_max,
+ rhs_cols,
+ bias_data,
+ out);
- int32_t conv_out = arm_nn_requantize_s64(conv_out_acc, reduced_multiplier, output_shift[i_out_ch]);
- conv_out = MAX(conv_out, out_activation_min);
- conv_out = MIN(conv_out, out_activation_max);
- output_data[i_out_ch + (i_out_y * output_x + i_out_x) * output_ch] = (int16_t)conv_out;
+ /* Counter reset */
+ im2col = buffer_a;
+ lhs_rows = 0;
}
+#endif
}
+
+ if (out == NULL)
+ {
+ return ARM_CMSIS_NN_NO_IMPL_ERROR;
+ }
+ }
+
+ /* Handle left over columns */
+ if (lhs_rows != 0)
+ {
+#if defined(ARM_MATH_MVEI)
+ arm_nn_mat_mult_nt_t_s16(buffer_a,
+ filter_data,
+ bias_data,
+ out,
+ output_mult,
+ output_shift,
+ lhs_rows,
+ rhs_rows,
+ rhs_cols,
+ out_activation_min,
+ out_activation_max);
+ out += lhs_rows * rhs_rows;
+ lhs_rows = 0;
+ im2col = buffer_a;
+#else // #if defined(ARM_MATH_MVEI)
+
+ const int8_t *ker_a = filter_data;
+ int i;
+
+ for (i = 0; i < output_ch; i++)
+ {
+ /* Init the accumulator*/
+ int32_t sum = 0;
+
+ /* Point to the beginning of the im2col buffer where the input is available as a rearranged column */
+ const int16_t *ip_as_col = buffer_a;
+
+ #if defined(ARM_MATH_DSP)
+ /* 4 multiply and accumulates are done in one loop. */
+ int32_t col_count = rhs_cols >> 2;
+
+ while (col_count)
+ {
+ int32_t ker_a1, ker_a2;
+ int32_t ip_b1, ip_b2;
+
+ ker_a = read_and_pad(ker_a, &ker_a1, &ker_a2);
+
+ ip_b1 = arm_nn_read_q15x2_ia(&ip_as_col);
+ sum = SMLAD(ker_a1, ip_b1, sum);
+ ip_b2 = arm_nn_read_q15x2_ia(&ip_as_col);
+ sum = SMLAD(ker_a2, ip_b2, sum);
+
+ col_count--;
+ }
+ /* Handle left over mac */
+ col_count = rhs_cols & 0x3;
+ #else
+ uint16_t col_count = rhs_cols;
+
+ #endif
+ while (col_count)
+ {
+ int8_t ker_a1 = *ker_a++;
+ int16_t ip_b1 = *ip_as_col++;
+ sum += ker_a1 * ip_b1;
+ col_count--;
+ }
+ if (bias_data)
+ {
+ int32_t reduced_multiplier = REDUCE_MULTIPLIER(output_mult[i]);
+ int64_t acc_64 = sum + bias_data[i];
+ sum = arm_nn_requantize_s64(acc_64, reduced_multiplier, output_shift[i]);
+ }
+ else
+ {
+ sum = arm_nn_requantize(sum, output_mult[i], output_shift[i]);
+ }
+ sum = MAX(sum, out_activation_min);
+ sum = MIN(sum, out_activation_max);
+ *out++ = (int16_t)sum;
+ }
+ lhs_rows = 0;
+#endif // #if defined(ARM_MATH_MVEI)
}
+
/* Advance to the next batch */
input_data += (input_x * input_y * input_ch);
output_data += (output_x * output_y * output_ch);
diff --git a/Source/ConvolutionFunctions/arm_convolve_wrapper_s16.c b/Source/ConvolutionFunctions/arm_convolve_wrapper_s16.c
index b05588ed..0d6d8832 100644
--- a/Source/ConvolutionFunctions/arm_convolve_wrapper_s16.c
+++ b/Source/ConvolutionFunctions/arm_convolve_wrapper_s16.c
@@ -1,5 +1,5 @@
/*
- * SPDX-FileCopyrightText: Copyright 2021-2023 Arm Limited and/or its affiliates
+ * SPDX-FileCopyrightText: Copyright 2021-2024 Arm Limited and/or its affiliates
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -22,8 +22,8 @@
* Description: s16 convolution layer wrapper function with the main purpose to call the optimal kernel available in
* cmsis-nn to perform the convolution.
*
- * $Date: 30 January 2023
- * $Revision: V.2.1.0
+ * $Date: 12 March 2024
+ * $Revision: V.2.2.0
*
* Target : Arm(R) M-Profile Architecture
*
@@ -59,37 +59,6 @@ arm_cmsis_nn_status arm_convolve_wrapper_s16(const cmsis_nn_context *ctx,
const cmsis_nn_dims *output_dims,
int16_t *output_data)
{
-#if defined(ARM_MATH_DSP) && !defined(ARM_MATH_MVEI)
- if (filter_dims->w * filter_dims->h * input_dims->c < 512 &&
- (conv_params->dilation.w == 1 && conv_params->dilation.h == 1))
- {
- return arm_convolve_fast_s16(ctx,
- conv_params,
- quant_params,
- input_dims,
- input_data,
- filter_dims,
- filter_data,
- bias_dims,
- bias_data,
- output_dims,
- output_data);
- }
- else
- {
- return arm_convolve_s16(ctx,
- conv_params,
- quant_params,
- input_dims,
- input_data,
- filter_dims,
- filter_data,
- bias_dims,
- bias_data,
- output_dims,
- output_data);
- }
-#else
return arm_convolve_s16(ctx,
conv_params,
quant_params,
@@ -101,7 +70,6 @@ arm_cmsis_nn_status arm_convolve_wrapper_s16(const cmsis_nn_context *ctx,
bias_data,
output_dims,
output_data);
-#endif
}
/**
diff --git a/Source/ConvolutionFunctions/arm_depthwise_conv_fast_s16.c b/Source/ConvolutionFunctions/arm_depthwise_conv_fast_s16.c
index f15578e3..c8f56a27 100644
--- a/Source/ConvolutionFunctions/arm_depthwise_conv_fast_s16.c
+++ b/Source/ConvolutionFunctions/arm_depthwise_conv_fast_s16.c
@@ -1,5 +1,5 @@
/*
- * SPDX-FileCopyrightText: Copyright 2022-2023 Arm Limited and/or its affiliates
+ * SPDX-FileCopyrightText: Copyright 2022-2024 Arm Limited and/or its affiliates
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -22,8 +22,8 @@
* Description: Optimized s16 depthwise separable convolution function for
* channel multiplier of 1.
*
- * $Date: 30 January 2023
- * $Revision: V.1.3.0
+ * $Date: 19 March 2024
+ * $Revision: V.1.4.0
*
* Target : Arm(R) M-Profile Architecture
*
@@ -69,7 +69,7 @@ arm_cmsis_nn_status arm_depthwise_conv_fast_s16(const cmsis_nn_context *ctx,
return ARM_CMSIS_NN_ARG_ERROR;
}
- if (filter_dims->w * filter_dims->h >= 512)
+ if (filter_dims->w * filter_dims->h >= MAX_COL_COUNT)
{
return ARM_CMSIS_NN_ARG_ERROR;
}
diff --git a/Source/NNSupportFunctions/arm_nn_mat_mul_kernel_s16.c b/Source/ConvolutionFunctions/arm_nn_mat_mult_kernel_s16.c
similarity index 62%
rename from Source/NNSupportFunctions/arm_nn_mat_mul_kernel_s16.c
rename to Source/ConvolutionFunctions/arm_nn_mat_mult_kernel_s16.c
index b196eb86..9e9c5337 100644
--- a/Source/NNSupportFunctions/arm_nn_mat_mul_kernel_s16.c
+++ b/Source/ConvolutionFunctions/arm_nn_mat_mult_kernel_s16.c
@@ -1,5 +1,5 @@
/*
- * SPDX-FileCopyrightText: Copyright 2010-2023 Arm Limited and/or its affiliates
+ * SPDX-FileCopyrightText: Copyright 2010-2024 Arm Limited and/or its affiliates
*
*
* SPDX-License-Identifier: Apache-2.0
@@ -20,10 +20,10 @@
/* ----------------------------------------------------------------------
* Project: CMSIS NN Library
* Title: arm_nn_mat_mult_kernel_s16.c
- * Description: Matrix-multiplication function for convolution
+ * Description: Matrix-multiplication function for 16 bits convolution
*
- * $Date: 5 Janauray 2023
- * $Revision: V.1.2.0
+ * $Date: 22 March 2024
+ * $Revision: V.2.0.0
*
* Target : Arm(R) M-Profile Architecture
* -------------------------------------------------------------------- */
@@ -46,34 +46,35 @@
* Refer header file for details.
*
*/
-
int16_t *arm_nn_mat_mult_kernel_s16(const int8_t *input_a,
const int16_t *input_b,
const int32_t output_ch,
const int32_t *out_shift,
const int32_t *out_mult,
- const int16_t activation_min,
- const int16_t activation_max,
+ const int32_t activation_min,
+ const int32_t activation_max,
const int32_t num_col_a,
const int64_t *const output_bias,
int16_t *out_0)
{
+#if !defined(ARM_MATH_MVEI)
+ const int32_t num_col_a_fast = num_col_a > MAX_COL_COUNT ? MAX_COL_COUNT : num_col_a;
+ const int32_t num_col_a_slow = num_col_a - MAX_COL_COUNT;
-#if defined(ARM_MATH_DSP) && !defined(ARM_MATH_MVEI)
- /* set up the second output pointers */
int16_t *out_1 = out_0 + output_ch;
const int64_t *bias = output_bias;
- uint16_t row_count = output_ch / 2;
+ int32_t row_count = output_ch / 2;
const int8_t *ip_a0 = input_a;
+ int32_t reduced_multiplier;
- /* this loop over rows in A */
+ /* This loop over rows in A */
while (row_count)
{
- /* setup pointers for B */
+ /* Setup pointers for B */
const int16_t *ip_b0 = input_b;
const int16_t *ip_b1 = ip_b0 + num_col_a;
- /* align the second pointer for A */
+ /* Align the second pointer for A */
const int8_t *ip_a1 = ip_a0 + num_col_a;
/* Init accumulator for channel N and N + 1 */
@@ -82,8 +83,15 @@ int16_t *arm_nn_mat_mult_kernel_s16(const int8_t *input_a,
int32_t ch_1_out_0 = 0;
int32_t ch_1_out_1 = 0;
- uint16_t col_count = num_col_a / 4;
- /* accumulate over the vector */
+ int64_t ch_0_out_0_s64 = 0;
+ int64_t ch_0_out_1_s64 = 0;
+ int64_t ch_1_out_0_s64 = 0;
+ int64_t ch_1_out_1_s64 = 0;
+
+ #if defined(ARM_MATH_DSP)
+ uint16_t col_count = num_col_a_fast / 4;
+
+ /* Accumulate over the vector */
while (col_count)
{
int32_t a01, a02, a11, a12;
@@ -107,8 +115,12 @@ int16_t *arm_nn_mat_mult_kernel_s16(const int8_t *input_a,
ch_1_out_1 = SMLAD(a12, b1, ch_1_out_1);
col_count--;
- } /* while over col_count */
- col_count = num_col_a & 0x3;
+ }
+ col_count = num_col_a_fast & 0x3;
+ #else
+ int32_t col_count = num_col_a_fast;
+ #endif
+
while (col_count)
{
int8_t a0 = *ip_a0++;
@@ -121,22 +133,49 @@ int16_t *arm_nn_mat_mult_kernel_s16(const int8_t *input_a,
ch_1_out_0 += a1 * b0;
ch_1_out_1 += a1 * b1;
col_count--;
- } /* while over col_count */
- if (bias)
+ }
+
+ ch_0_out_0_s64 = ch_0_out_0;
+ ch_0_out_1_s64 = ch_0_out_1;
+ ch_1_out_0_s64 = ch_1_out_0;
+ ch_1_out_1_s64 = ch_1_out_1;
+
+ if (num_col_a > MAX_COL_COUNT)
{
- int32_t reduced_multiplier = REDUCE_MULTIPLIER(*out_mult);
- int64_t acc_64 = ch_0_out_0 + *bias;
- ch_0_out_0 = arm_nn_requantize_s64(acc_64, reduced_multiplier, *out_shift);
- acc_64 = ch_0_out_1 + *bias++;
- ch_0_out_1 = arm_nn_requantize_s64(acc_64, reduced_multiplier, *out_shift);
- out_mult++;
+ col_count = num_col_a_slow;
+ while (col_count)
+ {
+ int8_t a0 = *ip_a0++;
+ int16_t b0 = *ip_b0++;
+ int8_t a1 = *ip_a1++;
+ int16_t b1 = *ip_b1++;
+
+ ch_0_out_0_s64 += a0 * b0;
+ ch_0_out_1_s64 += a0 * b1;
+ ch_1_out_0_s64 += a1 * b0;
+ ch_1_out_1_s64 += a1 * b1;
+ col_count--;
+ }
}
- else
+
+ if (bias)
{
- ch_0_out_0 = arm_nn_requantize(ch_0_out_0, *out_mult, *out_shift);
- ch_0_out_1 = arm_nn_requantize(ch_0_out_1, *out_mult, *out_shift);
- out_mult++;
+ ch_0_out_0_s64 += *bias;
+ ch_0_out_1_s64 += *bias++;
+ ch_1_out_0_s64 += *bias;
+ ch_1_out_1_s64 += *bias++;
}
+
+ reduced_multiplier = REDUCE_MULTIPLIER(*out_mult);
+ ch_0_out_0 = arm_nn_requantize_s64(ch_0_out_0_s64, reduced_multiplier, *out_shift);
+ ch_0_out_1 = arm_nn_requantize_s64(ch_0_out_1_s64, reduced_multiplier, *out_shift);
+ out_mult++;
+ out_shift++;
+
+ reduced_multiplier = REDUCE_MULTIPLIER(*out_mult);
+ ch_1_out_0 = arm_nn_requantize_s64(ch_1_out_0_s64, reduced_multiplier, *out_shift);
+ ch_1_out_1 = arm_nn_requantize_s64(ch_1_out_1_s64, reduced_multiplier, *out_shift);
+
ch_0_out_0 = MAX(ch_0_out_0, activation_min);
ch_0_out_0 = MIN(ch_0_out_0, activation_max);
*out_0++ = (int16_t)ch_0_out_0;
@@ -144,23 +183,7 @@ int16_t *arm_nn_mat_mult_kernel_s16(const int8_t *input_a,
ch_0_out_1 = MAX(ch_0_out_1, activation_min);
ch_0_out_1 = MIN(ch_0_out_1, activation_max);
*out_1++ = (int16_t)ch_0_out_1;
- out_shift++;
- if (bias)
- {
- int32_t reduced_multiplier = REDUCE_MULTIPLIER(*out_mult);
- int64_t acc_64 = ch_1_out_0 + *bias;
- ch_1_out_0 = arm_nn_requantize_s64(acc_64, reduced_multiplier, *out_shift);
- acc_64 = ch_1_out_1 + *bias++;
- ch_1_out_1 = arm_nn_requantize_s64(acc_64, reduced_multiplier, *out_shift);
- out_mult++;
- }
- else
- {
- ch_1_out_0 = arm_nn_requantize(ch_1_out_0, *out_mult, *out_shift);
- ch_1_out_1 = arm_nn_requantize(ch_1_out_1, *out_mult, *out_shift);
- out_mult++;
- }
ch_1_out_0 = MAX(ch_1_out_0, activation_min);
ch_1_out_0 = MIN(ch_1_out_0, activation_max);
*out_0++ = (int16_t)ch_1_out_0;
@@ -168,24 +191,29 @@ int16_t *arm_nn_mat_mult_kernel_s16(const int8_t *input_a,
ch_1_out_1 = MAX(ch_1_out_1, activation_min);
ch_1_out_1 = MIN(ch_1_out_1, activation_max);
*out_1++ = (int16_t)ch_1_out_1;
+
+ out_mult++;
out_shift++;
- /* skip row */
+ /* Skip row */
ip_a0 += num_col_a;
row_count--;
}
- /* compute the last odd numbered row if any */
+ /* Compute the last odd numbered row if any */
if (output_ch & 0x1)
{
- /* setup pointers for B */
+ /* Setup pointers for B */
const int16_t *ip_b0 = input_b;
const int16_t *ip_b1 = ip_b0 + num_col_a;
int32_t ch_0_out_0 = 0;
int32_t ch_0_out_1 = 0;
+ int64_t ch_0_out_0_s64 = 0;
+ int64_t ch_0_out_1_s64 = 0;
- uint16_t col_count = num_col_a >> 2;
+ #if defined(ARM_MATH_DSP)
+ uint16_t col_count = num_col_a_fast >> 2;
while (col_count)
{
int32_t a01, a02;
@@ -205,6 +233,9 @@ int16_t *arm_nn_mat_mult_kernel_s16(const int8_t *input_a,
col_count--;
}
col_count = num_col_a & 0x3;
+ #else
+ int32_t col_count = num_col_a_fast;
+ #endif
while (col_count)
{
int8_t a0 = *ip_a0++;
@@ -215,19 +246,35 @@ int16_t *arm_nn_mat_mult_kernel_s16(const int8_t *input_a,
ch_0_out_1 += a0 * b1;
col_count--;
}
- if (bias)
+
+ ch_0_out_0_s64 = ch_0_out_0;
+ ch_0_out_1_s64 = ch_0_out_1;
+
+ if (num_col_a > MAX_COL_COUNT)
{
- int32_t reduced_multiplier = REDUCE_MULTIPLIER(*out_mult);
- int64_t acc_64 = ch_0_out_0 + *bias;
- ch_0_out_0 = arm_nn_requantize_s64(acc_64, reduced_multiplier, *out_shift);
- acc_64 = ch_0_out_1 + *bias++;
- ch_0_out_1 = arm_nn_requantize_s64(acc_64, reduced_multiplier, *out_shift);
+ col_count = num_col_a_slow;
+ while (col_count)
+ {
+ int8_t a0 = *ip_a0++;
+ int16_t b0 = *ip_b0++;
+ int16_t b1 = *ip_b1++;
+
+ ch_0_out_0_s64 += a0 * b0;
+ ch_0_out_1_s64 += a0 * b1;
+ col_count--;
+ }
}
- else
+
+ if (bias)
{
- ch_0_out_0 = arm_nn_requantize(ch_0_out_0, *out_mult, *out_shift);
- ch_0_out_1 = arm_nn_requantize(ch_0_out_1, *out_mult, *out_shift);
+ ch_0_out_0_s64 += *bias;
+ ch_0_out_1_s64 += *bias++;
}
+
+ reduced_multiplier = REDUCE_MULTIPLIER(*out_mult);
+ ch_0_out_0 = arm_nn_requantize_s64(ch_0_out_0_s64, reduced_multiplier, *out_shift);
+ ch_0_out_1 = arm_nn_requantize_s64(ch_0_out_1_s64, reduced_multiplier, *out_shift);
+
ch_0_out_0 = MAX(ch_0_out_0, activation_min);
ch_0_out_0 = MIN(ch_0_out_0, activation_max);
*out_0++ = (int16_t)ch_0_out_0;
@@ -241,7 +288,7 @@ int16_t *arm_nn_mat_mult_kernel_s16(const int8_t *input_a,
out_0 += output_ch;
- /* return the new output pointer with offset */
+ /* Return the new output pointer with offset */
return out_0;
#else
(void)input_a;
@@ -254,11 +301,11 @@ int16_t *arm_nn_mat_mult_kernel_s16(const int8_t *input_a,
(void)num_col_a;
(void)output_bias;
(void)out_0;
- /* To be completed */
+
return NULL;
#endif
}
/**
* @} end of Doxygen group
- */
\ No newline at end of file
+ */
diff --git a/Source/NNSupportFunctions/arm_nn_mat_mult_nt_t_s16.c b/Source/NNSupportFunctions/arm_nn_mat_mult_nt_t_s16.c
new file mode 100644
index 00000000..78972d5b
--- /dev/null
+++ b/Source/NNSupportFunctions/arm_nn_mat_mult_nt_t_s16.c
@@ -0,0 +1,265 @@
+/*
+ * SPDX-FileCopyrightText: Copyright 2020-2024 Arm Limited and/or its affiliates
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------
+ * Project: CMSIS NN Library
+ * Title: arm_nn_mat_mult_nt_t_s16
+ * Description: Matrix multiplication support function with the right-hand-side (rhs) matrix transposed
+ *
+ * $Date: 2 April 2024
+ * $Revision: V.1.0.0
+ *
+ * Target : Arm(R) M-Profile Architecture
+ *
+ * -------------------------------------------------------------------- */
+
+#include "arm_nnsupportfunctions.h"
+
+/**
+ * @ingroup groupSupport
+ */
+
+/**
+ * @addtogroup supportConvolution
+ * @{
+ */
+
+/*
+ * s16 matrix multiplication with the right-hand-side matrix transposed
+ *
+ * Refer header file for details.
+ *
+ */
+arm_cmsis_nn_status arm_nn_mat_mult_nt_t_s16(const int16_t *lhs,
+ const int8_t *rhs,
+ const int64_t *bias,
+ int16_t *dst,
+ const int32_t *dst_multipliers,
+ const int32_t *dst_shifts,
+ const int32_t lhs_rows,
+ const int32_t rhs_rows,
+ const int32_t rhs_cols,
+ const int32_t activation_min,
+ const int32_t activation_max)
+{
+#if defined(ARM_MATH_MVEI)
+
+ const uint32_t rhs_rows_offset = (uint32_t)rhs_rows * sizeof(int16_t);
+ const uint32x4_t scatter_offset = {
+ 0, (uint32_t)rhs_rows_offset, (uint32_t)rhs_rows_offset * 2, (uint32_t)rhs_rows_offset * 3};
+
+ const int32_t rhs_cols_fast = rhs_cols > MAX_COL_COUNT ? MAX_COL_COUNT : rhs_cols;
+ const int32_t rhs_cols_slow = rhs_cols - MAX_COL_COUNT;
+
+ int i_items = 0;
+
+ for (; i_items <= (lhs_rows - 4); i_items += 4)
+ {
+ for (int i = 0; i < rhs_rows; i++)
+ {
+ int32_t acc_n0 = 0;
+ int32_t acc_n1 = 0;
+ int32_t acc_n2 = 0;
+ int32_t acc_n3 = 0;
+
+ int64_t acc_n0_s64 = 0;
+ int64_t acc_n1_s64 = 0;
+ int64_t acc_n2_s64 = 0;
+ int64_t acc_n3_s64 = 0;
+
+ const int16_t *ip_row_0 = lhs;
+ const int16_t *ip_row_1 = lhs + rhs_cols;
+ const int16_t *ip_row_2 = lhs + (2 * rhs_cols);
+ const int16_t *ip_row_3 = lhs + (3 * rhs_cols);
+ const int8_t *col_base = rhs + i * rhs_cols;
+
+ #if defined(ARM_MATH_AUTOVECTORIZE)
+ for (int j = 0; j < rhs_cols_fast; j++)
+ {
+ int8_t col = col_base[j];
+ acc_n0 += ip_row_0[j] * col;
+ acc_n1 += ip_row_1[j] * col;
+ acc_n2 += ip_row_2[j] * col;
+ acc_n3 += ip_row_3[j] * col;
+ }
+ #else
+ // Note: If operand initialization is moved around, use '&' constraint to
+ // specify earlyclobber operands.
+ __ASM volatile(" .p2align 2 \n"
+ " wlstp.16 lr, %[cnt], 1f \n"
+ " mov %[out0], 0 \n"
+ " mov %[out1], 0 \n"
+ " mov %[out2], 0 \n"
+ " mov %[out3], 0 \n"
+ " vldrb.s16 q0, [%[col]], #8 \n"
+ "2: \n"
+ " vldrh.u16 q1, [%[row0]], #16 \n"
+ " vmlava.s16 %[out0], q0, q1 \n"
+ " vldrh.u16 q2, [%[row1]], #16 \n"
+ " vmlava.s16 %[out1], q0, q2 \n"
+ " vldrh.u16 q3, [%[row2]], #16 \n"
+ " vmlava.s16 %[out2], q0, q3 \n"
+ " vldrh.u16 q4, [%[row3]], #16 \n"
+ " vmlava.s16 %[out3], q0, q4 \n"
+ " vldrb.s16 q0, [%[col]], #8 \n"
+ " letp lr, 2b \n"
+ "1: \n"
+ : [col] "+l"(col_base),
+ [row0] "+l"(ip_row_0),
+ [row1] "+l"(ip_row_1),
+ [row2] "+l"(ip_row_2),
+ [row3] "+l"(ip_row_3),
+ [out0] "=Te"(acc_n0),
+ [out1] "=Te"(acc_n1),
+ [out2] "=Te"(acc_n2),
+ [out3] "=Te"(acc_n3)
+ : [cnt] "r"(rhs_cols_fast)
+ : "q0", "q1", "q2", "q3", "q4", "memory", "r14");
+ #endif
+ acc_n0_s64 = acc_n0;
+ acc_n1_s64 = acc_n1;
+ acc_n2_s64 = acc_n2;
+ acc_n3_s64 = acc_n3;
+
+ if (rhs_cols > MAX_COL_COUNT)
+ {
+ ip_row_0 = lhs + MAX_COL_COUNT;
+ ip_row_1 = lhs + rhs_cols + MAX_COL_COUNT;
+ ip_row_2 = lhs + (2 * rhs_cols) + MAX_COL_COUNT;
+ ip_row_3 = lhs + (3 * rhs_cols) + MAX_COL_COUNT;
+ col_base = rhs + i * rhs_cols + MAX_COL_COUNT;
+
+ for (int j = 0; j < rhs_cols_slow; j++)
+ {
+ int8_t col = col_base[j];
+ acc_n0_s64 += ip_row_0[j] * col;
+ acc_n1_s64 += ip_row_1[j] * col;
+ acc_n2_s64 += ip_row_2[j] * col;
+ acc_n3_s64 += ip_row_3[j] * col;
+ }
+ }
+
+ if (bias)
+ {
+ acc_n0_s64 += bias[i];
+ acc_n1_s64 += bias[i];
+ acc_n2_s64 += bias[i];
+ acc_n3_s64 += bias[i];
+ }
+
+ int32_t reduced_multiplier = REDUCE_MULTIPLIER(dst_multipliers[i]);
+ int32_t shift = dst_shifts[i];
+
+ acc_n0 = arm_nn_requantize_s64(acc_n0_s64, reduced_multiplier, shift);
+ acc_n1 = arm_nn_requantize_s64(acc_n1_s64, reduced_multiplier, shift);
+ acc_n2 = arm_nn_requantize_s64(acc_n2_s64, reduced_multiplier, shift);
+ acc_n3 = arm_nn_requantize_s64(acc_n3_s64, reduced_multiplier, shift);
+ int32x4_t res = {acc_n0, acc_n1, acc_n2, acc_n3};
+
+ res = vmaxq_s32(res, vdupq_n_s32(activation_min));
+ res = vminq_s32(res, vdupq_n_s32(activation_max));
+
+ vstrhq_scatter_offset_s32(dst, scatter_offset, res);
+ dst++;
+ }
+
+ lhs += 4 * rhs_cols;
+ dst += (3 * rhs_rows);
+ }
+
+ for (; i_items < lhs_rows; i_items++)
+ {
+ for (int i = 0; i < rhs_rows; i++)
+ {
+ int32_t acc_n0 = 0;
+ int64_t acc_n0_s64 = 0;
+ const int16_t *ip_row_0 = lhs;
+ const int8_t *col_base = rhs + i * rhs_cols;
+
+ #if defined(ARM_MATH_AUTOVECTORIZE)
+ for (int j = 0; j < rhs_cols_fast; j++)
+ {
+ int8_t col = col_base[j];
+ acc_n0 += ip_row_0[j] * col;
+ }
+ #else
+ __ASM volatile(" .p2align 2 \n"
+ " wlstp.32 lr, %[cnt], 1f \n"
+ " mov %[out0], 0 \n"
+ "2: \n"
+ " vldrb.s32 q0, [%[col]], #4 \n"
+ " vldrh.s32 q1, [%[row0]], #8 \n"
+ " vmlava.s32 %[out0], q0, q1 \n"
+ " letp lr, 2b \n"
+ "1: \n"
+ : [col] "+l"(col_base), [row0] "+l"(ip_row_0), [out0] "=Te"(acc_n0)
+ : [cnt] "r"(rhs_cols_fast)
+ : "q0", "q1", "memory", "r14");
+ #endif
+ acc_n0_s64 = acc_n0;
+
+ if (rhs_cols > MAX_COL_COUNT)
+ {
+ ip_row_0 = lhs + MAX_COL_COUNT;
+ col_base = rhs + i * rhs_cols + MAX_COL_COUNT;
+
+ for (int j = 0; j < rhs_cols_slow; j++)
+ {
+ int8_t col = col_base[j];
+ acc_n0_s64 += ip_row_0[j] * col;
+ }
+ }
+
+ if (bias)
+ {
+ acc_n0_s64 += bias[i];
+ }
+
+ int32_t reduced_multiplier = REDUCE_MULTIPLIER(dst_multipliers[i]);
+ int32_t shift = dst_shifts[i];
+
+ acc_n0 = arm_nn_requantize_s64(acc_n0_s64, reduced_multiplier, shift);
+ acc_n0 = MAX(acc_n0, activation_min);
+ acc_n0 = MIN(acc_n0, activation_max);
+ *dst++ = (int16_t)acc_n0;
+ }
+ lhs += rhs_cols;
+ }
+
+#else
+ (void)lhs;
+ (void)rhs;
+ (void)dst_multipliers;
+ (void)dst_shifts;
+ (void)dst;
+ (void)activation_min;
+ (void)activation_max;
+ (void)bias;
+ (void)lhs_rows;
+ (void)lhs_rows;
+ (void)rhs_rows;
+ (void)rhs_cols;
+
+ return ARM_CMSIS_NN_NO_IMPL_ERROR;
+#endif
+ return ARM_CMSIS_NN_SUCCESS;
+}
+
+/**
+ * @} end of Doxygen group
+ */
diff --git a/Source/NNSupportFunctions/arm_nn_vec_mat_mult_t_s16.c b/Source/NNSupportFunctions/arm_nn_vec_mat_mult_t_s16.c
index b51fbf73..4c7983e2 100644
--- a/Source/NNSupportFunctions/arm_nn_vec_mat_mult_t_s16.c
+++ b/Source/NNSupportFunctions/arm_nn_vec_mat_mult_t_s16.c
@@ -1,5 +1,5 @@
/*
- * SPDX-FileCopyrightText: Copyright 2020-2023 Arm Limited and/or its affiliates
+ * SPDX-FileCopyrightText: Copyright 2020-2024 Arm Limited and/or its affiliates
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -21,8 +21,8 @@
* Title: arm_nn_vec_mat_mult_t_s16
* Description: s16 vector by matrix (transposed) multiplication
*
- * $Date: 5 January 2023
- * $Revision: V.2.2.0
+ * $Date: 22 March 2024
+ * $Revision: V.2.3.0
*
* Target : Arm(R) M-Profile Architecture
*
@@ -30,8 +30,6 @@
#include "arm_nnsupportfunctions.h"
-#define MAX_COL_COUNT (512)
-
/**
* @ingroup groupSupport
*/
diff --git a/Tests/UnitTest/CMakeLists.txt b/Tests/UnitTest/CMakeLists.txt
index d8d8ab7a..cb273db5 100644
--- a/Tests/UnitTest/CMakeLists.txt
+++ b/Tests/UnitTest/CMakeLists.txt
@@ -75,7 +75,6 @@ add_subdirectory(TestCases/test_arm_avgpool_s16)
add_subdirectory(TestCases/test_arm_avgpool_s8)
add_subdirectory(TestCases/test_arm_convolve_1x1_s8_fast)
add_subdirectory(TestCases/test_arm_convolve_1x1_s4_fast)
-add_subdirectory(TestCases/test_arm_convolve_fast_s16)
add_subdirectory(TestCases/test_arm_convolve_s16)
add_subdirectory(TestCases/test_arm_convolve_s8)
add_subdirectory(TestCases/test_arm_convolve_s4)
diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8/biases_data.h b/Tests/UnitTest/TestCases/TestData/int16xint8/biases_data.h
index 0df67b68..87e0e5d9 100644
--- a/Tests/UnitTest/TestCases/TestData/int16xint8/biases_data.h
+++ b/Tests/UnitTest/TestCases/TestData/int16xint8/biases_data.h
@@ -1,6 +1,6 @@
-// Generated by generate_test_data.py using tensorflow version 2.10.0 (Keras version 2.10.0).
-// Interpreter from tensorflow version 2.10.0 and revision upstream/v2.10.0-0-g359c3cdfc5f.
+// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0).
+// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e.
#pragma once
#include
-const int64_t int16xint8_biases[4] = {-2693823, 4268473, -1952572, -1471661};
+const int64_t *int16xint8_biases = NULL;
diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8/config_data.h b/Tests/UnitTest/TestCases/TestData/int16xint8/config_data.h
index 274f27fa..5002212f 100644
--- a/Tests/UnitTest/TestCases/TestData/int16xint8/config_data.h
+++ b/Tests/UnitTest/TestCases/TestData/int16xint8/config_data.h
@@ -1,23 +1,23 @@
-// Generated by generate_test_data.py using tensorflow version 2.10.0 (Keras version 2.10.0).
-// Interpreter from tensorflow version 2.10.0 and revision upstream/v2.10.0-0-g359c3cdfc5f.
+// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0).
+// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e.
#pragma once
#define INT16XINT8_OUT_CH 4
-#define INT16XINT8_IN_CH 3
-#define INT16XINT8_INPUT_W 7
+#define INT16XINT8_IN_CH 55
+#define INT16XINT8_INPUT_W 10
#define INT16XINT8_INPUT_H 8
-#define INT16XINT8_DST_SIZE 48
-#define INT16XINT8_INPUT_SIZE 168
-#define INT16XINT8_OUT_ACTIVATION_MIN -13335
+#define INT16XINT8_DST_SIZE 40
+#define INT16XINT8_INPUT_SIZE 4400
+#define INT16XINT8_OUT_ACTIVATION_MIN -32768
#define INT16XINT8_OUT_ACTIVATION_MAX 32767
#define INT16XINT8_INPUT_BATCHES 1
-#define INT16XINT8_FILTER_X 2
+#define INT16XINT8_FILTER_X 9
#define INT16XINT8_FILTER_Y 4
-#define INT16XINT8_STRIDE_X 2
-#define INT16XINT8_STRIDE_Y 3
+#define INT16XINT8_STRIDE_X 1
+#define INT16XINT8_STRIDE_Y 1
#define INT16XINT8_PAD_X 0
-#define INT16XINT8_PAD_Y 1
-#define INT16XINT8_OUTPUT_W 4
-#define INT16XINT8_OUTPUT_H 3
+#define INT16XINT8_PAD_Y 0
+#define INT16XINT8_OUTPUT_W 2
+#define INT16XINT8_OUTPUT_H 5
#define INT16XINT8_INPUT_OFFSET 0
#define INT16XINT8_OUTPUT_OFFSET 0
#define INT16XINT8_DILATION_X 1
diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8/input_data.h b/Tests/UnitTest/TestCases/TestData/int16xint8/input_data.h
index 332e9a2d..a9857dce 100644
--- a/Tests/UnitTest/TestCases/TestData/int16xint8/input_data.h
+++ b/Tests/UnitTest/TestCases/TestData/int16xint8/input_data.h
@@ -1,18 +1,321 @@
-// Generated by generate_test_data.py using tensorflow version 2.10.0 (Keras version 2.10.0).
-// Interpreter from tensorflow version 2.10.0 and revision upstream/v2.10.0-0-g359c3cdfc5f.
+// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0).
+// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e.
#pragma once
#include
-const int16_t int16xint8_input[168] = {
- 10557, -29412, 16306, -5806, -32348, -19960, 2964, -32596, 20924, 18562, -20598, -6976, 27849, 12415,
- -30223, -27312, -7108, -12970, 29648, 26680, -8421, -14587, 18276, 21648, -2320, 12407, -17227, 8336,
- -19571, 21794, -7472, 26556, -18272, 4333, 29296, -8120, -14915, 28821, -21516, 516, 3900, 24368,
- -3683, -2848, -1891, 10821, -26504, 2110, 5717, -24497, 1898, -23262, -11098, -21592, -27834, -30928,
- 15710, -28005, 5185, -24728, -22215, -21817, 1560, -28083, -29076, -26205, -28534, -24994, -5517, 32166,
- 25809, 904, 23030, 32059, -11323, 3203, 21358, -29406, -18602, -14718, -26485, -31259, -2470, -1560,
- 1982, 801, -418, -20854, -22982, -25937, 30793, 10965, 2980, 23705, 16271, 10279, -25793, 11816,
- 30853, 3285, 29763, 20687, -19271, 972, 27703, -8887, -32590, 428, -31855, -24800, -7196, 3695,
- 9322, -12119, 26056, 28964, 11767, -25994, 8310, 25111, 2990, 10228, 9369, 8724, -23360, -21582,
- -6857, -5432, -20932, -18168, 29165, -4251, -30703, -29891, -332, 18088, 22134, 23526, -22889, 18975,
- -20517, 18490, -15958, 11060, -15179, -1603, 28921, -15049, 29725, -21223, 5630, -27275, -8880, -16761,
- 29354, -10064, -15754, 15828, -9302, -11527, -5767, 2286, 623, -805, 24164, 26393, 14253, 11532};
+const int16_t int16xint8_input[4400] = {
+ 2258, -12216, 21955, 28148, 24627, -27487, 10259, 1230, -22204, -20857, -4155, -11625, -12677, -16925,
+ 20804, -2514, 30927, -8927, 31309, 11732, -15134, 4402, 9163, -27708, 4394, -28138, -31148, 12312,
+ 15482, -24145, 30356, 30332, 5787, 32650, 9767, 9098, 9892, -3355, -4309, 28572, 11701, 11084,
+ -14139, 16324, 11331, 7507, 14202, -19123, 5268, 7244, -12431, -12248, 9727, -17937, -336, 26839,
+ 21250, 21610, -14691, -8927, -10025, 12339, -19596, 4049, 20204, -12937, -27421, 17454, -15713, 1844,
+ 14225, -32744, 20568, 4312, 31329, 30059, 161, -12642, -23241, -2821, -8344, 18918, 25202, -1485,
+ -2434, 6275, -5036, -15151, 32710, -17041, -20987, -19723, -17316, 7476, 22161, 24685, 11959, 22263,
+ 19819, 12886, -18595, -16198, 29482, 11992, 6715, -26602, 12559, 4968, 9046, -17713, 21326, -28775,
+ 25570, -7374, 28219, 10499, -3695, 13442, -11035, 16418, 24432, -12198, 19648, -2747, -31244, 32200,
+ 12354, -8623, 21864, 4109, -15097, 13314, -19738, -6218, 25493, 105, 15966, -14539, 24697, 23697,
+ -6783, -22239, 5334, 30959, -7932, -30297, -10048, -2983, 15982, -25128, -30039, 27386, 11554, -21482,
+ 6832, 959, -17909, -11444, 23960, -26539, 30792, -23153, 26795, 29854, -21395, 23582, 15220, 13625,
+ 7170, 3548, -2081, 16865, 23240, -17971, 20097, -18667, 16294, 12263, -20768, 20227, 12646, 11252,
+ 16940, -32242, -24922, 1394, -2967, -14485, 16886, -21016, 1822, 17047, -25726, 7505, -15337, -31020,
+ -16606, 11889, 31023, 13219, -25931, 5486, -30148, 22892, -16340, -29886, -18678, 23338, -4706, 3020,
+ -14704, 24188, -26789, -10494, 20445, -2109, -26602, -31952, -1866, -14889, 19340, 27187, 25327, 17627,
+ 30428, -28544, -28249, 6444, -4327, -18179, -23642, 19621, 19011, -31294, 4899, 31259, -17601, 14607,
+ 21903, 6354, -13802, -18978, -32115, 3732, 29904, 4626, -23383, 28943, 9113, -25375, 8677, 2850,
+ 8488, 5178, 31903, 358, -23079, 8366, -11574, -8258, 9291, 17477, 13631, 10186, 8484, -31566,
+ 266, 1961, -22533, 21891, -32375, 4038, 26877, -29427, -25273, -14620, -13268, 26394, 11802, -24003,
+ -8076, -17636, -3618, -29911, 16936, -2277, 2268, -10356, -19998, 29313, -11621, 29555, -12342, -7494,
+ 28477, -16251, -4086, -12346, 30665, 11081, -20061, 17093, 14015, 7315, 26903, -11503, -18209, -21609,
+ -27691, -6059, 24874, 15918, -10697, 5044, -19347, 17421, -7187, -18499, 28595, -25618, -17000, 2013,
+ 14874, -19802, 9446, -29981, -21293, 4382, 17021, -17156, -32605, -3929, -18561, 8999, 28740, 15901,
+ -22235, -31659, -27817, 236, -15083, -13559, -8535, 1339, 29264, -6857, -15438, -30669, -31874, -10301,
+ 8111, 3394, 20311, -4880, -30970, -1774, -30765, 24651, 30600, -21806, -11209, -13074, -24038, 16325,
+ -455, -19716, 8164, 26033, 24054, 10296, -28583, 9374, -13281, -2565, -9242, -2432, -20762, -21777,
+ 1608, -13256, 23098, 10212, -24395, 2988, -6990, 24210, -24282, -150, -11756, -15869, -10787, -11019,
+ -32134, 20143, 17901, -29358, -24804, 7701, 23521, -21720, 19618, -19714, 24610, -24895, 14481, -27610,
+ 6142, 1560, -7062, -5597, 25607, -7721, -21721, -17403, -15620, 12053, -16518, 29563, -25189, -21034,
+ 28873, -4670, 25135, -19302, 2997, -24196, 31592, 14693, 28397, 6745, 799, -32296, -8703, 14152,
+ 6855, 15920, -28550, -24691, -16018, 8106, -7677, -17292, 30067, -8879, 28534, 20210, 11665, 14108,
+ 14473, 8439, -12283, 10164, -8052, 17653, -11761, -8598, -16125, 16388, -9305, 7727, 21321, 13638,
+ 302, -30699, 31677, -31183, 29102, 24018, -17336, -3904, 29213, -9921, -10674, 22526, -19480, 21842,
+ 19717, 9219, 11569, -15563, -10734, -14940, -21183, 1365, 21113, -32456, -1466, -2457, 19736, 15724,
+ 948, -1444, -26011, 30431, -14554, -31904, -30898, -10747, 29385, -21282, -15675, -28299, -8648, -30366,
+ -19700, -25096, 19371, -14758, 21414, -465, -18208, 27451, 19848, -9505, 25331, 18744, 28264, -3961,
+ -9361, 28359, 28543, -8759, 24868, 27561, -29541, -26832, 17900, 30838, -31136, -5088, -30209, 19159,
+ -26372, 25952, 11925, 22729, -19587, -30222, 23008, 7425, 28778, -31865, -25734, -11784, -13230, -30949,
+ -26773, 28503, -4441, 32312, 12806, 17783, -19642, 26678, -31252, 19863, 18844, -16461, 18793, 8004,
+ 31078, -14812, -6860, -25725, -4822, 15699, 12604, 30601, 13716, 18066, -28847, -18723, -1573, -28568,
+ -5366, -21533, 20642, 20863, -11481, 32525, 466, 22573, -3557, 28248, -20354, -4060, 12506, 8747,
+ -5808, -19082, -12126, -23129, -8508, -19059, 30877, -19800, 7475, -3068, 10941, 11532, 14460, 24905,
+ 32435, 13237, -8083, 3238, -6882, 12881, -19904, 10427, -25570, 27449, 5774, -7542, 7205, 3683,
+ 10563, -27928, 25172, 22985, -4375, -18831, -11266, 23721, 13614, 14952, 24372, -16215, -32157, -14984,
+ -20654, 23141, -31302, 26824, -7596, -24282, -18350, 10367, 18182, -7147, 22107, -12827, 30699, 1054,
+ -28778, -9758, 10097, 15022, 25573, -24613, -8548, -22316, -3079, -9996, 30196, 26388, 11136, 20161,
+ -27771, -27366, -15024, 18162, -29717, -20657, 16191, -1490, 29374, -23954, 2859, -859, -29554, -11536,
+ 19133, -18489, 29414, -25360, -1462, 23356, 26946, 25209, -22216, 12181, 18372, 28470, -7540, 9476,
+ 30918, -19748, 9778, -23649, -17700, 26755, 26185, -11623, -24404, -27500, 4329, -3955, -19427, 29815,
+ 24554, 31671, 15427, 2973, 2103, 30381, -21924, 21656, 6973, -21419, -22703, -15311, 9131, 29146,
+ -31115, 16989, 9432, -4795, -18857, -10569, 5952, 27136, 26466, -4111, 12976, -5454, 1402, -1424,
+ 1417, -30488, 3416, 31950, 18140, 13965, -2259, -3747, 8064, 13509, 16915, 25228, 6689, 29895,
+ 20187, -9823, 12240, -7251, 14528, -24736, -9848, -23022, 16544, 25413, 12380, -13401, -26977, -9938,
+ -24958, 27356, -6891, -22608, -669, 26196, -30827, 7756, 20368, 29690, 4423, 27272, 6769, 6880,
+ 27034, 19962, 27671, -29734, 3204, 29208, -7600, -22349, -1066, 13841, -11536, -23652, 10074, 32454,
+ 4918, 32646, 26, 32749, -2886, 19792, 7786, -26295, 32222, 17472, 25956, 5118, 26716, -1069,
+ 12348, -27739, -5870, 30836, -27623, 14844, 17507, 3685, 5642, -31025, 22029, 10350, -27254, 11989,
+ 14314, -31800, -2375, -12416, 19030, 25500, 18143, 16466, 7788, -6144, 10467, 28021, -19774, 13912,
+ 23605, -10272, -27331, -25276, 12457, 8736, 26919, 30059, -2780, -6795, 22773, -11595, -4487, 18704,
+ -12348, 13748, 12877, 28987, -23956, 24271, 13732, 15279, -20298, -18569, 8721, -18451, 8500, -2835,
+ 4843, 20200, -17387, 4212, -19341, -21310, -7226, 14364, -1333, 21647, -3246, 15904, -22060, 5827,
+ -25283, -22810, -6378, -15731, 12841, -8375, -10042, 15033, 16868, 21390, -17259, -13750, 23967, -23506,
+ -10875, 25482, 16287, 2114, -28670, 21565, -23798, 17600, -25500, -24382, 4257, 27195, 6932, 227,
+ 17328, 11134, 14098, -23897, 538, 22719, -32374, -12487, 23078, -25836, -10412, 25841, 17477, -24146,
+ -7060, -21908, -23181, 20363, 21113, 19884, -7105, -25454, 7040, 15136, -22494, 8365, 18211, -21017,
+ 8542, 27082, 20542, -23141, -2938, 1681, -8203, -20709, -25431, 1790, 11911, 25532, -7959, -4462,
+ -22634, -32492, -2241, 21736, 27180, 20748, -27372, 4357, -23728, -8831, -11018, -24872, -16822, 17924,
+ -2770, -8669, 18041, -5118, -23000, -27900, -21503, -3167, 21267, 27235, -23287, -7298, 8321, -26867,
+ -21939, 23360, 19843, -9248, 20199, -24303, -14152, -17288, 19185, 20564, -14468, -13495, 7925, -25979,
+ -14417, -32496, 10568, -24341, -28214, 27153, 32125, -19105, 20047, 26387, -3247, -17655, -28021, 18118,
+ -8912, 28633, -30364, 6266, -3328, -2341, -17950, 12790, 14051, -25098, 13811, -17557, 28934, 8816,
+ -6391, 29131, 2830, 19714, -20023, 31859, -6805, -18119, 28287, 24304, 17011, -4263, -4575, 25636,
+ 31192, -2735, 10434, 28206, -23534, 12167, -27989, -13504, 26748, 28249, 29191, -6227, -14456, -27054,
+ -16395, 29977, 8584, 20205, -23917, -23421, 13182, -2572, -8246, -10430, -12711, -28437, 3433, -26522,
+ 23822, -4623, 12725, -28778, 14079, -16287, 22127, 18232, 8666, -23409, -24656, 19671, 5817, -3693,
+ 11057, -25453, -19491, -24568, -23737, 11165, -13795, -5601, -16854, -24818, 2360, 7234, 2056, 12491,
+ -1358, 3496, -4849, -15918, -24309, 6369, -14720, 29875, 25828, -18294, 2331, -22191, -25575, 30529,
+ 8257, -29925, -19684, -9333, 29144, 17247, 20666, -17421, 2140, 27869, 1980, 29768, -13217, 32267,
+ 22776, -27284, -31339, -18256, 31258, -22233, -5506, -5958, -32582, -4720, -18239, 8482, 15057, 13354,
+ 12399, -30230, -31155, 14889, 32745, -11981, 5445, -3618, 31584, -7543, 4839, 2476, -4878, -20968,
+ -16623, -12564, -32243, -23414, -18210, -1782, 32031, -4107, 2315, -26268, 10614, -24964, -2527, -17980,
+ -4306, 10063, 3636, 17686, 25010, -719, -15434, -27603, 16968, 14500, -4124, -1618, 31226, -29074,
+ -6413, 31226, -1089, 4249, -31026, 29648, 19777, -11440, -24162, -3745, 25733, -4918, -10368, -16151,
+ -2390, -23569, 12415, -28927, 4653, 18201, -10892, 15177, 5863, 29433, 26254, -9824, -15443, -26583,
+ -11324, 27849, 13002, -9082, 16011, -10497, -26911, -10445, -18416, 18965, -20763, -6179, -13970, -17471,
+ -7001, 22872, 15031, -15610, -19116, 17851, 14354, -15037, -14145, -22315, 10749, -15208, 11262, -4772,
+ 17601, 11333, 25821, 26293, -26397, -28699, -28738, -32346, 8983, 4069, 13058, 3455, -28173, 25400,
+ 14398, -11519, 22423, -27400, -5982, 10129, 9317, 14475, 24844, -9420, -15211, -9621, -31570, -24457,
+ -11503, 28448, -23053, -19714, -14545, 19732, -1301, 21347, 9017, -21392, -946, 8804, -20601, -10380,
+ 12765, 16867, -29482, 28827, 21699, 1779, -28370, -22623, -32355, 2584, -18776, 29392, 14378, 15364,
+ 20835, -31656, -11842, 11858, 12552, 12566, 5406, 8457, 2989, -31152, -16850, -1797, 30188, -26101,
+ 28976, -4711, -1598, -10066, -5841, 10241, -10478, -25746, 13062, -16650, -28499, 19409, 11758, 26813,
+ 22101, 8785, 10655, -28235, -9856, -25833, -13445, -28487, 29246, 14689, 9088, 15127, 24606, 4,
+ -7813, -21062, 10048, -11545, 22127, -15545, 1726, 21527, 2317, 16918, 23807, 8081, 5169, -19299,
+ 29551, 5106, -12111, -2552, -17380, 27031, 8925, 5774, 16824, -8809, -6755, 6551, 4831, 5262,
+ -22986, 23561, -20544, 26657, -30872, 11198, -15115, 11866, -6742, 28677, 17006, -27123, -7062, -6450,
+ 23220, -4337, 31513, -19201, 10910, -21537, -24456, 26691, -16028, -17474, 24841, -18726, -26174, 9713,
+ -29198, -29376, -7440, 4066, 22800, 32708, -32332, 24166, 25263, 20089, -13309, 26851, 28093, -22880,
+ 22781, 21405, -25317, -8306, 13876, 21804, -4168, -473, 9541, -20753, 11426, -3630, -26652, -12551,
+ 11181, -30152, -27087, -15130, 25313, 22454, -10572, 2786, -21911, 2346, 28773, 1571, -3220, 20226,
+ -2598, 28587, -9344, -22174, 1328, -15933, -14476, -12163, 23280, 30275, -32605, 7730, 15587, 1921,
+ -19482, 21768, 8199, -22426, 20548, 23458, 27090, 19858, -18686, 1784, -27581, 24191, 20121, 9367,
+ 8138, -29159, -25007, 26150, 24824, -1578, 23016, -27886, 18406, -15833, 1758, 21831, 32663, 32224,
+ -1173, 28404, 27100, 30721, 7564, -12264, 16107, 18017, -14171, 19855, 12791, 13855, -22096, -3765,
+ 5768, 32537, 24266, -11860, -27719, -14837, -9913, -28729, -32391, 17179, 30318, 31925, -28252, -20907,
+ -10920, -18291, 15166, 3084, -6054, 30491, 24559, -8851, 17891, 29601, -5783, 16972, -32412, -20841,
+ -5087, -4912, -24417, 32762, -1285, -24948, 20012, 2107, -28999, -15565, 15234, 8170, 16547, -18184,
+ -28976, -1911, -14939, -31967, 32306, -17934, 31558, 22550, -8581, 18794, 4990, -8427, -25004, -15059,
+ -21540, 18212, -13293, -10890, -20944, -11275, -24501, -31866, -29757, -28015, 5871, 8417, -27352, -30295,
+ 15871, -273, -11223, 31416, 29932, -12521, -7203, -24701, 28322, 20970, 6630, -31331, -13488, -5237,
+ -1866, 18594, 18128, 31908, -32165, -21567, 23096, -27261, -18013, 1156, 11679, 11104, -32668, 26178,
+ 16260, -29381, 9773, -458, 15781, 6378, -23468, -27213, -31045, 12498, 25714, -758, 18349, -10084,
+ -25022, 23807, 28335, 25943, -25431, -5420, 6878, 26787, -32243, 30577, 3969, 25164, 1920, 7745,
+ 32214, -19000, -30559, 1973, 17036, 7386, -26707, 226, -9650, 14616, -5567, -22376, 4523, -29672,
+ 32715, -11499, -13206, -12963, -12023, -14008, 29485, -6378, -23813, -1785, 19234, -3457, 23052, -27248,
+ -31451, -21486, -26182, 20179, -30604, -29082, -13592, 3552, -27689, -28245, -503, 31530, 13424, -14546,
+ 10035, -25839, 25311, -22551, 8527, -16491, -25001, 32743, 30204, -7556, -20740, -31758, 27418, 31454,
+ 25563, 9138, -2483, 23593, 473, 27626, -15888, -24514, 23893, -10925, -16321, 10605, 6284, 27428,
+ 8727, 4611, -7537, -21645, -9773, 30323, 14036, 585, -32471, 22362, -21625, 2802, 8956, 18924,
+ 23468, 1470, -24974, 26929, -23498, 22088, 1794, 19428, 19581, -2222, 25410, 24285, -8993, 2060,
+ -18249, 25158, -1950, -22149, 7463, -30574, -28155, 14609, -10737, 24219, 2600, 27847, -25068, -4665,
+ -18637, -24692, 6542, 30440, -10, 28420, 11551, 30532, 29419, 24330, -5616, 7713, -27198, -25932,
+ -25134, 30753, -3410, 2961, -22870, -9529, -31069, 23396, -15022, -14491, 25973, 7213, 13728, -14136,
+ 1089, -32696, 25462, 16387, 25949, -30042, -6223, -13380, 23897, -16461, 1434, -15487, 2088, 25325,
+ 25299, 25711, 26556, -19886, 11595, -22101, 28842, -25959, -24870, 9276, 2315, 5971, -10373, 30891,
+ 9486, 28390, -22999, 8147, -14176, 14419, 6457, -26490, -25868, 14612, -4625, -300, 21579, 5143,
+ -27983, -21664, -4342, -14743, -10200, -13623, 12940, 26633, -18967, -31134, 10287, -16375, -18288, 29868,
+ -20777, 17877, -30829, 24784, -28831, 22490, -30380, 23239, -17233, 14602, 14912, -12161, 26055, -3636,
+ -2948, -29168, 25963, 9222, -1308, -3103, -16738, -4004, 26604, -29213, -25324, -13245, -10968, 1331,
+ 11146, 2438, -28570, 19248, 26434, -25239, -5273, 30416, 1612, -6345, 27369, -8941, -20789, -3120,
+ 17560, 5823, -16295, 10030, 27640, -1335, 2581, -11908, 984, -13745, 15737, 21573, -18710, -31222,
+ 30905, 16337, 4721, -8605, 14403, 25595, -16341, -14923, 10318, 19178, 16398, -13178, 12601, -11740,
+ 9451, 2179, -23574, 14066, 21810, 14074, -864, 13873, 8860, -25892, 3382, -17510, 3306, -887,
+ 17826, -13954, -30826, 32071, 8552, 14452, -337, 2130, 3800, 12269, 5943, 2642, 5742, 29728,
+ -23279, -22881, 31188, 8468, -25600, -23417, -6362, -24032, -22765, -23357, -19265, -15427, 27267, 11701,
+ 14662, 31090, -17304, 14148, 20879, 5662, 7742, 12308, -24638, -23877, 6576, -7161, 20625, -24112,
+ -27822, -15409, 17436, 3065, -14387, 7864, 31972, -11565, 6885, -7552, 7076, -32259, 26586, -21880,
+ -29280, 22878, 12334, 30398, -31807, 6360, -20162, -23661, 5699, 15033, -29921, -28565, -25074, -18843,
+ 27381, 21321, -15696, 13172, 26310, -13424, 13541, -17394, 12069, -6058, -21580, 31480, 9899, 10519,
+ -6208, 6631, 16459, 8406, 15322, -5293, -31183, -15581, 27831, -4827, 20936, -11669, -10734, -25322,
+ -29620, 2784, 32068, 15768, 26322, 3295, -21310, 20721, 31489, 13633, -25355, 8575, 21277, -17476,
+ -31753, -24935, 27318, -22689, -10221, -28728, -4285, -29938, -11579, 16732, 16058, -9918, 4261, 12356,
+ 4254, -21129, -7996, -27112, 22778, -2011, 125, 19876, -2168, 4859, 28178, -24649, 18974, -9613,
+ -7227, 11944, 20131, -25899, -32251, -25484, 5493, -5316, 14202, -26059, 37, 10683, 23969, -7690,
+ -6378, -27348, -23137, 29308, 3941, -8994, -29017, -10811, 637, 24812, -9368, -19412, -237, -26019,
+ -13607, 31368, 13802, 25773, -6139, -18211, -26201, -20159, -6887, -7450, 32709, 10909, 31146, -5533,
+ 24680, 22049, 16956, 247, 27840, 11444, 985, 23222, -8471, 19890, -3874, 21400, -24773, -7891,
+ -20449, -12132, 10619, 29489, 662, -10723, 9069, 15044, 1498, 12754, -17141, 11984, -16319, -21745,
+ 4577, -17821, 15603, -28604, -17742, 8835, -25557, -1302, -6183, -17479, 18486, 26689, 11064, -6603,
+ -20955, 20418, -23900, 9455, 29110, 9197, -20774, -12796, -23669, 25417, -24905, -795, -8530, -9514,
+ 20775, -6776, 16107, 7335, -22979, -29093, -7139, -5302, -10240, -29581, 6208, 32209, 2766, 6165,
+ -29930, -10803, 17262, -27304, 27003, -22672, -3848, -3663, 19900, -14930, 7183, 12966, -25615, 27932,
+ -15710, 24742, 11495, -17060, 21612, -1591, 26846, -9006, 16117, -26676, 6316, -17645, 29966, -11283,
+ 1393, 27222, 31238, -9419, 20916, -9013, 16253, 315, 29777, -1689, -30787, 19093, -2907, -8746,
+ -28883, -31685, -30377, -31269, -15431, -25155, -13843, 5592, 29620, 3346, -6615, 25929, 13002, -32301,
+ -18451, 1618, 20205, -22025, 27347, -23344, 24665, 22904, -6716, -25626, 9694, 6645, -5968, -338,
+ 13362, 9522, -21894, 27087, 9072, -9866, 7570, -2621, 931, -16581, 19364, -3803, -24619, 12463,
+ -20160, 11976, 14595, -30990, -28076, -24721, -9798, -2577, 14569, 31711, -31206, 18905, -20332, -19648,
+ 25508, -27678, 22770, 25293, 8864, -16912, 15232, -23298, -8258, -6847, 59, -16882, -18623, -15672,
+ 9928, -17168, -5023, 31028, 27491, -29124, 187, 21992, -13612, 17647, 19944, -26771, 29350, -26307,
+ 2626, -7084, 5352, 7276, 16150, -6880, -4363, -28164, 30584, -12188, -3607, -4347, 10556, 3476,
+ -27243, 32185, -10431, -28503, -13914, -7335, 29271, -30395, -7430, -565, -25899, 22160, 23842, -5028,
+ -429, -5126, -9063, -6543, 25036, -11294, 12592, -17167, -25847, 2960, 20867, 16709, 2178, 27555,
+ 6773, 22895, -21281, -9369, 4682, -2309, -16089, -12042, -6275, 18269, -23620, -28601, -26689, 29854,
+ -1232, 9028, -30370, 30311, 2082, -24345, -16436, -10392, 11993, -12778, -29723, -23244, -9294, 22518,
+ -10264, -12790, 7164, -4850, 6604, -23405, -9543, 17543, 24963, 25152, 2158, -16711, -32090, -19200,
+ 25280, -29666, 29150, 788, 14050, -1138, 2533, -21144, -9313, 1431, -12751, -3725, 29518, 30696,
+ -21161, 29018, -26988, -24249, -15642, 29152, 3769, -6359, 15386, -27522, 20718, 17237, 15694, 30726,
+ 32185, 9502, -19245, 18323, 26350, -1483, 14237, 18268, 21801, 9610, 45, -17983, -7326, -30333,
+ -20280, -10092, 10630, -10101, 25602, 2344, 31245, -23555, 8689, -7796, 12067, 6856, 23732, -19042,
+ 3697, -17015, -2973, -5404, -8350, -19983, 27852, 2463, 5503, -23425, -1986, -11143, -8315, 8244,
+ 3501, 17588, 31595, 9238, -22804, 2152, 5513, 23552, -13588, -32415, 12865, -4836, -27292, -31774,
+ -15780, 17744, -13361, 28129, -20186, 25643, -18292, -26438, -21545, -31955, 22309, -20935, 20188, -5912,
+ -22129, -21814, -11344, 1175, -23727, 8022, 19494, -4815, -22666, -11717, -19931, 25624, 32424, 10952,
+ -11012, 939, 5211, -12395, -20738, 20345, -10032, 24039, -11560, 2930, -1786, 2907, -12229, 1092,
+ -13611, 31274, -13167, 24634, 2647, 18234, -685, 4497, -15373, -16031, -28465, 29065, -23787, 23348,
+ -28253, 2233, 10754, 19260, 23426, 5904, -27529, 27644, 20847, -5990, 1940, 2096, -10193, -19604,
+ -31910, 190, -19483, -24174, -31173, 19375, -12631, 24180, 20210, 9705, 31500, -16659, 10757, -13227,
+ -30987, 25102, -8616, -28536, 27365, 22629, -7724, -21329, 26860, -21924, -9804, 14394, -12738, -28273,
+ -10053, 28163, -12366, 22925, -27267, 23828, -30468, 30609, -14931, 7594, -29447, 24663, -29977, 8410,
+ -10029, -11459, -14386, 16809, 779, 22743, -25482, -23612, -4193, 41, 30199, -3219, 19372, -29688,
+ -4044, 23344, -7875, -26961, 28831, 3256, -17537, 30554, -27377, -24225, 31885, -11163, 23913, 31907,
+ 21082, -25349, 14729, -3010, 15455, 27171, -4175, -16464, -23887, -24228, -29398, -23372, 10357, -29594,
+ -11608, -23401, 5190, 1381, -26185, 12729, -16938, 21855, 30742, -6217, -1015, 23851, -10158, 23850,
+ -8155, -18131, 9236, 21135, 999, 15244, 14771, -31324, -13956, -1569, 21623, -31215, 23761, 20841,
+ -8172, 9779, -8133, -7230, -8035, -6618, 2770, 28135, 27310, 16637, 606, 3808, -12934, 12704,
+ -22540, 15761, 12578, 2705, -28184, -20578, 26333, -6454, -28166, 3336, 9315, -21539, 1724, 24118,
+ 9047, 1913, 3650, 23110, 17951, 13941, 9958, 8164, -3302, -18854, 5285, 25790, 22796, 550,
+ 299, -29021, 14866, -31168, -28258, 15796, 32690, 4558, -30883, 31499, -19343, 26160, 114, -30814,
+ -17613, 26176, -11008, 1591, 991, -26357, -28182, -4994, -21848, -14700, -16586, -25265, -28161, -17584,
+ 26528, 2275, -27576, 4988, -13390, -19317, -1303, -23351, 32295, 13645, 6449, -14957, 11790, 26794,
+ -19670, -17159, -15516, 3863, -5152, 30824, -16675, 11974, -15286, 8557, -27904, -15784, 14360, 24237,
+ 30469, 14760, 28466, 8947, 28883, 4286, -21195, -19194, 18960, 12236, -971, 9138, -22592, -16576,
+ -17188, 8389, -20237, -16116, -26418, -27297, -2698, 5503, -651, 24671, -30026, -3390, -1686, 25059,
+ -11955, -26812, 4520, 13692, -24559, 6779, 23181, 22376, -26611, 4143, 440, 12524, -16765, -1250,
+ 875, -2592, 4133, -21010, 2018, -5167, 31368, 21838, -28762, -5484, -2176, -14803, -7170, -15759,
+ -24896, -12098, 20761, 29036, 8558, -26684, 1671, -20060, -29558, -2149, -7389, 5297, -4984, 9190,
+ -10517, -29004, -13957, 12584, -27265, 20446, 23323, -24713, -26445, -30612, -421, 9614, 20196, -7391,
+ 29185, 23446, -10736, 17112, -24376, -10752, 27278, 11953, 2628, -17494, 6807, 12968, -2833, 6695,
+ -21937, -15776, -16454, -9063, -14594, 21373, -8358, 24674, -3905, 3482, 17075, 17273, -263, -22923,
+ -3549, -14987, 23241, 212, 30921, 15371, 21070, -19510, -17926, -11978, 13994, 13198, -30654, 15902,
+ 13748, 11962, -30037, -3961, -25581, 8581, -17176, -32575, -28717, 30087, -27315, 10043, 23686, -24270,
+ -30262, 23793, -16853, 5479, 18848, -28893, 24271, 28967, 2431, 5419, -22054, 5216, 22569, -16491,
+ -4504, 1327, -16032, 21339, -11367, -28816, -20836, -10803, 8234, 13480, 1035, -11688, -22590, -3201,
+ 6784, -29804, 21739, -9515, 9199, -4348, -30780, -27851, 25248, 1745, 18048, 3185, -18214, 6593,
+ -25061, 7859, 27914, 3645, -8791, 19745, -18937, -17126, 21209, 8143, 14077, 31912, -25044, -4504,
+ -7941, -22885, 13041, -27636, 18633, -32709, 22565, -11326, 7094, 16849, 6840, 18620, 10013, -12943,
+ 9037, -31333, -22552, 7486, -3027, -14773, -20742, -32571, 27902, -11640, 28854, 4732, 13622, 5400,
+ 3136, -8459, 3504, 16758, -30279, 7229, -14807, -30904, 12277, -8724, -11899, -23946, 28413, 17106,
+ -21381, -16435, -30704, -28019, 6977, 14571, 27411, 26340, -5694, -11285, -21130, -31550, 16316, 15039,
+ 16167, 9946, -15473, -4082, 16935, 14194, -28741, 6975, 28991, -25498, 25141, 1005, 13595, 3302,
+ -13178, -27422, -31741, -27134, -25770, 13675, 14114, 22680, -179, 9633, -13695, -14848, 3629, -15741,
+ -8538, 27322, -5326, 18726, -18436, -12183, -23337, -29816, 19219, 32755, 8104, -7674, 26454, -17108,
+ 2298, -5738, 631, -28701, -10830, 25534, 20067, 8976, 7753, -24600, -19213, 8245, 26030, -9485,
+ 15210, 16834, -17273, 24481, 28695, -29726, -27474, -6586, 8648, -20756, 17083, -16442, -22595, 4670,
+ -25850, 24024, -12925, -5845, -16272, -14966, 8884, 6456, -30385, 4886, -30571, 8430, 16494, -9635,
+ -6369, 12793, 17555, -16299, 31067, -8835, -15131, -1988, 12929, 6364, -2381, -26177, -13395, 27011,
+ -9698, 23522, -9921, -11593, -2035, 1132, -11120, 13575, -13940, -16324, -4811, 31916, 18698, 24186,
+ -23991, -21073, -3826, 32720, -20172, 3968, -1447, -10805, -15287, -4567, 28535, 791, 6421, -1850,
+ 7000, -9350, -12752, -25110, 11951, -9540, -20037, 12822, -27425, -16966, 1473, -117, -24904, -16703,
+ 2932, -690, -24663, 19534, -26373, 5450, -16281, -7209, -13390, 31346, -24713, -17774, 24949, -32659,
+ -17302, -23723, 24662, -32470, 31275, -24317, 5931, -11150, 19072, 24740, -11618, 3688, 13941, -4488,
+ 1849, 15158, 10556, 6064, 18068, 15514, -1451, 32183, 16580, 25336, 27702, 9306, -29276, -17703,
+ 11539, 2543, 31950, -3437, -1324, -12192, -284, -14787, -6624, 9543, 18138, 32303, -24692, 1406,
+ 1203, 26304, -2835, 3768, -3574, -472, 22404, -24001, 9223, 19154, -24699, -15669, -13270, 31573,
+ -18695, 31742, -21986, -32428, -7772, 11848, -21920, 30409, -19653, -13914, 22340, -17338, 27074, -18963,
+ 7505, -23887, -13252, 31653, 10647, -22457, -21644, -30766, -11570, 9846, 17035, -7574, 22870, -6262,
+ 20122, -11261, 20632, 10636, -8711, 2545, -26412, -19600, 4676, 4425, 11703, 9152, 13815, 22490,
+ 5480, -11876, -30537, 16187, 26300, 10722, 7180, 25969, 17040, -680, 21862, 27574, -10461, -17642,
+ -25913, -26877, -21988, -4209, 18392, -11881, 11192, 9754, -3789, -30637, 27881, -439, 28506, -14643,
+ -19747, -1115, 19258, -9866, -30939, -31971, -27666, -29071, 15378, 23988, 994, -29643, -7852, 31595,
+ -1035, 28626, 2285, -12344, -22661, 13149, 19168, -21466, -26555, 10001, -14640, 7418, -928, -1170,
+ -29861, -15656, 32075, -1114, -24848, -17649, -29688, -22384, 30982, -30157, -22126, -10819, 9773, -17675,
+ -1561, -1804, 20931, 17341, -18161, -7481, 1194, -24649, 2375, 5275, -2182, -19949, 20680, -6920,
+ -32455, 23413, 3556, 236, 4370, -4576, 10848, -21126, 25494, 6038, 7784, 19745, 14421, 15171,
+ -24035, -10525, 31372, -14439, -20081, -7975, -22093, -16920, -7684, -26589, -12085, -23671, 272, -26185,
+ -3024, -17973, 17024, 18955, -16490, 12360, -19106, 22813, -31313, 2301, -1909, -5073, -7810, -19673,
+ 20103, 6842, -23067, -26662, 8045, 21578, 10618, -32575, 15241, -18579, -7773, -30191, -5975, -10649,
+ -15879, -4043, 4797, 20756, 10182, 17985, 9744, 18151, 19186, -20426, 27689, -14340, -24017, -23756,
+ 29790, -15761, -7132, -6012, -3162, 4684, 19579, -27329, 1034, 26751, 2401, -22946, 11185, -32621,
+ 3568, -22724, -11856, -23828, -28141, -5043, -6624, 3177, 25514, 16824, 29578, 10930, -516, 23897,
+ 16629, -19887, -17727, -2274, -22997, 7829, 3564, -25909, 9153, 5762, -32074, 20716, -29459, 5664,
+ -26509, -22544, -9318, -30754, -3600, 30565, 967, 5343, -9958, 21151, 10916, -25661, 10641, 2375,
+ -6132, 30553, -10210, -8536, 9835, 7628, 14258, 3490, 14918, -30115, 19563, 27191, -20282, -5613,
+ 23608, 23243, -29800, -27798, -12283, 8763, 26339, -9805, -15169, 1971, 4270, -2196, -28997, -9862,
+ -5137, 26605, 18965, -14138, -10652, 721, -13065, -32095, 1905, -29148, 24307, -6102, 5729, 32337,
+ -23304, 27248, -27146, 1361, 32219, 2499, 24296, 25959, 7386, -18342, 30572, -30594, 8443, 16134,
+ 17259, 15454, -23559, -641, -17283, 22508, -18103, -22700, 26179, 21269, 20914, -32286, 15517, 3981,
+ 32031, 28293, -5324, 12321, -2580, 1237, 15206, -29572, -24118, -25076, 12340, 25695, -2082, -31172,
+ 5134, 8232, -14761, 7503, -32670, 31758, 7286, -9813, -9638, -28628, -8234, 20975, 20829, -27531,
+ -22563, -7561, -7153, -16679, -16141, 4917, -1165, -21005, -14429, 27422, -26738, 3933, 7679, -5707,
+ -2318, 27403, -20405, 14802, 15169, 29112, -21237, 8458, 3108, -2541, -17424, -26307, -18289, 9869,
+ -25623, 11219, 28748, -20566, -22168, 11186, -25273, 2107, -17915, 4300, 16502, 22454, -11330, 15377,
+ 6763, -6141, 24284, -30186, -15587, 25412, -3540, 9738, 20088, -10492, -16841, -15222, 25413, 19670,
+ -19043, -15760, 22517, 1443, -24851, -11243, 14429, 21951, 30944, 13032, 6302, -1623, 29886, 20748,
+ -28996, 17540, 19167, 17459, 2201, 22705, -4836, -4099, 6250, -31180, 15163, -8466, 4943, 7084,
+ -102, 22520, 25245, 25436, -24222, -7249, -14589, -10015, -20836, 32133, 25741, 13954, 5650, 26706,
+ -16573, -6921, -17976, -1854, -27511, 23893, -23175, -32678, -4295, -9290, -3913, -22649, 25045, 17487,
+ 12705, -30685, -15199, -14425, 8466, -30290, -4551, 21118, 19593, -21201, 26639, 5887, 2482, 30093,
+ 8978, -23435, -8012, 171, 15178, 14342, 29842, 28381, 23265, -14022, 32115, 19329, -10866, 991,
+ 12288, -13262, 28777, 577, -10956, -4036, 28490, 26121, 31419, -518, -31664, 25611, -5528, -252,
+ -24907, -30300, -30045, -15423, 31363, -3972, -30174, 8298, 9243, 31261, 24032, 24628, -20118, 29924,
+ 4897, -12661, 16729, 32069, 15772, 11139, 2437, -31415, 31957, 7337, -31481, -31358, 13868, 18270,
+ -18067, -2123, 307, -13202, 8781, -16837, -7851, 4122, -7276, 30211, 27562, -7814, -30974, 24026,
+ -14393, -17383, 18255, -13124, 28785, -22845, 15899, -17470, -25024, -17152, 31559, 21788, 31957, 6277,
+ -11524, 2028, -3831, 11094, -3167, 20996, 25521, -211, 5367, -13928, 31179, 28908, 27388, 23263,
+ -6342, -2796, -3431, -26179, 10980, -9964, -24463, 28533, -25516, -31032, 5769, 11863, -7062, -11356,
+ -23871, 30478, -32645, -28731, 21461, -18426, 8234, -12057, -5000, -14239, 9443, 19410, -10190, -1341,
+ -1093, -32401, -24570, -29682, -30420, 24229, -16728, -9854, -2282, 1562, -27645, 30069, 3306, -25914,
+ 7738, 1709, 7983, 11390, 29492, -23219, 13945, -1434, 7935, 22224, 30860, -28239, -11081, -1919,
+ 32429, -23051, 32416, 7771, 19755, 112, -30920, 10397, 28624, 18296, -12463, -24284, 9977, 4837,
+ -24803, 11196, 8997, 6798, 3999, -9617, 8207, -30289, 20509, 12577, 16498, 15285, -20779, 11573,
+ -19668, 16243, 9822, 11128, 15314, -1226, 12574, -10592, -18673, -19891, 2, 30591, -14684, 26516,
+ 6344, 8953, 25147, 514, -11137, 5407, 28837, 10108, 1817, -29578, -5881, -29574, 7330, -28043,
+ -5441, 25472, -23401, -25563, 9430, -30956, -22399, -30005, 19515, -22355, 20368, 4286, 6730, -10707,
+ 1387, 16771, 26886, -9678, -6682, -17870, -9019, -9460, -92, -20207, 4639, -21980, 22084, -6264,
+ 27360, 5473, -25705, -8836, -30062, 13163, 13555, 17867, -14271, 31545, -20976, 22232, -24907, 629,
+ -7301, -11650, 10868, -28953, 3939, -22272, 27641, 7624, 28728, 808, 15777, -15716, 9992, -16504,
+ -32246, 30864, -31058, 30372, -581, -11991, 5363, 20504, 16285, -9217, -25675, -9669, 32614, -23249,
+ 27499, 32051, -14931, -13614, 19462, 15417, -25498, 31939, -14544, -30756, -28751, 12482, -11717, 470,
+ 15615, 26858, -22945, -17582, 32464, 11624, 5245, -18997, -8296, -32678, -30061, -17799, -3396, -11501,
+ 24251, -16824, 18657, -23542, 31815, 13587, 394, 28025, -1572, -21471, 16284, -29092, 21434, -6480,
+ 510, -9882, 1607, 24798, 15956, 15956, 17177, 23969, -18787, 16443, -20605, -13555, 9363, -29532,
+ -10237, 6277, 8661, 1007, 20701, 25089, 9612, 28410, 16254, -30508, -10828, -3101, 31072, 4795,
+ -3867, 8980, -434, 9060, -19325, -861, 1882, 14792, 20171, 31490, -24928, -14351, -6208, -12880,
+ -3953, 15909, -29946, -16816, -21584, 12376, -22187, -30023, -20702, -24605, 31107, 22493, 16779, -32042,
+ 1556, -5614, -17917, -23511, 31049, -23458, 27399, 31703, 7897, 5868, -27290, -11695, 11024, -32193,
+ 21355, -27246, -1498, -14850, 15190, 5599, -12382, 27067, -20450, -21140, 19637, -10975, 31305, 16598,
+ 13005, -13764, 17686, 7010, 19143, 4562, 21431, -24757, -29161, -9861, -11961, -14668, -8784, -15634,
+ 26170, -9221, 16639, 14093, 30940, 31308, -28058, -27945, -20365, -13720, -2535, 23981, -9352, 4613,
+ -19316, 14333, -14902, 27960, -23022, 18629, -18972, 23532, -28160, -15098, 26185, 25124, 6902, 24230,
+ 1904, 21959, -14358, 8008, -19612, -4868, -18186, -4028, -14295, -26071, -3873, 8698, 18267, 22505,
+ 11933, 22228, -13606, 27375, 14847, -3085, 19158, -32608, 7101, -2992, -28067, 6378, -4531, -15611,
+ 9688, -8612, -20105, 7767, 32763, 27584, 25658, -22895, 21526, -7777, -30499, 2305, 29361, -23727,
+ 3656, 24867, -14648, -26731, -6273, 23213, -24713, -18097, 10074, 30553, -26940, 8376, -16083, -5928,
+ -1665, -8010, 16476, 27248, 30746, -16680, 16678, -451, -1125, 24199, 29823, -6734, 29705, -5954,
+ 28697, 3988, -8407, -17694, 5634, -9024, -30313, -32393, 10313, -14497, 7553, 22765, 13170, -31257,
+ -13911, 12012, -7552, -18276, -32444, 15198, 2908, -17541, -25815, 12951, -24341, 8729, 26752, 16813,
+ 12904, 4712, -30732, 15212, 294, -14496, 16673, -22350, -15059, -21245, 13145, -1594, 2910, -15744,
+ -3230, 4610, 16071, 26740, -652, 29724, -22395, 12301, 27041, -12735, 20532, -5057, -21259, -19126,
+ -21625, 24249, 11915, 10136, 16842, 11950, -1807, -26664, -3033, 12255, -14974, -10480, 19667, 21866,
+ 25056, -24974, 6206, 16887, 7974, 3772, 9987, 25505, -25187, -23149, 7380, -30400, 9479, 951,
+ 23216, 14808, -18936, 8482, 14108, 5134, -22338, -27257, 75, -30636, 30251, 26794, 4489, -28184,
+ -14687, -8898, -18187, -22519, -26907, -14352, -3844, -22462, 29345, 16109, 32008, -9122, 74, 18736,
+ 20028, 17973, 29661, 23304, 15327, 88, -1218, -14304, -1488, 20091, -11243, 28514, 19831, 20756,
+ -538, 21813, -5941, -17111, -19310, -14720, 30406, 30987, -7041, -32379, -21946, 26270, 15146, 28823,
+ -29820, -17457, -16731, -1078, 31960, -4324, -31651, 27679, 18062, -25412, -16987, -19877, -7473, -31450,
+ -7321, 11436, 12389, 6300, 20420, -27898, 8265, 18487, -23677, 14945, -23902, -21175, -26155, 23133,
+ -32665, 776, 8163, 27953, -11349, -5927, 27751, -4949, -7998, -2989, -23709, 19833, 13638, -6709,
+ -32280, -5049, 32028, 10369, -11774, 23317, 12585, -18338, 26859, -14993, -15835, 21275, -5159, -1726,
+ 21602, 1266, -13424, 3149, -10442, 1928, -18287, 13727, -4019, 19892, -10922, 14936, -214, 2110,
+ -31846, 19574, -17071, 18407, 31292, 25800, 2090, 1672, 27480, -19629, 11216, -17006, 9101, 24825,
+ -10441, -23676, 21067, -13812, -24285, 31068, -26184, 11522, 16483, 24081, -848, -11582, -4332, -740,
+ 27803, -621, -2762, -11778};
diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8/output_mult_data.h b/Tests/UnitTest/TestCases/TestData/int16xint8/output_mult_data.h
index c7e50e3d..9fd93e90 100644
--- a/Tests/UnitTest/TestCases/TestData/int16xint8/output_mult_data.h
+++ b/Tests/UnitTest/TestCases/TestData/int16xint8/output_mult_data.h
@@ -1,6 +1,6 @@
-// Generated by generate_test_data.py using tensorflow version 2.10.0 (Keras version 2.10.0).
-// Interpreter from tensorflow version 2.10.0 and revision upstream/v2.10.0-0-g359c3cdfc5f.
+// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0).
+// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e.
#pragma once
#include
-const int32_t int16xint8_output_mult[4] = {1089212438, 2042635001, 2134124060, 1087333954};
+const int32_t int16xint8_output_mult[4] = {1094038263, 1093426216, 1093614140, 1093822383};
diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8/output_ref_data.h b/Tests/UnitTest/TestCases/TestData/int16xint8/output_ref_data.h
index 15280764..babc7a6e 100644
--- a/Tests/UnitTest/TestCases/TestData/int16xint8/output_ref_data.h
+++ b/Tests/UnitTest/TestCases/TestData/int16xint8/output_ref_data.h
@@ -1,10 +1,9 @@
-// Generated by generate_test_data.py using tensorflow version 2.10.0 (Keras version 2.10.0).
-// Interpreter from tensorflow version 2.10.0 and revision upstream/v2.10.0-0-g359c3cdfc5f.
+// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0).
+// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e.
#pragma once
#include
-const int16_t int16xint8_output_ref[48] = {
- -13335, -169, -10400, -1211, -4046, 17113, 6664, 31020, -11016, 14661, -12617, 4871,
- -11590, 6034, -12869, -2736, -13335, 23907, -6623, 2609, 6054, 6400, -2306, -13335,
- -7031, 1919, 13723, -13335, -13335, 4406, 23009, -13335, -8348, 12887, 1828, -13335,
- -13335, 1073, 13718, 617, -2508, 10951, 5453, -11033, -4797, 5220, -9823, -2385};
+const int16_t int16xint8_output_ref[40] = {180, 471, 855, 475, -60, 327, 298, -198, 147, 108,
+ 535, -101, -101, -235, -535, -188, -547, -944, -548, -328,
+ -895, -624, -496, -1029, -809, -671, -453, -410, -266, -563,
+ -818, -799, -512, -485, -639, -968, -102, -9, -414, -314};
diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8/output_shift_data.h b/Tests/UnitTest/TestCases/TestData/int16xint8/output_shift_data.h
index 74770b4b..5ca3315b 100644
--- a/Tests/UnitTest/TestCases/TestData/int16xint8/output_shift_data.h
+++ b/Tests/UnitTest/TestCases/TestData/int16xint8/output_shift_data.h
@@ -1,6 +1,6 @@
-// Generated by generate_test_data.py using tensorflow version 2.10.0 (Keras version 2.10.0).
-// Interpreter from tensorflow version 2.10.0 and revision upstream/v2.10.0-0-g359c3cdfc5f.
+// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0).
+// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e.
#pragma once
#include
-const int32_t int16xint8_output_shift[4] = {-8, -9, -9, -8};
+const int32_t int16xint8_output_shift[4] = {-16, -16, -16, -16};
diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8/test_data.h b/Tests/UnitTest/TestCases/TestData/int16xint8/test_data.h
index 8102687f..4d61c5f2 100644
--- a/Tests/UnitTest/TestCases/TestData/int16xint8/test_data.h
+++ b/Tests/UnitTest/TestCases/TestData/int16xint8/test_data.h
@@ -1,5 +1,5 @@
-// Generated by generate_test_data.py using tensorflow version 2.10.0 (Keras version 2.10.0).
-// Interpreter from tensorflow version 2.10.0 and revision upstream/v2.10.0-0-g359c3cdfc5f.
+// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0).
+// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e.
#include "biases_data.h"
#include "config_data.h"
#include "input_data.h"
diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8/weights_data.h b/Tests/UnitTest/TestCases/TestData/int16xint8/weights_data.h
index ac8c8768..91884235 100644
--- a/Tests/UnitTest/TestCases/TestData/int16xint8/weights_data.h
+++ b/Tests/UnitTest/TestCases/TestData/int16xint8/weights_data.h
@@ -1,11 +1,351 @@
-// Generated by generate_test_data.py using tensorflow version 2.10.0 (Keras version 2.10.0).
-// Interpreter from tensorflow version 2.10.0 and revision upstream/v2.10.0-0-g359c3cdfc5f.
+// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0).
+// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e.
#pragma once
#include
-const int8_t int16xint8_weights[96] = {
- 12, -38, -25, -95, 18, -1, 57, 35, 76, 61, -54, 20, -19, -40, -127, -7, 39, 110, 39, 45,
- -20, -41, 48, -69, 12, -105, 127, 58, -103, 108, 36, -48, -101, 42, -48, 87, 79, -27, 36, 66,
- -42, -114, 80, 40, 115, -126, 94, -9, -50, -121, 45, -29, 118, -111, -96, -23, -85, 71, 82, 16,
- -127, -82, 83, -88, 74, -101, 118, 37, -91, -71, 82, -1, 42, 125, -58, 54, -113, 119, 94, -23,
- 114, 91, -21, 75, 91, -109, -103, -83, 124, 7, 45, -127, -5, -20, -109, -124};
+const int8_t int16xint8_weights[7920] = {
+ 118, 98, 35, 46, 18, 96, 107, 92, 59, 73, 100, 7, 94, 43, 112, 33, 55, 111, 5, 20, 68, 58, 82,
+ 93, 120, 46, 10, 25, 76, 30, 111, 9, 94, 23, 118, 56, 39, 45, 72, 123, 47, 23, 62, 50, 44, 78,
+ 74, 110, 90, 23, 8, 65, 38, 36, 85, 22, 25, 13, 38, 43, 63, 104, 74, 93, 27, 125, 17, 57, 87,
+ 95, 71, 52, 90, 71, 54, 5, 93, 94, 55, 89, 48, 12, 103, 117, 78, 74, 20, 84, 10, 100, 19, 17,
+ 73, 41, 37, 86, 104, 54, 83, 35, 114, 35, 39, 76, 48, 86, 120, 92, 27, 40, 64, 71, 30, 88, 9,
+ 54, 47, 25, 93, 75, 15, 63, 106, 21, 105, 3, 57, 78, 79, 4, 9, 77, 20, 52, 96, 22, 74, 72,
+ 85, 95, 19, 26, 57, 13, 10, 124, 50, 19, 52, 116, 30, 102, 35, 11, 60, 35, 77, 110, 78, 119, 119,
+ 115, 71, 71, 68, 12, 22, 114, 81, 66, 65, 66, 94, 127, 56, 19, 79, 51, 71, 3, 90, 107, 20, 97,
+ 29, 9, 125, 93, 65, 61, 116, 10, 5, 108, 24, 55, 122, 112, 37, 80, 52, 4, 72, 14, 118, 64, 22,
+ 102, 52, 55, 93, 6, 42, 115, 57, 104, 123, 77, 116, 17, 81, 41, 124, 97, 7, 120, 92, 121, 53, 42,
+ 126, 26, 3, 73, 79, 120, 51, 24, 124, 84, 41, 70, 3, 3, 67, 27, 83, 60, 24, 49, 72, 42, 54,
+ 41, 3, 28, 125, 48, 41, 68, 12, 20, 79, 56, 89, 62, 7, 110, 56, 45, 97, 50, 61, 79, 4, 30,
+ 121, 115, 110, 52, 25, 92, 1, 122, 28, 63, 125, 14, 61, 109, 15, 8, 94, 118, 106, 13, 29, 105, 34,
+ 88, 107, 1, 110, 48, 101, 121, 8, 12, 42, 61, 23, 54, 50, 42, 35, 101, 124, 19, 14, 54, 30, 96,
+ 103, 29, 85, 9, 87, 6, 27, 24, 49, 66, 55, 8, 78, 3, 85, 88, 47, 95, 61, 48, 46, 38, 13,
+ 23, 106, 44, 123, 114, 70, 120, 15, 16, 123, 79, 78, 36, 86, 59, 49, 11, 124, 127, 102, 70, 64, 35,
+ 112, 92, 49, 29, 109, 118, 48, 114, 39, 110, 33, 107, 43, 14, 5, 72, 41, 72, 74, 76, 2, 8, 63,
+ 102, 20, 28, 105, 87, 13, 102, 80, 121, 73, 126, 56, 29, 20, 9, 7, 51, 16, 92, 99, 115, 48, 85,
+ 53, 41, 119, 19, 3, 117, 74, 98, 118, 53, 33, 65, 64, 49, 7, 62, 44, 60, 41, 55, 24, 53, 93,
+ 10, 111, 27, 38, 50, 70, 62, 69, 119, 40, 48, 42, 65, 45, 118, 15, 36, 29, 87, 33, 52, 1, 84,
+ 79, 83, 65, 101, 77, 82, 54, 42, 102, 55, 25, 98, 30, 87, 88, 64, 5, 56, 45, 56, 86, 85, 32,
+ 74, 104, 98, 14, 33, 86, 102, 85, 30, 25, 71, 76, 98, 103, 82, 82, 116, 12, 1, 82, 116, 108, 121,
+ 122, 103, 56, 79, 54, 64, 95, 83, 70, 42, 99, 119, 60, 91, 123, 108, 41, 26, 21, 8, 60, 83, 22,
+ 107, 28, 100, 84, 122, 74, 55, 51, 45, 4, 122, 48, 76, 5, 26, 28, 26, 95, 127, 89, 18, 97, 77,
+ 110, 70, 115, 19, 84, 91, 1, 97, 1, 36, 92, 115, 16, 74, 42, 122, 124, 52, 59, 66, 11, 37, 101,
+ 101, 28, 112, 107, 24, 83, 71, 101, 73, 112, 36, 93, 63, 117, 43, 76, 36, 76, 30, 45, 2, 28, 121,
+ 7, 45, 96, 9, 97, 69, 28, 58, 59, 78, 0, 46, 6, 63, 102, 104, 17, 72, 106, 104, 35, 84, 90,
+ 116, 124, 19, 37, 106, 3, 95, 127, 94, 15, 65, 103, 49, 12, 62, 72, 77, 29, 60, 103, 65, 43, 61,
+ 66, 65, 2, 88, 104, 111, 113, 37, 50, 117, 105, 11, 87, 46, 4, 31, 36, 74, 103, 39, 50, 11, 115,
+ 17, 77, 35, 86, 86, 23, 53, 52, 112, 57, 25, 33, 126, 50, 100, 69, 0, 68, 89, 7, 71, 89, 56,
+ 86, 89, 33, 61, 67, 11, 114, 124, 47, 63, 68, 22, 65, 94, 68, 69, 120, 46, 48, 99, 81, 104, 83,
+ 60, 76, 6, 98, 35, 94, 121, 4, 80, 48, 126, 125, 104, 25, 35, 120, 67, 25, 22, 83, 22, 55, 3,
+ 110, 17, 88, 117, 82, 90, 56, 69, 57, 119, 103, 56, 31, 87, 42, 48, 65, 17, 6, 109, 23, 7, 45,
+ 48, 107, 28, 66, 83, 121, 36, 100, 61, 32, 117, 64, 117, 18, 86, 89, 60, 8, 29, 42, 3, 72, 2,
+ 28, 82, 16, 54, 55, 98, 39, 18, 125, 39, 91, 34, 13, 86, 88, 125, 67, 3, 14, 19, 82, 84, 37,
+ 73, 124, 94, 92, 33, 58, 14, 8, 36, 17, 7, 53, 11, 58, 97, 93, 88, 83, 57, 69, 73, 114, 31,
+ 16, 74, 9, 97, 16, 74, 20, 89, 14, 73, 6, 82, 11, 63, 10, 42, 70, 88, 8, 55, 53, 37, 112,
+ 68, 62, 11, 74, 11, 51, 110, 41, 44, 107, 4, 5, 80, 31, 17, 122, 10, 19, 67, 37, 34, 10, 12,
+ 52, 105, 99, 85, 28, 78, 32, 74, 33, 46, 123, 123, 103, 40, 108, 116, 26, 44, 126, 81, 84, 18, 89,
+ 57, 99, 115, 26, 47, 75, 78, 117, 6, 76, 89, 109, 66, 38, 80, 15, 44, 69, 64, 121, 127, 84, 46,
+ 122, 33, 18, 93, 58, 72, 52, 115, 87, 98, 73, 71, 62, 7, 76, 65, 117, 92, 53, 32, 115, 33, 125,
+ 9, 104, 99, 10, 66, 69, 63, 112, 63, 42, 95, 9, 68, 5, 5, 17, 96, 125, 112, 66, 120, 124, 11,
+ 93, 127, 34, 14, 111, 102, 15, 1, 81, 8, 48, 25, 77, 116, 50, 20, 37, 32, 11, 62, 59, 116, 79,
+ 104, 78, 44, 70, 31, 32, 11, 75, 93, 30, 81, 87, 1, 18, 77, 93, 69, 36, 101, 95, 65, 60, 37,
+ 18, 97, 13, 86, 32, 62, 43, 55, 18, 1, 59, 44, 90, 125, 0, 52, 63, 90, 60, 97, 48, 38, 48,
+ 1, 75, 120, 87, 82, 61, 78, 32, 39, 46, 82, 15, 89, 69, 71, 21, 46, 78, 1, 51, 35, 30, 8,
+ 122, 123, 114, 36, 83, 44, 20, 74, 116, 109, 22, 17, 51, 48, 83, 90, 52, 95, 35, 11, 8, 34, 9,
+ 24, 21, 103, 82, 95, 97, 39, 69, 17, 5, 37, 16, 49, 125, 55, 126, 122, 3, 51, 117, 120, 27, 122,
+ 41, 116, 95, 89, 43, 125, 108, 56, 79, 60, 38, 94, 123, 13, 38, 77, 13, 117, 81, 8, 37, 117, 22,
+ 124, 47, 97, 54, 125, 95, 48, 5, 24, 78, 58, 125, 29, 54, 23, 65, 86, 85, 19, 83, 53, 95, 12,
+ 52, 125, 83, 68, 100, 107, 52, 106, 78, 35, 70, 61, 92, 114, 81, 120, 85, 43, 27, 14, 68, 51, 102,
+ 1, 79, 125, 125, 62, 67, 67, 39, 77, 83, 29, 56, 57, 100, 53, 6, 102, 101, 119, 115, 40, 117, 92,
+ 42, 25, 29, 89, 79, 56, 13, 38, 87, 93, 121, 20, 112, 100, 90, 43, 21, 113, 83, 119, 28, 12, 72,
+ 119, 80, 31, 115, 55, 63, 121, 89, 6, 126, 112, 60, 107, 99, 84, 31, 30, 83, 66, 18, 34, 62, 117,
+ 40, 89, 107, 41, 121, 18, 21, 72, 103, 49, 52, 11, 46, 66, 53, 22, 1, 91, 39, 69, 70, 32, 50,
+ 123, 9, 121, 83, 89, 9, 58, 95, 11, 104, 80, 12, 80, 89, 76, 2, 84, 113, 61, 95, 89, 106, 13,
+ 51, 120, 61, 33, 31, 76, 112, 55, 47, 45, 11, 40, 89, 76, 84, 26, 70, 8, 3, 25, 104, 53, 37,
+ 36, 112, 83, 42, 69, 111, 125, 35, 8, 20, 85, 112, 123, 73, 5, 103, 15, 90, 10, 53, 113, 69, 116,
+ 16, 14, 56, 70, 42, 24, 10, 78, 113, 87, 47, 104, 97, 49, 93, 33, 18, 126, 83, 55, 120, 119, 125,
+ 18, 114, 118, 33, 59, 11, 20, 111, 126, 102, 35, 74, 49, 109, 119, 53, 24, 89, 50, 97, 50, 23, 22,
+ 15, 111, 49, 103, 17, 103, 29, 66, 108, 25, 89, 47, 6, 94, 44, 63, 37, 97, 89, 87, 100, 93, 101,
+ 66, 31, 114, 77, 64, 75, 47, 33, 32, 36, 76, 11, 75, 10, 26, 124, 62, 60, 18, 110, 115, 84, 66,
+ 124, 14, 4, 99, 59, 58, 99, 36, 47, 61, 55, 50, 123, 67, 127, 66, 34, 105, 13, 87, 21, 7, 32,
+ 60, 5, 19, 96, 77, 78, 77, 121, 32, 106, 116, 59, 67, 53, 103, 65, 10, 126, 30, 95, 70, 123, 76,
+ 18, 81, 125, 27, 13, 63, 32, 8, 38, 15, 123, 67, 112, 16, 90, 43, 13, 29, 3, 20, 21, 26, 78,
+ 63, 38, 7, 127, 108, 127, 119, 47, 31, 88, 6, 119, 86, 56, 24, 6, 15, 119, 29, 108, 121, 96, 31,
+ 24, 118, 16, 81, 25, 103, 55, 21, 22, 58, 9, 116, 42, 91, 19, 120, 65, 25, 103, 24, 38, 62, 35,
+ 109, 44, 97, 36, 97, 64, 46, 55, 16, 74, 34, 118, 127, 20, 18, 6, 11, 22, 21, 44, 109, 48, 46,
+ 48, 2, 115, 42, 66, 93, 64, 15, 33, 67, 99, 22, 27, 44, 52, 35, 21, 102, 76, 6, 24, 90, 2,
+ 93, 94, 23, 19, 42, 57, 69, 111, 9, 92, 40, 58, 60, 36, 40, 17, 119, 57, 79, 48, 65, 90, 22,
+ 66, 73, 66, 20, 54, 127, 54, 37, 84, 72, 39, 8, 5, 95, 116, 82, 32, 51, 56, 97, 47, 47, 70,
+ 113, 108, 82, 72, 70, 54, 101, 45, 47, 12, 23, 22, 78, 107, 20, 66, 118, 81, 25, 29, 40, 95, 49,
+ 55, 123, 18, 19, 28, 8, 44, 122, 13, 104, 19, 73, 2, 15, 95, 65, 82, 73, 16, 110, 49, 98, 109,
+ 73, 42, 112, 112, 49, 43, 18, 2, 22, 40, 95, 19, 57, 15, 76, 66, 43, 91, 112, 127, 71, 21, 98,
+ 105, 96, 72, 118, 103, 9, 2, 74, 37, 75, 42, 98, 0, 16, 34, 63, 40, 73, 15, 117, 117, 13, 108,
+ 60, 55, 40, 106, 4, 19, 42, 77, 1, 40, 97, 74, 50, 13, 26, 100, 113, 40, 84, 98, 3, 112, 29,
+ 35, 74, 81, 22, 9, 45, 113, 69, 91, 109, 48, 24, 17, 15, 97, 125, 75, 57, 72, 57, 117, 27, 72,
+ 126, 100, 77, 62, 44, 28, 65, 53, 14, 126, 96, 47, 14, 94, 40, 83, 77, 5, 40, 39, 124, 98, 110,
+ 122, 58, 79, 38, 91, 51, 81, 101, 30, 60, 11, 3, 20, 90, 57, 63, 76, 69, 45, 89, 97, 79, 127,
+ 63, 8, 21, 14, 99, 90, 76, 33, 38, 35, 7, 103, 28, 71, 53, 24, 38, 20, 5, 123, 70, 30, 99,
+ 88, 3, 4, 56, 35, 103, 124, 81, 61, 96, 50, 12, 56, 96, 46, 45, 116, 44, 43, 53, 111, 2, 92,
+ 112, 116, 69, 113, 28, 72, 4, 52, 85, 105, 75, 3, 71, 77, 107, 15, 28, 117, 112, 67, 100, 103, 18,
+ 123, 40, 72, 16, 39, 1, 2, 57, 24, 20, 35, 29, 39, 46, 28, 86, 86, 5, 93, 65, 85, 97, 116,
+ 61, 31, 56, 82, 7, 59, 74, 125, 81, 115, 112, 87, 16, 40, 81, 25, 86, 125, 68, 117, 6, 124, 114,
+ 119, 44, 16, 11, 23, 53, 18, 16, 48, 46, 96, 82, 20, 27, 112, 20, 72, 48, 35, 49, 70, 39, 78,
+ 121, 35, 112, 97, 79, 60, 121, 17, 96, 115, 93, 40, 70, 64, 100, 47, 75, 120, 98, 102, 76, 65, 122,
+ 46, 23, 89, 68, 96, 110, 23, 1, 108, 12, 65, 48, 69, 40, 80, 19, 49, 18, 59, 126, 45, 34, 87,
+ 41, 50, 23, 2, 72, 106, 29, 34, 32, 43, 88, 109, 104, 118, 92, 82, 110, 30, 23, 54, 95, 28, 56,
+ 30, 81, 113, 78, 30, 27, 17, 62, 4, 22, 89, 78, 65, 69, 37, 109, 40, 36, 31, 91, 87, 37, 56,
+ 17, 81, 31, 7, 55, 51, 75, 4, 39, 98, 36, 8, 50, 117, 73, 71, 123, 48, 57, 22, 124, 40, 54,
+ 99, 71, 116, 74, 23, 69, 106, 93, 40, 100, 92, 76, 105, 72, 37, 6, 17, 55, 60, 91, 26, 80, 59,
+ 82, 35, 117, 99, 86, 23, 10, 14, 72, 124, 74, 20, 105, 42, 81, 41, 116, 61, 75, 19, 38, 69, 36,
+ 94, 77, 95, 114, 64, 11, 108, 96, 76, 124, 58, 8, 22, 54, 4, 47, 65, 34, 66, 116, 125, 79, 45,
+ 73, 14, 15, 78, 66, 68, 93, 108, 113, 44, 60, 125, 77, 86, 92, 94, 125, 53, 4, 85, 114, 33, 99,
+ 98, 115, 59, 4, 124, 95, 56, 21, 71, 119, 71, 74, 121, 29, 17, 94, 22, 30, 80, 29, 14, 64, 22,
+ 87, 115, 99, 48, 47, 40, 52, 112, 27, 51, 120, 118, 38, 6, 85, 56, 86, 3, 101, 52, 69, 91, 111,
+ 120, 99, 8, 123, 38, 16, 74, 88, 61, 87, 73, 7, 8, 8, 116, 65, 106, 30, 62, 73, 13, 13, 28,
+ 68, 101, 57, 13, 24, 102, 70, 20, 18, 27, 124, 0, 93, 85, 43, 93, 67, 114, 10, 67, 46, 58, 118,
+ 36, 30, 106, 74, 70, 21, 105, 88, 125, 78, 62, 112, 120, 70, 70, 73, 90, 17, 23, 41, 81, 111, 103,
+ 91, 37, 9, 27, 112, 10, 82, 30, 122, 8, 52, 61, 93, 71, 68, 71, 90, 36, 62, 117, 86, 79, 88,
+ 60, 99, 19, 9, 4, 9, 14, 43, 111, 63, 4, 19, 23, 70, 124, 16, 70, 30, 111, 115, 122, 85, 89,
+ 42, 36, 49, 32, 23, 91, 87, 31, 18, 114, 18, 59, 124, 23, 72, 6, 95, 112, 56, 99, 61, 42, 103,
+ 121, 123, 86, 83, 18, 65, 51, 105, 26, 10, 103, 107, 28, 41, 29, 11, 31, 34, 102, 20, 106, 12, 113,
+ 32, 93, 89, 53, 58, 83, 68, 82, 87, 113, 35, 56, 8, 23, 85, 76, 13, 67, 44, 53, 91, 9, 40,
+ 86, 37, 76, 65, 15, 45, 93, 99, 43, 64, 24, 115, 86, 40, 14, 12, 42, 112, 71, 99, 93, 7, 92,
+ 103, 72, 76, 73, 124, 119, 57, 48, 14, 64, 109, 70, 104, 3, 46, 75, 33, 78, 64, 22, 74, 83, 118,
+ 115, 74, 1, 122, 32, 24, 38, 83, 41, 63, 121, 22, 65, 127, 96, 104, 110, 35, 7, 2, 109, 57, 68,
+ 40, 87, 8, 44, 23, 111, 98, 45, 105, 11, 78, 31, 116, 48, 97, 120, 83, 95, 109, 46, 116, 95, 125,
+ 124, 25, 6, 101, 87, 70, 27, 74, 17, 104, 92, 15, 96, 47, 89, 102, 116, 94, 17, 34, 110, 85, 61,
+ 114, 126, 119, 112, 45, 98, 47, 16, 59, 74, 127, 83, 64, 91, 112, 47, 12, 3, 53, 7, 69, 75, 2,
+ 120, 60, 6, 31, 103, 112, 94, 101, 123, 69, 6, 58, 6, 103, 8, 46, 63, 6, 43, 59, 75, 125, 112,
+ 100, 95, 5, 115, 44, 62, 74, 53, 104, 69, 51, 96, 38, 95, 66, 96, 9, 6, 94, 126, 100, 93, 46,
+ 40, 122, 83, 12, 63, 25, 46, 115, 26, 26, 67, 34, 29, 41, 126, 29, 122, 72, 55, 68, 95, 87, 73,
+ 103, 109, 64, 10, 109, 92, 69, 3, 42, 54, 93, 21, 91, 77, 34, 110, 6, 118, 80, 9, 44, 20, 69,
+ 113, 47, 26, 88, 105, 64, 36, 5, 29, 73, 76, 46, 35, 111, 115, 122, 25, 94, 96, 64, 122, 127, 48,
+ 83, 93, 91, 76, 58, 127, 87, 1, 73, 21, 109, 29, 74, 113, 104, 28, 106, 25, 45, 113, 61, 104, 20,
+ 43, 96, 119, 36, 5, 4, 64, 71, 112, 61, 43, 124, 104, 86, 69, 51, 69, 33, 42, 60, 8, 111, 102,
+ 77, 20, 114, 16, 122, 113, 28, 52, 113, 81, 54, 84, 47, 96, 39, 72, 78, 55, 126, 119, 89, 117, 107,
+ 103, 81, 64, 27, 4, 76, 67, 40, 85, 47, 65, 30, 6, 115, 25, 56, 125, 91, 58, 18, 94, 70, 57,
+ 96, 70, 87, 59, 118, 102, 86, 114, 25, 5, 105, 117, 88, 94, 107, 108, 93, 54, 37, 31, 87, 52, 17,
+ 110, 74, 89, 83, 83, 107, 54, 83, 103, 67, 85, 63, 73, 93, 43, 67, 124, 34, 125, 5, 4, 84, 11,
+ 48, 13, 58, 71, 45, 113, 30, 41, 110, 119, 76, 100, 89, 8, 35, 28, 11, 114, 24, 81, 103, 122, 120,
+ 43, 39, 126, 5, 82, 39, 52, 22, 33, 8, 87, 122, 33, 125, 114, 99, 52, 36, 95, 93, 19, 14, 28,
+ 96, 57, 76, 94, 14, 102, 55, 82, 63, 78, 29, 87, 121, 63, 87, 42, 4, 45, 68, 60, 93, 74, 84,
+ 84, 113, 123, 87, 71, 52, 64, 51, 18, 125, 19, 61, 62, 82, 123, 10, 108, 41, 90, 78, 35, 10, 77,
+ 84, 19, 45, 8, 46, 37, 4, 21, 19, 15, 43, 125, 83, 119, 5, 66, 83, 23, 77, 106, 33, 79, 74,
+ 5, 0, 101, 26, 110, 103, 112, 59, 118, 58, 69, 109, 102, 55, 53, 8, 5, 76, 29, 20, 63, 43, 95,
+ 70, 17, 109, 97, 11, 30, 66, 119, 85, 93, 6, 55, 68, 12, 66, 105, 120, 120, 91, 74, 82, 99, 88,
+ 35, 27, 84, 43, 13, 57, 79, 106, 15, 65, 34, 25, 13, 9, 0, 65, 118, 74, 22, 75, 20, 104, 92,
+ 28, 89, 22, 92, 123, 77, 24, 14, 116, 100, 37, 80, 71, 93, 36, 66, 33, 50, 50, 112, 29, 20, 61,
+ 108, 37, 25, 33, 85, 95, 45, 97, 47, 125, 82, 95, 91, 85, 54, 117, 91, 18, 28, 45, 87, 38, 63,
+ 51, 71, 26, 79, 112, 5, 83, 99, 31, 70, 89, 47, 51, 125, 112, 83, 41, 67, 79, 70, 119, 57, 106,
+ 47, 25, 24, 61, 102, 95, 12, 78, 53, 46, 11, 50, 49, 62, 121, 116, 99, 88, 34, 20, 28, 76, 15,
+ 62, 63, 89, 101, 18, 103, 12, 73, 106, 26, 85, 112, 84, 105, 68, 116, 113, 110, 59, 126, 126, 2, 44,
+ 112, 118, 117, 40, 21, 112, 99, 98, 99, 80, 60, 97, 110, 30, 58, 81, 20, 33, 119, 58, 99, 95, 99,
+ 107, 82, 18, 125, 53, 20, 71, 102, 119, 51, 110, 55, 44, 115, 51, 83, 4, 9, 113, 53, 55, 3, 38,
+ 3, 15, 37, 109, 19, 91, 78, 64, 76, 98, 29, 111, 6, 46, 89, 5, 88, 87, 38, 91, 30, 119, 3,
+ 102, 102, 40, 34, 119, 69, 45, 91, 61, 69, 99, 120, 12, 102, 84, 43, 47, 13, 11, 64, 5, 126, 104,
+ 107, 121, 18, 30, 50, 119, 76, 77, 126, 114, 99, 59, 21, 26, 9, 5, 60, 120, 107, 70, 0, 17, 97,
+ 39, 92, 91, 37, 55, 4, 15, 117, 64, 69, 64, 93, 42, 122, 97, 32, 35, 42, 112, 11, 14, 82, 2,
+ 75, 48, 98, 105, 17, 121, 3, 40, 13, 59, 52, 83, 24, 44, 12, 99, 33, 68, 31, 94, 57, 50, 8,
+ 36, 101, 89, 57, 78, 79, 3, 62, 50, 75, 119, 78, 44, 14, 46, 54, 99, 62, 83, 115, 39, 56, 15,
+ 69, 42, 91, 42, 68, 90, 37, 43, 114, 113, 113, 114, 81, 57, 86, 27, 27, 1, 51, 39, 3, 35, 1,
+ 45, 117, 2, 92, 78, 57, 62, 119, 98, 126, 93, 34, 82, 114, 7, 101, 7, 40, 59, 73, 2, 54, 87,
+ 24, 103, 27, 118, 6, 6, 111, 2, 41, 41, 36, 46, 77, 22, 20, 83, 69, 117, 11, 28, 98, 109, 38,
+ 39, 60, 52, 116, 79, 108, 96, 122, 28, 119, 53, 2, 5, 59, 104, 112, 82, 113, 19, 31, 111, 115, 89,
+ 109, 27, 39, 78, 17, 108, 121, 75, 94, 98, 58, 10, 127, 29, 92, 51, 56, 104, 96, 92, 119, 6, 53,
+ 62, 79, 98, 5, 126, 122, 101, 19, 58, 78, 9, 78, 62, 16, 91, 83, 79, 90, 52, 42, 88, 30, 14,
+ 93, 99, 45, 7, 38, 22, 60, 104, 49, 26, 121, 36, 12, 71, 85, 39, 84, 43, 24, 10, 31, 26, 54,
+ 84, 61, 39, 99, 61, 69, 6, 67, 65, 101, 72, 94, 39, 42, 50, 115, 50, 5, 109, 58, 107, 98, 8,
+ 15, 32, 122, 86, 16, 54, 10, 56, 101, 50, 6, 75, 43, 72, 80, 34, 51, 8, 109, 27, 28, 89, 105,
+ 2, 120, 113, 124, 111, 55, 12, 117, 45, 117, 49, 84, 58, 47, 101, 32, 107, 12, 60, 80, 5, 84, 98,
+ 64, 72, 36, 109, 82, 0, 38, 0, 40, 113, 104, 109, 99, 30, 77, 31, 103, 127, 125, 17, 93, 5, 90,
+ 74, 48, 100, 50, 48, 77, 33, 18, 110, 3, 2, 104, 37, 124, 83, 54, 5, 48, 94, 56, 117, 115, 125,
+ 84, 1, 65, 13, 3, 80, 29, 83, 13, 108, 118, 32, 105, 114, 50, 80, 81, 57, 89, 120, 106, 25, 34,
+ 57, 9, 42, 125, 35, 41, 4, 70, 100, 49, 94, 4, 76, 54, 81, 89, 115, 81, 75, 12, 109, 84, 16,
+ 16, 54, 73, 114, 54, 114, 25, 110, 120, 21, 7, 35, 61, 11, 78, 123, 76, 94, 62, 98, 2, 110, 14,
+ 88, 114, 106, 101, 55, 2, 40, 123, 106, 48, 54, 74, 4, 111, 121, 41, 32, 7, 109, 59, 29, 124, 12,
+ 65, 94, 95, 69, 80, 98, 121, 86, 86, 66, 8, 76, 126, 64, 4, 60, 67, 101, 2, 65, 111, 2, 121,
+ 113, 2, 66, 121, 95, 98, 123, 123, 16, 61, 89, 16, 109, 22, 47, 79, 98, 76, 88, 6, 44, 24, 25,
+ 62, 34, 20, 59, 75, 27, 113, 118, 102, 116, 103, 100, 66, 101, 97, 73, 77, 4, 123, 27, 106, 85, 98,
+ 33, 69, 46, 78, 8, 49, 68, 115, 81, 66, 50, 121, 98, 2, 100, 27, 29, 68, 22, 59, 9, 108, 106,
+ 30, 21, 29, 115, 16, 8, 115, 60, 122, 76, 104, 66, 63, 38, 116, 85, 58, 92, 24, 47, 116, 62, 4,
+ 73, 113, 39, 57, 55, 21, 16, 63, 73, 60, 83, 88, 38, 126, 16, 81, 53, 18, 96, 117, 34, 33, 18,
+ 125, 105, 100, 92, 3, 80, 13, 47, 41, 5, 79, 76, 82, 24, 28, 90, 19, 104, 10, 32, 11, 78, 104,
+ 103, 117, 88, 104, 106, 126, 62, 8, 36, 67, 40, 85, 51, 112, 21, 124, 92, 49, 1, 9, 120, 31, 117,
+ 5, 10, 97, 66, 15, 117, 15, 71, 88, 66, 14, 82, 25, 3, 37, 112, 49, 36, 83, 36, 114, 97, 37,
+ 47, 121, 3, 72, 65, 7, 83, 83, 6, 90, 99, 13, 10, 108, 84, 39, 122, 92, 41, 120, 8, 47, 3,
+ 91, 49, 58, 81, 37, 125, 73, 75, 87, 88, 26, 49, 77, 113, 7, 36, 74, 46, 127, 16, 2, 54, 108,
+ 111, 52, 83, 4, 67, 71, 22, 19, 30, 100, 120, 111, 64, 20, 81, 43, 42, 78, 63, 15, 28, 107, 46,
+ 80, 46, 13, 28, 87, 82, 12, 10, 81, 51, 44, 80, 69, 69, 100, 68, 44, 88, 24, 112, 6, 90, 20,
+ 38, 28, 103, 73, 117, 71, 76, 36, 49, 68, 123, 125, 81, 51, 111, 81, 78, 81, 33, 75, 88, 30, 53,
+ 107, 56, 74, 2, 88, 13, 21, 35, 54, 61, 35, 102, 76, 52, 82, 63, 38, 77, 47, 104, 113, 73, 67,
+ 15, 59, 19, 103, 13, 19, 30, 84, 32, 123, 26, 77, 39, 18, 18, 38, 87, 75, 47, 98, 80, 23, 77,
+ 88, 38, 117, 85, 38, 21, 66, 24, 92, 95, 19, 47, 12, 86, 100, 14, 26, 65, 36, 79, 24, 59, 35,
+ 61, 123, 76, 127, 41, 112, 29, 40, 0, 23, 126, 83, 84, 75, 55, 32, 27, 34, 13, 76, 82, 111, 104,
+ 52, 109, 109, 27, 96, 25, 33, 112, 112, 36, 107, 10, 101, 53, 57, 51, 110, 45, 0, 25, 123, 108, 6,
+ 75, 66, 59, 64, 47, 51, 91, 39, 116, 18, 106, 34, 47, 48, 68, 44, 74, 77, 34, 65, 15, 28, 93,
+ 24, 15, 112, 99, 72, 44, 64, 49, 13, 34, 24, 20, 31, 41, 11, 22, 26, 25, 49, 79, 83, 19, 66,
+ 116, 70, 71, 41, 27, 1, 2, 55, 14, 106, 69, 115, 94, 69, 97, 112, 17, 61, 19, 69, 99, 127, 18,
+ 40, 120, 89, 44, 56, 58, 109, 123, 9, 66, 16, 119, 17, 124, 45, 34, 82, 64, 76, 13, 125, 46, 103,
+ 106, 104, 35, 29, 47, 101, 85, 41, 4, 127, 70, 101, 63, 10, 33, 64, 80, 98, 88, 119, 111, 84, 78,
+ 36, 83, 51, 75, 62, 2, 61, 87, 87, 115, 41, 79, 11, 114, 116, 15, 40, 14, 40, 39, 54, 125, 107,
+ 15, 124, 104, 38, 98, 12, 97, 2, 29, 113, 107, 56, 97, 101, 6, 12, 25, 6, 47, 102, 76, 57, 115,
+ 111, 19, 109, 64, 23, 12, 102, 103, 56, 112, 55, 30, 18, 97, 96, 3, 101, 88, 104, 95, 91, 68, 100,
+ 64, 71, 115, 37, 64, 92, 122, 34, 96, 21, 108, 54, 97, 46, 75, 103, 30, 76, 91, 93, 86, 107, 17,
+ 43, 58, 81, 52, 99, 57, 2, 27, 120, 52, 44, 84, 26, 72, 70, 122, 11, 51, 125, 51, 41, 61, 86,
+ 121, 0, 50, 89, 119, 121, 35, 38, 90, 47, 81, 86, 3, 38, 89, 82, 31, 38, 119, 63, 57, 77, 56,
+ 83, 124, 21, 74, 53, 83, 90, 102, 80, 92, 60, 4, 79, 98, 62, 81, 94, 122, 47, 28, 121, 112, 120,
+ 39, 46, 100, 119, 59, 102, 28, 108, 112, 41, 75, 21, 94, 76, 88, 98, 20, 7, 59, 102, 75, 103, 100,
+ 75, 27, 48, 4, 123, 91, 6, 42, 22, 100, 83, 11, 68, 58, 64, 81, 94, 116, 121, 90, 67, 52, 39,
+ 67, 110, 92, 99, 118, 3, 67, 82, 103, 99, 75, 2, 122, 54, 121, 53, 87, 65, 119, 118, 87, 62, 36,
+ 120, 38, 44, 52, 121, 124, 2, 105, 34, 48, 114, 105, 11, 61, 108, 106, 99, 92, 41, 103, 43, 39, 77,
+ 105, 34, 35, 34, 13, 79, 110, 30, 66, 124, 94, 21, 31, 30, 11, 69, 25, 69, 25, 81, 62, 99, 52,
+ 45, 99, 65, 90, 124, 126, 64, 46, 28, 27, 126, 81, 24, 47, 29, 48, 33, 67, 7, 52, 124, 61, 15,
+ 124, 126, 110, 100, 27, 43, 108, 89, 37, 112, 76, 23, 69, 96, 44, 5, 24, 28, 124, 16, 15, 74, 87,
+ 81, 86, 24, 63, 104, 59, 58, 93, 111, 44, 73, 81, 39, 5, 61, 67, 122, 17, 93, 55, 120, 101, 82,
+ 101, 10, 88, 96, 4, 123, 60, 67, 110, 46, 106, 61, 8, 24, 57, 6, 15, 122, 98, 22, 94, 50, 72,
+ 127, 82, 104, 37, 46, 0, 42, 2, 17, 92, 73, 7, 79, 75, 84, 2, 122, 8, 53, 115, 71, 29, 68,
+ 96, 30, 52, 84, 26, 76, 105, 87, 13, 115, 103, 21, 94, 41, 62, 123, 56, 31, 17, 27, 18, 39, 96,
+ 16, 10, 8, 16, 126, 30, 30, 102, 71, 96, 65, 119, 65, 59, 86, 28, 72, 110, 101, 90, 43, 91, 127,
+ 19, 52, 51, 33, 32, 2, 60, 106, 127, 73, 49, 76, 10, 86, 123, 52, 63, 12, 65, 21, 51, 23, 93,
+ 15, 15, 39, 87, 109, 23, 59, 25, 87, 59, 33, 117, 93, 50, 8, 7, 70, 88, 12, 102, 115, 10, 44,
+ 71, 22, 13, 114, 58, 20, 63, 95, 98, 46, 22, 127, 104, 39, 75, 57, 53, 95, 0, 73, 109, 46, 51,
+ 84, 70, 69, 49, 49, 79, 80, 41, 119, 47, 124, 61, 32, 47, 1, 14, 96, 69, 84, 33, 80, 93, 56,
+ 39, 124, 15, 107, 11, 86, 11, 84, 13, 116, 31, 12, 72, 11, 111, 12, 125, 16, 57, 12, 107, 31, 62,
+ 5, 12, 94, 98, 50, 118, 68, 70, 100, 111, 101, 36, 1, 116, 45, 98, 56, 3, 25, 16, 10, 75, 61,
+ 106, 101, 9, 27, 33, 69, 10, 31, 123, 13, 118, 117, 35, 22, 64, 122, 63, 91, 10, 29, 13, 51, 124,
+ 59, 116, 31, 119, 58, 91, 106, 51, 108, 79, 72, 120, 17, 78, 83, 1, 78, 71, 4, 83, 50, 34, 127,
+ 59, 94, 126, 103, 117, 65, 77, 18, 116, 85, 24, 46, 52, 44, 112, 52, 45, 124, 127, 94, 24, 72, 104,
+ 83, 103, 47, 5, 22, 72, 117, 68, 25, 88, 88, 97, 46, 43, 82, 48, 44, 102, 33, 59, 82, 53, 81,
+ 8, 69, 73, 106, 109, 107, 53, 30, 119, 100, 49, 55, 87, 83, 86, 114, 110, 70, 124, 114, 57, 101, 39,
+ 82, 13, 95, 38, 49, 39, 36, 30, 121, 44, 90, 24, 27, 44, 46, 69, 23, 51, 33, 111, 5, 123, 121,
+ 76, 51, 6, 108, 112, 89, 50, 124, 114, 33, 97, 27, 79, 92, 63, 90, 43, 109, 35, 17, 1, 32, 10,
+ 70, 105, 32, 124, 117, 90, 27, 73, 51, 48, 122, 75, 56, 77, 19, 109, 110, 6, 22, 53, 127, 87, 86,
+ 123, 118, 23, 98, 36, 81, 46, 126, 89, 96, 97, 26, 30, 7, 89, 92, 124, 59, 26, 65, 15, 22, 41,
+ 46, 74, 68, 67, 39, 116, 17, 94, 69, 12, 115, 7, 125, 60, 108, 104, 94, 116, 61, 85, 18, 110, 105,
+ 28, 113, 87, 66, 83, 24, 116, 96, 122, 103, 13, 86, 74, 80, 52, 89, 48, 54, 55, 64, 52, 60, 5,
+ 77, 53, 93, 105, 109, 50, 72, 26, 109, 105, 76, 45, 99, 88, 59, 56, 54, 102, 17, 66, 6, 122, 26,
+ 48, 94, 107, 17, 28, 121, 14, 37, 44, 84, 104, 57, 73, 93, 8, 30, 15, 48, 21, 80, 74, 124, 14,
+ 77, 93, 33, 17, 77, 30, 64, 71, 22, 117, 88, 56, 89, 91, 108, 54, 91, 22, 86, 37, 117, 56, 55,
+ 39, 16, 94, 95, 46, 120, 117, 91, 43, 11, 22, 42, 107, 43, 106, 17, 12, 41, 101, 103, 7, 74, 121,
+ 49, 109, 87, 124, 40, 120, 66, 51, 25, 98, 32, 85, 69, 55, 55, 104, 5, 83, 57, 104, 84, 69, 4,
+ 97, 14, 37, 41, 48, 71, 108, 69, 3, 107, 94, 90, 47, 97, 65, 44, 112, 26, 22, 32, 76, 74, 88,
+ 106, 55, 34, 46, 15, 14, 49, 29, 89, 1, 68, 23, 37, 9, 73, 59, 78, 34, 13, 74, 82, 119, 119,
+ 45, 47, 13, 80, 20, 17, 10, 64, 60, 101, 122, 107, 51, 15, 38, 84, 7, 115, 18, 121, 38, 92, 117,
+ 4, 42, 84, 75, 31, 14, 108, 38, 58, 12, 115, 55, 95, 26, 33, 6, 47, 63, 81, 120, 88, 35, 15,
+ 26, 117, 5, 124, 69, 87, 102, 82, 98, 15, 7, 10, 116, 88, 115, 22, 111, 15, 63, 87, 96, 9, 7,
+ 106, 24, 32, 71, 37, 47, 30, 85, 72, 119, 111, 21, 63, 106, 92, 96, 87, 110, 126, 66, 103, 50, 73,
+ 31, 113, 6, 63, 86, 123, 66, 63, 54, 12, 124, 116, 5, 115, 96, 78, 72, 116, 86, 98, 76, 108, 45,
+ 16, 32, 42, 44, 110, 53, 11, 121, 25, 112, 46, 43, 1, 113, 51, 61, 84, 92, 93, 105, 79, 6, 85,
+ 92, 85, 72, 72, 99, 81, 30, 18, 32, 26, 48, 93, 8, 14, 64, 110, 6, 50, 94, 86, 18, 123, 21,
+ 44, 97, 37, 74, 92, 11, 12, 23, 72, 71, 20, 104, 106, 110, 57, 24, 60, 39, 94, 110, 20, 22, 46,
+ 48, 57, 90, 38, 114, 105, 45, 75, 105, 78, 78, 60, 86, 122, 117, 93, 10, 29, 11, 26, 53, 115, 124,
+ 21, 56, 56, 83, 65, 93, 108, 42, 112, 7, 61, 114, 38, 78, 70, 119, 27, 121, 85, 114, 110, 53, 56,
+ 38, 4, 38, 56, 47, 28, 42, 107, 59, 24, 52, 13, 88, 81, 48, 40, 82, 80, 71, 34, 9, 124, 66,
+ 102, 117, 113, 21, 14, 27, 105, 98, 41, 89, 57, 83, 104, 108, 48, 53, 47, 127, 11, 32, 56, 40, 73,
+ 17, 50, 118, 105, 122, 5, 14, 85, 61, 57, 111, 104, 25, 18, 110, 54, 93, 98, 86, 47, 22, 95, 71,
+ 47, 42, 106, 40, 104, 34, 27, 29, 121, 63, 32, 79, 106, 119, 89, 109, 125, 23, 73, 75, 18, 64, 23,
+ 5, 51, 86, 80, 7, 81, 94, 56, 76, 52, 20, 116, 69, 82, 63, 36, 8, 73, 98, 33, 124, 8, 98,
+ 44, 4, 10, 47, 104, 85, 92, 37, 126, 92, 12, 86, 15, 30, 114, 100, 7, 104, 55, 37, 15, 49, 108,
+ 76, 98, 26, 89, 68, 96, 9, 84, 71, 19, 116, 58, 22, 125, 37, 64, 1, 30, 123, 57, 62, 10, 72,
+ 68, 98, 44, 118, 6, 100, 27, 41, 21, 121, 76, 34, 77, 77, 82, 53, 38, 57, 23, 115, 115, 1, 120,
+ 63, 88, 58, 52, 64, 107, 36, 55, 14, 4, 59, 84, 20, 113, 6, 107, 70, 84, 123, 17, 112, 103, 97,
+ 40, 66, 29, 25, 120, 15, 93, 106, 7, 119, 71, 48, 37, 5, 109, 3, 121, 5, 40, 113, 8, 22, 93,
+ 121, 82, 6, 113, 36, 65, 57, 125, 115, 89, 99, 13, 5, 125, 104, 21, 111, 76, 48, 11, 81, 54, 70,
+ 118, 9, 68, 68, 88, 123, 65, 18, 127, 75, 115, 6, 102, 27, 53, 9, 122, 14, 60, 88, 1, 42, 6,
+ 125, 89, 18, 41, 88, 122, 56, 92, 33, 62, 97, 4, 67, 60, 57, 0, 53, 10, 68, 106, 70, 55, 33,
+ 107, 61, 40, 105, 74, 76, 114, 33, 64, 47, 0, 27, 114, 51, 75, 3, 99, 11, 42, 53, 101, 34, 82,
+ 126, 27, 27, 48, 97, 65, 34, 32, 20, 64, 99, 92, 32, 8, 82, 40, 111, 37, 115, 24, 107, 106, 117,
+ 107, 65, 81, 4, 43, 26, 105, 10, 119, 49, 37, 53, 57, 70, 82, 15, 111, 65, 26, 26, 107, 120, 22,
+ 65, 98, 2, 112, 119, 93, 101, 112, 8, 55, 96, 12, 115, 21, 1, 22, 3, 40, 97, 37, 76, 51, 50,
+ 32, 17, 125, 76, 5, 65, 58, 59, 11, 80, 111, 121, 91, 50, 40, 5, 12, 88, 23, 7, 54, 72, 58,
+ 81, 107, 17, 4, 0, 36, 103, 74, 109, 34, 69, 94, 78, 84, 120, 72, 20, 32, 122, 92, 75, 85, 118,
+ 119, 104, 13, 64, 102, 82, 74, 42, 45, 81, 30, 114, 90, 94, 107, 5, 85, 47, 93, 33, 23, 5, 61,
+ 99, 90, 78, 97, 33, 110, 64, 105, 5, 38, 125, 24, 9, 39, 108, 87, 10, 9, 4, 55, 26, 64, 82,
+ 45, 20, 122, 11, 94, 124, 15, 43, 49, 67, 45, 30, 75, 111, 53, 9, 50, 102, 30, 28, 52, 95, 26,
+ 33, 107, 108, 94, 62, 111, 97, 53, 47, 43, 118, 1, 20, 34, 1, 30, 51, 114, 1, 24, 82, 16, 122,
+ 49, 20, 119, 94, 28, 13, 17, 31, 100, 45, 1, 93, 3, 101, 105, 38, 68, 73, 124, 46, 34, 84, 59,
+ 59, 93, 98, 6, 22, 17, 126, 42, 18, 85, 104, 30, 56, 73, 33, 93, 14, 112, 36, 4, 35, 26, 85,
+ 64, 50, 36, 64, 74, 97, 107, 61, 69, 66, 11, 102, 41, 103, 116, 120, 119, 38, 60, 67, 55, 122, 74,
+ 57, 118, 14, 100, 18, 14, 1, 54, 33, 118, 17, 117, 50, 104, 111, 100, 64, 20, 70, 114, 83, 82, 23,
+ 11, 69, 121, 100, 3, 73, 44, 47, 56, 118, 59, 85, 56, 116, 62, 31, 3, 116, 82, 119, 121, 36, 12,
+ 55, 30, 39, 101, 48, 21, 19, 47, 70, 118, 27, 61, 125, 64, 57, 64, 77, 120, 127, 77, 85, 119, 102,
+ 8, 90, 34, 30, 118, 106, 110, 92, 49, 117, 78, 71, 57, 76, 76, 76, 119, 107, 104, 16, 35, 72, 118,
+ 59, 51, 30, 7, 100, 14, 7, 49, 11, 53, 19, 4, 61, 74, 125, 99, 77, 24, 71, 113, 124, 11, 61,
+ 50, 101, 26, 17, 43, 107, 113, 19, 75, 4, 68, 66, 117, 28, 105, 79, 107, 26, 9, 91, 108, 51, 12,
+ 25, 101, 118, 109, 100, 45, 63, 100, 50, 57, 38, 68, 13, 111, 97, 72, 91, 94, 19, 14, 5, 103, 28,
+ 106, 47, 121, 20, 87, 7, 48, 91, 98, 124, 70, 15, 43, 55, 62, 83, 101, 124, 38, 67, 113, 13, 30,
+ 39, 116, 25, 15, 125, 98, 91, 41, 61, 57, 86, 98, 83, 7, 35, 23, 26, 115, 44, 88, 84, 19, 44,
+ 29, 92, 31, 23, 27, 27, 19, 108, 87, 64, 64, 49, 4, 80, 1, 99, 59, 80, 61, 1, 63, 9, 28,
+ 92, 96, 51, 93, 64, 13, 94, 102, 33, 40, 38, 25, 40, 20, 3, 56, 108, 53, 5, 74, 64, 70, 85,
+ 78, 26, 54, 82, 65, 47, 3, 51, 57, 98, 110, 79, 18, 87, 8, 119, 13, 102, 68, 85, 51, 41, 40,
+ 72, 17, 3, 65, 57, 46, 15, 73, 41, 31, 49, 26, 94, 21, 117, 115, 97, 37, 31, 61, 91, 45, 91,
+ 17, 75, 95, 126, 37, 72, 19, 1, 46, 89, 39, 49, 101, 110, 51, 18, 66, 108, 118, 26, 94, 50, 45,
+ 38, 109, 39, 77, 42, 101, 32, 56, 95, 81, 112, 119, 85, 101, 45, 70, 48, 106, 36, 110, 22, 99, 95,
+ 62, 20, 23, 44, 1, 38, 18, 42, 68, 31, 77, 119, 56, 99, 118, 109, 44, 30, 98, 111, 88, 30, 30,
+ 8, 73, 120, 96, 77, 12, 66, 119, 62, 95, 82, 35, 67, 76, 3, 124, 44, 61, 17, 109, 9, 9, 114,
+ 15, 5, 8, 83, 97, 86, 82, 44, 104, 120, 6, 21, 41, 87, 23, 33, 17, 109, 11, 20, 107, 21, 10,
+ 110, 20, 6, 14, 74, 14, 125, 104, 109, 125, 21, 22, 20, 80, 16, 115, 76, 75, 27, 111, 57, 79, 36,
+ 53, 50, 121, 118, 65, 30, 123, 121, 107, 36, 80, 54, 67, 54, 55, 122, 51, 110, 79, 74, 106, 13, 65,
+ 1, 86, 45, 4, 126, 35, 97, 33, 86, 92, 112, 5, 109, 99, 114, 116, 107, 116, 78, 70, 82, 29, 91,
+ 49, 123, 115, 44, 84, 114, 123, 43, 72, 120, 21, 81, 46, 3, 106, 62, 41, 74, 24, 38, 94, 121, 56,
+ 67, 122, 126, 75, 50, 39, 110, 120, 39, 82, 51, 10, 126, 67, 88, 23, 76, 65, 87, 73, 115, 19, 102,
+ 62, 111, 25, 8, 40, 102, 11, 123, 25, 87, 42, 87, 12, 29, 19, 35, 30, 14, 41, 0, 17, 22, 37,
+ 2, 20, 13, 106, 88, 31, 33, 18, 112, 32, 89, 0, 69, 90, 112, 69, 35, 8, 59, 47, 76, 108, 30,
+ 17, 101, 54, 117, 85, 51, 107, 63, 67, 123, 91, 102, 48, 79, 108, 51, 85, 42, 92, 113, 104, 48, 9,
+ 54, 102, 9, 118, 98, 40, 17, 35, 79, 37, 4, 2, 45, 21, 99, 86, 48, 105, 83, 2, 115, 88, 81,
+ 32, 28, 104, 94, 63, 11, 3, 102, 76, 77, 95, 23, 115, 36, 93, 55, 116, 21, 7, 21, 12, 6, 103,
+ 39, 87, 94, 118, 119, 29, 48, 6, 112, 48, 112, 10, 42, 103, 125, 110, 54, 49, 16, 2, 63, 107, 41,
+ 113, 95, 121, 58, 26, 15, 58, 8, 78, 73, 99, 4, 3, 21, 103, 67, 103, 110, 101, 99, 77, 83, 107,
+ 17, 14, 72, 121, 32, 100, 105, 34, 88, 99, 77, 114, 81, 87, 71, 10, 58, 114, 41, 82, 64, 79, 97,
+ 99, 89, 36, 22, 36, 86, 51, 100, 57, 70, 2, 104, 20, 58, 15, 42, 20, 71, 108, 95, 17, 82, 45,
+ 91, 68, 8, 15, 6, 36, 58, 50, 86, 62, 70, 121, 14, 26, 91, 60, 56, 27, 21, 19, 32, 68, 125,
+ 76, 28, 110, 87, 110, 73, 92, 114, 100, 64, 100, 59, 85, 54, 39, 78, 115, 97, 91, 50, 83, 88, 0,
+ 117, 67, 117, 126, 78, 80, 90, 78, 21, 18, 48, 90, 102, 91, 88, 113, 124, 103, 25, 53, 38, 105, 38,
+ 2, 101, 110, 98, 23, 70, 33, 114, 36, 78, 75, 118, 37, 101, 43, 22, 82, 28, 68, 126, 18, 111, 96,
+ 76, 2, 92, 90, 71, 6, 12, 70, 25, 72, 32, 39, 115, 42, 21, 91, 94, 35, 9, 45, 65, 16, 119,
+ 37, 55, 15, 30, 110, 43, 3, 46, 53, 77, 44, 81, 34, 38, 30, 46, 96, 113, 125, 9, 17, 120, 2,
+ 50, 50, 19, 73, 59, 22, 121, 107, 62, 69, 44, 97, 95, 35, 40, 59, 24, 44, 54, 117, 4, 0, 68,
+ 31, 77, 18, 14, 56, 54, 110, 109, 34, 76, 21, 76, 3, 4, 56, 21, 65, 15, 122, 48, 3, 56, 97,
+ 68, 50, 114, 101, 87, 87, 75, 25, 64, 51, 40, 93, 36, 120, 62, 77, 7, 111, 109, 73, 5, 3, 47,
+ 48, 95, 105, 52, 91, 54, 103, 71, 49, 6, 4, 6, 108, 7, 110, 62, 95, 70, 73, 45, 107, 23, 44,
+ 89, 65, 60, 27, 90, 55, 18, 111, 89, 46, 48, 113, 34, 81, 90, 104, 22, 107, 44, 38, 45, 102, 123,
+ 75, 78, 11, 50, 89, 56, 13, 92, 97, 41, 73, 58, 95, 120, 36, 102, 59, 124, 5, 114, 109, 87, 55,
+ 6, 55, 16, 76, 53, 58, 49, 7, 70, 57, 59, 10, 126, 125, 10, 113, 127, 118, 69, 21, 68, 59, 125,
+ 2, 40, 74, 16, 85, 116, 4, 33, 5, 29, 55, 63, 115, 114, 84, 95, 111, 43, 91, 73, 90, 39, 108,
+ 44, 36, 72, 104, 126, 112, 109, 30, 95, 33, 73, 83, 1, 116, 99, 26, 54, 3, 83, 82, 119, 79, 108,
+ 11, 118, 90, 42, 110, 9, 15, 110, 93, 6, 105, 103, 27, 70, 23, 97, 53, 8, 40, 42, 79, 38, 86,
+ 14, 79, 64, 121, 5, 106, 70, 3, 112, 75, 17, 58, 3, 79, 100, 114, 51, 88, 21, 79, 58, 99, 106,
+ 113, 110, 92, 109, 21, 94, 83, 3, 61, 117, 94, 32, 126, 66, 46, 12, 48, 53, 81, 29, 120, 84, 105,
+ 101, 49, 71, 20, 19, 25, 49, 126, 21, 86, 111, 69, 51, 45, 53, 40, 11, 91, 20, 77, 32, 5, 90,
+ 23, 19, 74, 121, 113, 118, 33, 19, 112, 17, 34, 30, 108, 77, 59, 39, 91, 90, 18, 83, 63, 105, 43,
+ 30, 54, 3, 106, 52, 41, 61, 49, 112, 5, 98, 40, 24, 14, 117, 20, 85, 66, 32, 42, 59, 66, 2,
+ 98, 16, 76, 27, 85, 58, 17, 42, 69, 109, 97, 2, 18, 112, 86, 127, 114, 45, 69, 45, 46, 45, 28,
+ 97, 42, 24, 39, 126, 42, 74, 47, 101, 58, 106, 42, 58, 123, 7, 111, 102, 36, 87, 126, 28, 115, 68,
+ 38, 125, 49, 7, 87, 114, 125, 27, 60, 57, 124, 89, 21, 109, 74, 64, 88, 11, 28, 4, 58, 29, 13,
+ 119, 1, 15, 26, 40, 99, 7, 68, 17, 105, 103, 75, 29, 48, 40, 1, 116, 0, 76, 65, 37, 52, 102,
+ 69, 12, 71, 19, 108, 57, 103, 45, 84, 46, 53, 39, 82, 3, 113, 75, 18, 116, 13, 40, 93, 78, 5,
+ 94, 112, 90, 40, 126, 79, 91, 89, 29, 58, 83, 48, 66, 101, 4, 32, 68, 96, 98, 36, 45, 111, 29,
+ 60, 95, 123, 38, 111, 123, 38, 35, 98, 12, 57, 126, 43, 19, 21, 108, 77, 71, 40, 109, 112, 122, 83,
+ 77, 70, 76, 5, 14, 115, 100, 88, 1, 2, 75, 12, 15, 74, 8, 91, 108, 96, 27, 114, 49, 19, 71,
+ 126, 33, 81, 93, 93, 11, 9, 87, 76, 32, 28, 102, 16, 41, 99, 75, 87, 11, 120, 126, 89, 62, 91,
+ 123, 89, 44, 44, 22, 2, 127, 101, 122, 90, 27, 74, 45, 107, 119, 103, 123, 68, 12, 7, 79, 104, 102,
+ 88, 78, 84, 119, 2, 41, 57, 31, 40, 109, 34, 64, 51, 110, 87, 125, 59, 32, 66, 95, 8, 114, 65,
+ 11, 53, 113, 59, 24, 57, 14, 60, 28, 50, 107, 50, 28, 106, 8, 127, 95, 61, 116, 32, 114, 22, 90,
+ 72, 106, 6, 49, 83, 97, 84, 3, 70, 75, 124, 88, 112, 23, 77, 2, 114, 84, 64, 103, 118, 85, 4,
+ 109, 40, 15, 30, 31, 6, 117, 95, 99, 107, 41, 23, 124, 76, 86, 127, 89, 86, 87, 76, 106, 73, 63,
+ 31, 84, 34, 102, 51, 48, 99, 58, 38, 124, 20, 20, 98, 8, 53, 1, 106, 126, 48, 103, 117, 26, 43,
+ 106, 115, 35, 73, 50, 48, 78, 3, 108, 66, 119, 39, 109, 53, 58, 6, 87, 103, 54, 98, 83, 56, 76,
+ 37, 9, 99, 8, 69, 37, 46, 19, 87, 13, 97, 42, 29, 56, 110, 28, 41, 20, 34, 119, 107, 56, 53,
+ 124, 59, 120, 13, 85, 1, 121, 22, 38, 96, 47, 117, 44, 51, 87, 102, 110, 119, 116, 83, 52, 47, 17,
+ 113, 3, 83, 95, 15, 72, 119, 127, 28, 41, 20, 36, 23, 34, 90, 40, 13, 124, 80, 0, 51, 122, 20,
+ 66, 14, 122, 83, 35, 115, 115, 31, 77, 42, 82, 104, 50, 91, 90, 106, 57, 5, 53, 42, 41, 35, 58,
+ 94, 43, 113, 88, 42, 9, 119, 125, 114, 89, 90, 83, 28, 90, 30, 87, 111, 35, 42, 6, 63, 49, 96,
+ 33, 61, 13, 54, 110, 113, 12, 54, 93, 117, 122, 105, 89, 34, 120, 117, 6, 97, 111, 72, 96, 71, 1,
+ 92, 24, 5, 50, 29, 100, 96, 61, 72, 35, 118, 93, 93, 72, 21, 95, 5, 104, 104, 90, 110, 24, 51,
+ 120, 10, 64, 34, 122, 31, 34, 90, 8, 61, 11, 119, 61, 111, 125, 24, 23, 72, 85, 100, 72, 54, 113,
+ 18, 6, 56, 9, 27, 26, 97, 127, 110, 49, 106, 76, 11, 83, 98, 123, 92, 14, 68, 121, 26, 3, 120,
+ 17, 24, 73, 8, 14, 39, 27, 95, 71, 67, 4, 58, 58, 5, 111, 92, 127, 6, 10, 94, 75, 69, 78,
+ 70, 107, 11, 117, 98, 99, 95, 95, 50, 3, 91, 71, 27, 35, 117, 56, 18, 92, 51, 66, 28, 96, 103,
+ 109, 111, 10, 95, 109, 110, 127, 27, 46, 67, 43, 79, 82, 31, 19, 8, 45, 9, 50, 30, 79, 97, 78,
+ 69, 119, 2, 46, 18, 50, 31, 85, 126, 78, 7, 67, 42, 22, 45, 25, 3, 103, 59, 36, 91, 41, 6,
+ 60, 42, 79, 95, 123, 4, 27, 58, 120, 6, 28, 81, 79, 112, 106, 96, 52, 18, 68, 69, 38, 74, 27,
+ 22, 50, 74, 103, 34, 120, 93, 122};
diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8_spill/biases_data.h b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/biases_data.h
new file mode 100644
index 00000000..e6f7ade2
--- /dev/null
+++ b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/biases_data.h
@@ -0,0 +1,6 @@
+// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0).
+// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e.
+#pragma once
+#include
+
+const int64_t *int16xint8_spill_biases = NULL;
diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8_spill/config_data.h b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/config_data.h
new file mode 100644
index 00000000..7aa2ee73
--- /dev/null
+++ b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/config_data.h
@@ -0,0 +1,24 @@
+// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0).
+// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e.
+#pragma once
+#define INT16XINT8_SPILL_OUT_CH 9
+#define INT16XINT8_SPILL_IN_CH 55
+#define INT16XINT8_SPILL_INPUT_W 10
+#define INT16XINT8_SPILL_INPUT_H 8
+#define INT16XINT8_SPILL_DST_SIZE 90
+#define INT16XINT8_SPILL_INPUT_SIZE 4400
+#define INT16XINT8_SPILL_OUT_ACTIVATION_MIN 32667
+#define INT16XINT8_SPILL_OUT_ACTIVATION_MAX 32767
+#define INT16XINT8_SPILL_INPUT_BATCHES 1
+#define INT16XINT8_SPILL_FILTER_X 9
+#define INT16XINT8_SPILL_FILTER_Y 4
+#define INT16XINT8_SPILL_STRIDE_X 1
+#define INT16XINT8_SPILL_STRIDE_Y 1
+#define INT16XINT8_SPILL_PAD_X 0
+#define INT16XINT8_SPILL_PAD_Y 0
+#define INT16XINT8_SPILL_OUTPUT_W 2
+#define INT16XINT8_SPILL_OUTPUT_H 5
+#define INT16XINT8_SPILL_INPUT_OFFSET 0
+#define INT16XINT8_SPILL_OUTPUT_OFFSET 0
+#define INT16XINT8_SPILL_DILATION_X 1
+#define INT16XINT8_SPILL_DILATION_Y 1
diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8_spill/input_data.h b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/input_data.h
new file mode 100644
index 00000000..dd1ccfce
--- /dev/null
+++ b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/input_data.h
@@ -0,0 +1,281 @@
+// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0).
+// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e.
+#pragma once
+#include
+
+const int16_t int16xint8_spill_input[4400] = {
+ 32755, 32727, 32721, 32721, 32701, 32721, 32750, 32682, 32669, 32691, 32714, 32670, 32699, 32722, 32730, 32726,
+ 32684, 32730, 32734, 32682, 32699, 32743, 32697, 32740, 32677, 32731, 32721, 32667, 32712, 32747, 32674, 32684,
+ 32751, 32713, 32737, 32672, 32696, 32728, 32761, 32690, 32740, 32687, 32672, 32757, 32691, 32742, 32719, 32687,
+ 32672, 32672, 32717, 32719, 32753, 32722, 32695, 32695, 32741, 32673, 32701, 32721, 32750, 32739, 32731, 32743,
+ 32679, 32762, 32678, 32725, 32675, 32716, 32741, 32735, 32757, 32762, 32719, 32709, 32766, 32738, 32694, 32761,
+ 32702, 32764, 32694, 32758, 32716, 32744, 32736, 32701, 32720, 32766, 32710, 32685, 32730, 32743, 32676, 32756,
+ 32685, 32692, 32693, 32700, 32715, 32708, 32761, 32693, 32732, 32726, 32674, 32766, 32676, 32680, 32705, 32678,
+ 32707, 32704, 32713, 32733, 32761, 32753, 32731, 32692, 32731, 32704, 32753, 32667, 32740, 32738, 32755, 32683,
+ 32673, 32671, 32681, 32723, 32751, 32671, 32766, 32692, 32724, 32764, 32723, 32673, 32679, 32697, 32678, 32761,
+ 32726, 32698, 32677, 32735, 32690, 32754, 32692, 32752, 32737, 32761, 32674, 32744, 32762, 32731, 32720, 32732,
+ 32749, 32713, 32691, 32742, 32675, 32707, 32736, 32712, 32681, 32700, 32737, 32752, 32764, 32742, 32725, 32708,
+ 32732, 32687, 32681, 32680, 32672, 32680, 32760, 32712, 32719, 32689, 32713, 32757, 32710, 32757, 32681, 32704,
+ 32674, 32670, 32714, 32683, 32740, 32757, 32728, 32751, 32720, 32722, 32725, 32676, 32684, 32720, 32688, 32681,
+ 32725, 32705, 32679, 32714, 32750, 32758, 32721, 32742, 32760, 32691, 32698, 32761, 32708, 32667, 32670, 32745,
+ 32740, 32748, 32733, 32727, 32739, 32763, 32716, 32683, 32754, 32669, 32746, 32746, 32696, 32764, 32736, 32720,
+ 32720, 32683, 32714, 32727, 32756, 32706, 32761, 32691, 32718, 32762, 32692, 32736, 32716, 32733, 32761, 32719,
+ 32720, 32698, 32710, 32733, 32732, 32722, 32764, 32732, 32690, 32766, 32694, 32667, 32688, 32695, 32689, 32737,
+ 32706, 32705, 32711, 32676, 32683, 32730, 32685, 32741, 32762, 32742, 32692, 32696, 32674, 32757, 32721, 32762,
+ 32673, 32673, 32758, 32708, 32758, 32722, 32682, 32674, 32748, 32745, 32688, 32760, 32683, 32756, 32724, 32668,
+ 32694, 32753, 32687, 32746, 32738, 32680, 32759, 32676, 32688, 32689, 32736, 32702, 32689, 32762, 32713, 32752,
+ 32679, 32682, 32682, 32677, 32685, 32737, 32695, 32766, 32667, 32759, 32731, 32714, 32668, 32732, 32715, 32700,
+ 32715, 32755, 32737, 32694, 32729, 32766, 32734, 32762, 32701, 32674, 32726, 32682, 32766, 32748, 32749, 32743,
+ 32762, 32679, 32713, 32756, 32751, 32677, 32734, 32759, 32727, 32668, 32750, 32695, 32738, 32742, 32702, 32755,
+ 32698, 32710, 32733, 32745, 32765, 32713, 32680, 32710, 32681, 32763, 32725, 32697, 32668, 32723, 32689, 32711,
+ 32686, 32743, 32685, 32724, 32750, 32722, 32679, 32751, 32726, 32763, 32686, 32751, 32703, 32668, 32745, 32748,
+ 32739, 32691, 32673, 32756, 32735, 32727, 32715, 32747, 32734, 32722, 32706, 32716, 32721, 32766, 32702, 32744,
+ 32704, 32668, 32726, 32763, 32713, 32720, 32676, 32738, 32684, 32672, 32747, 32735, 32680, 32693, 32739, 32748,
+ 32689, 32718, 32704, 32722, 32676, 32676, 32692, 32756, 32766, 32713, 32713, 32690, 32749, 32754, 32707, 32751,
+ 32707, 32760, 32699, 32759, 32735, 32696, 32745, 32743, 32736, 32755, 32686, 32766, 32710, 32667, 32712, 32701,
+ 32733, 32669, 32755, 32756, 32685, 32762, 32737, 32754, 32733, 32728, 32722, 32700, 32690, 32722, 32751, 32668,
+ 32695, 32737, 32676, 32741, 32724, 32758, 32714, 32684, 32706, 32703, 32699, 32743, 32682, 32719, 32759, 32737,
+ 32685, 32752, 32757, 32753, 32721, 32748, 32753, 32679, 32760, 32681, 32708, 32691, 32747, 32732, 32708, 32679,
+ 32678, 32737, 32716, 32700, 32723, 32694, 32707, 32721, 32728, 32725, 32749, 32723, 32722, 32713, 32688, 32675,
+ 32717, 32764, 32709, 32733, 32738, 32755, 32678, 32676, 32714, 32706, 32689, 32727, 32730, 32720, 32681, 32676,
+ 32676, 32763, 32692, 32722, 32714, 32694, 32746, 32682, 32723, 32712, 32678, 32742, 32722, 32731, 32761, 32756,
+ 32677, 32688, 32741, 32729, 32694, 32730, 32722, 32679, 32754, 32674, 32739, 32739, 32700, 32739, 32669, 32730,
+ 32756, 32744, 32689, 32765, 32682, 32689, 32685, 32680, 32758, 32764, 32678, 32668, 32679, 32743, 32697, 32725,
+ 32690, 32696, 32763, 32689, 32734, 32737, 32699, 32687, 32675, 32760, 32695, 32692, 32677, 32679, 32706, 32725,
+ 32693, 32762, 32763, 32675, 32685, 32672, 32748, 32749, 32701, 32746, 32730, 32753, 32731, 32738, 32681, 32677,
+ 32676, 32687, 32747, 32761, 32759, 32719, 32676, 32733, 32753, 32686, 32686, 32758, 32706, 32703, 32759, 32704,
+ 32669, 32725, 32744, 32686, 32721, 32764, 32754, 32729, 32731, 32677, 32741, 32728, 32679, 32722, 32678, 32674,
+ 32672, 32672, 32676, 32681, 32729, 32706, 32726, 32669, 32694, 32677, 32762, 32702, 32745, 32739, 32729, 32702,
+ 32673, 32739, 32715, 32720, 32723, 32715, 32753, 32704, 32683, 32732, 32763, 32766, 32683, 32724, 32733, 32759,
+ 32764, 32704, 32724, 32747, 32751, 32719, 32673, 32752, 32765, 32737, 32707, 32677, 32679, 32688, 32681, 32671,
+ 32721, 32689, 32720, 32708, 32702, 32722, 32707, 32691, 32716, 32710, 32764, 32672, 32762, 32742, 32749, 32749,
+ 32735, 32753, 32718, 32677, 32753, 32672, 32765, 32699, 32694, 32736, 32728, 32743, 32696, 32739, 32740, 32705,
+ 32677, 32670, 32758, 32674, 32676, 32766, 32702, 32750, 32696, 32674, 32720, 32725, 32701, 32679, 32760, 32712,
+ 32714, 32714, 32698, 32669, 32763, 32755, 32669, 32765, 32754, 32735, 32729, 32676, 32682, 32741, 32704, 32698,
+ 32725, 32748, 32757, 32685, 32748, 32680, 32671, 32718, 32733, 32742, 32737, 32693, 32701, 32675, 32700, 32698,
+ 32702, 32766, 32685, 32742, 32697, 32728, 32677, 32747, 32678, 32764, 32676, 32731, 32763, 32684, 32720, 32747,
+ 32695, 32765, 32753, 32726, 32711, 32686, 32734, 32699, 32765, 32704, 32765, 32719, 32690, 32714, 32739, 32763,
+ 32748, 32761, 32760, 32748, 32763, 32758, 32755, 32757, 32746, 32766, 32672, 32711, 32714, 32691, 32744, 32762,
+ 32671, 32737, 32752, 32753, 32739, 32687, 32726, 32726, 32750, 32687, 32673, 32754, 32676, 32765, 32690, 32714,
+ 32762, 32724, 32766, 32733, 32715, 32674, 32715, 32731, 32699, 32674, 32694, 32746, 32743, 32705, 32689, 32668,
+ 32745, 32718, 32675, 32678, 32743, 32706, 32730, 32679, 32680, 32704, 32692, 32717, 32689, 32761, 32724, 32729,
+ 32753, 32668, 32762, 32691, 32675, 32702, 32678, 32673, 32711, 32668, 32718, 32675, 32671, 32736, 32729, 32743,
+ 32692, 32730, 32721, 32710, 32759, 32750, 32731, 32698, 32688, 32699, 32671, 32763, 32673, 32713, 32671, 32749,
+ 32717, 32694, 32745, 32694, 32694, 32707, 32743, 32705, 32762, 32750, 32750, 32753, 32722, 32689, 32687, 32721,
+ 32739, 32725, 32738, 32741, 32706, 32702, 32739, 32684, 32727, 32704, 32691, 32682, 32709, 32738, 32760, 32686,
+ 32736, 32719, 32727, 32673, 32753, 32707, 32684, 32701, 32741, 32726, 32737, 32761, 32702, 32723, 32729, 32673,
+ 32676, 32691, 32687, 32759, 32678, 32765, 32667, 32733, 32757, 32676, 32751, 32720, 32757, 32722, 32720, 32736,
+ 32736, 32735, 32704, 32756, 32670, 32710, 32750, 32682, 32765, 32752, 32741, 32746, 32706, 32733, 32741, 32756,
+ 32668, 32678, 32726, 32711, 32731, 32721, 32743, 32749, 32711, 32727, 32692, 32721, 32680, 32711, 32759, 32747,
+ 32667, 32710, 32762, 32758, 32678, 32685, 32676, 32740, 32722, 32685, 32733, 32763, 32667, 32736, 32701, 32681,
+ 32680, 32693, 32690, 32762, 32673, 32713, 32744, 32694, 32747, 32723, 32671, 32709, 32722, 32762, 32694, 32709,
+ 32705, 32741, 32757, 32686, 32696, 32706, 32716, 32730, 32708, 32758, 32750, 32691, 32714, 32755, 32709, 32699,
+ 32728, 32677, 32761, 32718, 32752, 32699, 32738, 32739, 32724, 32707, 32667, 32679, 32761, 32711, 32685, 32761,
+ 32673, 32742, 32679, 32678, 32718, 32752, 32743, 32678, 32727, 32726, 32693, 32707, 32739, 32687, 32667, 32738,
+ 32669, 32676, 32684, 32694, 32730, 32723, 32727, 32687, 32689, 32679, 32749, 32690, 32758, 32675, 32721, 32716,
+ 32756, 32732, 32721, 32700, 32757, 32684, 32702, 32694, 32679, 32698, 32740, 32758, 32705, 32759, 32698, 32709,
+ 32716, 32669, 32751, 32717, 32756, 32681, 32689, 32685, 32724, 32757, 32732, 32705, 32669, 32749, 32709, 32728,
+ 32696, 32674, 32754, 32766, 32705, 32722, 32759, 32712, 32674, 32742, 32686, 32673, 32742, 32703, 32751, 32697,
+ 32706, 32718, 32763, 32745, 32719, 32717, 32668, 32719, 32744, 32744, 32674, 32717, 32683, 32686, 32671, 32668,
+ 32727, 32732, 32731, 32738, 32707, 32713, 32720, 32686, 32669, 32715, 32739, 32748, 32757, 32712, 32765, 32723,
+ 32717, 32678, 32741, 32703, 32687, 32692, 32722, 32738, 32669, 32672, 32734, 32765, 32683, 32698, 32680, 32708,
+ 32668, 32695, 32704, 32724, 32745, 32675, 32673, 32718, 32738, 32681, 32714, 32744, 32697, 32709, 32680, 32667,
+ 32703, 32762, 32741, 32738, 32757, 32723, 32717, 32762, 32725, 32765, 32731, 32700, 32689, 32760, 32672, 32670,
+ 32734, 32672, 32738, 32678, 32681, 32686, 32705, 32761, 32742, 32745, 32753, 32751, 32731, 32742, 32766, 32759,
+ 32755, 32675, 32688, 32676, 32703, 32760, 32738, 32747, 32690, 32686, 32760, 32724, 32754, 32724, 32676, 32683,
+ 32671, 32716, 32725, 32728, 32674, 32719, 32670, 32673, 32720, 32679, 32695, 32729, 32762, 32719, 32717, 32746,
+ 32719, 32758, 32668, 32668, 32705, 32763, 32684, 32719, 32674, 32680, 32707, 32719, 32738, 32723, 32738, 32741,
+ 32714, 32719, 32691, 32685, 32752, 32746, 32679, 32711, 32673, 32765, 32691, 32698, 32669, 32694, 32700, 32763,
+ 32693, 32729, 32704, 32741, 32733, 32721, 32724, 32713, 32719, 32690, 32709, 32705, 32733, 32712, 32733, 32739,
+ 32715, 32707, 32739, 32717, 32686, 32718, 32675, 32748, 32683, 32763, 32729, 32744, 32681, 32714, 32766, 32680,
+ 32730, 32744, 32697, 32757, 32708, 32715, 32721, 32688, 32755, 32685, 32716, 32668, 32704, 32700, 32738, 32733,
+ 32720, 32742, 32702, 32706, 32719, 32675, 32751, 32713, 32682, 32708, 32690, 32759, 32742, 32715, 32749, 32730,
+ 32693, 32710, 32766, 32692, 32686, 32694, 32753, 32756, 32691, 32760, 32742, 32747, 32744, 32745, 32733, 32724,
+ 32695, 32711, 32707, 32680, 32742, 32722, 32691, 32742, 32763, 32673, 32737, 32711, 32758, 32733, 32723, 32760,
+ 32689, 32715, 32676, 32761, 32720, 32708, 32706, 32673, 32670, 32759, 32674, 32678, 32703, 32684, 32737, 32745,
+ 32672, 32699, 32670, 32697, 32718, 32692, 32700, 32763, 32725, 32670, 32710, 32762, 32719, 32738, 32764, 32746,
+ 32709, 32710, 32682, 32743, 32684, 32668, 32673, 32719, 32685, 32668, 32704, 32669, 32703, 32708, 32674, 32699,
+ 32668, 32755, 32745, 32758, 32707, 32764, 32752, 32740, 32715, 32679, 32685, 32672, 32687, 32714, 32693, 32680,
+ 32680, 32708, 32735, 32757, 32727, 32685, 32742, 32744, 32745, 32700, 32693, 32702, 32717, 32715, 32712, 32717,
+ 32683, 32717, 32698, 32712, 32696, 32719, 32756, 32699, 32738, 32764, 32741, 32693, 32719, 32764, 32741, 32759,
+ 32698, 32670, 32682, 32697, 32702, 32697, 32689, 32688, 32672, 32678, 32757, 32694, 32729, 32766, 32737, 32725,
+ 32762, 32753, 32689, 32680, 32720, 32673, 32764, 32719, 32701, 32669, 32751, 32685, 32693, 32705, 32762, 32716,
+ 32764, 32681, 32725, 32715, 32749, 32757, 32735, 32698, 32738, 32669, 32733, 32727, 32696, 32735, 32712, 32749,
+ 32741, 32737, 32714, 32685, 32706, 32751, 32707, 32724, 32751, 32696, 32728, 32747, 32737, 32694, 32695, 32675,
+ 32675, 32757, 32699, 32668, 32683, 32733, 32747, 32762, 32718, 32720, 32748, 32715, 32759, 32747, 32673, 32766,
+ 32744, 32736, 32719, 32716, 32674, 32735, 32752, 32752, 32689, 32668, 32730, 32722, 32748, 32737, 32733, 32759,
+ 32748, 32763, 32754, 32746, 32766, 32688, 32760, 32679, 32682, 32677, 32697, 32684, 32746, 32669, 32734, 32683,
+ 32673, 32702, 32690, 32677, 32695, 32765, 32763, 32706, 32719, 32704, 32756, 32749, 32711, 32721, 32694, 32683,
+ 32699, 32685, 32749, 32745, 32761, 32749, 32731, 32673, 32679, 32705, 32682, 32753, 32672, 32686, 32682, 32667,
+ 32682, 32706, 32699, 32758, 32763, 32691, 32702, 32704, 32736, 32751, 32689, 32672, 32748, 32738, 32766, 32734,
+ 32735, 32761, 32721, 32704, 32752, 32724, 32680, 32713, 32675, 32703, 32706, 32667, 32765, 32752, 32696, 32700,
+ 32745, 32752, 32759, 32710, 32718, 32696, 32677, 32670, 32752, 32747, 32675, 32695, 32725, 32710, 32745, 32690,
+ 32676, 32710, 32735, 32739, 32752, 32729, 32736, 32711, 32710, 32712, 32702, 32745, 32740, 32682, 32678, 32698,
+ 32732, 32687, 32685, 32737, 32736, 32765, 32674, 32749, 32755, 32755, 32685, 32744, 32688, 32715, 32746, 32719,
+ 32762, 32710, 32671, 32713, 32711, 32748, 32679, 32673, 32676, 32754, 32742, 32693, 32757, 32756, 32680, 32748,
+ 32668, 32724, 32738, 32670, 32667, 32715, 32759, 32755, 32674, 32680, 32712, 32727, 32716, 32717, 32761, 32735,
+ 32735, 32757, 32707, 32738, 32725, 32766, 32753, 32731, 32699, 32695, 32700, 32682, 32710, 32702, 32711, 32684,
+ 32672, 32741, 32669, 32683, 32762, 32683, 32677, 32760, 32706, 32672, 32685, 32747, 32686, 32753, 32701, 32714,
+ 32766, 32674, 32729, 32713, 32702, 32712, 32682, 32758, 32694, 32695, 32684, 32689, 32691, 32693, 32712, 32766,
+ 32714, 32714, 32714, 32685, 32685, 32698, 32728, 32718, 32681, 32726, 32688, 32675, 32757, 32745, 32761, 32747,
+ 32720, 32715, 32696, 32717, 32747, 32732, 32688, 32702, 32673, 32747, 32699, 32739, 32727, 32753, 32680, 32745,
+ 32673, 32719, 32709, 32679, 32712, 32694, 32749, 32748, 32668, 32720, 32697, 32672, 32766, 32671, 32761, 32668,
+ 32711, 32667, 32762, 32740, 32682, 32728, 32684, 32697, 32737, 32747, 32755, 32687, 32671, 32708, 32678, 32676,
+ 32756, 32672, 32674, 32746, 32728, 32727, 32701, 32683, 32705, 32763, 32737, 32765, 32702, 32744, 32753, 32684,
+ 32703, 32684, 32671, 32671, 32743, 32716, 32677, 32720, 32688, 32694, 32688, 32713, 32747, 32759, 32755, 32682,
+ 32724, 32742, 32714, 32699, 32729, 32707, 32701, 32692, 32744, 32680, 32740, 32714, 32757, 32672, 32675, 32686,
+ 32678, 32753, 32687, 32742, 32686, 32759, 32723, 32700, 32670, 32745, 32765, 32728, 32713, 32709, 32702, 32750,
+ 32713, 32700, 32736, 32690, 32712, 32686, 32689, 32730, 32714, 32669, 32677, 32707, 32684, 32720, 32705, 32709,
+ 32698, 32766, 32737, 32729, 32716, 32680, 32761, 32708, 32709, 32754, 32705, 32737, 32748, 32757, 32747, 32676,
+ 32738, 32737, 32676, 32741, 32745, 32746, 32730, 32752, 32713, 32717, 32704, 32669, 32677, 32762, 32717, 32725,
+ 32752, 32691, 32740, 32748, 32758, 32727, 32755, 32743, 32686, 32736, 32743, 32763, 32738, 32674, 32690, 32718,
+ 32751, 32685, 32671, 32689, 32744, 32702, 32694, 32684, 32745, 32722, 32718, 32758, 32672, 32668, 32734, 32765,
+ 32724, 32686, 32697, 32682, 32748, 32693, 32684, 32731, 32732, 32694, 32694, 32764, 32711, 32718, 32710, 32730,
+ 32754, 32706, 32718, 32741, 32689, 32679, 32719, 32669, 32744, 32667, 32748, 32700, 32745, 32748, 32732, 32765,
+ 32709, 32727, 32714, 32712, 32723, 32750, 32704, 32725, 32735, 32675, 32733, 32758, 32738, 32709, 32699, 32763,
+ 32681, 32760, 32749, 32707, 32765, 32703, 32745, 32742, 32728, 32722, 32737, 32696, 32766, 32712, 32686, 32670,
+ 32729, 32690, 32684, 32753, 32753, 32669, 32750, 32698, 32702, 32753, 32674, 32757, 32672, 32708, 32675, 32691,
+ 32759, 32752, 32670, 32740, 32695, 32736, 32700, 32759, 32723, 32763, 32712, 32680, 32684, 32732, 32700, 32741,
+ 32754, 32684, 32752, 32692, 32752, 32725, 32760, 32667, 32689, 32755, 32726, 32760, 32673, 32683, 32708, 32696,
+ 32684, 32669, 32741, 32704, 32676, 32706, 32760, 32747, 32723, 32694, 32714, 32735, 32758, 32739, 32753, 32680,
+ 32736, 32721, 32674, 32700, 32713, 32742, 32754, 32753, 32766, 32745, 32711, 32709, 32723, 32719, 32720, 32720,
+ 32757, 32728, 32735, 32697, 32695, 32766, 32669, 32683, 32680, 32755, 32759, 32669, 32678, 32690, 32720, 32752,
+ 32711, 32752, 32693, 32682, 32698, 32730, 32710, 32708, 32674, 32720, 32669, 32722, 32685, 32744, 32696, 32697,
+ 32702, 32729, 32739, 32676, 32747, 32684, 32683, 32672, 32725, 32749, 32761, 32685, 32672, 32743, 32704, 32695,
+ 32749, 32707, 32705, 32732, 32723, 32700, 32729, 32701, 32714, 32739, 32731, 32746, 32671, 32696, 32704, 32676,
+ 32704, 32728, 32692, 32672, 32688, 32710, 32689, 32738, 32691, 32698, 32755, 32703, 32744, 32732, 32679, 32733,
+ 32753, 32714, 32739, 32674, 32748, 32675, 32692, 32691, 32674, 32699, 32747, 32668, 32747, 32684, 32749, 32706,
+ 32690, 32742, 32727, 32755, 32693, 32727, 32734, 32668, 32717, 32737, 32726, 32747, 32741, 32677, 32764, 32752,
+ 32742, 32697, 32700, 32722, 32754, 32727, 32731, 32705, 32673, 32699, 32749, 32692, 32693, 32727, 32673, 32765,
+ 32685, 32704, 32687, 32707, 32758, 32720, 32698, 32761, 32737, 32737, 32683, 32703, 32704, 32746, 32672, 32709,
+ 32691, 32709, 32685, 32742, 32741, 32713, 32690, 32746, 32702, 32715, 32725, 32727, 32710, 32670, 32683, 32751,
+ 32674, 32678, 32679, 32752, 32726, 32728, 32745, 32684, 32740, 32728, 32756, 32722, 32698, 32746, 32675, 32748,
+ 32760, 32729, 32747, 32762, 32764, 32709, 32670, 32667, 32706, 32743, 32671, 32691, 32759, 32753, 32737, 32732,
+ 32674, 32741, 32742, 32709, 32688, 32758, 32679, 32753, 32667, 32688, 32758, 32712, 32705, 32740, 32754, 32762,
+ 32709, 32721, 32736, 32680, 32698, 32701, 32673, 32696, 32709, 32699, 32717, 32692, 32697, 32732, 32694, 32762,
+ 32702, 32716, 32721, 32765, 32678, 32681, 32760, 32695, 32766, 32741, 32684, 32740, 32735, 32751, 32695, 32680,
+ 32766, 32685, 32734, 32751, 32745, 32670, 32723, 32766, 32731, 32736, 32729, 32668, 32705, 32761, 32698, 32685,
+ 32716, 32689, 32738, 32697, 32736, 32752, 32753, 32675, 32684, 32735, 32750, 32691, 32762, 32691, 32699, 32720,
+ 32723, 32676, 32681, 32697, 32679, 32736, 32704, 32681, 32724, 32674, 32710, 32726, 32676, 32702, 32685, 32746,
+ 32750, 32670, 32732, 32670, 32751, 32732, 32707, 32696, 32706, 32729, 32694, 32765, 32764, 32687, 32687, 32675,
+ 32668, 32730, 32686, 32684, 32752, 32686, 32691, 32684, 32729, 32689, 32681, 32690, 32731, 32705, 32726, 32740,
+ 32724, 32714, 32704, 32714, 32746, 32705, 32706, 32743, 32739, 32755, 32765, 32681, 32727, 32689, 32728, 32713,
+ 32723, 32759, 32671, 32744, 32731, 32704, 32752, 32670, 32691, 32668, 32674, 32722, 32724, 32749, 32738, 32766,
+ 32741, 32754, 32681, 32674, 32715, 32748, 32722, 32675, 32733, 32737, 32671, 32688, 32699, 32738, 32725, 32694,
+ 32740, 32704, 32758, 32737, 32727, 32709, 32757, 32756, 32753, 32750, 32761, 32677, 32702, 32759, 32756, 32678,
+ 32711, 32722, 32732, 32732, 32763, 32736, 32719, 32677, 32731, 32743, 32725, 32690, 32690, 32718, 32753, 32751,
+ 32706, 32762, 32678, 32675, 32670, 32696, 32688, 32734, 32725, 32745, 32728, 32728, 32765, 32682, 32703, 32731,
+ 32695, 32753, 32714, 32729, 32756, 32710, 32675, 32752, 32720, 32694, 32667, 32684, 32699, 32696, 32670, 32711,
+ 32688, 32725, 32732, 32709, 32760, 32730, 32762, 32724, 32737, 32706, 32749, 32727, 32717, 32703, 32730, 32679,
+ 32726, 32703, 32708, 32762, 32709, 32689, 32723, 32743, 32722, 32689, 32752, 32714, 32735, 32706, 32740, 32740,
+ 32709, 32690, 32764, 32708, 32754, 32762, 32765, 32702, 32731, 32740, 32671, 32705, 32702, 32725, 32721, 32668,
+ 32680, 32725, 32728, 32710, 32744, 32759, 32667, 32687, 32704, 32722, 32685, 32720, 32710, 32744, 32686, 32682,
+ 32764, 32712, 32728, 32718, 32700, 32733, 32700, 32733, 32755, 32762, 32756, 32740, 32731, 32743, 32742, 32673,
+ 32748, 32715, 32721, 32749, 32717, 32730, 32728, 32732, 32741, 32756, 32719, 32727, 32739, 32755, 32765, 32760,
+ 32667, 32733, 32694, 32737, 32724, 32725, 32683, 32722, 32675, 32736, 32689, 32707, 32681, 32752, 32752, 32725,
+ 32688, 32735, 32718, 32735, 32754, 32721, 32714, 32705, 32668, 32706, 32750, 32747, 32678, 32699, 32684, 32696,
+ 32753, 32756, 32756, 32692, 32761, 32698, 32745, 32710, 32748, 32728, 32763, 32707, 32756, 32674, 32692, 32676,
+ 32685, 32668, 32689, 32737, 32710, 32679, 32733, 32693, 32669, 32720, 32755, 32685, 32734, 32717, 32698, 32722,
+ 32672, 32668, 32677, 32733, 32729, 32743, 32715, 32766, 32760, 32693, 32729, 32693, 32749, 32746, 32734, 32674,
+ 32676, 32737, 32748, 32753, 32729, 32741, 32727, 32676, 32716, 32766, 32749, 32693, 32738, 32762, 32738, 32746,
+ 32729, 32668, 32742, 32736, 32738, 32695, 32683, 32693, 32707, 32740, 32743, 32689, 32711, 32688, 32684, 32762,
+ 32705, 32724, 32742, 32695, 32751, 32729, 32729, 32758, 32730, 32687, 32761, 32760, 32743, 32757, 32675, 32748,
+ 32743, 32711, 32691, 32762, 32715, 32684, 32733, 32752, 32709, 32687, 32748, 32712, 32674, 32715, 32734, 32762,
+ 32753, 32724, 32679, 32734, 32673, 32706, 32763, 32742, 32674, 32721, 32683, 32760, 32694, 32733, 32766, 32669,
+ 32747, 32669, 32715, 32732, 32736, 32710, 32710, 32680, 32752, 32708, 32762, 32715, 32732, 32756, 32715, 32749,
+ 32728, 32729, 32706, 32755, 32738, 32697, 32717, 32676, 32672, 32726, 32723, 32761, 32720, 32757, 32727, 32689,
+ 32736, 32669, 32690, 32693, 32766, 32754, 32676, 32742, 32698, 32680, 32715, 32714, 32682, 32722, 32719, 32732,
+ 32712, 32703, 32736, 32685, 32723, 32765, 32715, 32726, 32712, 32687, 32682, 32756, 32738, 32670, 32711, 32761,
+ 32722, 32710, 32692, 32714, 32674, 32707, 32727, 32722, 32707, 32758, 32753, 32718, 32717, 32684, 32679, 32728,
+ 32756, 32756, 32719, 32672, 32706, 32734, 32676, 32754, 32747, 32738, 32736, 32704, 32736, 32762, 32751, 32691,
+ 32724, 32754, 32766, 32748, 32696, 32683, 32722, 32708, 32764, 32759, 32711, 32686, 32721, 32765, 32701, 32766,
+ 32729, 32674, 32746, 32679, 32765, 32755, 32748, 32716, 32758, 32697, 32685, 32691, 32737, 32766, 32691, 32678,
+ 32752, 32739, 32740, 32713, 32735, 32764, 32750, 32737, 32737, 32730, 32763, 32673, 32682, 32677, 32742, 32684,
+ 32691, 32722, 32766, 32761, 32758, 32762, 32741, 32764, 32717, 32729, 32743, 32679, 32755, 32751, 32757, 32686,
+ 32735, 32727, 32679, 32671, 32673, 32735, 32714, 32750, 32743, 32714, 32696, 32734, 32741, 32709, 32669, 32747,
+ 32676, 32681, 32702, 32668, 32710, 32739, 32727, 32732, 32669, 32690, 32690, 32690, 32738, 32686, 32735, 32705,
+ 32745, 32756, 32738, 32735, 32678, 32691, 32721, 32761, 32760, 32669, 32734, 32729, 32669, 32678, 32669, 32716,
+ 32700, 32743, 32721, 32728, 32739, 32762, 32741, 32674, 32751, 32746, 32752, 32721, 32720, 32681, 32674, 32710,
+ 32707, 32719, 32761, 32740, 32726, 32708, 32688, 32732, 32667, 32718, 32723, 32672, 32755, 32753, 32757, 32763,
+ 32689, 32681, 32688, 32702, 32701, 32738, 32745, 32732, 32741, 32677, 32686, 32684, 32740, 32755, 32729, 32687,
+ 32700, 32702, 32756, 32667, 32681, 32723, 32725, 32676, 32719, 32764, 32741, 32744, 32759, 32696, 32700, 32686,
+ 32709, 32684, 32667, 32684, 32668, 32736, 32697, 32679, 32747, 32750, 32728, 32674, 32735, 32674, 32699, 32759,
+ 32713, 32724, 32734, 32706, 32756, 32732, 32707, 32730, 32754, 32736, 32745, 32699, 32713, 32709, 32738, 32762,
+ 32754, 32697, 32724, 32686, 32699, 32758, 32705, 32723, 32732, 32707, 32695, 32755, 32690, 32751, 32755, 32668,
+ 32734, 32707, 32764, 32743, 32755, 32738, 32747, 32667, 32736, 32714, 32679, 32717, 32754, 32701, 32717, 32713,
+ 32720, 32700, 32757, 32733, 32755, 32673, 32715, 32707, 32706, 32758, 32677, 32687, 32721, 32683, 32742, 32742,
+ 32678, 32737, 32688, 32688, 32687, 32736, 32697, 32725, 32747, 32694, 32740, 32672, 32680, 32669, 32698, 32681,
+ 32745, 32745, 32676, 32676, 32668, 32698, 32729, 32764, 32729, 32735, 32710, 32708, 32726, 32732, 32675, 32765,
+ 32695, 32733, 32766, 32729, 32737, 32682, 32684, 32739, 32757, 32679, 32753, 32688, 32669, 32706, 32730, 32715,
+ 32700, 32766, 32723, 32696, 32721, 32763, 32703, 32760, 32753, 32694, 32688, 32697, 32694, 32755, 32680, 32686,
+ 32746, 32683, 32754, 32676, 32692, 32765, 32673, 32700, 32687, 32744, 32760, 32696, 32766, 32755, 32673, 32739,
+ 32691, 32762, 32720, 32713, 32709, 32743, 32705, 32745, 32680, 32749, 32725, 32757, 32689, 32754, 32709, 32743,
+ 32744, 32736, 32737, 32746, 32689, 32731, 32676, 32702, 32736, 32758, 32765, 32681, 32709, 32694, 32759, 32729,
+ 32678, 32748, 32699, 32682, 32667, 32748, 32753, 32667, 32679, 32760, 32721, 32708, 32740, 32720, 32733, 32702,
+ 32685, 32756, 32743, 32718, 32669, 32680, 32742, 32766, 32737, 32707, 32737, 32760, 32710, 32754, 32737, 32686,
+ 32702, 32710, 32676, 32740, 32728, 32696, 32751, 32670, 32674, 32755, 32734, 32685, 32691, 32731, 32692, 32668,
+ 32681, 32706, 32678, 32749, 32680, 32670, 32711, 32765, 32760, 32675, 32682, 32752, 32715, 32669, 32681, 32709,
+ 32700, 32722, 32690, 32685, 32758, 32718, 32709, 32753, 32680, 32736, 32724, 32705, 32708, 32707, 32693, 32723,
+ 32711, 32689, 32713, 32733, 32731, 32669, 32721, 32724, 32680, 32708, 32701, 32679, 32705, 32727, 32699, 32761,
+ 32758, 32752, 32731, 32695, 32750, 32751, 32675, 32740, 32713, 32740, 32690, 32706, 32734, 32670, 32751, 32707,
+ 32692, 32736, 32718, 32751, 32719, 32680, 32740, 32764, 32703, 32674, 32743, 32739, 32756, 32709, 32709, 32698,
+ 32674, 32680, 32699, 32684, 32674, 32749, 32724, 32698, 32766, 32764, 32738, 32763, 32762, 32746, 32697, 32747,
+ 32683, 32738, 32729, 32742, 32758, 32718, 32730, 32727, 32693, 32745, 32731, 32681, 32699, 32713, 32714, 32761,
+ 32681, 32747, 32757, 32695, 32686, 32733, 32685, 32682, 32699, 32730, 32711, 32732, 32717, 32755, 32725, 32720,
+ 32718, 32764, 32719, 32689, 32711, 32674, 32759, 32740, 32734, 32698, 32688, 32739, 32713, 32668, 32689, 32714,
+ 32752, 32733, 32671, 32690, 32719, 32763, 32758, 32733, 32763, 32706, 32728, 32672, 32673, 32721, 32680, 32696,
+ 32703, 32744, 32745, 32735, 32742, 32681, 32670, 32754, 32723, 32747, 32674, 32701, 32722, 32754, 32752, 32685,
+ 32686, 32680, 32675, 32708, 32757, 32716, 32737, 32728, 32740, 32764, 32694, 32696, 32757, 32730, 32692, 32702,
+ 32708, 32717, 32734, 32681, 32714, 32716, 32722, 32700, 32711, 32691, 32687, 32740, 32689, 32718, 32684, 32670,
+ 32746, 32756, 32679, 32761, 32727, 32728, 32701, 32698, 32685, 32682, 32710, 32714, 32669, 32689, 32693, 32766,
+ 32682, 32763, 32696, 32746, 32741, 32702, 32761, 32743, 32731, 32725, 32717, 32704, 32680, 32749, 32713, 32726,
+ 32678, 32671, 32733, 32762, 32680, 32741, 32677, 32748, 32721, 32756, 32766, 32761, 32686, 32716, 32688, 32704,
+ 32722, 32684, 32697, 32737, 32723, 32699, 32693, 32705, 32670, 32691, 32696, 32691, 32728, 32706, 32696, 32702,
+ 32717, 32739, 32676, 32674, 32686, 32714, 32751, 32688, 32745, 32687, 32760, 32672, 32697, 32760, 32758, 32744,
+ 32685, 32701, 32763, 32729, 32723, 32735, 32692, 32702, 32765, 32713, 32693, 32734, 32766, 32699, 32726, 32747,
+ 32694, 32704, 32760, 32757, 32761, 32711, 32743, 32733, 32669, 32703, 32759, 32766, 32723, 32752, 32689, 32676,
+ 32744, 32735, 32761, 32684, 32693, 32692, 32752, 32678, 32689, 32687, 32721, 32696, 32764, 32685, 32762, 32686,
+ 32737, 32723, 32722, 32669, 32764, 32700, 32685, 32670, 32677, 32679, 32676, 32708, 32694, 32689, 32699, 32683,
+ 32688, 32715, 32740, 32742, 32682, 32678, 32695, 32719, 32750, 32752, 32705, 32757, 32730, 32678, 32763, 32758,
+ 32722, 32667, 32750, 32698, 32740, 32678, 32765, 32677, 32689, 32738, 32761, 32730, 32765, 32730, 32673, 32736,
+ 32737, 32725, 32710, 32669, 32684, 32672, 32670, 32690, 32741, 32756, 32679, 32759, 32732, 32680, 32692, 32741,
+ 32759, 32699, 32722, 32686, 32721, 32733, 32678, 32680, 32733, 32675, 32748, 32698, 32726, 32717, 32702, 32686,
+ 32761, 32766, 32698, 32668, 32670, 32677, 32747, 32736, 32674, 32706, 32743, 32765, 32757, 32717, 32724, 32766,
+ 32753, 32727, 32683, 32726, 32693, 32759, 32668, 32737, 32696, 32748, 32734, 32720, 32745, 32691, 32691, 32766,
+ 32750, 32732, 32695, 32683, 32694, 32715, 32697, 32698, 32734, 32698, 32734, 32718, 32758, 32721, 32676, 32685,
+ 32678, 32690, 32734, 32719, 32752, 32704, 32707, 32752, 32685, 32754, 32737, 32733, 32745, 32762, 32709, 32746,
+ 32726, 32758, 32750, 32673, 32670, 32735, 32701, 32761, 32732, 32702, 32747, 32669, 32744, 32757, 32717, 32704,
+ 32675, 32676, 32695, 32760, 32695, 32703, 32743, 32748, 32745, 32696, 32736, 32751, 32735, 32695, 32763, 32674,
+ 32736, 32668, 32709, 32689, 32678, 32720, 32720, 32690, 32686, 32686, 32714, 32751, 32752, 32698, 32763, 32670,
+ 32697, 32700, 32720, 32719, 32681, 32728, 32728, 32714, 32739, 32687, 32682, 32696, 32720, 32700, 32728, 32764,
+ 32713, 32698, 32715, 32674, 32721, 32709, 32696, 32688, 32733, 32762, 32752, 32739, 32703, 32723, 32750, 32736,
+ 32730, 32676, 32742, 32685, 32762, 32766, 32673, 32693, 32753, 32702, 32758, 32716, 32679, 32690, 32701, 32672,
+ 32746, 32727, 32745, 32741, 32677, 32707, 32759, 32694, 32753, 32678, 32716, 32736, 32717, 32739, 32720, 32667,
+ 32748, 32753, 32683, 32684, 32746, 32719, 32751, 32711, 32762, 32680, 32733, 32742, 32672, 32738, 32743, 32735,
+ 32709, 32763, 32738, 32679, 32722, 32751, 32710, 32688, 32745, 32759, 32680, 32750, 32766, 32667, 32667, 32729,
+ 32764, 32699, 32712, 32760, 32704, 32693, 32669, 32694, 32703, 32701, 32669, 32744, 32721, 32762, 32711, 32740,
+ 32677, 32688, 32763, 32726, 32713, 32703, 32704, 32704, 32742, 32681, 32748, 32693, 32739, 32754, 32700, 32728,
+ 32698, 32738, 32736, 32696, 32716, 32729, 32709, 32694, 32675, 32723, 32694, 32685, 32676, 32748, 32674, 32698,
+ 32673, 32704, 32703, 32752, 32694, 32754, 32757, 32687, 32734, 32693, 32706, 32694, 32729, 32695, 32690, 32667,
+ 32710, 32678, 32744, 32671, 32686, 32733, 32682, 32672, 32712, 32763, 32727, 32710, 32678, 32712, 32733, 32708,
+ 32680, 32736, 32670, 32682, 32691, 32759, 32726, 32693, 32684, 32678, 32720, 32715, 32699, 32698, 32745, 32683,
+ 32687, 32714, 32684, 32685, 32687, 32683, 32740, 32742, 32681, 32764, 32714, 32698, 32752, 32734, 32755, 32697,
+ 32671, 32682, 32722, 32721, 32726, 32690, 32699, 32696, 32681, 32717, 32670, 32670, 32676, 32674, 32677, 32764,
+ 32675, 32739, 32766, 32682, 32697, 32717, 32679, 32725, 32682, 32669, 32667, 32756, 32741, 32688, 32717, 32677,
+ 32685, 32759, 32670, 32702, 32687, 32703, 32737, 32714, 32711, 32734, 32737, 32755, 32744, 32719, 32698, 32756,
+ 32708, 32686, 32764, 32747, 32677, 32727, 32678, 32697, 32701, 32719, 32677, 32712, 32678, 32743, 32713, 32712,
+ 32708, 32668, 32692, 32695, 32688, 32766, 32668, 32745, 32752, 32681, 32704, 32707, 32730, 32708, 32681, 32732,
+ 32703, 32705, 32730, 32761, 32741, 32740, 32689, 32752, 32703, 32695, 32697, 32667, 32765, 32706, 32669, 32750,
+ 32678, 32731, 32677, 32741, 32669, 32726, 32716, 32670, 32751, 32701, 32720, 32741, 32689, 32724, 32704, 32737,
+ 32714, 32704, 32739, 32682, 32760, 32728, 32736, 32710, 32703, 32749, 32751, 32677, 32711, 32748, 32748, 32756,
+ 32704, 32727, 32763, 32765, 32683, 32714, 32674, 32764, 32728, 32720, 32736, 32698, 32719, 32749, 32711, 32680,
+ 32696, 32714, 32689, 32690, 32708, 32687, 32756, 32747, 32720, 32722, 32736, 32704, 32738, 32729, 32743, 32723,
+ 32760, 32727, 32713, 32709, 32736, 32713, 32750, 32670, 32747, 32734, 32754, 32673, 32722, 32670, 32720, 32684,
+ 32688, 32669, 32764, 32677, 32693, 32764, 32756, 32713, 32736, 32732, 32737, 32695, 32728, 32760, 32684, 32736,
+ 32680, 32724, 32748, 32747, 32721, 32687, 32718, 32672, 32699, 32758, 32700, 32686, 32668, 32723, 32751, 32698,
+ 32751, 32684, 32748, 32734, 32766, 32734, 32754, 32721, 32675, 32734, 32727, 32670, 32734, 32685, 32737, 32673,
+ 32762, 32732, 32712, 32761, 32757, 32715, 32693, 32754, 32750, 32687, 32696, 32757, 32758, 32737, 32683, 32757,
+ 32709, 32696, 32696, 32757, 32752, 32671, 32678, 32729, 32671, 32681, 32686, 32724, 32714, 32668, 32674, 32694,
+ 32695, 32763, 32725, 32701, 32750, 32682, 32683, 32754, 32712, 32762, 32716, 32732, 32701, 32749, 32761, 32670,
+ 32671, 32716, 32755, 32727, 32696, 32758, 32732, 32715, 32687, 32696, 32694, 32720, 32716, 32727, 32715, 32724,
+ 32740, 32739, 32696, 32747, 32758, 32707, 32697, 32731, 32713, 32716, 32672, 32733, 32713, 32753, 32713, 32742};
diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8_spill/output_mult_data.h b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/output_mult_data.h
new file mode 100644
index 00000000..9b36b1a9
--- /dev/null
+++ b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/output_mult_data.h
@@ -0,0 +1,7 @@
+// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0).
+// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e.
+#pragma once
+#include
+
+const int32_t int16xint8_spill_output_mult[9] =
+ {1100398998, 1100624659, 1100035049, 1099990516, 1100661379, 1100714636, 1100682734, 1100519706, 1100868940};
diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8_spill/output_ref_data.h b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/output_ref_data.h
new file mode 100644
index 00000000..ee02443f
--- /dev/null
+++ b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/output_ref_data.h
@@ -0,0 +1,12 @@
+// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0).
+// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e.
+#pragma once
+#include
+
+const int16_t int16xint8_spill_output_ref[90] = {
+ 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32719, 32667, 32667, 32667, 32667, 32667, 32667,
+ 32667, 32667, 32719, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32719, 32667, 32667, 32667,
+ 32667, 32667, 32667, 32667, 32667, 32719, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32720,
+ 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32719, 32667, 32667, 32667, 32667, 32667, 32667,
+ 32667, 32667, 32720, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32719, 32667, 32667, 32667,
+ 32667, 32667, 32667, 32667, 32667, 32719, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32718};
diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8_spill/output_shift_data.h b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/output_shift_data.h
new file mode 100644
index 00000000..b9beffc0
--- /dev/null
+++ b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/output_shift_data.h
@@ -0,0 +1,6 @@
+// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0).
+// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e.
+#pragma once
+#include
+
+const int32_t int16xint8_spill_output_shift[9] = {-16, -16, -16, -16, -16, -16, -16, -16, -16};
diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8_spill/test_data.h b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/test_data.h
new file mode 100644
index 00000000..4d61c5f2
--- /dev/null
+++ b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/test_data.h
@@ -0,0 +1,9 @@
+// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0).
+// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e.
+#include "biases_data.h"
+#include "config_data.h"
+#include "input_data.h"
+#include "output_mult_data.h"
+#include "output_ref_data.h"
+#include "output_shift_data.h"
+#include "weights_data.h"
diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8_spill/weights_data.h b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/weights_data.h
new file mode 100644
index 00000000..35ff86df
--- /dev/null
+++ b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/weights_data.h
@@ -0,0 +1,781 @@
+// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0).
+// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e.
+#pragma once
+#include
+
+const int8_t int16xint8_spill_weights[17820] = {
+ 79, 101, 58, 81, 42, 71, 35, 44, 102, 13, 8, 58, 12, 100, 15, 59, 85, 94, 86, 9, 50, 53, 63,
+ 17, 76, 82, 122, 74, 26, 41, 46, 92, 125, 70, 75, 32, 62, 53, 80, 21, 102, 110, 17, 21, 82, 104,
+ 120, 114, 26, 19, 33, 74, 116, 60, 96, 45, 110, 53, 102, 97, 124, 47, 8, 100, 25, 2, 75, 16, 36,
+ 115, 33, 86, 59, 8, 62, 108, 101, 35, 62, 106, 51, 87, 94, 102, 87, 68, 107, 60, 75, 24, 79, 50,
+ 96, 26, 21, 29, 26, 34, 102, 102, 31, 35, 118, 117, 104, 53, 82, 124, 2, 27, 62, 117, 70, 93, 14,
+ 7, 3, 76, 15, 27, 120, 17, 10, 1, 93, 75, 101, 63, 19, 37, 119, 11, 16, 109, 35, 91, 68, 58,
+ 45, 84, 25, 39, 18, 55, 118, 64, 45, 112, 95, 67, 121, 109, 75, 26, 62, 37, 82, 19, 46, 20, 108,
+ 91, 108, 47, 34, 102, 22, 126, 2, 30, 44, 98, 28, 58, 77, 20, 83, 17, 65, 101, 101, 11, 87, 42,
+ 101, 36, 55, 81, 24, 82, 101, 42, 2, 86, 17, 120, 10, 51, 75, 41, 66, 123, 73, 102, 9, 64, 14,
+ 57, 14, 3, 75, 91, 37, 92, 11, 35, 44, 28, 21, 124, 36, 13, 25, 3, 122, 24, 17, 46, 18, 113,
+ 32, 20, 3, 118, 89, 124, 20, 120, 44, 51, 74, 100, 120, 75, 68, 35, 106, 111, 7, 108, 99, 110, 113,
+ 28, 21, 68, 42, 119, 108, 9, 14, 39, 47, 59, 115, 21, 109, 93, 95, 53, 21, 18, 35, 106, 79, 43,
+ 54, 52, 118, 77, 63, 65, 105, 67, 12, 27, 12, 126, 71, 103, 23, 100, 72, 22, 7, 113, 1, 71, 66,
+ 84, 96, 57, 76, 117, 72, 6, 85, 126, 35, 22, 111, 28, 117, 12, 80, 82, 115, 40, 59, 38, 115, 7,
+ 100, 111, 20, 33, 77, 60, 119, 16, 123, 96, 94, 66, 99, 115, 47, 8, 109, 105, 56, 9, 8, 17, 116,
+ 97, 112, 47, 40, 100, 48, 16, 44, 61, 24, 107, 34, 67, 26, 92, 2, 78, 107, 89, 11, 8, 123, 74,
+ 90, 108, 84, 18, 28, 29, 70, 16, 115, 23, 106, 102, 64, 123, 56, 101, 125, 53, 122, 39, 70, 4, 39,
+ 41, 25, 72, 71, 69, 70, 62, 106, 57, 105, 125, 64, 113, 96, 27, 102, 37, 8, 83, 91, 38, 90, 63,
+ 118, 10, 35, 40, 121, 89, 50, 106, 30, 110, 120, 45, 18, 10, 85, 119, 23, 8, 15, 33, 34, 100, 84,
+ 74, 6, 111, 70, 47, 12, 30, 54, 102, 92, 92, 119, 83, 50, 95, 70, 106, 88, 77, 45, 73, 116, 127,
+ 104, 70, 22, 25, 83, 46, 67, 3, 82, 120, 93, 73, 43, 72, 81, 105, 100, 105, 84, 3, 32, 14, 53,
+ 117, 52, 106, 45, 31, 30, 123, 67, 95, 66, 53, 16, 58, 18, 19, 50, 109, 123, 25, 61, 13, 17, 91,
+ 25, 47, 116, 22, 64, 50, 28, 13, 22, 109, 1, 71, 102, 16, 25, 29, 38, 12, 32, 87, 65, 52, 2,
+ 83, 54, 46, 111, 48, 63, 36, 44, 44, 37, 31, 106, 33, 54, 39, 8, 103, 40, 15, 92, 14, 3, 75,
+ 26, 27, 107, 99, 93, 124, 22, 94, 38, 68, 25, 67, 108, 9, 25, 2, 14, 108, 2, 41, 36, 24, 125,
+ 41, 76, 119, 87, 103, 64, 60, 52, 98, 71, 40, 104, 89, 77, 49, 12, 122, 18, 23, 82, 93, 103, 94,
+ 78, 30, 68, 57, 23, 79, 113, 40, 56, 118, 22, 78, 22, 67, 53, 37, 29, 75, 30, 79, 31, 101, 104,
+ 68, 117, 19, 72, 5, 89, 39, 102, 4, 9, 36, 29, 106, 57, 98, 19, 28, 126, 10, 52, 9, 16, 29,
+ 103, 38, 126, 64, 78, 51, 30, 32, 103, 46, 48, 118, 59, 100, 31, 42, 7, 78, 16, 78, 124, 49, 16,
+ 36, 59, 22, 85, 42, 107, 45, 12, 68, 51, 104, 57, 77, 113, 101, 89, 43, 91, 97, 76, 114, 76, 126,
+ 29, 15, 102, 35, 65, 88, 46, 98, 103, 15, 64, 89, 18, 47, 77, 22, 59, 23, 29, 74, 105, 16, 33,
+ 74, 110, 3, 18, 113, 127, 12, 4, 84, 96, 66, 24, 9, 118, 71, 33, 35, 100, 67, 36, 21, 83, 101,
+ 32, 124, 82, 14, 84, 27, 59, 20, 34, 25, 84, 85, 114, 79, 72, 5, 42, 86, 42, 105, 109, 44, 119,
+ 29, 110, 1, 98, 43, 94, 77, 43, 117, 51, 29, 12, 125, 23, 26, 75, 32, 43, 58, 11, 108, 82, 53,
+ 63, 67, 109, 1, 30, 92, 53, 124, 45, 45, 15, 116, 70, 95, 31, 121, 44, 5, 92, 79, 48, 56, 40,
+ 65, 101, 52, 125, 85, 19, 114, 44, 64, 19, 105, 88, 26, 38, 39, 124, 43, 54, 76, 13, 86, 93, 45,
+ 3, 33, 105, 53, 108, 61, 118, 59, 125, 93, 113, 22, 97, 96, 4, 79, 113, 39, 123, 93, 114, 87, 28,
+ 92, 90, 27, 8, 103, 108, 6, 87, 31, 119, 74, 89, 39, 71, 123, 116, 108, 92, 83, 92, 64, 54, 23,
+ 46, 98, 15, 48, 120, 18, 124, 80, 79, 27, 24, 95, 90, 53, 87, 59, 65, 14, 40, 107, 74, 62, 74,
+ 104, 77, 36, 104, 86, 0, 73, 103, 18, 93, 12, 87, 102, 62, 110, 34, 20, 17, 69, 3, 101, 31, 37,
+ 117, 117, 113, 51, 24, 76, 78, 64, 51, 61, 39, 26, 45, 61, 75, 16, 57, 39, 79, 59, 106, 35, 76,
+ 27, 18, 73, 42, 6, 58, 92, 102, 59, 30, 17, 103, 24, 88, 61, 70, 41, 101, 8, 118, 97, 106, 69,
+ 10, 0, 97, 8, 11, 89, 63, 13, 65, 81, 55, 51, 10, 11, 17, 105, 13, 113, 123, 113, 93, 54, 123,
+ 35, 113, 98, 14, 99, 40, 68, 106, 45, 48, 116, 115, 66, 71, 17, 46, 123, 49, 92, 122, 110, 103, 56,
+ 54, 17, 102, 16, 103, 35, 117, 23, 18, 41, 11, 67, 107, 13, 64, 59, 73, 23, 39, 69, 10, 27, 93,
+ 61, 2, 26, 45, 80, 8, 85, 64, 60, 110, 74, 77, 72, 67, 50, 38, 6, 52, 113, 55, 84, 62, 6,
+ 90, 109, 15, 43, 72, 55, 106, 8, 89, 5, 120, 120, 38, 110, 37, 93, 59, 126, 35, 117, 59, 86, 125,
+ 74, 75, 76, 95, 19, 82, 20, 91, 7, 39, 64, 5, 14, 57, 39, 1, 13, 22, 8, 53, 66, 6, 13,
+ 83, 96, 32, 83, 82, 99, 121, 104, 65, 109, 79, 35, 3, 44, 1, 90, 1, 116, 72, 43, 5, 109, 59,
+ 76, 127, 25, 85, 72, 34, 126, 114, 40, 43, 117, 61, 92, 52, 117, 62, 124, 102, 6, 26, 95, 112, 9,
+ 56, 121, 13, 102, 86, 27, 110, 71, 6, 123, 97, 123, 87, 52, 118, 107, 37, 42, 10, 46, 12, 82, 126,
+ 8, 71, 16, 40, 84, 18, 50, 124, 67, 68, 65, 18, 117, 58, 108, 67, 66, 55, 87, 60, 102, 34, 77,
+ 27, 63, 101, 12, 46, 84, 82, 50, 110, 87, 66, 10, 17, 110, 60, 111, 57, 105, 123, 27, 99, 85, 92,
+ 87, 66, 58, 33, 16, 21, 15, 57, 61, 121, 52, 94, 8, 109, 111, 24, 22, 31, 125, 94, 33, 90, 19,
+ 64, 89, 124, 20, 60, 126, 39, 101, 69, 81, 42, 18, 64, 100, 50, 62, 108, 66, 58, 80, 38, 72, 40,
+ 22, 42, 2, 47, 95, 35, 22, 78, 46, 21, 8, 75, 84, 98, 99, 13, 127, 87, 108, 52, 62, 104, 49,
+ 43, 102, 63, 35, 68, 37, 30, 47, 49, 1, 105, 114, 116, 62, 19, 121, 105, 5, 113, 111, 26, 70, 122,
+ 4, 119, 95, 122, 75, 52, 107, 45, 1, 42, 27, 40, 108, 97, 117, 103, 13, 118, 15, 65, 90, 25, 116,
+ 33, 20, 9, 116, 80, 37, 11, 39, 92, 33, 81, 100, 19, 60, 20, 11, 95, 114, 85, 116, 23, 52, 52,
+ 7, 39, 120, 43, 34, 25, 116, 39, 101, 106, 10, 65, 84, 54, 87, 85, 55, 41, 44, 123, 97, 49, 16,
+ 76, 91, 24, 114, 92, 51, 79, 34, 5, 40, 21, 72, 82, 120, 68, 20, 113, 101, 50, 51, 27, 56, 22,
+ 100, 48, 21, 113, 48, 90, 30, 8, 52, 76, 18, 113, 54, 51, 22, 120, 29, 105, 58, 51, 98, 99, 40,
+ 56, 45, 47, 125, 42, 91, 112, 72, 124, 81, 70, 99, 87, 1, 97, 40, 20, 8, 57, 112, 31, 59, 124,
+ 101, 44, 0, 40, 93, 36, 6, 106, 70, 48, 60, 100, 112, 38, 91, 22, 103, 31, 19, 10, 46, 70, 75,
+ 29, 10, 120, 96, 5, 37, 101, 124, 0, 46, 89, 60, 2, 95, 27, 58, 7, 46, 63, 3, 14, 61, 10,
+ 123, 7, 51, 22, 18, 39, 38, 9, 125, 9, 75, 47, 46, 24, 53, 4, 80, 35, 98, 38, 114, 36, 86,
+ 68, 89, 11, 73, 16, 117, 75, 81, 25, 98, 127, 97, 79, 92, 22, 16, 25, 32, 74, 9, 52, 54, 95,
+ 33, 60, 66, 101, 23, 57, 7, 77, 33, 121, 37, 6, 68, 29, 71, 79, 33, 106, 117, 85, 46, 49, 3,
+ 84, 68, 126, 49, 119, 8, 79, 57, 16, 40, 82, 91, 60, 94, 3, 49, 4, 40, 125, 27, 7, 14, 78,
+ 19, 83, 19, 117, 23, 83, 0, 39, 107, 65, 63, 44, 61, 112, 65, 68, 55, 19, 52, 11, 79, 82, 119,
+ 59, 8, 114, 92, 32, 120, 27, 119, 48, 57, 102, 46, 94, 38, 46, 62, 26, 81, 106, 34, 103, 25, 108,
+ 51, 38, 20, 8, 78, 76, 33, 76, 72, 92, 74, 114, 112, 55, 104, 16, 89, 60, 89, 39, 124, 65, 49,
+ 118, 15, 21, 81, 21, 73, 97, 111, 66, 89, 122, 104, 82, 9, 25, 17, 81, 56, 27, 117, 58, 101, 41,
+ 92, 72, 18, 2, 16, 40, 42, 59, 46, 106, 59, 91, 75, 117, 7, 82, 95, 69, 45, 54, 22, 41, 94,
+ 55, 0, 36, 73, 75, 14, 0, 17, 81, 74, 47, 127, 13, 60, 56, 34, 92, 20, 53, 41, 64, 20, 55,
+ 102, 118, 15, 105, 7, 22, 70, 93, 53, 48, 84, 107, 16, 89, 86, 52, 39, 26, 114, 51, 67, 71, 87,
+ 6, 71, 49, 70, 59, 9, 50, 105, 121, 77, 100, 47, 119, 8, 61, 12, 2, 50, 121, 89, 46, 109, 56,
+ 114, 69, 96, 49, 104, 58, 80, 35, 125, 25, 114, 106, 36, 111, 34, 118, 93, 16, 48, 9, 85, 61, 39,
+ 87, 50, 88, 14, 87, 48, 84, 110, 74, 61, 3, 33, 76, 94, 96, 57, 110, 52, 38, 29, 18, 101, 111,
+ 68, 83, 6, 9, 12, 124, 3, 30, 62, 98, 83, 116, 11, 127, 91, 60, 105, 23, 79, 47, 63, 35, 63,
+ 16, 62, 57, 59, 105, 103, 65, 50, 103, 3, 120, 5, 66, 87, 30, 84, 127, 87, 113, 15, 78, 96, 1,
+ 0, 107, 9, 116, 41, 82, 111, 53, 97, 114, 91, 55, 34, 77, 38, 54, 105, 88, 42, 50, 27, 54, 68,
+ 54, 79, 114, 71, 97, 34, 6, 28, 6, 3, 88, 125, 50, 114, 39, 48, 29, 104, 87, 108, 100, 44, 50,
+ 39, 64, 50, 14, 80, 50, 70, 11, 21, 72, 38, 96, 44, 115, 15, 32, 77, 70, 124, 94, 116, 42, 95,
+ 38, 100, 102, 2, 28, 124, 66, 64, 11, 116, 112, 15, 11, 74, 111, 85, 27, 8, 71, 46, 59, 63, 19,
+ 65, 70, 62, 70, 76, 95, 51, 71, 74, 49, 43, 108, 38, 19, 74, 79, 83, 118, 24, 104, 120, 59, 65,
+ 107, 36, 97, 28, 15, 24, 7, 114, 70, 109, 43, 36, 36, 6, 63, 30, 18, 120, 115, 86, 39, 61, 127,
+ 69, 57, 126, 34, 94, 60, 49, 6, 18, 14, 1, 96, 77, 45, 119, 19, 118, 123, 120, 34, 81, 22, 61,
+ 61, 22, 80, 18, 75, 84, 49, 43, 86, 45, 28, 36, 97, 16, 1, 0, 85, 118, 61, 17, 96, 21, 10,
+ 81, 20, 3, 117, 29, 57, 2, 81, 62, 17, 76, 77, 64, 78, 110, 44, 107, 29, 48, 47, 66, 84, 36,
+ 112, 125, 12, 108, 62, 95, 119, 121, 56, 122, 93, 35, 52, 37, 120, 89, 18, 73, 127, 100, 14, 62, 74,
+ 53, 15, 13, 51, 42, 64, 80, 116, 50, 42, 22, 65, 88, 23, 17, 7, 83, 125, 4, 40, 109, 37, 1,
+ 93, 85, 85, 88, 80, 5, 47, 17, 60, 100, 68, 95, 104, 26, 69, 111, 104, 29, 101, 57, 115, 43, 64,
+ 56, 97, 104, 56, 22, 49, 87, 103, 64, 88, 79, 110, 86, 95, 76, 63, 47, 71, 6, 33, 126, 33, 12,
+ 51, 53, 7, 63, 27, 34, 3, 4, 21, 15, 7, 78, 119, 8, 114, 108, 10, 125, 64, 116, 73, 101, 60,
+ 41, 116, 11, 71, 77, 83, 76, 54, 7, 88, 84, 92, 127, 73, 77, 108, 73, 3, 47, 9, 76, 61, 43,
+ 34, 10, 27, 61, 85, 64, 3, 22, 94, 124, 8, 6, 114, 70, 24, 55, 112, 44, 23, 20, 83, 118, 60,
+ 127, 110, 45, 98, 117, 110, 44, 29, 15, 40, 29, 66, 71, 17, 121, 72, 18, 90, 38, 12, 54, 119, 92,
+ 108, 120, 8, 54, 17, 126, 98, 79, 114, 20, 94, 19, 79, 28, 89, 87, 79, 45, 112, 100, 47, 68, 95,
+ 125, 61, 84, 86, 114, 100, 92, 101, 53, 45, 114, 95, 11, 23, 2, 117, 23, 4, 77, 99, 72, 42, 75,
+ 109, 100, 69, 41, 109, 2, 111, 46, 111, 31, 59, 115, 27, 3, 93, 86, 29, 65, 1, 45, 12, 81, 96,
+ 83, 80, 31, 46, 103, 59, 43, 83, 86, 13, 63, 49, 47, 86, 6, 79, 63, 100, 79, 77, 106, 99, 78,
+ 42, 10, 48, 72, 11, 51, 84, 15, 37, 107, 87, 18, 60, 35, 38, 106, 43, 90, 67, 74, 125, 106, 65,
+ 88, 103, 94, 79, 9, 32, 0, 64, 25, 66, 52, 125, 92, 21, 19, 121, 15, 105, 14, 54, 66, 95, 95,
+ 69, 115, 4, 55, 114, 9, 42, 67, 57, 42, 64, 89, 102, 40, 22, 93, 52, 76, 66, 104, 6, 47, 16,
+ 88, 27, 37, 76, 95, 67, 100, 17, 22, 70, 26, 73, 90, 14, 70, 58, 34, 77, 48, 124, 11, 13, 94,
+ 27, 0, 1, 22, 5, 126, 53, 11, 73, 93, 1, 82, 102, 118, 53, 61, 87, 20, 52, 105, 2, 87, 78,
+ 42, 95, 117, 79, 82, 56, 100, 126, 108, 59, 74, 55, 112, 80, 35, 68, 117, 88, 9, 15, 73, 91, 35,
+ 5, 86, 112, 45, 124, 107, 98, 76, 23, 67, 10, 99, 111, 125, 18, 62, 52, 27, 63, 76, 110, 103, 110,
+ 51, 82, 17, 111, 43, 110, 4, 91, 99, 10, 90, 121, 75, 56, 20, 50, 72, 77, 100, 107, 28, 101, 104,
+ 67, 80, 115, 27, 66, 8, 7, 126, 68, 116, 79, 47, 92, 2, 101, 2, 127, 70, 9, 63, 7, 79, 24,
+ 59, 75, 48, 71, 94, 94, 59, 119, 74, 70, 94, 82, 50, 39, 52, 49, 24, 118, 92, 102, 39, 7, 111,
+ 77, 5, 106, 53, 89, 54, 0, 86, 66, 94, 41, 9, 5, 80, 88, 81, 117, 57, 9, 33, 60, 99, 105,
+ 97, 98, 97, 108, 11, 83, 63, 55, 7, 82, 9, 47, 124, 60, 121, 56, 44, 77, 24, 108, 53, 85, 60,
+ 67, 107, 64, 111, 94, 105, 79, 118, 6, 124, 16, 38, 12, 118, 31, 119, 101, 12, 106, 108, 40, 113, 93,
+ 97, 11, 17, 34, 108, 51, 55, 61, 110, 96, 60, 54, 120, 19, 54, 61, 46, 113, 117, 38, 125, 46, 38,
+ 75, 117, 124, 121, 102, 39, 65, 75, 124, 63, 40, 26, 40, 58, 19, 55, 34, 119, 63, 86, 46, 24, 59,
+ 3, 97, 115, 46, 94, 43, 100, 58, 12, 98, 39, 25, 59, 108, 103, 101, 80, 66, 93, 44, 12, 64, 81,
+ 56, 71, 127, 44, 58, 96, 89, 72, 80, 41, 109, 110, 80, 50, 93, 71, 52, 110, 103, 95, 91, 56, 111,
+ 108, 59, 12, 14, 71, 29, 48, 46, 32, 113, 58, 11, 120, 103, 21, 10, 12, 110, 72, 82, 83, 109, 7,
+ 5, 49, 82, 123, 32, 66, 40, 14, 43, 10, 85, 89, 105, 115, 93, 16, 106, 113, 47, 42, 14, 108, 11,
+ 95, 106, 120, 93, 115, 83, 110, 2, 113, 70, 6, 123, 26, 121, 106, 72, 91, 56, 94, 114, 60, 54, 49,
+ 46, 7, 42, 84, 38, 88, 117, 114, 15, 19, 44, 76, 117, 2, 53, 119, 30, 36, 107, 87, 64, 83, 91,
+ 39, 82, 7, 28, 113, 30, 115, 43, 52, 34, 35, 122, 81, 68, 111, 103, 11, 22, 101, 67, 52, 115, 45,
+ 7, 126, 112, 25, 114, 51, 70, 24, 116, 44, 19, 116, 30, 111, 52, 49, 70, 108, 126, 85, 39, 46, 30,
+ 55, 76, 108, 68, 25, 123, 63, 50, 27, 28, 35, 106, 39, 59, 68, 39, 42, 2, 108, 25, 53, 61, 84,
+ 14, 25, 32, 46, 65, 102, 62, 10, 21, 104, 67, 96, 18, 38, 120, 9, 77, 52, 73, 80, 67, 56, 18,
+ 40, 88, 86, 51, 43, 9, 74, 115, 92, 49, 49, 77, 15, 75, 90, 77, 39, 74, 23, 33, 64, 49, 5,
+ 105, 12, 46, 61, 24, 14, 46, 22, 111, 54, 123, 23, 67, 42, 40, 110, 37, 42, 17, 56, 93, 59, 46,
+ 126, 115, 112, 104, 108, 31, 20, 87, 62, 52, 67, 48, 126, 79, 94, 6, 85, 113, 3, 27, 25, 94, 36,
+ 74, 14, 95, 20, 33, 20, 70, 118, 31, 78, 26, 47, 28, 25, 22, 120, 10, 17, 20, 100, 36, 51, 102,
+ 89, 59, 115, 16, 99, 6, 82, 86, 77, 114, 111, 37, 72, 30, 42, 71, 102, 94, 92, 36, 1, 63, 100,
+ 71, 20, 78, 95, 43, 58, 24, 87, 13, 21, 59, 79, 7, 68, 1, 111, 36, 20, 7, 103, 94, 12, 89,
+ 55, 3, 52, 127, 25, 18, 33, 87, 42, 0, 108, 15, 48, 118, 64, 71, 49, 118, 108, 8, 72, 58, 38,
+ 4, 52, 18, 9, 100, 52, 100, 88, 116, 92, 70, 118, 123, 72, 93, 121, 98, 16, 23, 50, 18, 18, 29,
+ 48, 6, 4, 13, 82, 114, 23, 88, 46, 110, 85, 23, 73, 80, 33, 24, 20, 123, 93, 124, 119, 101, 43,
+ 31, 87, 15, 71, 85, 74, 119, 46, 112, 40, 25, 74, 65, 105, 104, 24, 68, 38, 73, 117, 26, 75, 79,
+ 74, 105, 72, 36, 96, 106, 106, 22, 38, 108, 57, 5, 38, 42, 4, 31, 55, 90, 108, 116, 56, 116, 116,
+ 46, 17, 52, 12, 31, 78, 78, 110, 97, 26, 17, 70, 86, 118, 125, 97, 4, 77, 95, 90, 78, 4, 110,
+ 25, 103, 11, 115, 93, 53, 70, 14, 12, 9, 45, 72, 51, 53, 102, 40, 81, 110, 65, 38, 48, 92, 49,
+ 95, 18, 43, 56, 71, 29, 33, 110, 88, 36, 127, 25, 15, 113, 27, 114, 65, 26, 123, 41, 17, 89, 61,
+ 56, 26, 12, 91, 72, 96, 32, 69, 113, 50, 55, 94, 27, 119, 51, 61, 98, 57, 109, 91, 22, 105, 72,
+ 43, 58, 35, 11, 97, 39, 32, 80, 12, 114, 75, 77, 7, 111, 24, 37, 93, 21, 114, 59, 36, 127, 93,
+ 6, 40, 84, 34, 18, 73, 82, 26, 102, 54, 51, 107, 47, 68, 42, 35, 86, 4, 63, 66, 100, 29, 14,
+ 18, 98, 72, 100, 119, 106, 34, 75, 107, 74, 56, 118, 62, 108, 90, 2, 26, 24, 76, 50, 0, 21, 114,
+ 106, 29, 19, 85, 97, 42, 50, 64, 86, 66, 105, 33, 82, 80, 109, 74, 52, 122, 63, 123, 81, 69, 116,
+ 125, 7, 126, 107, 56, 95, 106, 47, 46, 34, 78, 29, 63, 86, 83, 94, 7, 1, 81, 114, 83, 38, 75,
+ 97, 119, 116, 3, 77, 41, 53, 31, 44, 18, 94, 121, 49, 36, 106, 14, 81, 120, 70, 34, 13, 113, 98,
+ 50, 104, 126, 105, 67, 103, 52, 32, 4, 101, 91, 87, 32, 54, 8, 89, 111, 48, 51, 74, 89, 31, 30,
+ 117, 20, 107, 114, 126, 56, 26, 53, 70, 10, 86, 63, 43, 41, 109, 76, 25, 33, 95, 51, 85, 21, 126,
+ 19, 34, 118, 68, 12, 67, 5, 11, 99, 19, 93, 72, 118, 75, 71, 19, 2, 20, 60, 81, 37, 96, 100,
+ 92, 3, 106, 27, 68, 99, 97, 67, 20, 100, 11, 54, 35, 79, 69, 125, 20, 105, 37, 48, 16, 10, 7,
+ 100, 40, 106, 112, 15, 104, 68, 1, 112, 20, 25, 31, 15, 115, 29, 78, 123, 65, 79, 101, 48, 97, 79,
+ 98, 124, 4, 19, 74, 16, 57, 3, 112, 106, 63, 116, 61, 97, 92, 4, 58, 12, 63, 92, 18, 72, 31,
+ 41, 70, 80, 30, 77, 40, 20, 3, 38, 33, 49, 90, 93, 67, 53, 113, 14, 82, 38, 61, 47, 61, 31,
+ 39, 13, 88, 103, 76, 125, 25, 23, 89, 106, 32, 127, 35, 86, 36, 13, 31, 1, 28, 37, 118, 11, 63,
+ 68, 17, 100, 17, 87, 3, 101, 124, 80, 35, 73, 73, 92, 54, 51, 77, 123, 95, 32, 117, 101, 93, 83,
+ 61, 125, 5, 106, 101, 65, 14, 60, 51, 63, 14, 24, 73, 8, 34, 54, 109, 101, 81, 103, 10, 42, 67,
+ 20, 65, 70, 17, 105, 51, 114, 81, 100, 34, 30, 19, 110, 113, 126, 77, 8, 100, 68, 95, 62, 83, 62,
+ 20, 53, 12, 42, 61, 85, 28, 56, 76, 8, 28, 19, 3, 43, 119, 61, 30, 23, 121, 53, 61, 39, 59,
+ 6, 107, 101, 57, 42, 35, 6, 39, 39, 113, 50, 81, 49, 88, 107, 51, 107, 88, 15, 63, 111, 81, 22,
+ 2, 49, 39, 16, 42, 126, 72, 80, 11, 63, 42, 125, 57, 36, 8, 120, 112, 13, 1, 91, 70, 28, 12,
+ 42, 47, 53, 53, 74, 74, 122, 6, 103, 49, 53, 83, 11, 49, 125, 89, 1, 27, 98, 111, 110, 56, 116,
+ 111, 68, 46, 121, 90, 52, 22, 57, 80, 26, 93, 127, 89, 103, 21, 17, 37, 43, 27, 110, 2, 23, 121,
+ 85, 90, 72, 42, 62, 117, 89, 90, 47, 81, 104, 46, 108, 117, 12, 40, 46, 90, 116, 93, 125, 107, 104,
+ 48, 110, 76, 86, 98, 22, 86, 71, 36, 88, 22, 65, 19, 108, 72, 4, 120, 103, 118, 40, 8, 118, 119,
+ 96, 51, 12, 7, 37, 74, 95, 12, 81, 109, 124, 21, 29, 4, 0, 0, 39, 54, 33, 57, 108, 107, 124,
+ 58, 114, 40, 3, 7, 126, 75, 95, 6, 17, 105, 22, 110, 73, 8, 28, 109, 98, 51, 66, 104, 120, 46,
+ 86, 55, 123, 75, 31, 94, 42, 46, 3, 117, 26, 97, 44, 25, 9, 99, 20, 51, 96, 117, 39, 97, 90,
+ 111, 57, 16, 119, 73, 60, 31, 100, 66, 50, 47, 103, 43, 118, 2, 121, 68, 122, 67, 31, 92, 77, 22,
+ 77, 104, 52, 101, 105, 117, 32, 40, 114, 51, 26, 68, 9, 40, 101, 93, 52, 67, 10, 108, 53, 37, 65,
+ 12, 83, 13, 73, 82, 66, 16, 42, 125, 105, 52, 50, 77, 84, 7, 44, 56, 39, 39, 96, 4, 34, 61,
+ 58, 87, 49, 41, 26, 63, 88, 0, 52, 36, 14, 30, 6, 99, 35, 111, 1, 106, 122, 53, 1, 114, 5,
+ 100, 71, 63, 53, 122, 25, 50, 117, 61, 82, 21, 70, 90, 94, 127, 22, 77, 78, 15, 64, 80, 70, 79,
+ 109, 108, 109, 59, 108, 27, 112, 113, 112, 14, 19, 59, 115, 5, 108, 48, 43, 76, 125, 113, 59, 27, 105,
+ 125, 49, 1, 39, 33, 32, 77, 3, 45, 28, 30, 117, 103, 23, 67, 98, 88, 95, 90, 3, 97, 72, 66,
+ 78, 50, 39, 58, 108, 61, 84, 45, 8, 106, 96, 89, 32, 64, 96, 1, 106, 42, 83, 109, 57, 14, 46,
+ 50, 106, 53, 64, 67, 116, 73, 25, 17, 72, 20, 100, 9, 115, 87, 61, 75, 99, 67, 31, 44, 100, 121,
+ 46, 120, 104, 38, 77, 42, 26, 74, 89, 10, 114, 5, 115, 42, 27, 66, 96, 51, 5, 28, 71, 61, 93,
+ 57, 2, 62, 114, 60, 43, 99, 42, 67, 47, 113, 8, 11, 111, 103, 75, 120, 41, 97, 84, 122, 56, 28,
+ 92, 62, 1, 101, 10, 8, 114, 94, 68, 83, 119, 57, 86, 116, 21, 103, 110, 102, 103, 24, 85, 93, 38,
+ 103, 66, 24, 110, 102, 12, 121, 123, 108, 53, 70, 66, 35, 86, 43, 22, 51, 19, 77, 86, 66, 59, 3,
+ 48, 71, 88, 95, 39, 76, 104, 44, 41, 44, 59, 47, 83, 68, 34, 102, 1, 30, 81, 114, 112, 118, 43,
+ 3, 71, 12, 43, 64, 81, 16, 38, 118, 14, 87, 105, 49, 102, 100, 89, 6, 115, 12, 83, 83, 45, 7,
+ 38, 79, 126, 90, 63, 64, 113, 84, 15, 62, 7, 104, 35, 100, 15, 6, 48, 51, 81, 69, 96, 77, 122,
+ 47, 52, 51, 20, 90, 56, 4, 110, 117, 85, 81, 96, 13, 110, 120, 108, 89, 45, 35, 31, 65, 118, 112,
+ 116, 91, 42, 85, 13, 55, 91, 111, 23, 79, 46, 26, 26, 85, 78, 97, 24, 62, 42, 98, 117, 83, 37,
+ 38, 45, 39, 50, 115, 12, 61, 50, 9, 94, 13, 127, 100, 109, 88, 72, 81, 71, 71, 95, 17, 113, 100,
+ 17, 46, 56, 104, 68, 33, 86, 98, 35, 21, 32, 120, 7, 7, 30, 4, 98, 88, 110, 7, 22, 19, 109,
+ 29, 25, 11, 100, 47, 118, 59, 93, 115, 58, 2, 45, 92, 6, 15, 61, 58, 83, 111, 38, 113, 80, 44,
+ 78, 6, 94, 121, 102, 61, 47, 124, 83, 26, 98, 8, 52, 88, 45, 11, 15, 6, 109, 71, 7, 21, 99,
+ 14, 118, 102, 2, 21, 87, 50, 68, 28, 98, 94, 15, 22, 45, 120, 44, 121, 70, 9, 54, 95, 64, 45,
+ 39, 25, 8, 88, 70, 73, 102, 59, 18, 34, 124, 20, 56, 1, 15, 19, 121, 46, 17, 100, 58, 123, 112,
+ 46, 83, 11, 31, 82, 63, 46, 84, 74, 76, 58, 90, 113, 20, 91, 63, 49, 54, 109, 40, 80, 77, 107,
+ 3, 2, 120, 33, 123, 17, 126, 66, 92, 84, 87, 119, 73, 119, 37, 87, 89, 98, 121, 7, 96, 32, 82,
+ 78, 17, 15, 87, 61, 79, 58, 102, 121, 79, 93, 46, 72, 12, 13, 61, 83, 57, 117, 80, 92, 15, 33,
+ 106, 103, 87, 87, 56, 7, 63, 59, 112, 25, 117, 31, 122, 1, 50, 109, 26, 48, 56, 40, 39, 85, 55,
+ 26, 72, 84, 73, 76, 18, 126, 54, 114, 30, 44, 18, 83, 124, 112, 87, 30, 100, 115, 65, 38, 113, 60,
+ 49, 18, 74, 30, 122, 114, 46, 81, 28, 42, 86, 62, 110, 103, 46, 24, 7, 4, 121, 23, 67, 45, 116,
+ 83, 34, 124, 91, 57, 127, 5, 2, 15, 86, 13, 102, 16, 32, 33, 4, 20, 11, 23, 14, 31, 81, 21,
+ 30, 28, 119, 122, 14, 14, 79, 107, 55, 96, 93, 47, 125, 35, 113, 80, 11, 43, 23, 10, 24, 30, 42,
+ 58, 41, 16, 34, 107, 92, 7, 29, 69, 70, 33, 4, 90, 59, 121, 52, 102, 67, 47, 81, 86, 105, 104,
+ 44, 102, 109, 49, 57, 23, 27, 96, 30, 108, 117, 63, 47, 18, 92, 70, 58, 9, 109, 108, 42, 40, 118,
+ 13, 99, 68, 25, 123, 92, 121, 56, 13, 87, 26, 33, 78, 60, 48, 124, 48, 5, 85, 123, 87, 110, 46,
+ 22, 115, 41, 27, 118, 29, 87, 63, 75, 23, 28, 17, 27, 122, 118, 14, 76, 34, 78, 6, 71, 1, 15,
+ 37, 107, 8, 118, 70, 17, 82, 51, 70, 11, 113, 34, 46, 23, 48, 52, 15, 80, 105, 24, 52, 53, 50,
+ 68, 111, 66, 117, 95, 71, 12, 20, 77, 49, 15, 118, 15, 120, 61, 57, 42, 107, 125, 17, 89, 100, 47,
+ 53, 38, 98, 53, 8, 35, 59, 93, 21, 73, 111, 96, 118, 58, 32, 94, 81, 110, 25, 98, 27, 126, 4,
+ 59, 89, 74, 7, 39, 60, 29, 38, 13, 120, 44, 12, 64, 63, 82, 116, 105, 1, 95, 56, 83, 71, 87,
+ 123, 111, 119, 66, 92, 109, 31, 35, 30, 2, 99, 3, 73, 26, 37, 23, 38, 82, 30, 27, 109, 113, 66,
+ 14, 66, 105, 59, 58, 39, 88, 52, 58, 106, 78, 80, 102, 2, 19, 36, 79, 1, 75, 61, 64, 84, 54,
+ 81, 74, 88, 98, 38, 50, 113, 67, 7, 48, 52, 120, 103, 39, 69, 40, 0, 39, 60, 93, 1, 92, 82,
+ 33, 74, 76, 119, 8, 8, 114, 66, 84, 54, 117, 58, 8, 60, 1, 13, 25, 58, 92, 83, 13, 4, 125,
+ 85, 23, 110, 96, 29, 63, 62, 66, 120, 101, 69, 96, 77, 119, 80, 16, 62, 23, 18, 96, 18, 43, 73,
+ 42, 1, 72, 100, 99, 72, 99, 94, 18, 26, 12, 119, 49, 115, 69, 107, 76, 63, 81, 60, 19, 98, 85,
+ 30, 72, 17, 110, 83, 115, 82, 51, 17, 106, 54, 69, 7, 86, 34, 33, 14, 65, 1, 31, 36, 18, 67,
+ 97, 54, 18, 11, 119, 13, 108, 29, 14, 109, 38, 98, 29, 101, 118, 103, 26, 42, 30, 50, 120, 85, 35,
+ 1, 49, 0, 20, 124, 8, 107, 119, 33, 22, 18, 121, 93, 72, 41, 62, 98, 122, 26, 3, 121, 54, 39,
+ 56, 49, 73, 27, 59, 31, 127, 15, 15, 31, 51, 29, 71, 69, 10, 67, 85, 104, 118, 87, 66, 99, 97,
+ 100, 107, 49, 11, 80, 71, 12, 70, 40, 41, 73, 62, 21, 72, 93, 85, 74, 26, 81, 3, 114, 50, 22,
+ 62, 102, 69, 10, 35, 95, 84, 18, 38, 111, 114, 9, 69, 83, 124, 53, 55, 113, 68, 43, 70, 103, 118,
+ 98, 103, 29, 62, 19, 83, 94, 119, 85, 31, 29, 59, 94, 70, 72, 25, 80, 94, 31, 35, 7, 34, 71,
+ 58, 34, 64, 58, 19, 6, 58, 47, 102, 86, 127, 102, 50, 23, 106, 79, 84, 17, 48, 100, 57, 85, 74,
+ 1, 63, 122, 15, 103, 62, 124, 52, 78, 102, 82, 43, 70, 64, 126, 81, 51, 89, 96, 4, 110, 89, 38,
+ 83, 9, 65, 16, 94, 97, 68, 23, 36, 107, 17, 115, 84, 17, 92, 83, 5, 93, 96, 5, 69, 69, 24,
+ 72, 64, 66, 55, 45, 32, 90, 79, 102, 81, 91, 66, 67, 102, 100, 67, 47, 50, 64, 45, 68, 10, 3,
+ 117, 37, 11, 4, 10, 103, 119, 95, 103, 78, 106, 3, 67, 23, 104, 69, 28, 81, 92, 70, 127, 43, 65,
+ 89, 42, 22, 15, 43, 41, 61, 36, 66, 106, 105, 4, 99, 65, 64, 122, 33, 76, 21, 114, 56, 27, 59,
+ 125, 126, 121, 124, 7, 49, 121, 87, 4, 90, 125, 125, 24, 44, 79, 95, 62, 97, 105, 66, 50, 110, 59,
+ 25, 110, 117, 27, 97, 86, 106, 126, 100, 65, 120, 99, 51, 85, 8, 17, 41, 121, 58, 110, 23, 57, 13,
+ 10, 23, 13, 49, 86, 9, 114, 40, 40, 66, 109, 18, 26, 45, 117, 75, 114, 21, 115, 120, 62, 9, 11,
+ 115, 98, 18, 26, 76, 48, 6, 45, 21, 23, 39, 116, 100, 103, 34, 53, 67, 50, 37, 66, 75, 81, 85,
+ 79, 97, 24, 111, 21, 35, 3, 39, 126, 8, 93, 98, 61, 28, 81, 24, 59, 47, 28, 102, 121, 27, 125,
+ 29, 101, 67, 53, 88, 109, 34, 52, 85, 76, 66, 11, 93, 12, 56, 92, 41, 14, 127, 115, 71, 38, 118,
+ 4, 85, 54, 69, 65, 71, 102, 99, 9, 34, 33, 9, 103, 99, 74, 89, 28, 18, 36, 109, 102, 87, 100,
+ 67, 13, 47, 22, 6, 9, 44, 31, 84, 126, 26, 96, 26, 71, 14, 125, 31, 48, 34, 69, 49, 80, 19,
+ 113, 50, 25, 45, 33, 7, 85, 110, 126, 108, 25, 2, 16, 111, 54, 13, 78, 85, 86, 104, 33, 114, 16,
+ 21, 63, 105, 4, 92, 119, 93, 35, 118, 26, 3, 40, 14, 3, 77, 16, 4, 6, 35, 24, 36, 48, 122,
+ 16, 114, 37, 34, 53, 36, 32, 3, 50, 6, 75, 97, 28, 92, 21, 22, 75, 47, 46, 43, 45, 95, 121,
+ 67, 89, 2, 117, 29, 116, 17, 83, 52, 14, 59, 15, 74, 92, 4, 37, 103, 4, 110, 108, 122, 71, 90,
+ 23, 77, 50, 111, 29, 33, 65, 120, 12, 46, 84, 118, 57, 41, 114, 86, 80, 75, 35, 96, 76, 91, 98,
+ 60, 5, 80, 29, 109, 74, 92, 120, 86, 62, 75, 102, 5, 70, 107, 108, 96, 46, 36, 35, 27, 71, 40,
+ 15, 78, 62, 58, 74, 55, 48, 47, 53, 22, 31, 81, 114, 30, 40, 84, 90, 85, 85, 69, 106, 63, 84,
+ 28, 66, 98, 117, 37, 106, 84, 66, 127, 112, 87, 28, 89, 1, 118, 37, 66, 57, 64, 125, 117, 5, 82,
+ 25, 9, 8, 12, 8, 82, 110, 43, 90, 2, 73, 86, 106, 45, 18, 77, 45, 38, 22, 6, 41, 6, 87,
+ 88, 90, 95, 48, 60, 121, 7, 21, 103, 19, 68, 107, 44, 76, 107, 102, 55, 98, 121, 100, 69, 114, 91,
+ 87, 17, 39, 41, 26, 48, 123, 96, 115, 126, 70, 71, 21, 89, 45, 22, 75, 103, 54, 37, 90, 103, 44,
+ 11, 26, 68, 7, 110, 58, 102, 29, 105, 97, 83, 15, 86, 51, 9, 97, 21, 28, 102, 41, 47, 26, 65,
+ 76, 39, 60, 15, 93, 82, 102, 118, 101, 35, 120, 46, 105, 103, 94, 14, 38, 106, 50, 13, 62, 25, 105,
+ 89, 69, 21, 54, 13, 31, 98, 107, 104, 35, 49, 112, 1, 52, 104, 100, 9, 2, 1, 93, 92, 106, 98,
+ 44, 88, 106, 36, 99, 21, 90, 50, 97, 58, 115, 7, 51, 126, 77, 124, 17, 1, 64, 22, 56, 14, 127,
+ 125, 5, 3, 15, 6, 30, 95, 24, 93, 48, 121, 23, 101, 10, 2, 83, 13, 19, 69, 117, 57, 1, 48,
+ 96, 90, 124, 17, 64, 97, 121, 56, 7, 60, 3, 32, 73, 55, 118, 34, 62, 75, 108, 2, 88, 91, 106,
+ 57, 2, 28, 61, 2, 107, 100, 39, 78, 121, 64, 125, 34, 113, 126, 108, 86, 97, 26, 96, 32, 78, 57,
+ 112, 9, 88, 23, 16, 99, 66, 87, 113, 92, 36, 78, 48, 4, 80, 54, 36, 2, 51, 46, 20, 64, 18,
+ 44, 66, 91, 80, 100, 94, 103, 90, 27, 3, 88, 69, 122, 68, 107, 55, 86, 45, 19, 51, 95, 33, 74,
+ 66, 92, 30, 71, 46, 23, 104, 44, 10, 116, 27, 54, 78, 27, 95, 121, 59, 87, 86, 98, 87, 54, 48,
+ 13, 73, 24, 92, 38, 106, 3, 10, 1, 21, 45, 32, 2, 36, 76, 115, 117, 108, 18, 112, 15, 103, 8,
+ 5, 77, 68, 65, 88, 100, 39, 21, 32, 63, 66, 123, 68, 87, 75, 39, 92, 103, 102, 75, 110, 76, 9,
+ 39, 100, 57, 113, 51, 61, 65, 89, 123, 33, 118, 92, 62, 117, 63, 71, 48, 29, 77, 81, 102, 59, 20,
+ 116, 107, 39, 54, 38, 39, 50, 66, 60, 87, 43, 81, 82, 55, 118, 107, 49, 61, 7, 76, 105, 84, 79,
+ 115, 27, 88, 46, 76, 8, 121, 64, 85, 8, 39, 29, 63, 35, 29, 76, 117, 7, 89, 31, 50, 125, 37,
+ 49, 114, 32, 99, 61, 120, 70, 126, 3, 110, 101, 29, 121, 110, 80, 22, 119, 120, 7, 64, 26, 117, 99,
+ 114, 81, 111, 47, 38, 59, 121, 5, 59, 39, 47, 37, 125, 30, 56, 60, 69, 92, 88, 32, 35, 35, 67,
+ 2, 0, 73, 70, 84, 93, 73, 11, 47, 75, 96, 33, 111, 48, 79, 48, 20, 11, 48, 18, 111, 119, 83,
+ 126, 124, 120, 48, 27, 4, 50, 13, 12, 84, 20, 27, 112, 83, 126, 9, 10, 119, 84, 118, 45, 44, 96,
+ 58, 125, 120, 20, 73, 4, 112, 24, 48, 53, 43, 13, 108, 87, 11, 20, 85, 97, 19, 108, 36, 29, 25,
+ 9, 51, 18, 115, 26, 77, 5, 36, 65, 33, 2, 2, 24, 118, 15, 106, 10, 66, 64, 121, 25, 4, 29,
+ 40, 41, 17, 6, 107, 66, 10, 56, 102, 43, 66, 76, 69, 91, 3, 31, 63, 17, 4, 35, 91, 13, 58,
+ 121, 99, 1, 44, 120, 37, 18, 26, 112, 10, 7, 48, 103, 99, 69, 24, 102, 93, 4, 43, 102, 74, 22,
+ 34, 63, 82, 35, 102, 54, 88, 78, 101, 96, 81, 14, 46, 92, 92, 87, 90, 112, 2, 55, 73, 122, 31,
+ 103, 24, 91, 84, 93, 77, 15, 93, 32, 41, 36, 69, 1, 43, 28, 39, 9, 35, 57, 29, 104, 44, 35,
+ 77, 86, 25, 22, 105, 78, 92, 48, 25, 61, 37, 117, 78, 30, 16, 23, 80, 108, 36, 60, 117, 25, 2,
+ 79, 54, 79, 56, 77, 28, 90, 31, 105, 67, 12, 93, 36, 45, 127, 124, 70, 92, 59, 100, 123, 15, 52,
+ 66, 87, 83, 24, 115, 17, 93, 49, 87, 78, 121, 122, 64, 69, 43, 69, 27, 42, 91, 40, 32, 77, 108,
+ 3, 109, 13, 96, 116, 27, 60, 79, 61, 2, 19, 124, 95, 43, 100, 88, 37, 47, 50, 102, 1, 64, 98,
+ 26, 76, 84, 45, 11, 114, 50, 8, 125, 53, 104, 18, 27, 32, 63, 20, 34, 109, 63, 123, 98, 101, 40,
+ 23, 99, 54, 35, 4, 121, 85, 51, 28, 38, 109, 104, 51, 123, 11, 65, 56, 50, 107, 85, 83, 25, 49,
+ 6, 118, 104, 111, 99, 53, 83, 23, 7, 81, 88, 64, 103, 35, 60, 33, 2, 69, 28, 32, 124, 39, 118,
+ 24, 104, 91, 77, 22, 66, 91, 85, 101, 1, 71, 35, 116, 85, 94, 80, 70, 70, 42, 127, 10, 53, 53,
+ 105, 29, 60, 44, 103, 35, 75, 80, 63, 121, 75, 37, 9, 88, 81, 118, 91, 57, 116, 48, 52, 10, 105,
+ 78, 121, 23, 6, 55, 58, 35, 85, 80, 62, 110, 109, 18, 52, 91, 66, 29, 37, 47, 76, 118, 4, 45,
+ 30, 28, 28, 16, 51, 58, 65, 19, 109, 26, 91, 56, 1, 7, 58, 52, 82, 104, 10, 120, 0, 71, 52,
+ 4, 106, 125, 123, 101, 99, 117, 13, 7, 105, 101, 30, 104, 7, 55, 64, 114, 76, 8, 91, 121, 40, 55,
+ 24, 55, 71, 20, 24, 17, 33, 63, 0, 73, 28, 86, 72, 53, 78, 118, 82, 89, 34, 73, 11, 71, 110,
+ 92, 87, 94, 6, 14, 65, 7, 61, 95, 121, 60, 30, 62, 93, 50, 122, 85, 32, 23, 31, 73, 121, 52,
+ 6, 11, 71, 61, 76, 110, 78, 102, 123, 34, 60, 88, 112, 78, 121, 27, 20, 97, 64, 53, 106, 0, 32,
+ 93, 126, 1, 45, 52, 74, 79, 70, 78, 49, 65, 17, 65, 82, 100, 62, 40, 33, 7, 17, 33, 35, 114,
+ 8, 90, 113, 89, 7, 2, 79, 80, 71, 65, 80, 13, 100, 116, 94, 92, 48, 91, 50, 32, 39, 68, 87,
+ 58, 122, 88, 28, 42, 13, 58, 70, 52, 92, 64, 55, 116, 98, 98, 74, 74, 24, 115, 20, 47, 47, 19,
+ 36, 5, 27, 8, 61, 82, 86, 20, 95, 107, 25, 76, 117, 97, 70, 97, 74, 118, 36, 89, 33, 18, 113,
+ 89, 3, 28, 92, 41, 115, 79, 15, 106, 77, 120, 15, 120, 13, 107, 21, 16, 41, 42, 85, 80, 120, 47,
+ 76, 73, 32, 9, 13, 7, 104, 107, 112, 101, 75, 42, 33, 34, 99, 80, 34, 126, 108, 60, 28, 92, 112,
+ 84, 99, 98, 90, 46, 71, 88, 11, 105, 70, 71, 18, 57, 89, 87, 122, 35, 85, 41, 36, 24, 36, 77,
+ 108, 41, 122, 114, 51, 29, 98, 109, 12, 59, 105, 87, 33, 51, 48, 58, 71, 126, 4, 62, 13, 27, 15,
+ 8, 86, 117, 117, 78, 31, 33, 106, 93, 125, 106, 51, 16, 82, 105, 9, 10, 26, 2, 88, 78, 114, 101,
+ 59, 115, 15, 26, 44, 50, 34, 75, 69, 52, 95, 57, 12, 60, 24, 52, 70, 11, 76, 81, 108, 74, 67,
+ 8, 88, 112, 90, 41, 58, 57, 38, 82, 18, 86, 112, 88, 67, 113, 54, 109, 119, 46, 107, 111, 68, 126,
+ 77, 50, 52, 105, 37, 62, 77, 39, 67, 81, 94, 47, 114, 93, 49, 35, 76, 73, 79, 2, 12, 109, 66,
+ 95, 104, 64, 110, 91, 66, 86, 31, 120, 78, 124, 56, 100, 46, 7, 60, 107, 66, 91, 18, 50, 31, 127,
+ 61, 9, 49, 109, 67, 109, 13, 49, 32, 89, 87, 26, 21, 107, 12, 76, 74, 65, 58, 1, 99, 84, 66,
+ 3, 11, 20, 26, 27, 42, 64, 63, 10, 27, 112, 32, 105, 122, 55, 113, 21, 2, 52, 102, 32, 84, 26,
+ 65, 16, 110, 8, 38, 78, 120, 17, 108, 38, 15, 87, 114, 110, 22, 72, 14, 39, 120, 116, 124, 58, 52,
+ 46, 68, 1, 104, 37, 108, 68, 31, 80, 106, 33, 116, 73, 76, 29, 5, 69, 99, 77, 60, 89, 19, 91,
+ 114, 19, 119, 81, 114, 119, 72, 25, 3, 40, 69, 30, 97, 36, 17, 62, 36, 69, 95, 116, 73, 113, 17,
+ 5, 116, 46, 117, 70, 46, 77, 26, 119, 113, 91, 0, 108, 3, 30, 91, 72, 99, 31, 0, 114, 92, 34,
+ 91, 56, 95, 66, 57, 46, 74, 110, 97, 71, 12, 110, 89, 18, 35, 51, 84, 35, 15, 18, 123, 45, 83,
+ 45, 80, 58, 101, 86, 24, 12, 49, 76, 81, 126, 28, 46, 15, 114, 37, 31, 118, 63, 41, 120, 44, 82,
+ 74, 104, 124, 87, 120, 109, 97, 19, 29, 55, 51, 89, 126, 119, 28, 37, 55, 9, 59, 31, 85, 56, 9,
+ 56, 101, 22, 93, 99, 103, 24, 37, 112, 3, 36, 87, 115, 41, 70, 99, 64, 46, 91, 96, 98, 41, 77,
+ 40, 68, 22, 7, 7, 21, 73, 26, 17, 18, 27, 4, 93, 45, 106, 125, 96, 81, 91, 56, 89, 62, 125,
+ 48, 62, 63, 113, 81, 7, 46, 125, 99, 80, 26, 22, 53, 68, 58, 40, 105, 79, 17, 25, 97, 17, 29,
+ 28, 53, 89, 14, 50, 5, 13, 94, 76, 20, 77, 12, 95, 117, 15, 31, 52, 32, 75, 25, 78, 23, 34,
+ 51, 125, 100, 23, 30, 115, 53, 28, 2, 114, 91, 26, 66, 109, 101, 9, 109, 48, 8, 104, 6, 85, 10,
+ 112, 15, 10, 109, 76, 79, 112, 16, 118, 88, 31, 126, 1, 98, 108, 24, 67, 84, 30, 0, 120, 126, 99,
+ 93, 28, 21, 31, 38, 92, 61, 105, 49, 105, 58, 23, 80, 28, 105, 45, 110, 54, 4, 19, 124, 68, 9,
+ 61, 2, 92, 100, 104, 3, 91, 98, 62, 80, 110, 73, 112, 57, 105, 43, 13, 62, 88, 98, 104, 99, 100,
+ 93, 109, 55, 23, 50, 37, 59, 46, 2, 3, 74, 17, 104, 93, 22, 56, 80, 121, 99, 8, 49, 10, 32,
+ 92, 54, 59, 59, 10, 111, 61, 62, 29, 55, 8, 64, 41, 14, 49, 93, 28, 100, 54, 3, 5, 23, 126,
+ 123, 69, 48, 94, 70, 61, 97, 61, 33, 3, 50, 26, 44, 82, 80, 47, 93, 105, 27, 70, 38, 50, 109,
+ 75, 47, 99, 62, 117, 106, 113, 6, 65, 54, 74, 1, 24, 113, 79, 85, 19, 64, 113, 28, 127, 72, 126,
+ 84, 13, 14, 48, 101, 107, 31, 3, 103, 31, 25, 31, 24, 30, 32, 64, 98, 112, 45, 95, 83, 57, 108,
+ 16, 66, 23, 97, 93, 85, 12, 88, 64, 67, 2, 122, 81, 114, 24, 113, 53, 90, 100, 82, 68, 81, 22,
+ 103, 12, 95, 76, 37, 88, 2, 61, 83, 46, 51, 126, 24, 8, 16, 118, 99, 25, 0, 70, 12, 76, 1,
+ 72, 123, 99, 105, 90, 90, 57, 87, 10, 9, 40, 40, 55, 10, 125, 78, 5, 109, 23, 38, 40, 21, 53,
+ 99, 79, 8, 19, 123, 109, 57, 88, 68, 91, 5, 17, 60, 9, 44, 122, 14, 31, 0, 26, 87, 105, 27,
+ 81, 48, 10, 7, 44, 93, 10, 52, 106, 79, 122, 82, 34, 122, 52, 105, 49, 36, 60, 8, 83, 10, 122,
+ 95, 33, 53, 82, 30, 1, 103, 87, 51, 118, 11, 33, 95, 56, 27, 12, 84, 33, 30, 84, 11, 2, 29,
+ 7, 4, 7, 28, 9, 100, 73, 55, 109, 19, 28, 28, 51, 16, 27, 9, 65, 71, 92, 27, 125, 2, 48,
+ 75, 49, 117, 114, 83, 55, 121, 122, 37, 13, 5, 35, 95, 96, 97, 21, 10, 29, 118, 97, 10, 60, 58,
+ 41, 126, 45, 89, 126, 92, 44, 47, 12, 7, 24, 120, 119, 116, 82, 50, 61, 110, 4, 43, 32, 109, 46,
+ 36, 41, 67, 43, 82, 39, 101, 67, 47, 87, 105, 115, 103, 109, 52, 44, 122, 29, 125, 113, 50, 84, 91,
+ 12, 23, 17, 9, 32, 85, 117, 48, 106, 73, 78, 11, 121, 56, 118, 22, 125, 53, 37, 100, 22, 77, 89,
+ 17, 76, 109, 9, 42, 70, 42, 62, 26, 96, 96, 102, 99, 32, 13, 102, 11, 45, 26, 76, 62, 12, 1,
+ 89, 90, 5, 28, 107, 71, 95, 27, 117, 15, 56, 30, 36, 101, 55, 107, 63, 20, 111, 81, 45, 20, 104,
+ 98, 118, 11, 117, 108, 47, 5, 63, 30, 94, 11, 96, 85, 35, 93, 109, 127, 39, 42, 96, 39, 9, 98,
+ 64, 110, 61, 81, 58, 88, 46, 79, 102, 95, 118, 50, 76, 105, 69, 25, 11, 9, 2, 97, 113, 56, 74,
+ 124, 34, 61, 109, 72, 106, 86, 3, 52, 88, 99, 39, 78, 89, 102, 79, 60, 6, 45, 1, 29, 10, 31,
+ 51, 70, 2, 50, 8, 100, 98, 82, 29, 19, 75, 60, 80, 4, 7, 36, 23, 12, 11, 62, 18, 68, 18,
+ 68, 38, 62, 82, 42, 103, 70, 36, 65, 110, 92, 8, 57, 82, 88, 106, 46, 24, 37, 46, 97, 37, 117,
+ 49, 112, 18, 40, 68, 13, 70, 85, 12, 120, 16, 80, 50, 52, 124, 44, 126, 108, 6, 91, 7, 34, 109,
+ 49, 5, 0, 102, 96, 124, 48, 27, 19, 52, 8, 55, 38, 8, 62, 10, 31, 31, 2, 50, 82, 61, 70,
+ 42, 111, 45, 32, 107, 37, 119, 102, 76, 8, 53, 99, 7, 16, 123, 21, 112, 36, 81, 66, 68, 100, 111,
+ 85, 22, 58, 107, 78, 0, 9, 96, 45, 79, 53, 72, 94, 48, 119, 50, 2, 53, 41, 120, 96, 32, 56,
+ 23, 10, 125, 124, 56, 15, 79, 13, 32, 61, 10, 111, 102, 16, 109, 31, 87, 63, 119, 127, 87, 5, 69,
+ 45, 109, 18, 70, 4, 116, 124, 124, 83, 32, 63, 85, 108, 3, 7, 81, 74, 20, 40, 49, 61, 48, 121,
+ 64, 66, 13, 103, 75, 125, 31, 116, 91, 86, 93, 89, 116, 8, 75, 40, 47, 123, 54, 55, 106, 122, 88,
+ 80, 81, 39, 28, 101, 5, 37, 50, 46, 28, 66, 31, 124, 12, 23, 113, 30, 80, 14, 10, 53, 74, 66,
+ 53, 57, 115, 52, 50, 111, 3, 101, 19, 59, 45, 31, 117, 28, 124, 120, 67, 51, 56, 89, 74, 24, 58,
+ 10, 62, 52, 41, 89, 93, 108, 114, 96, 100, 71, 55, 49, 7, 103, 92, 74, 78, 96, 29, 90, 14, 34,
+ 61, 59, 85, 101, 84, 10, 93, 14, 10, 66, 94, 38, 27, 85, 67, 8, 5, 53, 76, 115, 80, 27, 80,
+ 36, 49, 125, 99, 85, 116, 6, 97, 78, 51, 87, 110, 126, 65, 2, 58, 24, 3, 10, 94, 47, 1, 121,
+ 88, 75, 67, 116, 60, 17, 90, 21, 87, 34, 102, 123, 93, 109, 15, 80, 100, 11, 28, 16, 79, 126, 115,
+ 126, 77, 82, 108, 105, 96, 1, 100, 52, 40, 39, 80, 12, 96, 90, 116, 75, 94, 61, 117, 84, 86, 61,
+ 18, 10, 94, 30, 100, 84, 54, 41, 127, 79, 104, 67, 72, 36, 32, 119, 47, 123, 31, 107, 94, 3, 32,
+ 30, 35, 41, 44, 27, 112, 42, 61, 44, 126, 104, 115, 4, 106, 102, 108, 124, 34, 109, 81, 120, 55, 103,
+ 90, 91, 115, 50, 49, 6, 125, 88, 99, 34, 103, 28, 72, 34, 55, 4, 103, 119, 107, 102, 32, 98, 34,
+ 38, 25, 50, 70, 92, 11, 77, 87, 127, 91, 67, 8, 18, 62, 79, 95, 60, 82, 77, 72, 118, 38, 121,
+ 43, 53, 55, 96, 93, 79, 51, 80, 108, 117, 97, 103, 14, 15, 73, 82, 105, 119, 51, 55, 118, 31, 126,
+ 124, 28, 27, 126, 43, 12, 40, 71, 74, 17, 55, 40, 35, 4, 64, 125, 69, 43, 90, 47, 94, 27, 48,
+ 74, 100, 16, 9, 106, 10, 12, 59, 72, 9, 103, 8, 39, 21, 26, 90, 16, 49, 72, 105, 17, 114, 41,
+ 107, 37, 119, 82, 55, 97, 87, 7, 45, 22, 9, 51, 42, 14, 31, 54, 85, 122, 126, 60, 24, 104, 89,
+ 95, 14, 49, 61, 118, 17, 80, 80, 108, 53, 11, 116, 120, 22, 14, 112, 65, 22, 91, 53, 106, 109, 22,
+ 81, 39, 52, 60, 53, 93, 4, 73, 39, 10, 8, 40, 55, 35, 40, 124, 42, 62, 74, 97, 107, 3, 104,
+ 65, 65, 43, 48, 68, 89, 4, 101, 22, 97, 50, 4, 106, 104, 78, 60, 85, 82, 6, 96, 35, 4, 4,
+ 48, 106, 111, 71, 10, 90, 27, 82, 44, 87, 19, 94, 49, 91, 91, 118, 47, 93, 32, 47, 61, 115, 21,
+ 121, 14, 87, 46, 4, 67, 97, 54, 68, 103, 20, 85, 60, 41, 22, 105, 93, 45, 2, 81, 20, 64, 67,
+ 17, 87, 27, 82, 85, 14, 96, 94, 2, 8, 44, 17, 89, 107, 98, 18, 101, 64, 117, 91, 90, 63, 39,
+ 53, 50, 9, 122, 120, 30, 37, 104, 93, 50, 109, 67, 105, 4, 117, 42, 92, 61, 14, 62, 67, 72, 75,
+ 44, 18, 42, 100, 70, 120, 5, 91, 101, 105, 22, 87, 83, 79, 90, 21, 38, 76, 47, 120, 94, 26, 73,
+ 120, 74, 73, 102, 100, 113, 90, 124, 30, 0, 72, 111, 30, 112, 38, 26, 70, 119, 112, 24, 35, 126, 96,
+ 37, 60, 106, 14, 11, 33, 25, 56, 54, 117, 68, 65, 81, 111, 43, 91, 93, 68, 2, 43, 35, 52, 97,
+ 55, 71, 38, 16, 102, 35, 68, 75, 53, 78, 27, 64, 75, 109, 43, 60, 114, 22, 116, 15, 91, 108, 14,
+ 64, 52, 87, 67, 25, 0, 34, 98, 56, 124, 13, 87, 86, 31, 48, 68, 10, 119, 102, 76, 74, 88, 38,
+ 87, 38, 54, 33, 105, 123, 8, 33, 46, 117, 47, 22, 122, 100, 11, 73, 35, 15, 27, 73, 4, 60, 73,
+ 10, 44, 104, 122, 113, 115, 99, 114, 20, 41, 4, 90, 66, 34, 80, 97, 42, 42, 99, 63, 77, 45, 4,
+ 55, 113, 70, 44, 112, 23, 109, 120, 21, 43, 7, 102, 16, 18, 24, 32, 118, 112, 63, 122, 41, 31, 63,
+ 26, 16, 35, 7, 81, 89, 36, 1, 126, 68, 97, 104, 35, 7, 21, 59, 45, 79, 109, 12, 56, 49, 41,
+ 23, 55, 56, 32, 83, 3, 42, 65, 43, 67, 17, 62, 49, 95, 11, 104, 7, 55, 2, 38, 59, 5, 124,
+ 29, 11, 30, 21, 109, 103, 50, 51, 16, 31, 94, 67, 37, 89, 3, 20, 36, 127, 62, 91, 61, 113, 18,
+ 75, 99, 34, 103, 64, 96, 8, 92, 2, 108, 1, 103, 18, 48, 43, 107, 20, 39, 74, 88, 120, 115, 120,
+ 78, 80, 91, 11, 100, 101, 11, 7, 9, 72, 89, 84, 45, 63, 98, 73, 95, 52, 31, 48, 9, 127, 11,
+ 32, 32, 78, 26, 64, 14, 11, 89, 122, 5, 5, 49, 43, 24, 101, 21, 122, 64, 114, 117, 61, 39, 95,
+ 64, 19, 83, 83, 88, 106, 30, 62, 5, 71, 31, 9, 104, 59, 102, 103, 122, 71, 84, 74, 22, 26, 111,
+ 48, 1, 92, 115, 45, 64, 80, 117, 5, 89, 74, 33, 39, 41, 23, 16, 70, 15, 0, 86, 46, 67, 5,
+ 19, 33, 23, 125, 78, 102, 116, 43, 26, 108, 63, 65, 87, 14, 104, 24, 51, 111, 2, 92, 69, 87, 6,
+ 21, 23, 29, 61, 114, 113, 39, 90, 53, 60, 91, 79, 90, 59, 11, 37, 13, 124, 23, 18, 69, 59, 77,
+ 62, 13, 96, 51, 90, 47, 26, 89, 115, 93, 93, 18, 116, 54, 24, 106, 80, 99, 72, 44, 4, 14, 10,
+ 58, 58, 35, 47, 61, 87, 112, 71, 36, 29, 45, 69, 10, 64, 67, 86, 113, 108, 1, 92, 2, 122, 39,
+ 64, 55, 100, 31, 54, 21, 88, 51, 87, 33, 67, 121, 10, 105, 56, 122, 89, 39, 98, 15, 118, 52, 103,
+ 119, 50, 32, 2, 31, 82, 116, 44, 73, 110, 34, 4, 100, 28, 13, 17, 27, 97, 77, 94, 96, 53, 68,
+ 103, 14, 119, 101, 78, 41, 67, 117, 69, 70, 16, 51, 52, 3, 55, 58, 48, 41, 53, 93, 62, 102, 73,
+ 95, 80, 62, 72, 50, 35, 3, 7, 71, 91, 60, 84, 93, 45, 34, 108, 40, 39, 87, 38, 81, 48, 20,
+ 7, 19, 8, 84, 56, 2, 43, 126, 83, 67, 68, 11, 48, 56, 31, 81, 20, 44, 15, 9, 23, 95, 118,
+ 61, 123, 80, 18, 39, 27, 26, 42, 121, 85, 31, 119, 99, 43, 17, 87, 85, 75, 36, 28, 12, 25, 77,
+ 103, 47, 112, 76, 16, 126, 39, 80, 1, 122, 44, 21, 18, 14, 100, 58, 47, 58, 42, 29, 40, 103, 84,
+ 65, 49, 46, 13, 53, 123, 4, 108, 16, 27, 114, 79, 86, 103, 88, 29, 37, 115, 81, 41, 69, 15, 17,
+ 97, 73, 59, 56, 57, 70, 61, 66, 84, 41, 9, 107, 86, 120, 61, 6, 10, 114, 79, 26, 86, 26, 20,
+ 7, 52, 29, 127, 40, 110, 36, 71, 45, 64, 17, 1, 68, 46, 78, 114, 26, 28, 117, 118, 95, 34, 68,
+ 121, 90, 9, 113, 111, 30, 34, 30, 3, 1, 111, 96, 50, 24, 89, 62, 115, 14, 33, 78, 111, 5, 73,
+ 25, 115, 81, 50, 27, 48, 25, 2, 49, 85, 81, 62, 28, 87, 58, 98, 28, 67, 3, 21, 16, 82, 48,
+ 41, 112, 114, 47, 105, 6, 48, 10, 64, 43, 124, 71, 12, 28, 6, 11, 3, 79, 96, 111, 33, 62, 83,
+ 93, 60, 21, 7, 26, 113, 10, 89, 90, 88, 11, 1, 82, 116, 1, 73, 64, 81, 65, 36, 20, 109, 119,
+ 8, 28, 18, 89, 50, 124, 63, 2, 78, 1, 41, 37, 97, 61, 26, 126, 111, 114, 115, 69, 80, 1, 10,
+ 102, 49, 101, 22, 62, 42, 125, 96, 50, 114, 35, 26, 105, 90, 48, 95, 58, 121, 27, 61, 2, 114, 34,
+ 114, 101, 0, 49, 102, 47, 92, 99, 72, 3, 107, 77, 102, 115, 83, 7, 75, 35, 13, 106, 66, 127, 122,
+ 74, 89, 31, 86, 91, 51, 110, 48, 51, 119, 71, 3, 116, 60, 56, 53, 7, 77, 40, 25, 60, 113, 109,
+ 10, 100, 88, 102, 23, 125, 105, 76, 16, 72, 84, 12, 75, 5, 117, 105, 19, 112, 36, 101, 4, 107, 122,
+ 74, 98, 62, 33, 0, 85, 1, 104, 29, 71, 26, 78, 69, 79, 113, 45, 105, 33, 104, 32, 76, 98, 119,
+ 52, 26, 124, 71, 8, 10, 27, 23, 35, 102, 38, 26, 87, 114, 10, 30, 84, 107, 69, 67, 9, 115, 73,
+ 53, 36, 45, 37, 123, 95, 119, 68, 40, 16, 33, 91, 100, 16, 82, 54, 53, 71, 2, 106, 105, 62, 100,
+ 83, 50, 4, 107, 3, 119, 49, 33, 22, 103, 71, 64, 42, 86, 124, 115, 102, 120, 2, 40, 127, 97, 101,
+ 107, 23, 3, 121, 78, 10, 45, 93, 82, 65, 87, 72, 33, 22, 97, 25, 100, 106, 114, 27, 3, 84, 111,
+ 17, 29, 71, 6, 126, 17, 58, 80, 32, 81, 64, 9, 126, 69, 64, 72, 15, 56, 22, 116, 126, 5, 96,
+ 3, 3, 8, 46, 38, 98, 102, 36, 77, 53, 91, 117, 124, 50, 24, 11, 102, 120, 117, 24, 98, 103, 98,
+ 90, 3, 100, 26, 48, 109, 7, 40, 58, 97, 95, 43, 114, 78, 44, 55, 125, 18, 94, 25, 125, 49, 72,
+ 106, 1, 91, 36, 9, 96, 53, 123, 126, 23, 90, 19, 92, 5, 41, 121, 26, 113, 64, 108, 37, 122, 124,
+ 112, 3, 38, 18, 89, 38, 19, 94, 56, 27, 13, 64, 61, 73, 61, 106, 80, 70, 63, 3, 103, 87, 74,
+ 74, 76, 77, 68, 70, 89, 61, 115, 115, 38, 113, 3, 19, 17, 22, 116, 57, 34, 67, 16, 39, 59, 62,
+ 43, 109, 51, 35, 0, 66, 7, 85, 63, 95, 122, 102, 6, 2, 64, 39, 14, 93, 18, 40, 52, 109, 27,
+ 117, 35, 62, 84, 2, 12, 39, 27, 20, 26, 3, 9, 102, 42, 94, 85, 27, 16, 33, 46, 18, 97, 71,
+ 123, 101, 3, 62, 71, 126, 106, 99, 89, 22, 124, 28, 13, 53, 110, 10, 91, 16, 93, 37, 74, 33, 44,
+ 31, 4, 89, 90, 96, 38, 110, 111, 13, 105, 100, 74, 19, 71, 113, 53, 102, 28, 26, 0, 55, 49, 0,
+ 83, 80, 11, 21, 12, 25, 8, 33, 46, 15, 74, 114, 41, 97, 35, 89, 71, 108, 57, 4, 32, 36, 65,
+ 37, 62, 3, 115, 63, 1, 68, 30, 4, 106, 89, 35, 94, 28, 101, 126, 115, 27, 26, 37, 109, 17, 75,
+ 64, 1, 108, 8, 27, 32, 63, 71, 14, 55, 4, 121, 115, 78, 26, 96, 91, 71, 101, 19, 21, 111, 4,
+ 40, 20, 97, 115, 72, 77, 10, 65, 67, 26, 17, 78, 4, 104, 105, 8, 81, 65, 19, 74, 81, 54, 83,
+ 121, 56, 118, 107, 48, 49, 49, 5, 78, 68, 58, 109, 98, 87, 110, 21, 51, 107, 27, 97, 39, 57, 122,
+ 20, 48, 96, 79, 12, 58, 122, 46, 10, 84, 20, 15, 38, 123, 84, 57, 22, 14, 6, 65, 0, 16, 76,
+ 121, 55, 6, 60, 23, 7, 50, 81, 73, 69, 21, 63, 39, 63, 13, 92, 60, 98, 117, 89, 59, 23, 70,
+ 8, 16, 11, 109, 10, 18, 111, 63, 105, 76, 56, 25, 49, 82, 114, 94, 123, 117, 96, 90, 26, 78, 36,
+ 19, 11, 46, 82, 114, 13, 82, 23, 101, 25, 65, 24, 56, 8, 107, 21, 127, 51, 127, 51, 52, 37, 49,
+ 100, 12, 126, 78, 35, 4, 126, 33, 64, 39, 19, 97, 60, 111, 32, 3, 25, 73, 57, 89, 59, 63, 80,
+ 54, 24, 67, 95, 60, 18, 74, 95, 105, 35, 94, 94, 29, 85, 32, 34, 40, 40, 115, 1, 13, 13, 125,
+ 109, 107, 103, 99, 17, 60, 120, 108, 109, 111, 90, 65, 107, 39, 52, 101, 75, 91, 59, 92, 43, 122, 38,
+ 112, 13, 125, 27, 48, 117, 122, 37, 119, 115, 53, 116, 53, 53, 58, 50, 48, 85, 46, 12, 92, 108, 7,
+ 78, 58, 51, 14, 97, 93, 80, 18, 68, 53, 14, 10, 17, 89, 85, 74, 59, 6, 31, 96, 3, 58, 103,
+ 23, 60, 76, 127, 94, 60, 103, 40, 79, 82, 94, 97, 7, 127, 51, 47, 86, 81, 78, 12, 107, 11, 31,
+ 47, 3, 16, 105, 29, 97, 66, 89, 71, 7, 72, 70, 52, 14, 28, 86, 89, 72, 77, 77, 17, 89, 13,
+ 96, 37, 113, 27, 33, 65, 23, 46, 39, 42, 41, 45, 82, 53, 71, 92, 64, 39, 101, 120, 28, 32, 75,
+ 47, 52, 90, 57, 94, 70, 117, 9, 105, 99, 8, 89, 40, 56, 44, 119, 117, 73, 21, 49, 64, 87, 1,
+ 79, 30, 121, 50, 89, 47, 45, 82, 35, 5, 92, 109, 66, 44, 76, 80, 37, 124, 51, 76, 118, 114, 68,
+ 124, 87, 97, 98, 121, 64, 19, 84, 81, 86, 105, 72, 12, 8, 83, 126, 86, 99, 25, 49, 109, 25, 25,
+ 104, 118, 94, 22, 45, 106, 88, 58, 21, 93, 90, 21, 81, 38, 67, 7, 10, 95, 108, 31, 46, 81, 50,
+ 18, 26, 110, 114, 6, 109, 90, 26, 57, 35, 54, 65, 55, 115, 115, 115, 55, 24, 79, 70, 82, 11, 54,
+ 31, 79, 93, 37, 5, 95, 104, 125, 52, 117, 46, 111, 90, 80, 82, 53, 16, 124, 15, 6, 28, 37, 113,
+ 37, 55, 28, 71, 1, 126, 22, 32, 109, 114, 17, 78, 72, 117, 86, 116, 123, 50, 21, 83, 115, 56, 73,
+ 36, 45, 39, 20, 2, 1, 109, 52, 22, 61, 108, 102, 115, 64, 104, 32, 11, 105, 74, 108, 105, 102, 44,
+ 77, 63, 50, 42, 99, 71, 116, 31, 100, 43, 95, 121, 56, 50, 66, 96, 53, 57, 17, 41, 66, 109, 85,
+ 75, 52, 42, 29, 11, 116, 85, 113, 122, 106, 80, 73, 125, 58, 62, 69, 66, 73, 127, 14, 64, 4, 119,
+ 122, 60, 2, 68, 126, 86, 118, 69, 6, 75, 7, 64, 127, 93, 6, 98, 80, 92, 42, 125, 125, 111, 28,
+ 67, 28, 103, 54, 44, 56, 78, 95, 108, 119, 117, 101, 96, 82, 18, 59, 83, 93, 123, 42, 38, 100, 33,
+ 42, 73, 119, 60, 127, 95, 48, 60, 12, 14, 32, 123, 8, 104, 22, 6, 23, 123, 44, 19, 60, 13, 17,
+ 37, 22, 88, 34, 67, 14, 49, 105, 46, 61, 110, 105, 73, 88, 51, 113, 46, 57, 106, 109, 22, 72, 5,
+ 95, 62, 74, 60, 117, 59, 98, 63, 32, 62, 117, 53, 88, 59, 117, 51, 54, 60, 127, 123, 97, 105, 63,
+ 33, 94, 32, 10, 121, 83, 37, 12, 56, 21, 98, 122, 62, 61, 56, 68, 92, 110, 16, 87, 104, 56, 105,
+ 106, 32, 36, 115, 105, 74, 126, 69, 81, 86, 66, 74, 97, 69, 77, 99, 92, 103, 35, 3, 34, 118, 99,
+ 74, 91, 25, 119, 60, 53, 96, 126, 35, 76, 42, 69, 12, 19, 112, 116, 54, 96, 74, 32, 86, 64, 51,
+ 27, 5, 21, 34, 43, 22, 15, 74, 27, 116, 6, 82, 24, 11, 41, 26, 3, 29, 103, 110, 98, 92, 46,
+ 1, 27, 127, 3, 70, 101, 63, 25, 98, 54, 25, 61, 7, 38, 64, 75, 69, 31, 70, 83, 70, 104, 65,
+ 106, 58, 117, 68, 85, 83, 36, 93, 70, 25, 14, 117, 120, 104, 9, 8, 77, 26, 88, 68, 114, 38, 108,
+ 99, 86, 71, 114, 36, 69, 70, 92, 31, 63, 106, 86, 102, 109, 70, 14, 126, 110, 19, 95, 13, 46, 62,
+ 107, 53, 105, 116, 36, 4, 59, 37, 66, 9, 120, 76, 80, 34, 49, 98, 49, 91, 39, 100, 108, 15, 42,
+ 11, 90, 93, 32, 6, 59, 105, 27, 109, 105, 118, 108, 102, 114, 106, 103, 124, 72, 76, 61, 38, 65, 3,
+ 10, 116, 39, 67, 1, 19, 91, 48, 7, 120, 106, 15, 35, 13, 20, 95, 69, 24, 39, 122, 81, 99, 100,
+ 103, 8, 32, 115, 14, 122, 72, 100, 84, 107, 120, 84, 26, 9, 93, 94, 66, 76, 82, 83, 15, 18, 75,
+ 31, 77, 71, 59, 44, 84, 9, 2, 13, 21, 84, 106, 94, 124, 43, 46, 5, 96, 100, 74, 50, 76, 87,
+ 105, 107, 34, 83, 100, 44, 51, 57, 15, 124, 106, 115, 118, 63, 98, 83, 49, 93, 56, 105, 52, 91, 49,
+ 125, 94, 67, 40, 126, 11, 15, 98, 7, 69, 4, 8, 68, 60, 94, 113, 52, 107, 30, 58, 47, 23, 67,
+ 74, 101, 63, 28, 125, 13, 97, 85, 76, 8, 81, 16, 79, 94, 42, 91, 24, 40, 41, 118, 22, 43, 93,
+ 54, 45, 20, 115, 56, 105, 117, 17, 48, 43, 20, 118, 79, 119, 9, 90, 108, 57, 4, 39, 123, 17, 60,
+ 14, 78, 16, 118, 19, 120, 27, 71, 116, 107, 96, 44, 1, 79, 37, 124, 35, 78, 110, 47, 16, 73, 85,
+ 119, 40, 40, 41, 13, 10, 81, 71, 95, 81, 48, 53, 92, 86, 100, 36, 108, 68, 2, 37, 96, 108, 94,
+ 110, 84, 127, 61, 116, 29, 47, 56, 86, 98, 33, 78, 126, 20, 88, 8, 100, 30, 78, 60, 121, 115, 6,
+ 87, 14, 3, 6, 32, 92, 104, 1, 7, 27, 63, 41, 40, 11, 99, 82, 102, 103, 95, 87, 118, 121, 59,
+ 93, 99, 28, 53, 48, 122, 37, 13, 62, 13, 100, 27, 57, 20, 97, 42, 89, 44, 43, 23, 9, 73, 63,
+ 65, 91, 109, 22, 32, 48, 40, 87, 86, 31, 90, 90, 109, 117, 28, 84, 50, 46, 35, 109, 62, 25, 15,
+ 126, 73, 96, 0, 31, 12, 72, 108, 54, 35, 80, 117, 96, 43, 108, 88, 126, 121, 70, 58, 52, 64, 21,
+ 8, 59, 56, 90, 80, 102, 105, 114, 9, 41, 96, 68, 5, 9, 108, 3, 90, 118, 20, 22, 51, 91, 43,
+ 123, 39, 32, 11, 79, 67, 118, 109, 11, 9, 64, 125, 75, 50, 53, 65, 24, 116, 103, 52, 53, 102, 115,
+ 53, 84, 112, 104, 124, 53, 110, 119, 113, 103, 15, 109, 37, 37, 123, 43, 42, 56, 88, 93, 114, 7, 121,
+ 54, 64, 19, 108, 77, 109, 59, 65, 127, 0, 60, 5, 105, 74, 119, 64, 124, 5, 57, 26, 56, 119, 7,
+ 81, 7, 16, 88, 18, 77, 26, 66, 23, 85, 9, 71, 68, 8, 97, 14, 81, 121, 89, 122, 89, 70, 19,
+ 120, 50, 125, 92, 60, 6, 94, 42, 65, 98, 52, 126, 8, 90, 88, 38, 40, 32, 57, 11, 1, 5, 83,
+ 93, 31, 24, 59, 50, 115, 18, 52, 77, 88, 71, 10, 107, 46, 8, 66, 120, 12, 52, 107, 113, 46, 29,
+ 96, 118, 91, 21, 125, 59, 89, 108, 121, 96, 56, 32, 62, 124, 24, 23, 106, 50, 122, 40, 53, 97, 19,
+ 20, 88, 101, 11, 43, 18, 44, 30, 42, 51, 80, 90, 39, 77, 46, 43, 108, 32, 127, 119, 71, 107, 33,
+ 43, 107, 2, 23, 17, 8, 10, 64, 29, 78, 22, 115, 87, 46, 75, 123, 40, 72, 76, 126, 95, 51, 16,
+ 7, 46, 108, 80, 93, 12, 37, 60, 45, 66, 86, 32, 49, 4, 34, 5, 16, 29, 33, 78, 115, 9, 45,
+ 72, 8, 110, 109, 26, 4, 17, 109, 121, 43, 31, 57, 87, 63, 67, 6, 33, 126, 74, 44, 117, 18, 61,
+ 4, 45, 6, 37, 47, 120, 33, 8, 30, 13, 52, 120, 18, 61, 78, 32, 102, 114, 122, 96, 5, 51, 91,
+ 1, 66, 92, 120, 7, 38, 109, 111, 79, 103, 5, 118, 90, 117, 24, 99, 124, 81, 40, 63, 115, 49, 41,
+ 67, 81, 3, 10, 4, 21, 25, 99, 4, 32, 39, 115, 11, 27, 20, 20, 108, 48, 27, 43, 44, 49, 16,
+ 30, 119, 42, 8, 61, 104, 49, 117, 11, 54, 14, 77, 33, 63, 36, 15, 105, 41, 85, 121, 28, 31, 30,
+ 114, 21, 126, 38, 74, 83, 89, 105, 74, 118, 22, 62, 48, 87, 18, 16, 125, 38, 70, 75, 30, 45, 104,
+ 63, 60, 37, 80, 93, 7, 91, 53, 17, 111, 102, 39, 61, 45, 40, 107, 27, 122, 62, 54, 50, 86, 41,
+ 55, 5, 125, 13, 14, 39, 81, 47, 54, 75, 38, 42, 94, 52, 59, 124, 21, 118, 85, 12, 28, 40, 29,
+ 40, 27, 43, 45, 53, 73, 4, 6, 51, 86, 113, 19, 105, 93, 117, 21, 88, 17, 101, 108, 84, 100, 13,
+ 51, 105, 61, 48, 34, 80, 10, 45, 5, 126, 86, 64, 11, 57, 19, 94, 122, 38, 68, 49, 23, 38, 116,
+ 47, 76, 77, 9, 76, 126, 48, 48, 69, 61, 9, 14, 70, 9, 31, 36, 25, 89, 114, 35, 92, 16, 27,
+ 80, 110, 115, 37, 53, 121, 2, 37, 0, 12, 109, 83, 80, 50, 36, 42, 85, 23, 103, 80, 45, 17, 118,
+ 107, 71, 42, 78, 35, 38, 31, 65, 85, 125, 111, 26, 35, 37, 85, 12, 32, 100, 114, 40, 74, 122, 10,
+ 35, 23, 71, 61, 14, 37, 32, 29, 119, 33, 102, 87, 50, 92, 18, 112, 88, 32, 68, 67, 7, 46, 85,
+ 88, 93, 57, 58, 12, 3, 62, 27, 102, 39, 98, 89, 50, 4, 12, 70, 15, 24, 115, 40, 53, 69, 26,
+ 99, 36, 44, 112, 93, 62, 80, 119, 109, 76, 53, 55, 125, 3, 31, 37, 91, 55, 14, 41, 30, 87, 106,
+ 86, 12, 111, 65, 104, 40, 71, 104, 25, 28, 84, 91, 7, 126, 78, 38, 63, 70, 45, 99, 58, 111, 23,
+ 80, 7, 108, 69, 50, 70, 88, 125, 51, 57, 125, 21, 115, 91, 22, 97, 9, 86, 100, 8, 92, 112, 21,
+ 13, 54, 64, 81, 115, 65, 73, 74, 77, 87, 18, 26, 11, 87, 58, 112, 124, 97, 29, 43, 25, 47, 77,
+ 56, 10, 19, 5, 84, 114, 74, 15, 33, 89, 7, 115, 23, 64, 60, 17, 100, 34, 75, 33, 97, 2, 16,
+ 47, 3, 101, 119, 33, 39, 118, 37, 94, 106, 78, 54, 48, 55, 82, 43, 57, 80, 34, 110, 39, 76, 6,
+ 44, 43, 41, 70, 15, 31, 102, 59, 12, 95, 95, 6, 76, 108, 111, 110, 85, 110, 15, 7, 61, 124, 90,
+ 25, 81, 99, 56, 91, 13, 28, 4, 70, 24, 53, 70, 83, 27, 45, 20, 110, 29, 77, 71, 52, 95, 23,
+ 90, 56, 57, 33, 61, 27, 122, 67, 68, 1, 33, 44, 51, 40, 4, 102, 25, 13, 62, 59, 105, 6, 70,
+ 16, 88, 44, 7, 99, 43, 91, 95, 13, 35, 9, 23, 91, 12, 7, 85, 8, 112, 76, 34, 21, 104, 53,
+ 43, 22, 99, 38, 33, 114, 104, 44, 89, 90, 52, 78, 101, 70, 111, 45, 78, 16, 41, 107, 28, 25, 84,
+ 124, 95, 48, 35, 54, 0, 86, 103, 94, 17, 19, 26, 105, 53, 43, 119, 18, 65, 119, 40, 66, 78, 6,
+ 118, 80, 8, 55, 105, 116, 21, 54, 44, 20, 25, 94, 107, 13, 93, 122, 78, 124, 47, 57, 71, 76, 94,
+ 10, 8, 17, 49, 81, 41, 44, 78, 76, 16, 30, 14, 35, 86, 51, 98, 66, 29, 115, 103, 59, 62, 4,
+ 88, 89, 110, 61, 46, 82, 47, 38, 69, 47, 36, 90, 118, 23, 62, 23, 44, 71, 93, 25, 71, 14, 15,
+ 69, 23, 32, 76, 66, 55, 12, 55, 56, 107, 123, 77, 118, 27, 7, 53, 46, 122, 101, 12, 4, 19, 117,
+ 39, 48, 19, 38, 96, 65, 27, 91, 108, 104, 114, 103, 82, 40, 45, 49, 31, 36, 52, 41, 81, 47, 47,
+ 38, 121, 115, 78, 87, 90, 18, 79, 19, 100, 36, 20, 48, 42, 38, 75, 43, 56, 103, 97, 1, 96, 8,
+ 22, 86, 26, 108, 62, 112, 96, 17, 73, 92, 81, 20, 82, 70, 3, 91, 77, 58, 68, 48, 3, 87, 76,
+ 70, 35, 84, 1, 78, 62, 81, 2, 83, 5, 125, 112, 91, 88, 74, 22, 121, 91, 115, 27, 114, 78, 116,
+ 69, 71, 86, 7, 1, 31, 103, 120, 123, 106, 87, 59, 105, 72, 8, 2, 66, 3, 6, 10, 5, 9, 56,
+ 44, 34, 6, 75, 45, 40, 125, 7, 32, 104, 3, 35, 5, 81, 101, 83, 58, 56, 81, 122, 63, 15, 43,
+ 100, 21, 106, 23, 55, 64, 24, 23, 73, 119, 22, 97, 110, 46, 79, 12, 31, 49, 117, 65, 93, 95, 75,
+ 59, 75, 86, 88, 46, 89, 1, 108, 94, 11, 62, 8, 113, 75, 40, 98, 92, 6, 19, 109, 76, 42, 117,
+ 61, 125, 16, 72, 123, 19, 95, 67, 5, 70, 75, 11, 18, 19, 14, 70, 122, 47, 87, 110, 22, 97, 107,
+ 59, 50, 88, 39, 75, 48, 19, 27, 36, 99, 90, 53, 9, 43, 42, 121, 126, 37, 13, 83, 115, 111, 22,
+ 21, 117, 58, 73, 21, 54, 106, 10, 50, 37, 38, 99, 33, 22, 40, 91, 64, 12, 26, 78, 49, 93, 10,
+ 127, 100, 53, 89, 50, 12, 33, 48, 71, 75, 111, 22, 44, 83, 98, 87, 17, 39, 80, 67, 11, 74, 123,
+ 14, 48, 59, 78, 51, 35, 108, 24, 7, 39, 94, 117, 94, 0, 53, 105, 1, 119, 3, 6, 53, 115, 12,
+ 86, 110, 121, 76, 2, 120, 32, 38, 93, 19, 2, 28, 117, 89, 61, 55, 102, 101, 24, 125, 4, 105, 81,
+ 72, 19, 120, 80, 92, 80, 11, 54, 118, 80, 4, 32, 56, 37, 65, 97, 68, 122, 36, 22, 85, 90, 2,
+ 56, 56, 117, 0, 63, 24, 124, 76, 78, 109, 31, 0, 3, 93, 64, 72, 95, 80, 29, 55, 54, 27, 28,
+ 82, 101, 25, 82, 71, 42, 17, 56, 25, 69, 26, 122, 59, 62, 101, 22, 23, 15, 57, 38, 108, 90, 55,
+ 74, 64, 110, 55, 117, 36, 57, 21, 38, 36, 115, 36, 97, 100, 48, 69, 60, 52, 85, 74, 114, 41, 8,
+ 98, 95, 26, 26, 79, 103, 12, 27, 96, 125, 66, 67, 27, 124, 40, 53, 41, 20, 110, 33, 90, 64, 4,
+ 27, 26, 76, 60, 101, 18, 6, 32, 99, 67, 4, 8, 9, 82, 122, 41, 96, 13, 65, 97, 5, 63, 19,
+ 26, 120, 5, 48, 7, 8, 37, 92, 52, 22, 43, 78, 10, 36, 107, 99, 120, 78, 14, 108, 26, 90, 113,
+ 5, 65, 24, 74, 109, 66, 99, 74, 76, 87, 39, 50, 19, 40, 13, 126, 77, 112, 45, 106, 64, 96, 71,
+ 107, 64, 47, 4, 108, 34, 42, 31, 92, 31, 64, 56, 60, 82, 119, 36, 95, 127, 97, 73, 78, 38, 78,
+ 59, 13, 1, 59, 68, 127, 20, 47, 10, 118, 119, 44, 45, 127, 69, 63, 84, 106, 44, 25, 119, 104, 102,
+ 71, 83, 26, 71, 21, 26, 111, 45, 12, 91, 53, 118, 55, 116, 104, 82, 25, 6, 99, 47, 78, 30, 17,
+ 40, 65, 116, 108, 102, 66, 4, 104, 27, 32, 62, 16, 85, 30, 92, 123, 13, 101, 64, 71, 48, 55, 71,
+ 14, 41, 65, 98, 1, 22, 73, 48, 58, 89, 46, 59, 72, 72, 126, 76, 0, 21, 37, 117, 83, 11, 9,
+ 45, 8, 94, 27, 63, 1, 32, 44, 54, 82, 124, 65, 58, 91, 81, 93, 50, 39, 125, 28, 42, 9, 59,
+ 95, 75, 68, 52, 43, 123, 122, 74, 31, 102, 120, 95, 59, 93, 38, 117, 114, 72, 117, 31, 35, 25, 93,
+ 39, 74, 53, 107, 51, 6, 29, 15, 82, 47, 73, 14, 52, 75, 12, 75, 69, 13, 13, 45, 103, 121, 36,
+ 77, 105, 70, 53, 54, 37, 78, 94, 110, 109, 79, 118, 81, 36, 76, 78, 100, 22, 111, 111, 114, 61, 43,
+ 120, 113, 125, 25, 126, 14, 69, 82, 107, 36, 0, 40, 120, 126, 108, 27, 93, 17, 12, 56, 48, 45, 109,
+ 109, 52, 45, 43, 13, 2, 10, 88, 30, 22, 127, 2, 106, 16, 43, 87, 6, 31, 109, 87, 39, 108, 114,
+ 86, 39, 121, 89, 127, 49, 49, 12, 22, 114, 85, 59, 77, 52, 61, 54, 32, 59, 2, 41, 93, 31, 31,
+ 0, 95, 24, 17, 71, 44, 21, 27, 26, 6, 89, 17, 108, 12, 53, 100, 28, 110, 121, 8, 56, 66, 115,
+ 30, 23, 53, 55, 2, 114, 86, 111, 15, 78, 50, 50, 1, 49, 39, 77, 62, 9, 12, 118, 119, 114, 96,
+ 48, 8, 5, 92, 92, 94, 85, 51, 47, 93, 14, 2, 38, 65, 42, 13, 50, 65, 7, 4, 77, 87, 7,
+ 30, 32, 51, 81, 122, 25, 55, 59, 16, 69, 63, 71, 96, 99, 57, 14, 32, 79, 123, 33, 37, 38, 44,
+ 14, 82, 45, 24, 27, 89, 25, 23, 37, 29, 31, 63, 41, 48, 115, 115, 46, 33, 107, 3, 71, 98, 35,
+ 32, 41, 19, 122, 40, 95, 87, 45, 17, 24, 11, 77, 119, 86, 71, 25, 123, 114, 8, 49, 49, 71, 91,
+ 96, 88, 42, 81, 127, 34, 82, 124, 48, 79, 20, 16, 118, 66, 123, 124, 45, 7, 51, 73, 44, 88, 37,
+ 28, 55, 120, 6, 10, 77, 119, 92, 52, 115, 82, 21, 124, 66, 26, 39, 76, 91, 10, 6, 81, 96, 45,
+ 118, 39, 101, 61, 66, 79, 103, 71, 40, 50, 21, 15, 52, 104, 14, 100, 35, 21, 55, 88, 37, 125, 8,
+ 117, 45, 113, 10, 16, 32, 85, 125, 112, 56, 81, 123, 3, 80, 117, 7, 111, 6, 60, 50, 53, 76, 67,
+ 40, 119, 102, 7, 118, 72, 107, 48, 72, 29, 53, 69, 88, 87, 10, 120, 33, 38, 39, 89, 35, 23, 119,
+ 75, 44, 8, 66, 113, 94, 70, 16, 95, 91, 79, 99, 68, 56, 4, 52, 66, 39, 68, 5, 104, 59, 80,
+ 79, 26, 33, 102, 67, 41, 89, 70, 111, 30, 91, 64, 60, 49, 82, 62, 38, 46, 43, 50, 112, 79, 29,
+ 98, 30, 18, 2, 45, 68, 119, 94, 97, 13, 5, 0, 46, 43, 71, 17, 49, 1, 41, 61, 65, 7, 12,
+ 34, 12, 39, 33, 4, 92, 14, 3, 45, 10, 15, 121, 13, 65, 81, 7, 46, 82, 112, 52, 56, 118, 63,
+ 29, 74, 51, 39, 85, 20, 90, 87, 8, 38, 105, 17, 91, 69, 48, 74, 54, 121, 7, 32, 90, 7, 117,
+ 23, 119, 100, 14, 56, 122, 107, 34, 67, 120, 50, 89, 91, 102, 36, 117, 18, 110, 40, 73, 26, 27, 71,
+ 96, 20, 24, 28, 25, 39, 60, 92, 107, 58, 29, 16, 119, 48, 93, 69, 119, 1, 59, 71, 90, 102, 34,
+ 87, 106, 126, 54, 53, 103, 100, 54, 38, 52, 4, 126, 24, 39, 111, 57, 18, 4, 79, 63, 8, 91, 113,
+ 105, 95, 57, 30, 42, 64, 26, 23, 95, 2, 122, 56, 118, 29, 122, 110, 104, 109, 34, 114, 36, 87, 17,
+ 25, 75, 97, 87, 88, 66, 12, 95, 50, 125, 101, 96, 91, 82, 121, 125, 16, 17, 97, 74, 103, 66, 120,
+ 67, 81, 77, 43, 97, 69, 26, 17, 19, 122, 49, 52, 48, 56, 5, 100, 31, 79, 42, 3, 110, 119, 91,
+ 39, 3, 55, 67, 81, 17, 112, 9, 10, 16, 76, 7, 125, 93, 114, 36, 80, 110, 41, 53, 31, 112, 59,
+ 72, 59, 126, 84, 85, 51, 49, 41, 20, 90, 83, 58, 37, 45, 115, 29, 81, 114, 29, 12, 65, 86, 117,
+ 68, 107, 35, 99, 113, 70, 104, 106, 117, 17, 94, 112, 64, 62, 91, 49, 58, 2, 17, 87, 122, 20, 61,
+ 36, 58, 100, 32, 2, 74, 74, 79, 108, 9, 48, 71, 14, 85, 78, 73, 81, 70, 124, 108, 105, 71, 92,
+ 92, 55, 24, 8, 104, 19, 86, 119, 48, 3, 100, 105, 60, 23, 40, 126, 103, 2, 39, 127, 27, 53, 87,
+ 104, 58, 74, 61, 119, 95, 44, 14, 18, 123, 79, 50, 43, 98, 121, 15, 115, 124, 10, 28, 25, 114, 34,
+ 43, 22, 110, 10, 111, 108, 63, 21, 18, 55, 19, 120, 101, 22, 85, 71, 9, 34, 82, 47, 124, 32, 122,
+ 38, 58, 105, 84, 86, 98, 61, 117, 60, 104, 69, 46, 76, 50, 55, 25, 41, 53, 111, 89, 105, 113, 126,
+ 111, 30, 39, 127, 43, 18, 73, 17, 78, 42, 57, 6, 29, 66, 102, 82, 50, 18, 119, 84, 9, 100, 72,
+ 62, 92, 23, 13, 62, 92, 32, 5, 81, 60, 4, 110, 114, 77, 18, 66, 79, 54, 27, 77, 46, 52, 63,
+ 112, 53, 125, 42, 126, 95, 111, 114, 65, 17, 87, 32, 23, 75, 19, 127, 46, 73, 9, 69, 125, 123, 124,
+ 2, 86, 79, 106, 20, 118, 103, 13, 45, 110, 97, 28, 25, 51, 41, 90, 102, 72, 67, 102, 97, 67, 104,
+ 10, 77, 125, 28, 125, 56, 47, 114, 66, 87, 29, 56, 0, 50, 13, 23, 54, 47, 41, 121, 65, 66, 70,
+ 91, 100, 12, 9, 94, 119, 103, 82, 10, 91, 76, 87, 101, 86, 78, 96, 71, 23, 56, 9, 71, 109, 88,
+ 76, 82, 73, 32, 94, 76, 11, 36, 25, 84, 115, 42, 113, 80, 35, 125, 124, 22, 119, 68, 116, 90, 127,
+ 26, 89, 39, 90, 38, 63, 119, 120, 8, 16, 83, 19, 21, 68, 95, 98, 86, 18, 117, 77, 26, 35, 47,
+ 34, 43, 104, 31, 91, 107, 101, 45, 119, 118, 92, 113, 89, 101, 5, 14, 73, 99, 5, 68, 14, 93, 121,
+ 87, 113, 59, 120, 112, 80, 29, 83, 109, 47, 122, 36, 124, 2, 64, 120, 83, 22, 117, 15, 25, 46, 64,
+ 9, 36, 38, 47, 125, 49, 36, 112, 24, 33, 32, 102, 15, 123, 87, 30, 31, 99, 32, 120, 16, 18, 78,
+ 126, 8, 11, 74, 118, 73, 2, 111, 93, 21, 38, 85, 68, 31, 72, 100, 7, 94, 100, 98, 88, 122, 23,
+ 30, 39, 116, 70, 124, 81, 5, 104, 40, 125, 53, 116, 96, 28, 110, 55, 52, 97, 52, 30, 4, 36, 64,
+ 25, 71, 17, 85, 104, 8, 50, 115, 16, 96, 100, 122, 36, 35, 57, 34, 50, 32, 12, 84, 15, 82, 13,
+ 8, 92, 59, 87, 126, 105, 74, 5, 10, 52, 61, 35, 28, 122, 118, 47, 86, 84, 65, 29, 75, 100, 111,
+ 54, 70, 110, 110, 112, 89, 126, 70, 76, 35, 49, 88, 102, 102, 121, 11, 19, 52, 1, 48, 103, 121, 10,
+ 34, 67, 15, 1, 8, 12, 77, 98, 56, 5, 60, 78, 27, 59, 30, 36, 126, 49, 66, 86, 19, 121, 121,
+ 73, 49, 21, 21, 96, 72, 114, 60, 98, 75, 69, 74, 96, 100, 7, 97, 18, 74, 9, 96, 105, 89, 35,
+ 91, 58, 4, 11, 6, 70, 21, 86, 126, 37, 40, 100, 7, 84, 74, 63, 75, 69, 82, 81, 69, 51, 1,
+ 95, 83, 22, 37, 28, 125, 95, 112, 53, 57, 125, 117, 102, 118, 74, 66, 108, 104, 44, 103, 17, 23, 14,
+ 56, 63, 11, 85, 113, 106, 47, 94, 20, 58, 99, 107, 46, 38, 45, 126, 85, 103, 118, 18, 99, 126, 21,
+ 120, 19, 40, 80, 29, 126, 60, 59, 65, 27, 33, 39, 59, 29, 84, 85, 108, 94, 64, 99, 1, 79, 18,
+ 86, 117, 21, 5, 37, 124, 26, 71, 64, 68, 41, 29, 78, 9, 32, 70, 8, 3, 76, 33, 27, 7, 119,
+ 53, 53, 61, 31, 19, 120, 40, 112, 13, 120, 0, 91, 92, 78, 53, 126, 71, 48, 74, 73, 17, 78, 57,
+ 84, 26, 117, 38, 90, 33, 124, 14, 18, 21, 56, 110, 115, 104, 87, 96, 15, 75, 61, 12, 90, 96, 125,
+ 102, 116, 3, 64, 68, 93, 127, 64, 11, 92, 49, 123, 52, 76, 68, 55, 102, 28, 67, 20, 90, 99, 55,
+ 3, 23, 11, 3, 42, 9, 61, 94, 45, 95, 111, 2, 69, 116, 73, 81, 16, 0, 88, 62, 86, 5, 33,
+ 47, 72, 45, 10, 21, 31, 5, 18, 70, 97, 7, 67, 45, 103, 70, 118, 90, 124, 22, 78, 64, 56, 19,
+ 109, 29, 50, 10, 52, 81, 34, 29, 65, 59, 107, 39, 118, 0, 9, 53, 122, 45, 80, 30, 74, 47, 42,
+ 70, 75, 112, 51, 120, 50, 40, 5, 15, 116, 116, 85, 125, 12, 78, 4, 27, 11, 84, 124, 39, 98, 65,
+ 46, 124, 107, 62, 51, 105, 21, 68, 11, 107, 29, 94, 66, 1, 24, 54, 26, 54, 115, 8, 55, 86, 100,
+ 102, 37, 117, 51, 88, 77, 9, 59, 14, 11, 76, 43, 25, 10, 89, 49, 123, 124, 124, 56, 121, 67, 67,
+ 24, 125, 37, 59, 114, 104, 93, 89, 118, 43, 2, 12, 65, 114, 106, 114, 91, 13, 101, 124, 52, 2, 7,
+ 60, 73, 22, 46, 42, 74, 117, 94, 63, 121, 66, 78, 70, 66, 112, 31, 100, 124, 116, 32, 77, 107, 58,
+ 19, 51, 34, 69, 8, 72, 25, 90, 5, 35, 31, 116, 11, 37, 127, 14, 62, 67, 49, 74, 35, 20, 101,
+ 36, 123, 59, 125, 127, 5, 10, 34, 43, 89, 61, 51, 112, 123, 30, 60, 41, 70, 70, 89, 114, 80, 10,
+ 59, 53, 13, 31, 61, 118, 104, 123, 118, 103, 127, 13, 7, 96, 1, 37, 8, 72, 58, 7, 89, 107, 70,
+ 47, 93, 123, 52, 103, 59, 47, 3, 41, 84, 52, 125, 27, 24, 61, 78, 107, 1, 122, 20, 121, 107, 57,
+ 120, 6, 125, 73, 91, 32, 56, 2, 56, 81, 113, 20, 0, 97, 119, 68, 103, 90, 45, 21, 8, 11, 21,
+ 123, 97, 125, 80, 91, 76, 66, 117, 84, 10, 68, 57, 117, 66, 71, 65, 39, 94, 11, 10, 39, 41, 116,
+ 109, 66, 119, 55, 85, 2, 70, 23, 80, 88, 58, 5, 14, 11, 83, 126, 39, 60, 44, 20, 28, 107, 75,
+ 38, 32, 99, 104, 72, 89, 75, 59, 81, 15, 15, 77, 15, 80, 91, 65, 123, 108, 90, 18, 50, 16, 107,
+ 125, 76, 52, 1, 97, 33, 48, 35, 90, 116, 46, 51, 107, 14, 104, 49, 120, 58, 111, 35, 92, 73, 119,
+ 26, 91, 5, 117, 5, 29, 1, 82, 73, 54, 18, 118, 38, 73, 9, 47, 77, 121, 105, 40, 80, 63, 38,
+ 74, 95, 100, 112, 40, 39, 48, 82, 62, 62, 51, 118, 50, 18, 11, 102, 4, 72, 38, 32, 126, 70, 55,
+ 92, 49, 116, 122, 39, 13, 75, 1, 106, 99, 2, 57, 76, 49, 122, 35, 2, 83, 90, 116, 103, 91, 79,
+ 99, 27, 99, 15, 97, 121, 95, 56, 125, 28, 121, 1, 55, 111, 58, 33, 110, 111, 100, 53, 113, 125, 92,
+ 14, 0, 106, 113, 79, 78, 52, 1, 80, 52, 13, 56, 16, 57, 125, 33, 119, 64, 78, 70, 116, 83, 6,
+ 115, 35, 79, 95, 83, 47, 36, 29, 22, 11, 31, 50, 31, 52, 45, 53, 89, 51, 17, 119, 117, 86, 57,
+ 92, 15, 59, 116, 113, 46, 46, 42, 111, 0, 31, 29, 93, 70, 122, 47, 110, 35, 23, 94, 61, 30, 110,
+ 15, 113, 95, 116, 35, 24, 96, 95, 19, 2, 45, 91, 5, 37, 56, 99, 65, 14, 70, 27, 8, 38, 59,
+ 106, 35, 44, 101, 48, 9, 57, 8, 8, 24, 94, 83, 46, 112, 113, 24, 75, 70, 121, 83, 20, 76, 50,
+ 102, 4, 119, 114, 21, 12, 26, 39, 102, 61, 66, 73, 127, 87, 98, 3, 109, 80, 97, 13, 31, 115, 118,
+ 126, 108, 59, 6, 65, 33, 15, 28, 7, 45, 44, 83, 79, 10, 114, 32, 101, 73, 117, 52, 122, 29, 107,
+ 8, 108, 22, 31, 31, 116, 27, 75, 44, 104, 98, 99, 91, 6, 109, 127, 65, 98, 13, 64, 0, 101, 49,
+ 91, 88, 107, 112, 10, 122, 56, 91, 118, 75, 41, 54, 57, 19, 56, 60, 56, 50, 19, 118, 111, 88, 54,
+ 114, 111, 78, 0, 40, 92, 58, 83, 52, 75, 5, 3, 70, 77, 47, 34, 64, 20, 65, 29, 61, 39, 66,
+ 28, 7, 72, 35, 5, 117, 43, 30, 56, 43, 7, 124, 6, 57, 43, 34, 29, 32, 81, 49, 75, 74, 47,
+ 10, 104, 24, 121, 10, 35, 18, 16, 81, 13, 63, 89, 75, 86, 3, 21, 91, 44, 70, 35, 65, 120, 94,
+ 57, 109, 33, 27, 95, 82, 3, 18, 52, 49, 57, 15, 8, 33, 98, 99, 70, 65, 79, 22, 52, 83, 20,
+ 75, 23, 69, 23, 48, 54, 91, 89, 33, 54, 83, 82, 103, 19, 51, 77, 14, 106, 1, 44, 7, 123, 108,
+ 22, 17, 51, 87, 13, 66, 0, 57, 53, 113, 42, 9, 35, 75, 15, 61, 113, 84, 45, 40, 112, 37, 19,
+ 120, 51, 8, 66, 76, 117, 36, 104, 47, 69, 96, 54, 75, 81, 65, 69, 24, 91, 45, 39, 29, 91, 15,
+ 80, 24, 80, 18, 50, 101, 49, 72, 25, 93, 87, 14, 4, 41, 103, 12, 71, 43, 26, 84, 82, 77, 83,
+ 25, 108, 47, 120, 58, 82, 93, 84, 39, 33, 102, 4, 99, 93, 90, 32, 92, 65, 66, 35, 88, 8, 125,
+ 38, 40, 51, 3, 22, 62, 57, 18, 92, 55, 107, 65, 18, 113, 61, 123, 126, 8, 94, 86, 18, 93, 78,
+ 35, 95, 31, 20, 126, 119, 101, 56, 9, 121, 71, 30, 104, 63, 42, 125, 111, 29, 19, 115, 11, 25, 30,
+ 116, 64, 57, 53, 13, 102, 68, 70, 8, 74, 114, 82, 119, 12, 20, 37, 112, 16, 52, 125, 50, 26, 114,
+ 121, 90, 74, 36, 8, 55, 60, 31, 11, 45, 38, 115, 101, 122, 8, 102, 40, 114, 88, 35, 110, 21, 69,
+ 56, 117, 105, 102, 60, 12, 37, 119, 0, 60, 3, 4, 12, 7, 106, 66, 29, 32, 37, 44, 7, 96, 95,
+ 6, 75, 8, 79, 124, 44, 84, 84, 78, 45, 99, 51, 61, 81, 115, 57, 1, 110, 10, 77, 116, 57, 79,
+ 52, 110, 95, 47, 44, 20, 98, 4, 93, 81, 36, 41, 80, 114, 72, 75, 33, 82, 71, 17, 41, 13, 105,
+ 90, 38, 105, 120, 18, 60, 52, 106, 106, 74, 19, 25, 82, 88, 108, 17, 124, 123, 85, 68, 23, 68, 116,
+ 61, 122, 94, 90, 23, 86, 70, 70, 13, 124, 66, 115, 22, 125, 65, 109, 76, 107, 74, 16, 34, 40, 63,
+ 102, 16, 83, 61, 67, 75, 12, 60, 1, 73, 37, 74, 123, 104, 14, 108, 60, 35, 89, 64, 81, 68, 64,
+ 9, 111, 26, 109, 101, 79, 108, 36, 47, 43, 18, 21, 41, 42, 90, 60, 124, 11, 110, 82, 42, 8, 46,
+ 21, 81, 2, 14, 96, 79, 106, 103, 67, 56, 74, 113, 14, 18, 86, 52, 95, 46, 33, 1, 51, 59, 96,
+ 2, 33, 87, 49, 105, 4, 106, 1, 44, 82, 108, 17, 127, 29, 111, 106, 27, 99, 81, 117, 77, 11, 50,
+ 100, 99, 97, 88, 58, 109, 66, 87, 74, 105, 33, 125, 14, 89, 97, 98, 36, 2, 38, 61, 85, 11, 82,
+ 32, 123, 2, 53, 61, 48, 26, 124, 78, 53, 108, 30, 63, 127, 63, 74, 33, 49, 62, 46, 45, 73, 22,
+ 47, 45, 43, 119, 98, 108, 50, 22, 106, 86, 2, 107, 53, 110, 113, 6, 43, 71, 99, 118, 103, 59, 43,
+ 112, 100, 58, 99, 79, 46, 101, 26, 104, 51, 102, 54, 59, 60, 109, 124, 26, 126, 90, 83, 32, 99, 55,
+ 82, 119, 55, 106, 13, 71, 28, 1, 116, 80, 64, 77, 127, 78, 119, 113, 43, 100, 10, 101, 2, 14, 1,
+ 37, 44, 61, 91, 16, 114, 21, 110, 121, 90, 110, 37, 7, 108, 123, 126, 65, 100, 41, 44, 68, 17, 119,
+ 4, 50, 86, 57, 93, 121, 115, 18, 36, 46, 48, 89, 114, 26, 70, 115, 88, 114, 116, 74, 119, 44, 36,
+ 52, 106, 61, 81, 37, 94, 90, 82, 72, 40, 111, 7, 45, 52, 32, 62, 44, 116, 28, 14, 30, 104, 106,
+ 42, 91, 117, 122, 113, 118, 52, 126, 40, 74, 37, 59, 10, 6, 115, 21, 63, 71, 89, 82, 99, 92, 32,
+ 8, 99, 41, 28, 78, 79, 18, 66, 57, 90, 84, 115, 45, 90, 3, 123, 74, 8, 11, 105, 16, 84, 27,
+ 106, 110, 82, 19, 74, 7, 80, 78, 24, 1, 113, 57, 47, 9, 126, 71, 103, 26, 100, 126, 106, 88, 46,
+ 57, 44, 18, 53, 34, 57, 62, 63, 108, 80, 55, 118, 108, 73, 93, 66, 38, 121, 59, 27, 114, 90, 81,
+ 16, 56, 107, 9, 104, 3, 94, 51, 117, 41, 111, 18, 94, 7, 58, 57, 103, 14, 35, 117, 126, 57, 35,
+ 78, 120, 88, 125, 47, 43, 68, 37, 113, 125, 63, 116, 46, 32, 13, 49, 120, 120, 71, 116, 124, 65, 42,
+ 89, 64, 101, 92, 126, 94, 79, 106, 124, 78, 32, 98, 40, 23, 108, 3, 13, 94, 121, 80, 39, 108, 64,
+ 122, 32, 83, 2, 57, 104, 120, 123, 7, 92, 5, 62, 18, 49, 26, 118, 17, 124, 13, 101, 125, 114, 118,
+ 83, 31, 119, 53, 51, 12, 17, 108, 64, 101, 12, 122, 46, 24, 73, 97, 121, 71, 126, 44, 105, 37, 75,
+ 106, 4, 33, 20, 27, 79, 73, 30, 104, 77, 71, 99, 20, 63, 119, 106, 60, 10, 12, 28, 72, 80, 48,
+ 21, 18, 59, 118, 59, 108, 95, 60, 66, 46, 88, 41, 16, 34, 118, 2, 97, 3, 86, 9, 122, 11, 116,
+ 126, 118, 8, 64, 5, 118, 119, 71, 84, 104, 6, 93, 28, 95, 64, 88, 90, 113, 121, 86, 67, 99, 46,
+ 70, 5, 63, 19, 22, 45, 31, 29, 25, 1, 40, 14, 116, 115, 38, 4, 30, 78, 38, 107, 16, 77, 52,
+ 90, 32, 24, 55, 55, 70, 105, 59, 89, 5, 10, 120, 122, 111, 54, 66, 99, 50, 83, 6, 94, 39, 14,
+ 65, 119, 26, 112, 58, 13, 73, 124, 70, 80, 32, 45, 7, 0, 66, 12, 123, 81, 96, 103, 21, 64, 86,
+ 3, 68, 72, 19, 109, 48, 25, 14, 95, 21, 37, 115, 14, 106, 126, 13, 9, 107, 35, 59, 58, 89, 58,
+ 16, 122, 28, 81, 37, 25, 37, 69, 85, 19, 123, 76, 115, 41, 13, 50, 126, 6, 114, 28, 86, 104, 14,
+ 11, 118, 80, 85, 86, 76, 118, 36, 110, 2, 104, 4, 91, 9, 34, 123, 37, 69, 21, 97, 60, 74, 106,
+ 60, 106, 118, 30, 76, 110, 33, 14, 65, 63, 38, 76, 27, 110, 127, 43, 56, 16, 80, 96, 118, 78, 106,
+ 105, 123, 55, 127, 44, 101, 31, 52, 100, 9, 58, 121, 85, 33, 65, 126, 25, 117, 45, 4, 7, 2, 115,
+ 72, 66, 75, 109, 9, 13, 125, 9, 59, 112, 71, 101, 108, 27, 81, 115, 17, 65, 91, 86, 30, 36, 123,
+ 3, 23, 14, 66, 19, 6, 21, 106, 67, 96, 73, 118, 45, 82, 58, 68, 107, 98, 40, 36, 9, 56, 27,
+ 17, 114, 78, 101, 5, 75, 118, 65, 2, 19, 117, 84, 95, 19, 4, 90, 99, 34, 73, 29, 62, 73, 89,
+ 106, 125, 65, 43, 57, 107, 85, 36, 99, 4, 104, 113, 2, 3, 49, 108, 127, 59, 52, 99, 29, 78, 81,
+ 40, 114, 70, 71, 23, 59, 119, 12, 91, 53, 30, 102, 125, 46, 47, 1, 59, 126, 87, 32, 32, 115, 45,
+ 95, 57, 58, 29, 70, 98, 95, 45, 116, 35, 1, 14, 18, 18, 87, 20, 15, 106, 95, 34, 48, 37, 64,
+ 42, 1, 117, 16, 60, 21, 82, 93, 39, 83, 120, 52, 10, 111, 46, 36, 49, 122, 30, 58, 116, 74, 19,
+ 15, 55, 44, 118, 11, 50, 28, 102, 6, 5, 37, 35, 45, 100, 117, 98, 115, 6, 63, 65, 65, 108, 73,
+ 99, 58, 75, 70, 48, 103, 48, 49, 92, 64, 67, 126, 6, 44, 85, 0, 64, 26, 112, 117, 31, 14, 69,
+ 66, 111, 35, 125, 65, 110, 30, 36, 58, 45, 8, 12, 46, 104, 111, 93, 30, 77, 57, 75, 83, 55, 64,
+ 86, 79, 22, 95, 39, 5, 50, 77, 34, 20, 123, 101, 99, 16, 33, 67, 45, 109, 45, 10, 52, 86, 98,
+ 60, 49, 117, 67, 120, 7, 114, 43, 119, 69, 107, 110, 99, 5, 95, 15, 86, 35, 22, 47, 113, 104, 32,
+ 78, 24, 69, 6, 107, 75, 3, 22, 126, 63, 125, 41, 75, 110, 87, 69, 21, 63, 92, 21, 56, 106, 18,
+ 65, 47, 75, 95, 14, 114, 97, 126, 22, 17, 77, 55, 65, 32, 38, 126, 83, 106, 49, 69, 7, 15, 67,
+ 97, 19, 29, 106, 25, 64, 111, 19, 44, 39, 7, 43, 81, 51, 115, 40, 119, 21, 93, 65, 122, 59, 7,
+ 30, 94, 33, 67, 51, 70, 56, 18, 73, 122, 86, 32, 21, 98, 83, 65, 126, 71, 35, 8, 2, 125, 24,
+ 7, 63, 56, 3, 44, 44, 61, 97, 29, 78, 97, 5, 117, 94, 33, 34, 51, 75, 42, 16, 63, 95, 16,
+ 69, 80, 58, 90, 83, 19, 72, 77, 64, 32, 115, 39, 59, 32, 65, 40, 12, 22, 32, 40, 47, 42, 102,
+ 3, 30, 90, 26, 15, 98, 53, 92, 15, 126, 73, 97, 45, 68, 83, 2, 33, 122, 74, 56, 47, 98, 84,
+ 72, 118, 37, 59, 76, 40, 90, 33, 62, 76, 51, 91, 11, 111, 116, 120, 59, 79, 46, 114, 70, 21, 116,
+ 7, 41, 40, 25, 106, 72, 118, 6, 14, 109, 93, 102, 8, 77, 33, 111, 16, 85, 112, 99, 82, 106, 108,
+ 28, 46, 84, 65, 105, 27, 30, 77, 55, 65, 109, 57, 44, 96, 26, 12, 42, 99, 23, 101, 9, 96, 113,
+ 59, 24, 90, 14, 21, 57, 55, 81, 67, 112, 104, 124, 3, 57, 116, 121, 97, 120, 10, 4, 38, 49, 40,
+ 23, 5, 78, 20, 35, 114, 93, 61, 80, 61, 66, 27, 120, 9, 30, 59, 107, 39, 54, 125, 114, 46, 61,
+ 39, 82, 116, 103, 78, 32, 32, 120, 116, 38, 29, 27, 12, 3, 40, 53, 18, 32, 22, 75, 86, 125, 12,
+ 28, 90, 28, 97, 31, 67, 55, 42, 112, 113, 42, 49, 59, 76, 109, 20, 52, 57, 113, 115, 17, 24, 116,
+ 65, 107, 115, 119, 105, 59, 86, 83, 59, 75, 123, 107, 72, 39, 104, 22, 85, 88, 99, 52, 70, 46, 106,
+ 60, 26, 4, 3, 2, 80, 48, 121, 33, 74, 0, 99, 94, 40, 71, 29, 82, 29, 59, 74, 72, 68, 42,
+ 112, 42, 37, 77, 20, 85, 23, 30, 87, 102, 123, 48, 50, 21, 51, 16, 121, 45, 86, 99, 65, 63, 40,
+ 89, 22, 45, 111, 113, 94, 51, 72, 31, 116, 5, 43, 84, 74, 110, 7, 98, 9, 47, 50, 34, 91, 105,
+ 73, 11, 81, 23, 82, 106, 27, 19, 41, 83, 56, 60, 3, 81, 42, 109, 63, 68, 45, 10, 77, 41, 91,
+ 93, 119, 94, 7, 12, 64, 81, 113, 97, 32, 36, 41, 69, 24, 73, 83, 106, 29, 63, 81, 51, 64, 48,
+ 87, 116, 126, 125, 58, 12, 17, 110, 8, 89, 96, 33, 17, 116, 72, 75, 83, 49, 31, 4, 37, 92, 84,
+ 8, 75, 16, 84, 81, 103, 104, 54, 20, 22, 23, 80, 118, 9, 18, 126, 5, 107, 45, 111, 70, 47, 112,
+ 45, 28, 103, 97, 45, 37, 77, 25, 92, 78, 66, 123, 67, 92, 81, 100, 113, 73, 3, 115, 17, 118, 27,
+ 120, 109, 11, 42, 58, 96, 95, 83, 124, 19, 107, 118, 41, 21, 124, 125, 33, 114, 29, 22, 40, 85, 50,
+ 70, 118, 45, 109, 27, 24, 28, 94, 118, 86, 95, 105, 55, 15, 16, 16, 11, 48, 98, 65, 75, 87, 82,
+ 118, 104, 105, 98, 122, 78, 31, 75, 47, 111, 89, 66, 97, 51, 68, 32, 6, 31, 117, 90, 70, 107, 85,
+ 72, 1, 35, 21, 82, 75, 118, 42, 81, 10, 36, 0, 8, 126, 54, 112, 118, 67, 126, 108, 16, 117, 103,
+ 82, 34, 124, 4, 20, 89, 112, 43, 46, 106, 96, 123, 44, 56, 41, 24, 44, 90, 80, 116, 33, 36, 6,
+ 120, 70, 81, 61, 72, 47, 47, 79, 126, 56, 105, 68, 4, 34, 95, 61, 121, 11, 40, 11, 77, 28, 9,
+ 41, 98, 38, 82, 14, 90, 25, 125, 44, 12, 105, 92, 123, 22, 78, 87, 6, 42, 113, 31, 81, 17, 68,
+ 52, 81, 20, 119, 32, 5, 51, 11, 74, 81, 119, 45, 117, 7, 33, 126, 10, 92, 69, 74, 76, 106, 28,
+ 11, 76, 92, 74, 8, 111, 70, 35, 71, 77, 127, 106, 45, 125, 21, 108, 87, 85, 48, 80, 71, 113, 107,
+ 114, 52, 115, 66, 48, 61, 65, 125, 41, 71, 25, 67, 59, 112, 86, 78, 18, 105, 68, 2, 95, 30, 97,
+ 105, 52, 91, 40, 117, 102, 84, 68, 108, 9, 120, 73, 119, 12, 56, 6, 1, 115, 43, 58, 58, 114, 117,
+ 54, 83, 113, 125, 23, 50, 109, 5, 51, 62, 90, 22, 109, 69, 92, 77, 17, 43, 67, 114, 26, 104, 21,
+ 15, 1, 42, 75, 30, 124, 8, 29, 70, 67, 73, 28, 34, 38, 64, 118, 64, 32, 70, 111, 12, 88, 109,
+ 35, 113, 81, 17, 43, 97, 16, 83, 46, 71, 67, 93, 31, 15, 8, 20, 7, 12, 65, 89, 3, 54, 64,
+ 56, 79, 23, 54, 108, 48, 89, 13, 35, 35, 112, 35, 53, 46, 1, 32, 78, 32, 29, 89, 16, 2, 41,
+ 14, 97, 75, 82, 61, 114, 37, 53, 123, 61, 97, 10, 120, 108, 98, 39, 1, 83, 78, 116, 82, 127, 81,
+ 83, 90, 104, 123, 16, 120, 116, 49, 32, 58, 97, 24, 35, 81, 98, 101, 52, 95, 90, 34, 103, 79, 101,
+ 55, 58, 68, 95, 3, 63, 116, 20, 108, 109, 99, 9, 72, 80, 40, 17, 7, 115, 54, 26, 84, 12, 42,
+ 110, 52, 82, 41, 78, 118, 115, 24, 36, 60, 48, 62, 119, 30, 13, 38, 85, 108, 35, 36, 121, 58, 43,
+ 92, 127, 16, 55, 42, 75, 35, 50, 101, 2, 119, 57, 92, 109, 79, 94, 99, 3, 95, 60, 15, 36, 19,
+ 78, 8, 2, 0, 83, 69, 100, 98, 53, 59, 107, 121, 47, 40, 109, 49, 43, 81, 22, 14, 27, 38, 64,
+ 121, 50, 62, 11, 30, 50, 77, 50, 86, 96, 4, 110, 34, 18, 76, 20, 115, 121, 95, 116, 106, 1, 17,
+ 108, 115, 84, 75, 106, 8, 75, 95, 126, 78, 53, 42, 122, 89, 116, 56, 26, 113, 70, 86, 58, 95, 65,
+ 48, 96, 116, 113, 117, 17, 123, 26, 26, 117, 33, 91, 2, 115, 36, 66, 92, 6, 66, 118, 105, 117, 54,
+ 60, 104, 93, 83, 34, 93, 47, 114, 111, 30, 64, 70, 19, 46, 20, 49, 17, 53, 35, 110, 78, 111, 40,
+ 72, 58, 115, 119, 26, 86, 82, 19, 51, 116, 60, 45, 120, 81, 57, 46, 124, 7, 18, 15, 119, 22, 107,
+ 80, 110, 78, 27, 47, 13, 64, 62, 91, 102, 104, 59, 47, 109, 82, 81, 103, 80, 115, 103, 55, 109, 71,
+ 108, 124, 44, 85, 117, 79, 123, 119, 125, 124, 70, 47, 42, 123, 54, 30, 108, 54, 59, 101, 13, 127, 67,
+ 48, 8, 45, 87, 42, 28, 49, 56, 98, 107, 111, 63, 55, 73, 28, 43, 96, 120, 62, 77, 25, 47, 32,
+ 40, 48, 101, 106, 115, 32, 5, 92, 86, 27, 115, 127, 107, 9, 14, 49, 121, 24, 60, 61, 26, 57, 10,
+ 21, 51, 56, 69, 69, 35, 79, 5, 109, 25, 79, 56, 52, 88, 88, 4, 38, 22, 54, 102, 85, 32, 80,
+ 72, 36, 58, 67, 80, 4, 6, 104, 82, 7, 53, 37, 48, 93, 42, 49, 49, 27, 61, 56, 7, 38, 83,
+ 113, 99, 83, 30, 82, 110, 25, 63, 88, 58, 70, 97, 50, 34, 20, 45, 71, 77, 89, 76, 12, 59, 107,
+ 79, 80, 125, 47, 85, 86, 43, 70, 80, 22, 36, 124, 44, 23, 7, 37, 50, 51, 46, 122, 5, 89, 1,
+ 47, 72, 30, 89, 10, 102, 103, 72, 75, 116, 121, 13, 104, 75, 43, 79, 106, 50, 56, 35, 25, 27, 10,
+ 73, 17, 58, 112, 102, 49, 72, 63, 84, 36, 126, 26, 76, 118, 50, 90, 113, 90, 118, 16, 10, 85, 127,
+ 79, 30, 50, 85, 29, 45, 103, 99, 52, 111, 57, 110, 85, 25, 16, 36, 118, 64, 41, 48, 26, 29, 62,
+ 40, 60, 37, 3, 73, 87, 112, 57, 64, 4, 97, 90, 84, 57, 18, 94, 92, 62, 97, 101, 50, 86, 34,
+ 29, 116, 59, 44, 124, 49, 9, 27, 71, 118, 53, 18, 76, 55, 11, 100, 61, 108, 115, 120, 49, 73, 80,
+ 42, 23, 74, 113, 35, 31, 38, 35, 121, 3, 96, 122, 28, 26, 20, 12, 67, 46, 84, 117, 30, 81, 58,
+ 125, 14, 39, 19, 95, 58, 44, 96, 122, 60, 39, 77, 109, 58, 10, 35, 73, 120, 101, 24, 87, 126, 72,
+ 90, 9, 1, 18, 12, 16, 87, 32, 71, 12, 10, 5, 123, 127, 64, 98, 81, 27, 68, 89, 57, 126, 31,
+ 94, 126, 60, 31, 109, 71, 120, 34, 1, 115, 75, 119, 26, 122, 104, 9, 101, 106, 52, 75, 46, 46, 54,
+ 37, 69, 38, 38, 65, 67, 68, 31, 40, 60, 110, 117, 8, 42, 45, 117, 89, 114, 11, 86, 15, 58, 27,
+ 113, 47, 71, 15, 49, 79, 50, 106, 10, 38, 80, 39, 86, 87, 74, 49, 126, 42, 99, 127, 80, 26, 110,
+ 31, 83, 110, 67, 32, 48, 66, 48, 110, 121, 120, 90, 36, 68, 67, 124, 68, 115, 26, 60, 112, 51, 25,
+ 83, 17, 84, 73, 125, 44, 42, 48, 75, 24, 33, 98, 88, 102, 110, 124, 6, 119, 118, 65, 47, 68, 88,
+ 19, 32, 22, 53, 51, 64, 11, 8, 25, 16, 8, 102, 18, 118, 97, 110, 52, 19, 70, 5, 111, 61, 103,
+ 17, 91, 11, 16, 39, 11, 43, 107, 115, 47, 95, 8, 8, 72, 31, 9, 62, 7, 50, 103, 67, 86, 121,
+ 83, 57, 123, 59, 67, 71, 40, 6, 119, 11, 98, 51, 103, 26, 54, 107, 100, 89};
diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8_spill2/biases_data.h b/Tests/UnitTest/TestCases/TestData/int16xint8_spill2/biases_data.h
new file mode 100644
index 00000000..ace28d6c
--- /dev/null
+++ b/Tests/UnitTest/TestCases/TestData/int16xint8_spill2/biases_data.h
@@ -0,0 +1,6 @@
+// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0).
+// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e.
+#pragma once
+#include
+
+const int64_t *int16xint8_spill2_biases = NULL;
diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8_spill2/config_data.h b/Tests/UnitTest/TestCases/TestData/int16xint8_spill2/config_data.h
new file mode 100644
index 00000000..b79e38d8
--- /dev/null
+++ b/Tests/UnitTest/TestCases/TestData/int16xint8_spill2/config_data.h
@@ -0,0 +1,24 @@
+// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0).
+// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e.
+#pragma once
+#define INT16XINT8_SPILL2_OUT_CH 9
+#define INT16XINT8_SPILL2_IN_CH 12
+#define INT16XINT8_SPILL2_INPUT_W 10
+#define INT16XINT8_SPILL2_INPUT_H 8
+#define INT16XINT8_SPILL2_DST_SIZE 90
+#define INT16XINT8_SPILL2_INPUT_SIZE 960
+#define INT16XINT8_SPILL2_OUT_ACTIVATION_MIN 32667
+#define INT16XINT8_SPILL2_OUT_ACTIVATION_MAX 32767
+#define INT16XINT8_SPILL2_INPUT_BATCHES 1
+#define INT16XINT8_SPILL2_FILTER_X 9
+#define INT16XINT8_SPILL2_FILTER_Y 4
+#define INT16XINT8_SPILL2_STRIDE_X 1
+#define INT16XINT8_SPILL2_STRIDE_Y 1
+#define INT16XINT8_SPILL2_PAD_X 0
+#define INT16XINT8_SPILL2_PAD_Y 0
+#define INT16XINT8_SPILL2_OUTPUT_W 2
+#define INT16XINT8_SPILL2_OUTPUT_H 5
+#define INT16XINT8_SPILL2_INPUT_OFFSET 0
+#define INT16XINT8_SPILL2_OUTPUT_OFFSET 0
+#define INT16XINT8_SPILL2_DILATION_X 1
+#define INT16XINT8_SPILL2_DILATION_Y 1
diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8_spill2/input_data.h b/Tests/UnitTest/TestCases/TestData/int16xint8_spill2/input_data.h
new file mode 100644
index 00000000..d81c3483
--- /dev/null
+++ b/Tests/UnitTest/TestCases/TestData/int16xint8_spill2/input_data.h
@@ -0,0 +1,66 @@
+// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0).
+// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e.
+#pragma once
+#include
+
+const int16_t int16xint8_spill2_input[960] = {
+ 32732, 32696, 32712, 32689, 32702, 32755, 32747, 32756, 32690, 32671, 32733, 32703, 32714, 32668, 32687, 32730,
+ 32742, 32735, 32699, 32674, 32711, 32675, 32719, 32718, 32737, 32694, 32748, 32669, 32735, 32676, 32743, 32755,
+ 32740, 32719, 32746, 32688, 32719, 32733, 32739, 32689, 32766, 32703, 32674, 32687, 32728, 32704, 32708, 32691,
+ 32730, 32684, 32701, 32683, 32731, 32712, 32723, 32722, 32724, 32700, 32733, 32703, 32745, 32732, 32714, 32694,
+ 32732, 32754, 32695, 32741, 32750, 32739, 32688, 32722, 32756, 32674, 32681, 32759, 32741, 32697, 32706, 32747,
+ 32687, 32730, 32741, 32667, 32682, 32684, 32726, 32691, 32721, 32755, 32735, 32715, 32732, 32689, 32716, 32749,
+ 32677, 32692, 32694, 32739, 32715, 32717, 32723, 32717, 32716, 32736, 32678, 32701, 32694, 32705, 32688, 32718,
+ 32701, 32758, 32700, 32709, 32688, 32737, 32687, 32736, 32676, 32727, 32731, 32688, 32713, 32730, 32698, 32686,
+ 32762, 32722, 32685, 32720, 32754, 32753, 32711, 32726, 32760, 32759, 32680, 32702, 32683, 32761, 32713, 32699,
+ 32674, 32679, 32727, 32757, 32672, 32691, 32720, 32728, 32704, 32700, 32680, 32704, 32749, 32765, 32719, 32730,
+ 32683, 32751, 32736, 32718, 32696, 32674, 32674, 32690, 32747, 32690, 32763, 32706, 32758, 32720, 32710, 32735,
+ 32721, 32698, 32738, 32668, 32718, 32694, 32681, 32707, 32706, 32761, 32756, 32687, 32700, 32686, 32686, 32680,
+ 32751, 32761, 32715, 32744, 32697, 32712, 32686, 32725, 32764, 32746, 32739, 32739, 32733, 32763, 32718, 32720,
+ 32714, 32681, 32696, 32711, 32734, 32761, 32746, 32697, 32729, 32711, 32677, 32740, 32741, 32715, 32729, 32685,
+ 32685, 32726, 32728, 32707, 32763, 32731, 32676, 32729, 32711, 32714, 32739, 32753, 32729, 32716, 32735, 32712,
+ 32724, 32722, 32731, 32699, 32765, 32745, 32695, 32739, 32755, 32726, 32750, 32756, 32693, 32700, 32697, 32752,
+ 32726, 32732, 32722, 32684, 32724, 32706, 32737, 32755, 32684, 32764, 32703, 32687, 32733, 32671, 32699, 32726,
+ 32703, 32747, 32670, 32667, 32724, 32697, 32719, 32739, 32760, 32740, 32700, 32756, 32716, 32754, 32696, 32744,
+ 32750, 32732, 32761, 32760, 32751, 32668, 32753, 32698, 32748, 32667, 32760, 32746, 32725, 32708, 32711, 32706,
+ 32715, 32752, 32667, 32734, 32724, 32745, 32743, 32723, 32682, 32706, 32718, 32762, 32733, 32676, 32708, 32680,
+ 32761, 32673, 32710, 32749, 32704, 32738, 32684, 32681, 32756, 32669, 32691, 32726, 32760, 32742, 32725, 32667,
+ 32760, 32704, 32728, 32706, 32719, 32709, 32671, 32759, 32720, 32669, 32742, 32695, 32694, 32765, 32717, 32761,
+ 32730, 32712, 32714, 32687, 32750, 32734, 32730, 32720, 32745, 32688, 32752, 32679, 32749, 32723, 32708, 32688,
+ 32683, 32712, 32668, 32690, 32669, 32749, 32734, 32678, 32678, 32698, 32713, 32727, 32702, 32694, 32697, 32759,
+ 32730, 32749, 32745, 32696, 32733, 32701, 32672, 32730, 32748, 32707, 32747, 32758, 32711, 32691, 32688, 32681,
+ 32755, 32748, 32748, 32735, 32727, 32707, 32677, 32712, 32751, 32741, 32724, 32674, 32689, 32752, 32740, 32710,
+ 32764, 32676, 32729, 32674, 32688, 32757, 32709, 32724, 32710, 32683, 32764, 32762, 32713, 32765, 32669, 32667,
+ 32704, 32736, 32749, 32732, 32712, 32748, 32733, 32695, 32743, 32693, 32761, 32740, 32675, 32682, 32744, 32714,
+ 32765, 32668, 32757, 32711, 32756, 32701, 32721, 32706, 32733, 32715, 32720, 32744, 32739, 32740, 32670, 32757,
+ 32675, 32687, 32722, 32753, 32683, 32752, 32685, 32685, 32688, 32747, 32727, 32701, 32734, 32677, 32669, 32674,
+ 32675, 32706, 32753, 32695, 32759, 32731, 32687, 32754, 32738, 32680, 32702, 32752, 32714, 32731, 32730, 32749,
+ 32721, 32699, 32760, 32684, 32719, 32687, 32694, 32720, 32671, 32723, 32679, 32741, 32690, 32737, 32737, 32689,
+ 32684, 32685, 32687, 32734, 32729, 32755, 32736, 32742, 32756, 32710, 32734, 32766, 32725, 32701, 32756, 32682,
+ 32683, 32749, 32741, 32736, 32695, 32723, 32726, 32758, 32678, 32689, 32681, 32765, 32708, 32718, 32693, 32737,
+ 32724, 32677, 32720, 32721, 32680, 32683, 32752, 32765, 32696, 32765, 32745, 32684, 32699, 32681, 32731, 32729,
+ 32678, 32711, 32667, 32668, 32756, 32713, 32745, 32737, 32741, 32673, 32719, 32678, 32759, 32673, 32714, 32698,
+ 32670, 32759, 32702, 32691, 32710, 32744, 32686, 32715, 32739, 32726, 32721, 32758, 32701, 32682, 32727, 32737,
+ 32743, 32704, 32762, 32743, 32701, 32685, 32720, 32763, 32729, 32752, 32763, 32696, 32735, 32697, 32700, 32707,
+ 32695, 32700, 32697, 32744, 32714, 32704, 32708, 32741, 32739, 32669, 32719, 32743, 32674, 32712, 32715, 32701,
+ 32704, 32708, 32684, 32707, 32736, 32731, 32697, 32729, 32689, 32741, 32730, 32760, 32689, 32674, 32766, 32693,
+ 32689, 32736, 32678, 32685, 32672, 32753, 32683, 32761, 32691, 32700, 32709, 32708, 32672, 32672, 32763, 32742,
+ 32696, 32714, 32722, 32752, 32735, 32697, 32724, 32678, 32712, 32668, 32707, 32678, 32679, 32696, 32759, 32760,
+ 32709, 32741, 32724, 32717, 32689, 32705, 32725, 32722, 32681, 32736, 32684, 32695, 32721, 32669, 32706, 32740,
+ 32693, 32704, 32737, 32694, 32738, 32720, 32690, 32763, 32689, 32675, 32725, 32765, 32669, 32676, 32688, 32723,
+ 32750, 32669, 32763, 32707, 32755, 32720, 32740, 32688, 32766, 32721, 32734, 32723, 32685, 32700, 32756, 32736,
+ 32702, 32721, 32698, 32722, 32745, 32718, 32675, 32752, 32702, 32726, 32668, 32675, 32714, 32694, 32745, 32676,
+ 32743, 32731, 32745, 32759, 32758, 32708, 32700, 32703, 32752, 32725, 32708, 32683, 32720, 32732, 32686, 32760,
+ 32766, 32733, 32750, 32737, 32746, 32702, 32684, 32709, 32731, 32733, 32689, 32713, 32730, 32762, 32688, 32710,
+ 32716, 32674, 32722, 32667, 32678, 32710, 32747, 32688, 32715, 32708, 32738, 32679, 32720, 32709, 32705, 32713,
+ 32703, 32681, 32732, 32684, 32717, 32715, 32711, 32736, 32685, 32695, 32669, 32758, 32725, 32680, 32758, 32678,
+ 32670, 32720, 32705, 32715, 32743, 32703, 32711, 32717, 32683, 32736, 32732, 32700, 32728, 32726, 32717, 32716,
+ 32713, 32763, 32697, 32711, 32736, 32704, 32728, 32761, 32677, 32679, 32731, 32720, 32712, 32723, 32762, 32718,
+ 32699, 32751, 32755, 32694, 32736, 32670, 32679, 32676, 32701, 32760, 32735, 32716, 32726, 32714, 32703, 32667,
+ 32671, 32668, 32729, 32738, 32727, 32704, 32748, 32717, 32716, 32717, 32701, 32748, 32721, 32679, 32747, 32707,
+ 32757, 32696, 32712, 32757, 32693, 32711, 32741, 32687, 32763, 32747, 32730, 32727, 32698, 32702, 32678, 32699,
+ 32756, 32733, 32697, 32691, 32732, 32732, 32680, 32690, 32739, 32740, 32750, 32717, 32674, 32686, 32703, 32671,
+ 32726, 32672, 32738, 32724, 32765, 32690, 32749, 32714, 32694, 32691, 32725, 32676, 32699, 32725, 32713, 32762,
+ 32724, 32690, 32676, 32710, 32697, 32765, 32670, 32758, 32728, 32681, 32744, 32712, 32741, 32765, 32756, 32766,
+ 32713, 32706, 32737, 32758, 32733, 32763, 32670, 32667, 32674, 32726, 32718, 32732, 32735, 32734, 32703, 32673,
+ 32709, 32723, 32717, 32759, 32754, 32671, 32723, 32719, 32740, 32677, 32697, 32668, 32671, 32739, 32704, 32744};
diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8_spill2/output_mult_data.h b/Tests/UnitTest/TestCases/TestData/int16xint8_spill2/output_mult_data.h
new file mode 100644
index 00000000..0fd80c3c
--- /dev/null
+++ b/Tests/UnitTest/TestCases/TestData/int16xint8_spill2/output_mult_data.h
@@ -0,0 +1,7 @@
+// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0).
+// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e.
+#pragma once
+#include
+
+const int32_t int16xint8_spill2_output_mult[9] =
+ {1231320420, 1228194292, 1228950954, 1231269879, 1231112138, 1229528901, 1230557932, 1230167876, 1229640034};
diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8_spill2/output_ref_data.h b/Tests/UnitTest/TestCases/TestData/int16xint8_spill2/output_ref_data.h
new file mode 100644
index 00000000..ba5623b5
--- /dev/null
+++ b/Tests/UnitTest/TestCases/TestData/int16xint8_spill2/output_ref_data.h
@@ -0,0 +1,12 @@
+// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0).
+// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e.
+#pragma once
+#include
+
+const int16_t int16xint8_spill2_output_ref[90] = {
+ 32716, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32718, 32667, 32667, 32667, 32667, 32667,
+ 32667, 32667, 32667, 32716, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32714, 32667, 32667,
+ 32667, 32667, 32667, 32667, 32667, 32667, 32716, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667,
+ 32716, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32713, 32667, 32667, 32667, 32667, 32667,
+ 32667, 32667, 32667, 32714, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32713, 32667, 32667,
+ 32667, 32667, 32667, 32667, 32667, 32667, 32714, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667};
diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8_spill2/output_shift_data.h b/Tests/UnitTest/TestCases/TestData/int16xint8_spill2/output_shift_data.h
new file mode 100644
index 00000000..074e382c
--- /dev/null
+++ b/Tests/UnitTest/TestCases/TestData/int16xint8_spill2/output_shift_data.h
@@ -0,0 +1,6 @@
+// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0).
+// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e.
+#pragma once
+#include
+
+const int32_t int16xint8_spill2_output_shift[9] = {-14, -14, -14, -14, -14, -14, -14, -14, -14};
diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8_spill2/test_data.h b/Tests/UnitTest/TestCases/TestData/int16xint8_spill2/test_data.h
new file mode 100644
index 00000000..4d61c5f2
--- /dev/null
+++ b/Tests/UnitTest/TestCases/TestData/int16xint8_spill2/test_data.h
@@ -0,0 +1,9 @@
+// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0).
+// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e.
+#include "biases_data.h"
+#include "config_data.h"
+#include "input_data.h"
+#include "output_mult_data.h"
+#include "output_ref_data.h"
+#include "output_shift_data.h"
+#include "weights_data.h"
diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8_spill2/weights_data.h b/Tests/UnitTest/TestCases/TestData/int16xint8_spill2/weights_data.h
new file mode 100644
index 00000000..4aee9323
--- /dev/null
+++ b/Tests/UnitTest/TestCases/TestData/int16xint8_spill2/weights_data.h
@@ -0,0 +1,176 @@
+// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0).
+// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e.
+#pragma once
+#include
+
+const int8_t int16xint8_spill2_weights[3888] = {
+ 41, 91, 43, 84, 71, 88, 125, 36, 81, 15, 18, 116, 85, 94, 126, 54, 95, 93, 126, 68, 45, 123, 116,
+ 107, 119, 74, 90, 36, 77, 114, 21, 70, 67, 112, 103, 34, 32, 85, 37, 115, 67, 55, 97, 113, 86, 103,
+ 0, 82, 21, 101, 37, 67, 124, 6, 50, 83, 119, 75, 66, 83, 114, 75, 56, 105, 119, 33, 31, 75, 124,
+ 40, 40, 12, 28, 115, 37, 11, 121, 87, 95, 68, 18, 67, 88, 42, 53, 38, 127, 14, 5, 93, 17, 25,
+ 29, 22, 78, 106, 19, 106, 7, 50, 28, 120, 73, 5, 76, 17, 19, 102, 126, 36, 99, 95, 40, 79, 34,
+ 98, 0, 107, 123, 41, 122, 88, 53, 94, 38, 40, 41, 42, 117, 75, 8, 115, 107, 104, 35, 46, 1, 105,
+ 88, 15, 30, 124, 121, 41, 60, 6, 48, 1, 93, 111, 34, 125, 113, 121, 47, 11, 10, 78, 55, 60, 114,
+ 66, 69, 72, 80, 47, 68, 13, 81, 75, 41, 53, 119, 50, 103, 123, 55, 125, 10, 91, 113, 5, 125, 6,
+ 24, 11, 37, 5, 124, 2, 89, 89, 43, 53, 13, 2, 54, 40, 125, 70, 117, 74, 60, 69, 22, 99, 96,
+ 103, 126, 98, 39, 99, 10, 86, 31, 36, 30, 2, 34, 71, 91, 105, 10, 39, 126, 15, 103, 91, 83, 13,
+ 46, 60, 54, 9, 124, 40, 19, 65, 50, 100, 117, 116, 46, 103, 118, 24, 104, 109, 57, 28, 93, 49, 96,
+ 85, 127, 104, 8, 105, 127, 118, 58, 8, 13, 92, 104, 60, 71, 113, 20, 55, 76, 82, 30, 59, 48, 48,
+ 19, 105, 80, 117, 100, 58, 64, 121, 72, 10, 56, 88, 26, 49, 60, 5, 90, 99, 51, 108, 77, 35, 121,
+ 24, 126, 80, 123, 89, 56, 49, 3, 13, 26, 104, 55, 19, 105, 95, 24, 102, 111, 24, 84, 33, 55, 68,
+ 106, 88, 3, 76, 98, 57, 67, 22, 49, 40, 42, 108, 115, 7, 123, 54, 125, 5, 5, 27, 74, 111, 108,
+ 22, 109, 88, 69, 36, 26, 8, 17, 39, 81, 63, 91, 78, 70, 123, 110, 122, 88, 63, 7, 111, 32, 26,
+ 111, 109, 92, 76, 63, 13, 35, 37, 119, 91, 31, 59, 99, 115, 44, 5, 127, 98, 10, 51, 5, 97, 89,
+ 126, 73, 10, 24, 65, 15, 21, 28, 93, 46, 87, 5, 66, 57, 5, 79, 43, 64, 101, 44, 91, 118, 39,
+ 94, 59, 55, 87, 42, 99, 58, 11, 38, 10, 17, 43, 85, 61, 45, 37, 89, 106, 85, 80, 70, 124, 13,
+ 29, 85, 3, 104, 13, 106, 117, 123, 17, 76, 5, 14, 37, 58, 44, 88, 74, 63, 62, 73, 115, 23, 47,
+ 126, 62, 4, 9, 34, 41, 74, 40, 97, 3, 35, 91, 26, 102, 86, 29, 32, 78, 122, 59, 13, 5, 43,
+ 89, 84, 19, 72, 5, 104, 53, 71, 47, 3, 67, 20, 4, 33, 46, 17, 52, 56, 28, 124, 13, 22, 107,
+ 127, 70, 38, 20, 65, 98, 2, 4, 17, 41, 12, 54, 108, 71, 3, 7, 54, 89, 122, 3, 58, 88, 100,
+ 0, 37, 54, 41, 17, 2, 83, 89, 74, 103, 78, 54, 93, 10, 71, 2, 73, 113, 89, 112, 44, 1, 14,
+ 42, 40, 27, 12, 13, 85, 126, 61, 106, 27, 92, 43, 77, 88, 36, 124, 102, 28, 106, 127, 50, 26, 81,
+ 59, 78, 70, 84, 39, 105, 90, 66, 56, 97, 119, 86, 65, 40, 12, 62, 116, 70, 108, 118, 82, 1, 111,
+ 124, 90, 0, 72, 91, 117, 111, 19, 71, 80, 42, 36, 115, 46, 44, 83, 40, 32, 59, 85, 84, 19, 3,
+ 53, 125, 65, 17, 63, 31, 14, 111, 48, 102, 73, 17, 11, 80, 73, 126, 105, 16, 95, 98, 41, 122, 15,
+ 37, 50, 15, 121, 67, 36, 37, 52, 23, 3, 114, 109, 76, 25, 37, 101, 76, 87, 25, 88, 105, 42, 91,
+ 104, 101, 89, 111, 39, 118, 19, 126, 5, 32, 68, 45, 33, 12, 6, 76, 69, 50, 10, 124, 114, 25, 1,
+ 40, 10, 105, 105, 103, 33, 119, 103, 89, 122, 86, 126, 18, 64, 3, 82, 104, 32, 26, 30, 82, 57, 47,
+ 57, 105, 119, 125, 101, 58, 27, 110, 46, 19, 109, 111, 117, 2, 3, 64, 73, 83, 21, 71, 29, 61, 123,
+ 94, 4, 15, 59, 60, 39, 100, 101, 80, 21, 69, 97, 84, 76, 114, 113, 36, 107, 84, 22, 26, 18, 87,
+ 107, 24, 73, 59, 121, 117, 78, 27, 56, 73, 57, 74, 47, 11, 37, 124, 53, 78, 11, 2, 61, 75, 107,
+ 43, 22, 14, 15, 113, 120, 126, 104, 35, 87, 119, 78, 19, 79, 1, 96, 100, 48, 36, 93, 54, 76, 96,
+ 12, 29, 127, 80, 126, 41, 86, 117, 40, 20, 81, 93, 0, 53, 13, 124, 113, 55, 107, 118, 21, 9, 12,
+ 28, 2, 92, 17, 10, 41, 60, 121, 59, 43, 92, 116, 30, 110, 11, 98, 51, 71, 61, 116, 32, 29, 119,
+ 107, 106, 58, 114, 117, 88, 55, 120, 42, 90, 32, 87, 104, 109, 79, 103, 122, 56, 67, 46, 107, 42, 25,
+ 122, 80, 23, 1, 121, 76, 82, 102, 92, 84, 6, 126, 125, 45, 83, 85, 3, 125, 124, 14, 89, 71, 56,
+ 115, 64, 69, 83, 55, 124, 118, 11, 38, 94, 73, 97, 3, 112, 45, 5, 51, 77, 56, 1, 101, 46, 10,
+ 53, 77, 46, 28, 26, 104, 105, 45, 86, 81, 3, 7, 104, 95, 5, 15, 51, 11, 95, 9, 87, 30, 100,
+ 90, 20, 66, 85, 57, 100, 0, 110, 24, 76, 53, 24, 107, 98, 101, 112, 57, 99, 20, 62, 49, 125, 43,
+ 12, 123, 102, 14, 64, 68, 83, 94, 127, 84, 124, 64, 36, 46, 13, 39, 67, 71, 9, 44, 122, 36, 125,
+ 16, 45, 90, 98, 35, 125, 20, 25, 81, 21, 8, 76, 45, 76, 26, 115, 52, 66, 53, 120, 107, 54, 115,
+ 63, 9, 2, 2, 27, 38, 43, 90, 67, 91, 56, 82, 109, 17, 30, 46, 21, 49, 60, 19, 6, 10, 122,
+ 33, 68, 86, 23, 87, 92, 62, 105, 110, 7, 8, 77, 120, 67, 90, 18, 57, 44, 3, 61, 68, 92, 42,
+ 116, 106, 92, 71, 5, 22, 105, 69, 6, 112, 32, 44, 91, 66, 111, 53, 67, 66, 110, 25, 123, 71, 125,
+ 113, 35, 75, 96, 32, 1, 88, 43, 115, 93, 59, 78, 116, 39, 16, 46, 29, 75, 58, 99, 69, 106, 31,
+ 102, 104, 94, 29, 81, 113, 59, 91, 43, 100, 74, 83, 85, 3, 26, 6, 56, 66, 69, 87, 83, 18, 88,
+ 107, 15, 117, 35, 97, 69, 52, 40, 69, 86, 82, 114, 84, 97, 76, 11, 49, 18, 62, 53, 114, 88, 71,
+ 112, 46, 40, 91, 17, 5, 34, 5, 5, 102, 4, 15, 109, 57, 16, 38, 26, 61, 43, 13, 111, 112, 55,
+ 15, 35, 9, 67, 62, 26, 35, 105, 103, 13, 55, 84, 48, 60, 70, 102, 123, 121, 28, 105, 73, 5, 89,
+ 44, 3, 64, 106, 95, 68, 41, 40, 117, 4, 51, 25, 100, 4, 9, 115, 21, 51, 36, 81, 21, 90, 75,
+ 20, 25, 125, 122, 88, 16, 52, 107, 3, 54, 7, 7, 39, 102, 91, 76, 104, 118, 64, 127, 72, 35, 54,
+ 33, 50, 121, 29, 85, 0, 43, 14, 11, 53, 76, 49, 49, 127, 116, 77, 117, 107, 42, 89, 81, 14, 117,
+ 59, 98, 115, 46, 57, 126, 80, 76, 75, 80, 121, 102, 64, 29, 126, 97, 46, 13, 46, 110, 102, 82, 4,
+ 102, 8, 51, 61, 76, 69, 69, 60, 13, 22, 95, 16, 89, 20, 24, 119, 12, 33, 72, 57, 58, 17, 44,
+ 76, 126, 106, 74, 5, 90, 95, 51, 95, 126, 76, 103, 126, 6, 19, 49, 10, 43, 11, 26, 53, 108, 71,
+ 38, 57, 122, 12, 75, 67, 55, 34, 88, 94, 51, 96, 5, 120, 1, 9, 6, 110, 60, 122, 83, 127, 95,
+ 125, 87, 90, 4, 105, 66, 45, 3, 7, 73, 29, 97, 112, 66, 100, 92, 113, 21, 6, 116, 53, 46, 74,
+ 39, 90, 30, 114, 100, 75, 66, 89, 35, 51, 28, 89, 76, 5, 116, 96, 49, 118, 43, 14, 89, 63, 5,
+ 0, 106, 96, 82, 83, 58, 103, 69, 48, 31, 64, 108, 78, 122, 86, 82, 113, 10, 51, 21, 59, 21, 122,
+ 49, 71, 62, 8, 4, 3, 125, 105, 61, 8, 78, 33, 36, 7, 66, 89, 109, 45, 92, 6, 102, 94, 32,
+ 79, 9, 68, 28, 85, 57, 126, 84, 38, 87, 40, 46, 76, 103, 39, 86, 117, 83, 36, 87, 6, 0, 108,
+ 122, 12, 14, 2, 99, 42, 45, 99, 21, 106, 32, 127, 91, 13, 38, 61, 57, 93, 85, 3, 10, 24, 34,
+ 25, 10, 85, 116, 61, 68, 67, 11, 124, 20, 44, 21, 71, 60, 49, 114, 62, 91, 115, 51, 44, 72, 29,
+ 57, 71, 3, 22, 22, 74, 20, 38, 66, 105, 62, 76, 50, 126, 49, 73, 107, 23, 121, 58, 103, 6, 41,
+ 56, 11, 45, 36, 4, 76, 62, 60, 52, 95, 72, 60, 52, 46, 30, 10, 109, 57, 91, 28, 110, 59, 60,
+ 114, 29, 28, 115, 61, 29, 51, 48, 92, 3, 119, 64, 81, 78, 106, 36, 69, 15, 80, 96, 32, 11, 19,
+ 71, 84, 82, 36, 100, 13, 107, 98, 99, 1, 20, 23, 83, 30, 73, 105, 23, 113, 31, 78, 83, 17, 29,
+ 85, 24, 64, 77, 7, 28, 92, 73, 121, 108, 118, 26, 106, 103, 32, 125, 125, 61, 64, 34, 22, 29, 16,
+ 68, 29, 37, 59, 54, 64, 122, 23, 58, 121, 84, 74, 96, 28, 126, 77, 51, 13, 35, 93, 57, 105, 27,
+ 3, 103, 19, 66, 82, 26, 40, 87, 49, 48, 117, 73, 56, 91, 79, 113, 91, 40, 77, 17, 68, 66, 117,
+ 45, 88, 0, 123, 19, 82, 36, 8, 78, 94, 39, 28, 126, 39, 35, 10, 22, 79, 43, 45, 63, 50, 97,
+ 30, 71, 44, 37, 106, 67, 13, 65, 111, 114, 60, 27, 109, 97, 27, 22, 114, 94, 103, 77, 88, 95, 13,
+ 118, 81, 25, 35, 126, 72, 6, 40, 85, 32, 64, 107, 85, 83, 71, 20, 91, 87, 5, 26, 107, 16, 64,
+ 42, 127, 7, 90, 81, 79, 86, 29, 96, 91, 71, 30, 42, 106, 9, 42, 111, 12, 30, 116, 106, 126, 69,
+ 99, 9, 11, 27, 69, 17, 106, 77, 114, 69, 74, 94, 72, 8, 116, 4, 127, 15, 64, 47, 120, 116, 71,
+ 52, 89, 123, 105, 43, 37, 79, 18, 59, 107, 88, 88, 76, 50, 38, 63, 6, 110, 75, 63, 68, 51, 124,
+ 99, 76, 77, 55, 23, 110, 51, 34, 94, 102, 14, 70, 83, 70, 75, 78, 67, 82, 35, 70, 84, 64, 29,
+ 1, 47, 110, 123, 10, 61, 28, 108, 64, 81, 120, 99, 85, 75, 36, 123, 107, 35, 62, 83, 46, 101, 26,
+ 15, 15, 107, 17, 57, 99, 19, 74, 64, 113, 70, 21, 79, 87, 87, 7, 107, 36, 93, 127, 25, 118, 88,
+ 9, 34, 124, 51, 87, 17, 83, 8, 66, 5, 4, 49, 120, 64, 58, 115, 62, 126, 46, 29, 10, 114, 42,
+ 18, 26, 61, 78, 39, 69, 38, 57, 47, 48, 35, 36, 17, 70, 36, 71, 52, 117, 33, 85, 52, 40, 117,
+ 41, 42, 9, 88, 111, 74, 123, 95, 1, 69, 23, 84, 54, 44, 15, 20, 32, 20, 43, 33, 71, 41, 105,
+ 91, 88, 23, 13, 67, 45, 62, 116, 54, 30, 93, 71, 91, 92, 10, 77, 7, 54, 11, 104, 94, 45, 82,
+ 33, 78, 55, 40, 103, 32, 61, 98, 108, 38, 111, 79, 11, 13, 58, 26, 93, 14, 14, 99, 33, 30, 101,
+ 67, 117, 121, 97, 52, 95, 87, 105, 23, 24, 3, 64, 114, 50, 39, 61, 55, 86, 52, 68, 72, 100, 104,
+ 84, 102, 97, 19, 83, 35, 57, 89, 32, 6, 98, 80, 118, 26, 110, 96, 107, 41, 91, 9, 78, 62, 102,
+ 66, 103, 80, 60, 14, 75, 127, 26, 66, 14, 14, 65, 105, 100, 28, 13, 74, 102, 98, 125, 85, 6, 10,
+ 81, 39, 23, 58, 65, 106, 15, 37, 85, 89, 47, 14, 80, 74, 75, 13, 67, 55, 93, 93, 83, 28, 78,
+ 108, 6, 105, 76, 59, 3, 99, 127, 54, 99, 112, 55, 18, 125, 13, 115, 119, 70, 39, 30, 69, 72, 66,
+ 119, 80, 39, 114, 111, 90, 84, 118, 64, 9, 91, 105, 21, 106, 121, 76, 65, 63, 53, 9, 93, 57, 32,
+ 31, 35, 38, 7, 12, 102, 13, 40, 5, 7, 23, 49, 2, 32, 9, 18, 13, 4, 63, 21, 118, 120, 14,
+ 121, 73, 41, 8, 83, 54, 57, 76, 9, 126, 90, 109, 41, 98, 45, 50, 92, 27, 18, 20, 76, 5, 119,
+ 53, 120, 32, 39, 77, 108, 109, 79, 67, 80, 2, 11, 5, 25, 40, 13, 62, 96, 31, 100, 62, 112, 52,
+ 95, 18, 99, 8, 91, 84, 78, 53, 10, 10, 68, 26, 107, 11, 66, 69, 83, 6, 41, 17, 8, 46, 1,
+ 114, 25, 99, 53, 120, 44, 83, 32, 94, 75, 96, 55, 52, 110, 57, 12, 3, 121, 57, 74, 105, 39, 55,
+ 108, 4, 30, 71, 61, 112, 52, 121, 126, 104, 81, 124, 58, 70, 63, 3, 12, 109, 42, 79, 8, 113, 28,
+ 65, 84, 81, 61, 74, 43, 100, 0, 22, 80, 30, 46, 117, 3, 122, 60, 13, 69, 13, 23, 99, 33, 80,
+ 43, 127, 8, 32, 98, 9, 10, 2, 97, 21, 19, 92, 32, 88, 103, 13, 116, 98, 120, 83, 81, 4, 63,
+ 3, 1, 64, 79, 98, 38, 52, 101, 65, 105, 113, 102, 41, 45, 28, 101, 114, 116, 70, 50, 65, 22, 38,
+ 53, 91, 1, 100, 92, 75, 10, 105, 116, 64, 52, 126, 74, 119, 1, 103, 120, 89, 88, 72, 12, 20, 76,
+ 81, 84, 65, 49, 68, 15, 56, 114, 28, 43, 94, 65, 69, 119, 87, 0, 115, 26, 74, 95, 92, 99, 52,
+ 56, 122, 22, 92, 73, 4, 112, 102, 105, 97, 80, 14, 84, 74, 36, 1, 105, 27, 42, 92, 95, 15, 72,
+ 80, 28, 57, 42, 72, 111, 81, 121, 98, 49, 105, 88, 28, 30, 77, 119, 115, 1, 126, 38, 22, 41, 87,
+ 96, 117, 93, 28, 30, 36, 91, 92, 79, 3, 88, 66, 36, 75, 15, 98, 25, 88, 104, 23, 36, 5, 4,
+ 26, 35, 47, 77, 16, 17, 105, 110, 106, 70, 25, 50, 1, 33, 77, 96, 8, 24, 104, 80, 40, 9, 97,
+ 99, 17, 82, 88, 41, 10, 107, 50, 11, 48, 80, 4, 27, 123, 14, 42, 99, 84, 75, 65, 7, 80, 115,
+ 114, 90, 99, 46, 11, 34, 95, 12, 85, 25, 58, 29, 22, 88, 45, 36, 101, 67, 1, 10, 112, 39, 101,
+ 43, 9, 112, 23, 39, 87, 113, 57, 29, 91, 35, 90, 53, 113, 27, 52, 50, 44, 75, 78, 108, 102, 89,
+ 127, 97, 94, 27, 89, 121, 46, 35, 23, 87, 100, 83, 39, 65, 68, 67, 91, 126, 120, 29, 115, 16, 20,
+ 105, 36, 85, 46, 9, 13, 28, 81, 7, 37, 120, 88, 72, 27, 78, 116, 31, 66, 73, 21, 13, 101, 37,
+ 59, 15, 28, 50, 61, 90, 11, 102, 99, 98, 68, 42, 107, 98, 88, 80, 98, 113, 23, 4, 63, 36, 115,
+ 61, 91, 96, 46, 18, 102, 83, 11, 106, 49, 50, 108, 120, 110, 74, 95, 7, 6, 114, 99, 74, 4, 60,
+ 42, 66, 9, 90, 19, 118, 19, 23, 127, 116, 10, 48, 106, 18, 49, 19, 81, 62, 32, 98, 26, 39, 41,
+ 5, 113, 112, 32, 57, 46, 76, 57, 106, 15, 32, 48, 84, 28, 60, 28, 32, 38, 23, 29, 81, 13, 97,
+ 51, 69, 59, 8, 73, 13, 41, 71, 54, 6, 55, 64, 74, 74, 126, 93, 80, 56, 33, 43, 76, 18, 93,
+ 31, 77, 38, 118, 68, 122, 13, 80, 63, 60, 105, 2, 122, 60, 37, 76, 32, 77, 95, 107, 41, 108, 42,
+ 70, 77, 124, 33, 33, 119, 19, 102, 103, 63, 44, 83, 85, 118, 37, 118, 6, 0, 103, 39, 4, 109, 93,
+ 43, 24, 83, 62, 86, 69, 124, 6, 91, 114, 95, 90, 5, 124, 10, 96, 45, 71, 28, 120, 96, 77, 84,
+ 46, 26, 108, 111, 105, 63, 35, 36, 18, 3, 85, 63, 119, 49, 118, 37, 42, 80, 107, 6, 52, 19, 39,
+ 37, 125, 35, 101, 30, 66, 71, 98, 76, 98, 28, 107, 58, 109, 65, 104, 94, 9, 41, 47, 52, 101, 62,
+ 29, 66, 81, 102, 26, 77, 83, 123, 91, 65, 77, 54, 45, 80, 33, 112, 57, 79, 98, 85, 88, 60, 5,
+ 49, 63, 78, 53, 36, 95, 119, 42, 49, 89, 65, 13, 85, 50, 31, 1, 112, 109, 77, 73, 62, 87, 62,
+ 107, 112, 56, 47, 56, 76, 119, 70, 94, 0, 76, 82, 19, 120, 97, 2, 10, 121, 86, 70, 41, 86, 106,
+ 7, 68, 19, 39, 108, 109, 18, 11, 5, 77, 100, 117, 64, 9, 77, 61, 48, 0, 80, 120, 64, 121, 21,
+ 80, 105, 30, 19, 114, 39, 1, 90, 98, 19, 114, 120, 54, 57, 52, 112, 54, 46, 7, 15, 2, 50, 116,
+ 44, 11, 20, 31, 118, 114, 57, 69, 124, 15, 87, 11, 90, 73, 1, 45, 20, 2, 4, 118, 60, 24, 88,
+ 30, 95, 125, 127, 112, 111, 42, 39, 113, 25, 22, 59, 4, 85, 86, 69, 113, 5, 76, 86, 23, 95, 105,
+ 113, 104, 25, 18, 50, 108, 20, 56, 14, 117, 24, 20, 77, 5, 13, 72, 109, 10, 69, 103, 117, 82, 98,
+ 81, 93, 7, 5, 11, 44, 22, 45, 120, 59, 126, 112, 77, 100, 38, 86, 3, 121, 50, 75, 77, 3, 118,
+ 3, 87, 19, 12, 23, 1, 71, 83, 41, 63, 91, 38, 110, 8, 113, 58, 48, 46, 94, 47, 127, 110, 114,
+ 77, 5, 18, 84, 68, 53, 34, 27, 57, 17, 44, 21, 49, 43, 127, 65, 74, 9, 70, 59, 86, 37, 49,
+ 98, 38, 49, 116, 81, 56, 116, 25, 32, 57, 44, 14, 31, 7, 103, 90, 92, 98, 120, 55, 70, 16, 84,
+ 38, 66, 24, 120, 83, 35, 78, 6, 91, 20, 100, 81, 68, 49, 84, 102, 16, 116, 75, 111, 20, 94, 115,
+ 103, 9, 106, 102, 97, 29, 117, 7, 63, 127, 75, 124, 32, 75, 89, 76, 25, 105, 29, 59, 33, 118, 97,
+ 125, 58, 108, 18, 10, 84, 112, 33, 91, 111, 16, 2, 94, 122, 23, 22, 121, 80, 90, 2, 42, 77, 119,
+ 79, 113, 22, 86, 36, 101, 73, 79, 67, 43, 58, 5, 53, 69, 61, 119, 114, 102, 29, 5, 52, 101, 46,
+ 27, 91, 74, 123, 58, 59, 116, 121, 3, 88, 112, 41, 114, 61, 32, 63, 12, 109, 49, 124, 97, 42, 61,
+ 42, 39, 32, 22, 118, 126, 60, 104, 97, 78, 106, 23, 82, 97, 94, 126, 60, 21, 37, 115, 56, 48, 126,
+ 101, 48, 91, 66, 20, 111, 31, 51, 21, 53, 55, 68, 104, 85, 27, 18, 35, 30, 23, 22, 44, 73, 33,
+ 30, 45, 26, 92, 27, 116, 126, 51, 44, 101, 23, 33, 38, 50, 53, 79, 36, 71, 0, 42, 112, 23, 124,
+ 48, 49, 29, 6, 58, 95, 29, 45, 100, 112, 100, 54, 57, 125, 105, 92, 117, 14, 34, 121, 36, 121, 85,
+ 39, 24, 108, 52, 19, 41, 116, 40, 15, 13, 116, 52, 19, 126, 111, 33, 19, 73, 60, 100, 25, 35, 127,
+ 27, 45, 49, 12, 98, 32, 43, 52, 71, 29, 48, 70, 88, 39, 39, 16, 27, 16, 8, 44, 23, 77, 116,
+ 78, 24, 72, 69, 122, 94, 82, 122, 28, 114, 96, 58, 95, 42, 99, 104, 97, 31, 45, 15, 50, 86, 53,
+ 84, 63, 40, 55, 34, 11, 93, 61, 3, 125, 70, 32, 108, 93, 7, 122, 7, 16, 29, 51, 98, 28, 42,
+ 64, 69, 22, 64, 80, 53, 116, 75, 33, 36, 14, 41, 2, 113, 57, 53, 105, 109, 83, 122, 119, 81, 109,
+ 3, 38, 45, 110, 71, 49, 9, 1, 105, 95, 71, 45, 116, 14, 51, 63, 63, 30, 97, 35, 23, 109, 8,
+ 27, 92, 10, 49, 66, 84, 32, 106, 73, 24, 100, 90, 77, 6, 118, 99, 20, 96, 41, 19, 35, 45, 66,
+ 78, 36, 60, 29, 67, 25, 0, 57, 104, 11, 116, 89, 73, 66, 88, 61, 59, 40, 104, 14, 4, 43, 125,
+ 34, 80, 122, 11, 109, 49, 52, 37, 25, 53, 71, 55, 96, 24, 55, 84, 118, 2, 56, 46, 33, 75, 20,
+ 37, 20, 49, 109, 115, 65, 26, 83, 45, 118, 5, 7, 51, 53, 22, 96, 80, 89, 72, 80, 107, 75, 127,
+ 33, 74, 106, 74, 49, 95, 94, 32, 35, 70, 41, 111, 46, 116, 67, 98, 98, 116, 88, 39, 41, 115, 17,
+ 90, 103, 20, 44, 40, 41, 103, 68, 30, 16, 8, 60, 74, 10, 118, 72, 17, 117, 110, 102, 67, 85, 98,
+ 31, 13, 105, 105, 60, 11, 106, 42, 79, 1, 27, 53, 123, 18, 94, 40, 79, 65, 57, 66, 91, 121, 29,
+ 61, 26, 43, 93, 99, 7, 78, 58, 53, 125, 24, 10, 116, 67, 72, 27, 20, 124, 105, 101, 79, 62, 51,
+ 58, 114, 32, 2, 6, 80, 34, 125, 88, 93, 48, 57, 1, 3, 41, 47, 70, 72, 73, 6, 114, 76, 93,
+ 18, 95, 61, 29, 53, 88, 27, 64, 15, 87, 36, 87, 60, 54, 49, 125, 106, 87, 95, 30, 38, 114, 83,
+ 51, 11, 82, 83, 46, 2, 91, 125, 26, 83, 112, 15, 32, 33, 17, 0, 121, 27, 87, 85, 29, 19, 30,
+ 41, 16, 88, 115, 2, 100, 85, 108, 89, 73, 53, 30, 70, 88, 20, 52, 102, 44, 30, 2, 107, 66, 120,
+ 7, 72, 79, 93, 36, 73, 46, 120, 118, 4, 73, 24, 124, 66, 110, 21, 46, 92, 111, 17, 96, 66, 29,
+ 44, 21, 41, 54, 71, 33, 34, 77, 17, 54, 23, 13, 97, 2, 0, 106, 31, 27, 126, 70, 82, 38, 14,
+ 107, 8, 127, 0, 100, 31, 52, 103, 26, 10, 106, 88, 51, 119, 28, 42, 0, 28, 68, 14, 55, 41, 80,
+ 104, 1, 6, 18, 63, 24, 107, 122, 24, 21, 119, 27, 60, 119, 74, 102, 10, 29, 5, 13, 5, 64, 1,
+ 12, 28, 115, 113, 96, 39, 84, 99, 73, 18, 25, 25, 79, 75, 115, 39, 94, 24, 6, 15, 87, 28, 40,
+ 106, 114, 92, 2, 53, 21, 52, 71, 25, 43, 118, 69, 86, 6, 88, 95, 10, 93, 105, 93, 127, 125, 61,
+ 36, 117, 104, 76, 47, 22, 84, 103, 23, 95, 95, 109, 39, 60, 1, 68, 31, 4, 72, 54, 74, 21, 118,
+ 40};
diff --git a/Tests/UnitTest/TestCases/TestData/requantize_s64/biases_data.h b/Tests/UnitTest/TestCases/TestData/requantize_s64/biases_data.h
index 42d1ae86..bbd481c9 100644
--- a/Tests/UnitTest/TestCases/TestData/requantize_s64/biases_data.h
+++ b/Tests/UnitTest/TestCases/TestData/requantize_s64/biases_data.h
@@ -1,6 +1,6 @@
-// Generated by generate_test_data.py using tensorflow version 2.10.0 (Keras version 2.10.0).
-// Interpreter from tensorflow version 2.10.0 and revision upstream/v2.10.0-0-g359c3cdfc5f.
+// Generated by test_settings.py using tensorflow version 2.15.0 (Keras version 2.15.0).
+// Interpreter from tensorflow version 2.15.0 and revision v2.15.0-2-g0b15fdfcb3f.
#pragma once
#include
-const int64_t requantize_s64_biases[2] = {47, 37};
+const int64_t requantize_s64_biases[8] = {2718092, 2556575, 646371, 1427241, 2010306, 3766647, 1886211, 1482898};
diff --git a/Tests/UnitTest/TestCases/TestData/requantize_s64/config_data.h b/Tests/UnitTest/TestCases/TestData/requantize_s64/config_data.h
index e014cca9..359f3f95 100644
--- a/Tests/UnitTest/TestCases/TestData/requantize_s64/config_data.h
+++ b/Tests/UnitTest/TestCases/TestData/requantize_s64/config_data.h
@@ -1,12 +1,12 @@
-// Generated by generate_test_data.py using tensorflow version 2.10.0 (Keras version 2.10.0).
-// Interpreter from tensorflow version 2.10.0 and revision upstream/v2.10.0-0-g359c3cdfc5f.
+// Generated by test_settings.py using tensorflow version 2.15.0 (Keras version 2.15.0).
+// Interpreter from tensorflow version 2.15.0 and revision v2.15.0-2-g0b15fdfcb3f.
#pragma once
-#define REQUANTIZE_S64_OUT_CH 2
-#define REQUANTIZE_S64_IN_CH 2
-#define REQUANTIZE_S64_INPUT_W 3
-#define REQUANTIZE_S64_INPUT_H 2
-#define REQUANTIZE_S64_DST_SIZE 4
-#define REQUANTIZE_S64_INPUT_SIZE 12
+#define REQUANTIZE_S64_OUT_CH 8
+#define REQUANTIZE_S64_IN_CH 8
+#define REQUANTIZE_S64_INPUT_W 4
+#define REQUANTIZE_S64_INPUT_H 4
+#define REQUANTIZE_S64_DST_SIZE 72
+#define REQUANTIZE_S64_INPUT_SIZE 128
#define REQUANTIZE_S64_OUT_ACTIVATION_MIN -32768
#define REQUANTIZE_S64_OUT_ACTIVATION_MAX 32767
#define REQUANTIZE_S64_INPUT_BATCHES 1
@@ -16,8 +16,8 @@
#define REQUANTIZE_S64_STRIDE_Y 1
#define REQUANTIZE_S64_PAD_X 0
#define REQUANTIZE_S64_PAD_Y 0
-#define REQUANTIZE_S64_OUTPUT_W 2
-#define REQUANTIZE_S64_OUTPUT_H 1
+#define REQUANTIZE_S64_OUTPUT_W 3
+#define REQUANTIZE_S64_OUTPUT_H 3
#define REQUANTIZE_S64_INPUT_OFFSET 0
#define REQUANTIZE_S64_OUTPUT_OFFSET 0
#define REQUANTIZE_S64_DILATION_X 1
diff --git a/Tests/UnitTest/TestCases/TestData/requantize_s64/input_data.h b/Tests/UnitTest/TestCases/TestData/requantize_s64/input_data.h
index 1a058e6d..16b016d2 100644
--- a/Tests/UnitTest/TestCases/TestData/requantize_s64/input_data.h
+++ b/Tests/UnitTest/TestCases/TestData/requantize_s64/input_data.h
@@ -1,6 +1,13 @@
-// Generated by generate_test_data.py using tensorflow version 2.10.0 (Keras version 2.10.0).
-// Interpreter from tensorflow version 2.10.0 and revision upstream/v2.10.0-0-g359c3cdfc5f.
+// Generated by test_settings.py using tensorflow version 2.15.0 (Keras version 2.15.0).
+// Interpreter from tensorflow version 2.15.0 and revision v2.15.0-2-g0b15fdfcb3f.
#pragma once
#include
-const int16_t requantize_s64_input[12] = {97, 100, 51, 39, 29, 117, -111, -104, 41, 38, 115, -113};
+const int16_t requantize_s64_input[128] = {
+ 12, 97, 80, 37, -72, 16, -110, -46, 109, -28, -21, 20, 24, 66, -110, -71, -31, -109, 90,
+ 11, 64, 77, 83, -38, -26, 44, 86, -109, -88, -39, 43, -36, 29, -95, -90, -36, -30, -41,
+ 8, 62, 25, -124, -107, -104, -113, -7, 18, 6, 44, -18, 5, -81, -18, 64, -49, -29, 82,
+ 124, 66, -63, -111, -103, 99, 109, -15, 101, -2, 39, 21, -42, -51, -115, -59, 25, -121, -69,
+ -46, 104, -20, -8, -91, 31, -114, 25, -27, 39, 79, -117, -28, -93, -31, 19, 107, 61, -8,
+ -125, -66, 97, -87, -98, -113, -111, 51, 65, 104, 76, 90, 110, -39, -98, -74, -56, -56, -48,
+ 34, -46, -107, 12, -74, 14, 96, 77, 85, -61, -17, 40, -18, 97};
diff --git a/Tests/UnitTest/TestCases/TestData/requantize_s64/output_mult_data.h b/Tests/UnitTest/TestCases/TestData/requantize_s64/output_mult_data.h
index a2fc73d1..1f5cffeb 100644
--- a/Tests/UnitTest/TestCases/TestData/requantize_s64/output_mult_data.h
+++ b/Tests/UnitTest/TestCases/TestData/requantize_s64/output_mult_data.h
@@ -1,6 +1,7 @@
-// Generated by generate_test_data.py using tensorflow version 2.10.0 (Keras version 2.10.0).
-// Interpreter from tensorflow version 2.10.0 and revision upstream/v2.10.0-0-g359c3cdfc5f.
+// Generated by test_settings.py using tensorflow version 2.15.0 (Keras version 2.15.0).
+// Interpreter from tensorflow version 2.15.0 and revision v2.15.0-2-g0b15fdfcb3f.
#pragma once
#include
-const int32_t requantize_s64_output_mult[2] = {1853463365, 1838451297};
+const int32_t requantize_s64_output_mult[8] =
+ {1414739540, 1453951389, 1391394644, 1429974075, 1417631388, 1463499963, 1461229183, 1369934873};
diff --git a/Tests/UnitTest/TestCases/TestData/requantize_s64/output_ref_data.h b/Tests/UnitTest/TestCases/TestData/requantize_s64/output_ref_data.h
index 75a7fa4c..8037cbdd 100644
--- a/Tests/UnitTest/TestCases/TestData/requantize_s64/output_ref_data.h
+++ b/Tests/UnitTest/TestCases/TestData/requantize_s64/output_ref_data.h
@@ -1,6 +1,10 @@
-// Generated by generate_test_data.py using tensorflow version 2.10.0 (Keras version 2.10.0).
-// Interpreter from tensorflow version 2.10.0 and revision upstream/v2.10.0-0-g359c3cdfc5f.
+// Generated by test_settings.py using tensorflow version 2.15.0 (Keras version 2.15.0).
+// Interpreter from tensorflow version 2.15.0 and revision v2.15.0-2-g0b15fdfcb3f.
#pragma once
#include
-const int16_t requantize_s64_output_ref[4] = {-68, 186, -134, -116};
+const int16_t requantize_s64_output_ref[72] = {
+ 3491, 3462, 833, 1853, 2589, 5061, 2542, 1794, 3482, 3408, 813, 1895, 2613, 4994, 2499, 1816, 3508, 3371,
+ 766, 1820, 2610, 4960, 2545, 1878, 3523, 3346, 811, 1887, 2611, 5067, 2517, 1843, 3481, 3363, 787, 1903,
+ 2590, 4992, 2493, 1863, 3501, 3384, 896, 1931, 2619, 4995, 2398, 1810, 3497, 3405, 835, 1929, 2571, 5008,
+ 2538, 1832, 3566, 3349, 806, 1854, 2573, 4989, 2502, 1870, 3500, 3393, 754, 1804, 2560, 4972, 2570, 1898};
diff --git a/Tests/UnitTest/TestCases/TestData/requantize_s64/output_shift_data.h b/Tests/UnitTest/TestCases/TestData/requantize_s64/output_shift_data.h
index c73834a4..de069ed5 100644
--- a/Tests/UnitTest/TestCases/TestData/requantize_s64/output_shift_data.h
+++ b/Tests/UnitTest/TestCases/TestData/requantize_s64/output_shift_data.h
@@ -1,6 +1,6 @@
-// Generated by generate_test_data.py using tensorflow version 2.10.0 (Keras version 2.10.0).
-// Interpreter from tensorflow version 2.10.0 and revision upstream/v2.10.0-0-g359c3cdfc5f.
+// Generated by test_settings.py using tensorflow version 2.15.0 (Keras version 2.15.0).
+// Interpreter from tensorflow version 2.15.0 and revision v2.15.0-2-g0b15fdfcb3f.
#pragma once
#include
-const int32_t requantize_s64_output_shift[2] = {-7, -7};
+const int32_t requantize_s64_output_shift[8] = {-9, -9, -9, -9, -9, -9, -9, -9};
diff --git a/Tests/UnitTest/TestCases/TestData/requantize_s64/test_data.h b/Tests/UnitTest/TestCases/TestData/requantize_s64/test_data.h
index 8102687f..7930b388 100644
--- a/Tests/UnitTest/TestCases/TestData/requantize_s64/test_data.h
+++ b/Tests/UnitTest/TestCases/TestData/requantize_s64/test_data.h
@@ -1,5 +1,5 @@
-// Generated by generate_test_data.py using tensorflow version 2.10.0 (Keras version 2.10.0).
-// Interpreter from tensorflow version 2.10.0 and revision upstream/v2.10.0-0-g359c3cdfc5f.
+// Generated by test_settings.py using tensorflow version 2.15.0 (Keras version 2.15.0).
+// Interpreter from tensorflow version 2.15.0 and revision v2.15.0-2-g0b15fdfcb3f.
#include "biases_data.h"
#include "config_data.h"
#include "input_data.h"
diff --git a/Tests/UnitTest/TestCases/TestData/requantize_s64/weights_data.h b/Tests/UnitTest/TestCases/TestData/requantize_s64/weights_data.h
index 816357f5..f263b88a 100644
--- a/Tests/UnitTest/TestCases/TestData/requantize_s64/weights_data.h
+++ b/Tests/UnitTest/TestCases/TestData/requantize_s64/weights_data.h
@@ -1,7 +1,19 @@
-// Generated by generate_test_data.py using tensorflow version 2.10.0 (Keras version 2.10.0).
-// Interpreter from tensorflow version 2.10.0 and revision upstream/v2.10.0-0-g359c3cdfc5f.
+// Generated by test_settings.py using tensorflow version 2.15.0 (Keras version 2.15.0).
+// Interpreter from tensorflow version 2.15.0 and revision v2.15.0-2-g0b15fdfcb3f.
#pragma once
#include
-const int8_t requantize_s64_weights[16] =
- {-95, -110, -39, 99, -127, 73, -58, 108, 101, 127, -17, -89, 24, -99, -34, 87};
+const int8_t requantize_s64_weights[256] = {
+ 74, 87, -103, 86, 32, 107, -13, -53, -118, 113, -41, -13, -45, -91, -26, -106, 89, 86, 49, -127,
+ 51, -58, -80, -117, 16, -69, -115, 83, 14, 86, 79, 76, -82, 41, 36, 77, -120, 40, -97, -75,
+ -14, -81, 16, 22, -60, -55, -100, -22, -56, -127, -77, -30, 75, -13, 49, -37, 33, -52, 19, -8,
+ -6, -79, -48, 2, -54, 80, 39, -14, -45, -126, -52, -86, 86, 114, 28, 107, -53, -109, 107, 121,
+ 72, -10, -84, -7, -43, -104, 69, -13, -83, 69, -103, -4, 22, 26, -127, 12, 116, 94, -50, 54,
+ -55, 6, -45, 90, -103, 8, 28, -114, -44, 127, 96, 25, -20, 107, -102, -52, -96, -39, 61, -100,
+ 8, -88, -79, 76, 80, -53, 65, -22, 60, 18, 112, -48, 2, 127, -19, 3, -54, 1, -43, -93,
+ -51, 84, -1, 88, 44, -44, -29, -40, 117, 68, -17, -15, 0, 37, -29, -5, 60, 112, -68, 64,
+ -17, 54, -81, 122, -49, -8, -121, 68, 80, -127, -104, -117, -56, -49, -53, 122, -6, -93, 115, -46,
+ 117, -82, 48, 44, -38, -23, -34, -84, 29, -70, 8, -48, -66, -47, 104, 61, -8, -122, 109, -70,
+ -28, -101, 38, -119, 23, 114, -98, -33, 73, 58, -14, 96, -67, -87, -120, 127, 56, -23, 37, -56,
+ 5, 39, 61, 47, -71, -88, -49, -111, -54, 110, -68, 56, -2, -50, -62, 87, -58, -15, -12, -56,
+ -114, -28, 50, -22, 48, 39, -56, 63, -38, 115, 127, 61, 52, -22, 58, 118};
diff --git a/Tests/UnitTest/TestCases/test_arm_convolve_fast_s16/CMakeLists.txt b/Tests/UnitTest/TestCases/test_arm_convolve_fast_s16/CMakeLists.txt
deleted file mode 100644
index 1f1a3093..00000000
--- a/Tests/UnitTest/TestCases/test_arm_convolve_fast_s16/CMakeLists.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-#
-# Copyright (C) 2010-2021 Arm Limited or its affiliates. All rights reserved.
-#
-# SPDX-License-Identifier: Apache-2.0
-#
-# Licensed under the Apache License, Version 2.0 (the License); you may
-# not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an AS IS BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-add_cmsis_nn_unit_test_executable(test_arm_convolve_fast_s16)
-
-target_sources(test_arm_convolve_fast_s16 PRIVATE
- Unity/unity_test_arm_convolve_fast_s16.c
- Unity/TestRunner/unity_test_arm_convolve_fast_s16_runner.c)
diff --git a/Tests/UnitTest/TestCases/test_arm_convolve_fast_s16/Unity/unity_test_arm_convolve_fast_s16.c b/Tests/UnitTest/TestCases/test_arm_convolve_fast_s16/Unity/unity_test_arm_convolve_fast_s16.c
deleted file mode 100644
index cff35bc8..00000000
--- a/Tests/UnitTest/TestCases/test_arm_convolve_fast_s16/Unity/unity_test_arm_convolve_fast_s16.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2010-2021, 2023 Arm Limited or its affiliates. All rights reserved.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed under the Apache License, Version 2.0 (the License); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include
-#include
-#include
-#include
-#include
-
-#include "../test_arm_convolve_fast_s16.c"
-#include "unity.h"
-
-#ifdef USING_FVP_CORSTONE_300
-extern void uart_init(void);
-#endif
-
-/* This function is called from the autogenerated file.
- * The name must be exactly like this
- */
-void setUp(void)
-{ /* This is run before EACH TEST */
-#ifdef USING_FVP_CORSTONE_300
- uart_init();
-#endif
-}
-
-/* This function is called from the autogenerated file.
- * The name must be exactly like this
- */
-void tearDown(void) {}
-
-void test_int16xint8_arm_convolve_fast_s16(void) { int16xint8_arm_convolve_fast_s16(); }
-void test_requantize_s64_arm_convolve_fast_s16(void) { requantize_s64_arm_convolve_fast_s16(); }
-void test_buffer_size_arm_convolve_fast_s16(void) { buffer_size_arm_convolve_fast_s16(); }
-void test_buffer_size_mve_arm_convolve_fast_s16(void) { buffer_size_mve_arm_convolve_fast_s16(); }
-void test_buffer_size_dsp_arm_convolve_fast_s16(void) { buffer_size_dsp_arm_convolve_fast_s16(); }
diff --git a/Tests/UnitTest/TestCases/test_arm_convolve_fast_s16/test_arm_convolve_fast_s16.c b/Tests/UnitTest/TestCases/test_arm_convolve_fast_s16/test_arm_convolve_fast_s16.c
deleted file mode 100644
index 97854c58..00000000
--- a/Tests/UnitTest/TestCases/test_arm_convolve_fast_s16/test_arm_convolve_fast_s16.c
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * SPDX-FileCopyrightText: Copyright 2010-2023 Arm Limited and/or its affiliates All rights
- * reserved.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed under the Apache License, Version 2.0 (the License); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include
-
-#include
-#include
-
-#include "../TestData/int16xint8/test_data.h"
-#include "../TestData/requantize_s64/test_data.h"
-#include "../Utils/validate.h"
-
-void int16xint8_arm_convolve_fast_s16(void)
-{
- int16_t output[INT16XINT8_DST_SIZE] = {0};
-
- cmsis_nn_context ctx;
- cmsis_nn_conv_params conv_params;
- cmsis_nn_per_channel_quant_params quant_params;
- cmsis_nn_dims input_dims;
- cmsis_nn_dims filter_dims;
- cmsis_nn_dims bias_dims;
- cmsis_nn_dims output_dims;
-
- const int64_t *bias_data = int16xint8_biases;
- const int8_t *kernel_data = int16xint8_weights;
- const int16_t *input_data = int16xint8_input;
- const int16_t *output_ref = int16xint8_output_ref;
- const int32_t output_ref_size = INT16XINT8_DST_SIZE;
-
- input_dims.n = INT16XINT8_INPUT_BATCHES;
- input_dims.w = INT16XINT8_INPUT_W;
- input_dims.h = INT16XINT8_INPUT_H;
- input_dims.c = INT16XINT8_IN_CH;
- filter_dims.w = INT16XINT8_FILTER_X;
- filter_dims.h = INT16XINT8_FILTER_Y;
- output_dims.w = INT16XINT8_OUTPUT_W;
- output_dims.h = INT16XINT8_OUTPUT_H;
- output_dims.c = INT16XINT8_OUT_CH;
-
- conv_params.padding.w = INT16XINT8_PAD_X;
- conv_params.padding.h = INT16XINT8_PAD_Y;
- conv_params.stride.w = INT16XINT8_STRIDE_X;
- conv_params.stride.h = INT16XINT8_STRIDE_Y;
- conv_params.dilation.w = INT16XINT8_DILATION_X;
- conv_params.dilation.h = INT16XINT8_DILATION_X;
-
- conv_params.input_offset = 0;
- conv_params.output_offset = 0;
- conv_params.activation.min = INT16XINT8_OUT_ACTIVATION_MIN;
- conv_params.activation.max = INT16XINT8_OUT_ACTIVATION_MAX;
- quant_params.multiplier = (int32_t *)int16xint8_output_mult;
- quant_params.shift = (int32_t *)int16xint8_output_shift;
-
- int buf_size = arm_convolve_wrapper_s16_get_buffer_size(&conv_params, &input_dims, &filter_dims, &output_dims);
- ctx.buf = malloc(buf_size);
-
- arm_cmsis_nn_status result = arm_convolve_wrapper_s16(&ctx,
- &conv_params,
- &quant_params,
- &input_dims,
- input_data,
- &filter_dims,
- kernel_data,
- &bias_dims,
- bias_data,
- &output_dims,
- output);
- if (ctx.buf)
- {
- // The caller is responsible to clear the scratch buffers for security reasons if applicable.
- memset(ctx.buf, 0, buf_size);
- free(ctx.buf);
- }
-
- TEST_ASSERT_EQUAL(ARM_CMSIS_NN_SUCCESS, result);
- TEST_ASSERT_TRUE(validate_s16(output, output_ref, output_ref_size));
- memset(output, 0, sizeof(output));
-
- buf_size = arm_convolve_fast_s16_get_buffer_size(&input_dims, &filter_dims);
- ctx.buf = malloc(buf_size);
-
- result = arm_convolve_fast_s16(&ctx,
- &conv_params,
- &quant_params,
- &input_dims,
- input_data,
- &filter_dims,
- kernel_data,
- &bias_dims,
- bias_data,
- &output_dims,
- output);
- if (ctx.buf)
- {
- memset(ctx.buf, 0, buf_size);
- free(ctx.buf);
- }
-#if defined(ARM_MATH_DSP) && !defined(ARM_MATH_MVEI)
- TEST_ASSERT_EQUAL(ARM_CMSIS_NN_SUCCESS, result);
- TEST_ASSERT_TRUE(validate_s16(output, output_ref, output_ref_size));
-#else
- TEST_ASSERT_EQUAL(ARM_CMSIS_NN_ARG_ERROR, result);
-#endif
-}
-
-void requantize_s64_arm_convolve_fast_s16(void)
-{
- int16_t output[REQUANTIZE_S64_DST_SIZE] = {0};
-
- cmsis_nn_context ctx;
- cmsis_nn_conv_params conv_params;
- cmsis_nn_per_channel_quant_params quant_params;
- cmsis_nn_dims input_dims;
- cmsis_nn_dims filter_dims;
- cmsis_nn_dims bias_dims;
- cmsis_nn_dims output_dims;
-
- const int64_t *bias_data = requantize_s64_biases;
- const int8_t *kernel_data = requantize_s64_weights;
- const int16_t *input_data = requantize_s64_input;
- const int16_t *output_ref = requantize_s64_output_ref;
- const int32_t output_ref_size = REQUANTIZE_S64_DST_SIZE;
-
- input_dims.n = REQUANTIZE_S64_INPUT_BATCHES;
- input_dims.w = REQUANTIZE_S64_INPUT_W;
- input_dims.h = REQUANTIZE_S64_INPUT_H;
- input_dims.c = REQUANTIZE_S64_IN_CH;
- filter_dims.w = REQUANTIZE_S64_FILTER_X;
- filter_dims.h = REQUANTIZE_S64_FILTER_Y;
- output_dims.w = REQUANTIZE_S64_OUTPUT_W;
- output_dims.h = REQUANTIZE_S64_OUTPUT_H;
- output_dims.c = REQUANTIZE_S64_OUT_CH;
-
- conv_params.padding.w = REQUANTIZE_S64_PAD_X;
- conv_params.padding.h = REQUANTIZE_S64_PAD_Y;
- conv_params.stride.w = REQUANTIZE_S64_STRIDE_X;
- conv_params.stride.h = REQUANTIZE_S64_STRIDE_Y;
- conv_params.dilation.w = REQUANTIZE_S64_DILATION_X;
- conv_params.dilation.h = REQUANTIZE_S64_DILATION_Y;
-
- conv_params.input_offset = REQUANTIZE_S64_INPUT_OFFSET;
- conv_params.output_offset = REQUANTIZE_S64_OUTPUT_OFFSET;
- conv_params.activation.min = REQUANTIZE_S64_OUT_ACTIVATION_MIN;
- conv_params.activation.max = REQUANTIZE_S64_OUT_ACTIVATION_MAX;
- quant_params.multiplier = (int32_t *)requantize_s64_output_mult;
- quant_params.shift = (int32_t *)requantize_s64_output_shift;
-
- int buf_size = arm_convolve_wrapper_s16_get_buffer_size(&conv_params, &input_dims, &filter_dims, &output_dims);
- ctx.buf = malloc(buf_size);
-
- arm_cmsis_nn_status result = arm_convolve_wrapper_s16(&ctx,
- &conv_params,
- &quant_params,
- &input_dims,
- input_data,
- &filter_dims,
- kernel_data,
- &bias_dims,
- bias_data,
- &output_dims,
- output);
-
- if (ctx.buf)
- {
- memset(ctx.buf, 0, buf_size);
- free(ctx.buf);
- }
- TEST_ASSERT_EQUAL(ARM_CMSIS_NN_SUCCESS, result);
- TEST_ASSERT_TRUE(validate_s16(output, output_ref, output_ref_size));
- memset(output, 0, sizeof(output));
-
- buf_size = arm_convolve_fast_s16_get_buffer_size(&input_dims, &filter_dims);
- ctx.buf = malloc(buf_size);
-
- result = arm_convolve_fast_s16(&ctx,
- &conv_params,
- &quant_params,
- &input_dims,
- input_data,
- &filter_dims,
- kernel_data,
- &bias_dims,
- bias_data,
- &output_dims,
- output);
- if (ctx.buf)
- {
- memset(ctx.buf, 0, buf_size);
- free(ctx.buf);
- }
-#if defined(ARM_MATH_DSP) && !defined(ARM_MATH_MVEI)
- TEST_ASSERT_EQUAL(ARM_CMSIS_NN_SUCCESS, result);
- TEST_ASSERT_TRUE(validate_s16(output, output_ref, output_ref_size));
-#else
- TEST_ASSERT_EQUAL(ARM_CMSIS_NN_ARG_ERROR, result);
-#endif
-}
-
-void buffer_size_arm_convolve_fast_s16(void)
-{
- cmsis_nn_conv_params conv_params;
- cmsis_nn_dims input_dims;
- cmsis_nn_dims filter_dims;
- cmsis_nn_dims output_dims;
-
- input_dims.n = REQUANTIZE_S64_INPUT_BATCHES;
- input_dims.w = REQUANTIZE_S64_INPUT_W;
- input_dims.h = REQUANTIZE_S64_INPUT_H;
- input_dims.c = REQUANTIZE_S64_IN_CH;
- filter_dims.w = REQUANTIZE_S64_FILTER_X;
- filter_dims.h = REQUANTIZE_S64_FILTER_Y;
- output_dims.w = REQUANTIZE_S64_OUTPUT_W;
- output_dims.h = REQUANTIZE_S64_OUTPUT_H;
- output_dims.c = REQUANTIZE_S64_OUT_CH;
-
- conv_params.padding.w = REQUANTIZE_S64_PAD_X;
- conv_params.padding.h = REQUANTIZE_S64_PAD_Y;
- conv_params.stride.w = REQUANTIZE_S64_STRIDE_X;
- conv_params.stride.h = REQUANTIZE_S64_STRIDE_Y;
- conv_params.dilation.w = REQUANTIZE_S64_DILATION_X;
- conv_params.dilation.h = REQUANTIZE_S64_DILATION_Y;
-
- conv_params.input_offset = REQUANTIZE_S64_INPUT_OFFSET;
- conv_params.output_offset = REQUANTIZE_S64_OUTPUT_OFFSET;
- conv_params.activation.min = REQUANTIZE_S64_OUT_ACTIVATION_MIN;
- conv_params.activation.max = REQUANTIZE_S64_OUT_ACTIVATION_MAX;
-
- const int32_t buf_size = arm_convolve_fast_s16_get_buffer_size(&input_dims, &filter_dims);
- const int32_t wrapper_buf_size =
- arm_convolve_wrapper_s16_get_buffer_size(&conv_params, &input_dims, &filter_dims, &output_dims);
-
- TEST_ASSERT_EQUAL(wrapper_buf_size, buf_size);
-}
-
-void buffer_size_mve_arm_convolve_fast_s16(void)
-{
-#if defined(ARM_MATH_MVEI)
- cmsis_nn_conv_params conv_params;
- cmsis_nn_dims input_dims;
- cmsis_nn_dims filter_dims;
- cmsis_nn_dims output_dims;
-
- input_dims.n = REQUANTIZE_S64_INPUT_BATCHES;
- input_dims.w = REQUANTIZE_S64_INPUT_W;
- input_dims.h = REQUANTIZE_S64_INPUT_H;
- input_dims.c = REQUANTIZE_S64_IN_CH;
- filter_dims.w = REQUANTIZE_S64_FILTER_X;
- filter_dims.h = REQUANTIZE_S64_FILTER_Y;
- output_dims.w = REQUANTIZE_S64_OUTPUT_W;
- output_dims.h = REQUANTIZE_S64_OUTPUT_H;
- output_dims.c = REQUANTIZE_S64_OUT_CH;
-
- conv_params.padding.w = REQUANTIZE_S64_PAD_X;
- conv_params.padding.h = REQUANTIZE_S64_PAD_Y;
- conv_params.stride.w = REQUANTIZE_S64_STRIDE_X;
- conv_params.stride.h = REQUANTIZE_S64_STRIDE_Y;
- conv_params.dilation.w = REQUANTIZE_S64_DILATION_X;
- conv_params.dilation.h = REQUANTIZE_S64_DILATION_Y;
-
- conv_params.input_offset = REQUANTIZE_S64_INPUT_OFFSET;
- conv_params.output_offset = REQUANTIZE_S64_OUTPUT_OFFSET;
- conv_params.activation.min = REQUANTIZE_S64_OUT_ACTIVATION_MIN;
- conv_params.activation.max = REQUANTIZE_S64_OUT_ACTIVATION_MAX;
-
- const int32_t wrapper_buf_size =
- arm_convolve_wrapper_s16_get_buffer_size(&conv_params, &input_dims, &filter_dims, &output_dims);
- const int32_t mve_wrapper_buf_size =
- arm_convolve_wrapper_s16_get_buffer_size_mve(&conv_params, &input_dims, &filter_dims, &output_dims);
-
- TEST_ASSERT_EQUAL(wrapper_buf_size, mve_wrapper_buf_size);
-#endif
-}
-
-void buffer_size_dsp_arm_convolve_fast_s16(void)
-{
-#if defined(ARM_MATH_DSP) && !defined(ARM_MATH_MVEI)
- cmsis_nn_conv_params conv_params;
- cmsis_nn_dims input_dims;
- cmsis_nn_dims filter_dims;
- cmsis_nn_dims output_dims;
-
- input_dims.n = REQUANTIZE_S64_INPUT_BATCHES;
- input_dims.w = REQUANTIZE_S64_INPUT_W;
- input_dims.h = REQUANTIZE_S64_INPUT_H;
- input_dims.c = REQUANTIZE_S64_IN_CH;
- filter_dims.w = REQUANTIZE_S64_FILTER_X;
- filter_dims.h = REQUANTIZE_S64_FILTER_Y;
- output_dims.w = REQUANTIZE_S64_OUTPUT_W;
- output_dims.h = REQUANTIZE_S64_OUTPUT_H;
- output_dims.c = REQUANTIZE_S64_OUT_CH;
-
- conv_params.padding.w = REQUANTIZE_S64_PAD_X;
- conv_params.padding.h = REQUANTIZE_S64_PAD_Y;
- conv_params.stride.w = REQUANTIZE_S64_STRIDE_X;
- conv_params.stride.h = REQUANTIZE_S64_STRIDE_Y;
- conv_params.dilation.w = REQUANTIZE_S64_DILATION_X;
- conv_params.dilation.h = REQUANTIZE_S64_DILATION_Y;
-
- conv_params.input_offset = REQUANTIZE_S64_INPUT_OFFSET;
- conv_params.output_offset = REQUANTIZE_S64_OUTPUT_OFFSET;
- conv_params.activation.min = REQUANTIZE_S64_OUT_ACTIVATION_MIN;
- conv_params.activation.max = REQUANTIZE_S64_OUT_ACTIVATION_MAX;
-
- const int32_t wrapper_buf_size =
- arm_convolve_wrapper_s16_get_buffer_size(&conv_params, &input_dims, &filter_dims, &output_dims);
- const int32_t dsp_wrapper_buf_size =
- arm_convolve_wrapper_s16_get_buffer_size_dsp(&conv_params, &input_dims, &filter_dims, &output_dims);
-
- TEST_ASSERT_EQUAL(wrapper_buf_size, dsp_wrapper_buf_size);
-#endif
-}
diff --git a/Tests/UnitTest/TestCases/test_arm_convolve_s16/Unity/unity_test_arm_convolve_s16.c b/Tests/UnitTest/TestCases/test_arm_convolve_s16/Unity/unity_test_arm_convolve_s16.c
index b3df59b7..96232496 100644
--- a/Tests/UnitTest/TestCases/test_arm_convolve_s16/Unity/unity_test_arm_convolve_s16.c
+++ b/Tests/UnitTest/TestCases/test_arm_convolve_s16/Unity/unity_test_arm_convolve_s16.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010-2023 Arm Limited or its affiliates. All rights reserved.
+ * SPDX-FileCopyrightText: Copyright 2010-2024 Arm Limited and/or its affiliates All rights
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -52,3 +52,5 @@ void test_int16xint8_dilation_3_arm_convolve_s16(void) { int16xint8_dilation_3_a
void test_buffer_size_arm_convolve_s16(void) { buffer_size_arm_convolve_s16(); }
void test_buffer_size_mve_arm_convolve_s16(void) { buffer_size_mve_arm_convolve_s16(); }
void test_buffer_size_dsp_arm_convolve_s16(void) { buffer_size_dsp_arm_convolve_s16(); }
+void test_int16xint8_spill_arm_convolve_s16(void) { int16xint8_spill_arm_convolve_s16(); }
+void test_int16xint8_spill2_arm_convolve_s16(void) { int16xint8_spill2_arm_convolve_s16(); }
diff --git a/Tests/UnitTest/TestCases/test_arm_convolve_s16/test_arm_convolve_s16.c b/Tests/UnitTest/TestCases/test_arm_convolve_s16/test_arm_convolve_s16.c
index 00b74342..25194e8b 100644
--- a/Tests/UnitTest/TestCases/test_arm_convolve_s16/test_arm_convolve_s16.c
+++ b/Tests/UnitTest/TestCases/test_arm_convolve_s16/test_arm_convolve_s16.c
@@ -1,5 +1,5 @@
/*
- * SPDX-FileCopyrightText: Copyright 2010-2023 Arm Limited and/or its affiliates All rights
+ * SPDX-FileCopyrightText: Copyright 2010-2024 Arm Limited and/or its affiliates All rights
* reserved.
*
* SPDX-License-Identifier: Apache-2.0
@@ -26,6 +26,8 @@
#include "../TestData/int16xint8_dilation_1/test_data.h"
#include "../TestData/int16xint8_dilation_2/test_data.h"
#include "../TestData/int16xint8_dilation_3/test_data.h"
+#include "../TestData/int16xint8_spill/test_data.h"
+#include "../TestData/int16xint8_spill2/test_data.h"
#include "../TestData/requantize_s64/test_data.h"
#include "../Utils/validate.h"
@@ -73,18 +75,18 @@ void int16xint8_arm_convolve_s16(void)
int buf_size = arm_convolve_s16_get_buffer_size(&input_dims, &filter_dims);
ctx.buf = malloc(buf_size);
-
- arm_cmsis_nn_status result = arm_convolve_s16(&ctx,
- &conv_params,
- &quant_params,
- &input_dims,
- input_data,
- &filter_dims,
- kernel_data,
- &bias_dims,
- bias_data,
- &output_dims,
- output);
+ arm_cmsis_nn_status result;
+ result = arm_convolve_s16(&ctx,
+ &conv_params,
+ &quant_params,
+ &input_dims,
+ input_data,
+ &filter_dims,
+ kernel_data,
+ &bias_dims,
+ bias_data,
+ &output_dims,
+ output);
if (ctx.buf)
{
// The caller is responsible to clear the scratch buffers for security reasons if applicable.
@@ -109,7 +111,6 @@ void int16xint8_arm_convolve_s16(void)
bias_data,
&output_dims,
output);
-
if (ctx.buf)
{
memset(ctx.buf, 0, buf_size);
@@ -588,3 +589,181 @@ void buffer_size_dsp_arm_convolve_s16(void)
TEST_ASSERT_EQUAL(wrapper_buf_size, dsp_wrapper_buf_size);
#endif
}
+
+void int16xint8_spill_arm_convolve_s16(void)
+{
+ int16_t output[INT16XINT8_SPILL_DST_SIZE] = {0};
+
+ cmsis_nn_context ctx;
+ cmsis_nn_conv_params conv_params;
+ cmsis_nn_per_channel_quant_params quant_params;
+ cmsis_nn_dims input_dims;
+ cmsis_nn_dims filter_dims;
+ cmsis_nn_dims bias_dims;
+ cmsis_nn_dims output_dims;
+
+ const int64_t *bias_data = int16xint8_spill_biases;
+ const int8_t *kernel_data = int16xint8_spill_weights;
+ const int16_t *input_data = int16xint8_spill_input;
+ const int16_t *output_ref = int16xint8_spill_output_ref;
+ const int32_t output_ref_size = INT16XINT8_SPILL_DST_SIZE;
+
+ input_dims.n = INT16XINT8_SPILL_INPUT_BATCHES;
+ input_dims.w = INT16XINT8_SPILL_INPUT_W;
+ input_dims.h = INT16XINT8_SPILL_INPUT_H;
+ input_dims.c = INT16XINT8_SPILL_IN_CH;
+ filter_dims.w = INT16XINT8_SPILL_FILTER_X;
+ filter_dims.h = INT16XINT8_SPILL_FILTER_Y;
+ output_dims.w = INT16XINT8_SPILL_OUTPUT_W;
+ output_dims.h = INT16XINT8_SPILL_OUTPUT_H;
+ output_dims.c = INT16XINT8_SPILL_OUT_CH;
+
+ conv_params.padding.w = INT16XINT8_SPILL_PAD_X;
+ conv_params.padding.h = INT16XINT8_SPILL_PAD_Y;
+ conv_params.stride.w = INT16XINT8_SPILL_STRIDE_X;
+ conv_params.stride.h = INT16XINT8_SPILL_STRIDE_Y;
+ conv_params.dilation.w = INT16XINT8_SPILL_DILATION_X;
+ conv_params.dilation.h = INT16XINT8_SPILL_DILATION_Y;
+
+ conv_params.input_offset = 0;
+ conv_params.output_offset = 0;
+ conv_params.activation.min = INT16XINT8_SPILL_OUT_ACTIVATION_MIN;
+ conv_params.activation.max = INT16XINT8_SPILL_OUT_ACTIVATION_MAX;
+ quant_params.multiplier = (int32_t *)int16xint8_spill_output_mult;
+ quant_params.shift = (int32_t *)int16xint8_spill_output_shift;
+
+ int buf_size = arm_convolve_s16_get_buffer_size(&input_dims, &filter_dims);
+ ctx.buf = malloc(buf_size);
+ arm_cmsis_nn_status result;
+ result = arm_convolve_s16(&ctx,
+ &conv_params,
+ &quant_params,
+ &input_dims,
+ input_data,
+ &filter_dims,
+ kernel_data,
+ &bias_dims,
+ bias_data,
+ &output_dims,
+ output);
+ if (ctx.buf)
+ {
+ // The caller is responsible to clear the scratch buffers for security reasons if applicable.
+ memset(ctx.buf, 0, buf_size);
+ free(ctx.buf);
+ }
+ TEST_ASSERT_EQUAL(ARM_CMSIS_NN_SUCCESS, result);
+ TEST_ASSERT_TRUE(validate_s16(output, output_ref, output_ref_size));
+ memset(output, 0, sizeof(output));
+
+ buf_size = arm_convolve_wrapper_s16_get_buffer_size(&conv_params, &input_dims, &filter_dims, &output_dims);
+ ctx.buf = malloc(buf_size);
+
+ result = arm_convolve_wrapper_s16(&ctx,
+ &conv_params,
+ &quant_params,
+ &input_dims,
+ input_data,
+ &filter_dims,
+ kernel_data,
+ &bias_dims,
+ bias_data,
+ &output_dims,
+ output);
+ if (ctx.buf)
+ {
+ memset(ctx.buf, 0, buf_size);
+ free(ctx.buf);
+ }
+ TEST_ASSERT_EQUAL(ARM_CMSIS_NN_SUCCESS, result);
+ TEST_ASSERT_TRUE(validate_s16(output, output_ref, output_ref_size));
+}
+
+void int16xint8_spill2_arm_convolve_s16(void)
+{
+ int16_t output[INT16XINT8_SPILL2_DST_SIZE] = {0};
+
+ cmsis_nn_context ctx;
+ cmsis_nn_conv_params conv_params;
+ cmsis_nn_per_channel_quant_params quant_params;
+ cmsis_nn_dims input_dims;
+ cmsis_nn_dims filter_dims;
+ cmsis_nn_dims bias_dims;
+ cmsis_nn_dims output_dims;
+
+ const int64_t *bias_data = int16xint8_spill2_biases;
+ const int8_t *kernel_data = int16xint8_spill2_weights;
+ const int16_t *input_data = int16xint8_spill2_input;
+ const int16_t *output_ref = int16xint8_spill2_output_ref;
+ const int32_t output_ref_size = INT16XINT8_SPILL2_DST_SIZE;
+
+ input_dims.n = INT16XINT8_SPILL2_INPUT_BATCHES;
+ input_dims.w = INT16XINT8_SPILL2_INPUT_W;
+ input_dims.h = INT16XINT8_SPILL2_INPUT_H;
+ input_dims.c = INT16XINT8_SPILL2_IN_CH;
+ filter_dims.w = INT16XINT8_SPILL2_FILTER_X;
+ filter_dims.h = INT16XINT8_SPILL2_FILTER_Y;
+ output_dims.w = INT16XINT8_SPILL2_OUTPUT_W;
+ output_dims.h = INT16XINT8_SPILL2_OUTPUT_H;
+ output_dims.c = INT16XINT8_SPILL2_OUT_CH;
+
+ conv_params.padding.w = INT16XINT8_SPILL2_PAD_X;
+ conv_params.padding.h = INT16XINT8_SPILL2_PAD_Y;
+ conv_params.stride.w = INT16XINT8_SPILL2_STRIDE_X;
+ conv_params.stride.h = INT16XINT8_SPILL2_STRIDE_Y;
+ conv_params.dilation.w = INT16XINT8_SPILL2_DILATION_X;
+ conv_params.dilation.h = INT16XINT8_SPILL2_DILATION_Y;
+
+ conv_params.input_offset = 0;
+ conv_params.output_offset = 0;
+ conv_params.activation.min = INT16XINT8_SPILL2_OUT_ACTIVATION_MIN;
+ conv_params.activation.max = INT16XINT8_SPILL2_OUT_ACTIVATION_MAX;
+ quant_params.multiplier = (int32_t *)int16xint8_spill2_output_mult;
+ quant_params.shift = (int32_t *)int16xint8_spill2_output_shift;
+
+ int buf_size = arm_convolve_s16_get_buffer_size(&input_dims, &filter_dims);
+ ctx.buf = malloc(buf_size);
+ arm_cmsis_nn_status result;
+ result = arm_convolve_s16(&ctx,
+ &conv_params,
+ &quant_params,
+ &input_dims,
+ input_data,
+ &filter_dims,
+ kernel_data,
+ &bias_dims,
+ bias_data,
+ &output_dims,
+ output);
+ if (ctx.buf)
+ {
+ // The caller is responsible to clear the scratch buffers for security reasons if applicable.
+ memset(ctx.buf, 0, buf_size);
+ free(ctx.buf);
+ }
+ TEST_ASSERT_EQUAL(ARM_CMSIS_NN_SUCCESS, result);
+ TEST_ASSERT_TRUE(validate_s16(output, output_ref, output_ref_size));
+ memset(output, 0, sizeof(output));
+
+ buf_size = arm_convolve_wrapper_s16_get_buffer_size(&conv_params, &input_dims, &filter_dims, &output_dims);
+ ctx.buf = malloc(buf_size);
+
+ result = arm_convolve_wrapper_s16(&ctx,
+ &conv_params,
+ &quant_params,
+ &input_dims,
+ input_data,
+ &filter_dims,
+ kernel_data,
+ &bias_dims,
+ bias_data,
+ &output_dims,
+ output);
+ if (ctx.buf)
+ {
+ memset(ctx.buf, 0, buf_size);
+ free(ctx.buf);
+ }
+ TEST_ASSERT_EQUAL(ARM_CMSIS_NN_SUCCESS, result);
+ TEST_ASSERT_TRUE(validate_s16(output, output_ref, output_ref_size));
+}
diff --git a/Tests/UnitTest/conv_settings.py b/Tests/UnitTest/conv_settings.py
index c18bdd3d..5b7831d7 100644
--- a/Tests/UnitTest/conv_settings.py
+++ b/Tests/UnitTest/conv_settings.py
@@ -53,7 +53,9 @@ def __init__(self,
dilation_x=1,
dilation_y=1,
interpreter="tensorflow",
- int4_weights=False):
+ int4_weights=False,
+ weights_min=TestSettings.INT32_MIN,
+ weights_max=TestSettings.INT32_MAX):
super().__init__(dataset,
testtype,
regenerate_weights,
@@ -87,6 +89,9 @@ def __init__(self,
self.scaling_factors = []
self.groups = groups
+ self.weights_min = weights_min
+ self.weights_max = weights_max
+
if self.test_type == 'depthwise_conv':
self.channel_multiplier = self.output_ch // self.input_ch
if self.output_ch % self.input_ch != 0:
@@ -311,8 +316,8 @@ def generate_data(self, input_data=None, weights=None, biases=None) -> None:
else:
weights = self.get_randomized_data(weight_shape,
self.kernel_table_file,
- minrange=TestSettings.INT32_MIN,
- maxrange=TestSettings.INT32_MAX,
+ minrange=self.weights_min,
+ maxrange=self.weights_max,
decimals=1,
regenerate=self.regenerate_new_weights)
@@ -327,18 +332,26 @@ def generate_data(self, input_data=None, weights=None, biases=None) -> None:
padding=self.padding,
input_shape=input_shape[1:],
dilation_rate=(self.dilation_y, self.dilation_x),
- groups=self.groups)
+ groups=self.groups,
+ use_bias=self.generate_bias)
model.add(conv_layer)
- conv_layer.set_weights([weights, biases])
+ if self.generate_bias:
+ conv_layer.set_weights([weights, biases])
+ else:
+ conv_layer.set_weights([weights])
elif self.test_type == 'depthwise_conv':
depthwise_layer = keras.layers.DepthwiseConv2D(kernel_size=(self.filter_y, self.filter_x),
strides=(self.stride_y, self.stride_x),
padding=self.padding,
depth_multiplier=self.channel_multiplier,
input_shape=input_shape[1:],
- dilation_rate=(self.dilation_y, self.dilation_x))
+ dilation_rate=(self.dilation_y, self.dilation_x),
+ use_bias=self.generate_bias)
model.add(depthwise_layer)
- depthwise_layer.set_weights([weights, biases])
+ if self.generate_bias:
+ depthwise_layer.set_weights([weights, biases])
+ else:
+ depthwise_layer.set_weights([weights])
elif self.test_type == 'transpose_conv':
transposed_conv_layer = keras.layers.Conv2DTranspose(self.output_ch,
kernel_size=(self.filter_y, self.filter_x),
@@ -371,8 +384,7 @@ def generate_data(self, input_data=None, weights=None, biases=None) -> None:
all_layers_details = interpreter.get_tensor_details()
filter_layer = all_layers_details[filter_index]
- if self.test_type == 'transpose_conv' and not self.generate_bias:
- # TODO: real null bias for all operators and not only transpose conv.
+ if not self.int4_weights and not self.generate_bias:
bias_layer = None
biases = []
else:
diff --git a/Tests/UnitTest/generate_test_data.py b/Tests/UnitTest/generate_test_data.py
index 6d8b375c..a51ebe60 100755
--- a/Tests/UnitTest/generate_test_data.py
+++ b/Tests/UnitTest/generate_test_data.py
@@ -595,21 +595,74 @@ def load_testdata_sets(regenerate_input, regenerate_weights, regenerate_biases,
regenerate_input,
regenerate_biases,
schema_file,
- in_ch=3,
+ in_ch=55,
out_ch=4,
- x_in=7,
+ x_in=10,
y_in=8,
- w_x=2,
+ w_x=9,
w_y=4,
- stride_x=2,
- stride_y=3,
- pad=True,
+ stride_x=1,
+ stride_y=1,
+ pad=False,
+ generate_bias=False,
randmin=TestSettings.INT16_MIN,
randmax=TestSettings.INT16_MAX,
- out_activation_min=-13335,
- out_activation_max=32767,
+ out_activation_min=TestSettings.INT16_MIN,
+ out_activation_max=TestSettings.INT16_MAX,
int16xint8=True,
interpreter=interpreter)
+ dataset = 'int16xint8_spill'
+ testdata_sets[dataset] = ConvSettings(dataset,
+ type_of_test,
+ regenerate_weights,
+ regenerate_input,
+ regenerate_biases,
+ schema_file,
+ in_ch=55,
+ out_ch=9,
+ x_in=10,
+ y_in=8,
+ w_x=9,
+ w_y=4,
+ stride_x=1,
+ stride_y=1,
+ pad=False,
+ generate_bias=False,
+ randmin=TestSettings.INT16_MAX - 100,
+ randmax=TestSettings.INT16_MAX,
+ out_activation_min=TestSettings.INT16_MAX - 100,
+ out_activation_max=TestSettings.INT16_MAX,
+ bias_min=TestSettings.INT64_MIN,
+ bias_max=TestSettings.INT64_MAX,
+ int16xint8=True,
+ interpreter=interpreter,
+ weights_min=100)
+ dataset = 'int16xint8_spill2'
+ testdata_sets[dataset] = ConvSettings(dataset,
+ type_of_test,
+ regenerate_weights,
+ regenerate_input,
+ regenerate_biases,
+ schema_file,
+ in_ch=12,
+ out_ch=9,
+ x_in=10,
+ y_in=8,
+ w_x=9,
+ w_y=4,
+ stride_x=1,
+ stride_y=1,
+ pad=False,
+ generate_bias=False,
+ randmin=TestSettings.INT16_MAX - 100,
+ randmax=TestSettings.INT16_MAX,
+ out_activation_min=TestSettings.INT16_MAX - 100,
+ out_activation_max=TestSettings.INT16_MAX,
+ bias_min=TestSettings.INT64_MIN,
+ bias_max=TestSettings.INT64_MAX,
+ int16xint8=True,
+ interpreter=interpreter,
+ weights_min=100)
dataset = 'requantize_s64'
testdata_sets[dataset] = ConvSettings(dataset,
type_of_test,
@@ -617,20 +670,21 @@ def load_testdata_sets(regenerate_input, regenerate_weights, regenerate_biases,
regenerate_input,
regenerate_biases,
schema_file,
- in_ch=2,
- out_ch=2,
- x_in=3,
- y_in=2,
+ in_ch=8,
+ out_ch=8,
+ x_in=4,
+ y_in=4,
w_x=2,
w_y=2,
stride_x=1,
stride_y=1,
pad=False,
+ generate_bias=True,
out_activation_min=TestSettings.INT16_MIN,
out_activation_max=TestSettings.INT16_MAX,
int16xint8=True,
bias_min=-0x300,
- bias_max=0x9fff,
+ bias_max=TestSettings.INT32_MAX + 1000,
interpreter=interpreter)
dataset = 'int16xint8_dilation_1'
testdata_sets[dataset] = ConvSettings(dataset,