Abstract: A software for analysis of optical properties of Cassegrain radio telescopes with offset primary is detaily described. An executable for Windows (9x, XP) environment is made available for download. First results of its application to symmetrical (nonoffset) designs suggest that the widely practiced Ruze approximation for gain losses may be less universal than thought of till now. 
OptiCass basic working relies on the ray tracing method and the Fourier transformation (DFT) of so obtained amplitude distribution on the telescope aperture. Unlike the sophisticated telescope design programs found on the market, OptiCass never uses paraxial technique its ray tracing is exact for all rays also for axially symmetric configurations. As presented here it was developed during the first quarter of 2005 as completely original program. No borrowed procedures are involved except a graphics library for writing output plots in PostScript, the PSPLOT, which is free.
The program accepts some two dozens of input parameters and returns a number of derived parameters describing geometry and optical properties of a telescope corresponding to the current setup. User is given possibility to modify input parameters until the desired properties are arrived at. During this process the user may save intermediate results in text or PostScript files or copy some of them directly from the screen. Initial input parameters can be read from a parameter file or taken from an earlier saved session.
Filenames of .par files read at the start are limited to 8 characters, but those read through the command line argument (drag'n'dropped) haven't any restriction as to the name length or extension type. Other files of the above list are given the .par file name. In case of the $ and ENTER input, or of error in the attempt to open a .par file requested (whereupon default parameters are assumed) OptiCass gives names for the outputs in the form RTddd or RTdd_, where dd(d) are two (or three) digits of the telescope diameter, D, in metres. E.g., RT05_ is for D = 5 m and RT200 for D = 200 m.
Fig. 1: OptiCass opening window. It contains a brief summary of commands and prompts for specifying the source of input parameters. One may just press ENTER and modify the defaults assumed later, on next prompt. 
The user is given a few options to chose from. One of six preset files can be read in (it must be placed in the parent directory) or a user prepared file name typedin following a * character (the name in this case can be 8 character long at most, and must be typed without extension which is assumed to be .par). Parameters can be read also from most recently saved parameters (the $ option) or they may be made to assume values preset internally by the program (this happens also if a requested par file does not exist).
Of the six .par files known to OptiCass the last one may be useful for checking whether OptiCass works properly in a new environment by comparing TestO.txt and TestO.ps files, generated through simple run of the program, typingin "6" on the first prompt and then "q" on the second (or just dropping TestO.par onto OptiCass.exe and typing "q"), with existing files named TestOptiCass.txt and TestOptiCass.ps.
Having successfully read 25 to 30 input parameters the program computes the remaining parameters (about 50 in number) and displays all of them in a compact table. The second screen that will appear may look like this:


The parameter units are only metres, degrees, decibells, percents or none for dimensionless quantities. They are also indicated in the textual body, although not uniquely, but this aspect should not cause any problem for one who knows the parameter meaning. In case of doubt the user may issue the parameter number alone followed by ENTER key to get 6 significant digits of the value together with brief info and units (see bottom part of Fig. 2).
Input parameters
There are 5 rows of fully SETTABLE parameters in the displayed table. The 6th
row (unnumbered) contains two conditionally settable parameters. Brief
explanation of the content of successive rows follows.
Cassegrain: D,X_min,f,Xs_max,h2 [m] 0These 5 parameters are most basic and specify fully the optical geometry of the Cassegrain telescope without any imperfections or offsets. The parameters are:
Subreflector: x,y,z, tx, ty [m,deg] 1 Feed offsets: x,y,z, Dtx,Dty [m,deg] 2x,y,z offsets (translation or just coordinates) of the secondary mirror first focus (the one which in perfect alignment coincides with the prime focus); in case of the feeds these are its displacements from nominal place, the secondary focus (z measured positive toward the subreflector).
Raytracing: N/R, Nu,Nv, u_max,v_max 3N/R integer number of equidistant points on the circular aperture radius. For unblocked aperture it cannot exceed 68 (corresponding to about 15000 points or rays to be traced). The larger is this number the slower is computing of power patterns.
Wavel,Taper,zAprt,pltD,pivot [m,dB,] 4Wavel observing wavelength.
COMPUTED param's & x,z_piv,du,v,NThe first two parameters in this row are x and z coordinates of the secondary center of rotation (in xz plane), then there are working parameters of little use (they represent shift in u and v of peak of power pattern wrt direction of central ray the one reflected from the secondary at the point corresponding to center of aperture in absence of offsets; the last parameter represents the same shift but in numbering of pattern points as organized in the internal array; its nonzero value may be indicative of excessive distortions of the main beam in u (N is a small integer) or v (N is close to a multiple of Nu).
Main dish: f/D,f/Dp, D2, G,coordG [m] 6f/D focal distance to diameter ratio.
angles: t_V,t_H, t_0, t_1, t_2 [deg] 7t_V dish vertical opening (subtended) angle.
Subreflector: Dc,Dm,Ds2,Gs,Xs_min [m] 8Dc secondary mirror lateral diameter at center (below mid point of longest diameter).
feed angles: t_VH,t_c,_0,_1,_2 [deg] 9t_VH secondary opening cone (subtended) angle.
Cassegrain: f1, f2, fs, F, M [m,] 10f1 first focal distance (parent hyperboloid vertex to prime focus).
Hyperbola: a,c,b,e, FSAmpRatio [m,] 11a constant of canonical (in Cartesian coordinates) form of parent hyperbola equation.
Beam: t_u,t_v, HPBW_u,_v,_0 [deg] 12t_u main beam direction offset downward in vertical plane (udimention).
Squint, phi_X,Y, apert_X,Y [deg,m] 13Squint absolute value of main beam offset (square root of t_u^{2} + t_v^{2}).
Loss: Aberr,Spill,A&S,IllDec,Totl [%] 14Aberr aberration (coma and astigmatism) loss of antenna efficiency.
pathR, ComaLow,Hi,Aber0,Totl'[m,%] 15pathR range of ray path (focus to aperture) errors (max min).
Press ENTER,q,$,c,m,o,a,p #i, or #i value (e.g. 40 0.060):the user may issue one of the indicated commands, where:


15.6094 3.1981 0.25704 0.38305 15.6095 2.4173 0.26946 0.13258 15.6095 1.6366 0.27833 6.16520where the third column contains the ray amplitude and the last column its phase in radians. This example was obtained for the 32OCRA parameters of Fig. 3.
The .pat and .res files both have the same structure. The third column contains just the pattern or differential pattern value at indicated spatial frequencies. Here are the first three rows of the 32OCRA.pat file, again generated with parameters of Fig. 3.
2.5000 4.1403 350.4 2.2917 4.1403 111.9 2.0833 4.1403 3.1The 32OCRA.res looks the same except that the third column contains in this case values 4.2, 4.4 and 0.9.
The .txt file consists of a list of various parameters followed by excerpts of the .dat, .pat and .res files. Ray amplitudes and phases are given here only for points originally lying (i.e. corresponding to offsetfree positions) along xaxis and perpendicularly to it through the aperture centre. Similarly, the power patterns are represented by their sections along u and v through the midpoint of the array (corresponding to beam direction). The three rightmost columns represent the actual pattern, aberrationfree pattern (computed from the same amplitudes but with phases zeroed), and reference pattern (for amplitudes weighted with illumination functions calculated as if there weren't any offsets), respectively.
The .ps file is a plot of the power pattern or 'voltage' pattern (i.e. the square root of power), residua and ray distribution on the aperture plane (see Fig. 5 for an example). It has also an outline of the two mirrors and some numerical results.
Functional diagram
The figure that follows (Fig. 6) presents an OptiCass internal
structure. Most of
interactions with the user take place in the subroutine ReadParam called by the
the main program (the latter reads initial .par files and writes .txt and .ps
files). Essentially all the parameters are computed through call to the RTPattern
subprogram.
RTPattern calls the Amplitudes subprogram to get an amplitude distribution
on the telescope aperture and transforms it to power pattern via DFT. Now
the location of pattern peak is determined by a 3point fit of parabola (subroutine
FindMax finds an exact solution to this problem; independently for each of
spatial frequencies) around a maximum value of the transform and then
the pattern is computed anew for shifted (usually slightly) spatial frequencies
so that now the peak exactly concides with the center of user defined u and v range.
So found location of maximum is represented by the parameters t_u and
t_v; the third parameter describing the beam deviation, Squint,
is equal just to (t_u^{2} + t_v^{2})^{1/2}.

Cassegrain geometry
Basic geometrical parameters are calculated from well known formulae (see e.g.
this set of parameters) and
are implemented in various parts of the program. Therefore adopting other than
Cassegrain configurations, e.g. of the Gregorian telescope, although certainly
possible, would not be a straightforward task.
Ray tracing
The RayTrace subroutine takes as the input coordinates
of a point on
the aperture (distance from paraboloid axis R_{i}, and angle seen from
the axis between direction to the point and xaxis) to determine coordinates
of the point of incidence on the subreflector assuming a perfect collimation.
Then it computes (this time accounting for all the offsets) full path of a ray
emitted from actual position of feed, and reflected from this physical point
on the secondary mirror, up to the aperture plane as fixed by the user. As
geometrical optics requires it, the rays are assumed to propagate along straight
lines and follow strictly the law of reflection. The subroutine
returns coordinates of the ray on the aperture plane, pathlength (distance
from feed to aperture), direction cosines at the feed and at the aperture,
and coordinates of point of reflection on the primary mirror.
Also determined is the distance of reflection point on paraboloid from
aperture center, required later to recognize rays missing the dish or those
blocked by the subreflector.
The procedure is fast because care was taken to avoid trigonometric functions, wherever practical. Computation of all the amplitudes turned out to be about two orders of magnitude faster than to DFT them.
Amplitude distribution
To determine the power pattern, amplitudes are computed at number of points
on an aperture plane and later are Fourier transformed to the spatial frequencies
domain. The amplitudes, in OptiCass generated in the Amplitude subroutine, are
weighted by one of the following two illumination functions:
Thus weighted amplitudes are supplemented with signal phases (computed through division of ray pathlength by the wavelength) to form complex quantities.
Parallelly to the above described main process of computing the complex amplitudes the same procedure (Amplitudes) creates also similar array for reference, in which amplitudes are differently weighted and are phaseless (i.e. real). The weighting function is here of the same form but computed for completely offsetfree telescope.
The aggregate power, PL (sum of squared amplitudes), associated with rays
that miss the dish is used to calculate
the parameter named Spill. For offset paraboloid telescope (more precisely,
if X_min > 0) it is simply equal to
Spill = 100 PL/PT,
where PT is the sum of squared amplitudes of all the rays traced. In the case
of symmetrical telescope a correction to this quantity is made for rays that
due to skewed main beam happen to fall within a subreflector shadow (are
blocked by the secondary). Since in this small central part of the dish there
are too few rays for sensibly continuous correction, use is made of a mathematical
expression for the additionally blocked area. It is based on the fact that a fraction
of area sticking out on one side (a crescent) of two equal circles with centers
σ (here expressed in the circle diameters) apart is equl to
Power pattern and losses
Computation of power patterns and characteristics of a radio telescope
performance based on ray tracing is all done in the RTPattern procedure.
As mentioned, such
pattern is obtained with the help of a Direct Fourier Transformation of
amplitudes to spatial frequencies domain. The sum of squares of the real and
imagery components of this transform is taken for the power pattern measure.
The spatial frequencies, u and v, as originally defined are number of (sinusoidal) cycles per the aperture radius (D/2). Given the observing wavelength λ, they may be conveniently expressed in terms of angular distance from the telescope symmetry axis:
Up to three patterns are computed: the one from the complex amplitude distribution,
P(u,v), one from the same amplitudes but phases zeroed, P0(u,v), and a reference
pattern obtained from the auxiliary real 'offsetfree' amplitudes, Po(u,v).
One of the most important parameters, the aberration loss of antenna efficiency
is calculated as
Aberr = 100 (1 P_{max}/P0_{max}),
where the subscript max indicates the peak of respective pattern.
It is understood that this parameter includes the astigmatic and comatic fractional
losses, which in classical approach are calculated separately. Other parameters
related to the gain loss are calculated as follows:
A&S = 100 (100 Aberr) (1 Spill/100)
IllDec = 100 (1 P0_{max}/Po'_{max})
TotL = 100
(100 Aberr) (1 Spill/100) (1 IllDec/100)
TotL' = 100 [1 (P_{max}/P0_{max}) PT/Po_{max}]
ComaLow = 100 PD_{min}/P_{max}
–Hi = 100 PD_{max}/P_{max}
where Po'_{max} is same as Po_{max} but computed with zeroed
amplitudes of lost rays (rays spilled over), PD_{min/max} refer to
the extreme values of a differential pattern.
The differential pattern is obtained from the 'offset' pattern, P, by
subtraction from it of the reference power pattern, Po, normalized to P_{max},
i.e. PD = P Po (P_{max}/Po_{max}). The .res file and the distortions
plot in .ps file will usually contain just these differences. Should, however,
the user set pltD = 2., the reference would be made instead to the
pattern obtained from 'offset' amplitudes but with phases zeroed (P0) and the
'offsetfree' amplitudes would be discarded altogether (Po not computed).
The power pattern P(u,v) is further analysed in the vicinity of its maximum for points of half maximum, separately in u and v dimensions on either side of the maximum. Each of the 4 points is determined by linear interpolation between nearest two discrete values of P found. These then are used to determine HPBW_u and _v parameters.
Closed formulae
To have an 'on line' check on results obtained from the ray tracing
analysis, the OptiCass
computes also some parameters based on closed formulae taken from literature.
All of them are grouped in the subroutine Formulae, although a few are
used also elsewhere (for the subroutine is executed only when the user
issues the 'a' command and to write to the .txt file).
The sources are as follows:
J.W.M. Baars, 2003: Characteristics of reflector antenna,
ALMA
Memo 456.
J.W. Lamb, 1999: Optimized Optical Layout for MMA 12m Antenna,
MMA Memo 246.
R. Padman, 1995: Optical fundamentals for array feeds, MultiFeed
Systems for Radio Telescopes, (D.T. Emerson and J.M. Payne, Eds),
ASP Conference Series, vol. 7.
P.S. Kildal, 1983: The effects of subreflector diffraction on the aperture
efficiency of a conventional Cassegrain antennaAn analytical approach,
IEEE Trans. Antennas Propagat., vol. AP31, no. 6, pp. 903–909, Nov. 1983.
Useful information in this respect is also contained in:
B. Shillue, 1997: Gain Degradation in a Symmetrical Cassegrain Antenna Due
to Laterally Offset Feeds,
MMA Memo 175.
B.J.Butler, 2003, Requirements for Subreflector and Feed Positioning
for ALMA Antennas, ALMA Memo 479.
The beam deviation factor (BDF), used in a few formulae, is calculated
according to the prescription given by Baars, however reduced
to the following simpler equation:
K = f_{D}{2(τ f_{D} + 1)[1 f_{D} log(1/f_{D} + 1)] τ}/(1 2 τ/3),
where τ = 1 10^{Taper/20}, and f_{D} = (4 M f/D)^{2} with M being the
magnification of Cassegrain system (M is set to 1 while computing
the prime focus BDF, K_{p}). This assumes parabolic on pedestal
illumination function and
is used in OptiCass also for the Gaussian illumination function (therefore
the absolute value in expression for τ). The
HPBW_0, first sidelobe level, all the other beam deviations
and feed offsets listed in the discussed table are also calculated according
to Baars except for the case of secondary mirror rotation about center at
an arbitrary zcoordinate. These formulae were checked to nicely agree with
numerical results from OptiCass' ray tracing. The mentioned
case of arbitrary z is calculated from a combination of Baars' expressions
for translation and rotation about vertex, namely:
[(2c + z_piv) K/M z_piv K_{p}]/f.
(the derivation can be found in a separate document).
Formulae applied for calculation of gain loss due to diffraction on secondary and due to
feed offsets as well as that for the Petzval radius are all adapted directly from
Lamb.
For example, the cited Shillue's Memo states that the 8m MMA telescope
at λ = 0.35 mm and with the 12dB parabolic
illumination function would have 0.75% gain loss for 152.4 mm laterally
offset feed (this is essentially, within 0.01% of, what obtains with classical
approach formulae adopted in OptiCass). With the OptiCass optimization of zcoordinate
of so offset feed (optimal zoffset turns out to be equal to 42.5 mm)
the aberration loss is found to be 0.61% for the uniform illumination
of the aperture due to the feed radiation pattern, and only 0.48% for parabolic
12 dB taper. This is about 2/3 of what Shillue has found somewhat disturbing
observation. The difference cannot be explained out by the freespace
tapering (included in OptiCass), because in this example it amounts to only about
0.01 dB at the dish edge. With OptiCass it is possible to optimize
also the feed radiation pattern direction. In this case, however, such optimization
reduces the aberration losses only insignificantly.
We note on passing that with these feed offsets (lateral and axial) the range
of pathlength errors (discussed in the following paragraph) is 24 mm i.e.
±34 λ, which corresponds to the beam squint
of about 69 uunits (t_u = 0.173° or some 60 beamwidths).
In order to check that the OptiCass ray tracing algorithm does not contain any serious flaw the program output phases were compared with five examples based on ALMA telescope studies (which included ray tracing) performed by J.W. Lamb (in Butler, 2003) and published in the form of drawings. OptiCass produced results that were in very good agreement in all the 5 Lamb's cases as to the range of the path errors, shape of curve and the sign convention (except for the last case, where OptiCass uses opposite signing of the tilt angle).
Ruze ~1.9 ~1.2 ~5.6 ~1.7 ~2.2  OptiCass 1.925623 E–5 m axial movement of feed of 1 cm 1.218378 E–3 m lateral feed shift of 1 cm 5.565040 E–3 m axial movement of secondary mirror of 1 cm 1.656128 E–2 m lateral movement of secondary mirror of 1 cm 2.163380 E–2 m tilt of secondary mirror of +1 or 1 deg 
In the above table the first column is an eye estimate of what was drawn in the Lamb's Memo and the second column gives a full precision output of OptiCass parameter pathR (obtained by typing '150' on the command prompt). These many digits here are meant for other prospective users of the program as yet another check of their installation.
Fig. 7 presents more complete comparison for the 5th of the discussed cases corresponding to most involved term (subreflector tilt about the mirror vertex) and quite an extreme situation (the tilt of 1° at 300 GHz would result in nearly 70% loss of gain!). Nevertheless, as seen in this figure, OptiCass numerical phases agree very nicely (although not perfectly) with Ruze's approximation formula. For this comparison the Ruze term was calculated from the expression given in Lamb's Tab. 1. The gap in the figure centre corresponds to the ALMA subreflector shadow on the aperture. This sort of data is normally contained in the OptiCass .txt file (amplitudes and phases along sections through the centre of aperture), even though the phase there is given in radians and in presence of large offsets may exhibit discontinuities of 2π (to avoid these jumps it suffices for the user to set a suitably longer wavelength, λ = Wavel). The phases multiplied by λ/(2π) correspond to the pathlengths modulo the wavelength.

Certain practical analyses were carried with OptiCass in relation to the existing Torun 32m radio telescope. These also demonstrate good agreement of ray tracing beam parameters (deviations and width) with classical calculations. An English reader may wish to verify this statement by having a glance at Tab. 1a therein. Fig. 1 in the same report gives an example of another useful application of OptiCass.
The described tests seem to demonstrate that OptiCass does not contain any fundamental fault in implementation of the ray tracing method, which would lead to underestimates of aberratic losses of antenna gain. If the program erratically estimated the position of DFT peak value, it would result in rather overestimated losses. Thus it is difficult to avoid the conclusion that the approximate solution of Ruze with an expression for the Seidel aberrations relying on smallness of phase errors may not be as straightforwardly applicable as presently assumed. An inadequate elimination of phase drifts across the aperture (that correspond to beam squint) from phase errors represented by the aberration expression (see Shillue's Memo) would lead to overestimates of losses since the losses would then represent just the antenna gain somewhere off the main lobe peak. Butler mentions of fitting a plane to the errors derived from approximate expressions while computing his losses. He doesn't give full details, but his estimates for ALMA feed offsets seem to be much overestimated. E.g. from his Fig. 2 we see about 1% gain loss for 10 λ of the lateral offset while both the Lamb's formulae and OptiCass indicate the loss to be a few orders of magnitude smaller (assuming λ = 0.46 mm). Similar situation is with his Fig. 1 while the other three estimates for subreflector are in good agreement with what OptiCass gave. Obviously enough, subtracting a (somehow) fitted plane does not guarantee that the rest of analysis is carried at exactly the beam peak, where the least losses occur. OptiCass does it by explicitly locating the peak position on the uv plane.
Finally, it should be mentioned that an early (March 2005) version of OptiCass has been used for a preliminary performance analysis of an 80m Cassegrain telescope with offset paraboloid (tackling with such a design has called for a special software and this program is the outcome). A short report is available here.
New in version 1.2 (September the 1^{st}, 2005)
Added experimentally a multiple feed (array of up to 31×31 feeds) mode in
which complex amplitudes corresponding to all feeds are summed for each
ray computed to get the aperture amplitude and phase. Feeds
are represented by 5 parameters each: x,y,z offsets (relative to offsets
defined for the singlefeed mode, i.e. as displayed in the line
Feed offsets: x,y,z ... in Fig. 2 and 3), amplitude
and phase. These can be read from console
or a file with a structure similar to that given in the example of 'feeds.dat'
file. Anything in it before the line 'Array size Nx,Ny' is assumed to be
a comment. The two numbers (Nx,Ny) tell OptiCass how many feeds are in each
column and row to be read subsequently.
This structure may or may not correspond to physical dimensions of the array;
e.g. the user may choose to arrange data of Nx×Ny = N feeds in one
column specifying 'Array size
N,1'. The 5 parameters of each feed may be modified after reading the file
(upon OptiCass query). To initiate this multifeed mode the user sets any nonzero
value to the displayed fractional part of the parameter No 30 (old N/R
changed now to N/R.NxNy)), then (on the following evaluation) he will
be given option to enter filename with the feed data.
If parameter h2 > 1000, it is replaced (in RTPattern subroutine) by
f + Xs_max[(X_min + D)/(2f) 2f/(X_min + D)], which corresponds to a flat subreflector.
Added 1st side lobe level (along +ve uaxis) to parameter set.
N = 200 changed to 1223 as used in SinArray part (entry) of the dftxyAProx
subroutine (in order to better approximate DFT).
Added analytic (somewhat involved) expressions of BDF for Gaussian
illumination function (besides parabolic and uniform functions).
Added analytic computation of gain loss due to tapered illumination
for Gaussian, uniform & parabolic function.
Added plot of power pattern cutoff at 1% level (g command).
Also a number of bug fixes and cosmetic changes were made. Let the user
pay special attention to new meaning of q and g commands as
explained in the 'help' display. To be sure, check parameter meanings
by typing their number alone.
New in versions 1.3 to 1.5 (September the 13^{th}, 2005 to 19 April 2011)
Improved and corrected partial blockage by subreflector (for D/2 > r2s > r1).
Plotting of beam cut at 1 to 99 % level (e.g g500/g501 power/voltage at 50%).
Corrected bug in f/D as printed to the .txt file.
Input files 1 to 6 plus any other (no need to precede them with *).
Modifications to 'help' outputs.
If Xs_max < 0 it is understood as –f2.
added calculation of axistoouterdishedge angles (DishAngle)
and of vertical extent of blind area on subreflector (exSub_blind).
Changed format for Wavel on display (to 4 decimal places).
Changed labels and info in graphs.
New in version 1.6 (May the 24^{th}, 2011)
One of 'if' instructions in RTPattern (for ddu) modified.
Inscriptions on graph modified.
Coma bar has now a sign (it is drawn up or down).
Weighting of outer edge rays added (power lost is now calculated
as squared sum of amplitudes).
Precision of numbers on graphs changed (for small angles only).
New in version 1.7 & 1.8 (July 18^{th}, 2011)
Corrected drawing of subreflector outline on graph.
New procedure option: "+par1,par2,step1,par3,step3,Ntimes,outfilename" —
it tries to minimize par1 with respect to par2 using step1 and Ntimes repeating
this, each time advancing par3 by step3; the results are written to
outfilename file.
New procedure option to scan in frequency with optimization
at 100λ feed offset: "*40 fstep Nsteps outfilename". At each of
Nsteps, wavelength (Wavel) is multiplied by fstep, par 20 (feed xoffset)
is calculated as 100*Wavel, optimization in zoffset performed and
results written to outfilename.
Ray phase on graphs is now absolute (not relative to the centre).
New option to shift pattern graph by fraction of the window:
'54 +/–fract' (it spoils some measurements, e.g. aberration loss;
see comments on usage in this document).
Waighting of edge rays changed; now they extend beyond the edge
up to 1/2 of the distance between rays; spillover corrected for this
extra loss (in perfect alignment rays are situated partly outside dish).
Improved sidelobe detection and done now on both sides of the main beam.
 KMB
(kb@astro.uni.torun.pl)
May 2, 2005. (last modified 2011.06.24) 