1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078 |
- This is a multi-threaded multi-pool FPGA and ASIC miner for bitcoin.
- This code is provided entirely free of charge by the programmer in his spare
- time so donations would be greatly appreciated. Please consider donating to the
- address below.
- Con Kolivas <kernel@kolivas.org>
- 15qSxP1SQcUX3o4nhkfdbgyoWEFMomJ4rZ
- NOTE: This code is licensed under the GPLv3. This means that the source to any
- modifications you make to this code MUST be provided by law if you distribute
- modified binaries. See COPYING for details.
- DOWNLOADS:
- http://ck.kolivas.org/apps/cgminer
- GIT TREE:
- https://github.com/ckolivas/cgminer
- Support thread:
- http://bitcointalk.org/index.php?topic=28402.0
- IRC Channel:
- irc://irc.freenode.net/cgminer
- SEE ALSO API-README, ASIC-README and FGPA-README FOR MORE INFORMATION ON EACH.
- ---
- EXECUTIVE SUMMARY ON USAGE:
- Single pool:
- cgminer -o http://pool:port -u username -p password
- Multiple pools:
- cgminer -o http://pool1:port -u pool1username -p pool1password -o http://pool2:port -u pool2usernmae -p pool2password
- Single pool with a standard http proxy:
- cgminer -o "http:proxy:port|http://pool:port" -u username -p password
- Single pool with a socks5 proxy:
- cgminer -o "socks5:proxy:port|http://pool:port" -u username -p password
- Single pool with stratum protocol support:
- cgminer -o stratum+tcp://pool:port -u username -p password
- Solo mining to local bitcoind:
- cgminer -o http://localhost:8332 -u username -p password --btc-address 15qSxP1SQcUX3o4nhkfdbgyoWEFMomJ4rZ
- The list of proxy types are:
- http: standard http 1.1 proxy
- http0: http 1.0 proxy
- socks4: socks4 proxy
- socks5: socks5 proxy
- socks4a: socks4a proxy
- socks5h: socks5 proxy using a hostname
- If you compile cgminer with a version of CURL before 7.19.4 then some of the above will
- not be available. All are available since CURL version 7.19.4
- If you specify the --socks-proxy option to cgminer, it will only be applied to all pools
- that don't specify their own proxy setting like above
- After saving configuration from the menu, you do not need to give cgminer any
- arguments and it will load your configuration.
- Any configuration file may also contain a single
- "include" : "filename"
- to recursively include another configuration file.
- Writing the configuration will save all settings from all files in the output.
- ---
- BUILDING CGMINER FOR YOURSELF
- DEPENDENCIES:
- Mandatory:
- pkg-config http://www.freedesktop.org/wiki/Software/pkg-config
- libtool http://www.gnu.org/software/libtool/
- Optional:
- curl dev library http://curl.haxx.se/libcurl/
- (libcurl4-openssl-dev - Must tell configure --disable-libcurl otherwise
- it will attempt to compile it in)
- curses dev library
- (libncurses5-dev or libpdcurses on WIN32 for text user interface)
- libudev dev library (libudev-dev)
- (This is only required for USB device support and is linux only)
- If building from git:
- autoconf
- automake
- If building on Red Hat:
- sudo yum install autoconf automake autoreconf libtool openssl-compat-bitcoin-devel.x86_64 \
- curl libcurl libcurl-devel openssh
- If building on Ubuntu:
- sudo apt-get install build-essential autoconf automake libtool pkg-config \
- libcurl3-dev libudev-dev
- CGMiner specific configuration options:
- --enable-ants1 Compile support for Antminer S1 Bitmain (default
- disabled)
- --enable-ants2 Compile support for Antminer S2 Bitmain (default
- disabled)
- --enable-avalon Compile support for Avalon (default disabled)
- --enable-avalon2 Compile support for Avalon2/3 (default disabled)
- --enable-avalon4 Compile support for Avalon4/4.1/6 (default disabled)
- --enable-bab Compile support for BlackArrow Bitfury (default
- disabled)
- --enable-bflsc Compile support for BFL ASICs (default disabled)
- --enable-bitforce Compile support for BitForce FPGAs (default
- disabled)
- --enable-bitfury Compile support for BitFury ASICs (default disabled)
- --enable-bitmine_A1 Compile support for Bitmine.ch A1 ASICs (default
- disabled)
- --enable-blockerupter Compile support for ASICMINER BlockErupter Tube/Prisma
- (default disabled)
- --enable-cointerra Compile support for Cointerra ASICs (default disabled)
- --enable-drillbit Compile support for Drillbit BitFury ASICs (default
- disabled)
- --enable-hashfast Compile support for Hashfast (default disabled)
- --enable-icarus Compile support for Icarus (default disabled)
- --enable-klondike Compile support for Klondike (default disabled)
- --enable-knc Compile support for KnC miners (default disabled)
- --enable-minion Compile support for Minion BlackArrow ASIC (default
- disabled)
- --enable-modminer Compile support for ModMiner FPGAs(default disabled)
- --enable-sp10 Compile support for Spondoolies SP10 (default
- disabled)
- --enable-sp30 Compile support for Spondoolies SP30 (default
- disabled)
- --disable-libcurl Disable building with libcurl for GBT support
- --enable-libsystemd Compile support for system watchdog and status
- notifications (default disabled)
- --without-curses Compile support for curses TUI (default enabled)
- --with-system-libusb Compile against dynamic system libusb (default use
- included static libusb)
- --with-system-jansson Compile against dynamic system jansson (default use
- included static jansson)
- Basic *nix build instructions:
- To actually build:
- ./autogen.sh # only needed if building from git repo
- CFLAGS="-O2 -Wall -march=native" ./configure <options>
- make
- No installation is necessary. You may run cgminer from the build
- directory directly, but you may do make install if you wish to install
- cgminer to a system location or location you specified.
- Building for windows:
- It is actually easiest to build a windows binary using cross compilation tools
- provided by "mxe" available at http://mxe.cc/ (use the 32 bit one!)
- Once you have followed the instructions for building mxe:
- export PATH=(path/to/mxe)/usr/bin/:$PATH
- CFLAGS="-O2 -Wall -W -march=i686" ./configure --host=i686-pc-mingw32 <options>
- make
- Native WIN32 build instructions: see windows-build.txt but these instructions
- are now hopelessly out of date.
- ---
- Usage instructions: Run "cgminer --help" to see options:
- Usage: cgminer [-DdElmpPQqUsTouOchnV]
- Options for both config file and command line:
- --anu-freq <arg> Set AntminerU1/2 frequency in MHz, range 125-500 (default: 250.0)
- --api-allow <arg> Allow API access only to the given list of [G:]IP[/Prefix] addresses[/subnets]
- --api-description <arg> Description placed in the API status header, default: cgminer version
- --api-groups <arg> API one letter groups G:cmd:cmd[,P:cmd:*...] defining the cmds a groups can use
- --api-listen Enable API, default: disabled
- --api-mcast Enable API Multicast listener, default: disabled
- --api-mcast-addr <arg> API Multicast listen address
- --api-mcast-code <arg> Code expected in the API Multicast message, don't use '-'
- --api-mcast-des <arg> Description appended to the API Multicast reply, default: ''
- --api-mcast-port <arg> API Multicast listen port (default: 4028)
- --api-network Allow API (if enabled) to listen on/for any address, default: only 127.0.0.1
- --api-port <arg> Port number of miner API (default: 4028)
- --au3-freq <arg> Set AntminerU3 frequency in MHz, range 100-250 (default: 225.0)
- --au3-volt <arg> Set AntminerU3 voltage in mv, range 725-850, 0 to not set (default: 775)
- --avalon-auto Adjust avalon overclock frequency dynamically for best hashrate
- --avalon-cutoff <arg> Set avalon overheat cut off temperature (default: 60)
- --avalon-fan <arg> Set fanspeed percentage for avalon, single value or range (default: 20-100)
- --avalon-freq <arg> Set frequency range for avalon-auto, single value or range
- --avalon-options <arg> Set avalon options baud:miners:asic:timeout:freq:tech
- --avalon-temp <arg> Set avalon target temperature (default: 50)
- --avalon2-freq Set frequency range for Avalon2, single value or range
- --avalon2-voltage Set Avalon2 core voltage, in millivolts
- --avalon2-fan Set Avalon2 target fan speed
- --avalon2-cutoff <arg> Set Avalon2 overheat cut off temperature (default: 88)
- --avalon2-fixed-speed Set Avalon2 fan to fixed speed
- --avalon4-automatic-voltage Automatic adjust voltage base on module DH
- --avalon4-voltage Set Avalon4 core voltage, in millivolts, step: 125
- --avalon4-freq Set frequency for Avalon4, 1 to 3 values, example: 445:385:370
- --avalon4-fan Set Avalon4 target fan speed range
- --avalon4-temp <arg> Set Avalon4 target temperature (default: 42)
- --avalon4-cutoff <arg> Set Avalon4 overheat cut off temperature (default: 65)
- --avalon4-polling-delay <arg> Set Avalon4 polling delay value (ms) (default: 20)
- --avalon4-ntime-offset <arg> Set Avalon4 MM ntime rolling max offset (default: 4)
- --avalon4-aucspeed <arg> Set Avalon4 AUC IIC bus speed (default: 400000)
- --avalon4-aucxdelay <arg> Set Avalon4 AUC IIC xfer read delay, 4800 ~= 1ms (default: 9600)
- --avalon4-miningmode <arg> Set Avalon4 mining mode(0:custom, 1:eco, 2:normal, 3:turbo (default: 0)
- --avalon4-freezesafe Make Avalon4 running as a radiator when stratum server failed
- --avalon4-ntcb <arg> Set Avalon4 MM NTC B value (default: 3450)
- --avalon4-freq-min <arg> Set minimum frequency for Avalon4 (default: 100)
- --avalon4-freq-max <arg> Set maximum frequency for Avalon4 (default: 1000)
- --avalon4-noncecheck-off Disable A3218 inside nonce check function
- --avalon4-smart-speed <arg> Set smart speed, range 0-3. 0 means Disable (default: 2)
- --avalon4-speed-bingo <arg> Set A3218 speed bingo for smart speed mode 1 (default: 255)
- --avalon4-speed-error <arg> Set A3218 speed error for smart speed mode 1 (default: 3)
- --avalon4-least-pll <arg> Set least pll check threshold for smart speed mode 2 (default: 768)
- --avalon4-most-pll <arg> Set most pll check threshold for smart speed mode 2 (default: 256)
- --bab-options <arg> Set BaB options max:def:min:up:down:hz:delay:trf
- --balance Change multipool strategy from failover to even share balance
- --benchfile <arg> Run cgminer in benchmark mode using a work file - produces no shares
- --benchfile-display Display each benchfile nonce found
- --benchmark Run cgminer in benchmark mode - produces no shares
- --bet-clk <arg> Set clockspeed of ASICMINER Tube/Prisma to (arg+1)*10MHz (default: 23)
- --bfl-range Use nonce range on bitforce devices if supported
- --bflsc-overheat <arg> Set overheat temperature where BFLSC devices throttle, 0 to disable (default: 85)
- --bitburner-fury-voltage <arg> Set BitBurner Fury core voltage, in millivolts
- --bitburner-fury-options <arg> Override avalon-options for BitBurner Fury boards baud:miners:asic:timeout:freq
- --bitburner-voltage <arg> Set BitBurner (Avalon) core voltage, in millivolts
- --bitmain-auto Adjust bitmain overclock frequency dynamically for best hashrate
- --bitmain-cutoff <arg> Set bitmain overheat cut off temperature
- --bitmain-fan <arg> Set fanspeed percentage for bitmain, single value or range (default: 20-100)
- --bitmain-freq <arg> Set bitmain freq options timeout:freq:regdata
- --bitmain-hwerror Set bitmain device detect hardware error
- --bitmain-options <arg> Set bitmain options baud:miners:asic:timeout:freq:regdata
- --bitmain-temp <arg> Set bitmain target temperature
- --bitmain-workdelay <arg> Set bitmain work delay (ms) 0-100
- --bitmain-voltage <arg> Set bitmain voltage - S2/S3 only
- --bitmain-dev <arg> Set bitmain device - S2 only
- --bitmainbeeper Set bitmain beeper ringing
- --bitmaintempoverctrl Set bitmain stop runing when temprerature is over 80 degree Celsius
- --bxf-bits <arg> Set max BXF/HXF bits for overclocking (default: 54)
- --bxf-temp-target <arg> Set target temperature for BXF/HXF devices (default: 82)
- --bxm-bits <arg> Set BXM bits for overclocking (default: 54)
- --btc-address <arg> Set bitcoin target address when solo mining to bitcoind
- --btc-sig <arg> Set signature to add to coinbase when solo mining (optional)
- --compact Use compact display without per device statistics
- --debug|-D Enable debug output
- --disable-rejecting Automatically disable pools that continually reject shares
- --drillbit-options <arg> Set drillbit options <int|ext>:clock[:clock_divider][:voltage]
- --expiry|-E <arg> Upper bound on how many seconds after getting work we consider a share from it stale (default: 120)
- --failover-only Don't leak work to backup pools when primary pool is lagging
- --fix-protocol Do not redirect to stratum protocol from GBT
- --hfa-hash-clock <arg> Set hashfast clock speed (default: 550)
- --hfa-fail-drop <arg> Set how many MHz to drop clockspeed each failure on an overlocked hashfast device (default: 10)
- --hfa-fan <arg> Set fanspeed percentage for hashfast, single value or range (default: 10-85)
- --hfa-name <arg> Set a unique name for a single hashfast device specified with --usb or the first device found
- --hfa-noshed Disable hashfast dynamic core disabling feature
- --hfa-options <arg> Set hashfast options name:clock (comma separated)
- --hfa-temp-overheat <arg> Set the hashfast overheat throttling temperature (default: 95)
- --hfa-temp-target <arg> Set the hashfast target temperature (0 to disable) (default: 88)
- --hro-freq Set the hashratio clock frequency (default: 280)
- --hotplug <arg> Seconds between hotplug checks (0 means never check)
- --klondike-options <arg> Set klondike options clock:temptarget
- --load-balance Change multipool strategy from failover to quota based balance
- --log|-l <arg> Interval in seconds between log output (default: 5)
- --lowmem Minimise caching of shares for low memory applications
- --minion-chipreport <arg> Seconds to report chip 5min hashrate, range 0-100 (default: 0=disabled)
- --minion-freq <arg> Set minion chip frequencies in MHz, single value or comma list, range 100-1400 (default: 1200)
- --minion-freqchange Millisecond total time to do frequency changes (default: 1000)
- --minion-freqpercent Percentage to use when starting up a chip (default: 70%)
- --minion-idlecount Report when IdleCount is >0 or changes
- --minion-ledcount Turn off led when more than this many chips below the ledlimit (default: 0)
- --minion-ledlimit Turn off led when chips GHs are below this (default: 90)
- --minion-noautofreq Disable automatic frequency adjustment
- --minion-overheat Enable directly halting any chip when the status exceeds 100C
- --minion-spidelay Add a delay in microseconds after each SPI I/O
- --minion-spireset SPI regular reset: iNNN for I/O count or sNNN for seconds - 0 means none
- --minion-spisleep Sleep time in milliseconds when doing an SPI reset
- --minion-temp <arg> Set minion chip temperature threshold, single value or comma list, range 120-160 (default: 135C)
- --monitor|-m <arg> Use custom pipe cmd for output messages
- --nfu-bits <arg> Set nanofury bits for overclocking, range 32-63 (default: 50)
- --net-delay Impose small delays in networking to not overload slow routers
- --no-submit-stale Don't submit shares if they are detected as stale
- --osm-led-mode <arg> Set LED mode for OneStringMiner devices (default: 4)
- --pass|-p <arg> Password for bitcoin JSON-RPC server
- --per-device-stats Force verbose mode and output per-device statistics
- --protocol-dump|-P Verbose dump of protocol-level activities
- --queue|-Q <arg> Minimum number of work items to have queued (0+) (default: 1)
- --quiet|-q Disable logging output, display status and errors
- --quota|-U <arg> quota;URL combination for server with load-balance strategy quotas
- --real-quiet Disable all output
- --rock-freq <arg> Set RockMiner frequency in MHz, range 200-400 (default: 270)
- --rotate <arg> Change multipool strategy from failover to regularly rotate at N minutes (default: 0)
- --round-robin Change multipool strategy from failover to round robin on failure
- --scan-time|-s <arg> Upper bound on time spent scanning current work, in seconds (default: -1)
- --sched-start <arg> Set a time of day in HH:MM to start mining (a once off without a stop time)
- --sched-stop <arg> Set a time of day in HH:MM to stop mining (will quit without a start time)
- --sharelog <arg> Append share log to file
- --shares <arg> Quit after mining N shares (default: unlimited)
- --socks-proxy <arg> Set socks4 proxy (host:port)
- --suggest-diff <arg> Suggest miner difficulty for pool to user (default: none)
- --syslog Use system log for output messages (default: standard error)
- --temp-cutoff <arg> Temperature where a device will be automatically disabled, one value or comma separated list (default: 95)
- --text-only|-T Disable ncurses formatted screen output
- --url|-o <arg> URL for bitcoin JSON-RPC server
- --usb <arg> USB device selection
- --user|-u <arg> Username for bitcoin JSON-RPC server
- --userpass|-O <arg> Username:Password pair for bitcoin JSON-RPC server
- --verbose Log verbose output to stderr as well as status output
- --widescreen Use extra wide display without toggling
- --worktime Display extra work time debug information
- Options for command line only:
- --config|-c <arg> Load a JSON-format configuration file
- See example.conf for an example configuration.
- --default-config <arg> Specify the filename of the default config file
- Loaded at start and used when saving without a name.
- --help|-h Print this message
- --ndevs|-n Display all USB devices and exit
- --version|-V Display version and exit
- Silent USB device (ASIC and FPGA) options:
- --icarus-options <arg> Set specific FPGA board configurations - one set of values for all or comma separated
- --icarus-timing <arg> Set how the Icarus timing is calculated - one setting/value for all or comma separated
- --usb-dump (See FPGA-README)
- See FGPA-README or ASIC-README for more information regarding these.
- ASIC only options:
- --anu-freq <arg> Set AntminerU1/2 frequency in MHz, range 125-500 (default: 250.0)
- --au3-freq <arg> Set AntminerU3 frequency in MHz, range 100-250 (default: 225.0)
- --au3-volt <arg> Set AntminerU3 voltage in mv, range 725-850, 0 to not set (default: 750)
- --avalon-auto Adjust avalon overclock frequency dynamically for best hashrate
- --avalon-cutoff <arg> Set avalon overheat cut off temperature (default: 60)
- --avalon-fan <arg> Set fanspeed percentage for avalon, single value or range (default: 20-100)
- --avalon-freq <arg> Set frequency range for avalon-auto, single value or range
- --avalon-options <arg> Set avalon options baud:miners:asic:timeout:freq:tech
- --avalon-temp <arg> Set avalon target temperature (default: 50)
- --avalon2-freq Set frequency range for Avalon2, single value or range
- --avalon2-voltage Set Avalon2 core voltage, in millivolts
- --avalon2-fan Set Avalon2 target fan speed
- --avalon2-cutoff <arg> Set Avalon2 overheat cut off temperature (default: 88)
- --avalon2-fixed-speed Set Avalon2 fan to fixed speed
- --avalon4-automatic-voltage Automatic adjust voltage base on module DH
- --avalon4-voltage Set Avalon4 core voltage, in millivolts, step: 125
- --avalon4-freq Set frequency for Avalon4, 1 to 3 values, example: 445:385:370
- --avalon4-fan Set Avalon4 target fan speed range
- --avalon4-temp <arg> Set Avalon4 target temperature (default: 42)
- --avalon4-cutoff <arg> Set Avalon4 overheat cut off temperature (default: 65)
- --avalon4-polling-delay <arg> Set Avalon4 polling delay value (ms) (default: 20)
- --avalon4-ntime-offset <arg> Set Avalon4 MM ntime rolling max offset (default: 4)
- --avalon4-aucspeed <arg> Set Avalon4 AUC IIC bus speed (default: 400000)
- --avalon4-aucxdelay <arg> Set Avalon4 AUC IIC xfer read delay, 4800 ~= 1ms (default: 9600)
- --bab-options <arg> Set BaB options max:def:min:up:down:hz:delay:trf
- --bflsc-overheat <arg> Set overheat temperature where BFLSC devices throttle, 0 to disable (default: 90)
- --bitburner-fury-options <arg> Override avalon-options for BitBurner Fury boards baud:miners:asic:timeout:freq
- --bitburner-fury-voltage <arg> Set BitBurner Fury core voltage, in millivolts
- --bitburner-voltage <arg> Set BitBurner (Avalon) core voltage, in millivolts
- --bitmine-a1-options <ref_clk>:<sys_clk>:<spi_clk>:<max_chip>
- --bxf-temp-target <arg> Set target temperature for BXF devices (default: 82)
- --bxm-bits <arg> Set BXM bits for overclocking (default: 50)
- --hfa-hash-clock <arg> Set hashfast clock speed (default: 550)
- --hfa-fail-drop <arg> Set how many MHz to drop clockspeed each failure on an overlocked hashfast device (default: 10)
- --hfa-fan <arg> Set fanspeed percentage for hashfast, single value or range (default: 10-85)
- --hfa-name <arg> Set a unique name for a single hashfast device specified with --usb or the first device found
- --hfa-noshed Disable hashfast dynamic core disabling feature
- --hfa-temp-overheat <arg> Set the hashfast overheat throttling temperature (default: 95)
- --hfa-temp-target <arg> Set the hashfast target temperature (0 to disable) (default: 88)
- --hro-freq Set the hashratio clock frequency (default: 280)
- --klondike-options <arg> Set klondike options clock:temptarget
- --rock-freq <arg> Set RockMiner frequency in MHz, range 125-500 (default: 270)
- See ASIC-README for more information regarding these.
- FPGA only options:
- --bfl-range Use nonce range on bitforce devices if supported
- See FGPA-README for more information regarding this.
- Cgminer should automatically find all of your Avalon ASIC, BFL ASIC, BitForce
- FPGAs, Icarus bitstream FPGAs, Klondike ASIC, ASICMINER usb block erupters,
- KnC ASICs, BaB ASICs, Hashfast ASICs, ModMiner FPGAs, BPMC/BGMC BF1 USB ASICs,
- Bi*fury USB ASICs, Onestring miner USB ASICs, Hexfury USB ASICs, Nanofury USB
- ASICs, Antminer U1/U2/U2+ U3 USB ASICs, Cointerra devices, BFx2 USB ASICs,
- Rockminer R-Box/RK-Box/T1 USB ASICs, Avalon2/3/4 USB ASICs and Hashratio USB
- ASICs.
- ---
- SETTING UP USB DEVICES
- WINDOWS:
- On windows, the direct USB support requires the installation of a WinUSB
- driver (NOT the ftdi_sio driver), and attach it to the chosen USB device.
- When configuring your device, plug it in and wait for windows to attempt to
- install a driver on its own. It may think it has succeeded or failed but wait
- for it to finish regardless. This is NOT the driver you want installed. At this
- point you need to associate your device with the WinUSB driver. The easiest
- way to do this is to use the zadig utility which you must right click on and
- run as administrator. Then once you plug in your device you can choose the
- "list all devices" from the "option" menu and you should be able to see the
- device as something like: "BitFORCE SHA256 SC". Choose the install or replace
- driver option and select WinUSB. You can either google for zadig or download
- it from the cgminer directory in the DOWNLOADS link above.
- When you first switch a device over to WinUSB with zadig and it shows that
- correctly on the left of the zadig window, but it still gives permission
- errors, you may need to unplug the USB miner and then plug it back in. Some
- users may need to reboot at this point.
- LINUX:
- The short version:
- sudo cp 01-cgminer.rules /etc/udev/rules.d/
- The long version:
- On linux, the direct USB support requires no drivers at all. However due to
- permissions issues, you may not be able to mine directly on the devices as a
- regular user without giving the user access to the device or by mining as
- root (administrator). In order to give your regular user access, you can make
- him a member of the plugdev group with the following commands:
- sudo usermod -G plugdev -a `whoami`
- If your distribution does not have the plugdev group you can create it with:
- sudo groupadd plugdev
- In order for the USB devices to instantly be owned by the plugdev group and
- accessible by anyone from the plugdev group you can copy the file
- "01-cgminer.rules" from the cgminer archive into the /etc/udev/rules.d
- directory with the following command:
- sudo cp 01-cgminer.rules /etc/udev/rules.d/
- After this you can either manually restart udev and re-login, or more easily
- just reboot.
- OSX:
- On OSX, like Linux, no drivers need to be installed. However some devices
- like the bitfury USB sticks automatically load a driver thinking they're a
- modem and the driver needs to be unloaded for cgminer to work:
- sudo kextunload -b com.apple.driver.AppleUSBCDC
- sudo kextunload -b com.apple.driver.AppleUSBCDCACMData
- There may be a limit to the number of USB devices that you are allowed to start.
- The following set of commands, followed by a reboot will increase that:
- sudo su
- touch /etc/sysctl.conf
- echo kern.sysv.semume=100 >> /etc/sysctl.conf
- chown root:wheel /etc/sysctl.conf
- chmod 0644 /etc/sysctl.conf
- Some devices need superuser access to mine on them so cgminer may need to
- be started with sudo
- i.e.:
- sudo cgminer <insert commands here>
- ---
- Advanced USB options:
- The --usb option can restrict how many USB devices are found:
- --usb 1:2,1:3,1:4,1:*
- or
- --usb BAS:1,BFL:1,MMQ:0,ICA:0,KLN:0
- or
- --usb :10
- You can only use one of the above 3
- The first version
- --usb 1:2,1:3,1:4,1:*
- allows you to select which devices to mine on with a list of USB
- bus_number:device_address
- All other USB devices will be ignored
- Hotplug will also only look at the devices matching the list specified and
- find nothing new if they are all in use
- You can specify just the USB bus_number to find all devices like 1:*
- which means any devices on USB bus_number 1
- This is useful if you unplug a device then plug it back in the same port,
- it usually reappears with the same bus_number but a different device_address
- You can see the list of all USB devices on linux with 'sudo lsusb'
- Cgminer will list the recognised USB devices
- with the '-n' option or the
- '--usb-dump 0' option
- The '--usb-dump N' option with a value of N greater than 0 will dump a lot
- of details about each recognised USB device
- If you wish to see all USB devices, include the --usb-list-all option
- The second version
- --usb BAS:1,BFL:1,MMQ:0,ICA:0,KLN:0
- allows you to specify how many devices to choose based on each device
- driver cgminer has - the current USB drivers are:
- AVA, BAS, BFL, BF1, DRB, HFA, ICA, KLN and MMQ.
- N.B. you can only specify which device driver to limit, not the type of
- each device, e.g. with BAS:n you can limit how many BFL ASIC devices will
- be checked, but you cannot limit the number of each type of BFL ASIC
- Also note that the MMQ count is the number of MMQ backplanes you have
- not the number of MMQ FPGAs
- The third version
- --usb :10
- means only use a maximum of 10 devices of any supported USB devices
- Once cgminer has 10 devices it will not configure any more and hotplug will
- not scan for any more
- If one of the 10 devices stops working, hotplug - if enabled, as is default
- - will scan normally again until it has 10 devices
- --usb :0 will disable all USB I/O other than to initialise libusb
- ---
- WHILE RUNNING:
- The following options are available while running with a single keypress:
- [U]SB management [P]ool management [S]ettings [D]isplay options [Q]uit
- U gives you:
- [S]ummary of device information
- [E]nable device
- [D]isable device
- [U]nplug to allow hotplug restart
- [R]eset device USB
- [L]ist all known devices
- [B]lacklist current device from current instance of cgminer
- [W]hitelist previously blacklisted device
- [H]otplug interval (0 to disable)
- P gives you:
- Current pool management strategy: Failover
- [F]ailover only disabled
- [A]dd pool [R]emove pool [D]isable pool [E]nable pool
- [C]hange management strategy [S]witch pool [I]nformation
- S gives you:
- [Q]ueue: 1
- [S]cantime: 60
- [E]xpiry: 120
- [W]rite config file
- [C]gminer restart
- D gives you:
- [N]ormal [C]lear [S]ilent mode (disable all output)
- [D]ebug:off
- [P]er-device:off
- [Q]uiet:off
- [V]erbose:off
- [R]PC debug:off
- [W]orkTime details:off
- co[M]pact: off
- [T]oggle status switching:enabled
- [Z]ero statistics
- [L]og interval:5
- Q quits the application.
- The running log shows output like this:
- [2013-11-09 11:04:41] Accepted 01b3bde7 Diff 150/128 AVA 1 pool 0
- [2013-11-09 11:04:49] Accepted 015df995 Diff 187/128 AVA 1 pool 0
- [2013-11-09 11:04:50] Accepted 01163b68 Diff 236/128 AVA 1 pool 0
- [2013-11-09 11:04:53] Accepted 9f745840 Diff 411/128 BAS 1 pool 0
- The 8 byte hex value are the 1st nonzero bytes of the share being submitted to
- the pool. The 2 diff values are the actual difficulty target that share reached
- followed by the difficulty target the pool is currently asking for.
- ---
- Also many issues and FAQs are covered in the forum thread
- dedicated to this program,
- http://forum.bitcoin.org/index.php?topic=28402.0
- DISPLAY:
- The display is roughly split into two portions, the top status window and the
- bottom scrolling log window.
- STATUS WINDOW
- The status window is split into overall status and per device status.
- Overall status:
- The output line shows the following:
- (5s):2.469T (1m):2.677T (5m):2.040T (15m):1.014T (avg):2.733Th/s
- These are exponentially decaying average hashrates over 5s/1m/5m/15m and an
- average since the start.
- Followed by:
- A:290391 R:5101 HW:145 WU:37610.4/m
- Each column is as follows:
- A: The total difficulty of Accepted shares
- R: The total difficulty of Rejected shares
- HW: The number of HardWare errors
- WU: The Work Utility defined as the number of diff1 shares work / minute
- (accepted or rejected).
- alternating with:
- ST: 22 SS: 0 NB: 2 LW: 356090 GF: 0 RF: 0
- ST is STaged work items (ready to use).
- SS is Stale Shares discarded (detected and not submitted so don't count as rejects)
- NB is New Blocks detected on the network
- LW is Locally generated Work items
- GF is Getwork Fail Occasions (server slow to provide work)
- RF is Remote Fail occasions (server slow to accept work)
- Followed by:
- Connected to pool.com diff 3.45K with stratum as user me
- The diff shown is the current vardiff requested by the pool currently being
- mined at.
- Followed by:
- Block: ca0d237f... Diff:5.01G Started: [00:14:27] Best share: 1.18M
- This shows a short stretch about the current block, when the new block started,
- and the all time best difficulty share you've found since starting cgminer
- this time.
- Per device status:
- 6: HFS Random : 645MHz 85C 13% 0.79V | 2.152T / 1.351Th/s
- Each column is as follows:
- Temperature (if supported)
- Fanspeed (if supported)
- Voltage (if supported)
- A 5 second exponentially decaying average hash rate
- An all time average hash rate
- alternating with
- 6: HFS Random : 645MHz 86C 13% 0.80V | A:290348 R:1067 HW:88 WU:18901.8/m
- The total difficulty of accepted shares
- The total difficulty of rejected shares
- The number of hardware erorrs
- The work utility defined as the number of diff1 shares work / minute
- LOG WINDOW
- All running information is shown here, usually share submission results and
- block update notifications, along with device messages and warnings.
- [2014-03-29 00:24:09] Accepted 1397768d Diff 3.35K/2727 HFS 0 pool 0
- [2014-03-29 00:24:13] Stratum from pool 0 detected new block
- ---
- MULTIPOOL
- FAILOVER STRATEGIES WITH MULTIPOOL:
- A number of different strategies for dealing with multipool setups are
- available. Each has their advantages and disadvantages so multiple strategies
- are available by user choice, as per the following list:
- FAILOVER:
- The default strategy is failover. This means that if you input a number of
- pools, it will try to use them as a priority list, moving away from the 1st
- to the 2nd, 2nd to 3rd and so on. If any of the earlier pools recover, it will
- move back to the higher priority ones.
- ROUND ROBIN:
- This strategy only moves from one pool to the next when the current one falls
- idle and makes no attempt to move otherwise.
- ROTATE:
- This strategy moves at user-defined intervals from one active pool to the next,
- skipping pools that are idle.
- LOAD BALANCE:
- This strategy sends work to all the pools on a quota basis. By default, all
- pools are allocated equal quotas unless specified with --quota. This
- apportioning of work is based on work handed out, not shares returned so is
- independent of difficulty targets or rejected shares. While a pool is disabled
- or dead, its quota is dropped until it is re-enabled. Quotas are forward
- looking, so if the quota is changed on the fly, it only affects future work.
- If all pools are set to zero quota or all pools with quota are dead, it will
- fall back to a failover mode. See quota below for more information.
- The failover-only flag has special meaning in combination with load-balance
- mode and it will distribute quota back to priority pool 0 from any pools that
- are unable to provide work for any reason so as to maintain quota ratios
- between the rest of the pools.
- BALANCE:
- This strategy monitors the amount of difficulty 1 shares solved for each pool
- and uses it to try to end up doing the same amount of work for all pools.
- ---
- QUOTAS
- The load-balance multipool strategy works off a quota based scheduler. The
- quotas handed out by default are equal, but the user is allowed to specify any
- arbitrary ratio of quotas. For example, if all the quota values add up to 100,
- each quota value will be a percentage, but if 2 pools are specified and pool0
- is given a quota of 1 and pool1 is given a quota of 9, pool0 will get 10% of
- the work and pool1 will get 90%. Quotas can be changed on the fly by the API,
- and do not act retrospectively. Setting a quota to zero will effectively
- disable that pool unless all other pools are disabled or dead. In that
- scenario, load-balance falls back to regular failover priority-based strategy.
- While a pool is dead, it loses its quota and no attempt is made to catch up
- when it comes back to life.
- To specify quotas on the command line, pools should be specified with a
- semicolon separated --quota(or -U) entry instead of --url. Pools specified with
- --url are given a nominal quota value of 1 and entries can be mixed.
- For example:
- --url poola:porta -u usernamea -p passa --quota "2;poolb:portb" -u usernameb -p passb
- Will give poola 1/3 of the work and poolb 2/3 of the work.
- Writing configuration files with quotas is likewise supported. To use the above
- quotas in a configuration file they would be specified thus:
- "pools" : [
- {
- "url" : "poola:porta",
- "user" : "usernamea",
- "pass" : "passa"
- },
- {
- "quota" : "2;poolb:portb",
- "user" : "usernameb",
- "pass" : "passb"
- }
- ]
- ---
- SOLO MINING
- Solo mining can be done efficiently as a single pool entry or a backup to
- any other pooled mining and it is recommended everyone have solo mining set up
- as their final backup in case all their other pools are DDoSed/down for the
- security of the network. To enable solo mining, one must be running a local
- bitcoind/bitcoin-qt or have one they have rpc access to. To do this, edit your
- bitcoind configuration file (bitcoin.conf) with the following extra lines,
- using your choice of username and password:
- rpcuser=username
- rpcpassword=password
- Restart bitcoind, then start cgminer, pointing to the bitcoind and choose a
- btc address with the following options, altering to suit their setup:
- cgminer -o http://localhost:8332 -u username -p password --btc-address 15qSxP1SQcUX3o4nhkfdbgyoWEFMomJ4rZ
- Note the http:// is mandatory for solo mining.
- ---
- LOGGING
- cgminer will log to stderr if it detects stderr is being redirected to a file.
- To enable logging simply add 2>logfile.txt to your command line and logfile.txt
- will contain the logged output at the log level you specify (normal, verbose,
- debug etc.)
- In other words if you would normally use:
- ./cgminer -o xxx -u yyy -p zzz
- if you use
- ./cgminer -o xxx -u yyy -p zzz 2>logfile.txt
- it will log to a file called logfile.txt and otherwise work the same.
- There is also the -m option on linux which will spawn a command of your choice
- and pipe the output directly to that command.
- The WorkTime details 'debug' option adds details on the end of each line
- displayed for Accepted or Rejected work done. An example would be:
- <-00000059.ed4834a3 M:X D:1.0 G:17:02:38:0.405 C:1.855 (2.995) W:3.440 (0.000) S:0.461 R:17:02:47
- The first 2 hex codes are the previous block hash, the rest are reported in
- seconds unless stated otherwise:
- The previous hash is followed by the getwork mode used M:X where X is one of
- P:Pool, T:Test Pool, L:LP or B:Benchmark,
- then D:d.ddd is the difficulty required to get a share from the work,
- then G:hh:mm:ss:n.nnn, which is when the getwork or LP was sent to the pool and
- the n.nnn is how long it took to reply,
- followed by 'O' on it's own if it is an original getwork, or 'C:n.nnn' if it was
- a clone with n.nnn stating how long after the work was recieved that it was cloned,
- (m.mmm) is how long from when the original work was received until work started,
- W:n.nnn is how long the work took to process until it was ready to submit,
- (m.mmm) is how long from ready to submit to actually doing the submit, this is
- usually 0.000 unless there was a problem with submitting the work,
- S:n.nnn is how long it took to submit the completed work and await the reply,
- R:hh:mm:ss is the actual time the work submit reply was received
- If you start cgminer with the --sharelog option, you can get detailed
- information for each share found. The argument to the option may be "-" for
- standard output (not advisable with the ncurses UI), any valid positive number
- for that file descriptor, or a filename.
- To log share data to a file named "share.log", you can use either:
- ./cgminer --sharelog 50 -o xxx -u yyy -p zzz 50>share.log
- ./cgminer --sharelog share.log -o xxx -u yyy -p zzz
- For every share found, data will be logged in a CSV (Comma Separated Value)
- format:
- timestamp,disposition,target,pool,dev,thr,sharehash,sharedata
- For example (this is wrapped, but it's all on one line for real):
- 1335313090,reject,
- ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000,
- http://localhost:8337,ASC0,0,
- 6f983c918f3299b58febf95ec4d0c7094ed634bc13754553ec34fc3800000000,
- 00000001a0980aff4ce4a96d53f4b89a2d5f0e765c978640fe24372a000001c5
- 000000004a4366808f81d44f26df3d69d7dc4b3473385930462d9ab707b50498
- f681634a4f1f63d01a0cd43fb338000000000080000000000000000000000000
- 0000000000000000000000000000000000000000000000000000000080020000
- ---
- BENCHMARK
- The --benchmark option hashes a single fixed work item over and over and does
- not submit shares to any pools.
- The --benchfile <arg> option hashes the work given in the file <arg> supplied.
- The format of the work file is:
- version,merkleroot,prevhash,diffbits,noncetime
- Any empty line or any line starting with '#' or '/' is ignored.
- When it reaches the end of the file it continues back at the top.
- The format of the data items matches the byte ordering and format of the
- the bitcoind getblock RPC output.
- An example file containing bitcoin block #1 would be:
- # Block 1
- 1,0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098,00000000001
- 9d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f,1d00ffff,1231469665
- However, the work data should be one line without the linebreak in the middle
- If you use --benchfile <arg>, then --benchfile-display will output a log line,
- for each nonce found, showing the nonce value in decimal and hex and the work
- used to find it in hex.
- ---
- RPC API
- For RPC API details see the API-README file
- ---
- FAQ
- Q: Help, I've started cgminer and everything reads zero!?
- A: Welcome to bitcoin mining. Your computer by itself cannot mine bitcoin no
- matter how powerful it is. You have to purchase dedicated mining hardware
- called ASICs to plug into your computer. See Q regarding ASICs below.
- Q: I have multiple USB stick devices but I can't get them all to work at once?
- A: Very few USB hubs deliver the promised power required to run as many devices
- as they fit if all of them draw power from USB.
- Q: I've plugged my devices into my USB hub but nothing shows up?
- A: RPis and Windows have incomplete or non-standard USB3 support so they may
- never work. It may be possible to get a USB3 hub to work by plugging it into
- a USB2 hub. When choosing a hub, USB2 hubs are preferable whenever possible
- due to better support all round.
- Q: Can I mine on servers from different networks (eg xxxcoin and bitcoin) at
- the same time?
- A: No, cgminer keeps a database of the block it's working on to ensure it does
- not work on stale blocks, and having different blocks from two networks would
- make it invalidate the work from each other.
- Q: Can I configure cgminer to mine with different login credentials or pools
- for each separate device?
- A: No.
- Q: Can I put multiple pools in the config file?
- A: Yes, check the example.conf file. Alternatively, set up everything either on
- the command line or via the menu after startup and choose settings->write
- config file and the file will be loaded one each startup.
- Q: The build fails with gcc is unable to build a binary.
- A: Remove the "-march=native" component of your CFLAGS as your version of gcc
- does not support it. Also -O2 is capital o 2, not zero 2.
- Q: Can you implement feature X?
- A: I can, but time is limited, and people who donate are more likely to get
- their feature requests implemented.
- Q: Work keeps going to my backup pool even though my primary pool hasn't
- failed?
- A: Cgminer checks for conditions where the primary pool is lagging and will
- pass some work to the backup servers under those conditions. The reason for
- doing this is to try its absolute best to keep the devices working on something
- useful and not risk idle periods. You can disable this behaviour with the
- option --failover-only.
- Q: Is this a virus?
- A: Cgminer is being packaged with other trojan scripts and some antivirus
- software is falsely accusing cgminer.exe as being the actual virus, rather
- than whatever it is being packaged with. If you installed cgminer yourself,
- then you do not have a virus on your computer. Complain to your antivirus
- software company. They seem to be flagging even source code now from cgminer
- as viruses, even though text source files can't do anything by themself.
- Q: Can you modify the display to include more of one thing in the output and
- less of another, or can you change the quiet mode or can you add yet another
- output mode?
- A: Everyone will always have their own view of what's important to monitor.
- The defaults are very sane and I have very little interest in changing this
- any further. There is far more detail in the API output than can be reasonably
- displayed on the small console window, and using an external interface such
- as miner.php is much more useful for setups with many devices.
- Q: What are the best parameters to pass for X pool/hardware/device.
- A: Virtually always, the DEFAULT parameters give the best results. Most user
- defined settings lead to worse performance.
- Q: What happened to CPU and GPU mining?
- A: Their efficiency makes them irrelevant in the bitcoin mining world today
- and the author has no interest in supporting alternative coins that are better
- mined by these devices.
- Q: GUI version?
- A: No. The RPC interface makes it possible for someone else to write one
- though.
- Q: I'm having an issue. What debugging information should I provide?
- A: Start cgminer with your regular commands and add -D -T --verbose and provide
- the full startup output and a summary of your hardware and operating system.
- Q: Why don't you provide win64 builds?
- A: Win32 builds work everywhere and there is precisely zero advantage to a
- 64 bit build on windows.
- Q: Is it faster to mine on windows or linux?
- A: It makes no difference in terms of performance. It comes down to choice of
- operating system for their various features and your comfort level. However
- linux is the primary development platform and is virtually guaranteed to be
- more stable.
- Q: My network gets slower and slower and then dies for a minute?
- A; Try the --net-delay option if you are on a GBT server. This does nothing
- with stratum mining.
- Q: How do I tune for p2pool?
- A: It is also recommended to use --failover-only since the work is effectively
- like a different block chain, and not enabling --no-submit-stale. If mining with
- a BFL (fpga) minirig, it is worth adding the --bfl-range option.
- Q: I run PHP on windows to access the API with the example miner.php. Why does
- it fail when php is installed properly but I only get errors about Sockets not
- working in the logs?
- A: http://us.php.net/manual/en/sockets.installation.php
- Q: What is a PGA?
- A: Cgminer supports 3 FPGAs: BitForce, Icarus and ModMiner.
- They are Field-Programmable Gate Arrays that have been programmed to do Bitcoin
- mining. Since the acronym needs to be only 3 characters, the "Field-" part has
- been skipped.
- Q: What is an ASIC?
- A: They are Application Specify Integrated Circuit devices and provide the
- highest performance per unit power due to being dedicated to only one purpose.
- They are the only meaningful way to mine bitcoin today.
- Q: What is stratum and how do I use it?
- A: Stratum is a protocol designed for pooled mining in such a way as to
- minimise the amount of network communications, yet scale to hardware of any
- speed. With versions of cgminer 2.8.0+, if a pool has stratum support, cgminer
- will automatically detect it and switch to the support as advertised if it can.
- If you input the stratum port directly into your configuration, or use the
- special prefix "stratum+tcp://" instead of "http://", cgminer will ONLY try to
- use stratum protocol mining. The advantages of stratum to the miner are no
- delays in getting more work for the miner, less rejects across block changes,
- and far less network communications for the same amount of mining hashrate. If
- you do NOT wish cgminer to automatically switch to stratum protocol even if it
- is detected, add the --fix-protocol option.
- Q: Why don't the statistics add up: Accepted, Rejected, Stale, Hardware Errors,
- Diff1 Work, etc. when mining greater than 1 difficulty shares?
- A: As an example, if you look at 'Difficulty Accepted' in the RPC API, the number
- of difficulty shares accepted does not usually exactly equal the amount of work
- done to find them. If you are mining at 8 difficulty, then you would expect on
- average to find one 8 difficulty share, per 8 single difficulty shares found.
- However, the number is actually random and converges over time, it is an average,
- not an exact value, thus you may find more or less than the expected average.
- Q: My keyboard input momentarily pauses or repeats keys every so often on
- windows while mining?
- A: The USB implementation on windows can be very flaky on some hardware and
- every time cgminer looks for new hardware to hotplug it it can cause these
- sorts of problems. You can disable hotplug with:
- --hotplug 0
- Q: What should my Work Utility (WU) be?
- A: Work utility is the product of hashrate * luck and only stabilises over a
- very long period of time. Assuming all your work is valid work, bitcoin mining
- should produce a work utility of approximately 1 per 71.6MH. This means at
- 5GH you should have a WU of 5000 / 71.6 or ~ 69. You cannot make your machine
- do "better WU" than this - it is luck related. However you can make it much
- worse if your machine produces a lot of hardware errors producing invalid work.
- Q: What should I build in for a generic distribution binary?
- A: There are a number of drivers that expect to be used on dedicated standalone
- hardware. That said, the drivers that are designed to work generically with
- USB on any hardware are the following:
- --enable-avalon
- --enable-avalon2
- --enable-avalon4
- --enable-bflsc
- --enable-bitfury
- --enable-cointerra
- --enable-drillbit
- --enable-hashfast
- --enable-hashratio
- --enable-icarus
- --enable-klondike
- ---
- This code is provided entirely free of charge by the programmer in his spare
- time so donations would be greatly appreciated. Please consider donating to the
- address below.
- Con Kolivas <kernel@kolivas.org>
- 15qSxP1SQcUX3o4nhkfdbgyoWEFMomJ4rZ
|