Error Detection and Correction Codes

By Sam Cowan, W0OAJ RR 1, Box 145 Eimwood, NE 68349


Errors! Computers are not supposed to make errors, but they happen anyway. Any ham who has worked with 64 kbytes of dynamic RAM or another large data storage device knows that error detection and correction are a fact of life. If the error is not detected, the false data can result in serious consequences.

Several methods to detect and correct errors have been devised. One of the first methods used was to transmit the data twice. After transmission, the two sets of data were compared. If one set varied from the other, an error was detected. There was no way to tell which set of data was correct, thus a third set had to be transmitted. If any two sets of data agreed, those sets were assumed to be correct.

There are many problems with the data comparison method. It requires redundancy (three sets of data) and is far from foolproof. Modern error detection and correction has evolved into three basic methods:

• Parity checks

• Hamming codes

• Binary cyclic codes

Each method requires some degree of redundancy and neither are foolproof. They are widely used because they are the best available methods for most applications. Let's examine each category for an understanding of how these methods work.

Parity Checks

Parity checks (or parity bits) are error detection methods. This method will not correct errors; instead, it also requires retransmission of data. With this scheme, one bit is added to the end of a data word according to set rules:

To obtain even parity, the parity bit must make the total number of 1s in the word an even number. To be considered odd parity, the parity bit makes the total number of 1s in the word an odd number.

Even and odd parity bits for all possible four-bit words are shown in Table 1, Either type of parity will detect an error.

Encode and Decode Circuits

Most circuits used to generate parity checks are made from exclusive or gates. Fig 1A shows the schematic symbol for the two-input gate device. It

Table 1—Even and odd-parity bits for all possible four-bit words.

Data Even Parity Odd Parity

0000 0 1

0001 1 0

0010 1 0

0011 0 1

0100 1 0

0101 0 1

0110 0 1

0111 1 0

1000 1 0

1001 0 1

1010 0 1

1011 1 0

1100 0 1

1101 1 0

1110 1 0

1111 0 1

has an output of 1 when either input is 1. When both inputs are 1 or 0, the output is 0. The three-input gate shown in 1B can be made from a two-input gate. Fig 1C shows how this can be accomplished.

A circuit for the generation and detection of even parity on a set of four-bit data is shown in Fig 2. The circuit functions as follows:

• The four transmitted bits are tied to the input of an exclusive or gate. The output is the even-parity bit.

• At the receiving end, the parity bit is generated again using the same method. This regenerated parity bit is compared to the transmitted parity bit through an exclusive or gate.

• If the received parity bit is the same as the regenerated parity bit, the parity check will be 0 and no error has occurred. If they are different, the parity check will be 1. The check indicates that an error has occurred and the data must be retransmitted.

A close analysis of the circuit in Fig 2 reveals the following conditions:

• When an error is detected, it can occur in either the data bits or the parity bit.

• If two data bits are in error, the error will go undetected.

In most data systems, the probability of having a single bit error is very low. The probability of erroneously transmitting two

Fig 1—The schematic symbol for an exclusive OR gate. At A, the device is shown with a two-input gate. In B, the XOR has a three-input gate. C shows how a two-input gate can be converted to a three-input gate. The table next to each device lists the parity results when an even or odd bit is input to each gate of the XOR.

or more bits is much lower than that.

Hamming Codes

While parity checks are useful and commonly employed, it would be better if the error could be detected and corrected at the receiving end. Retransmission of the data would be unnecessary. There is such a technique that can both detect and correct single bit errors. It is called the Hamming code, named after its inventor R. W. Hamming.

The Hamming code for four-bit data is shown in Table 2. Three check bits have been added to each four-bit data work. The check bits have been chosen because on a bit position by bit position basis, any two of the seven-bit words differ in at least three positions. Here's an example:

Data word (A) and data word (B) differ qex o






Error Detection Parity Truth Table




FOUR INPUT EXCLUSIVE OR A a C D_ OUT 0 0 0 0 OOOI 0 0 10 0 0 11 0 10 0 0 10 1 0 110



Fig 2—A complete circuit for generation and detection of even parity on a set of four-bit data.

Table 2—The Hamming code for fourbit data.


Data Bits

Check Bits




















































in position 4, 6 and 7. Any two words chosen will differ in at least three places.

If one bit error occurs in a word, it is only one bit removed from the correct data and at least two bits removed from any other word in the data set. The error is then corrected by changing it back to the data word that it is closest to on a bit position by bit position comparison. Hamming codes are also known as nearest neighbor codes; correction occurs by changing the word to that of its nearest neighbor.

Other jargon often heard when working with error detection and correction material are;

Hamming Weight—the total number of 1s in a code word.

Hamming Distance—the number of bit positions that are different between two code words.

Minimum Distance—the minimum hamming distance between any two words in a set of data.

Operation of an Encode and Decode Circuit

A complete circuit for the use of the Hamming Code is shown in Fig 3. The code is generated by three exclusive or gates. An examination of these gates show that they generate the three check bits of Table 2.

On the receiving end of the circuit, the check bits are regenerated. The transmitted check bits and the regenerated check bits are compared (or binary added) in exclusive or gates X0R1, X0R2 and X0R3. The output of these gates is known as the syndrome. A zero syndrome indicates that no error has occurred, a nonzero syndrome raises the error flag.

For error correction, the syndrome is fed to a standard 3-of-8 decoder such as the 74S138. The output of the decoder is added back to the data through exclusive or gates X0R4 to X0R7. To understand the complete action of this circuit, assume that an error has occurred. Let's go through the circuit, step-by-step, to see what happens.

2) From the circuit or from Table 2 the check bits are X1, X2, X3 = 000.

3) The error occurs in position A. The received data word is now received as A, B, C, D, X1, X2, X3 = 0011000.

4) The receiving circuit will generate check bits of X1, X2, X3 = 101 because it received the data A, B, C, D = 0011.

5) The outputs to the syndrome are XOR1 = 1, XOR2 = 0, XOR3 = 1. The error flag will be 1.

6) The input to the 3-of-8 decoder is 101. The output is Y5 = 0, Y7 = 1, Y6 = 1, Y3 = 1.

7) The input to XOR4 is 0,0, its output through the inverter is A = 1. The input to XOR 5 is 0,1, its output through the inverter is B = 0. The input to XOR 6 is 1,1, its output through the inverter is C = 1. The input to XOR7 is 1,1, its output through the inverter is D = 1.

8) The corrected output is A, B, C, D = 1011. The same as the transmitted data.

More Hamming Codes

Hamming codes exist for a wide range of data lengths. The general equation is:


N = the total number of bits (data plus check) K = the number of data bits (N-K) = the number of check bits

3 7 four-bit data, three check bits

4 15

5 31

Four-bit data words fit a Hamming code exactly. It is called the seven/four or 7,4 code. Another type of Hamming code exists for data consisting of eleven data bits and four check bits. This is adapted to 8-bit data blocks by shortening the code. A circuit to generate check bits for 8-bit data is shown in Fig 4.

Binary Cyclic Codes

Another form of error detection and correction code is called the binary cyclic codes. Using cyclic codes, the binary data (Px) is divided by a binary number (Gx). This produces a quotient and a remainder.

Px/Gx = Quotient + Remainder (Eq 2) The remainder is added to the end of the

1296 Mhz Transmitter Circuit Diagrams
Fig 3—A complete encode/decode circuit for Hamming codes on four-bit data.
data in the form of check bits:















When the data is received, this division is again performed by:

Px + Remainder

If no errors occurred, the result of this second division is a remainder zero. If an error occurred, this second division will produce a nonzero remainder. The result of this second division is also called the syndrome, ie, a nonzero syndrome indicates an error.

In real circuits the binary division is performed by linear feedback shift registers (LFSR). These circuits consist of exclusive or gates together with shift registers.

An example of this circuit is shown in Fig 5A. When the four-bit data word of 1101 is shifted through the register, the remainder is X3, X2, X1 = 001. If you shift all possible four-bit data words

-OA, -OA2 -OAs —O A4 -OAs —O Ag —OA7 "OA,




Fig 4—This circuit generates check bits for 8-bit data.

6 qex through this register, the remainders will turn out to be the same as the check bits of the Hamming code for four-bit data.

Fig 5B shows the seven-bit word 1101001 being shifted through the register. This data word is word "N" from Table 2. No error occurs, so the remainder left in the register is zero. Fig 5C shows a seven-bit data word that has an error. It is not one of the words in Table 2. The resulting nonzero register indicates that an error has occurred.


It is important to understand how detection and correction codes work. If errors in digital data transmission are to be reduced, then understanding and applying error detection and correction codes are a key element in the system.



X, X2 X3

0 0 0



1 1 0



1 0 1



n o o)



1 0 0




0 0 0



1 1 0



1 O 1



1 0 0



1 O 0



O 1 0



0 0 0



0 0 0



X j XgXj

0 0 0



1 1 0



0 1 1

0 J


1 1 1

, 0


1 O 1



1 O 0



O 1 1



1 1 1

Fig 5—The binary cyclic codes are used to detect and correct errors. In A, exclusive or gates and shift registers are connected to perform binary division. B shows the 7-bit data word 1101001 being shifted through the register. In C, the nonzero register indicates that an error has occurred.

Howard W. Sams & Co Offers Two New Books for the Electronics Enthusiast

IC Op-Amp Cookbook, authored by W. G. Jung, is written for hobbyists, technicians and design engineers. This third edition publication discusses the newest era of circuit design created by the introduction of the operational amplifier. The theory of the basic op amp is presented in detail. Over 200 practical circuit applications, material on instrumentation amps, information on the latest IC devices and manufacturer's data sheets are included. The IC Op-Amp Cookbook is a 600-page, softbound book retailing for $18.95. Contact Howard W. Sams & Co at the address listed below.

Progression into the modern technical telecommunications field is simplified with Introduction to Digital Communication Switching, written by J. R. Ronayne. This 200-page, softbound reference guide will expose readers to the concepts of digital communication switching—efficient channeling of incoming and outgoing telephone signals. Book discussions include pulse code modulation, error sources and prevention, digital exchanges and control and all-digital networks and the Open Systems Interconnection model. Price: $23.95. Contact Howard W.

Sams & Co, 4300 W 62nd St, Indianapolis, IN 46268 or call 800428-SAMS.—KA1DYZ

Siliconix Introduces the DG5240 Family of High-Speed CMOS Switching

Siliconix recently announced a new low-power, high-speed latched CMOS analog switch. The DG5240-DG5245 family of solid-state analog switches feature latched inputs, very fast switching action (ton is less than 100 ns and toff is less than 75 ns), an on resistance of less than 30 ohms, ± 15 V input range and ultra low power requirements (less than 1 /jA). Benefits of using these devices include microprocessor compatibility, break-before-make switching action, low signal error, normally open or closed switches and battery operation. Applications for which these switches are used are high performance switching, sample and hold circuits and digital filters. Each switch is bidirectional and maintains almost constant on resistance throughout their operating range. Package options include the 16-pin plastic and ceramic DIP. Performance grades range from 0 to 70°C and -55 to 125°C. For a DG5240 family data sheet, write to Siliconix, Inc, 2201 Laureiwood Rd, Santa Clara, CA 95054; tel 408-988-8000. —KA1DYZ

New Software for Digital Circuit Design

Logicware CADCD means software for Computer Aided Digital Circuit Design. This package performs minimization of Boolean functions into minimum sum of products and/or minimum product of sums form.

The software can handle up to eight input variables, up to eight output functions and "don't care" conditions. The program provides for easy design of sequential machines using up to eight JK and/or D flip flops, and minimized functions for the J, K and/or D flip-flop inputs are directly produced.

The program is menu driven to provide for a simple user interface. The Boolean functions are entered to the program in truth table format. The truth table can be edited, saved to disk, loaded from disk or printed. For sequential machine design, the truth table expresses the next state of each flip flop as a function of the current state and other inputs. The results of the minimization can also be displayed on screen, saved to disk or printed.

Cost of the program is $59 and is available for the IBM® PC, Apple® lie and Apple lie. Contact Logicware, 2346 W Estrella Dr, Chandler, AZ 85224; tel 602-821-2465.—KA1DYZ

A 100-MHz Universal Frequency Counter

By Dave Kunkee, K0DI 20 Algonquin Rd Holmciel, NJ 07733-2249

Not long ago, I built a frequency counter useful from dc to 100 MHz. The counter uses the Intersil 7216 function counter chip in the basic circuit found in the Intersil Data Book.1 Though the chip is only guaranteed to work up to 10 MHz, my unit tops out at 14.730 MHz.

Several modifications were made to the circuit to make the project more applic-

1 Notes appear on page 14.

able to Amateur Radio. A preamplifier was included so that a frequency reading can be obtained from a pick-up loop placed close to the final amplifier of a transmitter. There is also a divide-by-ten frequency prescaler chip to allow operation to 100 MHz, Fig 1 is a block diagram of how the frequency counter works. Fig 2 is its schematic diagram.

The counter circuitry is contained on three printed circuit boards. These were made by cutting a pattern on ruby-lith and using photo-sensitive circuit boards (ultraviolet). The main circuitry is contained on a single-sided 3x4 inch board. The eight multiplexed displays are contained on a double-side 2x6 inch board that is mounted near the switches already soldered to the board. This process allows easy and neat construction of the displays.

The Intersil chip is more than just a frequency counter; it is a function counter. This chip can count frequency with 0.01,



Open Concept Loft Apartment Floor Plans

Fig 1—A block diagram of the 100-MHz Universal Frequency Counter. There are three inputs: RF, digital and comparison. The comparison input is for ratio and the distance start/stop mode only. The power source supplies 6.3 V at 3A. U3 and U4 are 5 V, 1.5 A voltage regulators.

10 qex











Fig 2—The schematic of the complete front-end circuit. The schematic first appeared in an article by Jim Pollock, WB2DFA, Ham Radio, Jan 1976.

S4, S8—Push-button switch, SPST, normally open.

56—Rotary wafer, 2 sections, 6 positions, ceramic.

DS2-DS9—Seven-segment numeric LED display, common anode (ECG3068-RED or equiv),

S3—Rotary wafer, one section, 6 positions, ceramic.

U1— Fairchild 11C90 frequency prescaler chip.

U3—7216A 10-MHz LSI frequency counter.

Continued on page 14.

Focus on technology above 50 MHz

By Bill Olson, W3HQT Box 16S5A, RFD 1 Burnham, ME 04922

Noise Figure Measurement




Fig 1—Here is a typical test setup for measuring the noise figure of a receiving converter. The loss pad is optional (see text). Most ANFMs use a 30-MHz input, so a converter must be used when testing higher-frequency preamps. Most noise-figure meters work fine with a 28-MHz input, so you can use an existing receiving converter.


Fig 2—Thermionic diode noise sources such as this are normally usable up to 600 MHz. The ENR is about 6 dB.

Of all the homebrew projects an amateur builder can attempt, the low-noise preamplifier can probably make the biggest difference in performance with the smallest amount of effort. There are numerous published and proven designs. Only a few parts are required, and they are inexpensive. For this reason, the preamp is an excellent first project. It's also an excellent 1000th project because it seems like the devices available at reasonable prices just keep getting better and better.

For those of us who have built 20 or 30 preamps, having a means for testing our work becomes very desirable. After all, there isn't always a VHF conference with a noise measuring session occurring at the right time. Just because the manufacturer's data sheet for a low-noise device says it will have a 0.5-dB noise figure at 2 GHz doesn't mean the preamp will do that! For optimum noise performance, a device must be terminated with an impedance on the input that mismatches the device in the proper way. This input reflection coefficient is known as gamma opt and is not always specified by the manufacturer. The thing to remember here is that the input match to a device for low noise is not the same as for maximum gain. So, since we can't just tweak for maximum smoke, how do we tune up a preamp?

In the old days, before I could afford the proper equipment, tuning up on a weak signal was about the only way. Dave Mascaro, WA3JUF, used to have a 1296-MHz signal source sitting up in a tree a couple of hundred feet away from the 1296 antenna. When he wanted to check to see if his receiving system was working, or when he wanted to try out a new preamp, he just pointed the antenna at the weak-signal source. The signal could be attenuated by rotating the antenna away from the source. In this way he could always have a signal right at the noise to peak up on. This method is full of pitfalls, however. After listening to a receiver full of white noise and a barely perceptible signal for a couple of hours, I normally start hearing things like the New York Philharmonic Orchestra. Obviously there has to be a better way. The correct tool for the job is the automatic noise-figure meter.

Automatic Noise-Figure Meters

The automatic noise-figure meter

12 QEX

(ANFM) is an instrument that measures the noise figure (NF) of a receiving system by monitoring the noise-power output of a receiver while the receiver input is switched between a 50-ohrn resistive source and a 50-ohm noise source with a known amount of excess noise. Noise sources are specified as to their excess noise by the term excess noise ratio (ENR), The ENR is the ratio in decibels of the noise output of the noise source versus the noise-power output of a resistor of the same resistive value at the same temperature. The following equation relates NF to ENR:


N1 = output power with noise source off

N2 = output power with noise source on

Since N2 and N1 can be measured by the noise figure meter and the ENR is known, we can solve the equation. The ANFM does the math and displays the NF of the preamp or receiving system in dB. There are a number of articles in the amateur literature on automatic noise measurement theory and techniques, and readers are urged to consult these for a more in-depth treatment of the subject. See references 1-4 at the end of this column.

There are a number of different ANFMs available surplus and at flea markets these days, especially with the appearance of the HP8970A digital readout, microprocessor-controlled machine. Models to look for are the HP340A and B and 342A, as well as the AIL models 74 and 75. The older units show up for as little as $50 in working condition. When used with a suitable noise source, useful noise figure measurements can be made. See Fig 1.

Noise Sources

Noise sources come in three basic types: 1) the temperature-limited thermionic diode; 2) the argon gas tube; and 3) the solid-state diode noise source. The HP meters mentioned above and the AIL 74 have internal power supplies for both gas tubes and thermionic diode heads. The AIL 75 can also be used with a solidstate source. HP thermionic diode sources use a tube-type diode similar to a Sylvania 5722 and are usable up to around 600 MHz (see Fig 2). The most commonly used source is the HP 343A, which has an excess noise ratio of around 5 to 6 dB depending on frequency. There are a number of articles on homemade diode noise sources if you want to build your own. See references 5-8.

Gas-tube noise sources use an argon discharge tube coaxially mounted in a helical transmission line, as shown in Fig 3. The most common ones are the HP349A and AIL7010. Both are usable from around 200 MHz to over 3 GHz and have ENRs of around 15 dB. Both can be used with HP and AIL ANFMs with the appropriate interconnections. Since the gas-tube noise sources require an ionization pulse of a few thousand volts to light off the tube, a voltage spike of several volts appears in the output. This spike can wipe out many solid-state front ends (and who isn't using a solid-state front end these days?). Therefore it is recommended to use a 10-dB pad between the gas tube and receiver or preamp input to attenuate this pulse.

This pad has the additional advantage of making the meter readout more usable on the HP 340 series meters. Since these meters were designed long before low-noise solid-state front ends, the meter scale only goes down to 3 dB and meter calibration is best in the 10 to 20 dB NF range. With an accurate 10-dB pad added to the noise source, the '340 will read 0- to 10-dB NF in the center of the instrument meter.

A third advantage to using a loss pad between the noise source and preamp or receiving system applies to all types of noise sources. Since the noise figure of a transistor preamplifier depends upon the input reflection coefficient presented to the device as mentioned above, readings will only be accurate (and reproducible) if the noise source presents an accurate 50-ohm load to the input of the preamp. This must occur so that the preamp input matching network will in turn present the proper impedance to the device. One of the biggest contributors to measured differences from one NF setup to another is variations in load impedance from one noise source to another. The use of a good pad can minimize this variation.

Solid-State Noise Sources

Modern noise-figure measuring systems use soiid-state diode noise sources. This type of source is nothing but a microwave diode back-biased into avalanche, capacitively coupled to the output. An avalanching diode is very noisy. Since most high-frequency diodes are capable of providing up to 30 dB or more excess noise, a precision attenuator is usually built into the noise source to put the ENR in the 5- or 15-dB range for use with most ANFMs. See Fig 4.

Fig 3—An argon gas-discharge tube noise source covers 200 to 3000 MHz with an ENR of about 15 dB.
Noise Source Diodes
Fig 4—Commercially-manufactured solid-state diode noise sources use specifically designed noise diodes which are designed to give a constant noise output over a broad frequency range.

1N4005 ,00 k

1N4005 ,00 k

Fig 5—A homemade solid-state noise source is easy to build. This one is for use with HP340 and '342 noise-figure meters. R1 is adjusted for an ENR of 5.2 dB. This is accomplished by calibrating your test setup with a preamp of known performance. Accurate noise-figure test setups are available for use at most VHF conferences. D1 and R1 can be mounted in a box near the NF meter. The rest of the circuit mounts on the back of art SMA connector, as shown in Fig 6.

Fig 5—A homemade solid-state noise source is easy to build. This one is for use with HP340 and '342 noise-figure meters. R1 is adjusted for an ENR of 5.2 dB. This is accomplished by calibrating your test setup with a preamp of known performance. Accurate noise-figure test setups are available for use at most VHF conferences. D1 and R1 can be mounted in a box near the NF meter. The rest of the circuit mounts on the back of art SMA connector, as shown in Fig 6.

While solid-state noise sources do not often turn up on the flea market circuit, a very usable one can be built using a reverse-biased emitter-base junction of an inexpensive microwave transistor. Excess noise will depend on the transistor chip, the transistor package, the coupling capacitor, the attenuator and the physical layout, so it's hard to know ahead of time exactly what the ENR will be. If the bias current is made adjustable, the source can be calibrated using a preamp of known performance.

The noise source I use is similar to one built by Paul Wade, N1BWT, a number of years ago. It uses an el-cheapo microwave device (I think I'm using a BFR91-type device in a ceramic package), and is built right on the back of an SMA male flange-mount connector. See Figs 5 and 6. All connections should be kept as short as possible, and the RF choke should be optimized for the frequency in use. A 1-kO,1/4-W resistor can be used as a broadband RF choke as an alternative. Since it only takes 4 or 5 V at a few mA to avalanche the emitter-base junction, and the diode output pulse on an HP340/342 goes from + 300 to -160 V, a series diode and dropping resistor are used to provide a negative-going pulse of the proper level. For multi-band noise measurement, a multi-position switch can be used to switch in different dropping resistors for each band. Even without a preamp of known performance for calibration, this noise source can be used for preamp optimization.

To summarize, there is probably no part of an amateur station, especially in the UHF and SHF range that can be improved so much for as little investment as the receiving front end. GaAs FETs with noise figures in the tenths of a dB are



Fig 6—Construction details of the noise source shown in Fig 5.

available these days for under $10, arid circuits abound. To get the most out of a preamp, however, it must be tuned for minimum noise. Once again, as technology rolls along, it leaves behind the tools with which we can perform these measurements at a reasonable cost!

Next month's column will be the final test equipment installment. In it I will discuss antenna gain measurement and show how to get reasonable backyard measurements (and how not to).


'B. Stein, "Automatic Noise Figure Measurements—Fact and Fancy," Ham Radio, Oct 1975, p 40.

2J. Fisk, "Receiver Noise Figure, Sensitivity and Dynamic Range—What the Numbers Mean," Ham Radio, Oct 1975, p 8.

3B. Lowe, "Hot and Cold Resistors as UHF Noise Sources," QST, Sept 1976, p 32.

4Noise Figure Primer, Application Note 57, Hewlett Packard, Palo Alto, CA, Jan 1965.

5B. Stein, "Diode Noise Source for Receiver Noise Measurements," Ham Radio, June 1979, p 32.

6J. Huie, "A VHF Noise Generator," QST, Feb 1964, p 23.

7R. Guentzler, "Noise Generators," QST, Mar 1972, p 44.

8L. Anciaux, "Accurate Noise Figure Measurements for VHF," Ham Radio, June 1972, p 36.

A 100-MHz Universal Frequency Counter

Continued from page 11.

0.1,1 and 10-second gate times, as well as counting the period of a signal. This feature is useful when working with very low frequency signals. The chip can also display the ratio of two frequencies, count units (sequential) and display the time between two events. The last function could be used for model racing for instance. The finished project measures only 7 1/2x4x3 inches.

All parts are readily available through Radio Shack and Jameco2, except for the prescaler chip. The price of the finished counter was under $100.1 plan to experiment further with the counter to work out unfinished details. Table 1 lists the results of some tests I performed to learn how much signal is needed for an accurate count. The counter works well in the lower HF region and all of the functions work on my version.

Table 1

Required Signal Levels for Counter Frequencies

Table 1

Required Signal Levels for Counter Frequencies


Signal Level


(in dBm)

(in mV (RMS))






















Vritersil Component Data Catalog 1986, Intersil, Inc, 10600 Ridgeview Court, Cupertino, CA 95014, p 7-36.

2Jameco Electronics, 1355 Sboreway Rd, Beimont, CA 94002; tel (415) 592-8097.

Was this article helpful?

+1 0

Post a comment