#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/0Ysg0YTRg9C90LrRhtC40LkKdm9pZCByZWFkX21hdHJpeF9zdGF0aWMoaW50IG1hdHJpeFtNQVhfU0laRV1bTUFYX1NJWkVdLCBpbnQgcm93cywgaW50IGNvbHMpOwp2b2lkIHByaW50X21hdHJpeF9zdGF0aWMoaW50IG1hdHJpeFtNQVhfU0laRV1bTUFYX1NJWkVdLCBpbnQgcm93cywgaW50IGNvbHMpOwppbnQgKiphbGxvY2F0ZV9tYXRyaXhfZHluYW1pYzEoaW50IHJvd3MsIGludCBjb2xzKTsKdm9pZCByZWFkX21hdHJpeF9keW5hbWljMShpbnQgKiptYXRyaXgsIGludCByb3dzLCBpbnQgY29scyk7CnZvaWQgcHJpbnRfbWF0cml4X2R5bmFtaWMxKGludCAqKm1hdHJpeCwgaW50IHJvd3MsIGludCBjb2xzKTsKdm9pZCBmcmVlX21hdHJpeF9keW5hbWljMShpbnQgKiptYXRyaXgsIGludCByb3dzKTsKaW50ICphbGxvY2F0ZV9tYXRyaXhfZHluYW1pYzIoaW50IHJvd3MsIGludCBjb2xzKTsKCnZvaWQgcmVhZF9tYXRyaXhfZHluYW1pYzIoaW50ICptYXRyaXgsIGludCByb3dzLCBpbnQgY29scyk7CnZvaWQgcHJpbnRfbWF0cml4X2R5bmFtaWMyKGludCAqbWF0cml4LCBpbnQgcm93cywgaW50IGNvbHMpOwp2b2lkIGZyZWVfbWF0cml4X2R5bmFtaWMyKGludCAqbWF0cml4KTsKaW50ICoqYWxsb2NhdGVfbWF0cml4X2R5bmFtaWMzKGludCByb3dzLCBpbnQgY29scyk7CnZvaWQgcmVhZF9tYXRyaXhfZHluYW1pYzMoaW50ICoqbWF0cml4LCBpbnQgcm93cywgaW50IGNvbHMpOwp2b2lkIHByaW50X21hdHJpeF9keW5hbWljMyhpbnQgKiptYXRyaXgsIGludCByb3dzLCBpbnQgY29scyk7CnZvaWQgZnJlZV9tYXRyaXhfZHluYW1pYzMoaW50ICoqbWF0cml4LCBpbnQgcm93cyk7CnZvaWQgZmluZF9tYXhfaW5fcm93cyhpbnQgbWF0cml4W01BWF9TSVpFXVtNQVhfU0laRV0sIGludCByb3dzLCBpbnQgY29scywgaW50IG1heFtdKTsKdm9pZCBmaW5kX21pbl9pbl9jb2xzKGludCBtYXRyaXhbTUFYX1NJWkVdW01BWF9TSVpFXSwgaW50IHJvd3MsIGludCBjb2xzLCBpbnQgbWluW10pOwoKaW50IG1haW4oKSB7CiAgICBpbnQgY2hvaWNlLCByb3dzLCBjb2xzOwoKICAgIHByaW50Zigi0JLRi9Cx0LXRgNC40YLQtSDQvNC10YLQvtC0INCy0YvQtNC10LvQtdC90LjRjyDQv9Cw0LzRj9GC0Lg6XG4xLiDQodGC0LDRgtC40YfQtdGB0LrQuFxuMi4g0JTQuNC90LDQvNC40YfQtdGB0LrQuCAoMkQg0LzQsNGB0YHQuNCyINGD0LrQsNC30LDRgtC10LvQtdC5KVxuMy4g0JTQuNC90LDQvNC40YfQtdGB0LrQuCAoMUQg0LzQsNGB0YHQuNCyKVxuNC4g0JTQuNC90LDQvNC40YfQtdGB0LrQuCAo0LzQsNGB0YHQuNCyINGD0LrQsNC30LDRgtC10LvQtdC5INC90LAg0YHRgtGA0L7QutC4KVxuIik7CgogICAgaWYgKHNjYW5mKCIlZCIsICZjaG9pY2UpICE9IDEgfHwgY2hvaWNlIDwgMSB8fCBjaG9pY2UgPiA0KSB7CiAgICAgICAgcHJpbnRmKCJuL2FcbiIpOwogICAgICAgIHJldHVybiAxOyAvLyDQntGI0LjQsdC60LAg0LLRi9Cx0L7RgNCwCiAgICB9CgogICAgLy8g0KfRgtC10L3QuNC1INGA0LDQt9C80LXRgNC+0LIg0LzQsNGC0YDQuNGG0YsKICAgIGlmIChzY2FuZigiJWQgJWQiLCAmcm93cywgJmNvbHMpICE9IDIgfHwgcm93cyA8IDEgfHwgY29scyA8IDEgfHwgcm93cyA+IE1BWF9TSVpFIHx8IGNvbHMgPiBNQVhfU0laRSkgewogICAgICAgIHByaW50Zigibi9hXG4iKTsKICAgICAgICByZXR1cm4gMTsgLy8g0J7RiNC40LHQutCwINC/0YDQuCDRgdGH0LjRgtGL0LLQsNC90LjQuCDRgNCw0LfQvNC10YDQvtCyINC80LDRgtGA0LjRhtGLCiAgICB9CgogICAgc3dpdGNoIChjaG9pY2UpIHsKICAgICAgICBjYXNlIDE6IHsKICAgICAgICAgICAgaW50IG1hdHJpeFtNQVhfU0laRV1bTUFYX1NJWkVdOwogICAgICAgICAgICByZWFkX21hdHJpeF9zdGF0aWMobWF0cml4LCByb3dzLCBjb2xzKTsKICAgICAgICAgICAgcHJpbnRfbWF0cml4X3N0YXRpYyhtYXRyaXgsIHJvd3MsIGNvbHMpOwoKICAgICAgICAgICAgaW50IG1heFtNQVhfU0laRV07IC8vINCU0LvRjyDRhdGA0LDQvdC10L3QuNGPINC80LDQutGB0LjQvNCw0LvRjNC90YvRhSDRjdC70LXQvNC10L3RgtC+0LIg0LIg0YHRgtGA0L7QutCw0YUKICAgICAgICAgICAgaW50IG1pbltNQVhfU0laRV07IC8vINCU0LvRjyDRhdGA0LDQvdC10L3QuNGPINC80LjQvdC40LzQsNC70YzQvdGL0YUg0Y3Qu9C10LzQtdC90YLQvtCyINCyINGB0YLQvtC70LHRhtCw0YUKICAgICAgICAgICAgZmluZF9tYXhfaW5fcm93cyhtYXRyaXgsIHJvd3MsIGNvbHMsIG1heCk7CiAgICAgICAgICAgIGZpbmRfbWluX2luX2NvbHMobWF0cml4LCByb3dzLCBjb2xzLCBtaW4pOwoKICAgICAgICAgICAgLy8g0LLRi9Cy0L7QtCDQvNCw0YHRgdC40LLQvtCyCiAgICAgICAgICAgIHByaW50ZigiXG7QnNCw0LrRgdC40LzQsNC70YzQvdGL0LUg0Y3Qu9C10LzQtdC90YLRiyDQsiDQutCw0LbQtNC+0Lkg0YHRgtGA0L7QutC1OlxuIik7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIiVkIiwgbWF4W2ldKTsKICAgICAgICAgICAgICAgIGlmIChpIDwgcm93cyAtIDEpIHsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludGYoIlxu0JzQuNC90LjQvNCw0LvRjNC90YvQtSDRjdC70LXQvNC10L3RgtGLINCyINC60LDQttC00L7QvCDRgdGC0L7Qu9Cx0YbQtTpcbiIpOwogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykgewogICAgICAgICAgICAgICAgcHJpbnRmKCIlZCIsIG1pbltqXSk7CiAgICAgICAgICAgICAgICBpZiAoaiA8IGNvbHMgLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgMjogewogICAgICAgICAgICBpbnQgKiptYXRyaXggPSBhbGxvY2F0ZV9tYXRyaXhfZHluYW1pYzEocm93cywgY29scyk7CiAgICAgICAgICAgIGlmIChtYXRyaXggPT0gTlVMTCkgewogICAgICAgICAgICAgICAgcHJpbnRmKCJuL2FcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8vINCe0YjQuNCx0LrQsCDQv9GA0Lgg0LLRi9C00LXQu9C10L3QuNC4INC/0LDQvNGP0YLQuAogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlYWRfbWF0cml4X2R5bmFtaWMxKG1hdHJpeCwgcm93cywgY29scyk7CiAgICAgICAgICAgIHByaW50X21hdHJpeF9keW5hbWljMShtYXRyaXgsIHJvd3MsIGNvbHMpOwoKICAgICAgICAgICAgaW50IG1heFtNQVhfU0laRV07CiAgICAgICAgICAgIGludCBtaW5bTUFYX1NJWkVdOwogICAgICAgICAgICBmaW5kX21heF9pbl9yb3dzKG1hdHJpeCwgcm93cywgY29scywgbWF4KTsKICAgICAgICAgICAgZmluZF9taW5faW5fY29scyhtYXRyaXgsIHJvd3MsIGNvbHMsIG1pbik7CgogICAgICAgICAgICBwcmludGYoIlxu0JzQsNC60YHQuNC80LDQu9GM0L3Ri9C1INGN0LvQtdC80LXQvdGC0Ysg0LIg0LrQsNC20LTQvtC5INGB0YLRgNC+0LrQtTpcbiIpOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgewogICAgICAgICAgICAgICAgcHJpbnRmKCIlZCIsIG1heFtpXSk7CiAgICAgICAgICAgICAgICBpZiAoaSA8IHJvd3MgLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJpbnRmKCJcbtCc0LjQvdC40LzQsNC70YzQvdGL0LUg0Y3Qu9C10LzQtdC90YLRiyDQsiDQutCw0LbQtNC+0Lwg0YHRgtC+0LvQsdGG0LU6XG4iKTsKICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb2xzOyBqKyspIHsKICAgICAgICAgICAgICAgIHByaW50ZigiJWQiLCBtaW5bal0pOwogICAgICAgICAgICAgICAgaWYgKGogPCBjb2xzIC0gMSkgewogICAgICAgICAgICAgICAgICAgIHByaW50ZigiICIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZyZWVfbWF0cml4X2R5bmFtaWMxKG1hdHJpeCwgcm93cyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlIDM6IHsKICAgICAgICAgICAgaW50ICptYXRyaXggPSBhbGxvY2F0ZV9tYXRyaXhfZHluYW1pYzIocm93cywgY29scyk7CiAgICAgICAgICAgIGlmIChtYXRyaXggPT0gTlVMTCkgewogICAgICAgICAgICAgICAgcHJpbnRmKCJuL2FcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8vINCe0YjQuNCx0LrQsCDQv9GA0Lgg0LLRi9C00LXQu9C10L3QuNC4INC/0LDQvNGP0YLQuAogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlYWRfbWF0cml4X2R5bmFtaWMyKG1hdHJpeCwgcm93cywgY29scyk7CiAgICAgICAgICAgIHByaW50X21hdHJpeF9keW5hbWljMihtYXRyaXgsIHJvd3MsIGNvbHMpOwoKICAgICAgICAgICAgaW50IG1heFtNQVhfU0laRV07CiAgICAgICAgICAgIGludCBtaW5bTUFYX1NJWkVdOwogICAgICAgICAgICBmaW5kX21heF9pbl9yb3dzKChpbnQgKCopW01BWF9TSVpFXSltYXRyaXgsIHJvd3MsIGNvbHMsIG1heCk7CiAgICAgICAgICAgIGZpbmRfbWluX2luX2NvbHMoKGludCAoKilbTUFYX1NJWkVdKW1hdHJpeCwgcm93cywgY29scywgbWluKTsKCiAgICAgICAgICAgIHByaW50ZigiXG7QnNCw0LrRgdC40LzQsNC70YzQvdGL0LUg0Y3Qu9C10LzQtdC90YLRiyDQsiDQutCw0LbQtNC+0Lkg0YHRgtGA0L7QutC1OlxuIik7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIiVkIiwgbWF4W2ldKTsKICAgICAgICAgICAgICAgIGlmIChpIDwgcm93cyAtIDEpIHsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludGYoIlxu0JzQuNC90LjQvNCw0LvRjNC90YvQtSDRjdC70LXQvNC10L3RgtGLINCyINC60LDQttC00L7QvCDRgdGC0L7Qu9Cx0YbQtTpcbiIpOwogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykgewogICAgICAgICAgICAgICAgcHJpbnRmKCIlZCIsIG1pbltqXSk7CiAgICAgICAgICAgICAgICBpZiAoaiA8IGNvbHMgLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnJlZV9tYXRyaXhfZHluYW1pYzIobWF0cml4KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgNDogewogICAgICAgICAgICBpbnQgKiptYXRyaXggPSBhbGxvY2F0ZV9tYXRyaXhfZHluYW1pYzMocm93cywgY29scyk7CiAgICAgICAgICAgIGlmIChtYXRyaXggPT0gTlVMTCkgewogICAgICAgICAgICAgICAgcHJpbnRmKCJuL2FcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8vINCe0YjQuNCx0LrQsCDQv9GA0Lgg0LLRi9C00LXQu9C10L3QuNC4INC/0LDQvNGP0YLQuAogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlYWRfbWF0cml4X2R5bmFtaWMzKG1hdHJpeCwgcm93cywgY29scyk7CiAgICAgICAgICAgIHByaW50X21hdHJpeF9keW5hbWljMyhtYXRyaXgsIHJvd3MsIGNvbHMpOwoKICAgICAgICAgICAgaW50IG1heFtNQVhfU0laRV07CiAgICAgICAgICAgIGludCBtaW5bTUFYX1NJWkVdOwogICAgICAgICAgICBmaW5kX21heF9pbl9yb3dzKG1hdHJpeCwgcm93cywgY29scywgbWF4KTsKICAgICAgICAgICAgZmluZF9taW5faW5fY29scyhtYXRyaXgsIHJvd3MsIGNvbHMsIG1pbik7CgogICAgICAgICAgICBwcmludGYoIlxu0JzQsNC60YHQuNC80LDQu9GM0L3Ri9C1INGN0LvQtdC80LXQvdGC0Ysg0LIg0LrQsNC20LTQvtC5INGB0YLRgNC+0LrQtTpcbiIpOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgewogICAgICAgICAgICAgICAgcHJpbnRmKCIlZCIsIG1heFtpXSk7CiAgICAgICAgICAgICAgICBpZiAoaSA8IHJvd3MgLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJpbnRmKCJcbtCc0LjQvdC40LzQsNC70YzQvdGL0LUg0Y3Qu9C10LzQtdC90YLRiyDQsiDQutCw0LbQtNC+0Lwg0YHRgtC+0LvQsdGG0LU6XG4iKTsKICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb2xzOyBqKyspIHsKICAgICAgICAgICAgICAgIHByaW50ZigiJWQiLCBtaW5bal0pOwogICAgICAgICAgICAgICAgaWYgKGogPCBjb2xzIC0gMSkgewogICAgICAgICAgICAgICAgICAgIHByaW50ZigiICIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZyZWVfbWF0cml4X2R5bmFtaWMzKG1hdHJpeCwgcm93cyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMDsKfQoKLy8g0KfRgtC10L3QuNC1INGB0YLQsNGC0LjRh9C10YHQutC+0Lkg0LzQsNGC0YDQuNGG0YsKdm9pZCByZWFkX21hdHJpeF9zdGF0aWMoaW50IG1hdHJpeFtNQVhfU0laRV1bTUFYX1NJWkVdLCBpbnQgcm93cywgaW50IGNvbHMpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb2xzOyBqKyspIHsKICAgICAgICAgICAgaWYgKHNjYW5mKCIlZCIsICZtYXRyaXhbaV1bal0pICE9IDEpIHsKICAgICAgICAgICAgICAgIHByaW50Zigibi9hXG4iKTsKICAgICAgICAgICAgICAgIGV4aXQoMSk7IC8vINCe0YjQuNCx0LrQsCDQv9GA0Lgg0YHRh9C40YLRi9Cy0LDQvdC40LgKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKLy8g0J/QtdGH0LDRgtGMINGB0YLQsNGC0LjRh9C10YHQutC+0Lkg0LzQsNGC0YDQuNGG0YsKdm9pZCBwcmludF9tYXRyaXhfc3RhdGljKGludCBtYXRyaXhbTUFYX1NJWkVdW01BWF9TSVpFXSwgaW50IHJvd3MsIGludCBjb2xzKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29sczsgaisrKSB7CiAgICAgICAgICAgIHByaW50ZigiJWQiLCBtYXRyaXhbaV1bal0pOwogICAgICAgICAgICBpZiAoaiA8IGNvbHMgLSAxKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIiAiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaSA8IHJvd3MgLSAxKSB7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9Cn0KCi8vINCU0LjQvdCw0LzQuNGH0LXRgdC60L7QtSDQstGL0LTQtdC70LXQvdC40LU6IDJEINC80LDRgdGB0LjQsiDRg9C60LDQt9Cw0YLQtdC70LXQuQppbnQgKiphbGxvY2F0ZV9tYXRyaXhfZHluYW1pYzEoaW50IHJvd3MsIGludCBjb2xzKSB7CiAgICBpbnQgKiptYXRyaXggPSBtYWxsb2Mocm93cyAqIHNpemVvZihpbnQgKikpOwogICAgaWYgKG1hdHJpeCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgewogICAgICAgIG1hdHJpeFtpXSA9IG1hbGxvYyhjb2xzICogc2l6ZW9mKGludCkpOwogICAgICAgIGlmIChtYXRyaXhbaV0gPT0gTlVMTCkgewogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykgewogICAgICAgICAgICAgICAgZnJlZShtYXRyaXhbal0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZyZWUobWF0cml4KTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG1hdHJpeDsKfQoKLy8g0KfRgtC10L3QuNC1INC00LjQvdCw0LzQuNGH0LXRgdC60L7QuSDQvNCw0YLRgNC40YbRiyAxCnZvaWQgcmVhZF9tYXRyaXhfZHluYW1pYzEoaW50ICoqbWF0cml4LCBpbnQgcm93cywgaW50IGNvbHMpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb2xzOyBqKyspIHsKICAgICAgICAgICAgaWYgKHNjYW5mKCIlZCIsICZtYXRyaXhbaV1bal0pICE9IDEpIHsKICAgICAgICAgICAgICAgIHByaW50Zigibi9hXG4iKTsKICAgICAgICAgICAgICAgIGV4aXQoMSk7IC8vINCe0YjQuNCx0LrQsCDQv9GA0Lgg0YHRh9C40YLRi9Cy0LDQvdC40LgKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKLy8g0J/QtdGH0LDRgtGMINC00LjQvdCw0LzQuNGH0LXRgdC60L7QuSDQvNCw0YLRgNC40YbRiyAxCnZvaWQgcHJpbnRfbWF0cml4X2R5bmFtaWMxKGludCAqKm1hdHJpeCwgaW50IHJvd3MsIGludCBjb2xzKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29sczsgaisrKSB7CiAgICAgICAgICAgIHByaW50ZigiJWQiLCBtYXRyaXhbaV1bal0pOwogICAgICAgICAgICBpZiAoaiA8IGNvbHMgLSAxKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIiAiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaSA8IHJvd3MgLSAxKSB7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9Cn0KCi8vINCe0YHQstC+0LHQvtC20LTQtdC90LjQtSDQv9Cw0LzRj9GC0Lgg0LTQu9GPINC00LjQvdCw0LzQuNGH0LXRgdC60L7QuSDQvNCw0YLRgNC40YbRiyAxCnZvaWQgZnJlZV9tYXRyaXhfZHluYW1pYzEoaW50ICoqbWF0cml4LCBpbnQgcm93cykgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKICAgICAgICBmcmVlKG1hdHJpeFtpXSk7CiAgICB9CiAgICBmcmVlKG1hdHJpeCk7Cn0KCi8vINCU0LjQvdCw0LzQuNGH0LXRgdC60L7QtSDQstGL0LTQtdC70LXQvdC40LU6IDFEINC80LDRgdGB0LjQsgppbnQgKmFsbG9jYXRlX21hdHJpeF9keW5hbWljMihpbnQgcm93cywgaW50IGNvbHMpIHsKICAgIHJldHVybiBtYWxsb2Mocm93cyAqIGNvbHMgKiBzaXplb2YoaW50KSk7Cn0KCi8vINCn0YLQtdC90LjQtSDQtNC40L3QsNC80LjRh9C10YHQutC+0Lkg0LzQsNGC0YDQuNGG0YsgMgp2b2lkIHJlYWRfbWF0cml4X2R5bmFtaWMyKGludCAqbWF0cml4LCBpbnQgcm93cywgaW50IGNvbHMpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb2xzOyBqKyspIHsKICAgICAgICAgICAgaWYgKHNjYW5mKCIlZCIsICZtYXRyaXhbaSAqIGNvbHMgKyBqXSkgIT0gMSkgewogICAgICAgICAgICAgICAgcHJpbnRmKCJuL2FcbiIpOwogICAgICAgICAgICAgICAgZXhpdCgxKTsgLy8g0J7RiNC40LHQutCwINC/0YDQuCDRgdGH0LjRgtGL0LLQsNC90LjQuAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgovLyDQn9C10YfQsNGC0Ywg0LTQuNC90LDQvNC40YfQtdGB0LrQvtC5INC80LDRgtGA0LjRhtGLIDIKdm9pZCBwcmludF9tYXRyaXhfZHluYW1pYzIoaW50ICptYXRyaXgsIGludCByb3dzLCBpbnQgY29scykgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykgewogICAgICAgICAgICBwcmludGYoIiVkIiwgbWF0cml4W2kgKiBjb2xzICsgal0pOwogICAgICAgICAgICBpZiAoaiA8IGNvbHMgLSAxKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIiAiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaSA8IHJvd3MgLSAxKSB7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9Cn0KCi8vINCe0YHQstC+0LHQvtC20LTQtdC90LjQtSDQv9Cw0LzRj9GC0Lgg0LTQu9GPINC00LjQvdCw0LzQuNGH0LXRgdC60L7QuSDQvNCw0YLRgNC40YbRiyAyCnZvaWQgZnJlZV9tYXRyaXhfZHluYW1pYzIoaW50ICptYXRyaXgpIHsKICAgIGZyZWUobWF0cml4KTsKfQoKLy8g0JTQuNC90LDQvNC40YfQtdGB0LrQvtC1INCy0YvQtNC10LvQtdC90LjQtTog0LzQsNGB0YHQuNCyINGD0LrQsNC30LDRgtC10LvQtdC5INC90LAg0YHRgtGA0L7QutC4CmludCAqKmFsbG9jYXRlX21hdHJpeF9keW5hbWljMyhpbnQgcm93cywgaW50IGNvbHMpIHsKICAgIGludCAqKm1hdHJpeCA9IG1hbGxvYyhyb3dzICogc2l6ZW9mKGludCAqKSk7CiAgICBpZiAobWF0cml4ID09IE5VTEwpIHJldHVybiBOVUxMOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7CiAgICAgICAgbWF0cml4W2ldID0gbWFsbG9jKGNvbHMgKiBzaXplb2YoaW50KSk7CiAgICAgICAgaWYgKG1hdHJpeFtpXSA9PSBOVUxMKSB7CiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKSB7CiAgICAgICAgICAgICAgICBmcmVlKG1hdHJpeFtqXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnJlZShtYXRyaXgpOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbWF0cml4Owp9CgovLyDQp9GC0LXQvdC40LUg0LTQuNC90LDQvNC40YfQtdGB0LrQvtC5INC80LDRgtGA0LjRhtGLIDMKdm9pZCByZWFkX21hdHJpeF9keW5hbWljMyhpbnQgKiptYXRyaXgsIGludCByb3dzLCBpbnQgY29scykgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykgewogICAgICAgICAgICBpZiAoc2NhbmYoIiVkIiwgJm1hdHJpeFtpXVtqXSkgIT0gMSkgewogICAgICAgICAgICAgICAgcHJpbnRmKCJuL2FcbiIpOwogICAgICAgICAgICAgICAgZXhpdCgxKTsgLy8g0J7RiNC40LHQutCwINC/0YDQuCDRgdGH0LjRgtGL0LLQsNC90LjQuAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgovLyDQn9C10YfQsNGC0Ywg0LTQuNC90LDQvNC40YfQtdGB0LrQvtC5INC80LDRgtGA0LjRhtGLIDMKdm9pZCBwcmludF9tYXRyaXhfZHluYW1pYzMoaW50ICoqbWF0cml4LCBpbnQgcm93cywgaW50IGNvbHMpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb2xzOyBqKyspIHsKICAgICAgICAgICAgcHJpbnRmKCIlZCIsIG1hdHJpeFtpXVtqXSk7CiAgICAgICAgICAgIGlmIChqIDwgY29scyAtIDEpIHsKICAgICAgICAgICAgICAgIHByaW50ZigiICIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpIDwgcm93cyAtIDEpIHsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KfQoKLy8g0J7RgdCy0L7QsdC+0LbQtNC10L3QuNC1INC/0LDQvNGP0YLQuCDQtNC70Y8g0LTQuNC90LDQvNC40YfQtdGB0LrQvtC5INC80LDRgtGA0LjRhtGLIDMKdm9pZCBmcmVlX21hdHJpeF9keW5hbWljMyhpbnQgKiptYXRyaXgsIGludCByb3dzKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgewogICAgICAgIGZyZWUobWF0cml4W2ldKTsKICAgIH0KICAgIGZyZWUobWF0cml4KTsKfQoKLy8g0KTRg9C90LrRhtC40Y8g0LTQu9GPINC90LDRhdC+0LbQtNC10L3QuNGPINC80LDQutGB0LjQvNCw0LvRjNC90YvRhSDQt9C90LDRh9C10L3QuNC5INCyINC60LDQttC00L7QuSDRgdGC0YDQvtC60LUKdm9pZCBmaW5kX21heF9pbl9yb3dzKGludCBtYXRyaXhbTUFYX1NJWkVdW01BWF9TSVpFXSwgaW50IHJvd3MsIGludCBjb2xzLCBpbnQgbWF4W10pIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7CiAgICAgICAgbWF4W2ldID0gbWF0cml4W2ldWzBdOwogICAgICAgIGZvciAoaW50IGogPSAxOyBqIDwgY29sczsgaisrKSB7CiAgICAgICAgICAgIGlmIChtYXRyaXhbaV1bal0gPiBtYXhbaV0pIHsKICAgICAgICAgICAgICAgIG1heFtpXSA9IG1hdHJpeFtpXVtqXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKLy8g0KTRg9C90LrRhtC40Y8g0LTQu9GPINC90LDRhdC+0LbQtNC10L3QuNGPINC80LjQvdC40LzQsNC70YzQvdGL0YUg0LfQvdCw0YfQtdC90LjQuSDQsiDQutCw0LbQtNC+0Lwg0YHRgtC+0LvQsdGG0LUKdm9pZCBmaW5kX21pbl9pbl9jb2xzKGludCBtYXRyaXhbTUFYX1NJWkVdW01BWF9TSVpFXSwgaW50IHJvd3MsIGludCBjb2xzLCBpbnQgbWluW10pIHsKICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29sczsgaisrKSB7CiAgICAgICAgbWluW2pdID0gbWF0cml4WzBdW2pdOwogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcm93czsgaSsrKSB7CiAgICAgICAgICAgIGlmIChtYXRyaXhbaV1bal0gPCBtaW5bal0pIHsKICAgICAgICAgICAgICAgIG1pbltqXSA9IG1hdHJpeFtpXVtqXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQ==