// Path: src/main/java/uk/org/okapibarcode/backend/DataBarLimited.java
// static int[] getWidths(int val, int n, int elements, int maxWidth, int noNarrow) {
// 
//     int bar;
//     int elmWidth;
//     int mxwElement;
//     int subVal, lessVal;
//     int narrowMask = 0;
//     int[] widths = new int[elements];
// 
//     for (bar = 0; bar < elements - 1; bar++) {
//         for (elmWidth = 1, narrowMask |= (1 << bar); ;
//                 elmWidth++, narrowMask &= ~ (1 << bar)) {
//             /* get all combinations */
//             subVal = getCombinations(n - elmWidth - 1, elements - bar - 2);
//             /* less combinations with no single-module element */
//             if ((noNarrow == 0) && (narrowMask == 0)
//                     && (n - elmWidth - (elements - bar - 1) >= elements - bar - 1)) {
//                 subVal -= getCombinations(n - elmWidth - (elements - bar), elements - bar - 2);
//             }
//             /* less combinations with elements > maxVal */
//             if (elements - bar - 1 > 1) {
//                 lessVal = 0;
//                 for (mxwElement = n - elmWidth - (elements - bar - 2);
//                 mxwElement > maxWidth;
//                 mxwElement--) {
//                     lessVal += getCombinations(n - elmWidth - mxwElement - 1, elements - bar - 3);
//                 }
//                 subVal -= lessVal * (elements - 1 - bar);
//             } else if (n - elmWidth > maxWidth) {
//                 subVal--;
//             }
//             val -= subVal;
//             if (val < 0) break;
//         }
//         val += subVal;
//         n -= elmWidth;
//         widths[bar] = elmWidth;
//     }
// 
//     widths[bar] = n;
// 
//     return widths;
// }
// 
// Path: src/main/java/uk/org/okapibarcode/util/Strings.java
// public static void binaryAppend(StringBuilder s, int value, int digits) {
//     int start = 0x01 << (digits - 1);
//     for (int i = 0; i < digits; i++) {
//         if ((value & (start >> i)) == 0) {
//             s.append('0');
//         } else {
//             s.append('1');
//         }
//     }
// }


import static uk.org.okapibarcode.backend.DataBarLimited.getWidths;
import static uk.org.okapibarcode.util.Strings.binaryAppend;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicBoolean;
            case 4:
                binaryString.append("0101");
                read_posn = inputData.length;
                break;
            case 5:
                binaryString.append("01100XX");
                read_posn = 20;
                break;
            case 6:
                binaryString.append("01101XX");
                read_posn = 23;
                break;
            default: /* modes 7 (0111000) to 14 (0111111) */
                binaryString.append("0" + Integer.toBinaryString(56 + encodingMethod - 7));
                read_posn = inputData.length;
                break;
        }

        /* Verify that the data to be placed in the compressed data field is all numeric data before carrying out compression */
        for (i = 0; i < read_posn; i++) {
            if (inputData[i] < '0' || inputData[i] > '9') {
                /* Something is wrong */
                throw new OkapiException("Invalid characters in input data");
            }
        }

        /* Now encode the compressed data field */

        if (encodingMethod == 1) {
            /* Encoding method field "1" - general item identification data */
// Path: src/main/java/uk/org/okapibarcode/backend/DataBarLimited.java
// static int[] getWidths(int val, int n, int elements, int maxWidth, int noNarrow) {
// 
//     int bar;
//     int elmWidth;
//     int mxwElement;
//     int subVal, lessVal;
//     int narrowMask = 0;
//     int[] widths = new int[elements];
// 
//     for (bar = 0; bar < elements - 1; bar++) {
//         for (elmWidth = 1, narrowMask |= (1 << bar); ;
//                 elmWidth++, narrowMask &= ~ (1 << bar)) {
//             /* get all combinations */
//             subVal = getCombinations(n - elmWidth - 1, elements - bar - 2);
//             /* less combinations with no single-module element */
//             if ((noNarrow == 0) && (narrowMask == 0)
//                     && (n - elmWidth - (elements - bar - 1) >= elements - bar - 1)) {
//                 subVal -= getCombinations(n - elmWidth - (elements - bar), elements - bar - 2);
//             }
//             /* less combinations with elements > maxVal */
//             if (elements - bar - 1 > 1) {
//                 lessVal = 0;
//                 for (mxwElement = n - elmWidth - (elements - bar - 2);
//                 mxwElement > maxWidth;
//                 mxwElement--) {
//                     lessVal += getCombinations(n - elmWidth - mxwElement - 1, elements - bar - 3);
//                 }
//                 subVal -= lessVal * (elements - 1 - bar);
//             } else if (n - elmWidth > maxWidth) {
//                 subVal--;
//             }
//             val -= subVal;
//             if (val < 0) break;
//         }
//         val += subVal;
//         n -= elmWidth;
//         widths[bar] = elmWidth;
//     }
// 
//     widths[bar] = n;
// 
//     return widths;
// }
// 
// Path: src/main/java/uk/org/okapibarcode/util/Strings.java
// public static void binaryAppend(StringBuilder s, int value, int digits) {
//     int start = 0x01 << (digits - 1);
//     for (int i = 0; i < digits; i++) {
//         if ((value & (start >> i)) == 0) {
//             s.append('0');
//         } else {
//             s.append('1');
//         }
//     }
// }


// Path: src/main/java/uk/org/okapibarcode/backend/DataBarExpanded.java
import static uk.org.okapibarcode.backend.DataBarLimited.getWidths;
import static uk.org.okapibarcode.util.Strings.binaryAppend;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicBoolean;

            case 4:
                binaryString.append("0101");
                read_posn = inputData.length;
                break;
            case 5:
                binaryString.append("01100XX");
                read_posn = 20;
                break;
            case 6:
                binaryString.append("01101XX");
                read_posn = 23;
                break;
            default: /* modes 7 (0111000) to 14 (0111111) */
                binaryString.append("0" + Integer.toBinaryString(56 + encodingMethod - 7));
                read_posn = inputData.length;
                break;
        }

        /* Verify that the data to be placed in the compressed data field is all numeric data before carrying out compression */
        for (i = 0; i < read_posn; i++) {
            if (inputData[i] < '0' || inputData[i] > '9') {
                /* Something is wrong */
                throw new OkapiException("Invalid characters in input data");
            }
        }

        /* Now encode the compressed data field */

        if (encodingMethod == 1) {
            /* Encoding method field "1" - general item identification data */
            binaryAppend(binaryString, inputData[2] - '0', 4);