Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/GAP/pkg/liealgdb/gap/slac/   (Algebra von RWTH Aachen Version 4.15.1©)  Datei vom 24.8.2025 mit Größe 177 kB image not shown  

Quellcode-Bibliothek slac.gi   Sprache: unbekannt

 
InstallMethod( SolvableLieAlgebra,  "for a field and a list", true,
   [ IsField, IsList ], 0, 

function( F, data )

   local d, no, a, b, S, L;

   if not Length( data ) >= 2 then 
      Error("<data> has to have length at least two"); 
   fi;
   if not IsPosInt( data[1] ) then
      Error("the first element of <data> has to be a positive integer");
   else
      d:= data[1];
      if not d in [1,2,3,4] then
         Error("the dimension has to be 1,2,3, or 4");
      fi;
   fi;
   no:= data[2];
   if d=1 then
       if no > 1 then
           Error( "the second element of <data> has to be <= 1" );
       fi;
   elif d=2 then
      if no > 2 then
         Error("the second element of <data> has to be <= 2");
      fi;
   elif d=3 then
      if no > 4 then
         Error("the second element of <data> has to be <= 4");
      fi;
   else
      if not no in [1..14] then
         Error("the second element of <data> has to be <= 14");
      fi;
    fi;
   if Length( data ) >=3 then
      a:= data[3];
   fi;
   if Length( data ) >= 4 then
      b:= data[4];
   fi;
   
   if d = 1 then
       S:= EmptySCTable( 1, Zero(F), "antisymmetric" );
       L := LieAlgebraByStructureConstants( F, S );
       L!.arg := data;
       return L;
   elif d = 2 then
      if no=1 then
         S:= EmptySCTable( 2, Zero(F), "antisymmetric" );
         L := LieAlgebraByStructureConstants( F, S );
         L!.arg := data;
         return L;
      else
         S:= EmptySCTable( 2, Zero(F), "antisymmetric" );
         SetEntrySCTable( S, 2, 1, [One(F),1] );
         L := LieAlgebraByStructureConstants( F, S );
         L!.arg := data;
         return L;
      fi;
   elif d=3 then
      if no=1 then
         S:= EmptySCTable( 3, Zero(F), "antisymmetric" );
         L := LieAlgebraByStructureConstants( F, S );
         L!.arg := data;
         return L;
      elif no=2 then
         S:= EmptySCTable( 3, Zero(F), "antisymmetric" );
         SetEntrySCTable( S, 3, 1, [One(F),1] );
         SetEntrySCTable( S, 3, 2, [One(F),2] );
         L := LieAlgebraByStructureConstants( F, S );
         L!.arg := data;
         return L;
      elif no=3 then
         S:= EmptySCTable( 3, Zero(F), "antisymmetric" );
         SetEntrySCTable( S, 3, 1, [One(F),2] );
         SetEntrySCTable( S, 3, 2, [a,1,One(F),2] );
         L := LieAlgebraByStructureConstants( F, S );     
         L!.arg := data;
         return L;
      else
         S:= EmptySCTable( 3, Zero(F), "antisymmetric" );
         SetEntrySCTable( S, 3, 1, [One(F),2] );
         SetEntrySCTable( S, 3, 2, [a,1] );
         L := LieAlgebraByStructureConstants( F, S );
         L!.arg := data;
         return L;
      fi;
   else
      if no=1 then
         S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
         L := LieAlgebraByStructureConstants( F, S );
         L!.arg := data;
         return L;
      elif no=2 then
           S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
           SetEntrySCTable( S, 4, 1, [One(F),1] );
           SetEntrySCTable( S, 4, 2, [One(F),2] );
           SetEntrySCTable( S, 4, 3, [One(F),3] );
           L := LieAlgebraByStructureConstants( F, S );   
           L!.arg := data;
           return L;
      elif no=3 then
           S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
           SetEntrySCTable( S, 4, 1, [One(F),1] );
           SetEntrySCTable( S, 4, 2, [One(F),3] );
           SetEntrySCTable( S, 4, 3, [-a,2,a+One(F),3] );
           L := LieAlgebraByStructureConstants( F, S );
           L!.arg := data;
           return L;
      elif no = 4 then
           S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
           SetEntrySCTable( S, 4, 2, [One(F),3] );
           SetEntrySCTable( S, 4, 3, [One(F),3] );
           L := LieAlgebraByStructureConstants( F, S );
           L!.arg := data;
           return L;
      elif no = 5 then
           S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
           SetEntrySCTable( S, 4, 2, [One(F),3] );
           L := LieAlgebraByStructureConstants( F, S );
           L!.arg := data;
           return L;
      elif no = 6 then
           S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
           SetEntrySCTable( S, 4, 1, [One(F),2] );
           SetEntrySCTable( S, 4, 2, [One(F),3] );
           SetEntrySCTable( S, 4, 3, [a,1,b,2,One(F),3] );
           L := LieAlgebraByStructureConstants( F, S );
           L!.arg := data;
           return L;
      elif no = 7 then
           S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
           SetEntrySCTable( S, 4, 1, [One(F),2] );
           SetEntrySCTable( S, 4, 2, [One(F),3] );
           SetEntrySCTable( S, 4, 3, [a,1,b,2] );
           L := LieAlgebraByStructureConstants( F, S );
           L!.arg := data;
           return L;
      elif no=8 then
           S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
           SetEntrySCTable( S, 1, 2, [One(F),2] );
           SetEntrySCTable( S, 3, 4, [One(F),4] );
           L := LieAlgebraByStructureConstants( F, S );
           L!.arg := data;
           return L;
      elif no=9 then
           S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
           SetEntrySCTable( S, 4, 1, [One(F),1,a,2] );
           SetEntrySCTable( S, 4, 2, [One(F),1] );
           SetEntrySCTable( S, 3, 1, [One(F),1] );
           SetEntrySCTable( S, 3, 2, [One(F),2] );
           L := LieAlgebraByStructureConstants( F, S );
           L!.arg := data;
           return L;
      elif no=10 then
           S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
           SetEntrySCTable( S, 4, 1, [One(F),2] );
           SetEntrySCTable( S, 4, 2, [a,1] );
           SetEntrySCTable( S, 3, 1, [One(F),1] );
           SetEntrySCTable( S, 3, 2, [One(F),2] );
           L := LieAlgebraByStructureConstants( F, S );
           L!.arg := data;
           return L;
      elif no=11 then
           if Characteristic(F) <> 2 then
              Error( "The characteristic of F has to be 2 for L4_11");
           fi;

           S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
           SetEntrySCTable( S, 4, 1, [One(F),1] );
           SetEntrySCTable( S, 4, 2, [b,2] );
           SetEntrySCTable( S, 4, 3, [One(F)+b,3] );
           SetEntrySCTable( S, 3, 1, [One(F),2] );
           SetEntrySCTable( S, 3, 2, [a,1] );
           L := LieAlgebraByStructureConstants( F, S );
           L!.arg := data;
           return L;
      elif no=12 then
           S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
           SetEntrySCTable( S, 4, 1, [One(F),1] );
           SetEntrySCTable( S, 4, 2, [2*One(F),2] );
           SetEntrySCTable( S, 4, 3, [One(F),3] );
           SetEntrySCTable( S, 3, 1, [One(F),2] );
           L := LieAlgebraByStructureConstants( F, S );
           L!.arg := data;
           return L;
      elif no=13 then
           S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
           SetEntrySCTable( S, 4, 1, [One(F),1,a,3] );
           SetEntrySCTable( S, 4, 2, [One(F),2] );
           SetEntrySCTable( S, 4, 3, [One(F),1] );
           SetEntrySCTable( S, 3, 1, [One(F),2] );
           L := LieAlgebraByStructureConstants( F, S );   
           L!.arg := data;
           return L;
      else
           S:= EmptySCTable( 4, Zero(F), "antisymmetric" );
           SetEntrySCTable( S, 4, 1, [a,3] );
           SetEntrySCTable( S, 4, 3, [One(F),1] );
           SetEntrySCTable( S, 3, 1, [One(F),2] );
           L := LieAlgebraByStructureConstants( F, S );
           L!.arg := data;
           return L;
      fi;
   fi;

end );

InstallMethod( NilpotentLieAlgebra,  "for a field and a list", true,
   [ IsField, IsList ], 0, 

function( F, data )

   local L, d, no, a, ff, arg,
         N1_1, N2_1, N3_1, N3_2, N4_1, N4_2, N4_3, N5_1, N5_2, N5_3, 
         N5_4, N5_5, N5_6, N5_7, N5_8, N5_9, N6_1, N6_2, N6_3, N6_4, 
         N6_5, N6_6, N6_7, N6_8, N6_9, N6_10, N6_11, N6_12, N6_13, N6_14, 
         N6_15, N6_16, N6_17, N6_18, N6_19, N6_20, N6_21, N6_22, N6_23, N6_24, 
         N6_25, N6_26, N6_27, N6_28, N6_29, N6_30, N6_31, N6_32, N6_33, N6_34, 
         N6_35, N6_36 ;

N1_1 := function( F )
    local T;
    T := EmptySCTable( 1, Zero(F), "antisymmetric" );
    return LieAlgebraByStructureConstants( F, T );
end;

N2_1 := function( F )
    local T;
    T := EmptySCTable( 2, Zero(F), "antisymmetric" );
    return LieAlgebraByStructureConstants( F, T );
end;

N3_1 := function( F )
    local T;
    T := EmptySCTable( 3, Zero(F), "antisymmetric" );
    return LieAlgebraByStructureConstants( F, T );
end;

N3_2 := function( F )
    local T;
    T := EmptySCTable( 3, Zero(F), "antisymmetric" );
    SetEntrySCTable( T, 1, 2, [1,3] );
    return LieAlgebraByStructureConstants( F, T );
end;

N4_1 := function( F )
    local T;
    T := EmptySCTable( 4, Zero(F), "antisymmetric" );
    return LieAlgebraByStructureConstants( F, T );
end;

N4_2 := function( F )
    local T;
    T := EmptySCTable( 4, Zero(F), "antisymmetric" );
    SetEntrySCTable( T, 1, 2, [1,3] );
    return LieAlgebraByStructureConstants( F, T );
end;

N4_3 := function( F )
    local T;
    T := EmptySCTable( 4, Zero(F), "antisymmetric" );
    SetEntrySCTable( T, 1, 2, [1,3] );
    SetEntrySCTable( T, 1, 3, [1,4] );
    return LieAlgebraByStructureConstants( F, T );
end;

N5_1:= function( F )

   local T;
   T:= EmptySCTable( 5, Zero(F), "antisymmetric" );
   return LieAlgebraByStructureConstants( F, T );

end;

N5_2:= function( F )

   local T;
   T:= EmptySCTable( 5, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   return LieAlgebraByStructureConstants( F, T );

end;

N5_3:= function( F )

   local T;
   T:= EmptySCTable( 5, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,4] );
   return LieAlgebraByStructureConstants( F, T );

end;

N5_4:= function( F )

   local T;
   T:= EmptySCTable( 5, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,5] );
   SetEntrySCTable( T, 3, 4, [1,5] );
   return LieAlgebraByStructureConstants( F, T );

end;

N5_5:= function( F )

   local T;
   T:= EmptySCTable( 5, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,5] );
   SetEntrySCTable( T, 2, 4, [1,5] );
   return LieAlgebraByStructureConstants( F, T );

end;

N5_6:= function( F )

   local T;
   T:= EmptySCTable( 5, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,4] );
   SetEntrySCTable( T, 1, 4, [1,5] );
   SetEntrySCTable( T, 2, 3, [1,5] );
   return LieAlgebraByStructureConstants( F, T );

end;

N5_7:= function( F )

   local T;
   T:= EmptySCTable( 5, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,4] );
   SetEntrySCTable( T, 1, 4, [1,5] );
   return LieAlgebraByStructureConstants( F, T );

end;

N5_8:= function( F )

   local T;
   T:= EmptySCTable( 5, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,4] );
   SetEntrySCTable( T, 1, 3, [1,5] );
   return LieAlgebraByStructureConstants( F, T );

end;

N5_9:= function( F )

   local T;
   T:= EmptySCTable( 5, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,4] );
   SetEntrySCTable( T, 2, 3, [1,5] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_1:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_2:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_3:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,4] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_4:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,5] );
   SetEntrySCTable( T, 3, 4, [1,5] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_5:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,5] );
   SetEntrySCTable( T, 2, 4, [1,5] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_6:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,4] );
   SetEntrySCTable( T, 1, 4, [1,5] );
   SetEntrySCTable( T, 2, 3, [1,5] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_7:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,4] );
   SetEntrySCTable( T, 1, 4, [1,5] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_8:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,4] );
   SetEntrySCTable( T, 1, 3, [1,5] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_9:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,4] );
   SetEntrySCTable( T, 2, 3, [1,5] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_10:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,6] );
   SetEntrySCTable( T, 4, 5, [1,6] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_11:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,4] );
   SetEntrySCTable( T, 1, 4, [1,6] );
   SetEntrySCTable( T, 2, 3, [1,6] );
   SetEntrySCTable( T, 2, 5, [1,6] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_12:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,4] );
   SetEntrySCTable( T, 1, 4, [1,6] );
   SetEntrySCTable( T, 2, 5, [1,6] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_13:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,5] );
   SetEntrySCTable( T, 1, 5, [1,6] );
   SetEntrySCTable( T, 2, 4, [1,5] );
   SetEntrySCTable( T, 3, 4, [1,6] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_14:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,4] );
   SetEntrySCTable( T, 1, 4, [1,5] );
   SetEntrySCTable( T, 2, 3, [1,5] );
   SetEntrySCTable( T, 2, 5, [1,6] );
   SetEntrySCTable( T, 3, 4, [-1,6] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_15:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,4] );
   SetEntrySCTable( T, 1, 4, [1,5] );
   SetEntrySCTable( T, 1, 5, [1,6] );
   SetEntrySCTable( T, 2, 3, [1,5] );
   SetEntrySCTable( T, 2, 4, [1,6] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_16:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,4] );
   SetEntrySCTable( T, 1, 4, [1,5] );
   SetEntrySCTable( T, 2, 5, [1,6] );
   SetEntrySCTable( T, 3, 4, [-1,6] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_17:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,4] );
   SetEntrySCTable( T, 1, 4, [1,5] );
   SetEntrySCTable( T, 1, 5, [1,6] );
   SetEntrySCTable( T, 2, 3, [1,6] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_18:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,4] );
   SetEntrySCTable( T, 1, 4, [1,5] );
   SetEntrySCTable( T, 1, 5, [1,6] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_19:= function( F, a )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,4] );
   SetEntrySCTable( T, 1, 3, [1,5] );
   SetEntrySCTable( T, 1, 5, [1,6] );
   SetEntrySCTable( T, 2, 4, [1,6] );
   SetEntrySCTable( T, 3, 5, [a,6] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_20:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,4] );
   SetEntrySCTable( T, 1, 3, [1,5] );
   SetEntrySCTable( T, 1, 5, [1,6] );
   SetEntrySCTable( T, 2, 4, [1,6] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_21:= function( F, a )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,4] );
   SetEntrySCTable( T, 1, 4, [1,6] );
   SetEntrySCTable( T, 2, 3, [1,5] );
   SetEntrySCTable( T, 2, 5, [a,6] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_22:= function( F, a )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,5] );
   SetEntrySCTable( T, 1, 3, [1,6] );
   SetEntrySCTable( T, 2, 4, [a,6] );
   SetEntrySCTable( T, 3, 4, [1,5] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_23:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,5] );
   SetEntrySCTable( T, 1, 4, [1,6] );
   SetEntrySCTable( T, 2, 4, [1,5] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_24:= function( F, a )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,5] );
   SetEntrySCTable( T, 1, 4, [a,6] );
   SetEntrySCTable( T, 2, 3, [1,6] );
   SetEntrySCTable( T, 2, 4, [1,5] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_25:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,5] );
   SetEntrySCTable( T, 1, 4, [1,6] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_26:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,4] );
   SetEntrySCTable( T, 1, 3, [1,5] );
   SetEntrySCTable( T, 2, 3, [1,6] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_27:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,5] );
   SetEntrySCTable( T, 2, 4, [1,6] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_28:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,4] );
   SetEntrySCTable( T, 1, 4, [1,5] );
   SetEntrySCTable( T, 2, 3, [1,6] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_29:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,5] );
   SetEntrySCTable( T, 1, 5, [1,6] );
   SetEntrySCTable( T, 2, 4, [1,5,1,6] );
   SetEntrySCTable( T, 3, 4, [1,6] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_30:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,4] );
   SetEntrySCTable( T, 1, 4, [1,5] );
   SetEntrySCTable( T, 1, 5, [1,6] );
   SetEntrySCTable( T, 2, 3, [1,5,1,6] );
   SetEntrySCTable( T, 2, 4, [1,6] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_31:= function( F, a )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,4] );
   SetEntrySCTable( T, 1, 4, [1,5] );
   SetEntrySCTable( T, 2, 3, [1,5,a,6] );
   SetEntrySCTable( T, 2, 5, [1,6] );
   SetEntrySCTable( T, 3, 4, [1,6] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_32:= function( F, a )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,4] );
   SetEntrySCTable( T, 1, 4, [1,5] );
   SetEntrySCTable( T, 2, 3, [a,6] );
   SetEntrySCTable( T, 2, 5, [1,6] );
   SetEntrySCTable( T, 3, 4, [1,6] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_33:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,4] );
   SetEntrySCTable( T, 1, 3, [1,5] );
   SetEntrySCTable( T, 2, 5, [1,6] );
   SetEntrySCTable( T, 3, 4, [1,6] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_34:= function( F )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,4] );
   SetEntrySCTable( T, 1, 5, [1,6] );
   SetEntrySCTable( T, 2, 3, [1,5] );
   SetEntrySCTable( T, 2, 4, [1,6] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_35:= function( F, a )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,5] );
   SetEntrySCTable( T, 1, 3, [1,6] );
   SetEntrySCTable( T, 2, 4, [a,6] );
   SetEntrySCTable( T, 3, 4, [1,5,1,6] );
   return LieAlgebraByStructureConstants( F, T );

end;

N6_36:= function( F, a )

   local T;
   T:= EmptySCTable( 6, Zero(F), "antisymmetric" );
   SetEntrySCTable( T, 1, 2, [1,3] );
   SetEntrySCTable( T, 1, 3, [1,5] );
   SetEntrySCTable( T, 1, 4, [a,6] );
   SetEntrySCTable( T, 2, 3, [1,6] );
   SetEntrySCTable( T, 2, 4, [1,5,1,6] );
   return LieAlgebraByStructureConstants( F, T );

end;

   if not Length( data ) >= 2 then 
      Error("<data> has to have length at least two"); 
   fi;
   if not IsPosInt( data[1] ) then
      Error("the first element of <data> has to be a positive integer");
   else
      d:= data[1];
      if not d in [1,2,3,4,5,6] then
         Error("the dimension has to be an integer from 1 to 6");
      fi;
   fi;
   no:= data[2];
   if d=1 then
       if no > 1 then
           Error( "the second element of <data> has to be <= 1" );
       fi;
   elif d=2 then
       if no > 1 then
           Error( "the second element of <data> has to be <= 1" );
       fi;
   elif d=3 then
       if no > 2 then
           Error( "the second element of <data> has to be <= 2" );
       fi;
   elif d=4 then
       if no > 3 then
           Error( "the second element of <data> has to be <= 3" );
       fi;
   elif d=5 then
       if no > 9 then
           Error("the second element of <data> has to be <= 9");
       fi;
   else
       if no > 36  then
           Error("the second element of <data> has to be <= 36");
       fi;
   fi;

   if Length( data ) >= 3 then a:= data[3]; fi;
   
   if d = 1 then
       ff := [N1_1];
       L := CallFuncList( ff[no], [ F ] );
       L!.arg := data;
       return L;
   elif d = 2 then
       ff := [N2_1];
       L := CallFuncList( ff[no], [ F ] );
       L!.arg := data;
       return L;
   elif d = 3 then
       ff := [N3_1,N3_2];
       L := CallFuncList( ff[no], [ F ] );
       L!.arg := data;
       return L;
  elif d = 4 then
       ff := [N4_1,N4_2,N4_3];
       L := CallFuncList( ff[no], [ F ] );
       L!.arg := data;
       return L;
   elif d = 5 then
      ff:= [ N5_1, N5_2, N5_3, N5_4, N5_5, N5_6, N5_7, N5_8, N5_9 ];
      L := CallFuncList( ff[no], [ F ] );
      L!.arg := data;
      return L;
  else
      ff:= [ N6_1, N6_2, N6_3, N6_4, N6_5, N6_6, N6_7, N6_8, N6_9, N6_10,
             N6_11, N6_12, N6_13, N6_14, N6_15, N6_16, N6_17, N6_18, N6_19,
             N6_20, N6_21, N6_22, N6_23, N6_24, N6_25, N6_26, N6_27, N6_28,
             N6_29, N6_30, N6_31, N6_32, N6_33, N6_34, N6_35, N6_36];
      if no in [19,21,22,24,31,32,35,36] then
         arg:= [F,a];
      else
         arg:= [F];
      fi;
      L := CallFuncList( ff[no], arg );
      L!.arg := data;
      return L;
   fi;
         
end );

BindGlobal("LieAlgDBHelper", rec());

LieAlgDBHelper.isomN:= function( L, x1, x2, x3, x4 )

      # Here the xi satisfy the commutation relations of N;
      # we produce the isomorphism with M_0^13...

      local F, y1, y2, y3, y4, name, K, f;

      F:= LeftActingDomain( L );

      if Characteristic(F) <> 3 then
         y1:= x1+x2;
         y2:= 3*x1-(3/2*One(F))*x2;
         y3:= x1+x2-x3+2*x4;
         y4:= x3;
      else
         y1:= x2;
         y2:= x1+x2;
         y3:= x1-x2+x3+x4;
         y4:= x1-x2+x3;
      fi;
      name:= "L4_13( ";
      Append( name, LieAlgDBField2String( F ) );
      Append( name, ", " );
      Append( name, String( Zero(F) ) );
      Append( name, " )" );
      K:= SolvableLieAlgebra( F, [4,13, Zero(F)] );
      f:= AlgebraHomomorphismByImages(K,L,Basis(K),[y1,y2,y3,y4]);
      return rec( name:= [ name, [ Zero(F) ] ], isom:= f );

end;

LieAlgDBHelper.isomM9:= function( L, x1, x2, x3, x4, a )

      # The xi satisfy the commutation rules of M9a; we return 
      # the isomorphism with either N, M8 or M9a

      local F, T, pol, facs, dd, id, f, name, K, c, exp, prim, ef, b, q, i;

      F:= LeftActingDomain( L );

      if Characteristic(F) <> 2 and a = (-1/4)*One(F) then

         return LieAlgDBHelper.isomN( L, x1, x2, x3, x4 );

      fi;

      T:= Indeterminate( F);
      pol:= T^2-T-a;
      facs:= Factors( pol );

      if Length( facs ) = 2 then
         #direct sum...
         dd:= DirectSumDecomposition( L );
         id:= LieAlgebraIdentification( dd[1] );
         f:= id.isomorphism;
         x1:= Image( f, Basis( Source(f) )[2] );
         x2:= Image( f, Basis( Source(f) )[1] );
         id:= LieAlgebraIdentification( dd[2] );
         f:= id.isomorphism;
         x3:= Image( f, Basis( Source(f) )[2] );
         x4:= Image( f, Basis( Source(f) )[1] );
         name:= "L4_8( ";
         Append( name, LieAlgDBField2String( F ) );
         Append( name, " )" );
         K:= SolvableLieAlgebra( F, [4,8] );
         f:= AlgebraHomomorphismByImages(K,L,Basis(K),[x1,x2,x3,x4]);
         return rec( name:= [ name, [] ], isom:= f );     
      else

         if HasIsFinite(F) and IsFinite(F) then
            # for M9 we let b be the smallest power of the primitive root
            # such that T^2-T-b has no roots in F
            q:= Size( F );
            prim:= PrimitiveRoot( F );
            for i in [1..q-1] do
                if Length(Factors( T^2-T-prim^i ) ) = 1 then
                   b:= prim^i;
                   break;
                fi;
            od;
            
            if Characteristic(F) > 2 then
               c:= (b+One(F)/4)/(a+One(F)/4);
               exp:= LogFFE( c, PrimitiveRoot(F) );
               c:= PrimitiveRoot(F)^(exp/2);
               x1:= c*x1+((One(F)-c)/2)*x2;
               x4:= ((One(F)-c)/2)*x3+c*x4;
            else
               facs:= Factors( T^2+T+a+b );
               ef:= ExtRepPolynomialRatFun( facs[1] );
               if Length( ef[1] ) = 0 then
                  c:= -ef[2];
               else
                  c:= Zero( F );
               fi;
               x1:= x1+c*x2;
               x4:= c*x3+x4;
            fi;
         else
            b:= a;
         fi;
         name:= "L4_9( ";
         Append( name, LieAlgDBField2String( F ) );
         Append( name, ", " );
         Append( name, String( b ) );
         Append( name, " )" );
         K:= SolvableLieAlgebra( F, [4,9, b] );
         f:= AlgebraHomomorphismByImages(K,L,Basis(K),[x1,x2,x3,x4]);
         return rec( name:= [ name, [ b ] ], isom:= f );
      fi;

end;

LieAlgDBHelper.isomM10:= function( L, x1, x2, x3, x4, a )

      # the xi satisfy the commutation rels of M10(a)

      local f, b, y1, y2, y3, y4, name, K, F;

      F:= LeftActingDomain( L );
      if HasIsFinite(F) and IsFinite(F) then
         f:= Inverse( FrobeniusAutomorphism(F) );
         b:= Image( f, a );
         y1:= x1;
         y2:= b*x1+x2;
         y3:= x3;
         y4:= b*x3+x4;
         name:= "L4_13( ";
         Append( name, LieAlgDBField2String( F ) );
         Append( name, ", " );
         Append( name, String( Zero(F) ) );
         Append( name, " )" );
         K:= SolvableLieAlgebra( F, [4,13, Zero(F)] );
         f:= AlgebraHomomorphismByImages(K,L,Basis(K),
                                       [y1,y2,y1+y2+y4,y1+y2+y3]);
         return rec( name:= [ name, [Zero(F)] ], isom:= f );
      else
         name:= "L4_10( ";
         Append( name, LieAlgDBField2String( F ) );
         Append( name, ", " );
         Append( name, String( a ) );
         Append( name, " )" );
         K:= SolvableLieAlgebra( F, [4,10, a] );
         f:= AlgebraHomomorphismByImages(K,L,Basis(K),[x1,x2,x3,x4]);
         return rec( name:= [ name, [a] ], isom:= f );
      fi;
end;

LieAlgDBHelper.isomM11:= function( L, x1, x2, x3, x4, a, b )

      local name, K, f, gam, eps, del, y1, y2, y3, y4, F;

      F:= LeftActingDomain(L);
                  
      if b = Zero(F) then
         name:= "L4_11( ";
         Append( name, LieAlgDBField2String( F ) );
         Append( name, ", " );
         Append( name, String( a ) );
         Append( name, ", " );
         Append( name, String( b ) );
         Append( name, " )" );
         K:= SolvableLieAlgebra( F, [4,11,a, b] );
         f:= AlgebraHomomorphismByImages(K,L,Basis(K),[x1,x2,x3,x4]);
         return rec( name:= [ name, [a,b] ], isom:= f );
      elif HasIsFinite(F) and IsFinite(F) then
         f:= Inverse( FrobeniusAutomorphism(F) );
         gam:= Image( f, b/(a*(b^2+One(F))) );
         eps:= Image( f, 1/a );
         del:= 1/(1+b);
         y1:= a*gam*x1+b*del*x2;
         y2:= a*eps*b*del*x1+a*gam*eps*x2;
         y3:= eps*x3;
         y4:= gam*x3+del*x4;
         name:= "L4_11( ";
         Append( name, LieAlgDBField2String( F ) );
         Append( name, ", " );
         Append( name, String( One(F) ) );
         Append( name, ", " );
         Append( name, String( Zero(F) ) );
         Append( name, " )" );
         K:= SolvableLieAlgebra( F, [4,11, One(F), Zero(F)] );
         f:= AlgebraHomomorphismByImages(K,L,Basis(K),[y1,y2,y3,y4]);
         return rec( name:= [ name, [One(F),Zero(F)] ],isom:= f);
      else 
         name:= "L4_11( ";
         Append( name, LieAlgDBField2String( F ) );
         Append( name, ", " );
         Append( name, String( a ) );
         Append( name, ", " );
         Append( name, String( b ) );
         Append( name, " )" );
         K:= SolvableLieAlgebra( F, [4,11, a, b] );
         f:= AlgebraHomomorphismByImages(K,L,Basis(K),[x1,x2,x3,x4]);
         return rec( name:= [ name, [a,b] ], isom:= f );
      fi;     
end;

LieAlgDBHelper.solv_type:= function( L )

     local n, F, sp, k, BL, b, x1, x2, x3, x4, c1, c2, K, f, name, par, 
           id, num, c3, c4, mat, is_diag, i, j, facs, ev, s, t, sol, 
           sevec, tevec, cfs, u, v, w, found, y1, y2, y3, y4,  u1, u3, 
           v1, v3, a, D, adM, adK, dd, bK, b_adK, ef, ev1, ev2, mp, q, C, 
           R, exp;

     n:= Dimension( L );
     F:= LeftActingDomain( L );
     sp:= LieDerivedSubalgebra( L );

     k:= 1;
     BL:= Basis( L );
     while Dimension( sp ) < n-1 do
         if not BL[k] in sp then
            b:= ShallowCopy( BasisVectors( Basis(sp) ) );
            Add( b, BL[k] );
            sp:= Subspace( L, b );
         fi;
         k:= k+1;
     od;

     b:= Basis( sp );

     if n = 2 then

        x1:= b[1];
        for k in [1,2] do
            if not BL[k] in sp then
               x2:= BL[k];
               break;
            fi;
        od;
        
        if x1*x2 = Zero(L) then
           name:= "L2_1( ";
           Append( name, LieAlgDBField2String( F ) );
           Append( name, " )" );
           K:= SolvableLieAlgebra( F, [2,1] );
           f:= AlgebraHomomorphismByImages( K, L, Basis(K), Basis(L) );
           return rec( name:= [ name, [] ], isom:= f );
        fi;

        c1:= Coefficients( b, x2*x1 );
        x2:= x2/c1[1];
        name:= "L2_2( ";
        Append( name, LieAlgDBField2String( F ) );
        Append( name, " )" );
        K:= SolvableLieAlgebra( F, [2,2] );
        f:= AlgebraHomomorphismByImages( K, L, Basis(K), [x1,x2] );
        return rec( name:= [ name, [] ], isom:= f );

     elif n = 3 then

        x1:= b[1]; x2:= b[2];
        if x1*x2 <> Zero(L) then
           # Here [L,L] has dimension 1, and its centralizer
           # has dimension 2, and it contains [L,L].
           sp:= LieCentralizer( L, LieDerivedSubalgebra(L) );
           b:= Basis( sp );
           x1:= Basis(sp)[1];
           x2:= Basis(sp)[2];
        fi;

        for k in [1..3] do
            if not BL[k] in sp then
               x3:= BL[k];
               break;
            fi;
        od;

        if x1*x3 = Zero(L) and x2*x3 = Zero(L) then
           # Abelian!
           name:= "L3_1( ";
           Append( name, LieAlgDBField2String( F ) );
           Append( name, " )" );
           K:= SolvableLieAlgebra( F, [3,1] );
           f:= AlgebraHomomorphismByImages( K, L, Basis(K), Basis(L) );
           return rec( name:= [ name, [] ], isom:= f );
        fi;

        c1:= Coefficients( b, x3*x1 );
        c2:= Coefficients( b, x3*x2 );

        if c1[1] = c2[2] and c1[2] = Zero(F) and c2[1] = Zero(F) then
           x3:= x3/c1[1];
           name:= "L3_2( ";
           Append( name, LieAlgDBField2String( F ) );
           Append( name, " )" );
           K:= SolvableLieAlgebra( F, [3,2] );
           f:= AlgebraHomomorphismByImages( K, L, Basis(K), [x1,x2,x3] );
           return rec( name:= [ name, [] ], isom:= f );
        fi;

        if c1[2] = Zero(F) then
           # i.e., x1 is an eigenvector of ad x3, not good.
           if c2[1] = Zero(F) then
              # x2 is an eigenvector as well, so x1+x2 cannot be
              # (by previous case)...
              x1:= x1+x2;
           else
              x1:=  x2;
           fi;
        fi;

        x2:= x3*x1;
        b:= Basis( Subspace( L, [x1,x2] ), [x1,x2] );
        c2:= Coefficients( b, x3*x2 );

        if c2[2] <> Zero(F) then
           x2:= x2/c2[2];
           x3:= x3/c2[2];
           par:= c2[1]/(c2[2]^2);
           name:= "L3_3( ";
           Append( name, LieAlgDBField2String( F ) );
           Append( name, ", " );
           Append( name, String( par ) );
           Append( name, " )" );
           K:= SolvableLieAlgebra( F, [3,3,par] );
           f:= AlgebraHomomorphismByImages( K, L, Basis(K), [x1,x2,x3] );
           return rec( name:= [ name, [par] ], isom:= f );
        fi;

        par:= c2[1];
        if HasIsFinite(F) and IsFinite(F) and not par in [Zero(F),One(F)] then
           if Characteristic(F) = 2 then
              f:= Inverse( FrobeniusAutomorphism( F ) );
              a:= Image( f, par );
              x2:= a*x2;
              x3:= a*x3;
              par:= a^2*par;
           else
              exp:= LogFFE( 1/par, PrimitiveRoot(F) );
              if IsEvenInt( exp ) then 
                 a:= PrimitiveRoot(F)^(exp/2);
                 x2:= a*x2;
                 x3:= a*x3;
                 par:= a^2*par;
              else
                 exp:= LogFFE( PrimitiveRoot(F)/par, PrimitiveRoot(F) );
                 a:= PrimitiveRoot(F)^(exp/2);
                 x2:= a*x2;
                 x3:= a*x3;
                 par:= a^2*par;
              fi;
           fi;
        fi;
        name:= "L3_4( ";
        Append( name, LieAlgDBField2String( F ) );
        Append( name, ", " );
        Append( name, String( par ) );
        Append( name, " )" );
        K:= SolvableLieAlgebra( F, [3,4,par] );
        f:= AlgebraHomomorphismByImages( K, L, Basis(K), [x1,x2,x3] );
        return rec( name:= [ name, [par] ], isom:= f );

     elif n = 4 then
        x1:= b[1]; x2:= b[2]; x3:= b[3];
        for k in [1..4] do
            if not BL[k] in sp then
               x4:= BL[k];
               break;
            fi;
        od;
        K:= Subalgebra(  L, [x1,x2,x3] );
        adM:= List( Basis(K), x -> AdjointMatrix(Basis(K),x ) );
        adK:= MutableBasis( F, [ 0*adM[1] ] );
        bK:= [ ];
        b_adK:= [ ];
        for i in [1..Length(adM)] do
            if not IsContainedInSpan( adK, adM[i] ) then
               CloseMutableBasis( adK, adM[i] );
               Add( bK, Basis(K)[i] );
               Add( b_adK, adM[i] );
            fi;
        od;

        
        adK:= VectorSpace( F, b_adK, 0*adM[1] );

        mat:= List( Basis(K), x -> Coefficients( Basis(K), x4*x ) );
        mat:= TransposedMat( mat );
        if mat in adK then
           c1:= Coefficients( Basis( adK, b_adK ), mat );
           if c1 = [ ] then # L is abelian
              name:= "L4_1( ";
              Append( name, LieAlgDBField2String( F ) );
              Append( name, " )" );
              K:= SolvableLieAlgebra( F, [4,1] );
              f:= AlgebraHomomorphismByImages( K, L, Basis(K), Basis(L) );
              return rec( name:= [ name, [] ], isom:= f );
           else  
              x3:= x4 - LinearCombination( c1, bK );
              id:= LieAlgebraIdentification( K );
              x4:= Image( id.isomorphism, Basis( Source( id.isomorphism ) )[3] );
              x1:= Image( id.isomorphism, Basis( Source( id.isomorphism ) )[1] );
              x2:= Image( id.isomorphism, Basis( Source( id.isomorphism ) )[2] );
              K:= Subalgebra(  L, [x1,x2,x3] );
           fi;
        fi;

        id:= LieAlgebraIdentification( K );
        x1:= Image( id.isomorphism, Basis( Source( id.isomorphism ) )[1] );
        x2:= Image( id.isomorphism, Basis( Source( id.isomorphism ) )[2] );
        x3:= Image( id.isomorphism, Basis( Source( id.isomorphism ) )[3] );
        b:= Basis( K, [x1,x2,x3] );
        c1:= Coefficients( b, x4*x1 );
        c2:= Coefficients( b, x4*x2 );
        c3:= Coefficients( b, x4*x3 );
        mat:= [ c1, c2, c3 ];
        num:= id.name[4];

        if num = '1' then

           # K is abelian

           R:= PolynomialRing( F, 1 );
           mat:= TransposedMat( mat );
           mp:= MinimalPolynomial( F, mat );
           is_diag:= true;
           for i in [1..3] do
               if not is_diag then break; fi;
               for j in [1..3] do
                   if not is_diag then break; fi;
                   if i <> j and mat[i][j] <> Zero(F) then 
                      is_diag:= false;
                   fi;
               od;
           od;
 
           if Degree(mp) = 1 then
              if c1[1] = Zero(F) then           
                 name:= "L4_1( ";
                 Append( name, LieAlgDBField2String( F ) );
                 Append( name, " )" );
                 K:= SolvableLieAlgebra( F, [4,1] );
                 f:= AlgebraHomomorphismByImages( K, L, Basis(K), Basis(L) );
                 return rec( name:= [ name, [] ], isom:= f );                 
              else
                 x4:= x4/c1[1];
                 name:= "L4_2( ";
                 Append( name, LieAlgDBField2String( F ) );
                 Append( name, " )" );
                 K:= SolvableLieAlgebra( F, [4,2] );
                 f:= AlgebraHomomorphismByImages(K,L,Basis(K),[x1,x2,x3,x4]);
                 return rec( name:= [ name, [] ], isom:= f );
              fi;
           fi;

           if Degree(mp) = 2 then

              # compute rational canonical form; rather clumsy algorithm
              # which however works for the 3x3 case. 

              facs:= Factors( R, mp );
              ev:= [ ];
              for f in facs do
                  ef:= ExtRepPolynomialRatFun( f );
                  if Length( ef[1] ) = 0 then
                     Add( ev, -ef[2] );
                  else
                     Add( ev, Zero( F ) );
                  fi;
              od; 

              if ev[1] <> ev[2] then

                 sol:= NullspaceMat( TransposedMat(mat) -
                                                ev[1]*IdentityMat( 3, F ) );
                 ev1:= List( sol, x -> LinearCombination( x, [x1,x2,x3] ) );
                 sol:= NullspaceMat( TransposedMat(mat) -
                                                ev[2]*IdentityMat( 3, F ) );
                 ev2:= List( sol, x -> LinearCombination( x, [x1,x2,x3] ) );
                 if Length( ev1 ) = 2 then
                    x1:= ev1[1];
                    x2:= ev1[2] + ev2[1];
                    x3:= x4*x2;
                    s:= ev[1]; t:= ev[2];
                 else
                    x1:= ev2[1];
                    x2:= ev2[2] + ev1[1];
                    x3:= x4*x2;
                    s:= ev[2]; t:= ev[1];
                 fi;
              else
                 s:= ev[1]; t:= s;
                 sol:= NullspaceMat( TransposedMat(mat) -
                                                ev[1]*IdentityMat( 3, F ) );
                 ev1:= List( sol, x -> LinearCombination( x, [x1,x2,x3] ) );
                 sp:= Subspace( L, ev1 );
                 if not x1 in sp then
                    x2:= x1;
                 elif not x3 in sp then
                    x2:= x3;
                 fi;
                 x3:= x4*x2;
                 sp:= Subspace( L, [x2,x3] );
                 if not ev1[1] in sp then
                    x1:= ev1[1];
                 else
                    x1:= ev1[2];
                 fi; 
              fi;

              if s <> Zero(F) then
                 x3:= x3/s;
                 x4:= x4/s;
                 name:= "L4_3( ";
                 Append( name, LieAlgDBField2String( F ) );
                 Append( name, ", " );
                 Append( name, String( t/s ) );
                 Append( name, " )" );
                 K:= SolvableLieAlgebra( F, [4,3,t/s] );
                 f:= AlgebraHomomorphismByImages(K,L,Basis(K),
                                                      [x1,x2,x3,x4]);
                 return rec( name:= [ name, [t/s] ], isom:= f );
              elif t <> Zero(F) then
                 x3:= x3/t;
                 x4:= x4/t;
                 name:= "L4_4( ";
                 Append( name, LieAlgDBField2String( F ) );
                 Append( name, " )" );
                 K:= SolvableLieAlgebra( F, [4,4] );
                 f:= AlgebraHomomorphismByImages(K,L,Basis(K),
                                                     [x1,x2,x3,x4]);
                 return rec( name:= [ name, [] ], isom:= f );
              else
                 name:= "L4_5( ";
                 Append( name, LieAlgDBField2String( F ) );
                 Append( name, " )" );
                 K:= SolvableLieAlgebra( F, [4,5] );
                 f:= AlgebraHomomorphismByImages(K,L,Basis(K),
                                                      [x1,x2,x3,x4]);
                 return rec( name:= [ name, [] ], isom:= f );
              fi;
           fi;      

           # look for a cyclic vector...
           # we take a random element, maybe better algorithm needed...
           if IsFinite(F) then
              cfs:= List( [1..10], x -> PrimitiveRoot(F)^x );
           else
              cfs:= List( [1..10], x -> x*One(F) );
           fi;
           Add( cfs, Zero(F) );
           found:= false;
           while not found do
               u:= Random(cfs)*x1+Random(cfs)*x2+Random(cfs)*x3;
               v:= x4*u;
               w:= x4*v;
               sp:= Subspace( L, [u,v,w] );
               if Dimension(sp) = 3 then found:= true; fi;
           od;
           x1:= u; x2:= v; x3:= w;
           b:= Basis( sp, [x1,x2,x3] );
           c1:= Coefficients( b, x4*x3 );
           if c1[3] <> Zero(F) then
              x2:= x2/c1[3];
              x3:= x3/(c1[3]^2);
              x4:= x4/c1[3];
              name:= "L4_6( ";
              Append( name, LieAlgDBField2String( F ) );
              Append( name, ", " );
              Append( name, String( c1[1]/(c1[3]^3) ) );
              Append( name, ", ");
              Append( name, String( c1[2]/(c1[3]^2) ) );
              Append( name, " )" );
              K:= SolvableLieAlgebra( F, [4,6, c1[1]/(c1[3]^3), c1[2]/(c1[3]^2) ] );
              f:= AlgebraHomomorphismByImages(K,L,Basis(K),[x1,x2,x3,x4]);
              return rec( name:= [ name, [c1[1]/(c1[3]^3), c1[2]/(c1[3]^2)] ], 
                          isom:= f );
           else
              if c1[1] <> Zero(F) and c1[2] <> Zero(F) then
                 s:= c1[2]/c1[1];
                 x2:= x2*s;
                 x3:= x3*s^2;
                 x4:= x4*s;
                 t:= s^2*c1[2];
                 name:= "L4_7( ";
                 Append( name, LieAlgDBField2String( F ) );
                 Append( name, ", " );
                 Append( name, String( t ) );
                 Append( name, ", ");
                 Append( name, String( t ) );
                 Append( name, " )" );
                 K:= SolvableLieAlgebra( F, [4,7, t, t] );
                 f:= AlgebraHomomorphismByImages(K,L,Basis(K),[x1,x2,x3,x4]);
                 return rec( name:= [ name, [t,t] ], isom:= f );
              else

                 if HasIsFinite(F) and IsFinite(F) then
                    q:= Size(F);
                    if c1[1] <> Zero(F) then
                       par:= c1[1];
                       a:= PrimitiveRoot(F);
                       if q mod 6 = 1 or q mod 6 = 4 then
                          exp:= LogFFE( par, a );
                          b:= One(F);
                          if exp mod 3 <> 0 then
                             exp:= LogFFE( par/a, a );
                             b:= a;
                             if exp mod 3 <> 0 then
                                exp:= LogFFE( par/(a^2), a );
                                b:= a^2;
                             fi; 
                          fi;
                          a:= a^(exp/3);
                       else
                          exp:= LogFFE( par, a );
                          if exp mod 3 = 1 then
                             for b in F do
                                 if b^3 = a then
                                    a:= a^((exp-1)/3)*b;
                                    break;
                                 fi;
                             od;
                          elif exp mod 3 = 2 then
                            for b in F do
                                 if b^3 = a^2 then
                                    a:= a^((exp-2)/3)*b;
                                    break;
                                 fi;
                             od;
                          else
                             a:= a^(exp/3);
                          fi;
                          b:= One(F);
                       fi;
                       c1:= [ b, Zero(F) ]; 
                    elif c1[2] <> Zero(F) then     
                       par:= c1[2];
                       a:= PrimitiveRoot(F);
                       if IsEvenInt( q ) then
                          exp:= LogFFE( par, a );
                          if exp mod 2 = 1 then
                             a:= a^((exp-1)/2)*a^(q/2);
                          else
                             a:= a^(exp/2);
                          fi;
                          b:= One(F);
                       else
                          exp:= LogFFE( par, a );
                          b:= One(F);
                          if not IsEvenInt( exp ) then
                             exp:= LogFFE( par/a, a );
                             b:= a;
                          fi;
                          a:= a^(exp/2);
                       fi;
                       c1:= [ Zero(F), b ]; 
                    else
                       a:= One(F);
                    fi;
                    x2:= x2/a;
                    x3:= x3/(a^2);
                    x4:= x4/a;
                 fi;
                 name:= "L4_7( ";
                 Append( name, LieAlgDBField2String( F ) );
                 Append( name, ", " );
                 Append( name, String( c1[1] ) );
                 Append( name, ", ");
                 Append( name, String( c1[2] ) );
                 Append( name, " )" );
                 K:= SolvableLieAlgebra( F, [4,7, c1[1], c1[2] ] );
                 f:= AlgebraHomomorphismByImages(K,L,Basis(K),[x1,x2,x3,x4]);
                 return rec( name:= [ name, [c1[1],c1[2]] ], isom:= f );
              fi;
           fi;
        elif num = '2' then

           D:= TransposedMat( mat );
           x4:= x4+D[1][3]*x1+D[2][3]*x2-D[2][2]*x3;
           mat:= List( [x1,x2,x3], x -> Coefficients( b, x4*x ) );
           D:= TransposedMat( mat );
           
           if D[1][1] <> Zero(F) then
              x4:= x4/D[1][1];
              D:= D/D[1][1];
              w:= D[1][2];
              v:= D[2][1];

              if w <> Zero(F) then
                 x1:= w*x1;
                 v:= v*w;

                 return LieAlgDBHelper.isomM9( L, x1, x2, x3, x4, v );

              else
                 #direct sum...
                 dd:= DirectSumDecomposition( L );
                 id:= LieAlgebraIdentification( dd[1] );
                 f:= id.isomorphism;
                 x1:= Image( f, Basis( Source(f) )[2] );
                 x2:= Image( f, Basis( Source(f) )[1] );
                 id:= LieAlgebraIdentification( dd[2] );
                 f:= id.isomorphismorphism;
                 x3:= Image( f, Basis( Source(f) )[2] );
                 x4:= Image( f, Basis( Source(f) )[1] );
                 name:= "L4_8( ";
                 Append( name, LieAlgDBField2String( F ) );
                 Append( name, " )" );
                 K:= SolvableLieAlgebra( F, [4,8] );
                 f:= AlgebraHomomorphismByImages(K,L,Basis(K),
                                                         [x1,x2,x3,x4]);
                 return rec( name:= [ name, [] ], isom:= f );
              fi;
           else
           
              if D[2][1] <> Zero(F) then
                 x4:= x4/D[2][1];
                 a:= D[1][2]/D[2][1];
                 if Characteristic(F) <> 2 then
                    a:= a - (1/4)*One(F);
                    return LieAlgDBHelper.isomM9( L, x1/(4*One(F))+x2/(2*One(F)), 
                                      x1/(2*One(F)), x3, x3/(2*One(F))+x4, a );
                 else
                    return LieAlgDBHelper.isomM10( L, x1, x2, x3, x4, a );
                 fi;
              else
                 if D[1][2] <> Zero(F) then
                    x4:= x4/D[1][2];
                    if Characteristic(F) <> 2 then
                       y1:= (x1+x2)/(2*One(F));
                       y2:= x2;
                       y3:= x3;
                       y4:= (x3+x4)/(2*One(F));
                       return LieAlgDBHelper.isomN( L, y1, y2, y3, y4 );
                    else
                      name:= "L4_10( ";
                      Append( name, LieAlgDBField2String( F ) );
                      Append( name, ", " );
                      Append( name, String( Zero(F) ) );
                      Append( name, " )" );
                      K:= SolvableLieAlgebra( F, [4,10, Zero(F) ] );
                      f:= AlgebraHomomorphismByImages(K,L,Basis(K),
                                                           [x2,x1,x3,x4]);
                      return rec( name:= [ name, [Zero(F)] ], isom:= f );
                    fi;
                 fi;
              fi;
           fi;            
        elif num = '3' then

           D:= TransposedMat( mat );
           a:= id.parameters[1];
           if a <> Zero(F) then
              x4:= x4-(D[1][3]/a-D[2][3])*x1+D[1][3]/a*x2-D[2][1]*x3;
              x4:= x4/D[1][1];
              return LieAlgDBHelper.isomM9( L, x2, x1, x4, x3, a );
           else

              x4:= x4+D[2][3]*x1-D[2][1]*x3;
              mat:= List( [x1,x2,x3], x -> Coefficients( b, x4*x ) );
              D:= TransposedMat( mat );
              if D[1][3] = Zero(F) then
                 x4:= x4/D[1][1];
                 return LieAlgDBHelper.isomM9( L, x2, x1, x4, x3, a );
              elif D[1][1] = Zero(F) then
                 x4:= x4/D[1][3];
                 name:= "L4_6( ";
                 Append( name, LieAlgDBField2String( F ) );
                 Append( name, ", " );
                 Append( name, String( Zero(F) ) );
                 Append( name, ", ");
                 Append( name, String( Zero(F) ) );
                 Append( name, " )" );
                 K:= SolvableLieAlgebra( F, [4,6, Zero(F), Zero(F)] );
                 f:= AlgebraHomomorphismByImages(K,L,Basis(K),
                                                      [-x4,x1,x2,x3]);
                 return rec( name:= [ name, [Zero(F),Zero(F)] ], isom:= f );
              else
                 x4:= x4/D[1][1];
                 x3:= -D[1][3]/D[1][1]*x1+x3;
                 return LieAlgDBHelper.isomM9( L, x2, x1, x4, x3, a );
              fi;
           fi;
        else # i.e., num = '4'...

           D:= TransposedMat( mat );
           a:= id.parameters[1];
           if a <> Zero(F) and Characteristic(F) <> 2 then
              x4:= x4+D[2][3]*x1+D[1][3]/a*x2-D[2][1]*x3;
              x4:= x4/D[1][1];
              return LieAlgDBHelper.isomM9( L, x1/(4*One(F))+x2/(2*One(F)), x1/(2*One(F)), 
                                x4, x3+x4/(2*One(F)), a-(1/4*One(F)) );
           elif a <> Zero(F) and Characteristic(F) = 2 then

              x4:= x4+D[2][3]*x1+D[1][3]/a*x2-D[2][1]*x3;
              if D[3][3] = Zero(F) then
                 x4:= x4/D[1][1];
                 return LieAlgDBHelper.isomM10( L, x1, x2, x4, x3, a );
              elif D[1][1] <> Zero(F) then
                 x4:= x4/D[1][1];
                 b:= One(F) + D[3][3]/D[1][1];
                 return LieAlgDBHelper.isomM11( L, x1, x2, x3, x4, a, b );
              else
                 if a <> One(F) then
                    x4:= x4/D[3][3];
                    y1:= (a*x1+x2)/(a+One(F));
                    y2:= a*(x1+x2)/(a+One(F));
                    y3:= x3;
                    y4:= x3+(a+1)*x4;
                    return LieAlgDBHelper.isomM11( L, y1, y2, y3, y4, a, a );
                 else
                    return LieAlgDBHelper.isomM11( L, x2, x1, x3, x4, One(F), Zero(F) );
                 fi;
              fi;
           else       
              x4:= x4+D[2][3]*x1-D[2][1]*x3;
              if D[1][3]=Zero(F) and D[3][1]=Zero(F) and D[1][1]=D[3][3] then
                 x4:= x4/D[1][1];
                 name:= "L4_12( ";
                 Append( name, LieAlgDBField2String( F ) );
                 Append( name, " )" );
                 K:= SolvableLieAlgebra( F, [4,12] );
                 f:= AlgebraHomomorphismByImages(K,L,Basis(K),
                                                      [x1,x2,x3,x4]);
                 return rec( name:= [ name, [] ], isom:= f );
              else

                 if D[3][3] <> Zero(F) then
                    u1:= D[1][1];
                    u3:= D[3][1];
                    v1:= D[1][3];
                    v3:= D[3][3];
                    if v1 <> Zero(F) then
                       x1:= x1+(v3/v1)*x3;
                    elif u3 <> Zero(F) then
                       x3:= -(v3/u3)*x1+x3;
                    elif u1 = Zero(F) then
                       y1:= x1;
                       x1:= x3;
                       x2:= -x2;
                       x3:= y1;
                    else
                       y1:= x1;
                       x1:= x1/(One(F) - v3/u1)-x3;
                       x3:= -(v3/u1)*y1/(One(F) - v3/u1)+x3;  
                    fi;
                    K:= Subalgebra(  L, [x1,x2,x3] );
                    b:= Basis( K, [x1,x2,x3] );
                    c1:= Coefficients( b, x4*x1 );
                    c2:= Coefficients( b, x4*x2 );
                    c3:= Coefficients( b, x4*x3 );
                    mat:= [ c1, c2, c3 ];
                    D:= TransposedMat( mat );
                 fi; # now D[3][3] is zero...

                 u1:= D[1][1]; u3:= D[3][1]; v1:= D[1][3];
                 if u1 <> Zero(F) and v1 <> Zero(F) then
                    x4:= x4/u1;
                    x1:= (1/u1)*x1;
                    x2:= (1/(u1*v1))*x2;
                    x3:= (1/v1)*x3;
                    a:= (v1/u1)*(u3/u1);

                    name:= "L4_13( ";
                    Append( name, LieAlgDBField2String( F ) );
                    Append( name, ", " );
                    Append( name, String( a ) );
                    Append( name, " )" );
                    K:= SolvableLieAlgebra( F, [4,13, a] );
                    f:= AlgebraHomomorphismByImages(K,L,Basis(K),
                                                        [x1,x2,x3,x4]);
                    return rec( name:= [ name, [a] ], isom:= f );
                 elif u1 <> Zero(F) and v1 = Zero(F) then
                    if u3 <> Zero(F) then
                       x4:= x4/u1;
                       x1:= (1/u3)*x1;
                       x2:= (1/(u1*u3))*x2;
                       x3:= (1/u1)*x3;
                       y1:= x1;
                       x1:= x1+x3;
                       x2:= -x2;
                       x3:= y1;
                    else
                       x4:= x4/u1;
                       x3:= x1+x3;
                    fi;
     
                    name:= "L4_13( ";
                    Append( name, LieAlgDBField2String( F ) );
                    Append( name, ", " );
                    Append( name, String( Zero(F) ) );
                    Append( name, " )" );
                    K:= SolvableLieAlgebra( F, [4,13, Zero(F)] );
                    f:= AlgebraHomomorphismByImages(K,L,Basis(K),
                                                        [x1,x2,x3,x4]);
                    return rec( name:= [ name, [Zero(F)] ], isom:= f );
                 elif u1 = Zero(F) and v1 <> Zero(F) then
                    x4:= x4/v1;
                    par:= u3/v1;
                    if HasIsFinite(F) and IsFinite(F) and 
                                         not par in [Zero(F),One(F)] then
                       if Characteristic(F) = 2 then
                          f:= Inverse( FrobeniusAutomorphism( F ) );
                          a:= Image( f, 1/par );
                       else
                          exp:= LogFFE( 1/par, PrimitiveRoot(F) );
                          if IsEvenInt( exp ) then 
                             a:= PrimitiveRoot(F)^(exp/2);
                          else
                             exp:= LogFFE( PrimitiveRoot(F)/par, 
                                                    PrimitiveRoot(F) );
                             a:= PrimitiveRoot(F)^(exp/2);
                          fi;
                       fi;
                    
                       x1:= a*x1;
                       x2:= a*x2;
                       x4:= a*x4; 
                       par:= a^2*par;
                    fi;
                    if par = Zero(F) then

                       name:= "L4_7( ";
                       Append( name, LieAlgDBField2String( F ) );
                       Append( name, ", " );
                       Append( name, String( Zero(F) ) );
                       Append( name, ", " );
                       Append( name, String( Zero(F) ) );
                       Append( name, " )" );
                       K:= SolvableLieAlgebra( F, [4,7, Zero(F), Zero(F)] );
                       f:= AlgebraHomomorphismByImages( K, L, Basis(K), 
                                                              [-x4,x1,x2,x3]);
                       return rec( name:= [ name, [Zero(F),Zero(F)] ], 
                                                               isom:= f );
                    else

                       
                       name:= "L4_14( ";
                       Append( name, LieAlgDBField2String( F ) );
                       Append( name, ", " );
                       Append( name, String( par ) );
                       Append( name, " )" );
                       K:= SolvableLieAlgebra( F, [4,14, par] );
                       f:= AlgebraHomomorphismByImages( K, L, Basis(K), 
                                                              [x1,x2,x3,x4] );
                       return rec( name:= [ name, [par] ], isom:= f );
                    fi;
                 else

                    x4:= x4/u3;
                    y1:= x3;
                    y2:= -x2;
                    y3:= x1;
                    y4:= x4;
                    name:= "L4_7( ";
                    Append( name, LieAlgDBField2String( F ) );
                    Append( name, ", " );
                    Append( name, String( Zero(F) ) );
                    Append( name, ", " );
                    Append( name, String( Zero(F) ) );
                    Append( name, " )" );
                    K:= SolvableLieAlgebra( F, [4, 7, Zero(F), Zero(F)] );
                    f:= AlgebraHomomorphismByImages( K, L, Basis(K), 
                                                            [-y4,y1,y2,y3] );
                    return rec( name:= [ name, [Zero(F),Zero(F)] ], isom:= f );
                 fi;
              fi;
           fi;
        fi;
     else
       Error( "dim > 4 not yet implemented" );
     fi;
        
end;

#========================================================================

LieAlgDBHelper.liealg_hom:= function( K, L, p, i )

     return AlgebraHomomorphismByImagesNC( K, L, p, i );

end;

LieAlgDBHelper.class_dim_le4:= function( L )

    # finds an isomorphism of the nilpotent Lie algebra L of dim <= 4,
    # to a "normal form".

    local F, C, C1, D, i, x, y, z, u, T, V, K, A, cc, b, a;

    F:= LeftActingDomain( L );
    if Dimension( L ) = 3 then
       if IsLieAbelian( L ) then
          return rec( type:= [ 3, 1 ], f:= LieAlgDBHelper.liealg_hom( L, L, Basis( L ), Basis( L ) ) );
       else
          C:= LieCentre( L );
          for i in [1..3] do
              if not Basis( L )[i] in C then 
                 x:= Basis( L )[i]; break;
              fi;
          od;

          C:= Subalgebra( L, [x,Basis( C )[1]] );
          for i in [1..3] do
              if not Basis( L )[i] in C then 
                 y:= Basis( L )[i]; break;
              fi;
          od;

          T:= EmptySCTable( 3, Zero( F ), "antisymmetric" );
          SetEntrySCTable( T, 1, 2, [1,3] );
          K:= LieAlgebraByStructureConstants( F, T );
          return rec( type:= [ 3, 2 ], f:= LieAlgDBHelper.liealg_hom( L, K, [x,y,x*y], Basis( K ) ) );
       fi; 
    elif Dimension( L ) = 4 then
       if IsLieAbelian( L ) then
          return rec( type:= [ 4, 1 ], f:= LieAlgDBHelper.liealg_hom( L, L, Basis( L ), Basis( L ) ) );
       else
          C:= LieCentre( L );
          if Dimension( C ) = 2 then
             for i in [1..4] do
                 if not Basis( L )[i] in C then 
                    x:= Basis( L )[i]; break;
                 fi;
             od;

             C1:= Subalgebra( L, [ Basis( C )[1], Basis( C )[2], x ] );
             for i in [1..4] do
                 if not Basis( L )[i] in C1 then 
                    y:= Basis( L )[i]; break;
                 fi;
             od;

             A:= Subalgebra( L, [ x*y ] );
             if Basis( C )[1] in A then
                u:= Basis( C )[2];
             else
                u:= Basis( C )[1];
             fi;

             T:= EmptySCTable( 4, Zero( F ), "antisymmetric" );
             SetEntrySCTable( T, 1, 2, [1,3] );
             K:= LieAlgebraByStructureConstants( F, T );
             return rec( type:= [ 4, 2 ], f:= LieAlgDBHelper.liealg_hom( L, K, [x,y,x*y,u], Basis( K ) ) );

          elif Dimension( C ) = 1 then

             D:= LieDerivedSubalgebra( L );
             b:= ShallowCopy( Basis( D ) );
             cc:= [ ];
             for i in [1..4] do
                 x:= Basis( L )[i];
                 if not x in D then 
                    Add( cc, x );
                    Add( b, x );
                    D:= Subalgebra( L, b ); 
                 fi;
             od;

             z:= cc[1]*cc[2];
             if cc[1]*z <> Zero( L ) then
                x:= cc[1]; y:= cc[2];
             else 
                x:= cc[2]; y:= cc[1];
             fi;

             z:= x*y; u:= x*z;

             # we have to change y to make sure that [x,y]= z, and
             # [y,u]= 0.
             V:= Basis( Subalgebra( L, [u] ), [u] );
             a:= Coefficients( V, y*z )[1];
             y:= -a*x+y;

             T:= EmptySCTable( 4, Zero( F ), "antisymmetric" );
             SetEntrySCTable( T, 1, 2, [1,3] );
             SetEntrySCTable( T, 1, 3, [1,4] );
             K:= LieAlgebraByStructureConstants( F, T );
             return rec( type:= [ 4, 3 ], f:= LieAlgDBHelper.liealg_hom( L, K, [x,y,z,u], Basis( K ) ) );

          fi;
       fi;
    fi;

end;


LieAlgDBHelper.skew_symm_NF:= function( V, f )

    # here V is a vector space, and f : VxV -> F a skew-symmetric
    # bilinear function; we compute a basis of V such that f has standard form.
    # Here f is just given as a GAP function.

    local b, dim, found, i, j, c, W, bU, u, v, bb, done, x, w;  
    b:= Basis(V);
    dim:= Dimension(V);
    found:= false;
    for i in [1..dim] do
        if found then break; fi;
        for j in [i+1..dim] do
--> --------------------

--> maximum size reached

--> --------------------

[ Verzeichnis aufwärts0.97unsichere Verbindung  Übersetzung europäischer Sprachen durch Browser  ]