#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#define MAX_LENGTH 160
void read_input(char *input, size_t size) {
if (fgets(input
, size
, stdin
) == NULL
) { fprintf(stderr
, "Error reading input.\n"); }
input
[strcspn(input
, "\n")] = '\0'; }
void invertSymmetry(char *result) {
while (*result) {
*result = (*result == '1') ? 'i' : (*result == 'i' ? '1' : *result);
++result;
}
}
char* addition(char matrix[][MAX_LENGTH], int rows) {
static char result[MAX_LENGTH];
memset(result
, '0', MAX_LENGTH
);
int columns
= strlen(matrix
[0]); printf("Длина: %d\n", columns
);
printf("\nПолученная матрица:\n"); for (int i = 0; i < rows; i++) {
}
int x, z, r, y = 0, g;
char current_result[MAX_LENGTH];
int current_len = 0;
int j = columns - 1;
while (j >= 0 || y != 0) {
x = 0; g = 0; r = 0;
int skip = 0;
for (int i = 0; i < rows; i++) {
char n = (j >= 0) ? matrix[i][j] : '0';
if (n == '1') {
x += 1;
} else if (n == 'i') {
x -= 1;
} else if (n == ',' || n == '.') {
if (current_len > 0) {
memmove(current_result
+ 1, current_result
, current_len
); }
current_result[0] = ',';
current_len++;
skip = 1;
break;
}
}
if (skip) {
j--;
continue;
}
x += y;
r = (x < 0) ? -1 : 1;
if (z == 2) {
z = -1;
g = 1;
}
z *= r;
g *= r;
if (current_len + 1 < MAX_LENGTH) {
memmove(current_result
+ 1, current_result
, current_len
); if (z == -1) {
current_result[0] = 'i';
} else if (z == 1) {
current_result[0] = '1';
} else if (z == 0) {
current_result[0] = '0';
}
current_len++;
}
y = x / 3;
// y = y * r;
y += g;
j--;
}
result[0] = '\0';
strncpy(result
, current_result
, current_len
); result[current_len] = '\0';
return result;
}
char* binary_and(char matrix[][MAX_LENGTH], int rows) {
static char final_result[MAX_LENGTH]; // Статический массив для хранения результата
int result_index = 0; // Индекс для записи в final_result
int columns
= strlen(matrix
[0]); // Количество столбцов, предполагаем MAX_LENGTH printf("\nColumns: %d\n", columns
);
printf("\nПолученная матрица:\n"); for (int i = 0; i < rows; i++) {
}
// Проходим по всем столбцам
for (int j = 0; j < columns; j++) {
// Проверяем, есть ли в столбцах символы 'i', '0', '1' или ',' и обрабатываем их
if (matrix[0][j] == 'i' || matrix[1][j] == 'i') {
final_result[result_index++] = 'i';
} else if (matrix[0][j] == '0' || matrix[1][j] == '0') {
final_result[result_index++] = '0';
} else if (matrix[0][j] == '1' && matrix[1][j] == '1') {
final_result[result_index++] = '1';
} else if (matrix[0][j] == ',' || matrix[0][j] == '.' || matrix[1][j] == ',' || matrix[1][j] == '.') {
final_result[result_index++] = ',';
} else {
final_result[result_index++] = '0';
}
}
final_result[result_index] = '\0'; // Завершаем строку
return final_result; // Возвращаем результат
}
char* binary_or(char matrix[][MAX_LENGTH], int rows) {
static char final_result[MAX_LENGTH]; // Статический массив для хранения результата
int result_index = 0; // Индекс для записи в final_result
int columns
= strlen(matrix
[0]); // Количество столбцов, предполагаем MAX_LENGTH printf("\nColumns: %d\n", columns
);
printf("\nПолученная матрица:\n"); for (int i = 0; i < rows; i++) {
}
// Преобразование значений в финальную строку по логике OR
for (int j = 0; j < columns; j++) {
if (matrix[0][j] == '1' || matrix[1][j] == '1') {
final_result[result_index++] = '1';
} else if (matrix[0][j] == '0' || matrix[1][j] == '0') {
final_result[result_index++] = '0';
} else if (matrix[0][j] == 'i' && matrix[1][j] == 'i') {
final_result[result_index++] = 'i';
} else if (matrix[0][j] == ',' || matrix[0][j] == '.' || matrix[1][j] == ',' || matrix[1][j] == '.') {
final_result[result_index++] = ',';
} else {
final_result[result_index++] = '0';
}
}
final_result[result_index] = '\0'; // Завершаем строку
return final_result;
}
void rationing(char input1[], char input2[], int choice) {
char* comma1_pos
= strpbrk(input1
, ",."); char* comma2_pos
= strpbrk(input2
, ",.");
if (comma1_pos) {
n1 = comma1_pos - input1;
}
if (comma2_pos) {
n2 = comma2_pos - input2;
}
if (n1 < n2) {
a1 += (n2 - n1);
}
if (n2 < n1) {
a2 += (n1 - n2);
}
int max_a = (a1 > a2) ? a1 : a2;
int n = 2;
char matrix[2][MAX_LENGTH];
memset(matrix
, '0', sizeof(matrix
)); matrix[0][max_a] = '\0';
matrix[1][max_a] = '\0';
int start_idx1 = (n1 < n2) ? n2 - n1 : 0;
int start_idx2 = (n2 < n1) ? n1 - n2 : 0;
if (choice == 6) {
char* result = binary_and(matrix, n);
printf("\nРезультат: %s\n", result
); }
else if (choice == 7) {
char* result = binary_or(matrix, n);
printf("\nРезультат: %s\n", result
); }
else {
char* result = addition(matrix, n);
printf("\nРезультат: %s\n", result
); }
}
void removeChar(char* str) {
if (pos) {
}
}
void multiplication(char input1[], char input2[]) {
char temp[MAX_LENGTH];
char* comma1_pos
= strpbrk(input1
, ",."); char* comma2_pos
= strpbrk(input2
, ",.");
int index1 = comma1_pos ? (int)(comma1_pos - input1) + 1 : len1;
int index2 = comma2_pos ? (int)(comma2_pos - input2) + 1 : len2;
int n = (len1 - index1) + (len2 - index2);
removeChar(input1);
removeChar(input2);
if (len2 > len1) {
int templen = len2;
len2 = len1;
len1 = templen;
} else {
}
invertSymmetry(temp);
char matrix[len2][MAX_LENGTH];
memset(matrix
, '0', sizeof(matrix
));
int len=len1-len2;
int s = len2 - 1;
for (int i = 0; i < len2; i++) {
if (input2[i] == '1') {
memcpy(matrix
[s
] + (len2
- 1 - s
), input1
, MAX_LENGTH
- (len2
- 1 - s
)); }
else if (input2[i] == 'i') {
memcpy(matrix
[s
] + (len2
- 1 - s
), temp
, MAX_LENGTH
- (len2
- 1 - s
)); }
else if (input2[i] == '0') { matrix[s][len1+len2-1] = '\0';}
s--;
}
/*
// Выводим результат
for (int i = 0; i < len2; i++) {
// Добавляем символы '/' для пустых мест
for (int j = 0; j < len; j++) {
if (matrix[i][j] == '\0') {
//matrix[i][j] = ' '; // Заполняем пустые места
}
}
printf("matrix[%d]: %s\n", i, matrix[i]);
}
// Вывод результатов
/*printf("Значение n: %d\n", n);
printf("Первая строка после удаления: %s\n", input1);
printf("Вторая строка после удаления: %s\n", input2);
printf("Первая строка после инверсии: %s\n", temp);
printf("Длина первой строки после удаления: %d\n", len1);
printf("Длина второй строки после удаления: %d\n", len2);*/
char* result = addition(matrix, len2);
if (n>0 && n!=(len1+len2)){
result[n] = ',';}
printf("\nРезультат третьей функции: %s\n", result
);
}
void threeToTen() {
char input[MAX_LENGTH];
read_input(input, MAX_LENGTH);
char *delimiter
= strpbrk(input
, ".,"); int n
= (delimiter
) ? (delimiter
- input
- 1) : (strlen(input
) - 1);
long double result = 0; // Замінено double на long double
for (int i = 0; input[i] != '\0'; i++) {
if (input[i] == '.' || input[i] == ',') {
continue;
} else if (input[i] == 'i') {
result += -1 * powl(3, n); // Використовуємо powl для long double
result += (input[i] - '0') * powl(3, n); // Використовуємо powl для long double
}
n--;
}
printf("Decimal value: %.10Lf\n", result
); // Використовуємо %Lf для long double }
void symmetry(const char *input, int isNegative) {
printf("Non-symmetrical result: %s\n", input
); char result[MAX_LENGTH] = "";
int x = 0, y = 0, z = 0;
for (int i = len - 1; i >= 0; i--) {
if (input[i] == ',') {
result[0] = ',';
continue;
}
x = input[i] - '0';
z = y + x;
if (z <= 1) {
result[0] = z + '0';
y = 0;
} else if (z == 2) {
result[0] = 'i';
y = 1;
} else if (z == 3) {
result[0] = '0';
y = 1;
}
}
if (y != 0) {
result[0] = y + '0';
}
if (isNegative) {
invertSymmetry(result);
}
printf("Symmetrical result: %s\n", result
); }
void whole_part(char *part) {
long long number = strtoll(part, NULL, 10);
if (number == 0) {
part[0] = '0';
part[1] = '\0';
} else {
char buffer[2];
part[0] = '\0';
while (number > 0) {
part[0] = buffer[0];
number /= 3;
}
}
}
void fraction_part(char *part) {
char buffer[2];
part[0] = '\0';
for (int i = 0; i < 15; i++) {
fractionalValue *= 3;
int digit = (int)fractionalValue;
fractionalValue -= digit;
}
}
void translation() {
char input[MAX_LENGTH];
char firstPart[MAX_LENGTH/2] = "";
char secondPart[MAX_LENGTH/2] = "";
int isNegative = 0;
read_input(input, MAX_LENGTH);
if (strchr(input
, '-') != NULL
) { isNegative = 1;
}
char *delimiter
= strpbrk(input
, ".,");
if (delimiter) {
size_t firstLen = delimiter - input;
strncpy(firstPart
, input
, firstLen
); firstPart[firstLen] = '\0';
strcpy(secondPart
, delimiter
+ 1); } else {
}
whole_part(firstPart);
fraction_part(secondPart);
} else {
}
char combined[MAX_LENGTH] = "";
snprintf(combined
, sizeof(combined
), "%s,%s", firstPart
, secondPart
);
symmetry(combined, isNegative);
}
int main() {
int choice;
char input1[MAX_LENGTH], input2[MAX_LENGTH];
int n; // Размер матрицы
int matrix[MAX_LENGTH][MAX_LENGTH]; // Матрица произвольного размера
do {
printf("1. В трійкову симетричну\n"); printf("Введіть ваш вибір: ");
if (scanf("%d", &choice
) != 1) { fprintf(stderr
, "Неверный ввод. Выход.\n"); break;
}
while (getchar() != '\n'); // Ожидаем ввода
switch (choice) {
case 1:
translation();
break;
case 2:
threeToTen();
break;
case 3:
printf("Введите первую строку: "); read_input(input1, MAX_LENGTH);
printf("Введите вторую строку: "); read_input(input2, MAX_LENGTH);
rationing(input1, input2, choice);
break;
case 4:
printf("Введите первую строку: "); read_input(input1, MAX_LENGTH);
printf("Введите вторую строку: "); read_input(input2, MAX_LENGTH);
invertSymmetry(input2);
rationing(input1, input2, choice);
break;
case 5:
printf("Введите первую строку: "); read_input(input1, MAX_LENGTH);
printf("Введите вторую строку: "); read_input(input2, MAX_LENGTH);
multiplication(input1, input2);
break;
case 6: //OR
printf("Введите первую строку: "); read_input(input1, MAX_LENGTH);
printf("Введите вторую строку: "); read_input(input2, MAX_LENGTH);
rationing(input1, input2, choice);
break;
case 7: //AND
printf("Введите первую строку: "); read_input(input1, MAX_LENGTH);
printf("Введите вторую строку: "); read_input(input2, MAX_LENGTH);
rationing(input1, input2, choice);
break;
case 0:
printf("Выход из программы.\n"); break;
default:
printf("Неверный выбор. Попробуйте снова.\n"); }
} while (choice != 0);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8bWF0aC5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2RlZmluZSBNQVhfTEVOR1RIIDE2MAoKdm9pZCByZWFkX2lucHV0KGNoYXIgKmlucHV0LCBzaXplX3Qgc2l6ZSkgewogICAgaWYgKGZnZXRzKGlucHV0LCBzaXplLCBzdGRpbikgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgcmVhZGluZyBpbnB1dC5cbiIpOwogICAgICAgIGV4aXQoMSk7IAogICAgfQogICAgaW5wdXRbc3RyY3NwbihpbnB1dCwgIlxuIildID0gJ1wwJzsgIAp9Cgp2b2lkIGludmVydFN5bW1ldHJ5KGNoYXIgKnJlc3VsdCkgewogICAgd2hpbGUgKCpyZXN1bHQpIHsKICAgICAgICAqcmVzdWx0ID0gKCpyZXN1bHQgPT0gJzEnKSA/ICdpJyA6ICgqcmVzdWx0ID09ICdpJyA/ICcxJyA6ICpyZXN1bHQpOwogICAgICAgICsrcmVzdWx0OwogICAgfQp9CgpjaGFyKiBhZGRpdGlvbihjaGFyIG1hdHJpeFtdW01BWF9MRU5HVEhdLCBpbnQgcm93cykgewogICAgc3RhdGljIGNoYXIgcmVzdWx0W01BWF9MRU5HVEhdOyAgCiAgICBtZW1zZXQocmVzdWx0LCAnMCcsIE1BWF9MRU5HVEgpOyAKCiAgICBwcmludGYoItCS0YvRgdC+0YLQsDogJWRcbiIsIHJvd3MpOwogICAgaW50IGNvbHVtbnMgPSBzdHJsZW4obWF0cml4WzBdKTsKICAgIHByaW50Zigi0JTQu9C40L3QsDogJWRcbiIsIGNvbHVtbnMpOwoKICAgIHByaW50ZigiXG7Qn9C+0LvRg9GH0LXQvdC90LDRjyDQvNCw0YLRgNC40YbQsDpcbiIpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKICAgICAgICBwcmludGYoIiVzXG4iLCBtYXRyaXhbaV0pOwogICAgfQoKICAgIGludCB4LCB6LCByLCB5ID0gMCwgZzsKICAgIGNoYXIgY3VycmVudF9yZXN1bHRbTUFYX0xFTkdUSF07ICAKICAgIGludCBjdXJyZW50X2xlbiA9IDA7ICAKCiAgICBpbnQgaiA9IGNvbHVtbnMgLSAxOyAgCiAgICB3aGlsZSAoaiA+PSAwIHx8IHkgIT0gMCkgewogICAgICAgIHggPSAwOyBnID0gMDsgciA9IDA7ICAKCiAgICAgICAgaW50IHNraXAgPSAwOwoKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgewogICAgICAgICAgICBjaGFyIG4gPSAoaiA+PSAwKSA/IG1hdHJpeFtpXVtqXSA6ICcwJzsgICAgCiAgICAgICAgICAgIGlmIChuID09ICcxJykgewogICAgICAgICAgICAgICAgeCArPSAxOwogICAgICAgICAgICB9IGVsc2UgaWYgKG4gPT0gJ2knKSB7CiAgICAgICAgICAgICAgICB4IC09IDE7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobiA9PSAnLCcgfHwgbiA9PSAnLicpIHsKICAgICAgICAgICAgICAgIGlmIChjdXJyZW50X2xlbiA+IDApIHsKICAgICAgICAgICAgICAgICAgICBtZW1tb3ZlKGN1cnJlbnRfcmVzdWx0ICsgMSwgY3VycmVudF9yZXN1bHQsIGN1cnJlbnRfbGVuKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGN1cnJlbnRfcmVzdWx0WzBdID0gJywnOyAgCiAgICAgICAgICAgICAgICBjdXJyZW50X2xlbisrOwogICAgICAgICAgICAgICAgc2tpcCA9IDE7CiAgICAgICAgICAgICAgICBicmVhazsgIAogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoc2tpcCkgewogICAgICAgICAgICBqLS07ICAKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHggKz0geTsgIAogICAgICAgIHIgPSAoeCA8IDApID8gLTEgOiAxOwogICAgICAgIHogPSBhYnMoeCkgJSAzOyAgCiAgICAgICAgaWYgKHogPT0gMikgewogICAgICAgICAgICB6ID0gLTE7CiAgICAgICAgICAgIGcgPSAxOwogICAgICAgIH0KICAgICAgICB6ICo9IHI7CiAgICAgICAgZyAqPSByOwoKICAgICAgICBpZiAoY3VycmVudF9sZW4gKyAxIDwgTUFYX0xFTkdUSCkgewogICAgICAgICAgICBtZW1tb3ZlKGN1cnJlbnRfcmVzdWx0ICsgMSwgY3VycmVudF9yZXN1bHQsIGN1cnJlbnRfbGVuKTsKICAgICAgICAgICAgaWYgKHogPT0gLTEpIHsKICAgICAgICAgICAgICAgIGN1cnJlbnRfcmVzdWx0WzBdID0gJ2knOwogICAgICAgICAgICB9IGVsc2UgaWYgKHogPT0gMSkgewogICAgICAgICAgICAgICAgY3VycmVudF9yZXN1bHRbMF0gPSAnMSc7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoeiA9PSAwKSB7CiAgICAgICAgICAgICAgICBjdXJyZW50X3Jlc3VsdFswXSA9ICcwJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjdXJyZW50X2xlbisrOwogICAgICAgIH0KCiAgICAgICAgeSA9IHggLyAzOwogIC8vICAgICAgeSA9IHkgKiByOwogICAgICAgIHkgKz0gZzsKCiAgICAgICAgai0tOwogICAgfQoKICAgIHJlc3VsdFswXSA9ICdcMCc7ICAKICAgIHN0cm5jcHkocmVzdWx0LCBjdXJyZW50X3Jlc3VsdCwgY3VycmVudF9sZW4pOwogICAgcmVzdWx0W2N1cnJlbnRfbGVuXSA9ICdcMCc7CgogICAgcmV0dXJuIHJlc3VsdDsKfQoKY2hhciogYmluYXJ5X2FuZChjaGFyIG1hdHJpeFtdW01BWF9MRU5HVEhdLCBpbnQgcm93cykgewogICAgc3RhdGljIGNoYXIgZmluYWxfcmVzdWx0W01BWF9MRU5HVEhdOyAvLyDQodGC0LDRgtC40YfQtdGB0LrQuNC5INC80LDRgdGB0LjQsiDQtNC70Y8g0YXRgNCw0L3QtdC90LjRjyDRgNC10LfRg9C70YzRgtCw0YLQsAogICAgaW50IHJlc3VsdF9pbmRleCA9IDA7ICAvLyDQmNC90LTQtdC60YEg0LTQu9GPINC30LDQv9C40YHQuCDQsiBmaW5hbF9yZXN1bHQKCiAgICBpbnQgY29sdW1ucyA9IHN0cmxlbihtYXRyaXhbMF0pOyAgLy8g0JrQvtC70LjRh9C10YHRgtCy0L4g0YHRgtC+0LvQsdGG0L7Qsiwg0L/RgNC10LTQv9C+0LvQsNCz0LDQtdC8IE1BWF9MRU5HVEgKICAgIHByaW50ZigiXG5Db2x1bW5zOiAlZFxuIiwgY29sdW1ucyk7CiAgICBwcmludGYoIlJvd3M6ICVkXG4iLCByb3dzKTsgCgogICAgcHJpbnRmKCJcbtCf0L7Qu9GD0YfQtdC90L3QsNGPINC80LDRgtGA0LjRhtCwOlxuIik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgewogICAgICAgIHByaW50ZigiJXNcbiIsIG1hdHJpeFtpXSk7CiAgICB9CiAgICAKICAgIC8vINCf0YDQvtGF0L7QtNC40Lwg0L/QviDQstGB0LXQvCDRgdGC0L7Qu9Cx0YbQsNC8CiAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHVtbnM7IGorKykgewogICAgICAgIC8vINCf0YDQvtCy0LXRgNGP0LXQvCwg0LXRgdGC0Ywg0LvQuCDQsiDRgdGC0L7Qu9Cx0YbQsNGFINGB0LjQvNCy0L7Qu9GLICdpJywgJzAnLCAnMScg0LjQu9C4ICcsJyDQuCDQvtCx0YDQsNCx0LDRgtGL0LLQsNC10Lwg0LjRhQogICAgICAgIGlmIChtYXRyaXhbMF1bal0gPT0gJ2knIHx8IG1hdHJpeFsxXVtqXSA9PSAnaScpIHsKICAgICAgICAgICAgZmluYWxfcmVzdWx0W3Jlc3VsdF9pbmRleCsrXSA9ICdpJzsKICAgICAgICB9IGVsc2UgaWYgKG1hdHJpeFswXVtqXSA9PSAnMCcgfHwgbWF0cml4WzFdW2pdID09ICcwJykgewogICAgICAgICAgICBmaW5hbF9yZXN1bHRbcmVzdWx0X2luZGV4KytdID0gJzAnOwogICAgICAgIH0gZWxzZSBpZiAobWF0cml4WzBdW2pdID09ICcxJyAmJiBtYXRyaXhbMV1bal0gPT0gJzEnKSB7CiAgICAgICAgICAgIGZpbmFsX3Jlc3VsdFtyZXN1bHRfaW5kZXgrK10gPSAnMSc7CiAgICAgICAgfSBlbHNlIGlmIChtYXRyaXhbMF1bal0gPT0gJywnIHx8IG1hdHJpeFswXVtqXSA9PSAnLicgfHwgbWF0cml4WzFdW2pdID09ICcsJyB8fCBtYXRyaXhbMV1bal0gPT0gJy4nKSB7CiAgICAgICAgICAgIGZpbmFsX3Jlc3VsdFtyZXN1bHRfaW5kZXgrK10gPSAnLCc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZmluYWxfcmVzdWx0W3Jlc3VsdF9pbmRleCsrXSA9ICcwJzsKICAgICAgICB9CiAgICB9CgogICAgZmluYWxfcmVzdWx0W3Jlc3VsdF9pbmRleF0gPSAnXDAnOyAgLy8g0JfQsNCy0LXRgNGI0LDQtdC8INGB0YLRgNC+0LrRgwogICAgcmV0dXJuIGZpbmFsX3Jlc3VsdDsgIC8vINCS0L7Qt9Cy0YDQsNGJ0LDQtdC8INGA0LXQt9GD0LvRjNGC0LDRggp9CgpjaGFyKiBiaW5hcnlfb3IoY2hhciBtYXRyaXhbXVtNQVhfTEVOR1RIXSwgaW50IHJvd3MpIHsKICAgIHN0YXRpYyBjaGFyIGZpbmFsX3Jlc3VsdFtNQVhfTEVOR1RIXTsgLy8g0KHRgtCw0YLQuNGH0LXRgdC60LjQuSDQvNCw0YHRgdC40LIg0LTQu9GPINGF0YDQsNC90LXQvdC40Y8g0YDQtdC30YPQu9GM0YLQsNGC0LAKICAgIGludCByZXN1bHRfaW5kZXggPSAwOyAgLy8g0JjQvdC00LXQutGBINC00LvRjyDQt9Cw0L/QuNGB0Lgg0LIgZmluYWxfcmVzdWx0CgogICAgaW50IGNvbHVtbnMgPSBzdHJsZW4obWF0cml4WzBdKTsgIC8vINCa0L7Qu9C40YfQtdGB0YLQstC+INGB0YLQvtC70LHRhtC+0LIsINC/0YDQtdC00L/QvtC70LDQs9Cw0LXQvCBNQVhfTEVOR1RICiAgICBwcmludGYoIlxuQ29sdW1uczogJWRcbiIsIGNvbHVtbnMpOwogICAgcHJpbnRmKCJSb3dzOiAlZFxuIiwgcm93cyk7CiAgICAKICAgIHByaW50ZigiXG7Qn9C+0LvRg9GH0LXQvdC90LDRjyDQvNCw0YLRgNC40YbQsDpcbiIpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKICAgICAgICBwcmludGYoIiVzXG4iLCBtYXRyaXhbaV0pOwogICAgfQogICAgLy8g0J/RgNC10L7QsdGA0LDQt9C+0LLQsNC90LjQtSDQt9C90LDRh9C10L3QuNC5INCyINGE0LjQvdCw0LvRjNC90YPRjiDRgdGC0YDQvtC60YMg0L/QviDQu9C+0LPQuNC60LUgT1IKICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29sdW1uczsgaisrKSB7CiAgICAgICAgaWYgKG1hdHJpeFswXVtqXSA9PSAnMScgfHwgbWF0cml4WzFdW2pdID09ICcxJykgewogICAgICAgICAgICBmaW5hbF9yZXN1bHRbcmVzdWx0X2luZGV4KytdID0gJzEnOyAgCiAgICAgICAgfSBlbHNlIGlmIChtYXRyaXhbMF1bal0gPT0gJzAnIHx8IG1hdHJpeFsxXVtqXSA9PSAnMCcpIHsKICAgICAgICAgICAgZmluYWxfcmVzdWx0W3Jlc3VsdF9pbmRleCsrXSA9ICcwJzsgCiAgICAgICAgfSBlbHNlIGlmIChtYXRyaXhbMF1bal0gPT0gJ2knICYmIG1hdHJpeFsxXVtqXSA9PSAnaScpIHsKICAgICAgICAgICAgZmluYWxfcmVzdWx0W3Jlc3VsdF9pbmRleCsrXSA9ICdpJzsgIAogICAgICAgIH0gZWxzZSBpZiAobWF0cml4WzBdW2pdID09ICcsJyB8fCBtYXRyaXhbMF1bal0gPT0gJy4nIHx8IG1hdHJpeFsxXVtqXSA9PSAnLCcgfHwgbWF0cml4WzFdW2pdID09ICcuJykgewogICAgICAgICAgICBmaW5hbF9yZXN1bHRbcmVzdWx0X2luZGV4KytdID0gJywnOyAgCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZmluYWxfcmVzdWx0W3Jlc3VsdF9pbmRleCsrXSA9ICcwJzsKICAgICAgICB9CiAgICB9CgogICAgZmluYWxfcmVzdWx0W3Jlc3VsdF9pbmRleF0gPSAnXDAnOyAgLy8g0JfQsNCy0LXRgNGI0LDQtdC8INGB0YLRgNC+0LrRgwogICAgcmV0dXJuIGZpbmFsX3Jlc3VsdDsKfQoKCnZvaWQgcmF0aW9uaW5nKGNoYXIgaW5wdXQxW10sIGNoYXIgaW5wdXQyW10sIGludCBjaG9pY2UpIHsKICAgIGludCBuMSA9IHN0cmxlbihpbnB1dDEpOwogICAgaW50IG4yID0gc3RybGVuKGlucHV0Mik7CgogICAgY2hhciogY29tbWExX3BvcyA9IHN0cnBicmsoaW5wdXQxLCAiLC4iKTsKICAgIGNoYXIqIGNvbW1hMl9wb3MgPSBzdHJwYnJrKGlucHV0MiwgIiwuIik7CgogICAgaWYgKGNvbW1hMV9wb3MpIHsKICAgICAgICBuMSA9IGNvbW1hMV9wb3MgLSBpbnB1dDE7ICAKICAgIH0KCiAgICBpZiAoY29tbWEyX3BvcykgewogICAgICAgIG4yID0gY29tbWEyX3BvcyAtIGlucHV0MjsgIAogICAgfQoKICAgIGludCBhMSA9IHN0cmxlbihpbnB1dDEpOwogICAgaW50IGEyID0gc3RybGVuKGlucHV0Mik7CgogICAgaWYgKG4xIDwgbjIpIHsKICAgICAgICBhMSArPSAobjIgLSBuMSk7CiAgICB9CgogICAgaWYgKG4yIDwgbjEpIHsKICAgICAgICBhMiArPSAobjEgLSBuMik7CiAgICB9CgogICAgaW50IG1heF9hID0gKGExID4gYTIpID8gYTEgOiBhMjsKICAgIGludCBuID0gMjsgIAoKICAgIGNoYXIgbWF0cml4WzJdW01BWF9MRU5HVEhdOwogICAgbWVtc2V0KG1hdHJpeCwgJzAnLCBzaXplb2YobWF0cml4KSk7ICAKICAgIG1hdHJpeFswXVttYXhfYV0gPSAnXDAnOyAgCiAgICBtYXRyaXhbMV1bbWF4X2FdID0gJ1wwJzsKCiAgICBpbnQgc3RhcnRfaWR4MSA9IChuMSA8IG4yKSA/IG4yIC0gbjEgOiAwOwogICAgbWVtY3B5KG1hdHJpeFswXSArIHN0YXJ0X2lkeDEsIGlucHV0MSwgc3RybGVuKGlucHV0MSkpOyAKCiAgICBpbnQgc3RhcnRfaWR4MiA9IChuMiA8IG4xKSA/IG4xIC0gbjIgOiAwOwogICAgbWVtY3B5KG1hdHJpeFsxXSArIHN0YXJ0X2lkeDIsIGlucHV0Miwgc3RybGVuKGlucHV0MikpOwoKICAgIAogICAgaWYgKGNob2ljZSA9PSA2KSB7CiAgICAgICAgY2hhciogcmVzdWx0ID0gYmluYXJ5X2FuZChtYXRyaXgsIG4pOwogICAgICAgIHByaW50ZigiXG7QoNC10LfRg9C70YzRgtCw0YI6ICVzXG4iLCByZXN1bHQpOwogICAgfQogICAgZWxzZSBpZiAoY2hvaWNlID09IDcpIHsKICAgICAgICBjaGFyKiByZXN1bHQgPSBiaW5hcnlfb3IobWF0cml4LCBuKTsKICAgICAgICBwcmludGYoIlxu0KDQtdC30YPQu9GM0YLQsNGCOiAlc1xuIiwgcmVzdWx0KTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGNoYXIqIHJlc3VsdCA9IGFkZGl0aW9uKG1hdHJpeCwgbik7CiAgICAgICAgcHJpbnRmKCJcbtCg0LXQt9GD0LvRjNGC0LDRgjogJXNcbiIsIHJlc3VsdCk7CiAgICB9Cn0KCiB2b2lkIHJlbW92ZUNoYXIoY2hhciogc3RyKSB7CiAgICAgICAgY2hhciogcG9zID0gc3RycGJyayhzdHIsICIsLiIpOwogICAgICAgIGlmIChwb3MpIHsKICAgICAgICAgICAgbWVtbW92ZShwb3MsIHBvcyArIDEsIHN0cmxlbihwb3MpKTsKICAgICAgICB9CiAgICB9Cgp2b2lkIG11bHRpcGxpY2F0aW9uKGNoYXIgaW5wdXQxW10sIGNoYXIgaW5wdXQyW10pIHsKICAgIGNoYXIgdGVtcFtNQVhfTEVOR1RIXTsKICAgIGNoYXIqIGNvbW1hMV9wb3MgPSBzdHJwYnJrKGlucHV0MSwgIiwuIik7CiAgICBjaGFyKiBjb21tYTJfcG9zID0gc3RycGJyayhpbnB1dDIsICIsLiIpOwoKICAgIGludCBsZW4xID0gc3RybGVuKGlucHV0MSk7CiAgICBpbnQgbGVuMiA9IHN0cmxlbihpbnB1dDIpOwogICAgCiAgICBpbnQgaW5kZXgxID0gY29tbWExX3BvcyA/IChpbnQpKGNvbW1hMV9wb3MgLSBpbnB1dDEpICsgMSA6IGxlbjE7CiAgICBpbnQgaW5kZXgyID0gY29tbWEyX3BvcyA/IChpbnQpKGNvbW1hMl9wb3MgLSBpbnB1dDIpICsgMSA6IGxlbjI7CiAgICAKICAgIGludCBuID0gKGxlbjEgLSBpbmRleDEpICsgKGxlbjIgLSBpbmRleDIpOwogICAgCiAgCiAgICByZW1vdmVDaGFyKGlucHV0MSk7CiAgICByZW1vdmVDaGFyKGlucHV0Mik7CiAgICAKICAgIGxlbjEgPSBzdHJsZW4oaW5wdXQxKTsKICAgIGxlbjIgPSBzdHJsZW4oaW5wdXQyKTsKICAgIAogICAgaWYgKGxlbjIgPiBsZW4xKSB7CiAgICAgICAgc3RyY3B5KHRlbXAsIGlucHV0Mik7CiAgICAgICAgc3RyY3B5KGlucHV0MiwgaW5wdXQxKTsKICAgICAgICBzdHJjcHkoaW5wdXQxLCB0ZW1wKTsKICAgICAgICBpbnQgdGVtcGxlbiA9IGxlbjI7CiAgICAgICAgbGVuMiA9IGxlbjE7CiAgICAgICAgbGVuMSA9IHRlbXBsZW47CiAgICB9IGVsc2UgewogICAgICAgIHN0cmNweSh0ZW1wLCBpbnB1dDEpOwogICAgfQogICAgaW52ZXJ0U3ltbWV0cnkodGVtcCk7CiAgICAKICAgIGNoYXIgbWF0cml4W2xlbjJdW01BWF9MRU5HVEhdOwogICAgbWVtc2V0KG1hdHJpeCwgJzAnLCBzaXplb2YobWF0cml4KSk7IAoKICAgIGludCBsZW49bGVuMS1sZW4yOwppbnQgcyA9IGxlbjIgLSAxOyAKZm9yIChpbnQgaSA9IDA7IGkgPCBsZW4yOyBpKyspIHsKICAgIGlmIChpbnB1dDJbaV0gPT0gJzEnKSB7CiAgICAgICAgbWVtY3B5KG1hdHJpeFtzXSArIChsZW4yIC0gMSAtIHMpLCBpbnB1dDEsIE1BWF9MRU5HVEggLSAobGVuMiAtIDEgLSBzKSk7CiAgICB9CiAgICBlbHNlIGlmIChpbnB1dDJbaV0gPT0gJ2knKSB7CiAgICAgICAgbWVtY3B5KG1hdHJpeFtzXSArIChsZW4yIC0gMSAtIHMpLCB0ZW1wLCBNQVhfTEVOR1RIIC0gKGxlbjIgLSAxIC0gcykpOwogICAgfQogICAgZWxzZSBpZiAoaW5wdXQyW2ldID09ICcwJykgeyBtYXRyaXhbc11bbGVuMStsZW4yLTFdID0gJ1wwJzt9CiAgICBzLS07Cn0KLyoKICAgIC8vINCS0YvQstC+0LTQuNC8INGA0LXQt9GD0LvRjNGC0LDRggogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW4yOyBpKyspIHsKICAgICAgICAvLyDQlNC+0LHQsNCy0LvRj9C10Lwg0YHQuNC80LLQvtC70YsgJy8nINC00LvRjyDQv9GD0YHRgtGL0YUg0LzQtdGB0YIKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgICAgIGlmIChtYXRyaXhbaV1bal0gPT0gJ1wwJykgewogICAgICAgICAgICAgICAgLy9tYXRyaXhbaV1bal0gPSAnICc7ICAvLyDQl9Cw0L/QvtC70L3Rj9C10Lwg0L/Rg9GB0YLRi9C1INC80LXRgdGC0LAKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwcmludGYoIm1hdHJpeFslZF06ICVzXG4iLCBpLCBtYXRyaXhbaV0pOwogICAgfQoKICAgIAogICAgLy8g0JLRi9Cy0L7QtCDRgNC10LfRg9C70YzRgtCw0YLQvtCyCiAgICAvKnByaW50Zigi0JfQvdCw0YfQtdC90LjQtSBuOiAlZFxuIiwgbik7CiAgICBwcmludGYoItCf0LXRgNCy0LDRjyDRgdGC0YDQvtC60LAg0L/QvtGB0LvQtSDRg9C00LDQu9C10L3QuNGPOiAlc1xuIiwgaW5wdXQxKTsKICAgIHByaW50Zigi0JLRgtC+0YDQsNGPINGB0YLRgNC+0LrQsCDQv9C+0YHQu9C1INGD0LTQsNC70LXQvdC40Y86ICVzXG4iLCBpbnB1dDIpOwogICAgcHJpbnRmKCLQn9C10YDQstCw0Y8g0YHRgtGA0L7QutCwINC/0L7RgdC70LUg0LjQvdCy0LXRgNGB0LjQuDogJXNcbiIsIHRlbXApOwogICAgcHJpbnRmKCLQlNC70LjQvdCwINC/0LXRgNCy0L7QuSDRgdGC0YDQvtC60Lgg0L/QvtGB0LvQtSDRg9C00LDQu9C10L3QuNGPOiAlZFxuIiwgbGVuMSk7CiAgICBwcmludGYoItCU0LvQuNC90LAg0LLRgtC+0YDQvtC5INGB0YLRgNC+0LrQuCDQv9C+0YHQu9C1INGD0LTQsNC70LXQvdC40Y86ICVkXG4iLCBsZW4yKTsqLwogICAgCiAgICBjaGFyKiByZXN1bHQgPSBhZGRpdGlvbihtYXRyaXgsIGxlbjIpOwogICAgbj1zdHJsZW4ocmVzdWx0KS1uOwogICAgaWYgKG4+MCAmJiBuIT0obGVuMStsZW4yKSl7CiAgICBtZW1tb3ZlKHJlc3VsdCArIG4gKyAxLCByZXN1bHQgKyBuLCBzdHJsZW4ocmVzdWx0KSAtIG4gKyAxKTsKICAgIHJlc3VsdFtuXSA9ICcsJzt9CiAgICBwcmludGYoIlxu0KDQtdC30YPQu9GM0YLQsNGCINGC0YDQtdGC0YzQtdC5INGE0YPQvdC60YbQuNC4OiAlc1xuIiwgcmVzdWx0KTsKICAgIAp9Cgp2b2lkIHRocmVlVG9UZW4oKSB7CiAgICBjaGFyIGlucHV0W01BWF9MRU5HVEhdOwoKICAgIHByaW50ZigiXG5FbnRlciBhIHN0cmluZzogIik7CiAgICByZWFkX2lucHV0KGlucHV0LCBNQVhfTEVOR1RIKTsKCiAgICBjaGFyICpkZWxpbWl0ZXIgPSBzdHJwYnJrKGlucHV0LCAiLiwiKTsKICAgIGludCBuID0gKGRlbGltaXRlcikgPyAoZGVsaW1pdGVyIC0gaW5wdXQgLSAxKSA6IChzdHJsZW4oaW5wdXQpIC0gMSk7CiAgICAKICAgIGxvbmcgZG91YmxlIHJlc3VsdCA9IDA7IC8vINCX0LDQvNGW0L3QtdC90L4gZG91YmxlINC90LAgbG9uZyBkb3VibGUKCiAgICBmb3IgKGludCBpID0gMDsgaW5wdXRbaV0gIT0gJ1wwJzsgaSsrKSB7CiAgICAgICAgaWYgKGlucHV0W2ldID09ICcuJyB8fCBpbnB1dFtpXSA9PSAnLCcpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfSBlbHNlIGlmIChpbnB1dFtpXSA9PSAnaScpIHsKICAgICAgICAgICAgcmVzdWx0ICs9IC0xICogcG93bCgzLCBuKTsgLy8g0JLQuNC60L7RgNC40YHRgtC+0LLRg9GU0LzQviBwb3dsINC00LvRjyBsb25nIGRvdWJsZQogICAgICAgIH0gZWxzZSBpZiAoaXNkaWdpdChpbnB1dFtpXSkpIHsKICAgICAgICAgICAgcmVzdWx0ICs9IChpbnB1dFtpXSAtICcwJykgKiBwb3dsKDMsIG4pOyAvLyDQktC40LrQvtGA0LjRgdGC0L7QstGD0ZTQvNC+IHBvd2wg0LTQu9GPIGxvbmcgZG91YmxlCiAgICAgICAgfQogICAgICAgIG4tLTsKICAgIH0KICAgIHByaW50ZigiRGVjaW1hbCB2YWx1ZTogJS4xMExmXG4iLCByZXN1bHQpOyAvLyDQktC40LrQvtGA0LjRgdGC0L7QstGD0ZTQvNC+ICVMZiDQtNC70Y8gbG9uZyBkb3VibGUKfQoKdm9pZCBzeW1tZXRyeShjb25zdCBjaGFyICppbnB1dCwgaW50IGlzTmVnYXRpdmUpIHsKICAgIHByaW50ZigiTm9uLXN5bW1ldHJpY2FsIHJlc3VsdDogJXNcbiIsIGlucHV0KTsKICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oaW5wdXQpOwogICAgY2hhciByZXN1bHRbTUFYX0xFTkdUSF0gPSAiIjsKICAgIGludCB4ID0gMCwgeSA9IDAsIHogPSAwOwoKICAgIGZvciAoaW50IGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSkgewogICAgICAgIGlmIChpbnB1dFtpXSA9PSAnLCcpIHsKICAgICAgICAgICAgbWVtbW92ZShyZXN1bHQgKyAxLCByZXN1bHQsIHN0cmxlbihyZXN1bHQpICsgMSk7CiAgICAgICAgICAgIHJlc3VsdFswXSA9ICcsJzsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICB4ID0gaW5wdXRbaV0gLSAnMCc7IAogICAgICAgIHogPSB5ICsgeDsKCiAgICAgICAgaWYgKHogPD0gMSkgewogICAgICAgICAgICBtZW1tb3ZlKHJlc3VsdCArIDEsIHJlc3VsdCwgc3RybGVuKHJlc3VsdCkgKyAxKTsKICAgICAgICAgICAgcmVzdWx0WzBdID0geiArICcwJzsKICAgICAgICAgICAgeSA9IDA7CiAgICAgICAgfSBlbHNlIGlmICh6ID09IDIpIHsKICAgICAgICAgICAgbWVtbW92ZShyZXN1bHQgKyAxLCByZXN1bHQsIHN0cmxlbihyZXN1bHQpICsgMSk7CiAgICAgICAgICAgIHJlc3VsdFswXSA9ICdpJzsKICAgICAgICAgICAgeSA9IDE7CiAgICAgICAgfSBlbHNlIGlmICh6ID09IDMpIHsKICAgICAgICAgICAgbWVtbW92ZShyZXN1bHQgKyAxLCByZXN1bHQsIHN0cmxlbihyZXN1bHQpICsgMSk7CiAgICAgICAgICAgIHJlc3VsdFswXSA9ICcwJzsKICAgICAgICAgICAgeSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIGlmICh5ICE9IDApIHsKICAgICAgICBtZW1tb3ZlKHJlc3VsdCArIDEsIHJlc3VsdCwgc3RybGVuKHJlc3VsdCkgKyAxKTsKICAgICAgICByZXN1bHRbMF0gPSB5ICsgJzAnOwogICAgfQoKICAgIGlmIChpc05lZ2F0aXZlKSB7CiAgICAgICAgaW52ZXJ0U3ltbWV0cnkocmVzdWx0KTsKICAgIH0KCiAgICBwcmludGYoIlN5bW1ldHJpY2FsIHJlc3VsdDogJXNcbiIsIHJlc3VsdCk7Cn0KCnZvaWQgd2hvbGVfcGFydChjaGFyICpwYXJ0KSB7CiAgICBsb25nIGxvbmcgbnVtYmVyID0gc3RydG9sbChwYXJ0LCBOVUxMLCAxMCk7CgogICAgaWYgKG51bWJlciA9PSAwKSB7CiAgICAgICAgcGFydFswXSA9ICcwJzsKICAgICAgICBwYXJ0WzFdID0gJ1wwJzsKICAgIH0gZWxzZSB7CiAgICAgICAgY2hhciBidWZmZXJbMl07CiAgICAgICAgcGFydFswXSA9ICdcMCc7IAoKICAgICAgICB3aGlsZSAobnVtYmVyID4gMCkgewogICAgICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiVkIiwgbnVtYmVyICUgMyk7CiAgICAgICAgICAgIG1lbW1vdmUocGFydCArIDEsIHBhcnQsIHN0cmxlbihwYXJ0KSArIDEpOwogICAgICAgICAgICBwYXJ0WzBdID0gYnVmZmVyWzBdOyAKICAgICAgICAgICAgbnVtYmVyIC89IDM7CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIGZyYWN0aW9uX3BhcnQoY2hhciAqcGFydCkgewogICAgZG91YmxlIGZyYWN0aW9uYWxWYWx1ZSA9IGF0b2YocGFydCkgLyBwb3coMTAsIHN0cmxlbihwYXJ0KSk7CiAgICBjaGFyIGJ1ZmZlclsyXTsKICAgIHBhcnRbMF0gPSAnXDAnOyAKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IDE1OyBpKyspIHsKICAgICAgICBmcmFjdGlvbmFsVmFsdWUgKj0gMzsKICAgICAgICBpbnQgZGlnaXQgPSAoaW50KWZyYWN0aW9uYWxWYWx1ZTsKICAgICAgICBmcmFjdGlvbmFsVmFsdWUgLT0gZGlnaXQ7CiAgICAgICAgc3ByaW50ZihidWZmZXIsICIlZCIsIGRpZ2l0KTsKICAgICAgICBzdHJjYXQocGFydCwgYnVmZmVyKTsgCiAgICB9Cn0KCnZvaWQgdHJhbnNsYXRpb24oKSB7CiAgICBjaGFyIGlucHV0W01BWF9MRU5HVEhdOwogICAgY2hhciBmaXJzdFBhcnRbTUFYX0xFTkdUSC8yXSA9ICIiOwogICAgY2hhciBzZWNvbmRQYXJ0W01BWF9MRU5HVEgvMl0gPSAiIjsKICAgIGludCBpc05lZ2F0aXZlID0gMDsKCiAgICBwcmludGYoIlxuRW50ZXIgYSBzdHJpbmc6ICIpOwogICAgcmVhZF9pbnB1dChpbnB1dCwgTUFYX0xFTkdUSCk7CgogICAgaWYgKHN0cmNocihpbnB1dCwgJy0nKSAhPSBOVUxMKSB7CiAgICAgICAgaXNOZWdhdGl2ZSA9IDE7CiAgICAgICAgbWVtbW92ZShpbnB1dCwgaW5wdXQgKyAxLCBzdHJsZW4oaW5wdXQpKTsgCiAgICB9CgogICAgY2hhciAqZGVsaW1pdGVyID0gc3RycGJyayhpbnB1dCwgIi4sIik7CgogICAgaWYgKGRlbGltaXRlcikgewogICAgICAgIHNpemVfdCBmaXJzdExlbiA9IGRlbGltaXRlciAtIGlucHV0OwogICAgICAgIHN0cm5jcHkoZmlyc3RQYXJ0LCBpbnB1dCwgZmlyc3RMZW4pOwogICAgICAgIGZpcnN0UGFydFtmaXJzdExlbl0gPSAnXDAnOwoKICAgICAgICBzdHJjcHkoc2Vjb25kUGFydCwgZGVsaW1pdGVyICsgMSk7CiAgICB9IGVsc2UgewogICAgICAgIHN0cmNweShmaXJzdFBhcnQsIGlucHV0KTsKICAgIH0KCiAgICB3aG9sZV9wYXJ0KGZpcnN0UGFydCk7CiAgICBpZiAoc3RybGVuKHNlY29uZFBhcnQpID4gMCkgewogICAgICAgIGZyYWN0aW9uX3BhcnQoc2Vjb25kUGFydCk7CiAgICB9IGVsc2UgewogICAgICAgIHN0cmNweShzZWNvbmRQYXJ0LCAiMCIpOyAKICAgIH0KCiAgICBjaGFyIGNvbWJpbmVkW01BWF9MRU5HVEhdID0gIiI7CiAgICBzbnByaW50Zihjb21iaW5lZCwgc2l6ZW9mKGNvbWJpbmVkKSwgIiVzLCVzIiwgZmlyc3RQYXJ0LCBzZWNvbmRQYXJ0KTsKCiAgICBzeW1tZXRyeShjb21iaW5lZCwgaXNOZWdhdGl2ZSk7Cn0KCmludCBtYWluKCkgewogICAgaW50IGNob2ljZTsKICAgIGNoYXIgaW5wdXQxW01BWF9MRU5HVEhdLCBpbnB1dDJbTUFYX0xFTkdUSF07CiAgICBpbnQgbjsgIC8vINCg0LDQt9C80LXRgCDQvNCw0YLRgNC40YbRiwoKICAgIGludCBtYXRyaXhbTUFYX0xFTkdUSF1bTUFYX0xFTkdUSF07ICAvLyDQnNCw0YLRgNC40YbQsCDQv9GA0L7QuNC30LLQvtC70YzQvdC+0LPQviDRgNCw0LfQvNC10YDQsAoKICAgIGRvIHsKICAgICAgICBwcmludGYoIlxu0JzQtdC90Y46XG4iKTsKICAgICAgICBwcmludGYoIjEuINCSINGC0YDRltC50LrQvtCy0YMg0YHQuNC80LXRgtGA0LjRh9C90YNcbiIpOwogICAgICAgIHByaW50ZigiMi4g0JIg0LTQtdGB0Y/RgtC40YfQvdGDXG4iKTsKICAgICAgICBwcmludGYoIjMuINCh0YPQvNCwXG4iKTsKICAgICAgICBwcmludGYoIjQuINCg0ZbQt9C90LjRhtGPXG4iKTsKICAgICAgICBwcmludGYoIjUuINCc0L3QvtC20LXQvdC90Y9cbiIpOwogICAgICAgIHByaW50ZigiNi4gQU5EXG4iKTsKICAgICAgICBwcmludGYoIjcuIE9SXG4iKTsKICAgICAgICBwcmludGYoIjAuINCS0LjRhdGW0LRcbiIpOwogICAgICAgIHByaW50Zigi0JLQstC10LTRltGC0Ywg0LLQsNGIINCy0LjQsdGW0YA6ICIpOwoKICAgICAgICBpZiAoc2NhbmYoIiVkIiwgJmNob2ljZSkgIT0gMSkgewogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgItCd0LXQstC10YDQvdGL0Lkg0LLQstC+0LQuINCS0YvRhdC+0LQuXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICB3aGlsZSAoZ2V0Y2hhcigpICE9ICdcbicpOyAvLyDQntC20LjQtNCw0LXQvCDQstCy0L7QtNCwCgogICAgICAgIHN3aXRjaCAoY2hvaWNlKSB7CiAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uKCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgdGhyZWVUb1RlbigpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMzoKICAgIHByaW50Zigi0JLQstC10LTQuNGC0LUg0L/QtdGA0LLRg9GOINGB0YLRgNC+0LrRgzogIik7CiAgICByZWFkX2lucHV0KGlucHV0MSwgTUFYX0xFTkdUSCk7ICAKICAgIHByaW50Zigi0JLQstC10LTQuNGC0LUg0LLRgtC+0YDRg9GOINGB0YLRgNC+0LrRgzogIik7CiAgICByZWFkX2lucHV0KGlucHV0MiwgTUFYX0xFTkdUSCk7ICAKICAgIHJhdGlvbmluZyhpbnB1dDEsIGlucHV0MiwgY2hvaWNlKTsgCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSA0OgogICAgcHJpbnRmKCLQktCy0LXQtNC40YLQtSDQv9C10YDQstGD0Y4g0YHRgtGA0L7QutGDOiAiKTsKICAgIHJlYWRfaW5wdXQoaW5wdXQxLCBNQVhfTEVOR1RIKTsgIAogICAgcHJpbnRmKCLQktCy0LXQtNC40YLQtSDQstGC0L7RgNGD0Y4g0YHRgtGA0L7QutGDOiAiKTsKICAgIHJlYWRfaW5wdXQoaW5wdXQyLCBNQVhfTEVOR1RIKTsKICAgIGludmVydFN5bW1ldHJ5KGlucHV0Mik7CiAgICByYXRpb25pbmcoaW5wdXQxLCBpbnB1dDIsIGNob2ljZSk7IAogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgNToKICAgIHByaW50Zigi0JLQstC10LTQuNGC0LUg0L/QtdGA0LLRg9GOINGB0YLRgNC+0LrRgzogIik7CiAgICByZWFkX2lucHV0KGlucHV0MSwgTUFYX0xFTkdUSCk7ICAKICAgIHByaW50Zigi0JLQstC10LTQuNGC0LUg0LLRgtC+0YDRg9GOINGB0YLRgNC+0LrRgzogIik7CiAgICByZWFkX2lucHV0KGlucHV0MiwgTUFYX0xFTkdUSCk7ICAKICAgIG11bHRpcGxpY2F0aW9uKGlucHV0MSwgaW5wdXQyKTsgIAogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgNjogLy9PUgogICAgcHJpbnRmKCLQktCy0LXQtNC40YLQtSDQv9C10YDQstGD0Y4g0YHRgtGA0L7QutGDOiAiKTsKICAgIHJlYWRfaW5wdXQoaW5wdXQxLCBNQVhfTEVOR1RIKTsgIAogICAgcHJpbnRmKCLQktCy0LXQtNC40YLQtSDQstGC0L7RgNGD0Y4g0YHRgtGA0L7QutGDOiAiKTsKICAgIHJlYWRfaW5wdXQoaW5wdXQyLCBNQVhfTEVOR1RIKTsKICAgIHJhdGlvbmluZyhpbnB1dDEsIGlucHV0MiwgY2hvaWNlKTsgCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgY2FzZSA3OiAvL0FORAogICAgcHJpbnRmKCLQktCy0LXQtNC40YLQtSDQv9C10YDQstGD0Y4g0YHRgtGA0L7QutGDOiAiKTsKICAgIHJlYWRfaW5wdXQoaW5wdXQxLCBNQVhfTEVOR1RIKTsgIAogICAgcHJpbnRmKCLQktCy0LXQtNC40YLQtSDQstGC0L7RgNGD0Y4g0YHRgtGA0L7QutGDOiAiKTsKICAgIHJlYWRfaW5wdXQoaW5wdXQyLCBNQVhfTEVOR1RIKTsKICAgIHJhdGlvbmluZyhpbnB1dDEsIGlucHV0MiwgY2hvaWNlKTsgCiAgICAgICAgICAgICAgICBicmVhazsgCiAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIHByaW50Zigi0JLRi9GF0L7QtCDQuNC3INC/0YDQvtCz0YDQsNC80LzRiy5cbiIpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBwcmludGYoItCd0LXQstC10YDQvdGL0Lkg0LLRi9Cx0L7RgC4g0J/QvtC/0YDQvtCx0YPQudGC0LUg0YHQvdC+0LLQsC5cbiIpOwogICAgICAgIH0KICAgIH0gd2hpbGUgKGNob2ljZSAhPSAwKTsKICAgIHJldHVybiAwOwp9Cg==