Goto Chapter: Top 1 2 3 4 5 6 7 Bib Ind
 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 

2 The functionality of this package
 2.1 Basic construction of origamis
 2.2 The SL_2( Z)-action
 2.3 Equivalence of origamis and normal forms
 2.4 Computing attributes of origamis
 2.5 Normal Origamis
 2.6 Constructing examples of origamis

2 The functionality of this package

2.1 Basic construction of origamis

2.1-1 Origami
‣ Origami( sigma_x, sigma_y )( operation )

Returns: An origami.

This function constructs an Origami object from two given permutations σ_x and σ_y. A test is performed to check whether the surface described by the given permutations is connected, i.e. whether the group generated by the two permutations acts transitively.

    
    gap> O := Origami((1,2,3,4,5),(5,6));
    Origami((1,2,3,4,5), (5,6), 6)
    
    
‣ OrigamiNC( sigma_x, sigma_y )( operation )

Returns: An origami.

This function constructs an Origami object from two given permutations σ_x and σ_y without checking whether or not the described surface is connected.

    
    gap> O := OrigamiNC((1,2,3,4,5),(5,6));
    Origami((1,2,3,4,5), (5,6), 6)
    
    
‣ HorizontalPerm( O )( attribute )

Returns: A permutation.

Returns the permutation σ_x describing the horizontal gluing of the unit squares.

      
      gap> O := Origami((1,2,3,4,5),(5,6));
      Origami((1,2,3,4,5), (5,6), 6)
      gap> HorizontalPerm(O);
      (1,2,3,4,5)
      
    
‣ VerticalPerm( O )( attribute )

Returns: A permutation.

Returns the permutation σ_y describing the vertical gluing of the unit squares.

      
      gap> O := Origami((1,2,3,4,5),(5,6));
      Origami((1,2,3,4,5), (5,6), 6)
      gap> VerticalPerm(O);
      (5,6)
      
    
‣ DegreeOrigami( O )( attribute )

Returns: A positive integer.

Returns the degree of the origami O, i.e. the number of unit squares which are glued together. In terms of permutations, the degree corresponds to the largest moved point of σ_x and σ_y.

      
      gap> O := Origami((1,2,3,4,5),(5,6));
      Origami((1,2,3,4,5), (5,6), 6)
      gap> DegreeOrigami(O);
      6
      
    

2.2 The SL_2( Z)-action

The group SL_2( Z) acts on the set of all origamis via the following formulas:

S.O(\sigma_x, \sigma_y) = O(\sigma_y^{-1}, \sigma_x), \qquad T.O(\sigma_x, \sigma_y) = O(\sigma_x, \sigma_y \sigma_x^{-1})

where S and T denote the standard generators


                     [ 0 -1 ]            [ 1  1 ]
                 S = [ 1  0 ],       T = [ 0  1 ]
  

of SL_2( Z). The succeeding methods implement this action in GAP.

2.2-1 ActionOfS
‣ ActionOfS( O )( operation )

Returns: An origami.

For a given origami O this methods computes the origami S.O as described above.

      
      gap> O:= Origami((1,6,4,7,5,3)(2,8), (1,4,5,3,8,2,6), 8);
      Origami((1,6,4,7,5,3)(2,8), (1,4,5,3,8,2,6), 8)
      gap> ActionOfS(O);
      Origami((1,6,2,8,3,5,4), (1,6,4,7,5,3)(2,8), 8)
      
    
‣ ActionOfT( O )( operation )

Returns: An origami.

For a given origami O this methods computes the origami T.O as described above.

      
      gap> O:= Origami((1,6,4,7,5,3)(2,8), (1,4,5,3,8,2,6), 8);
      Origami((1,6,4,7,5,3)(2,8), (1,4,5,3,8,2,6), 8)
      gap> ActionOfT(O);
      Origami((1,6,4,7,5,3)(2,8), (1,6,3,2)(4,7), 8)
      
    
‣ ActionOfSInv( O )( operation )

Returns: An origami.

For a given origami O this methods computes the origami S^-1.O.

      
      gap> O:= Origami((1,6,4,7,5,3)(2,8), (1,4,5,3,8,2,6), 8);
      Origami((1,6,4,7,5,3)(2,8), (1,4,5,3,8,2,6), 8)
      gap> ActionOfSInv(O);
      Origami((1,4,5,3,8,2,6), (1,3,5,7,4,6)(2,8), 8)
      
    
‣ ActionOfTInv( O )( operation )

Returns: An origami.

For a given origami O this methods computes the origami T^-1.O.

      
      gap> O:= Origami((1,6,4,7,5,3)(2,8), (1,4,5,3,8,2,6), 8);
      Origami((1,6,4,7,5,3)(2,8), (1,4,5,3,8,2,6), 8)
      gap> ActionOfTInv(O);
      Origami((1,6,4,7,5,3)(2,8), (1,7,5)(2,4,3), 8)
      
    
‣ ActionOfSL2( w, O )( operation )

Returns: An origami.

For a given origami O and a word w in S and T (given as a string), this methods computes the origami w^-1.O.

      
      gap> O:= Origami((1,6,4,7,5,3)(2,8), (1,4,5,3,8,2,6), 8);
      Origami((1,6,4,7,5,3)(2,8), (1,4,5,3,8,2,6), 8)
      gap> ActionOfSL2("S*T", O);
      Origami((1,6,2,8,3,5,4), (3,4,7)(5,8,6), 8)
      
    

2.3 Equivalence of origamis and normal forms

We consider two origamis to be equivalent (or isomorphic), if they are the same up to relabelling the squares. In terms of pairs of permutations, this corresponds to simultaneous conjugation. Equivalence can be checked by computing a certain normal form for origamis.

2.3-1 OrigamiNormalForm
‣ OrigamiNormalForm( O )( operation )

Returns: An origami.

Computes a normal form of a given origami. This normal form has the property that two origamis are equivalent if and only if their normal form are equal. Note that this method does not copy any previously computed attributes from the old origami to the new one.

      
      gap> O := Origami((1,3,2,4),(2,3));
      Origami((1,3,2,4), (2,3), 4)
      gap> OrigamiNormalForm(O);
      Origami((1,2,3,4), (3,4), 4)
      
    
‣ CopyOrigamiInNormalForm( O )( operation )

Returns: An origami.

This method does the same as OrigamiNormalForm but does copy previously computed attributes.

‣ OrigamisEquivalent( O1, O2 )( operation )

Returns: Two origamis.

Checks whether two given origamis are equivalent by comparing their normal forms.

      
      gap> P := Origami((1,2,3,4), (3,4), 4);
      Origami((1,2,3,4), (3,4), 4)
      gap> O := Origami((1,3,2,4),(2,3));
      Origami((1,3,2,4), (2,3), 4)
      gap> OrigamisEquivalent(O, P);
      true
      
    

2.4 Computing attributes of origamis

2.4-1 Stratum
‣ Stratum( O )( attribute )

Returns: A (possibly empty) list of positive integers.

This function calculates the stratum of an origami, i.e. the list of the nonzero degrees of the singularities. For a singularity of cone angle 2 k π the degree of the singularity is k-1.

      
      gap> Stratum(Origami((1,6,4,7,5,3)(2,8), (1,4,5,3,8,2,6)));
      [ 1, 5 ]
      
    
‣ Genus( O )( attribute )

Returns: A non-negative integer.

Calculates the genus of an origami.

    
    gap> Genus(Origami((1,2,3,4), (1,2)(3,4)));
    2
    
    
‣ IndexOfMonodromyGroup( O )( attribute )

Returns: A positive integer.

Calculates the index of the monodromy group of an origami, i.e. the index of the subgroup generated by σ_x and σ_y in S_d where d is the degree of the origami.

    
    gap> IndexOfMonodromyGroup(Origami((1,3,6)(4,5),(2,4,3,5)(7,1)));
    1
    
    
‣ VeechGroup( O )( attribute )

Returns: A subgroup of SL_2( Z).

The Veech group of an origami is a finite-index subgroup of SL_2(Z). In GAP it is is represented as a ModularSubgroup from the ModularGroup package. It is determined by two permutations σ_S and σ_T describing how the generators S and T of SL_2(Z) act on the cosets. See [Sch04] for a detailed description of the algorithm used to compute the Veech group.

    
    gap> O := Origami((1,2,5)(3,4,6), (1,2)(5,6));
    Origami((1,2,5)(3,4,6), (1,2)(5,6), 6)
    gap> G := VeechGroup(O);
    <modular subgroup of index 10>
    gap> Display(G);
    ModularSubgroup(
    S : ( 1, 2)( 3, 6)( 4, 7)( 5, 8)( 9,10)
    T : ( 1, 3)( 2, 4, 5)( 6, 8,10, 9, 7)
    R : ( 1, 8, 7)( 2, 6)( 3, 4,10, 9, 5)
    J : ( 1, 5, 6)( 2, 3, 7)( 4, 9, 8) )
    
    
‣ VeechGroupAndOrbit( O )( operation )

Returns: A record.

Computes both the Veech group and the orbit under the SL_2( Z) action of a given origami O. Also returns the matrices with map the origami O to the corresponding orbit elements. The returned record has the following format:

‣ DeckGroup( O )( attribute )

Returns: A group.

Computes the group of deck transformations of the origami O as a covering of the once punctured torus. Note that the deck transformations can be seen as permutations of the squares of the origami.

    
    gap> O := Origami((1,2,3,4,5), (), 5);
    Origami((1,2,3,4,5), (), 5)
    gap> DeckGroup(O);
    Group([ (), (1,2,3,4,5), (1,3,5,2,4), (1,4,2,5,3), (1,5,4,3,2) ])
    
    
‣ IsElementOfDeckGroup( p, O )( operation )

Returns: A boolean.

Checks whether or not the permutation p defines a deck transformation of the origami O.

‣ IsNormalOrigami( O )( attribute )

Returns: A boolean.

Checks whether or not a given origami is normal. An origami is called normal if its deck group acts transitively on the fibres of the covering.

    
    gap> O := Origami((1,2,3,4,5), (), 5);
    Origami((1,2,3,4,5), (), 5)
    gap> IsNormalOrigami(O);
    true
    
    
‣ SymplecticBasisOfHomology( O )( operation )

Returns: A list of words.

Computes a basis of the homology H_1(O;Z) that is symplectic with respect to the intersection form. The basis elements are represented as words in x and y which define closed paths starting from the square 1.

    
    gap> O := Origami((1,2),(2,3));
    Origami((1,2), (2,3), 3)
    gap> SymplecticBasisOfHomology(O);
    [ x*y^2*x^-1, x*y^-2*x^-2*y^2*x^-1, x*y^-2*x^-1*y^-1*x*y^4*x^-1, x*y^-3*x^-1*y*x^-1 ]
    
    
‣ SpinStructure( O )( attribute )

Returns: 0 or 1

Computes the parity of the spin structure of O.

    
    gap> O := Origami((1,2,3,4,5), (), 5);
    Origami((1,2,3,4,5), (), 5)
    gap> SpinStructure(O);
    1
    
    
‣ SumOfLyapunovExponents( O )( function )

Returns: A positive Integer.

This function calculates the sum of the positive Lyapunov exponents of the Origami O.

      
      gap> O:=Origami((1,2,3,4,5,6,7,8,9),(1,3)(2,4,8)(5,7));
      Origami((1,2,3,4,5,6,7,8,9), (1,3)(2,4,8)(5,7), 9)
      gap> SumOfLyapunovExponents(O);
      32/15
      
    

2.5 Normal Origamis

Normal origamis can equivalently be described by a finite group G and a pair x, y of generators of G. The elements of G correspond to squares and the horizontal (resp. vertical) gluing is determined by left multiplication with x (resp. y), i.e. if g,h ∈ G then g is glued to h in the x-direction if xg = h and analogously for the y-direction. The group G is then evidently the deck group of the described origami. Furthermore, every normal origami is of this form where G is its deck group. Two normal origamis (x, y, G), (x',y',G) given in such a form are equivalent if and only if there is an automorphism φ ∈ Aut(G) of G such that φ(x) = x' and φ(y) = y'. We introduce a new GAP-category called IsNormalStoredOrigami which is a subcategory of the Origami-category for representing normal origamis which are given in terms of the above data. Since every NormalStoredOrigami is also an Origami, every method implemented for Origamis is also available for NormalStoredOrigamis.

2.5-1 NormalStoredOrigami
‣ NormalStoredOrigami( x, y, G )( operation )

Returns: A normal origami.

For a given finite group G and two generators x, y this method constructs a new normal origami in the way described above. It is given as a NormalStoredOrigami object. This constructor checks whether or not G is actually generated by x and y.

    
    gap> G := AlternatingGroup(8);
    Alt( [ 1 .. 8 ] )
    gap> gen := MinimalGeneratingSet(G);
    [ (1,2,3,4,5,6,7), (6,7,8) ]
    gap> x := gen[1];; y := gen[2];;
    gap> O := NormalStoredOrigami(x, y, G);
    Normal Origami( A_8.1^-1*A_8.2*A_8.1 , A_8.1^-1*A_8.2, Group( [ A_8.1, A_8.2 ]) )
    
    
‣ NormalStoredOrigamiNC( x, y, G )( operation )

Returns: A normal origami.

Does the same as the NormalStoredOrigami constructor above but does not check whether or not G is generated by x and y.

‣ HorizontalElement( O )( attribute )

Returns: A group element.

For a NormalStoredOrigami, this method returns the x-element which describes the gluing in the horizontal direction.

‣ VerticalElement( O )( attribute )

Returns: A group element.

For a NormalStoredOrigami, this method returns the y-element which describes the gluing in the vertical direction.

‣ AsPermutationRepresentation( O )( operation )

Returns: An origami.

Converts a NormalStoredOrigami into an Origami, i.e. computes the x- and y-permutations describing the gluing of the squares.

    
    gap> G := AlternatingGroup(4);
    Alt( [ 1 .. 4 ] )
    gap> gen := MinimalGeneratingSet(G);
    [ (2,4,3), (1,3)(2,4) ]
    gap> x := gen[1];; y := gen[2];;
    gap> O := NormalStoredOrigami(x, y, G);
    Normal Origami( f1 , f2, Group( [ f1, f2, f3 ] ) )
    gap> AsPermutationRepresentation(O);
    Origami((1,2,5)(3,6,9)(4,7,10)(8,11,12), (1,3)(2,7)(4,8)(5,12)(6,11)(9,10), 12)
    
    
‣ AsPermutationRepresentation( O )( operation )

Returns: An origami.

Converts a normal Origami into a NormalStoredOrigami.

‣ AllNormalOrigamisFromGroup( G )( operation )

Returns: A list of normal origamis.

For a given group G, this method computes all normal origamis (up to equivalence) which can be build from G.

    
    gap> G := AlternatingGroup(4);
    Alt( [ 1 .. 4 ] )
    gap> AllNormalOrigamisFromGroup(G);
    [ Normal Origami( f3 , f1*f3, Group( [ f1, f2, f3 ] ) ),
    Normal Origami( f1 , f3, Group( [ f1, f2, f3 ] ) ),
    Normal Origami( f1 , f1*f3, Group( [ f1, f2, f3 ] ) ),
    Normal Origami( f1 , f1^2*f3, Group( [ f1, f2, f3 ] ) ) ]
    
    
‣ AllNormalOrigamisByDegree( d )( operation )

Returns: A list of normal origamis.

Computes all normal origamis (up to equivalence) with degree d.

    
    gap> AllNormalOrigamisByDegree(5);
    [ Normal Origami( <identity> of ... , f1, Group( [ f1 ] ) ),
    Normal Origami( f1 , <identity> of ..., Group( [ f1 ] ) ),
    Normal Origami( f1 , f1, Group( [ f1 ] ) ),
    Normal Origami( f1 , f1^2, Group( [ f1 ] ) ),
    Normal Origami( f1 , f1^3, Group( [ f1 ] ) ),
    Normal Origami( f1 , f1^4, Group( [ f1 ] ) ) ]
    
    

2.6 Constructing examples of origamis

In this section we describe some methods for constructing explicit examples and families of origamis. More examples of some special constructions of families of orgamis are given in Chapter 7.

2.6-1 AllOrigamisByDegree
‣ AllOrigamisByDegree( d )( operation )

Returns: A list of origamis.

Returns a list of all origamis of degree d up to equivalence.

‣ AllOrigamisInStratum( d, stratum )( operation )

Returns: A list of origamis.

Returns a list of all origamis of degree d in the given stratum.

    
    gap> OrigamiListInStratum(4, [1,1]);
    [ Origami((1,2), (1,3)(2,4), 4), Origami((1,2), (1,3,2,4), 4),
      Origami((1,2)(3,4), (2,3), 4), Origami((1,2)(3,4), (2,3,4), 4),
      Origami((1,2)(3,4), (1,2,3,4), 4), Origami((1,2,3), (2,3,4), 4),
      Origami((1,2,3), (2,4,3), 4), Origami((1,2,3), (1,2)(3,4), 4),
      Origami((1,2,3,4), (2,4), 4), Origami((1,2,3,4), (1,2)(3,4), 4) ]
    
    
‣ QuasiRegularOrigami( G, H, r, u )( operation )

Returns: An origami.

The function calculates an origami by a given group G and a subgroup of G H. H must not contain any normal subgroups of G and r and u are the generators of G. We identify the tiles of the origami with the right cosets of H in G. The right neighbour of the tile Hg is the tile Hgr and the upper neighbour of Hg is Hgu.

      G:=SymmetricGroup(3);
      Sym( [ 1 .. 3 ] )
      gap> H:=Group(());
      Group(())
      gap>QuasiRegularOrigami(G,H,(1,2),(2,3));
      Origami((1,2)(3,5)(4,6), (1,3)(2,4)(5,6), 6)
    
‣ QROFromGroup( G )( operation )

Returns: A list of origamis.

Returns a list of all quasi-regular origamis which can be build from the group G.

‣ QROFromOrder( d )( operation )

Returns: A list of origamis.

Returns a list of all quasi-regular origamis of order d.

‣ NormalformConjugators( O )( operation )

Returns: A list of permutations.

Calculates all permutations which yield a normal form when conjugated to the O.

  gap>origami:=Origami((1,2,3,4), (1,2)(3,4));
  Origami((1,2,3,4), (1,2)(3,4), 4)
  gap>NormalformConjugators(origami);
  [ (), (1,3,2), (1,3)(2,4), (1,2,4) ]
    
‣ TranslationsOfOrigami( O )( operation )

Returns: A list of permutations.

Computes all translations of the origami as permutations of the squares of O. This is equivalent to the permutations t which satisfy t∘ σ_x∘ t^-1 = σ_x and t∘σ_y∘ t^-1 = σ_y, where σ_x, σ_y are the permutations describing the horizontal and the vertical gluing of the origami, respectively.

      gap> origami:=Origami((1,2,3,4), (1,2)(3,4));
    Origami((1,2,3,4), (1,2)(3,4), 4)
    gap> TranslationsOfOrigami(origami);
    [ (), (1,3)(2,4) ]
    
‣ IsHyperelliptic( O )( operation )

Returns: A boolean.

Tests whether an origami is hyperelliptic.

  gap> origami:=Origami((1,2,3,4), (1,2)(3,4));
  Origami((1,2,3,4), (1,2)(3,4), 4)
  gap> IsHyperelliptic(origami);
  true
  gap> origami:=Origami((1,2,3,4,5,6), (1,2)(3,4)(5,6));
  Origami((1,2,3,4,5,6), (1,2)(3,4)(5,6), 6)
  gap> IsHyperelliptic(origami);
  false
    
‣ PointReflectionsOfOrigami( O )( operation )

Returns: A list of permutations.

Computes all point reflections of O, i.e. all affine homeomorphisms with derivative -I, where I is the identity matrix. This is equivalent to the permutations t which satisfy t∘σ_x∘ t^-1=σ_x^-1 and t∘ σ_y∘ t^-1=σ_y^-1, where σ_x,σ_y are the permutations describing the horizontal and the vertical gluing of the origami, respectively.

          gap> o:=Origami((1,2,3,4),(1,2)(3,4));
          Origami((1,2,3,4), (1,2)(3,4), 4)
          gap> PointReflectionsOfOrigami(o);
          [ (1,2)(3,4), (1,4)(2,3) ]
    
‣ AutomorphismsOfOrigami( O )( operation )

Returns: Two lists consisting of two entries: The first entry is a list of permutations and the second entry is 1 resp. -1.

Computes all automorphisms of the origami, i.e. the translations and the point reflections. More precisely it returns two lists. The first list contains the translations and is labelel with 1. The second list contains the point reflections and is labeled with -1.

          gap> o:=Origami((1,2,3,4),(1,2)(3,4));
          Origami((1,2,3,4), (1,2)(3,4), 4)
          gap> AutomorphismsOfOrigami(o);
          [ [ [ (), (1,3)(2,4) ], 1 ], [ [ (1,2)(3,4), (1,4)(2,3) ], -1 ] ]
    
‣ FixedPointsOfPointReflections( O, sigma )( operation )

Returns: A list of fixed points. The fixed points are given as lists with three entries.

This function computes the fixed points of a point reflection σ of the origami O given as permutation of its squares. The function does not check whether σ is a point reflection, i.e. whether it satisfies σ∘σ_x∘ σ^-1=σ_x^-1 and σ∘ σ_y∘ σ^-1=σ_y^-1. The fixed points are returned in a list with entries [a,b,c], where a is the square in which the fixed point occurs and (b,c) are the local coordinates in the square a and for the lower left corners a is a representative of the connected lower left corners.

      
      gap> origami:=Origami((1,2,3,4),(1,2)(3,4));
      Origami((1,2,3,4), (1,2)(3,4), 4)
      gap> sigma:=PointReflectionsOfOrigami(origami)[1];
      (1,2)(3,4)
      gap> FixedPointsOfPointReflections(origami, sigma);
      [ [ 2, 0, 0.5 ], [ 4, 0, 0.5 ], [ 1, 0.5, 0 ], [ 2, 0.5, 0 ], [ 3, 0.5, 0 ], [ 4, 0.5, 0 ] ]
      
    
‣ FixedPointsOfTranslation( O, sigma )( operation )

Returns: A list of fixed points. The fixed points are given as lists of vertices.

This function computes the fixed points of a translation σ of the origami O given as permutations of its squares. The function does not check whether σ is a translation, i.e. whether it satisfies σ∘σ_x∘ σ^-1=σ_x and σ∘ σ_y∘ σ^-1=σ_y. The fixed points of a translation are always vertices of the squares. Each fixed point is returned as list of vertices, more precisely as the labels of all squares such that the corresponding vertex is the fixed point.

      
            gap> origami:=Origami((1,2,3,4),(1,2)(3,4));
      Origami((1,2,3,4), (1,2)(3,4), 4)
      gap> TranslationsOfOrigami(origami);
      [ (), (1,3)(2,4) ]
      gap> sigma:=TranslationsOfOrigami(origami)[2];
      (1,3)(2,4)
      gap> FixedPointsOfTranslation(origami, sigma);
      [ [ 1, 3 ], [ 2, 4 ] ]
    
    
‣ FixedPointsOfAutomorphism( O, sigma )( operation )

Returns: A list of fixed points. The fixed points are presened in the format corresponding of the type, i.e. the format depends on whether the automorphism is a translation or a point reflection.

This function computes the fixed points of an automorphism σ of the origami O. If sigma is a point reflection, the fixed points are returned in a list with entries [[a,b,c],d], where a is the square in which the fixed point occurs, (b,c) are the local coordinates in the square and d is -1. If σ is a translation it is returned as list of vertices labeled with 1.

      
      gap> O:=Origami((1,2,3,4),(1,2)(3,4));
      Origami((1,2,3,4), (1,2)(3,4), 4)
      gap> sigma:=(1,3)(2,4);
      (1,3)(2,4)
      gap> FixedPointsOfAutomorphism(O,sigma);
      [ [ [ 1, 3 ], [ 2, 4 ] ], 1 ]
  
    
‣ GenusOfQuotient( O )( operation )

Returns: An integer.

For a given origami this function computes the genus of the quotient O/Trans(O), where Trans(O) is the translation group.

      
      gap> O:=Origami((1,2,3)(4,5,6),(3,4));
      Origami((1,2,3)(4,5,6), (3,4), 6)
      gap> GenusOfQuotient(O);
      1
      
    
‣ OrigamiQuotient( O )( operation )

Returns: An origami

For a given origami this function computes the quotient origami O/Trans(O), where Trans(O) is the translation group.

      
      gap> O:=Origami((1,2,3)(4,5,6),(3,4));
      Origami((1,2,3)(4,5,6), (3,4), 6)
      gap> OrigamiQuotient(O);
      Origami((1,2,3), (), 3)
      
    
 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 
Goto Chapter: Top 1 2 3 4 5 6 7 Bib Ind

generated by GAPDoc2HTML