EPICS Controls Argonne National Laboratory

Experimental Physics and
Industrial Control System

2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  <20172018  2019  2020  2021  2022  2023  2024  Index 2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  <20172018  2019  2020  2021  2022  2023  2024 
<== Date ==> <== Thread ==>

Subject: Re: Problem with iocsh output in 7.0.1?
From: Andrew Johnson <[email protected]>
To: "Lang, Keenan C." <[email protected]>
Cc: EPICS core-talk <[email protected]>
Date: Tue, 19 Dec 2017 14:16:03 -0600
Thanks Keenan, that must be my bug then!

- Andrew

On 12/18/2017 04:29 PM, Lang, Keenan C. wrote:
> Looked into it. The missing output wasn't being provided by the ioc
> shell, but rather the epicsReadline functions. This can be seen by
> compiling EPICS base 7.0.1.1 with the osd/os/default/epicsReadline.c/h
> from base 3.15.5. Some other parts of how things are displayed will be
> messed up, but the echo'd commands will all be there.
> 
> 
> Keenan
> 
> ------------------------------------------------------------------------
> *From:* Johnson, Andrew N.
> *Sent:* Monday, December 18, 2017 10:20:11 AM
> *To:* Lang, Keenan C.
> *Cc:* EPICS core-talk
> *Subject:* Fwd: Problem with iocsh output in 7.0.1?
>  
> Hi Keenan,
> 
> I believe you were the last person to work on the iocsh scripting code
> in Base, could you check whether your changes broke Mark's use case and
> let us know what you discover please?
> 
> Thanks,
> 
> - Andrew
> 
> 
> -------- Forwarded Message --------
> Subject:         Problem with iocsh output in 7.0.1?
> Date:    Fri, 15 Dec 2017 23:20:39 +0000
> From:    Mark Rivers <[email protected]>
> To:      'Andrew Johnson' <[email protected]>, EPICS core-talk
> <[email protected]>
> 
> 
> 
> I have a vxWorks IOC startup script that mostly uses the VxWorks shell,
> but switches to the iocsh shell for some commands.  In 3.15.5 this works
> fine, and I see the following:
> 
>  
> 
> *****************************************
> 
> value = 0 = 0x0
> 
> <SIS3820.cmd
> 
> # Example vxWorks startup file for SIS3820
> 
>  
> 
> iocsh
> 
> epics>
> 
> epics> epicsEnvSet("PREFIX",                   "13LAB:SIS3820:")
> 
> epics> epicsEnvSet("RNAME",                    "mca")
> 
> epics> epicsEnvSet("MAX_SIGNALS",              "2")
> 
> epics> epicsEnvSet("MAX_CHANS",                "10000")
> 
> epics> epicsEnvSet("EPICS_CA_MAX_ARRAY_BYTES", "500000")
> 
> epics> epicsEnvSet("PORT",                     "SIS3820/1")
> 
> epics> # For MCA records FIELD=READ, for waveform records FIELD=PROC
> 
> epics> epicsEnvSet("FIELD",                    "PROC")
> 
> epics>
> 
> epics> #drvSIS3820Config("Port name",
> 
> epics> #                  baseAddress,
> 
> epics> #                  interruptVector,
> 
> epics> #                  int interruptLevel,
> 
> epics> #                  channels,
> 
> epics> #                  signals,
> 
> epics> #                  use DMA
> 
> epics> #                  fifoBufferWords)
> 
> epics> drvSIS3820Config($(PORT), 0xA8000000, 224, 6, $(MAX_CHANS),
> $(MAX_SIGNALS), 1, 0x20000)
> 
> epics>
> 
> epics> # This loads the scaler record and supporting records
> 
> epics> dbLoadRecords("$(STD)/stdApp/Db/scaler32.db", "P=13LAB:,
> S=scaler3, DTYP=Asyn Scaler, OUT=@asyn($(PORT)), FREQ=50000000")
> 
> epics>
> 
> epics> # This database provides the support for the MCS functions
> 
> epics> dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX.template", "P=$(PREFIX),
> PORT=$(PORT), SCALER=13LAB:scaler3")
> 
> epics>
> 
> epics> # Load either MCA or waveform records below
> 
> epics> # The number of records loaded must be the same as MAX_SIGNALS
> defined above
> 
> epics>
> 
> epics> # Load the MCA records
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)1,  DTYP=asynMCA, INP=@asyn($(PORT) 0),  PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)2,  DTYP=asynMCA, INP=@asyn($(PORT) 1),  PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)3,  DTYP=asynMCA, INP=@asyn($(PORT) 2),  PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)4,  DTYP=asynMCA, INP=@asyn($(PORT) 3),  PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)5,  DTYP=asynMCA, INP=@asyn($(PORT) 4),  PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)6,  DTYP=asynMCA, INP=@asyn($(PORT) 5),  PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)7,  DTYP=asynMCA, INP=@asyn($(PORT) 6),  PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)8,  DTYP=asynMCA, INP=@asyn($(PORT) 7),  PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)9,  DTYP=asynMCA, INP=@asyn($(PORT) 8),  PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)10, DTYP=asynMCA, INP=@asyn($(PORT) 9),  PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)11, DTYP=asynMCA, INP=@asyn($(PORT) 10), PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)12, DTYP=asynMCA, INP=@asyn($(PORT) 11), PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)13, DTYP=asynMCA, INP=@asyn($(PORT) 12), PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)14, DTYP=asynMCA, INP=@asyn($(PORT) 13), PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)15, DTYP=asynMCA, INP=@asyn($(PORT) 14), PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)16, DTYP=asynMCA, INP=@asyn($(PORT) 15), PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)17, DTYP=asynMCA, INP=@asyn($(PORT) 16), PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)18, DTYP=asynMCA, INP=@asyn($(PORT) 17), PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)19, DTYP=asynMCA, INP=@asyn($(PORT) 18), PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)20, DTYP=asynMCA, INP=@asyn($(PORT) 19), PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)21, DTYP=asynMCA, INP=@asyn($(PORT) 20), PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)22, DTYP=asynMCA, INP=@asyn($(PORT) 21), PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)23, DTYP=asynMCA, INP=@asyn($(PORT) 22), PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)24, DTYP=asynMCA, INP=@asyn($(PORT) 23), PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)25, DTYP=asynMCA, INP=@asyn($(PORT) 24), PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)26, DTYP=asynMCA, INP=@asyn($(PORT) 25), PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)27, DTYP=asynMCA, INP=@asyn($(PORT) 26), PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)28, DTYP=asynMCA, INP=@asyn($(PORT) 27), PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)29, DTYP=asynMCA, INP=@asyn($(PORT) 28), PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)30, DTYP=asynMCA, INP=@asyn($(PORT) 29), PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)31, DTYP=asynMCA, INP=@asyn($(PORT) 30), PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(PREFIX),
> M=$(RNAME)32, DTYP=asynMCA, INP=@asyn($(PORT) 31), PREC=3,
> CHANS=$(MAX_CHANS)")
> 
> epics>
> 
> epics> # This loads the waveform records
> 
> epics> dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)1,  INP=@asyn($(PORT) 0),  CHANS=$(MAX_CHANS)")
> 
> epics> dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)2,  INP=@asyn($(PORT) 1),  CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)3,  INP=@asyn($(PORT) 2),  CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)4,  INP=@asyn($(PORT) 3),  CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)5,  INP=@asyn($(PORT) 4),  CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)6,  INP=@asyn($(PORT) 5),  CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)7,  INP=@asyn($(PORT) 6),  CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)8,  INP=@asyn($(PORT) 7),  CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)9,  INP=@asyn($(PORT) 8),  CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)10, INP=@asyn($(PORT) 9),  CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)11, INP=@asyn($(PORT) 10), CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)12, INP=@asyn($(PORT) 11), CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)13, INP=@asyn($(PORT) 12), CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)14, INP=@asyn($(PORT) 13), CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)15, INP=@asyn($(PORT) 14), CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)16, INP=@asyn($(PORT) 15), CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)17, INP=@asyn($(PORT) 16), CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)18, INP=@asyn($(PORT) 17), CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)19, INP=@asyn($(PORT) 18), CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)20, INP=@asyn($(PORT) 19), CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)21, INP=@asyn($(PORT) 20), CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)22, INP=@asyn($(PORT) 21), CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)23, INP=@asyn($(PORT) 22), CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)24, INP=@asyn($(PORT) 23), CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)25, INP=@asyn($(PORT) 24), CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)26, INP=@asyn($(PORT) 25), CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)27, INP=@asyn($(PORT) 26), CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)28, INP=@asyn($(PORT) 27), CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)29, INP=@asyn($(PORT) 28), CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)30, INP=@asyn($(PORT) 20), CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)31, INP=@asyn($(PORT) 30), CHANS=$(MAX_CHANS)")
> 
> epics> #dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template",
> "P=$(PREFIX), R=$(RNAME)32, INP=@asyn($(PORT) 31), CHANS=$(MAX_CHANS)")
> 
> epics>
> 
> epics> asynSetTraceIOMask($(PORT),0,2)
> 
> epics> #asynSetTraceMask("$(PORT)",0,0xff)
> 
> epics>
> 
> epics> # Exit iocsh
> 
> epics> exit
> 
> value = 0 = 0x0
> 
> *****************************************
> 
>  
> 
>  
> 
> However, when I boot the same IOC in 7.0.1 I see this:
> 
>  
> 
> *****************************************
> 
> value = 0 = 0x0
> 
> <SIS3820.cmd
> 
> # Example vxWorks startup file for SIS3820
> 
>  
> 
> iocsh
> 
> epics> epics> epics> epics> epics> epics> epics> epics> epics> epics>
> epics> epics> epics> epics> epics> epics> epics> epics> epics> epics>
> epics> epics> epics> epic                       s> epics> epics> epics>
> epics> epics> epics> epics> epics> epics> epics> epics> epics> epics>
> epics> epics> epics> epics> epics> epics> epics> epics> epics> epics>
> e                       pics> epics> epics> epics> epics> epics> epics>
> epics> epics> epics> epics> epics> epics> epics> epics> epics> epics>
> epics> epics> epics> epics> epics> epics> epics                       >
> epics> epics> epics> epics> epics> epics> epics> epics> epics> epics>
> epics> epics> epics> epics> epics> epics> epics> epics> epics> epics>
> epics> epics> epics> ep                       ics> epics> epics> epics>
> epics> epics> epics> epics> value = 0 = 0x0
> 
> *****************************************
> 
>  
> 
> So the iocsh commands are not echoed, I only see the epics> prompt, not
> the command that is being executed.  This seems like an undesirable
> change in behavior?
> 
>  
> 
> Thanks,
> 
> Mark
> 
>  
> 
>  
> 
>  
> 

-- 
Arguing for surveillance because you have nothing to hide is no
different than making the claim, "I don't care about freedom of
speech because I have nothing to say." -- Edward Snowdon

References:
Problem with iocsh output in 7.0.1? Mark Rivers
Fwd: Problem with iocsh output in 7.0.1? Andrew Johnson
Re: Problem with iocsh output in 7.0.1? Lang, Keenan C.

Navigate by Date:
Prev: Re: Question about Busy Record and ASYN Slepicka, Hugo Henrique
Next: Build failed in Jenkins: EPICS-3.14 #26 PSI Jenkins
Index: 2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  <20172018  2019  2020  2021  2022  2023  2024 
Navigate by Thread:
Prev: Re: Problem with iocsh output in 7.0.1? Lang, Keenan C.
Next: PSI Jenkins Dirk Zimoch
Index: 2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  <20172018  2019  2020  2021  2022  2023  2024 
ANJ, 21 Dec 2017 Valid HTML 4.01! · Home · News · About · Base · Modules · Extensions · Distributions · Download ·
· Search · EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing ·