Changeset 8e865c in git


Ignore:
Timestamp:
Mar 8, 2010, 10:04:20 AM (14 years ago)
Author:
Hans Schönemann <hannes@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
12603fcdf508bfbd1d4ad1125836e1a42d5c77b0
Parents:
231da194e531aacb54bc0117d0f14014350c9ec0
Message:
new primdec.lib

git-svn-id: file:///usr/local/Singular/svn/trunk@12617 2c84dea3-7e68-4137-9b89-c4e89433aadc
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • Singular/LIB/primdec.lib

    r231da1 r8e865c  
    5050LIB "triang.lib";
    5151LIB "absfact.lib";
    52 LIB "ring.lib";
    5352///////////////////////////////////////////////////////////////////////////////
    5453//
     
    23372336  {
    23382337      ERROR(
    2339       "// Not implemented for this ordering, please change to global ordering."
     2338      "Not implemented for this ordering, please change to global ordering."
    23402339      );
    23412340  }
     
    24432442  {
    24442443      ERROR(
    2445       "// Not implemented for this ordering, please change to global ordering."
     2444      "Not implemented for this ordering, please change to global ordering."
    24462445      );
    24472446  }
     
    37103709   if((reduce(f,std(h))!=0)||(reduce(diff(f,var(i)),std(h))!=0))
    37113710   {
    3712       ERROR("FEHLER IN GCD");
     3711      ERROR("ERROR in GCD");
    37133712   }
    37143713   poly g1=lift(h,f)[1][1];    //  f/h
     
    38443843   {
    38453844      ERROR(
    3846       "// Not implemented for this ordering, please change to global ordering."
     3845      "Not implemented for this ordering, please change to global ordering."
    38473846      );
    38483847   }
     
    43514350  if((choose<0) or (choose>3))
    43524351  {
    4353     ERROR("ERROR: <int> must be 0 or 1 or 2 or 3");
     4352    ERROR("<int> must be 0 or 1 or 2 or 3");
    43544353  }
    43554354  option(notWarnSB);
     
    51015100///////////////////////////////////////////////////////////////////////////////
    51025101
    5103 proc primdecGTZ(ideal i, list #)
     5102proc primdecGTZ(ideal i)
    51045103"USAGE:   primdecGTZ(i); i ideal
    51055104RETURN:  a list pr of primary ideals and their associated primes:
     
    51085107   pr[i][2]   the i-th prime component.
    51095108@end format
    5110 NOTE:    - Algorithm of Gianni/Trager/Zacharias.
    5111          - Designed for characteristic 0, works also in char k > 0, if it
    5112            terminates (may result in an infinite loop in small characteristic!)
    5113          - For local orderings, the result is considered in the localization
    5114            of the polynomial ring, not in the power series ring
    5115          - For local and mixed orderings, the decomposition in the
    5116            corresponding global ring is returned if the string 'global'
    5117            is specified as second argument
     5109NOTE:    Algorithm of Gianni/Trager/Zacharias.
     5110         Designed for characteristic 0, works also in char k > 0, if it
     5111         terminates (may result in an infinite loop in small characteristic!)
    51185112EXAMPLE: example primdecGTZ; shows an example
    51195113"
    51205114{
    5121    if(size(#)>0)
    5122    {
    5123       int keep_comp=1;
    5124    }
    51255115   if(attrib(basering,"global")!=1)
    51265116   {
    5127 // algorithms only work in global case!
    5128 // pass to appropriate global ring
    5129       def r=basering;
    5130       def s=changeord("dp");
    5131       setring s;
    5132       ideal i=imap(r,i);
    5133 // decompose and go back
    5134       list li=primdecGTZ(i);
    5135       setring r;
    5136       def li=imap(s,li);
    5137 // clean up
    5138       if(!defined(keep_comp))
    5139       {
    5140          for(int k=size(li);k>=1;k--)
    5141          {
    5142             if(mindeg(std(lead(li[k][2]))[1])==0)
    5143             {
    5144 // 1 contained in ideal, i.e. component does not meet origin in local ordering
    5145                li=delete(li,k);
    5146             }
    5147          }
    5148       }
    5149       return(li);
     5117      ERROR(
     5118      "Not implemented for this ordering, please change to global ordering."
     5119      );
    51505120   }
    5151 
    51525121   if(minpoly!=0)
    51535122   {
    51545123      return(algeDeco(i,0));
    51555124      ERROR(
    5156       "// Not implemented yet for algebraic extensions.Simulate the ring extension by adding the minpoly to the ideal"
     5125      "Not implemented yet for algebraic extensions.Simulate the ring extension by adding the minpoly to the ideal"
    51575126      );
    51585127   }
     
    51695138}
    51705139///////////////////////////////////////////////////////////////////////////////
    5171 proc absPrimdecGTZ(ideal I, list #)
     5140proc absPrimdecGTZ(ideal I)
    51725141"USAGE:   absPrimdecGTZ(I); I ideal
    51735142ASSUME:  Ground field has characteristic 0.
    5174 RETURN:  a ring containing two lists: @code{absolute_primes}, the absolute
    5175          prime components of I, and @code{primary_decomp}, the output of
    5176          @code{primdecGTZ(I)}.
     5143RETURN:  a ring containing two lists: @code{absolute_primes} (the absolute
     5144         prime components of I) and @code{primary_decomp} (the output of
     5145         @code{primdecGTZ(I)}).
    51775146         The list absolute_primes has to be interpreted as follows:
    51785147         each entry describes a class of conjugated absolute primes,
     
    51845153         polynomial of a minimal finite field extension over which the
    51855154         absolute prime component is defined.
    5186          For local orderings, the result is considered in the localization
    5187          of the polynomial ring, not in the power series ring.
    5188          For local and mixed orderings, the decomposition in the
    5189          corresponding global ring is returned if the string 'global'
    5190          is specified as second argument
    51915155NOTE:    Algorithm of Gianni/Trager/Zacharias combined with the
    51925156         @code{absFactorize} command.
     
    52015165  }
    52025166
    5203   if(size(#)>0)
    5204   {
    5205      int keep_comp=1;
    5206   }
    5207 
    52085167  if(attrib(basering,"global")!=1)
    52095168  {
    5210 // algorithm automatically passes to the global case
    5211 // hence prepare to go back to an appropriate new ring
    5212       def r=basering;
    5213       ideal max_of_r=maxideal(1);
    5214       def s=changeord("dp");
    5215       setring s;
    5216       def I=imap(r,I);
    5217       def S=absPrimdecGTZ(I);
    5218       setring S;
    5219       ring r1=char(basering),var(nvars(r)+1),dp;
    5220       def rS=r+r1;
    5221 // move objects to appropriate ring and clean up
    5222       setring rS;
    5223       def max_of_r=imap(r,max_of_r);
    5224       attrib(max_of_r,"isSB",1);
    5225       def absolute_primes=imap(S,absolute_primes);
    5226       def primary_decomp=imap(S,primary_decomp);
    5227       if(!defined(keep_comp))
    5228       {
    5229          ideal tempid;
    5230          for(int k=size(absolute_primes);k>=1;k--)
    5231          {
    5232             tempid=absolute_primes[k][1];
    5233             tempid[1]=0;                  // ignore minimal polynomial
    5234             if(size(reduce(lead(tempid),max_of_r))!=0)
    5235             {
    5236 // 1 contained in ideal, i.e. component does not meet origin in local ordering
    5237                absolute_primes=delete(absolute_primes,k);
    5238             }
    5239          }     
    5240          for(k=size(primary_decomp);k>=1;k--)
    5241          {
    5242             if(mindeg(std(lead(primary_decomp[k][2]))[1])==0)
    5243             {
    5244 // 1 contained in ideal, i.e. component does not meet origin in local ordering
    5245                primary_decomp=delete(primary_decomp,k);
    5246             }
    5247          }
    5248          kill tempid;
    5249       }
    5250       export(primary_decomp);
    5251       export(absolute_primes);
    5252       return(rS);
     5169    ERROR(
     5170      "Not implemented for this ordering, please change to global ordering."
     5171    );
    52535172  }
    52545173  if(minpoly!=0)
     
    52565175    //return(algeDeco(i,0));
    52575176    ERROR(
    5258       "// Not implemented yet for algebraic extensions.Simulate the ring extension by adding the minpoly to the ideal"
     5177      "Not implemented yet for algebraic extensions.Simulate the ring extension by adding the minpoly to the ideal"
    52595178    );
    52605179  }
     
    53155234    primary_decomp[i]=list(L[i][1],L[i][2]);
    53165235  }
     5236  for(ii=1;ii<=size(absolute_primes);ii++)
     5237  {
     5238     absolute_primes[ii][1]=interred(absolute_primes[ii][1]);
     5239  }
    53175240  export(primary_decomp);
    53185241  export(absolute_primes);
    53195242  setring R;
    5320   dbprint( printlevel-voice+3,"
    5321 // 'absPrimdecGTZ' created a ring, in which two lists absolute_primes (the
    5322 // absolute prime components) and primary_decomp (the primary and prime
    5323 // components over the current basering) are stored.
    5324 // To access the list of absolute prime components, type (if the name S was
    5325 // assigned to the return value):
    5326         setring S; absolute_primes; ");
    5327 
     5243dbprint( printlevel-voice+3,"
     5244// def S = absPrimdecGTZ(i); creates a ring,
     5245// which comes with two lists:
     5246// absolute_primes -- the absolute prime components,
     5247// and primary_decomp -- the primary and prime
     5248// components over the current basering).
     5249// Type setring S; absolute_primes;
     5250// to access the data.
     5251");
    53285252  return(Rz);
    53295253}
     
    53555279   if c=3,  minAssGTZ and facstd are used.
    53565280@end format
    5357          For local orderings, the result is considered in the localization
    5358          of the polynomial ring, not in the power series ring.
    5359          For local and mixed orderings, the decomposition in the
    5360          corresponding global ring is returned if the string 'global'
    5361          is specified as third argument
    53625281EXAMPLE: example primdecSY; shows an example
    53635282"
    53645283{
    5365    if(size(#)>1)
    5366    {
    5367       int keep_comp=1;
    5368    }
    53695284   if(attrib(basering,"global")!=1)
    53705285   {
    5371 // algorithms only work in global case!
    5372 // pass to appropriate global ring
    5373       def r=basering;
    5374       def s=changeord("dp");
    5375       setring s;
    5376       ideal i=imap(r,i);
    5377 // decompose and go back
    5378       list li=primdecSY(i);
    5379       setring r;
    5380       def li=imap(s,li);
    5381 // clean up
    5382       if(!defined(keep_comp))
    5383       {
    5384          for(int k=size(li);k>=1;k--)
    5385          {
    5386             if(mindeg(std(lead(li[k][2]))[1])==0)
    5387             {
    5388 // 1 contained in ideal, i.e. component does not meet origin in local ordering
    5389                li=delete(li,k);
    5390             }
    5391          }
    5392       }
    5393       return(li);
     5286      ERROR(
     5287      "Not implemented for this ordering, please change to global ordering."
     5288      );
    53945289   }
    53955290   i=simplify(i,2);
     
    53995294     return(list(L));
    54005295   }
    5401 
    54025296   if(minpoly!=0)
    54035297   {
    54045298      return(algeDeco(i,1));
    54055299   }
    5406    if (size(#)!=0)
     5300   if (size(#)==1)
    54075301   { return(prim_dec(i,#[1])); }
    54085302   else
     
    54285322
    54295323RETURN:  a list, the minimal associated prime ideals of I.
    5430 NOTE:    - Designed for characteristic 0, works also in char k > 0 based
    5431            on an algorithm of Yokoyama
    5432          - For local orderings, the result is considered in the localization
    5433            of the polynomial ring, not in the power series ring
    5434          - For local and mixed orderings, the decomposition in the
    5435            corresponding global ring is returned if the string 'global'
    5436            is specified as second argument
     5324NOTE:    Designed for characteristic 0, works also in char k > 0 based
     5325         on an algorithm of Yokoyama
    54375326EXAMPLE: example minAssGTZ; shows an example
    54385327"
    54395328{
    5440    if(size(#)>0)
    5441    {
    5442       int keep_comp=1;
    5443    }
    5444 
    5445   if(attrib(basering,"global")!=1)
    5446   {
    5447   // algorithms only work in global case!
    5448 // pass to appropriate global ring
    5449       def r=basering;
    5450       def s=changeord("dp");
    5451       setring s;
    5452       ideal i=imap(r,i);
    5453 // decompose and go back
    5454       list li=minAssGTZ(i);
    5455       setring r;
    5456       def li=imap(s,li);
    5457 // clean up
    5458       if(!defined(keep_comp))
    5459       {
    5460          for(int k=size(li);k>=1;k--)
    5461          {
    5462             if(mindeg(std(lead(li[k]))[1])==0)
    5463             {
    5464 // 1 contained in ideal, i.e. component does not meet origin in local ordering
    5465                li=delete(li,k);
    5466             }
    5467          }
    5468       }
    5469       return(li);
    5470   }
    5471 
    54725329  int j;
    54735330  string algorithm;
     
    55095366  }
    55105367
     5368  if(attrib(basering,"global")!=1)
     5369  {
     5370    ERROR(
     5371      "Not implemented for this ordering, please change to global ordering."
     5372    );
     5373  }
    55115374  if(minpoly!=0)
    55125375  {
     
    55345397         Otherwise, the system tries to find an optimal ordering,
    55355398         which in some cases may considerably speed up the algorithm. @*
    5536          For local orderings, the result is considered in the localization
    5537          of the polynomial ring, not in the power series ring
    5538          For local and mixed orderings, the decomposition in the
    5539          corresponding global ring is returned if the string 'global'
    5540          is specified as third argument
    55415399EXAMPLE: example minAssChar; shows an example
    55425400"
    55435401{
    5544    if(size(#)>1)
    5545    {
    5546       int keep_comp=1;
    5547    }
    55485402   if(attrib(basering,"global")!=1)
    55495403   {
    5550 // algorithms only work in global case!
    5551 // pass to appropriate global ring
    5552       def r=basering;
    5553       def s=changeord("dp");
    5554       setring s;
    5555       ideal i=imap(r,i);
    5556 // decompose and go back
    5557       list li=minAssChar(i);
    5558       setring r;
    5559       def li=imap(s,li);
    5560 // clean up
    5561       if(!defined(keep_comp))
    5562       {
    5563          for(int k=size(li);k>=1;k--)
    5564          {
    5565             if(mindeg(std(lead(li[k]))[1])==0)
    5566             {
    5567 // 1 contained in ideal, i.e. component does not meet origin in local ordering
    5568                li=delete(li,k);
    5569             }
    5570          }
    5571       }
    5572       return(li);
     5404      ERROR(
     5405      "Not implemented for this ordering, please change to global ordering."
     5406      );
    55735407   }
    5574    if (size(#)>0)
     5408   if (size(#)==1)
    55755409   { return(min_ass_prim_charsets(i,#[1])); }
    55765410   else
     
    55985432  {
    55995433     ERROR(
    5600      "// Not implemented for this ordering, please change to global ordering."
     5434     "Not implemented for this ordering, please change to global ordering."
    56015435     );
    56025436  }
     
    56325466  if(attrib(basering,"global")!=1)
    56335467  {
    5634 // algorithms only work in global case!
    5635 // pass to appropriate global ring
    5636       def r=basering;
    5637       def s=changeord("dp");
    5638       setring s;
    5639       ideal i=imap(r,i);
    5640 // compute radical and go back
    5641       def j=radical(i);
    5642       setring r;
    5643       def j=imap(s,j);
    5644       return(j);
     5468    ERROR(
     5469     "Not implemented for this ordering, please change to global ordering."
     5470    );
    56455471  }
    56465472  if(size(i) == 0){return(ideal(0));}
     
    64116237  {
    64126238      ERROR(
    6413       "// Not implemented for this ordering, please change to global ordering."
     6239      "Not implemented for this ordering, please change to global ordering."
    64146240      );
    64156241  }
     
    64596285  {
    64606286      ERROR(
    6461       "// Not implemented for this ordering, please change to global ordering."
     6287      "Not implemented for this ordering, please change to global ordering."
    64626288      );
    64636289  }
     
    65276353  {
    65286354    ERROR(
    6529     "// Not implemented for this ordering, please change to global ordering."
     6355    "Not implemented for this ordering, please change to global ordering."
    65306356    );
    65316357  }
  • Tst/Short/bug_46.res.gz.uu

    r231da1 r8e865c  
    11begin 640 bug_46.res.gz
    2 M'XL("(32%$<``V)U9U\T-BYR97,`[5?!;N,V$+W[*XA%@75,R>$,*8JJ86%1
    3 M%"@"+(HBSJE%&M"2D@CUVH&D;.Q\?8>T)4M.TBYZV%YBP!`]?!R^(1^?Z,75
    4 MSQ>_,L8@99\O?F(?FKJ9KLKEA]EH<>C!E%'PIER7S?AL-G)/EJ9L^7AWH_1T
    5 M73Q-Z\8V'5RF[/R<%56UJ5BY9G99_U:57_(B^^7J]PZDIOO9'O9=)S-&*:O*
    6 M]1VKJKD(QMM@%SR?!?G#$:!35N:%7;%ROD4.P0[YCA[/DC\C?^9P1,8IRXM;
    7 M=GDY'Q`9EU3)B'A^'(0_LJPJ;%/DS'H&@:O@Z;[,[EGSM&&KLFYJ5]%F]=@4
    8 M-XY\4;-Q<U^X5&V<^3C+-E\>-NMBW=1GS*YS'[75[H9FHAX_JHUU_3[/<2#;
    9 M?"TJYH#98U51A"UM73ABE+(J6-ULJB*?ND%7&V:SK*AK#W=$V>;V;4H!:W8/
    10 M!1N7MQZ_MM2[8$^V]H74=7FWID5H-KZW*IK':LV^VM5C<?;CB!T^=='X75K,
    11 M3I=DQKKU-VF'N[R<G>)&?\"U3]@^Z7-#[;E5(:"5W,1H,8P$:,M!1`JP0^'U
    12 M/(1D&YH=?PYM%Y;7\T@(LPMI=.+&2K1<":4[A+J>`YA$;;F5(4$X0&1L*!4*
    13 M3P4[*FK4_GB%G]8T@T03T20Q*FV((<0:!0PHJFTHY0N*(+1&"J.CX#CH*$+B
    14 MH`V:/M%$)W(;NI5P*,J$8'F'&E*5;U+%_5(ZI@831>N1G-*$:!L"O.`98PP[
    15 M/[^4-!I04IE)'">#U111K+>^%H?BM+B)#5O4@&0KBR1E?Y6KE=-$&P.1=K(!
    16 MF!X<P!F`#99!%N0#"P!L+>!B[J8,ELB7],@DSY!G/0L`N;>`Q8D#7+P[P/=P
    17 M`%#I/^'>=(!/V9^*1SBAI^0HA'8MY%)%1E"3]`A:RH&&S<1R5),ES\)/V>"T
    18 MQ5I3/'2Y0IGX3"$8'5.+5"]4U)=S9`QE.@&#!`\64KQ4]5LNX6N@9+X&$(AM
    19 M$5K%VE>A9$3N,RA#N3+4:V5HK4%3W*?3AUQ&@"N##IV19F!RL?.UMI`#/$RB
    20 M0R$=_)M,Q%42)FI?24PG>Y\--<3)?CL2F8AXN!\8T>PJ?J42%!(,4,=^?T-0
    21 ML*\&E/([3?PB(4]<1L:D!QL>--&.H3T11NZ7H!WSFN=`=/"<15`=S4'W3"?^
    22 M5],QQWM'3F3/94"SGKL63O)@&;JV]&URZ7/EOI/\.#PY7$;>[R+_AQ.AZ-U%
    23 MNDU!NOA^LRG)@TK[,L]/M3W)N!-C7[M(4I=>UETTHI-.!]T+5YYH%CMRV+XG
    24 M>YI%>=0LJKYFZ:8\T"M&_7MRL-T=>_3K+\5W*7X?*<;_[:5H^\+;GJ@&WKZM
    25 D]H?M^F)]F:-E:'HB2Z;^'Z#[F_=8C^%L]L/H;__@,0(W#@``
     2M'XL("'&]E$L``V)U9U\T-BYR97,`[5?;;N,V$'WW5Q"+?4A,R2:'%$6M8:$H
     3M"A0!BJ*(\]3"#:A+-T*]=B`IC>VO[Y"Z6'+B3=KG&#!$#\_,'))G1O3J[J>;
     4M7PDA/":_W/Q(/M55/=L4R:?%9-7.0$S0>%]LB_KJ>C&Q3Q+')'GZ>B_5;)L_
     5MSZK:U#U<Q&0^)WE9[DI2;(E)JM_*XEN6IS_?_=Z#Y*S)]MA,G64,8E(6VZ^D
     6M+)?,N]I[!^]X[66/)X"*29'E9D.*Y1XH]PY`#_@X"GH$>J3\A`QCDN5_D=O;
     7MY8C(58$KF2!/.[DB2_)BEJ1E;NJ\(L9Q\2SX^:%('TBZ^X;FYZ)^(/7SCFR*
     8MJJZ^V&F,L=L\U?F]715"?)_4#WEO)LYLW1]WVWQ;5RZFV69NPI2'>\R.DYU?
     9M:^T1N86?O,GNG[QTP/2I+-%"$E/EENOUS"+O#H\YJ?+:[>1J<<YN83'UCI@T
     10MS:O*Q<E,;6:3?NMTW+O?WBY>N/_!UU\F".N>^+G'\=)(GX,15(=@P`\85X9R
     11M%D@./0K62SRD_J=8+P/&],%'K\CZ"#!4,JEZA%PO.=>1W%,C?(10S@-M?"&!
     12M.0K04Y"3[L<KO)3"#`)T@$E"D$HC,QXJ8'Q(+5*1./IV"9%E(P1P0X72H(>,
     13M.5,*Q(&"960IJ2``I#3"R2;:_F*T,7-QD3DT.VJ):X@D;D]TQAJW.%0-;2$0
     14MAML5&1J%831D'4+(#P,0"'T&DFVHO5N915$7RN]0(\J=5J*8_%UL-E8HG8VS
     15MF/1C/FLKVA:T\1(O];)127/H2OIF:5-Z"=`$'ZF@*=!T4-)<-"6].JOHFX^*
     16M?J.BN8R_ZWZIHG](_Y0T@"D^!07&E!T!%3+0#(<H):Z$&(HQ'5<WUIB2T\2W
     17M`7P1.7<4J`IQY'/.9#"47Z"UGIHS,!?<@9E@+U5XJ>0=<0SFB',&T#%7,E2.
     18MNA0!MI(1]]#VEFE*G9-J/:+`Y<=2T$*KX=J44EQ-DS%<,QZ^`I==]'9U+=QO
     19MH_LG^+OZ@EV>'\EF>2&69Q,-%`^CYF`B$;%0C-N$"/$H4[\]3BYYN\/8@47#
     20M.6!BU#2`":XYKK'Q\3L?=)9.#/Z9C^SSF/?D>:VC\*#M*"NO/)6^&K24\,V6
     21MHD^WA`S)SH6'6>=V!-/,2WP[%FZ,'7DN[7>:G=RC]NKP<7/XCWT&V.#FT.\G
     22MX`WSW2U'M`(;2C?#HAG)TA7I`".M+:'"*;*W!NNEG!IGI>),;M"3@^X%-I`;
     23MB)/<0`[EAE?2D=0@&%Y(O?WA-*->?UM]J.A-%87_[VUEAIK9GQTXOWP]'+H=
     24AACI[&:-CJ`?ZB&;N7Y+]*_147?'KQ>?)OT@;@-);#0``
    2625`
    2726end
  • Tst/Short/bug_46.stat

    r231da1 r8e865c  
    1 1 >> tst_memory_0 :: 1192546949:2007101112:3-0-3:ix86-Linux:nepomuck:409440
    2 1 >> tst_memory_1 :: 1192546949:2007101112:3-0-3:ix86-Linux:nepomuck:965028
    3 1 >> tst_memory_2 :: 1192546949:2007101112:3-0-3:ix86-Linux:nepomuck:965028
    4 1 >> tst_timer_1 :: 1192546949:2007101112:3-0-3:ix86-Linux:nepomuck:95
     11 >> tst_memory_0 :: 1268039025:3110-2010030517:3-1-1:ix86-Linux:nepomuck:346280
     21 >> tst_memory_1 :: 1268039025:3110-2010030517:3-1-1:ix86-Linux:nepomuck:892928
     31 >> tst_memory_2 :: 1268039025:3110-2010030517:3-1-1:ix86-Linux:nepomuck:991232
     41 >> tst_timer_1 :: 1268039025:3110-2010030517:3-1-1:ix86-Linux:nepomuck:40
Note: See TracChangeset for help on using the changeset viewer.