c2x(1)
โจ c2x โจ (section 1 of the manual, bestie)
okay so this is c2x(1) โ it lives in the General Commands Manual and it is, no exaggeration, the most chaotic little format-goblin you will ever meet. buckle up ๐
๐ธ NAME ๐ธ
c2x โ converts various crystal formats including density grid data ๐
๐ฆ SYNOPSIS ๐ฆ
c2x [-OPTIONS] [--FORMAT] [--OPERATION] infile [outfile]
๐ DESCRIPTION ๐
so c2x converts, like, primarily a CASTEP .check file into a whole bunch of output formats, and on top of that it extracts densities (charge, spin, band or psi โ pick your poison) and forces. main character energy fr fr ๐
it can also read CASTEP .cell files and PDB files, Onetep .dat files, and several input and output files from Abinit, Quantum Espresso, Siesta and VASP, with some support for Elk too. think of it as a sort of Babel with support for gridded data and .check files, plus the ability to transform cells and do simple analysis (integration, interpolation, dipole moment calculation, band parity identification). it's giving swiss army knife but make it crystals ๐ฅ
it may have been compiled to give access to symmetry functions from spglib too. so if the symmetry stuff works, that's why ๐
for a full list of supported formats, runc2xwith the--formatsoption. do it. it's iconic.
now the โจvibe checkโจ on how it guesses your format from the filename, because this is genuinely important:
- a file whose name ends
.pdbis assumed to be in pdb format - ending in
.cifโ assumed to be in cif format - ending in
.resโ assumed to be in shelx97 - ending
.cubor.cubeโ assumed to be in cube format - ending
.inโ assumed to be an Abinit or Quantum Espresso input file - ending
.xmlโ assumed to be a Quantum Espresso output file - ending in
.xsfโ assumed to be in xsf format - ending in
.xvorXVโ assumed to be in Siesta's XV format - input files ending
CHG,CHGCAR,POSCAR,CONTCAR,LOCPOTorWAVECARโ assumed to be in VASP 5.x format - input files ending in
DEN,ELF,POTorWFKโ assumed to be in Abinit format - otherwise, if the first byte is either zero, 10 or 30 it is assumed to be a
.checkfile, else it is assumed to be a.cellfile ๐ซถ
it can also read .orbitals files (which are identical to .check files in format), and .castep_bin files (which lack wavefunctions). furthermore, it can read .chdiff files and .cst_esp files. in these cases it needs a .cell or a .check file as well in order to obtain unit cell information. so don't come for it with just the one file, it needs a buddy ๐ญ
โจ OPTIONS โจ
so many flags. every single one. let's go ๐
-aโ rotate as though outputing in abc format, i.e. placeaalong x axis,bin xy plane, andabcform a right hand set. useful if one wants a dx file consistent with a pdb file. see also-3. ๐-Aโ accumulate (sum) bands requested by-b=or-B=.-b[=range]โ include specified bands as psi (real).--bands_fmtโ plot band diagram, fmt is one ofgnu(gnuplot) oreps. optionally append_nsto prevent the identification of special points. c2x's identification of special points is incomplete. (its words, not mine, bestie ๐ซถ)--bravais[=(k1,k2,k3)]โ report Bravais lattice detected, and report label for optional special point.-B[=range]โ include specified bands as densities (psi*conjg(psi)).-cโ include charge density (units electrons per cubic Angstrom).--calcโ evaluate next arg with arithmetic parser and exit.--constantsโ report internal conversion constants and exit.--cubicโ equivalent to--simpson --tricubic.-Cโ find "compact" (near-cubic) set of cell vectors.-dโ read also a corresponding.chdifffile, and output its contents. the filename given must still be that of a.cellor.checkfile, as a.chdifffile contains no axes.--divโ replace a vector dataset with its (scalar) divergence.--dos_fmt[=s][:n][flags]โ produce a Density of States plot. fmt is one ofeps,gnu(for gnuplot) orraw. Gaussian smearing width of s eV, number of bins is n. valid flags are:a(add all spins together)g(adjust smearing to preserve gaps)G(always use Gaussians, not tetrahedra)m(mirror plot)r(rotated plot, eps only)
Bloechl's tetrahedron method is used if a regular grid is detected unless the G flag is present. ๐
-D=[x,y,z]โ if charge density read (-c), calculate dipole moment about fractional co-ordinates x,y,z, or0.5,0.5,0.5if co-ordinates not given. assumes density has been read as eA^-3.-Da=[x,y,z]โ as above, but also report post-hoc energy correction for slab geometry for the a axis being the non-periodic axis. valid values of a:a,bandc.-Dm=[x,y,z]โ as above, but also report post-hoc energy correction for a molecule in a cubic box, or for a molecule in a tetragonal box if dipole moment is parallel toc.-eโ read also a corresponding.cst_espfile, and output its contents. the filename given must still be that of a.cellor.checkfile, as a.cst_espfile contains no axes.-e=tolโ set symmetry tolerance to given number of Angstroms.-E[=[-][mu]]โ calculate electrostatic potential, assuming that an electron density has been read (implies-c). ions are treated as Gaussian blobs of charge of extentexp(-mu^2r^2). if the ionic charge differs from the atomic number, a further localised smoothing of the atomic potential occurs, unless the first character after the=is-. with-E=0, a bare Coulomb potential is used.-fโ calculate first failure start of k-point set.--fbzโ calculate first Brillouin zone.--fftโ use FFT interpolation to move gridded data between different unit cells, and with-z.--formatsโ list supported formats.--frame=Nโ extract single frame from series of time steps. frames are numbered from zero, and negative numbers represent offsets from the end of the sequence, so--frame=-1will extract the final frame. (negative indexing, we love to see it ๐ )-Fโ calculate the potential, then its gradient, to give an electric field.--gapโ print band gap in eV.--gradโ replace a scalar dataset with its (vector) gradient.--grad2โ replace a scalar dataset with the result of the Laplacian operator.-Hโ shift atoms by half a grid cell. for use with xplor data format, see below.-i=nx,ny,nzโ Fourier interpolate onto specified grid size. new grid may be coarser or finer than original. any dimension given as zero is replaced by old grid size. if reading wavefunction, any grid truncation is done after transforming back to real space and converting to density etc.--ibzโ calculate irreducible Brillouin zone.-I[=range]โ report whether bands have inversion, and parity under inversion. if combined with-bor-B, the last range given is used.-k[=range]โ include given kpoints for bands (default range is1).-lโ if k-points are to be included in a.cellfile, explicitly list them rather than using the MP generation parameters.--ldos=specโ in combination with--dos, locally project DoS. the spec is in one of the below forms:f1-f2adefines a slab. the final character, from the setabcABC, gives the axis. if the axis is lowercase, f1 and f2 are in fractional co-ordinates. if uppercase, Angstroms.{atom}:{radius}[+{atom}:{radius}[+...]](a,b,c):{radius}[+...]defines one or more spheres, radii in Angstrom, or in Bohr ifBis suffixed. co-ordinates are fractional. if{atom}is an atomic symbol, the first such atom is used. suffix with an integer to select a particular atom, or with a*to select all atoms of that species. e.g.
--ldos=Fe1:0.8+Fe2:0.8
--ldos=Fe*:1.6B
{atom}:r{r1}-{r2}[a|b|c](a,b,c):r{r1}-{r2}[a|b|c]M:r{r1}-{r2}[a|b|c]defines a cylindrical shell. co-ordinates give centre of cylinder, withMbeing(0.5,0.5,0.5). the:ridentifies this as a cylindrical projection. radii in Angstrom unless each is suffixed withB. final letter gives the axis, withcassumed if absent.
-Lโ output in abc format assuming that abc describes a left-handed set of axes.
do not use this unless you understand why you should not! ๐จ for real for real, this one is a trap and it is telling you so.
-m[=a,b,c]โ assume input is molecule, not crystal. try to avoid outputing a cell, shift if some co-ordinates are negative, or if a,b,c given shift by those numbers of FFT grid cells.-m=(a,b,c)โ assume input is molecule, not crystal. try to avoid outputing a cell, shift atoms by fractional co-ordinates given.-nโ discard symmetry information, and, if output is XSF, discard forces. give twice to discard k-points too.-Nโ normalise by reducing fractional coords to0<=x<1. in conjunction with-m, do output a cell.-Oโ print band occupancies and evalues to stderr.-Pโ find primitive cell with own internal algorithm, not spglib.-P=p1:p2:nnโ output data as line of nn points from p1 to p2. express p's as either fractional co-ordinates in the form(x,y,z), or an atom position as, e.g.,Si3for silicon atom number 3, or simplySifor the first Si atom. using a0(zero) for a p is equivalent to(0,0,0), and the three cell axes"(0,0,0):(1,0,0):ngx+1"(etc.) can be specified asa,bandc. each co-ordinate is passed to the arithmetic parser, so1/3is acceptable for a third, etc. ๐-P=p1:rl[a]:nnโ output data with cylindrical averaging. p1 is the centre of the cylinder, rl (literalr, followed by a length, suffixed byBif Bohr) is the radius, and nn the number of points. the axis of the cylinder is given by the optional charactera, and defaults tocif not given. the other axes must be perpendicular. data are averaged over the cylinder's axis and theta. appendwto number of points to weight samples by two pi times radius, orato weight and accumulate.-P=p1:Rl:nnโ output data with spherical averaging. p1 is the centre of the sphere, Rl (literalR, followed by a length, suffixed byBif Bohr) is the radius, and nn the number of points output. the number of points for sampling around the spherical surface is chosen to give a similar point separation to that along the line. a length of zero will set the length to the maximum possible given the periodicity. data are averaged over theta and phi. appendwto number of points to weight samples by four pi times radius squared, orato weight and accumulate. ๐ธ-qโ calculate post hoc energy correction for charged isolated system. implies-c.-q[abc]โ calculate post hoc energy correction for charged 2D system. the axis given (a,borc) is the aperiodic one. implies-c.-Qโ sort the atoms on output in descending atomic order.-Q2โ sort the atoms on output in ascending atomic order.
okay bestie that's not even the whole options list, we are literally mid-flag right now โ the page keeps going, so hold that thought ๐
-rโ only reduced (symmetry inequivalent) atoms in cif output, or, if you're rolling with--fbzor--ibz, reduce k-points down to the relevant zone and adjust the weights accordingly ๐--rhsโ if you've got left handed axes, this makes them right handed by exchanging the second and third axes. And if you also pass-3, the exchange is of the first and second axes instead. K-points, symmetry operations and grid data all get converted. no cap โจ-Rโ don't even try to rescale densities, just output them raw. Charge density becomes electrons per unit cell if you're reading from Castep, for instance. Also: no attempting to adjust radius to maintain bond length when you're making a nanotube. raw is raw bestie ๐-R=xโ rescale grid data by factor x, not whatever factor (if any) would normally get used. And if that factor is suffixed with an"x", then yes, do include c2x's usual conversion factor too ๐-sโ include spin density (scalar or vector).--simpsonโ use Simpson's rule for accumulating/integrating, not trapezium rule. fancy math slay ๐ฅ--sym_listโ list symmetry elements found in input, without calling SPGlib.-S[=range]โ include specified spins or spinors for bands (default range is-, and the spins are numbered 0 and 1).-t=(x1,y1,z1)(x2,y2,z2)[(x3,y3,z3)]โ rotate the co-ordinate system so that the first vector becomes the second. First vector given in relative co-ordinates. If a third axis is given, it's used as the rotation axis. Otherwise the rotation axis will be perpendicular to the two axes given.--title=strโ set title. cute ๐--tricubicโ when interpolating, use tricubic (spline) interpolation in place of trilinear interpolation. Slower, might not preserve monotonicity, but it does keep the first derivative continuous. it's giving smooth โจ-T=(x1,y1,z1)(x2,y2,z2)[(x3,y3,z3)]โ rotate the co-ordinate system so that the first vector becomes the second. All vectors given in absolute co-ordinates. If a third axis is given, it's used as the rotation axis. Otherwise the rotation axis will be perpendicular to the two axes given.-uโ use atomic units (Bohrs) when writing.cellfiles and 1D data. Scale densities fromA^-3toBohr^-3when writing.cubefiles.-Uโ scale densities fromBohr^-3toA^-3when reading.cubefiles.-vโ be verbose. Far too much output can be generated if specified more than twice. ๐ญ you have been warned--vec2force[=[species[,species]:]r[i][f]]โ convert vector field to "forces" on each atom. Use the value of the vector at the atom, unless=ris given, in which case average over a sphere of radius r (Angstroms, unless suffixed withBfor Bohr). Ifiis given, integrate rather than average. Iffis given, use a finer grid for averages/integrals. Thefmay be repeated. If species is given, limit "forces" to the given atomic species. See also--cubic. ๐ฆ--versionโ print version information. If preceeded by-v, also print internal conversion factors. (yes, "preceeded" โ that's how the manpage spells it, we're keeping it ๐)--vmodโ replace vector grid data by its scalar modulus.-wโ weight bands by occupancies, orsqrt(occ)if not calculating density.-w=kโ weight bands by k-point weight, but not occupancy.--widthsโ calculate band widths naively. Makes sense only if bands do not cross. โ ๏ธ like, only if they don't cross, bestie-Wโ weight bands by occupancies and k-point weight, orsqrtthereof if not calculating density.-x=(x1,x2,x3)(y1,y2,y3)(z1,z2,z3)[:n1xn2xn3]โ expand unit cell to a new cell specified in terms of the old cell axes. Each co-ordinate is passed to the arithmetic parser, so'sqrt(3)/2'etc is acceptable. Optionally also specify new grid size for gridded data, else this is calculated automatically. math girlies rise ๐ธ-x=ixjxkโ expand cell with a trivial tiling.-X=(x1,x2,x3)(y1,y2,y3)(z1,z2,z3)[:n1xn2xn3]โ expand unit cell to a new cell specified in absolute co-ordinates. Optionally also specify new grid size for gridded data, else this is calculated automatically.-X[abc]=xโ change the given axis/axes to a new length by inserting / removing vacuum around the origin. Removing non-existent vacuum will produce nonsense. ๐ Length may be suffixed withB(for Bohr) ornm.-y=i,j[:x]โ make nanotube. The input cell must havecperpendicular to theabplane, andcas the nonperiodic direction of the sheet to be rolled. The circumference is then defined by the vectori*a+j*b. The vector along the tube's length is found automatically, and the size of the cell perpendicular to the tube's length is given by the optional parameter x, which may be suffixed withB(for Bohr) ornm. nanotube era ๐ง-z=p1โ print to stdout data at the given point, and set output type to null. For specification of p1, see the-P=option.-Z=p1โ ditto, but assume that data represents an electron density inA^-3, and also output Perdew Zunger 81 XC energy.-3โ when moving from a left hand set of axes to a right hand set, rather than exchanging the 2nd and 3rd axes, preserve the 3rd and exchange the 1st and 2nd. This transformation is required if the input is cartesian and left handed, and an abc output is requested. Specifying this flag twice will cause the 1st and 3rd axes to be exchanged. ๐
๐ COMBINING OPERATIONS ๐
The following options expect multiple input files to be given, and perform the specified operation. group project but it actually works ๐ซถ
--addโ Add datasets element-wise.--diffโ Subtract datasets element-wise.--maskโ Multiply datasets element-wise. Although it is assumed that one dataset will be a mask of ones and zeros, it need not be so.--mergeโ Merge datasets. The expected use is merging an atoms-only format with a density-only format to create an output containing both atoms and density. โจ the glow-up merge--merge_pathโ Bandstructure or path data from second dataset will be merged into the first as path data.--multโ Alternative for--mask.--subโ Alternative for--diff.--sumโ Alternative for--add.
When merging, if files contain conflicting data, the one on the right usually has precidence. (again, keeping the spelling fr fr)
When performing operations on grids, the grids must be the same size. The use of -i may assist. In all cases, the cells must be the same.
โ ๏ธ bestie the cells must be the same. no exceptions, that's the vibe check.
๐ FORMATS ๐
The following output formats are recognised. (See the output of the --formats option for the complete list. Most are also recognised for input provided that their filenames have the expected suffix.) it's giving a whole wardrobe of formats ๐
--abinitโ Abinit.abifile (for Abinit version 9 and beyond).--abinit8โ Abinit.infile. The output is insufficient to be a valid input file to Abinit, but can easily be made so.--bandsโ CASTEP.bandsfile, no sorting of bands.--bxsfโ XCrysDen / FermiSurfer file for plotting Fermi surfaces. A symmetry-reduced kpoint set will be expanded. (Not accepted as input.) ๐ซ no takebacks--ccp4โ CCP4 density map format. Note no atomic positions can be recorded in this format, and c2x will always produce a right-hand set of axes unless the input is a lhs and the option-Lis given.--cellโ CASTEP.cell, cartesian cell, fractional co-ordinates.--cell_abcโ CASTEP.cell, abc cell, fractional co-ordinates.--cell_absโ CASTEP.cell, cartesian cell, absolute co-ordinates.--cell_abc_absโ CASTEP.cell, abc cell, absolute co-ordinates.--chgcarโ VASP 5.x chgcar output.--cifโ a very basic and rigid format which may be compatible with some CIF-reading software. (lowkey rigid, highkey works)--cmlโ Chemical Markup Language.--cubeโ Gaussian cube. Atoms and at most one data set.--dxโ Data Explorer. Data set only.--denfmtโ CASTEP formatted density--elkโ Elkelk.informat.--fdfโ Siesta. If a density has been read, a corresponding.RHOfile will be written.--gcoeffโ An ASCII wavefunction coefficient representation--gcoeff_sortedโ The same, sorted by|g|--gnuโ Gnuplot command file for 1D data.--jmol_recipโ Jmol output for Brillouin zones (with--fbzor--ibzonly).--npyโ Numpy array, single dataset, as doubles with-15, else single precision.--nullโ Null output. Throw away all output, but still write some useful information the input to stderr. ๐ yeet--oneโ Onetep.dat, very similar to.cell. Alsoone_abc,one_abs, andone_abc_abs.--pdbโ PDB--pdbnโ PDB, but label the atoms with element symbol and number within that species, e.g.C8,H24,Ca2, rather than just with element symbol. The whole string can contain no more than four characters, so*is used for the numeric part if it would not otherwise fit. four chars max bestie ๐--pyโ a python dictionary, compatible with the Atoms data structure from ASE.--pyaโ a python ASE Atoms data structure.--qeโ Quantum Espresso. Non colinear spins not supported.--qefโ Ditto, atoms in fractional co-ordinates.--shelxโ a subset of the SHELX97 format.--vaspโ VASP 5.x output (poscar or chg).--vertsโ raw list of vertices for Brillouin zones (with--fbzor--ibzonly). Also--verts_fracfor vertices in fractional coordinates.--vmd_recipโ VMD output for Brillouin zones (with--fbzor--ibzonly).--xplorโ Xplor format. Data set only. The grid used in this format is offset by half a grid cell compared to Castep, and as interpolating is inexact, this program does not in this case. Also the grid axes are described in terms ofa,b,c,alpha,beta,gamma, so information about orientation in space is lost. To produce a compatible pdb file of atomic co-ordinates, specify-Hcwhen creating the pdb file. ๐ญ so much lore--xsfโ XCrysDen format. Default. The only format in which multiple data sets are supported. ๐ main character format--xvโ Siesta's.XVformat (positions only, velocities written as zero). Will also write a.RHOfile if grid data have been read. On reading, will also read aFORCE_STRESSif present. Note thatFORCE_STRESShas no prefix.--xyzโ XYZ format. Atoms only, no unit cell.
Where a range is required, it can be specified as a single integer, two integers separated by a hyphen (all integers in the given range), or a comma-separated list of any of these elements. Only for the xsf output format is a range including more than a single integer meaningful. ๐ธ
๐ ๏ธ OPERATION ๐ ๏ธ
okay so if your c2x got compiled with spglib riding along, then bestieโฆ a whole lil suite of spglib operations opens up for you. here's the tea:
--intโ runsspg_get_dataset()and reports back the international symbol โจ--listโ runsspg_get_dataset()and lists out the symmetry ops for you--pointโ runsspg_get_dataset()and then follows up withspg_get_pointgroup()--primitiveโ runsspg_find_primitive(), which is equivalent tospg_standardize_cell(to_primitive=1, no_idealize=0). heads up: this may rotate the cell to a standardised orientation ๐--primitive_nrโ runsspg_standardize_cell(to_primitive=1, no_idealize=1), so likeโฆ primitive, no rotation. periodt.--refineโ runsspg_refine_cell()--schoenโ runsspg_get_schoenflies()--snapโ runsspg_standardize_cell()and then expands back out to a snapped version of the original cell ๐ซฐ--snap_trโ ditto bestie, but this time it includes any translation introduced by spglib--standardiseโ runsspg_standardize_cell(no_idealize=1)--std_idealโ runsspg_standardize_cell(no_idealize=0)--symmetryor--symmโ runsspg_get_dataset()and keeps the symmetry ops
๐ NOTES ๐
okay this is the part where we get into the โจdetailsโจ so lock in.
For the pdb formats, literally just the unit cell and the atomic positions get read or written. that's it. For the dx and xplor formats, just a single data set is written. For the Gaussian cube format, atomic positions and at most one data set are recorded. And for the XCrysDen format? unit cell, atomic positions, forces, and any number of data sets get recorded. she does the most ๐
When you're reading a .geom file and writing out a format that holds a single frame, the last frame is what gets written โ unless you pass the --frame option, then it's whatever you asked for.
When it reports symmetry operations, all co-ordinates are fractional. noted ๐
no cap, the pdb format has a very low precision for storing co-ordinates. and because it stores the unit cell inabcformat while the atoms go in absolute coordinates, a rotation is likely gonna be required to placeaon the cartesianxaxis, etc. if so, it gets done automatically. same deal for theabcvarients of the cell format and for the Xplor and cif file formats. for other formats, you can specify that rotation explicitly. additionally, the axes must form a right-handed set. if they don't? two axes get interchanged. by default,bandcare the ones exchanged, but the flag-3will causeaandbto be exchanged instead.
The cif reader reads little more than c2x's own cif output. it is very basic, and it will fail to read correctly a large number of valid cif files. and ngl there is currently no intention to produce a proper cif reader. she said what she said ๐
When outputting psi, it's assumed that it's possible to make psi real by unwinding any phase produced by the k-point, and then multiplying all points by the same arbitrary complex constant. if that's not the caseโฆ the band was probably nonsense anyway ๐. and the final choice of a factor of -1 is arbitrary. this scheme produces nonsense if you try to plot a degenerate band. you've been warned bestie.
When doing the conversions that come from -x, a new grid gets chosen with a density similar to the old one, and the data gets interpolated onto that new grid using trilinear interpolation. Extrapolating psis (rather than densities) is meaningless except at gamma, because the phase due to the k point isn't considered. so don't even try it ๐ญ
Densities by default are in Angstroms**-3, and psis are in Angstroms**-1.5 โ save that .RHO files are written in Bohr**-3 as expected. keeping it classic.
๐ EXAMPLES ๐
okay bestie, here's how you actually do things.
To extract the charge density in xsf format:
c2x -c input.check output.xsf
To extract the first four bands as psi at the second k-point in xsf format:
c2x -b=1-4 -k=2 input.check output.xsf
To convert a check file to a pdb file:
c2x --pdb input.check output.pdb
To convert a cell to something containing two repeat units in the a and b directions, and one in the c direction:
c2x --cell -x='(2,0,0)(0,2,0)(0,0,1)' in.cell out.cell
or, from c2x version 2.30:
c2x --cell -x=2x2x1 in.cell out.cell
Assuming the above cell was a 3.5A cube, the same in absolute co-ordinates:
c2x --cell -X='(7,0,0)(0,7,0)(0,0,3.5)' in.cell out.cell
To change a cell containing one layer of bulk in the c direction to one containing four layers, and sufficient vacuum to make a total length of 30A:
c2x --cell -x=1x1x4 -Xc=30 in.cell out.cell
slay. go make some crystals โจ๐ฎ
๐ VIEWERS ๐
The following viewers have been used during the development of c2x: Avogadro, FermiSurfer, gabedit, Jmol, pymol, VESTA, VMD and XCrysDen. the whole squad showed up ๐ซถ
๐ BUGS ๐
None known. ๐ โจ
Please report others to MJR.
๐ ACKNOWLEGEMENTS ๐
If you wish to cite, please do so as "C2x: a tool for visualisation and input preparation for Castep and other electronic structure codes", MJ Rutter, Computer Physics Communications, vol 225 pages 174-179 (2018).
http://dx.doi.org/10.1016/j.cpc.2017.12.008
Details of spglib can be found at https://atztogo.github.io/spglib/
๐ SEE ALSO ๐
babel(1)https://www.c2x.org.uk/
and that's the whole page, bestie ๐ this was the c2x(1) manual โ go forth and visualise, mwah ๐
๐ฆ where this page comes from
- ubuntu resolute: c2x 2.42.a+ds-2 ยท GPL-3.0-only
- ubuntu stonking: c2x 2.42.a+ds-2 ยท GPL-3.0-only
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms