static findStartPattern(row) {
			const width = row.getSize();
			const rowOffset = row.getNextSet(0);
			let counterPosition = 0;
			let counters = Int32Array.from([0, 0, 0, 0, 0, 0]);
			let patternStart = rowOffset;
			let isWhite = false;
			const patternLength = 6;
			for (let i = rowOffset; i < width; i++) {
				if (row.get(i) !== isWhite) {
					counters[counterPosition]++;
				}
				else {
					if (counterPosition === (patternLength - 1)) {
						let bestVariance = Code128Reader.MAX_AVG_VARIANCE;
						let bestMatch = -1;
						for (let startCode = Code128Reader.CODE_START_A; startCode <= Code128Reader.CODE_START_C; startCode++) {
							const variance = OneDReader.patternMatchVariance(counters, Code128Reader.CODE_PATTERNS[startCode], Code128Reader.MAX_INDIVIDUAL_VARIANCE);
							if (variance < bestVariance) {
								bestVariance = variance;
								bestMatch = startCode;
							}
						}
						// Look for whitespace before start pattern, >= 50% of width of start pattern
						if (bestMatch >= 0 &&
							row.isRange(Math.max(0, patternStart - (i - patternStart) / 2), patternStart, false)) {
							return Int32Array.from([patternStart, i, bestMatch]);
						}
						patternStart += counters[0] + counters[1];
						counters = counters.slice(2, counters.length - 1);
						counters[counterPosition - 1] = 0;
						counters[counterPosition] = 0;
						counterPosition--;
					}
					else {
						counterPosition++;
					}
					counters[counterPosition] = 1;
					isWhite = !isWhite;
				}
			}
			throw new NotFoundException();
		}
<p>Decodes Code 128 barcodes.</p>

@author Sean Owen