program Lab23;
{$APPTYPE CONSOLE}
{$MODE OBJFPC}
uses
SysUtils, Classes;
type
TMonth = ( January, February, March, April, May, June,
July, August, September, October, November, December) ;
TEvent = record
EventName : string [ 100 ] ;
Day : byte ;
Month : TMonth;
Year : integer ;
end ;
function MonthFromInt( m: integer ) : TMonth;
begin
Result : = TMonth( m - 1 ) ;
end ;
function MonthToStr( m: TMonth) : string ;
const
Names: array [ January.. December ] of string = (
'январь' , 'февраль' , 'март' , 'апрель' , 'май' , 'июнь' ,
'июль' , 'август' , 'сентябрь' , 'октябрь' , 'ноябрь' , 'декабрь' ) ;
begin
Result : = Names[ m] ;
end ;
function IsLater( A, B: TEvent) : Boolean ;
begin
Result : = ( A. Year > B. Year ) or
( ( A. Year = B. Year ) and ( Ord ( A. Month ) > Ord ( B. Month ) ) ) or
( ( A. Year = B. Year ) and ( A. Month = B. Month ) and ( A. Day > B. Day ) ) ;
end ;
procedure SplitString( const S: string ; Separator: char ; var Parts: TStringList) ;
var
i, Start: integer ;
begin
Parts. Clear ;
Start : = 1 ;
for i : = 1 to Length( S) do
if S[ i] = Separator then
begin
Parts. Add ( Copy( S, Start, i - Start) ) ;
Start : = i + 1 ;
end ;
Parts. Add ( Copy( S, Start, Length( S) - Start + 1 ) ) ;
end ;
function GetTypedFileName: string ;
begin
if ParamCount >= 1 then
Result : = ParamStr( 1 )
else
begin
Write ( 'Введите имя типизированного файла: ' ) ;
ReadLn ( Result) ;
end ;
end ;
procedure CreateTypedFileDialog;
var
f: file of TEvent;
rec: TEvent;
m: integer ;
answer: char ;
fname: string ;
begin
fname : = GetTypedFileName;
AssignFile( f, fname) ;
try
Rewrite( f) ;
except
Writeln ( 'Ошибка создания файла ' , fname) ;
ReadLn ;
Exit;
end ;
repeat
Writeln ( '--- Новая запись ---' ) ;
Write ( 'Событие: ' ) ; ReadLn ( rec. EventName ) ;
Write ( 'День (1..31): ' ) ; ReadLn ( rec. Day ) ;
repeat
Write ( 'Месяц (1..12): ' ) ; ReadLn ( m) ;
until ( m >= 1 ) and ( m <= 12 ) ;
rec. Month : = MonthFromInt( m) ;
Write ( 'Год: ' ) ; ReadLn ( rec. Year ) ;
Write ( f, rec) ;
Write ( 'Добавить ещё? (y/n): ' ) ; ReadLn ( answer) ;
until UpCase( answer) = 'N' ;
CloseFile( f) ;
Writeln ( 'Файл ' , fname, ' успешно создан.' ) ;
ReadLn ;
end ;
procedure CreateTypedFileFromText;
var
tf: TextFile;
f: file of TEvent;
rec: TEvent;
line: string ;
parts: TStringList;
fname_typed, fname_text: string ;
begin
if ParamCount >= 2 then
fname_text : = ParamStr( 2 )
else
begin
Write ( 'Введите имя текстового файла: ' ) ;
ReadLn ( fname_text) ;
end ;
fname_typed : = GetTypedFileName;
AssignFile( tf, fname_text) ;
try
Reset( tf) ;
except
Writeln ( 'Не удалось открыть текстовый файл ' , fname_text) ;
ReadLn ;
Exit;
end ;
AssignFile( f, fname_typed) ;
try
Rewrite( f) ;
except
Writeln ( 'Ошибка создания типизированного файла ' , fname_typed) ;
CloseFile( tf) ;
ReadLn ;
Exit;
end ;
parts : = TStringList. Create ;
try
while not Eof ( tf) do
begin
ReadLn ( tf, line) ;
if Trim( line) = '' then Continue;
SplitString( line, ';' , parts) ;
if parts. Count < 4 then
begin
Writeln ( 'Ошибка в строке: ' , line, ' – пропущена' ) ;
Continue;
end ;
rec. EventName : = parts[ 0 ] ;
rec. Day : = StrToIntDef( parts[ 1 ] , 1 ) ;
rec. Month : = MonthFromInt( StrToIntDef( parts[ 2 ] , 1 ) ) ;
rec. Year : = StrToIntDef( parts[ 3 ] , 2000 ) ;
Write ( f, rec) ;
end ;
finally
parts. Free ;
end ;
CloseFile( tf) ;
CloseFile( f) ;
Writeln ( 'Типизированный файл создан из ' , fname_text) ;
ReadLn ;
end ;
procedure ViewFile;
var
f: file of TEvent;
rec: TEvent;
count: integer ;
fname: string ;
begin
fname : = GetTypedFileName;
AssignFile( f, fname) ;
try
Reset( f) ;
except
Writeln ( 'Ошибка открытия файла ' , fname) ;
ReadLn ;
Exit;
end ;
count : = 0 ;
while not Eof ( f) do
begin
Read ( f, rec) ;
Inc( count) ;
Writeln ( count, ': ' , rec. EventName , ', ' , rec. Day , ' ' , MonthToStr( rec. Month ) ,
' ' , rec. Year , ' г.' ) ;
end ;
if count = 0 then
Writeln ( 'Файл пуст.' )
else
Writeln ( 'Всего записей: ' , count) ;
CloseFile( f) ;
ReadLn ;
end ;
procedure FindAndSwapWithLast;
var
f: file of TEvent;
rec, candidate, lastRec: TEvent;
bestPos, lastPos, curPos: integer ;
found: boolean ;
letter: string ;
fname: string ;
begin
fname : = GetTypedFileName;
AssignFile( f, fname) ;
try
Reset( f) ;
except
Writeln ( 'Ошибка открытия файла ' , fname) ;
ReadLn ;
Exit;
end ;
Write ( 'Введите букву, с которой начинается событие: ' ) ;
ReadLn ( letter) ;
if letter = '' then
begin
Writeln ( 'Буква не введена.' ) ;
CloseFile( f) ;
ReadLn ;
Exit;
end ;
letter : = UpperCase( letter) [ 1 ] ;
found : = False ;
bestPos : = - 1 ;
while not Eof ( f) do
begin
Read ( f, rec) ;
if ( Length( rec. EventName ) > 0 ) and ( UpperCase( rec. EventName ) [ 1 ] = letter) then
begin
if not found then
begin
candidate : = rec;
bestPos : = FilePos( f) ;
found : = True ;
end
else if IsLater( rec, candidate) then
begin
candidate : = rec;
bestPos : = FilePos( f) ;
end ;
end ;
end ;
if not found then
begin
Writeln ( 'Записей, начинающихся на букву "' , letter, '", не найдено.' ) ;
CloseFile( f) ;
ReadLn ;
Exit;
end ;
lastPos : = FileSize( f) - 1 ;
if bestPos = lastPos then
begin
Writeln ( 'Найденная запись уже является последней. Перестановка не требуется.' ) ;
CloseFile( f) ;
ReadLn ;
Exit;
end ;
Seek( f, lastPos) ;
Read ( f, lastRec) ;
Seek( f, lastPos) ;
Write ( f, candidate) ;
Seek( f, bestPos) ;
Write ( f, lastRec) ;
Writeln ( 'Перестановка выполнена: запись ' , bestPos+ 1 ,
' (' , candidate. EventName , ') и запись ' , lastPos+ 1 ,
' (' , lastRec. EventName , ') поменяны местами.' ) ;
CloseFile( f) ;
ReadLn ;
end ;
var
ch: char ;
begin
repeat
Writeln ( '-----------------------------------' ) ;
Writeln ( 'D - создать типизированный файл (диалог)' ) ;
Writeln ( 'N - создать из текстового файла' ) ;
Writeln ( 'F - найти запись и переставить с последней' ) ;
Writeln ( 'V - просмотр файла' ) ;
Writeln ( 'E - выход' ) ;
Write ( 'Ваш выбор: ' ) ;
ReadLn ( ch) ;
Writeln ( '-----------------------------------' ) ;
ch : = UpCase( ch) ;
case ch of
'D' : CreateTypedFileDialog;
'N' : CreateTypedFileFromText;
'F' : FindAndSwapWithLast;
'V' : ViewFile;
'E' : Exit;
else
Writeln ( 'Нет такой команды' ) ;
Write ( 'Press ENTER' ) ;
ReadLn ;
end ;
until ch = 'E' ;
end .
cHJvZ3JhbSBMYWIyMzsKIAp7JEFQUFRZUEUgQ09OU09MRX0KeyRNT0RFIE9CSkZQQ30KIAp1c2VzCiBTeXNVdGlscywgQ2xhc3NlczsKIAp0eXBlCiBUTW9udGggPSAoSmFudWFyeSwgRmVicnVhcnksIE1hcmNoLCBBcHJpbCwgTWF5LCBKdW5lLAogSnVseSwgQXVndXN0LCBTZXB0ZW1iZXIsIE9jdG9iZXIsIE5vdmVtYmVyLCBEZWNlbWJlcik7CiBURXZlbnQgPSByZWNvcmQKIEV2ZW50TmFtZSA6IHN0cmluZ1sxMDBdOwogRGF5IDogYnl0ZTsKIE1vbnRoIDogVE1vbnRoOwogWWVhciA6IGludGVnZXI7CiAgZW5kOwogCmZ1bmN0aW9uIE1vbnRoRnJvbUludChtOiBpbnRlZ2VyKTogVE1vbnRoOwpiZWdpbgogUmVzdWx0IDo9IFRNb250aChtIC0gMSk7CmVuZDsKIApmdW5jdGlvbiBNb250aFRvU3RyKG06IFRNb250aCk6IHN0cmluZzsKY29uc3QKIE5hbWVzOiBhcnJheVtKYW51YXJ5Li5EZWNlbWJlcl0gb2Ygc3RyaW5nID0gKAogICAgJ9GP0L3QstCw0YDRjCcsICfRhNC10LLRgNCw0LvRjCcsICfQvNCw0YDRgicsICfQsNC/0YDQtdC70YwnLCAn0LzQsNC5JywgJ9C40Y7QvdGMJywKICAgICfQuNGO0LvRjCcsICfQsNCy0LPRg9GB0YInLCAn0YHQtdC90YLRj9Cx0YDRjCcsICfQvtC60YLRj9Cx0YDRjCcsICfQvdC+0Y/QsdGA0YwnLCAn0LTQtdC60LDQsdGA0YwnKTsKYmVnaW4KIFJlc3VsdCA6PSBOYW1lc1ttXTsKZW5kOwogCmZ1bmN0aW9uIElzTGF0ZXIoQSwgQjogVEV2ZW50KTogQm9vbGVhbjsKYmVnaW4KIFJlc3VsdCA6PSAoQS5ZZWFyID4gQi5ZZWFyKSBvcgogICAgICAgICAgICAoKEEuWWVhciA9IEIuWWVhcikgYW5kIChPcmQoQS5Nb250aCkgPiBPcmQoQi5Nb250aCkpKSBvcgogICAgICAgICAgICAoKEEuWWVhciA9IEIuWWVhcikgYW5kIChBLk1vbnRoID0gQi5Nb250aCkgYW5kIChBLkRheSA+IEIuRGF5KSk7CmVuZDsKIApwcm9jZWR1cmUgU3BsaXRTdHJpbmcoY29uc3QgUzogc3RyaW5nOyBTZXBhcmF0b3I6IGNoYXI7IHZhciBQYXJ0czogVFN0cmluZ0xpc3QpOwp2YXIKICBpLCBTdGFydDogaW50ZWdlcjsKYmVnaW4KICBQYXJ0cy5DbGVhcjsKICBTdGFydCA6PSAxOwogIGZvciBpIDo9IDEgdG8gTGVuZ3RoKFMpIGRvCiAgICBpZiBTW2ldID0gU2VwYXJhdG9yIHRoZW4KICAgIGJlZ2luCiAgICAgIFBhcnRzLkFkZChDb3B5KFMsIFN0YXJ0LCBpIC0gU3RhcnQpKTsKICAgICAgU3RhcnQgOj0gaSArIDE7CiAgICBlbmQ7CiAgUGFydHMuQWRkKENvcHkoUywgU3RhcnQsIExlbmd0aChTKSAtIFN0YXJ0ICsgMSkpOwplbmQ7CiAKZnVuY3Rpb24gR2V0VHlwZWRGaWxlTmFtZTogc3RyaW5nOwpiZWdpbgogIGlmIFBhcmFtQ291bnQgPj0gMSB0aGVuCiAgICBSZXN1bHQgOj0gUGFyYW1TdHIoMSkKICBlbHNlCiAgYmVnaW4KICAgIFdyaXRlKCfQktCy0LXQtNC40YLQtSDQuNC80Y8g0YLQuNC/0LjQt9C40YDQvtCy0LDQvdC90L7Qs9C+INGE0LDQudC70LA6ICcpOwogICAgUmVhZExuKFJlc3VsdCk7CiAgZW5kOwplbmQ7CiAKcHJvY2VkdXJlIENyZWF0ZVR5cGVkRmlsZURpYWxvZzsKdmFyCiAgZjogZmlsZSBvZiBURXZlbnQ7CiAgcmVjOiBURXZlbnQ7CiAgbTogaW50ZWdlcjsKICBhbnN3ZXI6IGNoYXI7CiAgZm5hbWU6IHN0cmluZzsKYmVnaW4KICBmbmFtZSA6PSBHZXRUeXBlZEZpbGVOYW1lOwogIEFzc2lnbkZpbGUoZiwgZm5hbWUpOwogIHRyeQogICAgUmV3cml0ZShmKTsKICBleGNlcHQKICAgIFdyaXRlbG4oJ9Ce0YjQuNCx0LrQsCDRgdC+0LfQtNCw0L3QuNGPINGE0LDQudC70LAgJywgZm5hbWUpOwogICAgUmVhZExuOwogICAgRXhpdDsKICBlbmQ7CiAKICByZXBlYXQKICAgIFdyaXRlbG4oJy0tLSDQndC+0LLQsNGPINC30LDQv9C40YHRjCAtLS0nKTsKICAgIFdyaXRlKCfQodC+0LHRi9GC0LjQtTogJyk7IFJlYWRMbihyZWMuRXZlbnROYW1lKTsKICAgIFdyaXRlKCfQlNC10L3RjCAoMS4uMzEpOiAnKTsgUmVhZExuKHJlYy5EYXkpOwogICAgcmVwZWF0CiAgICAgIFdyaXRlKCfQnNC10YHRj9GGICgxLi4xMik6ICcpOyBSZWFkTG4obSk7CiAgICB1bnRpbCAobSA+PSAxKSBhbmQgKG0gPD0gMTIpOwogICAgcmVjLk1vbnRoIDo9IE1vbnRoRnJvbUludChtKTsKICAgIFdyaXRlKCfQk9C+0LQ6ICcpOyBSZWFkTG4ocmVjLlllYXIpOwogICAgV3JpdGUoZiwgcmVjKTsKICAgIFdyaXRlKCfQlNC+0LHQsNCy0LjRgtGMINC10YnRkT8gKHkvbik6ICcpOyBSZWFkTG4oYW5zd2VyKTsKICB1bnRpbCBVcENhc2UoYW5zd2VyKSA9ICdOJzsKIAogIENsb3NlRmlsZShmKTsKICBXcml0ZWxuKCfQpNCw0LnQuyAnLCBmbmFtZSwgJyDRg9GB0L/QtdGI0L3QviDRgdC+0LfQtNCw0L0uJyk7CiAgUmVhZExuOwplbmQ7CiAKcHJvY2VkdXJlIENyZWF0ZVR5cGVkRmlsZUZyb21UZXh0Owp2YXIKICB0ZjogVGV4dEZpbGU7CiAgZjogZmlsZSBvZiBURXZlbnQ7CiAgcmVjOiBURXZlbnQ7CiAgbGluZTogc3RyaW5nOwogIHBhcnRzOiBUU3RyaW5nTGlzdDsKICBmbmFtZV90eXBlZCwgZm5hbWVfdGV4dDogc3RyaW5nOwpiZWdpbgogIGlmIFBhcmFtQ291bnQgPj0gMiB0aGVuCiAgICBmbmFtZV90ZXh0IDo9IFBhcmFtU3RyKDIpCiAgZWxzZQogIGJlZ2luCiAgICBXcml0ZSgn0JLQstC10LTQuNGC0LUg0LjQvNGPINGC0LXQutGB0YLQvtCy0L7Qs9C+INGE0LDQudC70LA6ICcpOwogICAgUmVhZExuKGZuYW1lX3RleHQpOwogIGVuZDsKICBmbmFtZV90eXBlZCA6PSBHZXRUeXBlZEZpbGVOYW1lOwogCiAgQXNzaWduRmlsZSh0ZiwgZm5hbWVfdGV4dCk7CiAgdHJ5CiAgICBSZXNldCh0Zik7CiAgZXhjZXB0CiAgICBXcml0ZWxuKCfQndC1INGD0LTQsNC70L7RgdGMINC+0YLQutGA0YvRgtGMINGC0LXQutGB0YLQvtCy0YvQuSDRhNCw0LnQuyAnLCBmbmFtZV90ZXh0KTsKICAgIFJlYWRMbjsKICAgIEV4aXQ7CiAgZW5kOwogCiAgQXNzaWduRmlsZShmLCBmbmFtZV90eXBlZCk7CiAgdHJ5CiAgICBSZXdyaXRlKGYpOwogIGV4Y2VwdAogICAgV3JpdGVsbign0J7RiNC40LHQutCwINGB0L7Qt9C00LDQvdC40Y8g0YLQuNC/0LjQt9C40YDQvtCy0LDQvdC90L7Qs9C+INGE0LDQudC70LAgJywgZm5hbWVfdHlwZWQpOwogICAgQ2xvc2VGaWxlKHRmKTsKICAgIFJlYWRMbjsKICAgIEV4aXQ7CiAgZW5kOwogCiAgcGFydHMgOj0gVFN0cmluZ0xpc3QuQ3JlYXRlOwogIHRyeQogICAgd2hpbGUgbm90IEVvZih0ZikgZG8KICAgIGJlZ2luCiAgICAgIFJlYWRMbih0ZiwgbGluZSk7CiAgICAgIGlmIFRyaW0obGluZSkgPSAnJyB0aGVuIENvbnRpbnVlOwogICAgICBTcGxpdFN0cmluZyhsaW5lLCAnOycsIHBhcnRzKTsKICAgICAgaWYgcGFydHMuQ291bnQgPCA0IHRoZW4KICAgICAgYmVnaW4KICAgICAgICBXcml0ZWxuKCfQntGI0LjQsdC60LAg0LIg0YHRgtGA0L7QutC1OiAnLCBsaW5lLCAnIOKAkyDQv9GA0L7Qv9GD0YnQtdC90LAnKTsKICAgICAgICBDb250aW51ZTsKICAgICAgZW5kOwogICAgICByZWMuRXZlbnROYW1lIDo9IHBhcnRzWzBdOwogICAgICByZWMuRGF5IDo9IFN0clRvSW50RGVmKHBhcnRzWzFdLCAxKTsKICAgICAgcmVjLk1vbnRoIDo9IE1vbnRoRnJvbUludChTdHJUb0ludERlZihwYXJ0c1syXSwgMSkpOwogICAgICByZWMuWWVhciA6PSBTdHJUb0ludERlZihwYXJ0c1szXSwgMjAwMCk7CiAgICAgIFdyaXRlKGYsIHJlYyk7CiAgICBlbmQ7CiAgZmluYWxseQogICAgcGFydHMuRnJlZTsKICBlbmQ7CiAKICBDbG9zZUZpbGUodGYpOwogIENsb3NlRmlsZShmKTsKICBXcml0ZWxuKCfQotC40L/QuNC30LjRgNC+0LLQsNC90L3Ri9C5INGE0LDQudC7INGB0L7Qt9C00LDQvSDQuNC3ICcsIGZuYW1lX3RleHQpOwogIFJlYWRMbjsKZW5kOwogCnByb2NlZHVyZSBWaWV3RmlsZTsKdmFyCiAgZjogZmlsZSBvZiBURXZlbnQ7CiAgcmVjOiBURXZlbnQ7CiAgY291bnQ6IGludGVnZXI7CiAgZm5hbWU6IHN0cmluZzsKYmVnaW4KICBmbmFtZSA6PSBHZXRUeXBlZEZpbGVOYW1lOwogIEFzc2lnbkZpbGUoZiwgZm5hbWUpOwogIHRyeQogICAgUmVzZXQoZik7CiAgZXhjZXB0CiAgICBXcml0ZWxuKCfQntGI0LjQsdC60LAg0L7RgtC60YDRi9GC0LjRjyDRhNCw0LnQu9CwICcsIGZuYW1lKTsKICAgIFJlYWRMbjsKICAgIEV4aXQ7CiAgZW5kOwogCiAgY291bnQgOj0gMDsKICB3aGlsZSBub3QgRW9mKGYpIGRvCiAgYmVnaW4KICAgIFJlYWQoZiwgcmVjKTsKICAgIEluYyhjb3VudCk7CiAgICBXcml0ZWxuKGNvdW50LCAnOiAnLCByZWMuRXZlbnROYW1lLCAnLCAnLCByZWMuRGF5LCAnICcsIE1vbnRoVG9TdHIocmVjLk1vbnRoKSwKICAgICAgICAgICAgJyAnLCByZWMuWWVhciwgJyDQsy4nKTsKICBlbmQ7CiAgaWYgY291bnQgPSAwIHRoZW4KICAgIFdyaXRlbG4oJ9Ck0LDQudC7INC/0YPRgdGCLicpCiAgZWxzZQogICAgV3JpdGVsbign0JLRgdC10LPQviDQt9Cw0L/QuNGB0LXQuTogJywgY291bnQpOwogIENsb3NlRmlsZShmKTsKICBSZWFkTG47CmVuZDsKIApwcm9jZWR1cmUgRmluZEFuZFN3YXBXaXRoTGFzdDsKdmFyCiAgZjogZmlsZSBvZiBURXZlbnQ7CiAgcmVjLCBjYW5kaWRhdGUsIGxhc3RSZWM6IFRFdmVudDsKICBiZXN0UG9zLCBsYXN0UG9zLCBjdXJQb3M6IGludGVnZXI7CiAgZm91bmQ6IGJvb2xlYW47CiBsZXR0ZXI6IHN0cmluZzsKIGZuYW1lOiBzdHJpbmc7CmJlZ2luCiBmbmFtZSA6PSBHZXRUeXBlZEZpbGVOYW1lOwogQXNzaWduRmlsZShmLCBmbmFtZSk7CiAgdHJ5CiBSZXNldChmKTsKICBleGNlcHQKICAgIFdyaXRlbG4oJ9Ce0YjQuNCx0LrQsCDQvtGC0LrRgNGL0YLQuNGPINGE0LDQudC70LAgJywgZm5hbWUpOwogICAgUmVhZExuOwogRXhpdDsKICBlbmQ7CiAKICBXcml0ZSgn0JLQstC10LTQuNGC0LUg0LHRg9C60LLRgywg0YEg0LrQvtGC0L7RgNC+0Lkg0L3QsNGH0LjQvdCw0LXRgtGB0Y8g0YHQvtCx0YvRgtC40LU6ICcpOwogIFJlYWRMbihsZXR0ZXIpOwogIGlmIGxldHRlciA9ICcnIHRoZW4KICBiZWdpbgogICAgV3JpdGVsbign0JHRg9C60LLQsCDQvdC1INCy0LLQtdC00LXQvdCwLicpOwogQ2xvc2VGaWxlKGYpOwogICAgUmVhZExuOwogRXhpdDsKICBlbmQ7CiBsZXR0ZXIgOj0gVXBwZXJDYXNlKGxldHRlcilbMV07CiAKIGZvdW5kIDo9IEZhbHNlOwogYmVzdFBvcyA6PSAtMTsKICB3aGlsZSBub3QgRW9mKGYpIGRvCiAgYmVnaW4KICAgIFJlYWQoZiwgcmVjKTsKICAgIGlmIChMZW5ndGgocmVjLkV2ZW50TmFtZSkgPiAwKSBhbmQgKFVwcGVyQ2FzZShyZWMuRXZlbnROYW1lKVsxXSA9IGxldHRlcikgdGhlbgogICAgYmVnaW4KICAgICAgaWYgbm90IGZvdW5kIHRoZW4KICAgICAgYmVnaW4KCQljYW5kaWRhdGUgOj0gcmVjOwoJCWJlc3RQb3MgOj0gRmlsZVBvcyhmKTsKCQlmb3VuZCA6PSBUcnVlOwogICAgICBlbmQKICAgICAgZWxzZSBpZiBJc0xhdGVyKHJlYywgY2FuZGlkYXRlKSB0aGVuCiAgICAgIGJlZ2luCiAgICAgICAgY2FuZGlkYXRlIDo9IHJlYzsKCQliZXN0UG9zIDo9IEZpbGVQb3MoZik7CiAgICAgIGVuZDsKICAgIGVuZDsKICBlbmQ7CiAKICBpZiBub3QgZm91bmQgdGhlbgogIGJlZ2luCiAgICBXcml0ZWxuKCfQl9Cw0L/QuNGB0LXQuSwg0L3QsNGH0LjQvdCw0Y7RidC40YXRgdGPINC90LAg0LHRg9C60LLRgyAiJywgbGV0dGVyLCAnIiwg0L3QtSDQvdCw0LnQtNC10L3Qvi4nKTsKIENsb3NlRmlsZShmKTsKICAgIFJlYWRMbjsKIEV4aXQ7CiAgZW5kOwogCiBsYXN0UG9zIDo9IEZpbGVTaXplKGYpIC0gMTsKICBpZiBiZXN0UG9zID0gbGFzdFBvcyB0aGVuCiAgYmVnaW4KICAgIFdyaXRlbG4oJ9Cd0LDQudC00LXQvdC90LDRjyDQt9Cw0L/QuNGB0Ywg0YPQttC1INGP0LLQu9GP0LXRgtGB0Y8g0L/QvtGB0LvQtdC00L3QtdC5LiDQn9C10YDQtdGB0YLQsNC90L7QstC60LAg0L3QtSDRgtGA0LXQsdGD0LXRgtGB0Y8uJyk7CiBDbG9zZUZpbGUoZik7CiAgICBSZWFkTG47CiBFeGl0OwogIGVuZDsKIAogU2VlayhmLCBsYXN0UG9zKTsKICBSZWFkKGYsIGxhc3RSZWMpOwogU2VlayhmLCBsYXN0UG9zKTsKICBXcml0ZShmLCBjYW5kaWRhdGUpOwogU2VlayhmLCBiZXN0UG9zKTsKICBXcml0ZShmLCBsYXN0UmVjKTsKIAogIFdyaXRlbG4oJ9Cf0LXRgNC10YHRgtCw0L3QvtCy0LrQsCDQstGL0L/QvtC70L3QtdC90LA6INC30LDQv9C40YHRjCAnLCBiZXN0UG9zKzEsCiAgICAgICAgICAnICgnLCBjYW5kaWRhdGUuRXZlbnROYW1lLCAnKSDQuCDQt9Cw0L/QuNGB0YwgJywgbGFzdFBvcysxLAogICAgICAgICAgJyAoJywgbGFzdFJlYy5FdmVudE5hbWUsICcpINC/0L7QvNC10L3Rj9C90Ysg0LzQtdGB0YLQsNC80LguJyk7CiAgQ2xvc2VGaWxlKGYpOwogIFJlYWRMbjsKZW5kOwogCnZhcgogY2g6IGNoYXI7CmJlZ2luCiAgcmVwZWF0CiAgICBXcml0ZWxuKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpOwogICAgV3JpdGVsbignRCAtINGB0L7Qt9C00LDRgtGMINGC0LjQv9C40LfQuNGA0L7QstCw0L3QvdGL0Lkg0YTQsNC50LsgKNC00LjQsNC70L7QsyknKTsKICAgIFdyaXRlbG4oJ04gLSDRgdC+0LfQtNCw0YLRjCDQuNC3INGC0LXQutGB0YLQvtCy0L7Qs9C+INGE0LDQudC70LAnKTsKICAgIFdyaXRlbG4oJ0YgLSDQvdCw0LnRgtC4INC30LDQv9C40YHRjCDQuCDQv9C10YDQtdGB0YLQsNCy0LjRgtGMINGBINC/0L7RgdC70LXQtNC90LXQuScpOwogICAgV3JpdGVsbignViAtINC/0YDQvtGB0LzQvtGC0YAg0YTQsNC50LvQsCcpOwogICAgV3JpdGVsbignRSAtINCy0YvRhdC+0LQnKTsKICAgIFdyaXRlKCfQktCw0Ygg0LLRi9Cx0L7RgDogJyk7CiAgICBSZWFkTG4oY2gpOwogICAgV3JpdGVsbignLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTsKIGNoIDo9IFVwQ2FzZShjaCk7CiAgICBjYXNlIGNoIG9mCiAgICAgICdEJzogQ3JlYXRlVHlwZWRGaWxlRGlhbG9nOwogICAgICAnTic6IENyZWF0ZVR5cGVkRmlsZUZyb21UZXh0OwogICAgICAnRic6IEZpbmRBbmRTd2FwV2l0aExhc3Q7CiAgICAgICdWJzogVmlld0ZpbGU7CiAgICAgICdFJzogRXhpdDsKICAgIGVsc2UKICAgICAgV3JpdGVsbign0J3QtdGCINGC0LDQutC+0Lkg0LrQvtC80LDQvdC00YsnKTsKICAgICAgV3JpdGUoJ1ByZXNzIEVOVEVSJyk7CiAgICAgIFJlYWRMbjsKICAgIGVuZDsKICB1bnRpbCBjaCA9ICdFJzsKZW5kLg==