section .data
; Определяем числа как строки (десятичные)
num1 db '12345', 0 ; Первое число (можно изменить)
num2 db '67890', 0 ; Второе число (можно изменить)
result times 20 db 0 ; Буфер для результата
N equ 5 ; Размер чисел в байтах (можно изменить)
; Сообщения
msg1 db 'First number: ', 0
msg2 db 'Second number: ', 0
msg3 db 'Sum: ', 0
newline db 13, 10, 0
section .bss
; Дополнительные переменные при необходимости
section .text
global _start
_start:
; Вывод первого числа
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
mov ecx, msg1
mov edx, 13 ; длина msg1
int 0x80
mov eax, 4
mov ebx, 1
mov ecx, num1
mov edx, N
int 0x80
mov eax, 4
mov ebx, 1
mov ecx, newline
mov edx, 2
int 0x80
; Вывод второго числа
mov eax, 4
mov ebx, 1
mov ecx, msg2
mov edx, 15 ; длина msg2
int 0x80
mov eax, 4
mov ebx, 1
mov ecx, num2
mov edx, N
int 0x80
mov eax, 4
mov ebx, 1
mov ecx, newline
mov edx, 2
int 0x80
; Сложение двух N-байтовых десятичных чисел
call add_decimal_numbers
; Вывод результата
mov eax, 4
mov ebx, 1
mov ecx, msg3
mov edx, 5 ; длина msg3
int 0x80
mov eax, 4
mov ebx, 1
mov ecx, result
; Нужно вычислить длину результата
mov edi, result
call strlen
mov edx, eax ; длина результата в edx
int 0x80
mov eax, 4
mov ebx, 1
mov ecx, newline
mov edx, 2
int 0x80
; Завершение программы
mov eax, 1 ; sys_exit
xor ebx, ebx ; код возврата 0
int 0x80
; Процедура сложения двух десятичных чисел
; Вход: num1, num2 - строки с десятичными числами
; Выход: result - строка с результатом
add_decimal_numbers:
pusha
; Подготовка
mov ecx, N
mov esi, num1
mov edi, num2
mov ebx, result
; Проверяем знаки чисел
mov al, [esi]
mov bl, [edi]
; Флаг знака результата (0 - положительный, 1 - отрицательный)
mov dh, 0
; Если оба числа положительные
cmp al, '-'
je check_second_sign
cmp bl, '-'
je check_second_sign
; Оба положительные
jmp prepare_addition
check_second_sign:
cmp al, '-'
jne first_positive_second_negative
cmp bl, '-'
jne first_negative_second_positive
; Оба отрицательные
mov dh, 1 ; Результат будет отрицательным
inc esi ; Пропускаем знак '-'
inc edi
dec ecx ; Уменьшаем счетчик
jmp prepare_addition
first_positive_second_negative:
; Первое положительное, второе отрицательное
inc edi ; Пропускаем знак у второго числа
call subtract_numbers
jmp process_result_sign
first_negative_second_positive:
; Первое отрицательное, второе положительное
inc esi ; Пропускаем знак у первого числа
xchg esi, edi ; Меняем местами, чтобы вычитать из второго
call subtract_numbers
jmp process_result_sign
prepare_addition:
; Подготовка к сложению
mov esi, num1
mov edi, num2
mov ebx, result
; Если были знаки, пропускаем их
cmp byte [esi], '-'
jne check_num2_sign
inc esi
check_num2_sign:
cmp byte [edi], '-'
jne start_addition
inc edi
start_addition:
; Начинаем сложение с младших разрядов
mov ecx, N
add esi, ecx
dec esi ; Указываем на последний символ
add edi, ecx
dec edi
add ebx, ecx
dec ebx
mov byte [ebx+1], 0 ; Конец строки
mov byte [ebx], 0 ; Инициализируем последний байт
clc ; Сброс флага переноса
addition_loop:
mov al, [esi]
sub al, '0' ; Преобразуем ASCII в число
mov ah, [edi]
sub ah, '0' ; Преобразуем ASCII в число
; Сложение с учетом предыдущего переноса
adc al, ah
; Проверка на переполнение (если сумма >= 10)
cmp al, 10
jb no_carry
sub al, 10
stc ; Устанавливаем флаг переноса
jmp store_digit
no_carry:
clc ; Сброс флага переноса
store_digit:
add al, '0' ; Преобразуем число в ASCII
mov [ebx], al
; Переход к следующему разряду
dec esi
dec edi
dec ebx
loop addition_loop
; Если остался перенос
jnc addition_done
; Добавляем старший разряд
mov byte [ebx], '1'
jmp addition_complete
addition_done:
mov byte [ebx], '0'
addition_complete:
; Если результат отрицательный, добавляем знак '-'
cmp dh, 1
jne process_result_sign
dec ebx
mov byte [ebx], '-'
process_result_sign:
; Копируем результат в начало буфера
mov esi, result
mov edi, result
; Пропускаем начальные нули
skip_zeros:
cmp byte [esi], '0'
jne copy_result
inc esi
jmp skip_zeros
copy_result:
; Копируем остаток
mov al, [esi]
mov [edi], al
inc esi
inc edi
test al, al
jnz copy_result
; Если все было нулями
mov esi, result
cmp byte [esi], 0
jne not_all_zeros
mov byte [esi], '0'
mov byte [esi+1], 0
not_all_zeros:
popa
ret
; Процедура вычитания (упрощенная версия)
; Вход: ESI - уменьшаемое, EDI - вычитаемое
subtract_numbers:
pusha
; Здесь должна быть реализация вычитания
; Для простоты возвращаем "0"
mov edi, result
mov byte [edi], '0'
mov byte [edi+1], 0
popa
ret
; Функция вычисления длины строки
; Вход: EDI - указатель на строку
; Выход: EAX - длина строки
strlen:
push ecx
push edi
xor ecx, ecx
not ecx
xor al, al
cld
repne scasb
not ecx
dec ecx
mov eax, ecx
pop edi
pop ecx
ret
c2VjdGlvbiAuZGF0YQogICAgOyDQntC/0YDQtdC00LXQu9GP0LXQvCDRh9C40YHQu9CwINC60LDQuiDRgdGC0YDQvtC60LggKNC00LXRgdGP0YLQuNGH0L3Ri9C1KQogICAgbnVtMSBkYiAnMTIzNDUnLCAwICAgICAgOyDQn9C10YDQstC+0LUg0YfQuNGB0LvQviAo0LzQvtC20L3QviDQuNC30LzQtdC90LjRgtGMKQogICAgbnVtMiBkYiAnNjc4OTAnLCAwICAgICAgOyDQktGC0L7RgNC+0LUg0YfQuNGB0LvQviAo0LzQvtC20L3QviDQuNC30LzQtdC90LjRgtGMKQogICAgcmVzdWx0IHRpbWVzIDIwIGRiIDAgICAgOyDQkdGD0YTQtdGAINC00LvRjyDRgNC10LfRg9C70YzRgtCw0YLQsAogICAgTiBlcXUgNSAgICAgICAgICAgICAgICAgOyDQoNCw0LfQvNC10YAg0YfQuNGB0LXQuyDQsiDQsdCw0LnRgtCw0YUgKNC80L7QttC90L4g0LjQt9C80LXQvdC40YLRjCkKICAgIAogICAgOyDQodC+0L7QsdGJ0LXQvdC40Y8KICAgIG1zZzEgZGIgJ0ZpcnN0IG51bWJlcjogJywgMAogICAgbXNnMiBkYiAnU2Vjb25kIG51bWJlcjogJywgMAogICAgbXNnMyBkYiAnU3VtOiAnLCAwCiAgICBuZXdsaW5lIGRiIDEzLCAxMCwgMAoKc2VjdGlvbiAuYnNzCiAgICA7INCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUg0L/QtdGA0LXQvNC10L3QvdGL0LUg0L/RgNC4INC90LXQvtCx0YXQvtC00LjQvNC+0YHRgtC4CgpzZWN0aW9uIC50ZXh0CiAgICBnbG9iYWwgX3N0YXJ0Cgpfc3RhcnQ6CiAgICA7INCS0YvQstC+0LQg0L/QtdGA0LLQvtCz0L4g0YfQuNGB0LvQsAogICAgbW92IGVheCwgNCAgICAgICAgICA7IHN5c193cml0ZQogICAgbW92IGVieCwgMSAgICAgICAgICA7IHN0ZG91dAogICAgbW92IGVjeCwgbXNnMQogICAgbW92IGVkeCwgMTMgICAgICAgICA7INC00LvQuNC90LAgbXNnMQogICAgaW50IDB4ODAKICAgIAogICAgbW92IGVheCwgNAogICAgbW92IGVieCwgMQogICAgbW92IGVjeCwgbnVtMQogICAgbW92IGVkeCwgTgogICAgaW50IDB4ODAKICAgIAogICAgbW92IGVheCwgNAogICAgbW92IGVieCwgMQogICAgbW92IGVjeCwgbmV3bGluZQogICAgbW92IGVkeCwgMgogICAgaW50IDB4ODAKICAgIAogICAgOyDQktGL0LLQvtC0INCy0YLQvtGA0L7Qs9C+INGH0LjRgdC70LAKICAgIG1vdiBlYXgsIDQKICAgIG1vdiBlYngsIDEKICAgIG1vdiBlY3gsIG1zZzIKICAgIG1vdiBlZHgsIDE1ICAgICAgICAgOyDQtNC70LjQvdCwIG1zZzIKICAgIGludCAweDgwCiAgICAKICAgIG1vdiBlYXgsIDQKICAgIG1vdiBlYngsIDEKICAgIG1vdiBlY3gsIG51bTIKICAgIG1vdiBlZHgsIE4KICAgIGludCAweDgwCiAgICAKICAgIG1vdiBlYXgsIDQKICAgIG1vdiBlYngsIDEKICAgIG1vdiBlY3gsIG5ld2xpbmUKICAgIG1vdiBlZHgsIDIKICAgIGludCAweDgwCiAgICAKICAgIDsg0KHQu9C+0LbQtdC90LjQtSDQtNCy0YPRhSBOLdCx0LDQudGC0L7QstGL0YUg0LTQtdGB0Y/RgtC40YfQvdGL0YUg0YfQuNGB0LXQuwogICAgY2FsbCBhZGRfZGVjaW1hbF9udW1iZXJzCiAgICAKICAgIDsg0JLRi9Cy0L7QtCDRgNC10LfRg9C70YzRgtCw0YLQsAogICAgbW92IGVheCwgNAogICAgbW92IGVieCwgMQogICAgbW92IGVjeCwgbXNnMwogICAgbW92IGVkeCwgNSAgICAgICAgICA7INC00LvQuNC90LAgbXNnMwogICAgaW50IDB4ODAKICAgIAogICAgbW92IGVheCwgNAogICAgbW92IGVieCwgMQogICAgbW92IGVjeCwgcmVzdWx0CiAgICA7INCd0YPQttC90L4g0LLRi9GH0LjRgdC70LjRgtGMINC00LvQuNC90YMg0YDQtdC30YPQu9GM0YLQsNGC0LAKICAgIG1vdiBlZGksIHJlc3VsdAogICAgY2FsbCBzdHJsZW4KICAgIG1vdiBlZHgsIGVheCAgICAgICAgOyDQtNC70LjQvdCwINGA0LXQt9GD0LvRjNGC0LDRgtCwINCyIGVkeAogICAgaW50IDB4ODAKICAgIAogICAgbW92IGVheCwgNAogICAgbW92IGVieCwgMQogICAgbW92IGVjeCwgbmV3bGluZQogICAgbW92IGVkeCwgMgogICAgaW50IDB4ODAKICAgIAogICAgOyDQl9Cw0LLQtdGA0YjQtdC90LjQtSDQv9GA0L7Qs9GA0LDQvNC80YsKICAgIG1vdiBlYXgsIDEgICAgICAgICAgOyBzeXNfZXhpdAogICAgeG9yIGVieCwgZWJ4ICAgICAgICA7INC60L7QtCDQstC+0LfQstGA0LDRgtCwIDAKICAgIGludCAweDgwCgo7INCf0YDQvtGG0LXQtNGD0YDQsCDRgdC70L7QttC10L3QuNGPINC00LLRg9GFINC00LXRgdGP0YLQuNGH0L3Ri9GFINGH0LjRgdC10LsKOyDQktGF0L7QtDogbnVtMSwgbnVtMiAtINGB0YLRgNC+0LrQuCDRgSDQtNC10YHRj9GC0LjRh9C90YvQvNC4INGH0LjRgdC70LDQvNC4Cjsg0JLRi9GF0L7QtDogcmVzdWx0IC0g0YHRgtGA0L7QutCwINGBINGA0LXQt9GD0LvRjNGC0LDRgtC+0LwKYWRkX2RlY2ltYWxfbnVtYmVyczoKICAgIHB1c2hhCiAgICAKICAgIDsg0J/QvtC00LPQvtGC0L7QstC60LAKICAgIG1vdiBlY3gsIE4KICAgIG1vdiBlc2ksIG51bTEKICAgIG1vdiBlZGksIG51bTIKICAgIG1vdiBlYngsIHJlc3VsdAogICAgCiAgICA7INCf0YDQvtCy0LXRgNGP0LXQvCDQt9C90LDQutC4INGH0LjRgdC10LsKICAgIG1vdiBhbCwgW2VzaV0KICAgIG1vdiBibCwgW2VkaV0KICAgIAogICAgOyDQpNC70LDQsyDQt9C90LDQutCwINGA0LXQt9GD0LvRjNGC0LDRgtCwICgwIC0g0L/QvtC70L7QttC40YLQtdC70YzQvdGL0LksIDEgLSDQvtGC0YDQuNGG0LDRgtC10LvRjNC90YvQuSkKICAgIG1vdiBkaCwgMAogICAgCiAgICA7INCV0YHQu9C4INC+0LHQsCDRh9C40YHQu9CwINC/0L7Qu9C+0LbQuNGC0LXQu9GM0L3Ri9C1CiAgICBjbXAgYWwsICctJwogICAgamUgY2hlY2tfc2Vjb25kX3NpZ24KICAgIGNtcCBibCwgJy0nCiAgICBqZSBjaGVja19zZWNvbmRfc2lnbgogICAgCiAgICA7INCe0LHQsCDQv9C+0LvQvtC20LjRgtC10LvRjNC90YvQtQogICAgam1wIHByZXBhcmVfYWRkaXRpb24KCmNoZWNrX3NlY29uZF9zaWduOgogICAgY21wIGFsLCAnLScKICAgIGpuZSBmaXJzdF9wb3NpdGl2ZV9zZWNvbmRfbmVnYXRpdmUKICAgIGNtcCBibCwgJy0nCiAgICBqbmUgZmlyc3RfbmVnYXRpdmVfc2Vjb25kX3Bvc2l0aXZlCiAgICAKICAgIDsg0J7QsdCwINC+0YLRgNC40YbQsNGC0LXQu9GM0L3Ri9C1CiAgICBtb3YgZGgsIDEgIDsg0KDQtdC30YPQu9GM0YLQsNGCINCx0YPQtNC10YIg0L7RgtGA0LjRhtCw0YLQtdC70YzQvdGL0LwKICAgIGluYyBlc2kgICAgOyDQn9GA0L7Qv9GD0YHQutCw0LXQvCDQt9C90LDQuiAnLScKICAgIGluYyBlZGkKICAgIGRlYyBlY3ggICAgOyDQo9C80LXQvdGM0YjQsNC10Lwg0YHRh9C10YLRh9C40LoKICAgIGptcCBwcmVwYXJlX2FkZGl0aW9uCgpmaXJzdF9wb3NpdGl2ZV9zZWNvbmRfbmVnYXRpdmU6CiAgICA7INCf0LXRgNCy0L7QtSDQv9C+0LvQvtC20LjRgtC10LvRjNC90L7QtSwg0LLRgtC+0YDQvtC1INC+0YLRgNC40YbQsNGC0LXQu9GM0L3QvtC1CiAgICBpbmMgZWRpICAgIDsg0J/RgNC+0L/Rg9GB0LrQsNC10Lwg0LfQvdCw0Log0YMg0LLRgtC+0YDQvtCz0L4g0YfQuNGB0LvQsAogICAgY2FsbCBzdWJ0cmFjdF9udW1iZXJzCiAgICBqbXAgcHJvY2Vzc19yZXN1bHRfc2lnbgoKZmlyc3RfbmVnYXRpdmVfc2Vjb25kX3Bvc2l0aXZlOgogICAgOyDQn9C10YDQstC+0LUg0L7RgtGA0LjRhtCw0YLQtdC70YzQvdC+0LUsINCy0YLQvtGA0L7QtSDQv9C+0LvQvtC20LjRgtC10LvRjNC90L7QtQogICAgaW5jIGVzaSAgICA7INCf0YDQvtC/0YPRgdC60LDQtdC8INC30L3QsNC6INGDINC/0LXRgNCy0L7Qs9C+INGH0LjRgdC70LAKICAgIHhjaGcgZXNpLCBlZGkgOyDQnNC10L3Rj9C10Lwg0LzQtdGB0YLQsNC80LgsINGH0YLQvtCx0Ysg0LLRi9GH0LjRgtCw0YLRjCDQuNC3INCy0YLQvtGA0L7Qs9C+CiAgICBjYWxsIHN1YnRyYWN0X251bWJlcnMKICAgIGptcCBwcm9jZXNzX3Jlc3VsdF9zaWduCgpwcmVwYXJlX2FkZGl0aW9uOgogICAgOyDQn9C+0LTQs9C+0YLQvtCy0LrQsCDQuiDRgdC70L7QttC10L3QuNGOCiAgICBtb3YgZXNpLCBudW0xCiAgICBtb3YgZWRpLCBudW0yCiAgICBtb3YgZWJ4LCByZXN1bHQKICAgIAogICAgOyDQldGB0LvQuCDQsdGL0LvQuCDQt9C90LDQutC4LCDQv9GA0L7Qv9GD0YHQutCw0LXQvCDQuNGFCiAgICBjbXAgYnl0ZSBbZXNpXSwgJy0nCiAgICBqbmUgY2hlY2tfbnVtMl9zaWduCiAgICBpbmMgZXNpCmNoZWNrX251bTJfc2lnbjoKICAgIGNtcCBieXRlIFtlZGldLCAnLScKICAgIGpuZSBzdGFydF9hZGRpdGlvbgogICAgaW5jIGVkaQoKc3RhcnRfYWRkaXRpb246CiAgICA7INCd0LDRh9C40L3QsNC10Lwg0YHQu9C+0LbQtdC90LjQtSDRgSDQvNC70LDQtNGI0LjRhSDRgNCw0LfRgNGP0LTQvtCyCiAgICBtb3YgZWN4LCBOCiAgICBhZGQgZXNpLCBlY3gKICAgIGRlYyBlc2kgICAgIDsg0KPQutCw0LfRi9Cy0LDQtdC8INC90LAg0L/QvtGB0LvQtdC00L3QuNC5INGB0LjQvNCy0L7QuwogICAgYWRkIGVkaSwgZWN4CiAgICBkZWMgZWRpCiAgICBhZGQgZWJ4LCBlY3gKICAgIGRlYyBlYngKICAgIAogICAgbW92IGJ5dGUgW2VieCsxXSwgMCA7INCa0L7QvdC10YYg0YHRgtGA0L7QutC4CiAgICBtb3YgYnl0ZSBbZWJ4XSwgMCAgIDsg0JjQvdC40YbQuNCw0LvQuNC30LjRgNGD0LXQvCDQv9C+0YHQu9C10LTQvdC40Lkg0LHQsNC50YIKICAgIAogICAgY2xjICAgICAgICAgOyDQodCx0YDQvtGBINGE0LvQsNCz0LAg0L/QtdGA0LXQvdC+0YHQsAoKYWRkaXRpb25fbG9vcDoKICAgIG1vdiBhbCwgW2VzaV0KICAgIHN1YiBhbCwgJzAnIDsg0J/RgNC10L7QsdGA0LDQt9GD0LXQvCBBU0NJSSDQsiDRh9C40YHQu9C+CiAgICAKICAgIG1vdiBhaCwgW2VkaV0KICAgIHN1YiBhaCwgJzAnIDsg0J/RgNC10L7QsdGA0LDQt9GD0LXQvCBBU0NJSSDQsiDRh9C40YHQu9C+CiAgICAKICAgIDsg0KHQu9C+0LbQtdC90LjQtSDRgSDRg9GH0LXRgtC+0Lwg0L/RgNC10LTRi9C00YPRidC10LPQviDQv9C10YDQtdC90L7RgdCwCiAgICBhZGMgYWwsIGFoCiAgICAKICAgIDsg0J/RgNC+0LLQtdGA0LrQsCDQvdCwINC/0LXRgNC10L/QvtC70L3QtdC90LjQtSAo0LXRgdC70Lgg0YHRg9C80LzQsCA+PSAxMCkKICAgIGNtcCBhbCwgMTAKICAgIGpiIG5vX2NhcnJ5CiAgICAKICAgIHN1YiBhbCwgMTAKICAgIHN0YyAgICAgICAgIDsg0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10Lwg0YTQu9Cw0LMg0L/QtdGA0LXQvdC+0YHQsAogICAgam1wIHN0b3JlX2RpZ2l0Cgpub19jYXJyeToKICAgIGNsYyAgICAgICAgIDsg0KHQsdGA0L7RgSDRhNC70LDQs9CwINC/0LXRgNC10L3QvtGB0LAKCnN0b3JlX2RpZ2l0OgogICAgYWRkIGFsLCAnMCcgOyDQn9GA0LXQvtCx0YDQsNC30YPQtdC8INGH0LjRgdC70L4g0LIgQVNDSUkKICAgIG1vdiBbZWJ4XSwgYWwKICAgIAogICAgOyDQn9C10YDQtdGF0L7QtCDQuiDRgdC70LXQtNGD0Y7RidC10LzRgyDRgNCw0LfRgNGP0LTRgwogICAgZGVjIGVzaQogICAgZGVjIGVkaQogICAgZGVjIGVieAogICAgCiAgICBsb29wIGFkZGl0aW9uX2xvb3AKICAgIAogICAgOyDQldGB0LvQuCDQvtGB0YLQsNC70YHRjyDQv9C10YDQtdC90L7RgQogICAgam5jIGFkZGl0aW9uX2RvbmUKICAgIAogICAgOyDQlNC+0LHQsNCy0LvRj9C10Lwg0YHRgtCw0YDRiNC40Lkg0YDQsNC30YDRj9C0CiAgICBtb3YgYnl0ZSBbZWJ4XSwgJzEnCiAgICBqbXAgYWRkaXRpb25fY29tcGxldGUKCmFkZGl0aW9uX2RvbmU6CiAgICBtb3YgYnl0ZSBbZWJ4XSwgJzAnCgphZGRpdGlvbl9jb21wbGV0ZToKICAgIDsg0JXRgdC70Lgg0YDQtdC30YPQu9GM0YLQsNGCINC+0YLRgNC40YbQsNGC0LXQu9GM0L3Ri9C5LCDQtNC+0LHQsNCy0LvRj9C10Lwg0LfQvdCw0LogJy0nCiAgICBjbXAgZGgsIDEKICAgIGpuZSBwcm9jZXNzX3Jlc3VsdF9zaWduCiAgICAKICAgIGRlYyBlYngKICAgIG1vdiBieXRlIFtlYnhdLCAnLScKCnByb2Nlc3NfcmVzdWx0X3NpZ246CiAgICA7INCa0L7Qv9C40YDRg9C10Lwg0YDQtdC30YPQu9GM0YLQsNGCINCyINC90LDRh9Cw0LvQviDQsdGD0YTQtdGA0LAKICAgIG1vdiBlc2ksIHJlc3VsdAogICAgbW92IGVkaSwgcmVzdWx0CiAgICAKICAgIDsg0J/RgNC+0L/Rg9GB0LrQsNC10Lwg0L3QsNGH0LDQu9GM0L3Ri9C1INC90YPQu9C4CnNraXBfemVyb3M6CiAgICBjbXAgYnl0ZSBbZXNpXSwgJzAnCiAgICBqbmUgY29weV9yZXN1bHQKICAgIGluYyBlc2kKICAgIGptcCBza2lwX3plcm9zCgpjb3B5X3Jlc3VsdDoKICAgIDsg0JrQvtC/0LjRgNGD0LXQvCDQvtGB0YLQsNGC0L7QugogICAgbW92IGFsLCBbZXNpXQogICAgbW92IFtlZGldLCBhbAogICAgaW5jIGVzaQogICAgaW5jIGVkaQogICAgdGVzdCBhbCwgYWwKICAgIGpueiBjb3B5X3Jlc3VsdAogICAgCiAgICA7INCV0YHQu9C4INCy0YHQtSDQsdGL0LvQviDQvdGD0LvRj9C80LgKICAgIG1vdiBlc2ksIHJlc3VsdAogICAgY21wIGJ5dGUgW2VzaV0sIDAKICAgIGpuZSBub3RfYWxsX3plcm9zCiAgICBtb3YgYnl0ZSBbZXNpXSwgJzAnCiAgICBtb3YgYnl0ZSBbZXNpKzFdLCAwCgpub3RfYWxsX3plcm9zOgogICAgcG9wYQogICAgcmV0Cgo7INCf0YDQvtGG0LXQtNGD0YDQsCDQstGL0YfQuNGC0LDQvdC40Y8gKNGD0L/RgNC+0YnQtdC90L3QsNGPINCy0LXRgNGB0LjRjykKOyDQktGF0L7QtDogRVNJIC0g0YPQvNC10L3RjNGI0LDQtdC80L7QtSwgRURJIC0g0LLRi9GH0LjRgtCw0LXQvNC+0LUKc3VidHJhY3RfbnVtYmVyczoKICAgIHB1c2hhCiAgICA7INCX0LTQtdGB0Ywg0LTQvtC70LbQvdCwINCx0YvRgtGMINGA0LXQsNC70LjQt9Cw0YbQuNGPINCy0YvRh9C40YLQsNC90LjRjwogICAgOyDQlNC70Y8g0L/RgNC+0YHRgtC+0YLRiyDQstC+0LfQstGA0LDRidCw0LXQvCAiMCIKICAgIG1vdiBlZGksIHJlc3VsdAogICAgbW92IGJ5dGUgW2VkaV0sICcwJwogICAgbW92IGJ5dGUgW2VkaSsxXSwgMAogICAgcG9wYQogICAgcmV0Cgo7INCk0YPQvdC60YbQuNGPINCy0YvRh9C40YHQu9C10L3QuNGPINC00LvQuNC90Ysg0YHRgtGA0L7QutC4Cjsg0JLRhdC+0LQ6IEVESSAtINGD0LrQsNC30LDRgtC10LvRjCDQvdCwINGB0YLRgNC+0LrRgwo7INCS0YvRhdC+0LQ6IEVBWCAtINC00LvQuNC90LAg0YHRgtGA0L7QutC4CnN0cmxlbjoKICAgIHB1c2ggZWN4CiAgICBwdXNoIGVkaQogICAgeG9yIGVjeCwgZWN4CiAgICBub3QgZWN4CiAgICB4b3IgYWwsIGFsCiAgICBjbGQKICAgIHJlcG5lIHNjYXNiCiAgICBub3QgZWN4CiAgICBkZWMgZWN4CiAgICBtb3YgZWF4LCBlY3gKICAgIHBvcCBlZGkKICAgIHBvcCBlY3gKICAgIHJldA==