#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
// Прототипы функций
void read_matrix_static(int matrix[MAX_SIZE][MAX_SIZE], int rows, int cols);
void print_matrix_static(int matrix[MAX_SIZE][MAX_SIZE], int rows, int cols);
int **allocate_matrix_dynamic1(int rows, int cols);
void read_matrix_dynamic1(int **matrix, int rows, int cols);
void print_matrix_dynamic1(int **matrix, int rows, int cols);
void free_matrix_dynamic1(int **matrix, int rows);
int *allocate_matrix_dynamic2(int rows, int cols);
void read_matrix_dynamic2(int *matrix, int rows, int cols);
void print_matrix_dynamic2(int *matrix, int rows, int cols);
void free_matrix_dynamic2(int *matrix);
int **allocate_matrix_dynamic3(int rows, int cols);
void read_matrix_dynamic3(int **matrix, int rows, int cols);
void print_matrix_dynamic3(int **matrix, int rows, int cols);
void free_matrix_dynamic3(int **matrix, int rows);
void find_max_in_rows(int matrix[MAX_SIZE][MAX_SIZE], int rows, int cols, int max[]);
void find_min_in_cols(int matrix[MAX_SIZE][MAX_SIZE], int rows, int cols, int min[]);
int main() {
int choice, rows, cols;
printf("Выберите метод выделения памяти:\n1. Статически\n2. Динамически (2D массив указателей)\n3. Динамически (1D массив)\n4. Динамически (массив указателей на строки)\n");
if (scanf("%d", &choice
) != 1 || choice
< 1 || choice
> 4) { return 1; // Ошибка выбора
}
// Чтение размеров матрицы
if (scanf("%d %d", &rows
, &cols
) != 2 || rows
< 1 || cols
< 1 || rows
> MAX_SIZE
|| cols
> MAX_SIZE
) { return 1; // Ошибка при считывании размеров матрицы
}
switch (choice) {
case 1: {
int matrix[MAX_SIZE][MAX_SIZE];
read_matrix_static(matrix, rows, cols);
print_matrix_static(matrix, rows, cols);
int max[MAX_SIZE]; // Для хранения максимальных элементов в строках
int min[MAX_SIZE]; // Для хранения минимальных элементов в столбцах
find_max_in_rows(matrix, rows, cols, max);
find_min_in_cols(matrix, rows, cols, min);
// вывод массивов
printf("\nМаксимальные элементы в каждой строке:\n"); for (int i = 0; i < rows; i++) {
if (i < rows - 1) {
}
}
printf("\nМинимальные элементы в каждом столбце:\n"); for (int j = 0; j < cols; j++) {
if (j < cols - 1) {
}
}
break;
}
case 2: {
int **matrix = allocate_matrix_dynamic1(rows, cols);
if (matrix == NULL) {
return 1; // Ошибка при выделении памяти
}
read_matrix_dynamic1(matrix, rows, cols);
print_matrix_dynamic1(matrix, rows, cols);
int max[MAX_SIZE];
int min[MAX_SIZE];
find_max_in_rows(matrix, rows, cols, max);
find_min_in_cols(matrix, rows, cols, min);
printf("\nМаксимальные элементы в каждой строке:\n"); for (int i = 0; i < rows; i++) {
if (i < rows - 1) {
}
}
printf("\nМинимальные элементы в каждом столбце:\n"); for (int j = 0; j < cols; j++) {
if (j < cols - 1) {
}
}
free_matrix_dynamic1(matrix, rows);
break;
}
case 3: {
int *matrix = allocate_matrix_dynamic2(rows, cols);
if (matrix == NULL) {
return 1; // Ошибка при выделении памяти
}
read_matrix_dynamic2(matrix, rows, cols);
print_matrix_dynamic2(matrix, rows, cols);
int max[MAX_SIZE];
int min[MAX_SIZE];
find_max_in_rows((int (*)[MAX_SIZE])matrix, rows, cols, max);
find_min_in_cols((int (*)[MAX_SIZE])matrix, rows, cols, min);
printf("\nМаксимальные элементы в каждой строке:\n"); for (int i = 0; i < rows; i++) {
if (i < rows - 1) {
}
}
printf("\nМинимальные элементы в каждом столбце:\n"); for (int j = 0; j < cols; j++) {
if (j < cols - 1) {
}
}
free_matrix_dynamic2(matrix);
break;
}
case 4: {
int **matrix = allocate_matrix_dynamic3(rows, cols);
if (matrix == NULL) {
return 1; // Ошибка при выделении памяти
}
read_matrix_dynamic3(matrix, rows, cols);
print_matrix_dynamic3(matrix, rows, cols);
int max[MAX_SIZE];
int min[MAX_SIZE];
find_max_in_rows(matrix, rows, cols, max);
find_min_in_cols(matrix, rows, cols, min);
printf("\nМаксимальные элементы в каждой строке:\n"); for (int i = 0; i < rows; i++) {
if (i < rows - 1) {
}
}
printf("\nМинимальные элементы в каждом столбце:\n"); for (int j = 0; j < cols; j++) {
if (j < cols - 1) {
}
}
free_matrix_dynamic3(matrix, rows);
break;
}
}
return 0;
}
// Чтение статической матрицы
void read_matrix_static(int matrix[MAX_SIZE][MAX_SIZE], int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (scanf("%d", &matrix
[i
][j
]) != 1) { exit(1); // Ошибка при считывании }
}
}
}
// Печать статической матрицы
void print_matrix_static(int matrix[MAX_SIZE][MAX_SIZE], int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (j < cols - 1) {
}
}
if (i < rows - 1) {
}
}
}
// Динамическое выделение: 2D массив указателей
int **allocate_matrix_dynamic1(int rows, int cols) {
int **matrix
= malloc(rows
* sizeof(int *)); if (matrix == NULL) return NULL;
for (int i = 0; i < rows; i++) {
matrix
[i
] = malloc(cols
* sizeof(int)); if (matrix[i] == NULL) {
for (int j = 0; j < i; j++) {
}
return NULL;
}
}
return matrix;
}
// Чтение динамической матрицы 1
void read_matrix_dynamic1(int **matrix, int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (scanf("%d", &matrix
[i
][j
]) != 1) { exit(1); // Ошибка при считывании }
}
}
}
// Печать динамической матрицы 1
void print_matrix_dynamic1(int **matrix, int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (j < cols - 1) {
}
}
if (i < rows - 1) {
}
}
}
// Освобождение памяти для динамической матрицы 1
void free_matrix_dynamic1(int **matrix, int rows) {
for (int i = 0; i < rows; i++) {
}
}
// Динамическое выделение: 1D массив
int *allocate_matrix_dynamic2(int rows, int cols) {
return malloc(rows
* cols
* sizeof(int)); }
// Чтение динамической матрицы 2
void read_matrix_dynamic2(int *matrix, int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (scanf("%d", &matrix
[i
* cols
+ j
]) != 1) { exit(1); // Ошибка при считывании }
}
}
}
// Печать динамической матрицы 2
void print_matrix_dynamic2(int *matrix, int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
printf("%d", matrix
[i
* cols
+ j
]); if (j < cols - 1) {
}
}
if (i < rows - 1) {
}
}
}
// Освобождение памяти для динамической матрицы 2
void free_matrix_dynamic2(int *matrix) {
}
// Динамическое выделение: массив указателей на строки
int **allocate_matrix_dynamic3(int rows, int cols) {
int **matrix
= malloc(rows
* sizeof(int *)); if (matrix == NULL) return NULL;
for (int i = 0; i < rows; i++) {
matrix
[i
] = malloc(cols
* sizeof(int)); if (matrix[i] == NULL) {
for (int j = 0; j < i; j++) {
}
return NULL;
}
}
return matrix;
}
// Чтение динамической матрицы 3
void read_matrix_dynamic3(int **matrix, int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (scanf("%d", &matrix
[i
][j
]) != 1) { exit(1); // Ошибка при считывании }
}
}
}
// Печать динамической матрицы 3
void print_matrix_dynamic3(int **matrix, int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (j < cols - 1) {
}
}
if (i < rows - 1) {
}
}
}
// Освобождение памяти для динамической матрицы 3
void free_matrix_dynamic3(int **matrix, int rows) {
for (int i = 0; i < rows; i++) {
}
}
// Функция для нахождения максимальных значений в каждой строке
void find_max_in_rows(int matrix[MAX_SIZE][MAX_SIZE], int rows, int cols, int max[]) {
for (int i = 0; i < rows; i++) {
max[i] = matrix[i][0];
for (int j = 1; j < cols; j++) {
if (matrix[i][j] > max[i]) {
max[i] = matrix[i][j];
}
}
}
}
// Функция для нахождения минимальных значений в каждом столбце
void find_min_in_cols(int matrix[MAX_SIZE][MAX_SIZE], int rows, int cols, int min[]) {
for (int j = 0; j < cols; j++) {
min[j] = matrix[0][j];
for (int i = 1; i < rows; i++) {
if (matrix[i][j] < min[j]) {
min[j] = matrix[i][j];
}
}
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNkZWZpbmUgTUFYX1NJWkUgMTAwCgovLyDQn9GA0L7RgtC+0YLQuNC/0Ysg0YTRg9C90LrRhtC40LkKdm9pZCByZWFkX21hdHJpeF9zdGF0aWMoaW50IG1hdHJpeFtNQVhfU0laRV1bTUFYX1NJWkVdLCBpbnQgcm93cywgaW50IGNvbHMpOwp2b2lkIHByaW50X21hdHJpeF9zdGF0aWMoaW50IG1hdHJpeFtNQVhfU0laRV1bTUFYX1NJWkVdLCBpbnQgcm93cywgaW50IGNvbHMpOwppbnQgKiphbGxvY2F0ZV9tYXRyaXhfZHluYW1pYzEoaW50IHJvd3MsIGludCBjb2xzKTsKdm9pZCByZWFkX21hdHJpeF9keW5hbWljMShpbnQgKiptYXRyaXgsIGludCByb3dzLCBpbnQgY29scyk7CnZvaWQgcHJpbnRfbWF0cml4X2R5bmFtaWMxKGludCAqKm1hdHJpeCwgaW50IHJvd3MsIGludCBjb2xzKTsKdm9pZCBmcmVlX21hdHJpeF9keW5hbWljMShpbnQgKiptYXRyaXgsIGludCByb3dzKTsKaW50ICphbGxvY2F0ZV9tYXRyaXhfZHluYW1pYzIoaW50IHJvd3MsIGludCBjb2xzKTsKdm9pZCByZWFkX21hdHJpeF9keW5hbWljMihpbnQgKm1hdHJpeCwgaW50IHJvd3MsIGludCBjb2xzKTsKdm9pZCBwcmludF9tYXRyaXhfZHluYW1pYzIoaW50ICptYXRyaXgsIGludCByb3dzLCBpbnQgY29scyk7CnZvaWQgZnJlZV9tYXRyaXhfZHluYW1pYzIoaW50ICptYXRyaXgpOwppbnQgKiphbGxvY2F0ZV9tYXRyaXhfZHluYW1pYzMoaW50IHJvd3MsIGludCBjb2xzKTsKdm9pZCByZWFkX21hdHJpeF9keW5hbWljMyhpbnQgKiptYXRyaXgsIGludCByb3dzLCBpbnQgY29scyk7CnZvaWQgcHJpbnRfbWF0cml4X2R5bmFtaWMzKGludCAqKm1hdHJpeCwgaW50IHJvd3MsIGludCBjb2xzKTsKdm9pZCBmcmVlX21hdHJpeF9keW5hbWljMyhpbnQgKiptYXRyaXgsIGludCByb3dzKTsKdm9pZCBmaW5kX21heF9pbl9yb3dzKGludCBtYXRyaXhbTUFYX1NJWkVdW01BWF9TSVpFXSwgaW50IHJvd3MsIGludCBjb2xzLCBpbnQgbWF4W10pOwp2b2lkIGZpbmRfbWluX2luX2NvbHMoaW50IG1hdHJpeFtNQVhfU0laRV1bTUFYX1NJWkVdLCBpbnQgcm93cywgaW50IGNvbHMsIGludCBtaW5bXSk7CgppbnQgbWFpbigpIHsKICAgIGludCBjaG9pY2UsIHJvd3MsIGNvbHM7CgogICAgcHJpbnRmKCLQktGL0LHQtdGA0LjRgtC1INC80LXRgtC+0LQg0LLRi9C00LXQu9C10L3QuNGPINC/0LDQvNGP0YLQuDpcbjEuINCh0YLQsNGC0LjRh9C10YHQutC4XG4yLiDQlNC40L3QsNC80LjRh9C10YHQutC4ICgyRCDQvNCw0YHRgdC40LIg0YPQutCw0LfQsNGC0LXQu9C10LkpXG4zLiDQlNC40L3QsNC80LjRh9C10YHQutC4ICgxRCDQvNCw0YHRgdC40LIpXG40LiDQlNC40L3QsNC80LjRh9C10YHQutC4ICjQvNCw0YHRgdC40LIg0YPQutCw0LfQsNGC0LXQu9C10Lkg0L3QsCDRgdGC0YDQvtC60LgpXG4iKTsKCiAgICBpZiAoc2NhbmYoIiVkIiwgJmNob2ljZSkgIT0gMSB8fCBjaG9pY2UgPCAxIHx8IGNob2ljZSA+IDQpIHsKICAgICAgICBwcmludGYoIm4vYVxuIik7CiAgICAgICAgcmV0dXJuIDE7IC8vINCe0YjQuNCx0LrQsCDQstGL0LHQvtGA0LAKICAgIH0KCiAgICAvLyDQp9GC0LXQvdC40LUg0YDQsNC30LzQtdGA0L7QsiDQvNCw0YLRgNC40YbRiwogICAgaWYgKHNjYW5mKCIlZCAlZCIsICZyb3dzLCAmY29scykgIT0gMiB8fCByb3dzIDwgMSB8fCBjb2xzIDwgMSB8fCByb3dzID4gTUFYX1NJWkUgfHwgY29scyA+IE1BWF9TSVpFKSB7CiAgICAgICAgcHJpbnRmKCJuL2FcbiIpOwogICAgICAgIHJldHVybiAxOyAvLyDQntGI0LjQsdC60LAg0L/RgNC4INGB0YfQuNGC0YvQstCw0L3QuNC4INGA0LDQt9C80LXRgNC+0LIg0LzQsNGC0YDQuNGG0YsKICAgIH0KCiAgICBzd2l0Y2ggKGNob2ljZSkgewogICAgICAgIGNhc2UgMTogewogICAgICAgICAgICBpbnQgbWF0cml4W01BWF9TSVpFXVtNQVhfU0laRV07CiAgICAgICAgICAgIHJlYWRfbWF0cml4X3N0YXRpYyhtYXRyaXgsIHJvd3MsIGNvbHMpOwogICAgICAgICAgICBwcmludF9tYXRyaXhfc3RhdGljKG1hdHJpeCwgcm93cywgY29scyk7CgogICAgICAgICAgICBpbnQgbWF4W01BWF9TSVpFXTsgLy8g0JTQu9GPINGF0YDQsNC90LXQvdC40Y8g0LzQsNC60YHQuNC80LDQu9GM0L3Ri9GFINGN0LvQtdC80LXQvdGC0L7QsiDQsiDRgdGC0YDQvtC60LDRhQogICAgICAgICAgICBpbnQgbWluW01BWF9TSVpFXTsgLy8g0JTQu9GPINGF0YDQsNC90LXQvdC40Y8g0LzQuNC90LjQvNCw0LvRjNC90YvRhSDRjdC70LXQvNC10L3RgtC+0LIg0LIg0YHRgtC+0LvQsdGG0LDRhQogICAgICAgICAgICBmaW5kX21heF9pbl9yb3dzKG1hdHJpeCwgcm93cywgY29scywgbWF4KTsKICAgICAgICAgICAgZmluZF9taW5faW5fY29scyhtYXRyaXgsIHJvd3MsIGNvbHMsIG1pbik7CgogICAgICAgICAgICAvLyDQstGL0LLQvtC0INC80LDRgdGB0LjQstC+0LIKICAgICAgICAgICAgcHJpbnRmKCJcbtCc0LDQutGB0LjQvNCw0LvRjNC90YvQtSDRjdC70LXQvNC10L3RgtGLINCyINC60LDQttC00L7QuSDRgdGC0YDQvtC60LU6XG4iKTsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKICAgICAgICAgICAgICAgIHByaW50ZigiJWQiLCBtYXhbaV0pOwogICAgICAgICAgICAgICAgaWYgKGkgPCByb3dzIC0gMSkgewogICAgICAgICAgICAgICAgICAgIHByaW50ZigiICIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHByaW50ZigiXG7QnNC40L3QuNC80LDQu9GM0L3Ri9C1INGN0LvQtdC80LXQvdGC0Ysg0LIg0LrQsNC20LTQvtC8INGB0YLQvtC70LHRhtC1OlxuIik7CiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29sczsgaisrKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIiVkIiwgbWluW2pdKTsKICAgICAgICAgICAgICAgIGlmIChqIDwgY29scyAtIDEpIHsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSAyOiB7CiAgICAgICAgICAgIGludCAqKm1hdHJpeCA9IGFsbG9jYXRlX21hdHJpeF9keW5hbWljMShyb3dzLCBjb2xzKTsKICAgICAgICAgICAgaWYgKG1hdHJpeCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIm4vYVxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gMTsgLy8g0J7RiNC40LHQutCwINC/0YDQuCDQstGL0LTQtdC70LXQvdC40Lgg0L/QsNC80Y/RgtC4CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVhZF9tYXRyaXhfZHluYW1pYzEobWF0cml4LCByb3dzLCBjb2xzKTsKICAgICAgICAgICAgcHJpbnRfbWF0cml4X2R5bmFtaWMxKG1hdHJpeCwgcm93cywgY29scyk7CgogICAgICAgICAgICBpbnQgbWF4W01BWF9TSVpFXTsKICAgICAgICAgICAgaW50IG1pbltNQVhfU0laRV07CiAgICAgICAgICAgIGZpbmRfbWF4X2luX3Jvd3MobWF0cml4LCByb3dzLCBjb2xzLCBtYXgpOwogICAgICAgICAgICBmaW5kX21pbl9pbl9jb2xzKG1hdHJpeCwgcm93cywgY29scywgbWluKTsKCiAgICAgICAgICAgIHByaW50ZigiXG7QnNCw0LrRgdC40LzQsNC70YzQvdGL0LUg0Y3Qu9C10LzQtdC90YLRiyDQsiDQutCw0LbQtNC+0Lkg0YHRgtGA0L7QutC1OlxuIik7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIiVkIiwgbWF4W2ldKTsKICAgICAgICAgICAgICAgIGlmIChpIDwgcm93cyAtIDEpIHsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludGYoIlxu0JzQuNC90LjQvNCw0LvRjNC90YvQtSDRjdC70LXQvNC10L3RgtGLINCyINC60LDQttC00L7QvCDRgdGC0L7Qu9Cx0YbQtTpcbiIpOwogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykgewogICAgICAgICAgICAgICAgcHJpbnRmKCIlZCIsIG1pbltqXSk7CiAgICAgICAgICAgICAgICBpZiAoaiA8IGNvbHMgLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnJlZV9tYXRyaXhfZHluYW1pYzEobWF0cml4LCByb3dzKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgMzogewogICAgICAgICAgICBpbnQgKm1hdHJpeCA9IGFsbG9jYXRlX21hdHJpeF9keW5hbWljMihyb3dzLCBjb2xzKTsKICAgICAgICAgICAgaWYgKG1hdHJpeCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIm4vYVxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gMTsgLy8g0J7RiNC40LHQutCwINC/0YDQuCDQstGL0LTQtdC70LXQvdC40Lgg0L/QsNC80Y/RgtC4CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVhZF9tYXRyaXhfZHluYW1pYzIobWF0cml4LCByb3dzLCBjb2xzKTsKICAgICAgICAgICAgcHJpbnRfbWF0cml4X2R5bmFtaWMyKG1hdHJpeCwgcm93cywgY29scyk7CgogICAgICAgICAgICBpbnQgbWF4W01BWF9TSVpFXTsKICAgICAgICAgICAgaW50IG1pbltNQVhfU0laRV07CiAgICAgICAgICAgIGZpbmRfbWF4X2luX3Jvd3MoKGludCAoKilbTUFYX1NJWkVdKW1hdHJpeCwgcm93cywgY29scywgbWF4KTsKICAgICAgICAgICAgZmluZF9taW5faW5fY29scygoaW50ICgqKVtNQVhfU0laRV0pbWF0cml4LCByb3dzLCBjb2xzLCBtaW4pOwoKICAgICAgICAgICAgcHJpbnRmKCJcbtCc0LDQutGB0LjQvNCw0LvRjNC90YvQtSDRjdC70LXQvNC10L3RgtGLINCyINC60LDQttC00L7QuSDRgdGC0YDQvtC60LU6XG4iKTsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKICAgICAgICAgICAgICAgIHByaW50ZigiJWQiLCBtYXhbaV0pOwogICAgICAgICAgICAgICAgaWYgKGkgPCByb3dzIC0gMSkgewogICAgICAgICAgICAgICAgICAgIHByaW50ZigiICIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHByaW50ZigiXG7QnNC40L3QuNC80LDQu9GM0L3Ri9C1INGN0LvQtdC80LXQvdGC0Ysg0LIg0LrQsNC20LTQvtC8INGB0YLQvtC70LHRhtC1OlxuIik7CiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29sczsgaisrKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIiVkIiwgbWluW2pdKTsKICAgICAgICAgICAgICAgIGlmIChqIDwgY29scyAtIDEpIHsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmcmVlX21hdHJpeF9keW5hbWljMihtYXRyaXgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSA0OiB7CiAgICAgICAgICAgIGludCAqKm1hdHJpeCA9IGFsbG9jYXRlX21hdHJpeF9keW5hbWljMyhyb3dzLCBjb2xzKTsKICAgICAgICAgICAgaWYgKG1hdHJpeCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIm4vYVxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gMTsgLy8g0J7RiNC40LHQutCwINC/0YDQuCDQstGL0LTQtdC70LXQvdC40Lgg0L/QsNC80Y/RgtC4CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVhZF9tYXRyaXhfZHluYW1pYzMobWF0cml4LCByb3dzLCBjb2xzKTsKICAgICAgICAgICAgcHJpbnRfbWF0cml4X2R5bmFtaWMzKG1hdHJpeCwgcm93cywgY29scyk7CgogICAgICAgICAgICBpbnQgbWF4W01BWF9TSVpFXTsKICAgICAgICAgICAgaW50IG1pbltNQVhfU0laRV07CiAgICAgICAgICAgIGZpbmRfbWF4X2luX3Jvd3MobWF0cml4LCByb3dzLCBjb2xzLCBtYXgpOwogICAgICAgICAgICBmaW5kX21pbl9pbl9jb2xzKG1hdHJpeCwgcm93cywgY29scywgbWluKTsKCiAgICAgICAgICAgIHByaW50ZigiXG7QnNCw0LrRgdC40LzQsNC70YzQvdGL0LUg0Y3Qu9C10LzQtdC90YLRiyDQsiDQutCw0LbQtNC+0Lkg0YHRgtGA0L7QutC1OlxuIik7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIiVkIiwgbWF4W2ldKTsKICAgICAgICAgICAgICAgIGlmIChpIDwgcm93cyAtIDEpIHsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludGYoIlxu0JzQuNC90LjQvNCw0LvRjNC90YvQtSDRjdC70LXQvNC10L3RgtGLINCyINC60LDQttC00L7QvCDRgdGC0L7Qu9Cx0YbQtTpcbiIpOwogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykgewogICAgICAgICAgICAgICAgcHJpbnRmKCIlZCIsIG1pbltqXSk7CiAgICAgICAgICAgICAgICBpZiAoaiA8IGNvbHMgLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnJlZV9tYXRyaXhfZHluYW1pYzMobWF0cml4LCByb3dzKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAwOwp9CgovLyDQp9GC0LXQvdC40LUg0YHRgtCw0YLQuNGH0LXRgdC60L7QuSDQvNCw0YLRgNC40YbRiwp2b2lkIHJlYWRfbWF0cml4X3N0YXRpYyhpbnQgbWF0cml4W01BWF9TSVpFXVtNQVhfU0laRV0sIGludCByb3dzLCBpbnQgY29scykgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykgewogICAgICAgICAgICBpZiAoc2NhbmYoIiVkIiwgJm1hdHJpeFtpXVtqXSkgIT0gMSkgewogICAgICAgICAgICAgICAgcHJpbnRmKCJuL2FcbiIpOwogICAgICAgICAgICAgICAgZXhpdCgxKTsgLy8g0J7RiNC40LHQutCwINC/0YDQuCDRgdGH0LjRgtGL0LLQsNC90LjQuAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgovLyDQn9C10YfQsNGC0Ywg0YHRgtCw0YLQuNGH0LXRgdC60L7QuSDQvNCw0YLRgNC40YbRiwp2b2lkIHByaW50X21hdHJpeF9zdGF0aWMoaW50IG1hdHJpeFtNQVhfU0laRV1bTUFYX1NJWkVdLCBpbnQgcm93cywgaW50IGNvbHMpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb2xzOyBqKyspIHsKICAgICAgICAgICAgcHJpbnRmKCIlZCIsIG1hdHJpeFtpXVtqXSk7CiAgICAgICAgICAgIGlmIChqIDwgY29scyAtIDEpIHsKICAgICAgICAgICAgICAgIHByaW50ZigiICIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpIDwgcm93cyAtIDEpIHsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KfQoKLy8g0JTQuNC90LDQvNC40YfQtdGB0LrQvtC1INCy0YvQtNC10LvQtdC90LjQtTogMkQg0LzQsNGB0YHQuNCyINGD0LrQsNC30LDRgtC10LvQtdC5CmludCAqKmFsbG9jYXRlX21hdHJpeF9keW5hbWljMShpbnQgcm93cywgaW50IGNvbHMpIHsKICAgIGludCAqKm1hdHJpeCA9IG1hbGxvYyhyb3dzICogc2l6ZW9mKGludCAqKSk7CiAgICBpZiAobWF0cml4ID09IE5VTEwpIHJldHVybiBOVUxMOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7CiAgICAgICAgbWF0cml4W2ldID0gbWFsbG9jKGNvbHMgKiBzaXplb2YoaW50KSk7CiAgICAgICAgaWYgKG1hdHJpeFtpXSA9PSBOVUxMKSB7CiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKSB7CiAgICAgICAgICAgICAgICBmcmVlKG1hdHJpeFtqXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnJlZShtYXRyaXgpOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbWF0cml4Owp9CgovLyDQp9GC0LXQvdC40LUg0LTQuNC90LDQvNC40YfQtdGB0LrQvtC5INC80LDRgtGA0LjRhtGLIDEKdm9pZCByZWFkX21hdHJpeF9keW5hbWljMShpbnQgKiptYXRyaXgsIGludCByb3dzLCBpbnQgY29scykgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykgewogICAgICAgICAgICBpZiAoc2NhbmYoIiVkIiwgJm1hdHJpeFtpXVtqXSkgIT0gMSkgewogICAgICAgICAgICAgICAgcHJpbnRmKCJuL2FcbiIpOwogICAgICAgICAgICAgICAgZXhpdCgxKTsgLy8g0J7RiNC40LHQutCwINC/0YDQuCDRgdGH0LjRgtGL0LLQsNC90LjQuAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgovLyDQn9C10YfQsNGC0Ywg0LTQuNC90LDQvNC40YfQtdGB0LrQvtC5INC80LDRgtGA0LjRhtGLIDEKdm9pZCBwcmludF9tYXRyaXhfZHluYW1pYzEoaW50ICoqbWF0cml4LCBpbnQgcm93cywgaW50IGNvbHMpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb2xzOyBqKyspIHsKICAgICAgICAgICAgcHJpbnRmKCIlZCIsIG1hdHJpeFtpXVtqXSk7CiAgICAgICAgICAgIGlmIChqIDwgY29scyAtIDEpIHsKICAgICAgICAgICAgICAgIHByaW50ZigiICIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpIDwgcm93cyAtIDEpIHsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KfQoKLy8g0J7RgdCy0L7QsdC+0LbQtNC10L3QuNC1INC/0LDQvNGP0YLQuCDQtNC70Y8g0LTQuNC90LDQvNC40YfQtdGB0LrQvtC5INC80LDRgtGA0LjRhtGLIDEKdm9pZCBmcmVlX21hdHJpeF9keW5hbWljMShpbnQgKiptYXRyaXgsIGludCByb3dzKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgewogICAgICAgIGZyZWUobWF0cml4W2ldKTsKICAgIH0KICAgIGZyZWUobWF0cml4KTsKfQoKLy8g0JTQuNC90LDQvNC40YfQtdGB0LrQvtC1INCy0YvQtNC10LvQtdC90LjQtTogMUQg0LzQsNGB0YHQuNCyCmludCAqYWxsb2NhdGVfbWF0cml4X2R5bmFtaWMyKGludCByb3dzLCBpbnQgY29scykgewogICAgcmV0dXJuIG1hbGxvYyhyb3dzICogY29scyAqIHNpemVvZihpbnQpKTsKfQoKLy8g0KfRgtC10L3QuNC1INC00LjQvdCw0LzQuNGH0LXRgdC60L7QuSDQvNCw0YLRgNC40YbRiyAyCnZvaWQgcmVhZF9tYXRyaXhfZHluYW1pYzIoaW50ICptYXRyaXgsIGludCByb3dzLCBpbnQgY29scykgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykgewogICAgICAgICAgICBpZiAoc2NhbmYoIiVkIiwgJm1hdHJpeFtpICogY29scyArIGpdKSAhPSAxKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIm4vYVxuIik7CiAgICAgICAgICAgICAgICBleGl0KDEpOyAvLyDQntGI0LjQsdC60LAg0L/RgNC4INGB0YfQuNGC0YvQstCw0L3QuNC4CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCi8vINCf0LXRh9Cw0YLRjCDQtNC40L3QsNC80LjRh9C10YHQutC+0Lkg0LzQsNGC0YDQuNGG0YsgMgp2b2lkIHByaW50X21hdHJpeF9keW5hbWljMihpbnQgKm1hdHJpeCwgaW50IHJvd3MsIGludCBjb2xzKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29sczsgaisrKSB7CiAgICAgICAgICAgIHByaW50ZigiJWQiLCBtYXRyaXhbaSAqIGNvbHMgKyBqXSk7CiAgICAgICAgICAgIGlmIChqIDwgY29scyAtIDEpIHsKICAgICAgICAgICAgICAgIHByaW50ZigiICIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpIDwgcm93cyAtIDEpIHsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KfQoKLy8g0J7RgdCy0L7QsdC+0LbQtNC10L3QuNC1INC/0LDQvNGP0YLQuCDQtNC70Y8g0LTQuNC90LDQvNC40YfQtdGB0LrQvtC5INC80LDRgtGA0LjRhtGLIDIKdm9pZCBmcmVlX21hdHJpeF9keW5hbWljMihpbnQgKm1hdHJpeCkgewogICAgZnJlZShtYXRyaXgpOwp9CgovLyDQlNC40L3QsNC80LjRh9C10YHQutC+0LUg0LLRi9C00LXQu9C10L3QuNC1OiDQvNCw0YHRgdC40LIg0YPQutCw0LfQsNGC0LXQu9C10Lkg0L3QsCDRgdGC0YDQvtC60LgKaW50ICoqYWxsb2NhdGVfbWF0cml4X2R5bmFtaWMzKGludCByb3dzLCBpbnQgY29scykgewogICAgaW50ICoqbWF0cml4ID0gbWFsbG9jKHJvd3MgKiBzaXplb2YoaW50ICopKTsKICAgIGlmIChtYXRyaXggPT0gTlVMTCkgcmV0dXJuIE5VTEw7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKICAgICAgICBtYXRyaXhbaV0gPSBtYWxsb2MoY29scyAqIHNpemVvZihpbnQpKTsKICAgICAgICBpZiAobWF0cml4W2ldID09IE5VTEwpIHsKICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKICAgICAgICAgICAgICAgIGZyZWUobWF0cml4W2pdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmcmVlKG1hdHJpeCk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYXRyaXg7Cn0KCi8vINCn0YLQtdC90LjQtSDQtNC40L3QsNC80LjRh9C10YHQutC+0Lkg0LzQsNGC0YDQuNGG0YsgMwp2b2lkIHJlYWRfbWF0cml4X2R5bmFtaWMzKGludCAqKm1hdHJpeCwgaW50IHJvd3MsIGludCBjb2xzKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29sczsgaisrKSB7CiAgICAgICAgICAgIGlmIChzY2FuZigiJWQiLCAmbWF0cml4W2ldW2pdKSAhPSAxKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIm4vYVxuIik7CiAgICAgICAgICAgICAgICBleGl0KDEpOyAvLyDQntGI0LjQsdC60LAg0L/RgNC4INGB0YfQuNGC0YvQstCw0L3QuNC4CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCi8vINCf0LXRh9Cw0YLRjCDQtNC40L3QsNC80LjRh9C10YHQutC+0Lkg0LzQsNGC0YDQuNGG0YsgMwp2b2lkIHByaW50X21hdHJpeF9keW5hbWljMyhpbnQgKiptYXRyaXgsIGludCByb3dzLCBpbnQgY29scykgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykgewogICAgICAgICAgICBwcmludGYoIiVkIiwgbWF0cml4W2ldW2pdKTsKICAgICAgICAgICAgaWYgKGogPCBjb2xzIC0gMSkgewogICAgICAgICAgICAgICAgcHJpbnRmKCIgIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGkgPCByb3dzIC0gMSkgewogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQp9CgovLyDQntGB0LLQvtCx0L7QttC00LXQvdC40LUg0L/QsNC80Y/RgtC4INC00LvRjyDQtNC40L3QsNC80LjRh9C10YHQutC+0Lkg0LzQsNGC0YDQuNGG0YsgMwp2b2lkIGZyZWVfbWF0cml4X2R5bmFtaWMzKGludCAqKm1hdHJpeCwgaW50IHJvd3MpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7CiAgICAgICAgZnJlZShtYXRyaXhbaV0pOwogICAgfQogICAgZnJlZShtYXRyaXgpOwp9CgovLyDQpNGD0L3QutGG0LjRjyDQtNC70Y8g0L3QsNGF0L7QttC00LXQvdC40Y8g0LzQsNC60YHQuNC80LDQu9GM0L3Ri9GFINC30L3QsNGH0LXQvdC40Lkg0LIg0LrQsNC20LTQvtC5INGB0YLRgNC+0LrQtQp2b2lkIGZpbmRfbWF4X2luX3Jvd3MoaW50IG1hdHJpeFtNQVhfU0laRV1bTUFYX1NJWkVdLCBpbnQgcm93cywgaW50IGNvbHMsIGludCBtYXhbXSkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKICAgICAgICBtYXhbaV0gPSBtYXRyaXhbaV1bMF07CiAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBjb2xzOyBqKyspIHsKICAgICAgICAgICAgaWYgKG1hdHJpeFtpXVtqXSA+IG1heFtpXSkgewogICAgICAgICAgICAgICAgbWF4W2ldID0gbWF0cml4W2ldW2pdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgovLyDQpNGD0L3QutGG0LjRjyDQtNC70Y8g0L3QsNGF0L7QttC00LXQvdC40Y8g0LzQuNC90LjQvNCw0LvRjNC90YvRhSDQt9C90LDRh9C10L3QuNC5INCyINC60LDQttC00L7QvCDRgdGC0L7Qu9Cx0YbQtQp2b2lkIGZpbmRfbWluX2luX2NvbHMoaW50IG1hdHJpeFtNQVhfU0laRV1bTUFYX1NJWkVdLCBpbnQgcm93cywgaW50IGNvbHMsIGludCBtaW5bXSkgewogICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb2xzOyBqKyspIHsKICAgICAgICBtaW5bal0gPSBtYXRyaXhbMF1bal07CiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCByb3dzOyBpKyspIHsKICAgICAgICAgICAgaWYgKG1hdHJpeFtpXVtqXSA8IG1pbltqXSkgewogICAgICAgICAgICAgICAgbWluW2pdID0gbWF0cml4W2ldW2pdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9