Program printer;

var screen : array [0..76,0..76] of char;
    x,y    : integer;
    i,j    : integer;
    zacatek  : string [5];
    cap    : string [255];
    a,b,c,d : integer;
   ventil   : boolean; 

Procedure Printchar(kamx,kamy : integer; co: char); forward;

Procedure Draw_Line(x1,y1,x2,y2 : integer);
  Begin
    
    if (y2=y1) then if (x2>x1) then
      Begin
        for i:=x1 to x2 do Printchar(i,y1,'-');
        Exit;
      End else If (x2<x1) then Begin
                                 for i:=x2 to x1 do Printchar(i,y1,'-');
                                 Exit;
                               End;
  
    if (y2>y1) then if (x2=x1) then
        Begin
          for i:=y1 to y2 do Printchar(x1,i,'|');
          Exit;
        End else If (x2<x1) then Begin
                                   for i:=x2 to x1 do Printchar(i,y2-x2+i,'/');
                                   Exit;
                                 End Else
                                    Begin {x2>x1}
                                     for i:=x1 to x2 do Printchar(i,y1-x1+i,'\');
                                     Exit; 
                                    End;
   if (y2<y1) then if (x2=x1) then
        Begin
          for i:=y2 to y1 do Printchar(x1,i,'|');
          Exit;
        End else If (x2<x1) then Begin
                                   for i:=x2 to x1 do Printchar(i,y2+i-x2,'\');
                                   Exit;
                                 End Else
                                      Begin {x2>x1}
                                        for i:=x1 to x2 do Printchar(i,y1-i+x1,'/');
                                        Exit; 
                                      End;

                   
      
  End;

Procedure Printchar(kamx,kamy : integer; co : char);
Begin
  if screen[kamx,kamy]=' ' then Begin screen[kamx,kamy]:=co; Exit; End else
   if co = screen[kamx,kamy] then exit else
    if ((co='-')and(screen[kamx,kamy]='|')) or ((co='|')and(screen[kamx,kamy]='-'))
      or((co='-')and(screen[kamx,kamy]='+'))or((co='|')and(screen[kamx,kamy]='+'))then screen[kamx,kamy]:='+' else
      if ((co='/')and(screen[kamx,kamy]='\'))or((co='\')and(screen[kamx,kamy]='/'))
       or((co='/')and(screen[kamx,kamy]='x'))or((co='\')and(screen[kamx,kamy]='x'))then screen[kamx,kamy]:='x' else screen[kamx,kamy]:='*';

End;

Procedure Draw_Text(kamx,kamy : integer; co : string);
Begin
  for i:=kamx to kamx+Length(co)-1 do Printchar(i,kamy,co[i-kamx+1]);
End;

Procedure Draw_Point(kamx,kamy : integer);
Begin
 Printchar(kamx,kamy,'o');
End;

Procedure Clear(x1,y1,x2,y2 : integer);
var zx,zy,kx,ky : integer;
    i,j         : integer;
Begin
  zx:=x1;
  zy:=y1;
  kx:=x2;
  ky:=y2;

  if (x1 > x2) then Begin zx:=x2; kx:=x1; End;
  if (y1 > y2) then Begin zy:=y2; ky:=y1; End;

  For i:=zx to kx do
    For j:=zy to ky do
      screen[i,j]:=' ';
End;

Procedure Print_screen;
var i,j  : integer;
Begin
  for i:=1 to x do Begin screen[i,0]:='-'; screen[i,y+1]:='-'; End;
  for i:=1 to y do Begin screen[0,i]:='|'; screen[x+1,i]:='|'; End;
  screen[0,0]:='+';
  screen[0,y+1]:='+';
  screen[x+1,0]:='+';
  screen[x+1,y+1]:='+';


  For i:=0 to y+1 do
    For j:=0 to x+1 do
      if (j<>x+1) then write(screen[j,i]) else writeln(screen[j,i]);
End;


Begin {HP}


Repeat
   Readln(x,y);
   if (x=y) and (x=0) then Exit;
   for i:=0 to 76 do
    for j:=0 to 76 do
     screen[i,j]:=' ';

  Repeat
   ventil:=FALSE;
   Read(zacatek);
   Case zacatek[2] of
   'I'  : Begin Readln(a,b,c,d); Draw_line(a,b,c,d);  End;
   'E'  : Begin Readln(a,b,cap); Draw_Text(a,b,cap); End;
   'L'  : Begin Readln(a,b,c,d); Clear(a,b,c,d); End;
   'O'  : Begin Readln(a,b); Draw_Point(a,b); End;
   'R'  : Begin Readln; Print_screen; ventil:=TRUE; End;
   else Begin ventil:=TRUE; Exit; End;{novy obraz;}
   End;
  Until ventil;
Until 1=0; 

End.